@@ -5182,7 +5182,7 @@ impl<'a> Parser<'a> {
51825182 }
51835183 }
51845184
5185- /// Parse trait Foo { ... }
5185+ /// Parse ` trait Foo { ... }` or `trait Foo = Bar;`
51865186 fn parse_item_trait ( & mut self , is_auto : IsAuto , unsafety : Unsafety ) -> PResult < ' a , ItemInfo > {
51875187 let ident = self . parse_ident ( ) ?;
51885188 let mut tps = self . parse_generics ( ) ?;
@@ -5194,23 +5194,34 @@ impl<'a> Parser<'a> {
51945194 Vec :: new ( )
51955195 } ;
51965196
5197- tps. where_clause = self . parse_where_clause ( ) ?;
5198-
5199- self . expect ( & token:: OpenDelim ( token:: Brace ) ) ?;
5200- let mut trait_items = vec ! [ ] ;
5201- while !self . eat ( & token:: CloseDelim ( token:: Brace ) ) {
5202- let mut at_end = false ;
5203- match self . parse_trait_item ( & mut at_end) {
5204- Ok ( item) => trait_items. push ( item) ,
5205- Err ( mut e) => {
5206- e. emit ( ) ;
5207- if !at_end {
5208- self . recover_stmt_ ( SemiColonMode :: Break , BlockMode :: Break ) ;
5197+ if self . eat ( & token:: Eq ) {
5198+ // it's a trait alias
5199+ let bounds = self . parse_ty_param_bounds ( ) ?;
5200+ tps. where_clause = self . parse_where_clause ( ) ?;
5201+ self . expect ( & token:: Semi ) ?;
5202+ if unsafety != Unsafety :: Normal {
5203+ self . span_err ( self . prev_span , "trait aliases cannot be unsafe" ) ;
5204+ }
5205+ Ok ( ( ident, ItemKind :: TraitAlias ( tps, bounds) , None ) )
5206+ } else {
5207+ // it's a normal trait
5208+ tps. where_clause = self . parse_where_clause ( ) ?;
5209+ self . expect ( & token:: OpenDelim ( token:: Brace ) ) ?;
5210+ let mut trait_items = vec ! [ ] ;
5211+ while !self . eat ( & token:: CloseDelim ( token:: Brace ) ) {
5212+ let mut at_end = false ;
5213+ match self . parse_trait_item ( & mut at_end) {
5214+ Ok ( item) => trait_items. push ( item) ,
5215+ Err ( mut e) => {
5216+ e. emit ( ) ;
5217+ if !at_end {
5218+ self . recover_stmt_ ( SemiColonMode :: Break , BlockMode :: Break ) ;
5219+ }
52095220 }
52105221 }
52115222 }
5223+ Ok ( ( ident, ItemKind :: Trait ( is_auto, unsafety, tps, bounds, trait_items) , None ) )
52125224 }
5213- Ok ( ( ident, ItemKind :: Trait ( is_auto, unsafety, tps, bounds, trait_items) , None ) )
52145225 }
52155226
52165227 /// Parses items implementations variants
0 commit comments