11use crate :: back:: write:: create_informational_target_machine;
22use crate :: errors:: {
3- PossibleFeature , TargetFeatureDisableOrEnable , UnknownCTargetFeature ,
4- UnknownCTargetFeaturePrefix , UnstableCTargetFeature ,
3+ InvalidTargetFeaturePrefix , PossibleFeature , TargetFeatureDisableOrEnable ,
4+ UnknownCTargetFeature , UnknownCTargetFeaturePrefix , UnstableCTargetFeature ,
55} ;
66use crate :: llvm;
77use libc:: c_int;
@@ -511,7 +511,7 @@ pub(crate) fn global_llvm_features(sess: &Session, diagnostics: bool) -> Vec<Str
511511 sess. target
512512 . features
513513 . split ( ',' )
514- . filter ( |v| !v. is_empty ( ) && backend_feature_name ( v) . is_some ( ) )
514+ . filter ( |v| !v. is_empty ( ) && backend_feature_name ( sess , v) . is_some ( ) )
515515 . map ( String :: from) ,
516516 ) ;
517517
@@ -535,7 +535,7 @@ pub(crate) fn global_llvm_features(sess: &Session, diagnostics: bool) -> Vec<Str
535535 }
536536 } ;
537537
538- let feature = backend_feature_name ( s) ?;
538+ let feature = backend_feature_name ( sess , s) ?;
539539 // Warn against use of LLVM specific feature names and unstable features on the CLI.
540540 if diagnostics {
541541 let feature_state = supported_features. iter ( ) . find ( |& & ( v, _) | v == feature) ;
@@ -611,11 +611,11 @@ pub(crate) fn global_llvm_features(sess: &Session, diagnostics: bool) -> Vec<Str
611611/// Returns a feature name for the given `+feature` or `-feature` string.
612612///
613613/// Only allows features that are backend specific (i.e. not [`RUSTC_SPECIFIC_FEATURES`].)
614- fn backend_feature_name ( s : & str ) -> Option < & str > {
614+ fn backend_feature_name < ' a > ( sess : & Session , s : & ' a str ) -> Option < & ' a str > {
615615 // features must start with a `+` or `-`.
616- let feature = s. strip_prefix ( & [ '+' , '-' ] [ .. ] ) . unwrap_or_else ( || {
617- bug ! ( "target feature `{}` must begin with a `+` or `-`" , s ) ;
618- } ) ;
616+ let feature = s
617+ . strip_prefix ( & [ '+' , '-' ] [ .. ] )
618+ . unwrap_or_else ( || sess . dcx ( ) . emit_fatal ( InvalidTargetFeaturePrefix { feature : s } ) ) ;
619619 // Rustc-specific feature requests like `+crt-static` or `-crt-static`
620620 // are not passed down to LLVM.
621621 if RUSTC_SPECIFIC_FEATURES . contains ( & feature) {
0 commit comments