@@ -503,24 +503,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
503
503
}
504
504
}
505
505
506
- let attrs = self . tcx . codegen_fn_attrs ( instance. def_id ( ) ) ;
507
- let missing_features: Vec < _ > = attrs
508
- . target_features
509
- . iter ( )
510
- . copied ( )
511
- . filter ( |feature| !self . tcx . sess . target_features . contains ( feature) )
512
- . collect ( ) ;
513
- if !missing_features. is_empty ( ) {
514
- let mut missing_features_str = String :: from ( missing_features[ 0 ] . as_str ( ) ) ;
515
- for missing_feature in missing_features[ 1 ..] . iter ( ) {
516
- missing_features_str. push ( ',' ) ;
517
- missing_features_str. push_str ( missing_feature. as_str ( ) ) ;
518
- }
519
- throw_ub_custom ! (
520
- fluent:: const_eval_unavailable_target_features_for_fn,
521
- unavailable_feats = missing_features_str,
522
- ) ;
523
- }
506
+ // Check that all target features required by the callee (i.e., from
507
+ // the attribute `#[target_feature(enable = ...)]`) are enabled at
508
+ // compile time.
509
+ self . check_fn_target_features ( instance) ?;
524
510
525
511
if !callee_fn_abi. can_unwind {
526
512
// The callee cannot unwind, so force the `Unreachable` unwind handling.
@@ -805,6 +791,31 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
805
791
}
806
792
}
807
793
794
+ fn check_fn_target_features ( & self , instance : ty:: Instance < ' tcx > ) -> InterpResult < ' tcx , ( ) > {
795
+ let attrs = self . tcx . codegen_fn_attrs ( instance. def_id ( ) ) ;
796
+ if attrs
797
+ . target_features
798
+ . iter ( )
799
+ . any ( |feature| !self . tcx . sess . target_features . contains ( feature) )
800
+ {
801
+ throw_ub_custom ! (
802
+ fluent:: const_eval_unavailable_target_features_for_fn,
803
+ unavailable_feats = attrs
804
+ . target_features
805
+ . iter( )
806
+ . filter( |& feature| !self . tcx. sess. target_features. contains( feature) )
807
+ . fold( String :: new( ) , |mut s, feature| {
808
+ if !s. is_empty( ) {
809
+ s. push_str( ", " ) ;
810
+ }
811
+ s. push_str( feature. as_str( ) ) ;
812
+ s
813
+ } ) ,
814
+ ) ;
815
+ }
816
+ Ok ( ( ) )
817
+ }
818
+
808
819
fn drop_in_place (
809
820
& mut self ,
810
821
place : & PlaceTy < ' tcx , M :: Provenance > ,
0 commit comments