about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJack Huey <31162821+jackh726@users.noreply.github.com>2022-02-07 01:23:37 -0500
committerJack Huey <31162821+jackh726@users.noreply.github.com>2022-03-05 13:15:00 -0500
commit3f504f6984331f9465496d9d96c1f43dab5ce9c6 (patch)
tree6db5264ddd9a68c3493700ec8bd587ee9967e24f
parentc20b4f558440c24e8ef84782a71163fe236d72de (diff)
downloadrust-3f504f6984331f9465496d9d96c1f43dab5ce9c6.tar.gz
rust-3f504f6984331f9465496d9d96c1f43dab5ce9c6.zip
Change to lint
-rw-r--r--compiler/rustc_ast_passes/src/ast_validation.rs23
-rw-r--r--compiler/rustc_lint/src/context.rs8
-rw-r--r--compiler/rustc_lint_defs/src/builtin.rs34
-rw-r--r--compiler/rustc_lint_defs/src/lib.rs1
-rw-r--r--src/test/ui/generic-associated-types/bugs/issue-87735.stderr8
-rw-r--r--src/test/ui/generic-associated-types/bugs/issue-87748.stderr6
-rw-r--r--src/test/ui/parser/type-alias-where.rs6
-rw-r--r--src/test/ui/parser/type-alias-where.stderr10
8 files changed, 75 insertions, 21 deletions
diff --git a/compiler/rustc_ast_passes/src/ast_validation.rs b/compiler/rustc_ast_passes/src/ast_validation.rs
index 0b97a1b1814..c519d05d227 100644
--- a/compiler/rustc_ast_passes/src/ast_validation.rs
+++ b/compiler/rustc_ast_passes/src/ast_validation.rs
@@ -15,7 +15,9 @@ use rustc_ast_pretty::pprust::{self, State};
 use rustc_data_structures::fx::FxHashMap;
 use rustc_errors::{error_code, pluralize, struct_span_err, Applicability};
 use rustc_parse::validate_attr;
-use rustc_session::lint::builtin::{MISSING_ABI, PATTERNS_IN_FNS_WITHOUT_BODY};
+use rustc_session::lint::builtin::{
+    DEPRECATED_WHERE_CLAUSE_LOCATION, MISSING_ABI, PATTERNS_IN_FNS_WITHOUT_BODY,
+};
 use rustc_session::lint::{BuiltinLintDiagnostics, LintBuffer};
 use rustc_session::Session;
 use rustc_span::source_map::Spanned;
@@ -123,11 +125,11 @@ impl<'a> AstValidator<'a> {
     }
 
     fn check_gat_where(
-        &self,
+        &mut self,
+        id: NodeId,
         before_predicates: &[WherePredicate],
         where_clauses: (ast::TyAliasWhereClause, ast::TyAliasWhereClause),
     ) {
-        let sess = &self.session;
         if !before_predicates.is_empty() {
             let mut state = State::new();
             if !where_clauses.1.0 {
@@ -145,14 +147,16 @@ impl<'a> AstValidator<'a> {
                 state.print_where_predicate(p);
             }
             let suggestion = state.s.eof();
-            sess.struct_span_err(where_clauses.0.1, "where clause not allowed here")
-                .span_suggestion(
+            self.lint_buffer.buffer_lint_with_diagnostic(
+                DEPRECATED_WHERE_CLAUSE_LOCATION,
+                id,
+                where_clauses.0.1,
+                "where clause not allowed here",
+                BuiltinLintDiagnostics::DeprecatedWhereclauseLocation(
                     where_clauses.1.1.shrink_to_hi(),
-                    "move it here",
                     suggestion,
-                    Applicability::MachineApplicable,
-                )
-                .emit();
+                ),
+            );
         }
     }
 
@@ -1568,6 +1572,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
                     self.check_type_no_bounds(bounds, "`impl`s");
                     if ty.is_some() {
                         self.check_gat_where(
+                            item.id,
                             generics.where_clause.predicates.split_at(*where_predicates_split).0,
                             *where_clauses,
                         );
diff --git a/compiler/rustc_lint/src/context.rs b/compiler/rustc_lint/src/context.rs
index c6bbf769b23..92adb718933 100644
--- a/compiler/rustc_lint/src/context.rs
+++ b/compiler/rustc_lint/src/context.rs
@@ -818,6 +818,14 @@ pub trait LintContext: Sized {
                         }
                     }
                 },
