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