|
1 | 1 | use crate::back::write::create_informational_target_machine; |
2 | 2 | use crate::errors::{ |
3 | 3 | PossibleFeature, TargetFeatureDisableOrEnable, UnknownCTargetFeature, |
4 | | - UnknownCTargetFeaturePrefix, |
| 4 | + UnknownCTargetFeaturePrefix, UnstableCTargetFeature, |
5 | 5 | }; |
6 | 6 | use crate::llvm; |
7 | 7 | use libc::c_int; |
@@ -531,25 +531,34 @@ pub(crate) fn global_llvm_features(sess: &Session, diagnostics: bool) -> Vec<Str |
531 | 531 | }; |
532 | 532 |
|
533 | 533 | let feature = backend_feature_name(s)?; |
534 | | - // Warn against use of LLVM specific feature names on the CLI. |
535 | | - if diagnostics && !supported_features.iter().any(|&(v, _)| v == feature) { |
536 | | - let rust_feature = supported_features.iter().find_map(|&(rust_feature, _)| { |
537 | | - let llvm_features = to_llvm_features(sess, rust_feature); |
538 | | - if llvm_features.contains(&feature) && !llvm_features.contains(&rust_feature) { |
539 | | - Some(rust_feature) |
| 534 | + // Warn against use of LLVM specific feature names and unstable features on the CLI. |
| 535 | + if diagnostics { |
| 536 | + let feature_state = supported_features.iter().find(|&&(v, _)| v == feature); |
| 537 | + if feature_state.is_none() { |
| 538 | + let rust_feature = supported_features.iter().find_map(|&(rust_feature, _)| { |
| 539 | + let llvm_features = to_llvm_features(sess, rust_feature); |
| 540 | + if llvm_features.contains(&feature) |
| 541 | + && !llvm_features.contains(&rust_feature) |
| 542 | + { |
| 543 | + Some(rust_feature) |
| 544 | + } else { |
| 545 | + None |
| 546 | + } |
| 547 | + }); |
| 548 | + let unknown_feature = if let Some(rust_feature) = rust_feature { |
| 549 | + UnknownCTargetFeature { |
| 550 | + feature, |
| 551 | + rust_feature: PossibleFeature::Some { rust_feature }, |
| 552 | + } |
540 | 553 | } else { |
541 | | - None |
542 | | - } |
543 | | - }); |
544 | | - let unknown_feature = if let Some(rust_feature) = rust_feature { |
545 | | - UnknownCTargetFeature { |
546 | | - feature, |
547 | | - rust_feature: PossibleFeature::Some { rust_feature }, |
548 | | - } |
549 | | - } else { |
550 | | - UnknownCTargetFeature { feature, rust_feature: PossibleFeature::None } |
551 | | - }; |
552 | | - sess.emit_warning(unknown_feature); |
| 554 | + UnknownCTargetFeature { feature, rust_feature: PossibleFeature::None } |
| 555 | + }; |
| 556 | + sess.emit_warning(unknown_feature); |
| 557 | + } else if feature_state.is_some_and(|(_name, feature_gate)| feature_gate.is_some()) |
| 558 | + { |
| 559 | + // An unstable feature. Warn about using it. |
| 560 | + sess.emit_warning(UnstableCTargetFeature { feature }); |
| 561 | + } |
553 | 562 | } |
554 | 563 |
|
555 | 564 | if diagnostics { |
|
0 commit comments