+                BuiltinLintDiagnostics::DeprecatedWhereclauseLocation(new_span, suggestion) => {
+                    db.span_suggestion(
+                        new_span,
+                        "move it here",
+                        suggestion,
+                        Applicability::MachineApplicable,
+                    );
+                },
             }
             // Rewrap `db`, and pass control to the user.
             decorate(LintDiagnosticBuilder::new(db));
diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs
index 272913f3f0e..04a339f3c95 100644
--- a/compiler/rustc_lint_defs/src/builtin.rs
+++ b/compiler/rustc_lint_defs/src/builtin.rs
@@ -3127,6 +3127,7 @@ declare_lint_pass! {
         DUPLICATE_MACRO_ATTRIBUTES,
         SUSPICIOUS_AUTO_TRAIT_IMPLS,
         UNEXPECTED_CFGS,
+        DEPRECATED_WHERE_CLAUSE_LOCATION,
     ]
 }
 
@@ -3737,3 +3738,36 @@ declare_lint! {
         reference: "issue #93367 <https://github.com/rust-lang/rust/issues/93367>",
     };
 }
+
+declare_lint! {
+    /// The `deprecated_where_clause_location` lint detects when a where clause in front of the equals
+    /// in an associated type.
+    ///
+    /// ### Example
+    ///
+    /// ```rust
+    /// #![feature(generic_associated_types)]
+    ///
+    /// trait Trait {
+    ///   type Assoc<'a> where Self: 'a;
+    /// }
+    ///
+    /// impl Trait for () {
+    ///   type Assoc<'a> where Self: 'a = ();
+    /// }
+    /// ```
+    ///
+    /// {{produces}}
+    ///
+    /// ### Explanation
+    ///
+    /// The preferred location for where clauses on associated types in impls
+    /// is after the type. However, for most of generic associated types development,
+    /// it was only accepted before the equals. To provide a transition period and
+    /// further evaluate this change, both are currently accepted. At some point in
+    /// the future, this may be disallowed at an edition boundary; but, that is
+    /// undecided currently.
+    pub DEPRECATED_WHERE_CLAUSE_LOCATION,
+    Warn,
+    "deprecated where clause location"
+}
diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs
index e7f6dfa67b9..cd328b08735 100644
--- a/compiler/rustc_lint_defs/src/lib.rs
+++ b/compiler/rustc_lint_defs/src/lib.rs
@@ -427,6 +427,7 @@ pub enum BuiltinLintDiagnostics {
     NamedAsmLabel(String),
     UnicodeTextFlow(Span, String),
     UnexpectedCfg((Symbol, Span), Option<(Symbol, Span)>),
+    DeprecatedWhereclauseLocation(Span, String),
 }
 
 /// Lints that are buffered up early on in the `Session` before the
diff --git a/src/test/ui/generic-associated-types/bugs/issue-87735.stderr b/src/test/ui/generic-associated-types/bugs/issue-87735.stderr
index a64e52124c8..a694f1ffaad 100644
--- a/src/test/ui/generic-associated-types/bugs/issue-87735.stderr
+++ b/src/test/ui/generic-associated-types/bugs/issue-87735.stderr
@@ -1,10 +1,12 @@
-error: where clause not allowed here
+warning: where clause not allowed here
   --> $DIR/issue-87735.rs:15:19
    |
 LL |   type Output<'a> where Self: 'a = &'a [T];
    |                   ^^^^^^^^^^^^^^          - help: move it here: `where Self: 'a`
+   |
+   = note: `#[warn(deprecated_where_clause_location)]` on by default
 
-error: where clause not allowed here
+warning: where clause not allowed here
   --> $DIR/issue-87735.rs:36:19
    |
 LL |   type Output<'a> where Self: 'a = FooRef<'a, U>;
@@ -16,6 +18,6 @@ error[E0207]: the type parameter `U` is not constrained by the impl trait, self
 LL | impl<'b, T, U> AsRef2 for Foo<T>
    |             ^ unconstrained type parameter
 
