@@ -763,55 +763,50 @@ impl SyntaxExtension {
763763 }
764764 }
765765
766- fn collapse_debuginfo_by_name ( sess : & Session , attr : & Attribute ) -> CollapseMacroDebuginfo {
767- use crate :: errors:: CollapseMacroDebuginfoIllegal ;
768- // #[collapse_debuginfo] without enum value (#[collapse_debuginfo(no/external/yes)])
769- // considered as `yes`
770- attr. meta_item_list ( ) . map_or ( CollapseMacroDebuginfo :: Yes , |l| {
771- let [ NestedMetaItem :: MetaItem ( item) ] = & l[ ..] else {
772- sess. dcx ( ) . emit_err ( CollapseMacroDebuginfoIllegal { span : attr. span } ) ;
773- return CollapseMacroDebuginfo :: Unspecified ;
774- } ;
775- if !item. is_word ( ) {
776- sess. dcx ( ) . emit_err ( CollapseMacroDebuginfoIllegal { span : item. span } ) ;
777- CollapseMacroDebuginfo :: Unspecified
778- } else {
779- match item. name_or_empty ( ) {
780- sym:: no => CollapseMacroDebuginfo :: No ,
781- sym:: external => CollapseMacroDebuginfo :: External ,
782- sym:: yes => CollapseMacroDebuginfo :: Yes ,
783- _ => {
784- sess. dcx ( ) . emit_err ( CollapseMacroDebuginfoIllegal { span : item. span } ) ;
785- CollapseMacroDebuginfo :: Unspecified
786- }
787- }
788- }
789- } )
766+ fn collapse_debuginfo_by_name ( attr : & Attribute ) -> Result < CollapseMacroDebuginfo , Span > {
767+ let list = attr. meta_item_list ( ) ;
768+ let Some ( [ NestedMetaItem :: MetaItem ( item) ] ) = list. as_deref ( ) else {
769+ return Err ( attr. span ) ;
770+ } ;
771+ if !item. is_word ( ) {
772+ return Err ( item. span ) ;
773+ }
774+
775+ match item. name_or_empty ( ) {
776+ sym:: no => Ok ( CollapseMacroDebuginfo :: No ) ,
777+ sym:: external => Ok ( CollapseMacroDebuginfo :: External ) ,
778+ sym:: yes => Ok ( CollapseMacroDebuginfo :: Yes ) ,
779+ _ => Err ( item. path . span ) ,
780+ }
790781 }
791782
792783 /// if-ext - if macro from different crate (related to callsite code)
793784 /// | cmd \ attr | no | (unspecified) | external | yes |
794785 /// | no | no | no | no | no |
795- /// | (unspecified) | no | no | if-ext | yes |
786+ /// | (unspecified) | no | if-ext | if-ext | yes |
796787 /// | external | no | if-ext | if-ext | yes |
797788 /// | yes | yes | yes | yes | yes |
798- fn get_collapse_debuginfo ( sess : & Session , attrs : & [ ast:: Attribute ] , is_local : bool ) -> bool {
799- let mut collapse_debuginfo_attr = attr:: find_by_name ( attrs, sym:: collapse_debuginfo)
800- . map ( |v| Self :: collapse_debuginfo_by_name ( sess, v) )
801- . unwrap_or ( CollapseMacroDebuginfo :: Unspecified ) ;
802- if collapse_debuginfo_attr == CollapseMacroDebuginfo :: Unspecified
803- && attr:: contains_name ( attrs, sym:: rustc_builtin_macro)
804- {
805- collapse_debuginfo_attr = CollapseMacroDebuginfo :: Yes ;
806- }
807-
808- let flag = sess. opts . unstable_opts . collapse_macro_debuginfo ;
809- let attr = collapse_debuginfo_attr;
810- let ext = !is_local;
789+ fn get_collapse_debuginfo ( sess : & Session , attrs : & [ ast:: Attribute ] , ext : bool ) -> bool {
790+ let flag = sess. opts . cg . collapse_macro_debuginfo ;
791+ let attr = attr:: find_by_name ( attrs, sym:: collapse_debuginfo)
792+ . and_then ( |attr| {
793+ Self :: collapse_debuginfo_by_name ( attr)
794+ . map_err ( |span| {
795+ sess. dcx ( ) . emit_err ( errors:: CollapseMacroDebuginfoIllegal { span } )
796+ } )
797+ . ok ( )
798+ } )
799+ . unwrap_or_else ( || {
800+ if attr:: contains_name ( attrs, sym:: rustc_builtin_macro) {
801+ CollapseMacroDebuginfo :: Yes
802+ } else {
803+ CollapseMacroDebuginfo :: Unspecified
804+ }
805+ } ) ;
811806 #[ rustfmt:: skip]
812807 let collapse_table = [
813808 [ false , false , false , false ] ,
814- [ false , false , ext, true ] ,
809+ [ false , ext , ext, true ] ,
815810 [ false , ext, ext, true ] ,
816811 [ true , true , true , true ] ,
817812 ] ;
@@ -838,7 +833,7 @@ impl SyntaxExtension {
838833 let local_inner_macros = attr:: find_by_name ( attrs, sym:: macro_export)
839834 . and_then ( |macro_export| macro_export. meta_item_list ( ) )
840835 . is_some_and ( |l| attr:: list_contains_name ( & l, sym:: local_inner_macros) ) ;
841- let collapse_debuginfo = Self :: get_collapse_debuginfo ( sess, attrs, is_local) ;
836+ let collapse_debuginfo = Self :: get_collapse_debuginfo ( sess, attrs, ! is_local) ;
842837 tracing:: debug!( ?name, ?local_inner_macros, ?collapse_debuginfo, ?allow_internal_unsafe) ;
843838
844839 let ( builtin_name, helper_attrs) = attr:: find_by_name ( attrs, sym:: rustc_builtin_macro)
0 commit comments