@@ -211,7 +211,7 @@ impl<'a> Parser<'a> {
211
211
{
212
212
// UNSAFE TRAIT ITEM
213
213
self . bump ( ) ; // `unsafe`
214
- let info = self . parse_item_trait ( Unsafety :: Unsafe ) ?;
214
+ let info = self . parse_item_trait ( lo , Unsafety :: Unsafe ) ?;
215
215
return self . mk_item_with_info ( attrs, lo, vis, info) ;
216
216
}
217
217
@@ -289,7 +289,7 @@ impl<'a> Parser<'a> {
289
289
&& self . is_keyword_ahead ( 1 , & [ kw:: Trait ] ) )
290
290
{
291
291
// TRAIT ITEM
292
- let info = self . parse_item_trait ( Unsafety :: Normal ) ?;
292
+ let info = self . parse_item_trait ( lo , Unsafety :: Normal ) ?;
293
293
return self . mk_item_with_info ( attrs, lo, vis, info) ;
294
294
}
295
295
@@ -780,7 +780,7 @@ impl<'a> Parser<'a> {
780
780
}
781
781
782
782
/// Parses `auto? trait Foo { ... }` or `trait Foo = Bar;`.
783
- fn parse_item_trait ( & mut self , unsafety : Unsafety ) -> PResult < ' a , ItemInfo > {
783
+ fn parse_item_trait ( & mut self , lo : Span , unsafety : Unsafety ) -> PResult < ' a , ItemInfo > {
784
784
// Parse optional `auto` prefix.
785
785
let is_auto = if self . eat_keyword ( kw:: Auto ) {
786
786
IsAuto :: Yes
@@ -793,29 +793,41 @@ impl<'a> Parser<'a> {
793
793
let mut tps = self . parse_generics ( ) ?;
794
794
795
795
// Parse optional colon and supertrait bounds.
796
- let bounds = if self . eat ( & token:: Colon ) {
796
+ let had_colon = self . eat ( & token:: Colon ) ;
797
+ let span_at_colon = self . prev_span ;
798
+ let bounds = if had_colon {
797
799
self . parse_generic_bounds ( Some ( self . prev_span ) ) ?
798
800
} else {
799
801
Vec :: new ( )
800
802
} ;
801
803
804
+ let span_before_eq = self . prev_span ;
802
805
if self . eat ( & token:: Eq ) {
803
806
// It's a trait alias.
807
+ if had_colon {
808
+ let span = span_at_colon. to ( span_before_eq) ;
809
+ self . struct_span_err ( span, "bounds are not allowed on trait aliases" )
810
+ . emit ( ) ;
811
+ }
812
+
804
813
let bounds = self . parse_generic_bounds ( None ) ?;
805
814
tps. where_clause = self . parse_where_clause ( ) ?;
806
815
self . expect ( & token:: Semi ) ?;
816
+
817
+ let whole_span = lo. to ( self . prev_span ) ;
807
818
if is_auto == IsAuto :: Yes {
808
819
let msg = "trait aliases cannot be `auto`" ;
809
- self . struct_span_err ( self . prev_span , msg)
810
- . span_label ( self . prev_span , msg)
820
+ self . struct_span_err ( whole_span , msg)
821
+ . span_label ( whole_span , msg)
811
822
. emit ( ) ;
812
823
}
813
824
if unsafety != Unsafety :: Normal {
814
825
let msg = "trait aliases cannot be `unsafe`" ;
815
- self . struct_span_err ( self . prev_span , msg)
816
- . span_label ( self . prev_span , msg)
826
+ self . struct_span_err ( whole_span , msg)
827
+ . span_label ( whole_span , msg)
817
828
. emit ( ) ;
818
829
}
830
+
819
831
Ok ( ( ident, ItemKind :: TraitAlias ( tps, bounds) , None ) )
820
832
} else {
821
833
// It's a normal trait.
0 commit comments