-error: aborting due to 3 previous errors
+error: aborting due to previous error; 2 warnings emitted
 
 For more information about this error, try `rustc --explain E0207`.
diff --git a/src/test/ui/generic-associated-types/bugs/issue-87748.stderr b/src/test/ui/generic-associated-types/bugs/issue-87748.stderr
index f92930fc948..9a7cdd02eab 100644
--- a/src/test/ui/generic-associated-types/bugs/issue-87748.stderr
+++ b/src/test/ui/generic-associated-types/bugs/issue-87748.stderr
@@ -1,8 +1,10 @@
-error: where clause not allowed here
+warning: where clause not allowed here
   --> $DIR/issue-87748.rs:16:24
    |
 LL |     type Assoc<'a, 'b> where 'b: 'a = u32;
    |                        ^^^^^^^^^^^^      - help: move it here: `where 'b: 'a`
+   |
+   = note: `#[warn(deprecated_where_clause_location)]` on by default
 
 error[E0478]: lifetime bound not satisfied
   --> $DIR/issue-87748.rs:18:5
@@ -21,6 +23,6 @@ note: but lifetime parameter must outlive the anonymous lifetime #1 defined here
 LL |     fn do_sth(_: u32) {}
    |     ^^^^^^^^^^^^^^^^^
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error; 1 warning emitted
 
 For more information about this error, try `rustc --explain E0478`.
diff --git a/src/test/ui/parser/type-alias-where.rs b/src/test/ui/parser/type-alias-where.rs
index 99ab8a7c48c..941acd5b5ab 100644
--- a/src/test/ui/parser/type-alias-where.rs
+++ b/src/test/ui/parser/type-alias-where.rs
@@ -20,10 +20,10 @@ trait Trait {
 impl Trait for u32 {
     // Not fine, suggests moving.
     type Assoc where u32: Copy = ();
-    //~^ ERROR where clause not allowed here
+    //~^ WARNING where clause not allowed here
     // Not fine, suggests moving `u32: Copy`
     type Assoc2 where u32: Copy = () where i32: Copy;
-    //~^ ERROR where clause not allowed here
+    //~^ WARNING where clause not allowed here
 }
 
 impl Trait for i32 {
@@ -31,7 +31,7 @@ impl Trait for i32 {
     type Assoc = () where u32: Copy;
     // Not fine, suggests moving both.
     type Assoc2 where u32: Copy, i32: Copy = ();
-    //~^ ERROR where clause not allowed here
+    //~^ WARNING where clause not allowed here
 }
 
 fn main() {}
diff --git a/src/test/ui/parser/type-alias-where.stderr b/src/test/ui/parser/type-alias-where.stderr
index 4cc8b703ced..166302c9e1d 100644
--- a/src/test/ui/parser/type-alias-where.stderr
+++ b/src/test/ui/parser/type-alias-where.stderr
@@ -10,23 +10,25 @@ error: where clauses are not allowed after the type for type aliases
 LL | type Baz = () where;
    |               ^^^^^
 
-error: where clause not allowed here
+warning: where clause not allowed here
   --> $DIR/type-alias-where.rs:22:16
    |
 LL |     type Assoc where u32: Copy = ();
    |                ^^^^^^^^^^^^^^^     - help: move it here: `where u32: Copy`
+   |
+   = note: `#[warn(deprecated_where_clause_location)]` on by default
 
-error: where clause not allowed here
+warning: where clause not allowed here
   --> $DIR/type-alias-where.rs:25:17
    |
 LL |     type Assoc2 where u32: Copy = () where i32: Copy;
    |                 ^^^^^^^^^^^^^^^                     - help: move it here: `, u32: Copy`
 
-error: where clause not allowed here
+warning: where clause not allowed here
   --> $DIR/type-alias-where.rs:33:17
    |
 LL |     type Assoc2 where u32: Copy, i32: Copy = ();
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^     - help: move it here: `where u32: Copy, i32: Copy`
 
-error: aborting due to 5 previous errors
+error: aborting due to 2 previous errors; 3 warnings emitted