@@ -14,10 +14,10 @@ use thin_vec::{ThinVec, thin_vec};
14
14
15
15
use super :: { Parser , PathStyle , SeqSep , TokenType , Trailing } ;
16
16
use crate :: errors:: {
17
- self , DynAfterMut , ExpectedFnPathFoundFnKeyword , ExpectedMutOrConstInRawPointerType ,
18
- FnPtrWithGenerics , FnPtrWithGenericsSugg , HelpUseLatestEdition , InvalidDynKeyword ,
19
- LifetimeAfterMut , NeedPlusAfterTraitObjectLifetime , NestedCVariadicType ,
20
- ReturnTypesUseThinArrow ,
17
+ self , AttributeOnType , DynAfterMut , ExpectedFnPathFoundFnKeyword ,
18
+ ExpectedMutOrConstInRawPointerType , FnPtrWithGenerics , FnPtrWithGenericsSugg ,
19
+ HelpUseLatestEdition , InvalidDynKeyword , LifetimeAfterMut , NeedPlusAfterTraitObjectLifetime ,
20
+ NestedCVariadicType , ReturnTypesUseThinArrow ,
21
21
} ;
22
22
use crate :: parser:: item:: FrontMatterParsingMode ;
23
23
use crate :: { exp, maybe_recover_from_interpolated_ty_qpath} ;
@@ -374,6 +374,27 @@ impl<'a> Parser<'a> {
374
374
&& self . look_ahead ( 1 , |tok| tok. kind == token:: Lt )
375
375
{
376
376
self . parse_unsafe_binder_ty ( ) ?
377
+ } else if self . token == token:: Pound
378
+ && self . look_ahead ( 1 , |t| matches ! ( t. kind, token:: OpenBracket ) )
379
+ {
380
+ let lo_attr = self . token . span ;
381
+
382
+ while self . token != token:: CloseBracket && self . token != token:: Eof {
383
+ self . bump ( ) ;
384
+ }
385
+
386
+ if self . token != token:: Eof {
387
+ self . bump ( ) ; // eat ']'
388
+ }
389
+
390
+ let span = lo_attr. to ( self . prev_token . span ) ;
391
+
392
+ if self . token . is_ident ( ) {
393
+ self . bump ( ) ; // eat type
394
+ }
395
+
396
+ let guar = self . dcx ( ) . emit_err ( AttributeOnType { span } ) ;
397
+ return Ok ( self . mk_ty ( span, TyKind :: Err ( guar) ) ) ;
377
398
} else {
378
399
let msg = format ! ( "expected type, found {}" , super :: token_descr( & self . token) ) ;
379
400
let mut err = self . dcx ( ) . struct_span_err ( lo, msg) ;
0 commit comments