@@ -278,10 +278,9 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
278278                { 
279279                    if  tcx. sess . target . is_like_wasm  || tcx. sess . opts . actually_rustdoc  { 
280280                        // The `#[target_feature]` attribute is allowed on 
281-                         // WebAssembly targets on all functions, including safe 
282-                         // ones. Other targets require that `#[target_feature]` is 
283-                         // only applied to unsafe functions (pending the 
284-                         // `target_feature_11` feature) because on most targets 
281+                         // WebAssembly targets on all functions. Prior to stabilizing 
282+                         // the `target_feature_11` feature, `#[target_feature]` was 
283+                         // only permitted on safe functions because on most targets 
285284                        // execution of instructions that are not supported is 
286285                        // considered undefined behavior. For WebAssembly which is a 
287286                        // 100% safe target at execution time it's not possible to 
@@ -295,17 +294,10 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
295294                        // if a target is documenting some wasm-specific code then 
296295                        // it's not spuriously denied. 
297296                        // 
298-                         // This exception needs to be kept in sync with allowing 
299-                         // `#[target_feature]` on `main` and `start`. 
300-                     }  else  if  !tcx. features ( ) . target_feature_11  { 
301-                         let  mut  err = feature_err ( 
302-                             & tcx. sess . parse_sess , 
303-                             sym:: target_feature_11, 
304-                             attr. span , 
305-                             "`#[target_feature(..)]` can only be applied to `unsafe` functions" , 
306-                         ) ; 
307-                         err. span_label ( tcx. def_span ( did) ,  "not an `unsafe` function" ) ; 
308-                         err. emit ( ) ; 
297+                         // Now that `#[target_feature]` is permitted on safe functions, 
298+                         // this exception must still exist for allowing the attribute on 
299+                         // `main`, `start`, and other functions that are not usually 
300+                         // allowed. 
309301                    }  else  { 
310302                        check_target_feature_trait_unsafe ( tcx,  did,  attr. span ) ; 
311303                    } 
@@ -535,10 +527,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
535527    // its parent function, which effectively inherits the features anyway. Boxing this closure 
536528    // would result in this closure being compiled without the inherited target features, but this 
537529    // is probably a poor usage of `#[inline(always)]` and easily avoided by not using the attribute. 
538-     if  tcx. features ( ) . target_feature_11 
539-         && tcx. is_closure ( did. to_def_id ( ) ) 
540-         && codegen_fn_attrs. inline  != InlineAttr :: Always 
541-     { 
530+     if  tcx. is_closure ( did. to_def_id ( ) )  && codegen_fn_attrs. inline  != InlineAttr :: Always  { 
542531        let  owner_id = tcx. parent ( did. to_def_id ( ) ) ; 
543532        if  tcx. def_kind ( owner_id) . has_codegen_attrs ( )  { 
544533            codegen_fn_attrs
0 commit comments