@@ -5067,6 +5067,7 @@ impl<'a> Parser<'a> {
50675067crate  fn  parse_generic_params ( & mut  self )  -> PResult < ' a ,  Vec < ast:: GenericParam > >  { 
50685068 let  mut  params = vec ! [ ] ; 
50695069 let  mut  max_param = None ; 
5070+  // TODO(const_generics): move parameter order enforcement to AST. 
50705071 fn  enforce_param_order ( parser :  & Parser , 
50715072 max_param :  & mut  Option < ParamKindOrd > , 
50725073 param_ord :  ParamKindOrd )  { 
@@ -5111,9 +5112,6 @@ impl<'a> Parser<'a> {
51115112 if  let  Some ( max_param)  = max_param { 
51125113 self . span_err ( attrs[ 0 ] . span , 
51135114 & format ! ( "trailing attribute after {} parameters" ,  max_param) ) ; 
5114-  }  else  { 
5115-  self . span_err ( attrs[ 0 ] . span , 
5116-  "leading attribute before generic parameters" ) ; 
51175115 } 
51185116 } 
51195117 break 
@@ -5202,7 +5200,7 @@ impl<'a> Parser<'a> {
52025200 let  lit = self . parse_lit ( ) ?; 
52035201 self . mk_expr ( lit. span ,  ExprKind :: Lit ( P ( lit) ) ,  ThinVec :: new ( ) ) 
52045202 }  else  { 
5205-  unreachable ! ( ) 
5203+  unreachable ! ( )   // TODO(const_generics): handle this case 
52065204 } ; 
52075205 debug ! ( "const arg: expr={:?}" ,  expr) ; 
52085206 let  value = AnonConst  { 
@@ -5253,7 +5251,7 @@ impl<'a> Parser<'a> {
52535251 // We are considering adding generics to the `where` keyword as an alternative higher-rank 
52545252 // parameter syntax (as in `where<'a>` or `where<T>`. To avoid that being a breaking 
52555253 // 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 ( )  { 
52575255 let  generics = self . parse_generics ( ) ?; 
52585256 self . span_err ( generics. span , 
52595257 "generic parameters on `where` clauses are reserved for future use" ) ; 
@@ -5827,7 +5825,7 @@ impl<'a> Parser<'a> {
58275825 } 
58285826 } 
58295827
5830-  fn  choose_generics_over_qpath ( & self ,   param :   bool )  -> bool  { 
5828+  fn  choose_generics_over_qpath ( & self )  -> bool  { 
58315829 // There's an ambiguity between generic parameters and qualified paths in impls. 
58325830 // If we see `<` it may start both, so we have to inspect some following tokens. 
58335831 // The following combinations can only start generics, 
@@ -5849,8 +5847,7 @@ impl<'a> Parser<'a> {
58495847 self . look_ahead ( 1 ,  |t| t. is_lifetime ( )  || t. is_ident ( ) )  &&
58505848 self . look_ahead ( 2 ,  |t| t == & token:: Gt  || t == & token:: Comma  ||
58515849 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 ) ) ) 
58545851 } 
58555852
58565853 fn  parse_impl_body ( & mut  self )  -> PResult < ' a ,  ( Vec < ImplItem > ,  Vec < Attribute > ) >  { 
@@ -5883,7 +5880,7 @@ impl<'a> Parser<'a> {
58835880fn  parse_item_impl ( & mut  self ,  unsafety :  Unsafety ,  defaultness :  Defaultness ) 
58845881 -> PResult < ' a ,  ItemInfo >  { 
58855882 // 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 ( )  { 
58875884 self . parse_generics ( ) ?
58885885 }  else  { 
58895886 ast:: Generics :: default ( ) 
0 commit comments