@@ -5067,6 +5067,7 @@ impl<'a> Parser<'a> {
5067
5067
crate fn parse_generic_params ( & mut self ) -> PResult < ' a , Vec < ast:: GenericParam > > {
5068
5068
let mut params = vec ! [ ] ;
5069
5069
let mut max_param = None ;
5070
+ // TODO(const_generics): move parameter order enforcement to AST.
5070
5071
fn enforce_param_order ( parser : & Parser ,
5071
5072
max_param : & mut Option < ParamKindOrd > ,
5072
5073
param_ord : ParamKindOrd ) {
@@ -5111,9 +5112,6 @@ impl<'a> Parser<'a> {
5111
5112
if let Some ( max_param) = max_param {
5112
5113
self . span_err ( attrs[ 0 ] . span ,
5113
5114
& format ! ( "trailing attribute after {} parameters" , max_param) ) ;
5114
- } else {
5115
- self . span_err ( attrs[ 0 ] . span ,
5116
- "leading attribute before generic parameters" ) ;
5117
5115
}
5118
5116
}
5119
5117
break
@@ -5202,7 +5200,7 @@ impl<'a> Parser<'a> {
5202
5200
let lit = self . parse_lit ( ) ?;
5203
5201
self . mk_expr ( lit. span , ExprKind :: Lit ( P ( lit) ) , ThinVec :: new ( ) )
5204
5202
} else {
5205
- unreachable ! ( )
5203
+ unreachable ! ( ) // TODO(const_generics): handle this case
5206
5204
} ;
5207
5205
debug ! ( "const arg: expr={:?}" , expr) ;
5208
5206
let value = AnonConst {
@@ -5253,7 +5251,7 @@ impl<'a> Parser<'a> {
5253
5251
// We are considering adding generics to the `where` keyword as an alternative higher-rank
5254
5252
// parameter syntax (as in `where<'a>` or `where<T>`. To avoid that being a breaking
5255
5253
// change we parse those generics now, but report an error.
5256
- if self . choose_generics_over_qpath ( false ) {
5254
+ if self . choose_generics_over_qpath ( ) {
5257
5255
let generics = self . parse_generics ( ) ?;
5258
5256
self . span_err ( generics. span ,
5259
5257
"generic parameters on `where` clauses are reserved for future use" ) ;
@@ -5827,7 +5825,7 @@ impl<'a> Parser<'a> {
5827
5825
}
5828
5826
}
5829
5827
5830
- fn choose_generics_over_qpath ( & self , param : bool ) -> bool {
5828
+ fn choose_generics_over_qpath ( & self ) -> bool {
5831
5829
// There's an ambiguity between generic parameters and qualified paths in impls.
5832
5830
// If we see `<` it may start both, so we have to inspect some following tokens.
5833
5831
// The following combinations can only start generics,
@@ -5849,8 +5847,7 @@ impl<'a> Parser<'a> {
5849
5847
self . look_ahead ( 1 , |t| t. is_lifetime ( ) || t. is_ident ( ) ) &&
5850
5848
self . look_ahead ( 2 , |t| t == & token:: Gt || t == & token:: Comma ||
5851
5849
t == & token:: Colon || t == & token:: Eq ) ||
5852
- param && self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Const ) &&
5853
- self . look_ahead ( 2 , |t| t. is_ident ( ) ) ) )
5850
+ self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Const ) ) )
5854
5851
}
5855
5852
5856
5853
fn parse_impl_body ( & mut self ) -> PResult < ' a , ( Vec < ImplItem > , Vec < Attribute > ) > {
@@ -5883,7 +5880,7 @@ impl<'a> Parser<'a> {
5883
5880
fn parse_item_impl ( & mut self , unsafety : Unsafety , defaultness : Defaultness )
5884
5881
-> PResult < ' a , ItemInfo > {
5885
5882
// First, parse generic parameters if necessary.
5886
- let mut generics = if self . choose_generics_over_qpath ( true ) {
5883
+ let mut generics = if self . choose_generics_over_qpath ( ) {
5887
5884
self . parse_generics ( ) ?
5888
5885
} else {
5889
5886
ast:: Generics :: default ( )
0 commit comments