@@ -96,57 +96,65 @@ 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 ( ) ;
100
-
101
- match ( ident. name , args) {
102
- ( sym:: align, ArgParser :: NoArgs ) => {
103
- cx. emit_err ( session_diagnostics:: InvalidReprAlignNeedArg { span : ident. span } ) ;
99
+ let ident = param. path_without_args ( ) . word ( ) ;
100
+ let ident_span = ident. map_or ( rustc_span:: DUMMY_SP , |ident| ident. span ) ;
101
+ let name = ident. map ( |ident| ident. name ) ;
102
+ let args = param. args ( ) ;
103
+
104
+ match ( name, args) {
105
+ ( Some ( sym:: align) , ArgParser :: NoArgs ) => {
106
+ cx. emit_err ( session_diagnostics:: InvalidReprAlignNeedArg { span : ident_span } ) ;
104
107
None
105
108
}
106
- ( sym:: align, ArgParser :: List ( l) ) => parse_repr_align ( cx, l, param. span ( ) , AlignKind :: Align ) ,
109
+ ( Some ( sym:: align) , ArgParser :: List ( l) ) => {
110
+ parse_repr_align ( cx, l, param. span ( ) , AlignKind :: Align )
111
+ }
107
112
108
- ( sym:: packed, ArgParser :: NoArgs ) => Some ( ReprPacked ( Align :: ONE ) ) ,
109
- ( sym:: packed, ArgParser :: List ( l) ) => {
113
+ ( Some ( sym:: packed) , ArgParser :: NoArgs ) => Some ( ReprPacked ( Align :: ONE ) ) ,
114
+ ( Some ( sym:: packed) , ArgParser :: List ( l) ) => {
110
115
parse_repr_align ( cx, l, param. span ( ) , AlignKind :: Packed )
111
116
}
112
117
113
- ( sym:: align | sym:: packed, ArgParser :: NameValue ( l) ) => {
118
+ ( Some ( sym:: align | sym:: packed) , ArgParser :: NameValue ( l) ) => {
114
119
cx. emit_err ( session_diagnostics:: IncorrectReprFormatGeneric {
115
120
span : param. span ( ) ,
116
121
// FIXME(jdonszelmann) can just be a string in the diag type
117
- repr_arg : & ident. to_string ( ) ,
122
+ repr_arg : & ident. unwrap ( ) . to_string ( ) ,
118
123
cause : IncorrectReprFormatGenericCause :: from_lit_kind (
119
124
param. span ( ) ,
120
125
& l. value_as_lit ( ) . kind ,
121
- ident. name . as_str ( ) ,
126
+ ident. unwrap ( ) . as_str ( ) ,
122
127
) ,
123
128
} ) ;
124
129
None
125
130
}
126
131
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 ) => {
132
+ ( Some ( sym:: Rust ) , ArgParser :: NoArgs ) => Some ( ReprRust ) ,
133
+ ( Some ( sym:: C ) , ArgParser :: NoArgs ) => Some ( ReprC ) ,
134
+ ( Some ( sym:: simd) , ArgParser :: NoArgs ) => Some ( ReprSimd ) ,
135
+ ( Some ( sym:: transparent) , ArgParser :: NoArgs ) => Some ( ReprTransparent ) ,
136
+ ( Some ( i @ int_pat ! ( ) ) , ArgParser :: NoArgs ) => {
132
137
// int_pat!() should make sure it always parses
133
138
Some ( ReprInt ( int_type_of_word ( i) . unwrap ( ) ) )
134
139
}
135
140
136
141
(
137
- sym:: Rust | sym:: C | sym:: simd | sym:: transparent | int_pat ! ( ) ,
142
+ Some ( sym:: Rust | sym:: C | sym:: simd | sym:: transparent | int_pat ! ( ) ) ,
138
143
ArgParser :: NameValue ( _) ,
139
144
) => {
140
145
cx. emit_err ( session_diagnostics:: InvalidReprHintNoValue {
141
146
span : param. span ( ) ,
142
- name : ident. to_string ( ) ,
147
+ name : ident. unwrap ( ) . to_string ( ) ,
143
148
} ) ;
144
149
None
145
150
}
146
- ( sym:: Rust | sym:: C | sym:: simd | sym:: transparent | int_pat ! ( ) , ArgParser :: List ( _) ) => {
151
+ (
152
+ Some ( sym:: Rust | sym:: C | sym:: simd | sym:: transparent | int_pat ! ( ) ) ,
153
+ ArgParser :: List ( _) ,
154
+ ) => {
147
155
cx. emit_err ( session_diagnostics:: InvalidReprHintNoParen {
148
156
span : param. span ( ) ,
149
- name : ident. to_string ( ) ,
157
+ name : ident. unwrap ( ) . to_string ( ) ,
150
158
} ) ;
151
159
None
152
160
}
0 commit comments