@@ -96,58 +96,75 @@ fn parse_repr(cx: &AcceptContext<'_>, param: &MetaItemParser<'_>) -> Option<Repr
96
96
97
97
// FIXME(jdonszelmann): invert the parsing here to match on the word first and then the
98
98
// structure.
99
- let ( ident, args) = param. word_or_empty ( ) ;
99
+ let ( name, ident_span) = if let Some ( ident) = param. path_without_args ( ) . word ( ) {
100
+ ( Some ( ident. name ) , ident. span )
101
+ } else {
102
+ ( None , rustc_span:: DUMMY_SP )
103
+ } ;
104
+
105
+ let args = param. args ( ) ;
100
106
101
- match ( ident . name , args) {
102
- ( sym:: align, ArgParser :: NoArgs ) => {
103
- cx. emit_err ( session_diagnostics:: InvalidReprAlignNeedArg { span : ident . span } ) ;
107
+ match ( name, args) {
108
+ ( Some ( sym:: align) , ArgParser :: NoArgs ) => {
109
+ cx. emit_err ( session_diagnostics:: InvalidReprAlignNeedArg { span : ident_span } ) ;
104
110
None
105
111
}
106
- ( sym:: align, ArgParser :: List ( l) ) => parse_repr_align ( cx, l, param. span ( ) , AlignKind :: Align ) ,
112
+ ( Some ( sym:: align) , ArgParser :: List ( l) ) => {
113
+ parse_repr_align ( cx, l, param. span ( ) , AlignKind :: Align )
114
+ }
107
115
108
- ( sym:: packed, ArgParser :: NoArgs ) => Some ( ReprPacked ( Align :: ONE ) ) ,
109
- ( sym:: packed, ArgParser :: List ( l) ) => {
116
+ ( Some ( sym:: packed) , ArgParser :: NoArgs ) => Some ( ReprPacked ( Align :: ONE ) ) ,
117
+ ( Some ( sym:: packed) , ArgParser :: List ( l) ) => {
110
118
parse_repr_align ( cx, l, param. span ( ) , AlignKind :: Packed )
111
119
}
112
120
113
- ( sym:: align | sym:: packed, ArgParser :: NameValue ( l) ) => {
121
+ ( Some ( name @ sym:: align | name @ sym:: packed) , ArgParser :: NameValue ( l) ) => {
114
122
cx. emit_err ( session_diagnostics:: IncorrectReprFormatGeneric {
115
123
span : param. span ( ) ,
116
124
// FIXME(jdonszelmann) can just be a string in the diag type
117
- repr_arg : & ident . to_string ( ) ,
125
+ repr_arg : name ,
118
126
cause : IncorrectReprFormatGenericCause :: from_lit_kind (
119
127
param. span ( ) ,
120
128
& l. value_as_lit ( ) . kind ,
121
- ident . name . as_str ( ) ,
129
+ name,
122
130
) ,
123
131
} ) ;
124
132
None
125
133
}
126
134
127
- ( sym:: Rust , ArgParser :: NoArgs ) => Some ( ReprRust ) ,
128
- ( sym:: C , ArgParser :: NoArgs ) => Some ( ReprC ) ,
129
- ( sym:: simd, ArgParser :: NoArgs ) => Some ( ReprSimd ) ,
130
- ( sym:: transparent, ArgParser :: NoArgs ) => Some ( ReprTransparent ) ,
131
- ( i @ int_pat ! ( ) , ArgParser :: NoArgs ) => {
135
+ ( Some ( sym:: Rust ) , ArgParser :: NoArgs ) => Some ( ReprRust ) ,
136
+ ( Some ( sym:: C ) , ArgParser :: NoArgs ) => Some ( ReprC ) ,
137
+ ( Some ( sym:: simd) , ArgParser :: NoArgs ) => Some ( ReprSimd ) ,
138
+ ( Some ( sym:: transparent) , ArgParser :: NoArgs ) => Some ( ReprTransparent ) ,
139
+ ( Some ( name @ int_pat ! ( ) ) , ArgParser :: NoArgs ) => {
132
140
// int_pat!() should make sure it always parses
133
- Some ( ReprInt ( int_type_of_word ( i ) . unwrap ( ) ) )
141
+ Some ( ReprInt ( int_type_of_word ( name ) . unwrap ( ) ) )
134
142
}
135
143
136
144
(
137
- sym:: Rust | sym:: C | sym:: simd | sym:: transparent | int_pat ! ( ) ,
145
+ Some (
146
+ name @ sym:: Rust
147
+ | name @ sym:: C
148
+ | name @ sym:: simd
149
+ | name @ sym:: transparent
150
+ | name @ int_pat ! ( ) ,
151
+ ) ,
138
152
ArgParser :: NameValue ( _) ,
139
153
) => {
140
- cx. emit_err ( session_diagnostics:: InvalidReprHintNoValue {
141
- span : param. span ( ) ,
142
- name : ident. to_string ( ) ,
143
- } ) ;
154
+ cx. emit_err ( session_diagnostics:: InvalidReprHintNoValue { span : param. span ( ) , name } ) ;
144
155
None
145
156
}
146
- ( sym:: Rust | sym:: C | sym:: simd | sym:: transparent | int_pat ! ( ) , ArgParser :: List ( _) ) => {
147
- cx. emit_err ( session_diagnostics:: InvalidReprHintNoParen {
148
- span : param. span ( ) ,
149
- name : ident. to_string ( ) ,
150
- } ) ;
157
+ (
158
+ Some (
159
+ name @ sym:: Rust
160
+ | name @ sym:: C
161
+ | name @ sym:: simd
162
+ | name @ sym:: transparent
163
+ | name @ int_pat ! ( ) ,
164
+ ) ,
165
+ ArgParser :: List ( _) ,
166
+ ) => {
167
+ cx. emit_err ( session_diagnostics:: InvalidReprHintNoParen { span : param. span ( ) , name } ) ;
151
168
None
152
169
}
153
170
0 commit comments