@@ -14,10 +14,10 @@ use thin_vec::{ThinVec, thin_vec};
1414
1515use super :: { Parser , PathStyle , SeqSep , TokenType , Trailing } ;
1616use 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 ,
2121} ;
2222use crate :: parser:: item:: FrontMatterParsingMode ;
2323use crate :: { exp, maybe_recover_from_interpolated_ty_qpath} ;
@@ -374,6 +374,27 @@ impl<'a> Parser<'a> {
374374 && self . look_ahead ( 1 , |tok| tok. kind == token:: Lt )
375375 {
376376 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) ) ) ;
377398 } else {
378399 let msg = format ! ( "expected type, found {}" , super :: token_descr( & self . token) ) ;
379400 let mut err = self . dcx ( ) . struct_span_err ( lo, msg) ;
0 commit comments