@@ -118,11 +118,7 @@ impl<S: Stage> SingleAttributeParser<S> for ExportNameParser {
118118 const TEMPLATE : AttributeTemplate = template ! ( NameValueStr : "name" ) ;
119119
120120 fn convert ( cx : & mut AcceptContext < ' _ , ' _ , S > , args : & ArgParser ) -> Option < AttributeKind > {
121- let Some ( nv) = args. name_value ( ) else {
122- let attr_span = cx. attr_span ;
123- cx. adcx ( ) . expected_name_value ( attr_span, None ) ;
124- return None ;
125- } ;
121+ let nv = cx. expect_name_value ( args, cx. attr_span , None ) ?;
126122 let Some ( name) = nv. value_as_str ( ) else {
127123 cx. adcx ( ) . expected_string_literal ( nv. value_span , Some ( nv. value_as_lit ( ) ) ) ;
128124 return None ;
@@ -146,11 +142,7 @@ impl<S: Stage> SingleAttributeParser<S> for RustcObjcClassParser {
146142 const TEMPLATE : AttributeTemplate = template ! ( NameValueStr : "ClassName" ) ;
147143
148144 fn convert ( cx : & mut AcceptContext < ' _ , ' _ , S > , args : & ArgParser ) -> Option < AttributeKind > {
149- let Some ( nv) = args. name_value ( ) else {
150- let attr_span = cx. attr_span ;
151- cx. adcx ( ) . expected_name_value ( attr_span, None ) ;
152- return None ;
153- } ;
145+ let nv = cx. expect_name_value ( args, cx. attr_span , None ) ?;
154146 let Some ( classname) = nv. value_as_str ( ) else {
155147 // `#[rustc_objc_class = ...]` is expected to be used as an implementation detail
156148 // inside a standard library macro, but `cx.expected_string_literal` exposes too much.
@@ -177,11 +169,7 @@ impl<S: Stage> SingleAttributeParser<S> for RustcObjcSelectorParser {
177169 const TEMPLATE : AttributeTemplate = template ! ( NameValueStr : "methodName" ) ;
178170
179171 fn convert ( cx : & mut AcceptContext < ' _ , ' _ , S > , args : & ArgParser ) -> Option < AttributeKind > {
180- let Some ( nv) = args. name_value ( ) else {
181- let attr_span = cx. attr_span ;
182- cx. adcx ( ) . expected_name_value ( attr_span, None ) ;
183- return None ;
184- } ;
172+ let nv = cx. expect_name_value ( args, cx. attr_span , None ) ?;
185173 let Some ( methname) = nv. value_as_str ( ) else {
186174 // `#[rustc_objc_selector = ...]` is expected to be used as an implementation detail
187175 // inside a standard library macro, but `cx.expected_string_literal` exposes too much.
@@ -471,29 +459,20 @@ fn parse_tf_attribute<S: Stage>(
471459 return features;
472460 }
473461 for item in list. mixed ( ) {
474- let Some ( name_value ) = item. meta_item ( ) else {
475- cx . adcx ( ) . expected_name_value ( item . span ( ) , Some ( sym :: enable ) ) ;
462+ let Some ( ( ident , value ) ) = cx . expect_name_value ( item, item . span ( ) , Some ( sym :: enable ) )
463+ else {
476464 return features;
477465 } ;
478466
479467 // Validate name
480- let Some ( name) = name_value. path ( ) . word_sym ( ) else {
481- cx. adcx ( ) . expected_name_value ( name_value. path ( ) . span ( ) , Some ( sym:: enable) ) ;
482- return features;
483- } ;
484- if name != sym:: enable {
485- cx. adcx ( ) . expected_name_value ( name_value. path ( ) . span ( ) , Some ( sym:: enable) ) ;
468+ if ident. name != sym:: enable {
469+ cx. adcx ( ) . expected_specific_argument ( ident. span , & [ sym:: enable] ) ;
486470 return features;
487471 }
488472
489473 // Use value
490- let Some ( name_value) = name_value. args ( ) . name_value ( ) else {
491- cx. adcx ( ) . expected_name_value ( item. span ( ) , Some ( sym:: enable) ) ;
492- return features;
493- } ;
494- let Some ( value_str) = name_value. value_as_str ( ) else {
495- cx. adcx ( )
496- . expected_string_literal ( name_value. value_span , Some ( name_value. value_as_lit ( ) ) ) ;
474+ let Some ( value_str) = value. value_as_str ( ) else {
475+ cx. adcx ( ) . expected_string_literal ( value. value_span , Some ( value. value_as_lit ( ) ) ) ;
497476 return features;
498477 } ;
499478 for feature in value_str. as_str ( ) . split ( "," ) {
@@ -592,14 +571,7 @@ impl<S: Stage> SingleAttributeParser<S> for SanitizeParser {
592571 let mut rtsan = None ;
593572
594573 for item in list. mixed ( ) {
595- let Some ( item) = item. meta_item ( ) else {
596- cx. adcx ( ) . expected_name_value ( item. span ( ) , None ) ;
597- continue ;
598- } ;
599-
600- let path = item. path ( ) . word_sym ( ) ;
601- let Some ( value) = item. args ( ) . name_value ( ) else {
602- cx. adcx ( ) . expected_name_value ( item. span ( ) , path) ;
574+ let Some ( ( ident, value) ) = cx. expect_name_value ( item, item. span ( ) , None ) else {
603575 continue ;
604576 } ;
605577
@@ -628,20 +600,20 @@ impl<S: Stage> SingleAttributeParser<S> for SanitizeParser {
628600 }
629601 } ;
630602
631- match path {
632- Some ( sym:: address) | Some ( sym:: kernel_address) => {
603+ match ident . name {
604+ sym:: address | sym:: kernel_address => {
633605 apply ( SanitizerSet :: ADDRESS | SanitizerSet :: KERNELADDRESS )
634606 }
635- Some ( sym:: cfi) => apply ( SanitizerSet :: CFI ) ,
636- Some ( sym:: kcfi) => apply ( SanitizerSet :: KCFI ) ,
637- Some ( sym:: memory) => apply ( SanitizerSet :: MEMORY ) ,
638- Some ( sym:: memtag) => apply ( SanitizerSet :: MEMTAG ) ,
639- Some ( sym:: shadow_call_stack) => apply ( SanitizerSet :: SHADOWCALLSTACK ) ,
640- Some ( sym:: thread) => apply ( SanitizerSet :: THREAD ) ,
641- Some ( sym:: hwaddress) | Some ( sym:: kernel_hwaddress) => {
607+ sym:: cfi => apply ( SanitizerSet :: CFI ) ,
608+ sym:: kcfi => apply ( SanitizerSet :: KCFI ) ,
609+ sym:: memory => apply ( SanitizerSet :: MEMORY ) ,
610+ sym:: memtag => apply ( SanitizerSet :: MEMTAG ) ,
611+ sym:: shadow_call_stack => apply ( SanitizerSet :: SHADOWCALLSTACK ) ,
612+ sym:: thread => apply ( SanitizerSet :: THREAD ) ,
613+ sym:: hwaddress | sym:: kernel_hwaddress => {
642614 apply ( SanitizerSet :: HWADDRESS | SanitizerSet :: KERNELHWADDRESS )
643615 }
644- Some ( sym:: realtime) => match value. value_as_str ( ) {
616+ sym:: realtime => match value. value_as_str ( ) {
645617 Some ( sym:: nonblocking) => rtsan = Some ( RtsanSetting :: Nonblocking ) ,
646618 Some ( sym:: blocking) => rtsan = Some ( RtsanSetting :: Blocking ) ,
647619 Some ( sym:: caller) => rtsan = Some ( RtsanSetting :: Caller ) ,
@@ -654,7 +626,7 @@ impl<S: Stage> SingleAttributeParser<S> for SanitizeParser {
654626 } ,
655627 _ => {
656628 cx. adcx ( ) . expected_specific_argument_strings (
657- item . path ( ) . span ( ) ,
629+ ident . span ,
658630 & [
659631 sym:: address,
660632 sym:: kernel_address,
@@ -725,57 +697,49 @@ impl<S: Stage> SingleAttributeParser<S> for PatchableFunctionEntryParser {
725697 let mut errored = false ;
726698
727699 for item in meta_item_list. mixed ( ) {
728- let Some ( meta_item) = item. meta_item ( ) else {
729- errored = true ;
730- cx. adcx ( ) . expected_name_value ( item. span ( ) , None ) ;
731- continue ;
732- } ;
733-
734- let Some ( name_value_lit) = meta_item. args ( ) . name_value ( ) else {
735- errored = true ;
736- cx. adcx ( ) . expected_name_value ( item. span ( ) , None ) ;
700+ let Some ( ( ident, value) ) = cx. expect_name_value ( item, item. span ( ) , None ) else {
737701 continue ;
738702 } ;
739703
740- let attrib_to_write = match meta_item . ident ( ) . map ( |ident| ident . name ) {
741- Some ( sym:: prefix_nops) => {
704+ let attrib_to_write = match ident. name {
705+ sym:: prefix_nops => {
742706 // Duplicate prefixes are not allowed
743707 if prefix. is_some ( ) {
744708 errored = true ;
745- cx. adcx ( ) . duplicate_key ( meta_item . path ( ) . span ( ) , sym:: prefix_nops) ;
709+ cx. adcx ( ) . duplicate_key ( ident . span , sym:: prefix_nops) ;
746710 continue ;
747711 }
748712 & mut prefix
749713 }
750- Some ( sym:: entry_nops) => {
714+ sym:: entry_nops => {
751715 // Duplicate entries are not allowed
752716 if entry. is_some ( ) {
753717 errored = true ;
754- cx. adcx ( ) . duplicate_key ( meta_item . path ( ) . span ( ) , sym:: entry_nops) ;
718+ cx. adcx ( ) . duplicate_key ( ident . span , sym:: entry_nops) ;
755719 continue ;
756720 }
757721 & mut entry
758722 }
759723 _ => {
760724 errored = true ;
761725 cx. adcx ( ) . expected_specific_argument (
762- meta_item . path ( ) . span ( ) ,
726+ ident . span ,
763727 & [ sym:: prefix_nops, sym:: entry_nops] ,
764728 ) ;
765729 continue ;
766730 }
767731 } ;
768732
769- let rustc_ast:: LitKind :: Int ( val, _) = name_value_lit . value_as_lit ( ) . kind else {
733+ let rustc_ast:: LitKind :: Int ( val, _) = value . value_as_lit ( ) . kind else {
770734 errored = true ;
771- cx. adcx ( ) . expected_integer_literal ( name_value_lit . value_span ) ;
735+ cx. adcx ( ) . expected_integer_literal ( value . value_span ) ;
772736 continue ;
773737 } ;
774738
775739 let Ok ( val) = val. get ( ) . try_into ( ) else {
776740 errored = true ;
777741 cx. adcx ( ) . expected_integer_literal_in_range (
778- name_value_lit . value_span ,
742+ value . value_span ,
779743 u8:: MIN as isize ,
780744 u8:: MAX as isize ,
781745 ) ;
0 commit comments