| 
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