@@ -260,10 +260,9 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
260
260
if safe_target_features {
261
261
if tcx. sess . target . is_like_wasm || tcx. sess . opts . actually_rustdoc {
262
262
// The `#[target_feature]` attribute is allowed on
263
- // WebAssembly targets on all functions, including safe
264
- // ones. Other targets require that `#[target_feature]` is
265
- // only applied to unsafe functions (pending the
266
- // `target_feature_11` feature) because on most targets
263
+ // WebAssembly targets on all functions. Prior to stabilizing
264
+ // the `target_feature_11` feature, `#[target_feature]` was
265
+ // only permitted on unsafe functions because on most targets
267
266
// execution of instructions that are not supported is
268
267
// considered undefined behavior. For WebAssembly which is a
269
268
// 100% safe target at execution time it's not possible to
@@ -277,17 +276,10 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
277
276
// if a target is documenting some wasm-specific code then
278
277
// it's not spuriously denied.
279
278
//
280
- // This exception needs to be kept in sync with allowing
281
- // `#[target_feature]` on `main` and `start`.
282
- } else if !tcx. features ( ) . target_feature_11 ( ) {
283
- feature_err (
284
- & tcx. sess ,
285
- sym:: target_feature_11,
286
- attr. span ,
287
- "`#[target_feature(..)]` can only be applied to `unsafe` functions" ,
288
- )
289
- . with_span_label ( tcx. def_span ( did) , "not an `unsafe` function" )
290
- . emit ( ) ;
279
+ // Now that `#[target_feature]` is permitted on safe functions,
280
+ // this exception must still exist for allowing the attribute on
281
+ // `main`, `start`, and other functions that are not usually
282
+ // allowed.
291
283
} else {
292
284
check_target_feature_trait_unsafe ( tcx, did, attr. span ) ;
293
285
}
@@ -616,10 +608,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
616
608
// its parent function, which effectively inherits the features anyway. Boxing this closure
617
609
// would result in this closure being compiled without the inherited target features, but this
618
610
// is probably a poor usage of `#[inline(always)]` and easily avoided by not using the attribute.
619
- if tcx. features ( ) . target_feature_11 ( )
620
- && tcx. is_closure_like ( did. to_def_id ( ) )
621
- && !codegen_fn_attrs. inline . always ( )
622
- {
611
+ if tcx. is_closure_like ( did. to_def_id ( ) ) && codegen_fn_attrs. inline != InlineAttr :: Always {
623
612
let owner_id = tcx. parent ( did. to_def_id ( ) ) ;
624
613
if tcx. def_kind ( owner_id) . has_codegen_attrs ( ) {
625
614
codegen_fn_attrs
0 commit comments