@@ -136,40 +136,42 @@ impl<'a> AstValidator<'a> {
136136        } 
137137    } 
138138
139-     fn  check_gat_where ( 
139+     fn  check_type_alias_where_clause_location ( 
140140        & mut  self , 
141-         id :  NodeId , 
142-         before_predicates :  & [ WherePredicate ] , 
143-         where_clauses :  ( ast:: TyAliasWhereClause ,  ast:: TyAliasWhereClause ) , 
144-     )  { 
145-         if  !before_predicates. is_empty ( )  { 
146-             let  mut  state = State :: new ( ) ; 
147-             if  !where_clauses. 1 . 0  { 
148-                 state. space ( ) ; 
149-                 state. word_space ( "where" ) ; 
150-             }  else  { 
141+         ty_alias :  & TyAlias , 
142+     )  -> Result < ( ) ,  errors:: WhereClauseBeforeTypeAlias >  { 
143+         let  before_predicates =
144+             ty_alias. generics . where_clause . predicates . split_at ( ty_alias. where_predicates_split ) . 0 ; 
145+ 
146+         if  ty_alias. ty . is_none ( )  || before_predicates. is_empty ( )  { 
147+             return  Ok ( ( ) ) ; 
148+         } 
149+ 
150+         let  mut  state = State :: new ( ) ; 
151+         if  !ty_alias. where_clauses . 1 . 0  { 
152+             state. space ( ) ; 
153+             state. word_space ( "where" ) ; 
154+         }  else  { 
155+             state. word_space ( "," ) ; 
156+         } 
157+         let  mut  first = true ; 
158+         for  p in  before_predicates { 
159+             if  !first { 
151160                state. word_space ( "," ) ; 
152161            } 
153-             let  mut  first = true ; 
154-             for  p in  before_predicates. iter ( )  { 
155-                 if  !first { 
156-                     state. word_space ( "," ) ; 
157-                 } 
158-                 first = false ; 
159-                 state. print_where_predicate ( p) ; 
160-             } 
161-             let  suggestion = state. s . eof ( ) ; 
162-             self . lint_buffer . buffer_lint_with_diagnostic ( 
163-                 DEPRECATED_WHERE_CLAUSE_LOCATION , 
164-                 id, 
165-                 where_clauses. 0 . 1 , 
166-                 fluent:: ast_passes_deprecated_where_clause_location, 
167-                 BuiltinLintDiagnostics :: DeprecatedWhereclauseLocation ( 
168-                     where_clauses. 1 . 1 . shrink_to_hi ( ) , 
169-                     suggestion, 
170-                 ) , 
171-             ) ; 
162+             first = false ; 
163+             state. print_where_predicate ( p) ; 
172164        } 
165+ 
166+         let  span = ty_alias. where_clauses . 0 . 1 ; 
167+         Err ( errors:: WhereClauseBeforeTypeAlias  { 
168+             span, 
169+             sugg :  errors:: WhereClauseBeforeTypeAliasSugg  { 
170+                 left :  span, 
171+                 snippet :  state. s . eof ( ) , 
172+                 right :  ty_alias. where_clauses . 1 . 1 . shrink_to_hi ( ) , 
173+             } , 
174+         } ) 
173175    } 
174176
175177    fn  with_impl_trait ( & mut  self ,  outer :  Option < Span > ,  f :  impl  FnOnce ( & mut  Self ) )  { 
@@ -1009,7 +1011,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10091011                    replace_span :  self . ending_semi_or_hi ( item. span ) , 
10101012                } ) ; 
10111013            } 
1012-             ItemKind :: TyAlias ( box TyAlias  {  defaultness,  where_clauses,  bounds,  ty,  .. } )  => { 
1014+             ItemKind :: TyAlias ( 
1015+                 ty_alias @ box TyAlias  {  defaultness,  bounds,  where_clauses,  ty,  .. } , 
1016+             )  => { 
10131017                self . check_defaultness ( item. span ,  * defaultness) ; 
10141018                if  ty. is_none ( )  { 
10151019                    self . session . emit_err ( errors:: TyAliasWithoutBody  { 
@@ -1018,9 +1022,16 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10181022                    } ) ; 
10191023                } 
10201024                self . check_type_no_bounds ( bounds,  "this context" ) ; 
1021-                 if  where_clauses. 1 . 0  { 
1022-                     self . err_handler ( ) 
1023-                         . emit_err ( errors:: WhereAfterTypeAlias  {  span :  where_clauses. 1 . 1  } ) ; 
1025+ 
1026+                 if  self . session . features_untracked ( ) . lazy_type_alias  { 
1027+                     if  let  Err ( err)  = self . check_type_alias_where_clause_location ( ty_alias)  { 
1028+                         self . err_handler ( ) . emit_err ( err) ; 
1029+                     } 
1030+                 }  else  if  where_clauses. 1 . 0  { 
1031+                     self . err_handler ( ) . emit_err ( errors:: WhereClauseAfterTypeAlias  { 
1032+                         span :  where_clauses. 1 . 1 , 
1033+                         help :  self . session . is_nightly_build ( ) . then_some ( ( ) ) , 
1034+                     } ) ; 
10241035                } 
10251036            } 
10261037            _ => { } 
@@ -1313,18 +1324,18 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
13131324            } 
13141325        } 
13151326
1316-         if  let  AssocItemKind :: Type ( box TyAlias  { 
1317-             generics, 
1318-             where_clauses, 
1319-             where_predicates_split, 
1320-             ty :  Some ( _) , 
1321-             ..
1322-         } )  = & item. kind 
1327+         if  let  AssocItemKind :: Type ( ty_alias)  = & item. kind 
1328+             && let  Err ( err)  = self . check_type_alias_where_clause_location ( ty_alias) 
13231329        { 
1324-             self . check_gat_where ( 
1330+             self . lint_buffer . buffer_lint_with_diagnostic ( 
1331+                 DEPRECATED_WHERE_CLAUSE_LOCATION , 
13251332                item. id , 
1326-                 generics. where_clause . predicates . split_at ( * where_predicates_split) . 0 , 
1327-                 * where_clauses, 
1333+                 err. span , 
1334+                 fluent:: ast_passes_deprecated_where_clause_location, 
1335+                 BuiltinLintDiagnostics :: DeprecatedWhereclauseLocation ( 
1336+                     err. sugg . right , 
1337+                     err. sugg . snippet , 
1338+                 ) , 
13281339            ) ; 
13291340        } 
13301341
0 commit comments