@@ -20,9 +20,9 @@ use crate::session_diagnostics::IncorrectReprFormatGenericCause;
20
20
pub ( crate ) struct ReprParser ;
21
21
22
22
impl CombineAttributeParser for ReprParser {
23
- type Item = ReprAttr ;
23
+ type Item = ( ReprAttr , Span ) ;
24
24
const PATH : & ' static [ rustc_span:: Symbol ] = & [ sym:: repr] ;
25
- const CONVERT : ConvertFn < ReprAttr > = AttributeKind :: Repr ;
25
+ const CONVERT : ConvertFn < Self :: Item > = AttributeKind :: Repr ;
26
26
27
27
fn extend < ' a > (
28
28
cx : & ' a AcceptContext < ' a > ,
@@ -34,8 +34,20 @@ impl CombineAttributeParser for ReprParser {
34
34
return reprs;
35
35
} ;
36
36
37
+ if list. is_empty ( ) {
38
+ // this is so validation can emit a lint
39
+ reprs. push ( ( ReprAttr :: ReprEmpty , cx. attr_span ) ) ;
40
+ }
41
+
37
42
for param in list. mixed ( ) {
38
- reprs. extend ( param. meta_item ( ) . and_then ( |mi| parse_repr ( cx, & mi) ) ) ;
43
+ if let Some ( _) = param. lit ( ) {
44
+ cx. emit_err ( session_diagnostics:: ReprIdent { span : cx. attr_span } ) ;
45
+ continue ;
46
+ }
47
+
48
+ reprs. extend (
49
+ param. meta_item ( ) . and_then ( |mi| parse_repr ( cx, & mi) ) . map ( |r| ( r, param. span ( ) ) ) ,
50
+ ) ;
39
51
}
40
52
41
53
reprs
@@ -58,7 +70,6 @@ macro_rules! int_pat {
58
70
} ;
59
71
}
60
72
61
- // TODO: inline
62
73
fn int_type_of_word ( s : Symbol ) -> Option < IntType > {
63
74
use IntType :: * ;
64
75
@@ -88,7 +99,7 @@ fn parse_repr(cx: &AcceptContext<'_>, param: &MetaItemParser<'_>) -> Option<Repr
88
99
89
100
match ( ident. name , args) {
90
101
( sym:: align, ArgParser :: NoArgs ) => {
91
- cx. dcx ( ) . emit_err ( session_diagnostics:: InvalidReprAlignNeedArg { span : ident. span } ) ;
102
+ cx. emit_err ( session_diagnostics:: InvalidReprAlignNeedArg { span : ident. span } ) ;
92
103
None
93
104
}
94
105
( sym:: align, ArgParser :: List ( l) ) => parse_repr_align ( cx, l, param. span ( ) , AlignKind :: Align ) ,
@@ -99,7 +110,7 @@ fn parse_repr(cx: &AcceptContext<'_>, param: &MetaItemParser<'_>) -> Option<Repr
99
110
}
100
111
101
112
( sym:: align | sym:: packed, ArgParser :: NameValue ( l) ) => {
102
- cx. dcx ( ) . emit_err ( session_diagnostics:: IncorrectReprFormatGeneric {
113
+ cx. emit_err ( session_diagnostics:: IncorrectReprFormatGeneric {
103
114
span : param. span ( ) ,
104
115
// FIXME(jdonszelmann) can just be a string in the diag type
105
116
repr_arg : & ident. to_string ( ) ,
@@ -125,22 +136,22 @@ fn parse_repr(cx: &AcceptContext<'_>, param: &MetaItemParser<'_>) -> Option<Repr
125
136
sym:: Rust | sym:: C | sym:: simd | sym:: transparent | int_pat ! ( ) ,
126
137
ArgParser :: NameValue ( _) ,
127
138
) => {
128
- cx. dcx ( ) . emit_err ( session_diagnostics:: InvalidReprHintNoValue {
139
+ cx. emit_err ( session_diagnostics:: InvalidReprHintNoValue {
129
140
span : param. span ( ) ,
130
141
name : ident. to_string ( ) ,
131
142
} ) ;
132
143
None
133
144
}
134
145
( sym:: Rust | sym:: C | sym:: simd | sym:: transparent | int_pat ! ( ) , ArgParser :: List ( _) ) => {
135
- cx. dcx ( ) . emit_err ( session_diagnostics:: InvalidReprHintNoParen {
146
+ cx. emit_err ( session_diagnostics:: InvalidReprHintNoParen {
136
147
span : param. span ( ) ,
137
148
name : ident. to_string ( ) ,
138
149
} ) ;
139
150
None
140
151
}
141
152
142
153
_ => {
143
- cx. dcx ( ) . emit_err ( session_diagnostics:: UnrecognizedReprHint { span : param. span ( ) } ) ;
154
+ cx. emit_err ( session_diagnostics:: UnrecognizedReprHint { span : param. span ( ) } ) ;
144
155
None
145
156
}
146
157
}
@@ -162,7 +173,7 @@ fn parse_repr_align(
162
173
let Some ( align) = list. single ( ) else {
163
174
match align_kind {
164
175
Packed => {
165
- cx. dcx ( ) . emit_err ( session_diagnostics:: IncorrectReprFormatPackedOneOrZeroArg {
176
+ cx. emit_err ( session_diagnostics:: IncorrectReprFormatPackedOneOrZeroArg {
166
177
span : param_span,
167
178
} ) ;
168
179
}
@@ -179,12 +190,12 @@ fn parse_repr_align(
179
190
let Some ( lit) = align. lit ( ) else {
180
191
match align_kind {
181
192
Packed => {
182
- cx. dcx ( ) . emit_err ( session_diagnostics:: IncorrectReprFormatPackedExpectInteger {
193
+ cx. emit_err ( session_diagnostics:: IncorrectReprFormatPackedExpectInteger {
183
194
span : align. span ( ) ,
184
195
} ) ;
185
196
}
186
197
Align => {
187
- cx. dcx ( ) . emit_err ( session_diagnostics:: IncorrectReprFormatExpectInteger {
198
+ cx. emit_err ( session_diagnostics:: IncorrectReprFormatExpectInteger {
188
199
span : align. span ( ) ,
189
200
} ) ;
190
201
}
@@ -199,7 +210,7 @@ fn parse_repr_align(
199
210
AlignKind :: Align => ReprAttr :: ReprAlign ( literal) ,
200
211
} ) ,
201
212
Err ( message) => {
202
- cx. dcx ( ) . emit_err ( session_diagnostics:: InvalidReprGeneric {
213
+ cx. emit_err ( session_diagnostics:: InvalidReprGeneric {
203
214
span : lit. span ,
204
215
repr_arg : match align_kind {
205
216
Packed => "packed" . to_string ( ) ,
0 commit comments