@@ -2661,6 +2661,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs {
2661
2661
let mut inline_span = None ;
2662
2662
let mut link_ordinal_span = None ;
2663
2663
let mut no_sanitize_span = None ;
2664
+ let mut no_coverage_feature_enabled = false ;
2665
+ let mut no_coverage_attr = None ;
2664
2666
for attr in attrs. iter ( ) {
2665
2667
if tcx. sess . check_name ( attr, sym:: cold) {
2666
2668
codegen_fn_attrs. flags |= CodegenFnAttrFlags :: COLD ;
@@ -2724,8 +2726,15 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs {
2724
2726
codegen_fn_attrs. flags |= CodegenFnAttrFlags :: NAKED ;
2725
2727
} else if tcx. sess . check_name ( attr, sym:: no_mangle) {
2726
2728
codegen_fn_attrs. flags |= CodegenFnAttrFlags :: NO_MANGLE ;
2729
+ } else if attr. has_name ( sym:: feature) {
2730
+ if let Some ( list) = attr. meta_item_list ( ) {
2731
+ if list. iter ( ) . any ( |nested_meta_item| nested_meta_item. has_name ( sym:: no_coverage) ) {
2732
+ tcx. sess . mark_attr_used ( attr) ;
2733
+ no_coverage_feature_enabled = true ;
2734
+ }
2735
+ }
2727
2736
} else if tcx. sess . check_name ( attr, sym:: no_coverage) {
2728
- codegen_fn_attrs . flags |= CodegenFnAttrFlags :: NO_COVERAGE ;
2737
+ no_coverage_attr = Some ( attr ) ;
2729
2738
} else if tcx. sess . check_name ( attr, sym:: rustc_std_internal_symbol) {
2730
2739
codegen_fn_attrs. flags |= CodegenFnAttrFlags :: RUSTC_STD_INTERNAL_SYMBOL ;
2731
2740
} else if tcx. sess . check_name ( attr, sym:: used) {
@@ -2936,6 +2945,23 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs {
2936
2945
}
2937
2946
}
2938
2947
2948
+ if let Some ( no_coverage_attr) = no_coverage_attr {
2949
+ if tcx. sess . features_untracked ( ) . no_coverage || no_coverage_feature_enabled {
2950
+ codegen_fn_attrs. flags |= CodegenFnAttrFlags :: NO_COVERAGE
2951
+ } else {
2952
+ let mut err = feature_err (
2953
+ & tcx. sess . parse_sess ,
2954
+ sym:: no_coverage,
2955
+ no_coverage_attr. span ,
2956
+ "the `#[no_coverage]` attribute is an experimental feature" ,
2957
+ ) ;
2958
+ if tcx. sess . parse_sess . unstable_features . is_nightly_build ( ) {
2959
+ err. help ( "or, alternatively, add `#[feature(no_coverage)]` to the function" ) ;
2960
+ }
2961
+ err. emit ( ) ;
2962
+ }
2963
+ }
2964
+
2939
2965
codegen_fn_attrs. inline = attrs. iter ( ) . fold ( InlineAttr :: None , |ia, attr| {
2940
2966
if !attr. has_name ( sym:: inline) {
2941
2967
return ia;
0 commit comments