From c20b4f558440c24e8ef84782a71163fe236d72de Mon Sep 17 00:00:00 2001 From: Jack Huey <31162821+jackh726@users.noreply.github.com> Date: Tue, 19 Oct 2021 18:45:48 -0400 Subject: Change syntax for TyAlias where clauses --- src/test/ui/parser/bounds-lifetime-where.rs | 2 +- src/test/ui/parser/bounds-lifetime-where.stderr | 4 +-- src/test/ui/parser/removed-syntax-ptr-lifetime.rs | 2 +- .../ui/parser/removed-syntax-ptr-lifetime.stderr | 4 +-- src/test/ui/parser/type-alias-where.rs | 14 +++++----- src/test/ui/parser/type-alias-where.stderr | 32 ++++++++-------------- 6 files changed, 25 insertions(+), 33 deletions(-) (limited to 'src/test/ui/parser') diff --git a/src/test/ui/parser/bounds-lifetime-where.rs b/src/test/ui/parser/bounds-lifetime-where.rs index e60cc153e67..7ff75233d3a 100644 --- a/src/test/ui/parser/bounds-lifetime-where.rs +++ b/src/test/ui/parser/bounds-lifetime-where.rs @@ -5,6 +5,6 @@ type A where 'a:, = u8; // OK type A where 'a: 'b + 'c = u8; // OK type A where = u8; // OK type A where 'a: 'b + = u8; // OK -type A where , = u8; //~ ERROR expected one of `;`, `=`, lifetime, or type, found `,` +type A where , = u8; //~ ERROR expected one of `;`, `=`, `where`, lifetime, or type, found `,` fn main() {} diff --git a/src/test/ui/parser/bounds-lifetime-where.stderr b/src/test/ui/parser/bounds-lifetime-where.stderr index 950fa46c66b..785a1fb6793 100644 --- a/src/test/ui/parser/bounds-lifetime-where.stderr +++ b/src/test/ui/parser/bounds-lifetime-where.stderr @@ -1,8 +1,8 @@ -error: expected one of `;`, `=`, lifetime, or type, found `,` +error: expected one of `;`, `=`, `where`, lifetime, or type, found `,` --> $DIR/bounds-lifetime-where.rs:8:14 | LL | type A where , = u8; - | ^ expected one of `;`, `=`, lifetime, or type + | ^ expected one of `;`, `=`, `where`, lifetime, or type error: aborting due to previous error diff --git a/src/test/ui/parser/removed-syntax-ptr-lifetime.rs b/src/test/ui/parser/removed-syntax-ptr-lifetime.rs index 5b551addbc8..cc69af44a13 100644 --- a/src/test/ui/parser/removed-syntax-ptr-lifetime.rs +++ b/src/test/ui/parser/removed-syntax-ptr-lifetime.rs @@ -1 +1 @@ -type bptr = &lifetime/isize; //~ ERROR expected one of `!`, `(`, `::`, `;`, or `<`, found `/` +type bptr = &lifetime/isize; //~ ERROR expected one of `!`, `(`, `::`, `;`, `<`, or `where`, found `/` diff --git a/src/test/ui/parser/removed-syntax-ptr-lifetime.stderr b/src/test/ui/parser/removed-syntax-ptr-lifetime.stderr index 5b388ff4ce0..914de43e62d 100644 --- a/src/test/ui/parser/removed-syntax-ptr-lifetime.stderr +++ b/src/test/ui/parser/removed-syntax-ptr-lifetime.stderr @@ -1,8 +1,8 @@ -error: expected one of `!`, `(`, `::`, `;`, or `<`, found `/` +error: expected one of `!`, `(`, `::`, `;`, `<`, or `where`, found `/` --> $DIR/removed-syntax-ptr-lifetime.rs:1:22 | LL | type bptr = &lifetime/isize; - | ^ expected one of `!`, `(`, `::`, `;`, or `<` + | ^ expected one of `!`, `(`, `::`, `;`, `<`, or `where` error: aborting due to previous error diff --git a/src/test/ui/parser/type-alias-where.rs b/src/test/ui/parser/type-alias-where.rs index a9fa23dd95e..99ab8a7c48c 100644 --- a/src/test/ui/parser/type-alias-where.rs +++ b/src/test/ui/parser/type-alias-where.rs @@ -6,9 +6,9 @@ type Foo where u32: Copy = (); // Not fine. type Bar = () where u32: Copy; -//~^ ERROR where clause not allowed here +//~^ ERROR where clauses are not allowed type Baz = () where; -//~^ ERROR where clause not allowed here +//~^ ERROR where clauses are not allowed trait Trait { // Fine. @@ -18,19 +18,19 @@ trait Trait { } impl Trait for u32 { - // Fine. + // Not fine, suggests moving. type Assoc where u32: Copy = (); - // Not fine, suggests moving `i32: Copy` + //~^ ERROR 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 } impl Trait for i32 { - // Not fine, suggests moving `u32: Copy` + // Fine. type Assoc = () where u32: Copy; - //~^ ERROR where clause not allowed here // Not fine, suggests moving both. - type Assoc2 = () where u32: Copy, i32: Copy; + type Assoc2 where u32: Copy, i32: Copy = (); //~^ ERROR where clause not allowed here } diff --git a/src/test/ui/parser/type-alias-where.stderr b/src/test/ui/parser/type-alias-where.stderr index 7ab0b28c864..4cc8b703ced 100644 --- a/src/test/ui/parser/type-alias-where.stderr +++ b/src/test/ui/parser/type-alias-where.stderr @@ -1,40 +1,32 @@ -error: where clause not allowed here +error: where clauses are not allowed after the type for type aliases --> $DIR/type-alias-where.rs:8:15 | LL | type Bar = () where u32: Copy; - | - ^^^^^^^^^^^^^^^ - | | - | help: move it here: `where u32: Copy` + | ^^^^^^^^^^^^^^^ -error: where clause not allowed here +error: where clauses are not allowed after the type for type aliases --> $DIR/type-alias-where.rs:10:15 | LL | type Baz = () where; | ^^^^^ error: where clause not allowed here - --> $DIR/type-alias-where.rs:24:38 + --> $DIR/type-alias-where.rs:22:16 | -LL | type Assoc2 where u32: Copy = () where i32: Copy; - | - ^^^^^^^^^^^^^^^ - | | - | help: move it here: `, i32: Copy` +LL | type Assoc where u32: Copy = (); + | ^^^^^^^^^^^^^^^ - help: move it here: `where u32: Copy` error: where clause not allowed here - --> $DIR/type-alias-where.rs:30:21 + --> $DIR/type-alias-where.rs:25:17 | -LL | type Assoc = () where u32: Copy; - | - ^^^^^^^^^^^^^^^ - | | - | help: move it here: `where u32: Copy` +LL | type Assoc2 where u32: Copy = () where i32: Copy; + | ^^^^^^^^^^^^^^^ - help: move it here: `, u32: Copy` error: where clause not allowed here - --> $DIR/type-alias-where.rs:33:22 + --> $DIR/type-alias-where.rs:33:17 | -LL | type Assoc2 = () where u32: Copy, i32: Copy; - | - ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | help: move it here: `where u32: Copy, i32: Copy` +LL | type Assoc2 where u32: Copy, i32: Copy = (); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - help: move it here: `where u32: Copy, i32: Copy` error: aborting due to 5 previous errors -- cgit 1.4.1-3-g733a5 From 3f504f6984331f9465496d9d96c1f43dab5ce9c6 Mon Sep 17 00:00:00 2001 From: Jack Huey <31162821+jackh726@users.noreply.github.com> Date: Mon, 7 Feb 2022 01:23:37 -0500 Subject: Change to lint --- compiler/rustc_ast_passes/src/ast_validation.rs | 23 +++++++++------ compiler/rustc_lint/src/context.rs | 8 +++++ compiler/rustc_lint_defs/src/builtin.rs | 34 ++++++++++++++++++++++ compiler/rustc_lint_defs/src/lib.rs | 1 + .../bugs/issue-87735.stderr | 8 +++-- .../bugs/issue-87748.stderr | 6 ++-- src/test/ui/parser/type-alias-where.rs | 6 ++-- src/test/ui/parser/type-alias-where.stderr | 10 ++++--- 8 files changed, 75 insertions(+), 21 deletions(-) (limited to 'src/test/ui/parser') 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 ", }; } + +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 | ^ 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 -- cgit 1.4.1-3-g733a5 From 2b151fd5c8a106f276477357b5371d1184d940d4 Mon Sep 17 00:00:00 2001 From: Jack Huey <31162821+jackh726@users.noreply.github.com> Date: Mon, 14 Feb 2022 13:00:10 -0500 Subject: Review changes --- compiler/rustc_ast/src/ast.rs | 12 +++++++ compiler/rustc_ast_passes/src/ast_validation.rs | 8 +++-- compiler/rustc_lint/src/context.rs | 10 +++--- src/test/ui/parser/type-alias-where-fixable.fixed | 30 ++++++++++++++++ src/test/ui/parser/type-alias-where-fixable.rs | 30 ++++++++++++++++ src/test/ui/parser/type-alias-where-fixable.stderr | 42 ++++++++++++++++++++++ src/test/ui/parser/type-alias-where.rs | 24 ------------- src/test/ui/parser/type-alias-where.stderr | 24 +++---------- 8 files changed, 130 insertions(+), 50 deletions(-) create mode 100644 src/test/ui/parser/type-alias-where-fixable.fixed create mode 100644 src/test/ui/parser/type-alias-where-fixable.rs create mode 100644 src/test/ui/parser/type-alias-where-fixable.stderr (limited to 'src/test/ui/parser') diff --git a/compiler/rustc_ast/src/ast.rs b/compiler/rustc_ast/src/ast.rs index 2fbafca1681..ad1d4430c6b 100644 --- a/compiler/rustc_ast/src/ast.rs +++ b/compiler/rustc_ast/src/ast.rs @@ -2666,6 +2666,18 @@ pub struct Trait { /// a `where` keyword (`bool`). This is split out from `WhereClause`, since there /// are two locations for where clause on type aliases, but their predicates /// are concatenated together. +/// +/// Take this example: +/// ```rust, ignore +/// trait Foo { +/// type Assoc<'a, 'b> where Self: 'a, Self: 'b; +/// } +/// impl Foo for () { +/// type Assoc<'a, 'b> where Self: 'a = () where Self: 'b; +/// // ^^^^^^^^^^^^^^ first where clause +/// // ^^^^^^^^^^^^^^ second where clause +/// } +/// ``` #[derive(Copy, Clone, Encodable, Decodable, Debug, Default)] pub struct TyAliasWhereClause(pub bool, pub Span); diff --git a/compiler/rustc_ast_passes/src/ast_validation.rs b/compiler/rustc_ast_passes/src/ast_validation.rs index c519d05d227..0cf73178d67 100644 --- a/compiler/rustc_ast_passes/src/ast_validation.rs +++ b/compiler/rustc_ast_passes/src/ast_validation.rs @@ -1275,10 +1275,14 @@ impl<'a> Visitor<'a> for AstValidator<'a> { } self.check_type_no_bounds(bounds, "this context"); if where_clauses.1.0 { - self.err_handler().span_err( + let mut err = self.err_handler().struct_span_err( where_clauses.1.1, "where clauses are not allowed after the type for type aliases", - ) + ); + err.note( + "see issue #89122 for more information", + ); + err.emit(); } } _ => {} diff --git a/compiler/rustc_lint/src/context.rs b/compiler/rustc_lint/src/context.rs index 92adb718933..b892e520d3b 100644 --- a/compiler/rustc_lint/src/context.rs +++ b/compiler/rustc_lint/src/context.rs @@ -819,12 +819,14 @@ pub trait LintContext: Sized { } }, BuiltinLintDiagnostics::DeprecatedWhereclauseLocation(new_span, suggestion) => { - db.span_suggestion( - new_span, - "move it here", - suggestion, + db.multipart_suggestion( + "move it to the end of the type declaration", + vec![(db.span.primary_span().unwrap(), "".to_string()), (new_span, suggestion)], Applicability::MachineApplicable, ); + db.note( + "see issue #89122 for more information", + ); }, } // Rewrap `db`, and pass control to the user. diff --git a/src/test/ui/parser/type-alias-where-fixable.fixed b/src/test/ui/parser/type-alias-where-fixable.fixed new file mode 100644 index 00000000000..41dd10676d5 --- /dev/null +++ b/src/test/ui/parser/type-alias-where-fixable.fixed @@ -0,0 +1,30 @@ +// check-pass +// run-rustfix + +#![feature(generic_associated_types)] + +trait Trait { + // Fine. + type Assoc where u32: Copy; + // Fine. + type Assoc2 where u32: Copy, i32: Copy; +} + +impl Trait for u32 { + // Not fine, suggests moving. + type Assoc = () where u32: Copy; + //~^ WARNING where clause not allowed here + // Not fine, suggests moving `u32: Copy` + type Assoc2 = () where i32: Copy, u32: Copy; + //~^ WARNING where clause not allowed here +} + +impl Trait for i32 { + // Fine. + type Assoc = () where u32: Copy; + // Not fine, suggests moving both. + type Assoc2 = () where u32: Copy, i32: Copy; + //~^ WARNING where clause not allowed here +} + +fn main() {} diff --git a/src/test/ui/parser/type-alias-where-fixable.rs b/src/test/ui/parser/type-alias-where-fixable.rs new file mode 100644 index 00000000000..562a530a7f3 --- /dev/null +++ b/src/test/ui/parser/type-alias-where-fixable.rs @@ -0,0 +1,30 @@ +// check-pass +// run-rustfix + +#![feature(generic_associated_types)] + +trait Trait { + // Fine. + type Assoc where u32: Copy; + // Fine. + type Assoc2 where u32: Copy, i32: Copy; +} + +impl Trait for u32 { + // Not fine, suggests moving. + type Assoc where u32: Copy = (); + //~^ WARNING where clause not allowed here + // Not fine, suggests moving `u32: Copy` + type Assoc2 where u32: Copy = () where i32: Copy; + //~^ WARNING where clause not allowed here +} + +impl Trait for i32 { + // Fine. + type Assoc = () where u32: Copy; + // Not fine, suggests moving both. + type Assoc2 where u32: Copy, i32: Copy = (); + //~^ WARNING where clause not allowed here +} + +fn main() {} diff --git a/src/test/ui/parser/type-alias-where-fixable.stderr b/src/test/ui/parser/type-alias-where-fixable.stderr new file mode 100644 index 00000000000..7ec1a965bae --- /dev/null +++ b/src/test/ui/parser/type-alias-where-fixable.stderr @@ -0,0 +1,42 @@ +warning: where clause not allowed here + --> $DIR/type-alias-where-fixable.rs:15:16 + | +LL | type Assoc where u32: Copy = (); + | ^^^^^^^^^^^^^^^ + | + = note: `#[warn(deprecated_where_clause_location)]` on by default + = note: see issue #89122 for more information +help: move it to the end of the type declaration + | +LL - type Assoc where u32: Copy = (); +LL + type Assoc = () where u32: Copy; + | + +warning: where clause not allowed here + --> $DIR/type-alias-where-fixable.rs:18:17 + | +LL | type Assoc2 where u32: Copy = () where i32: Copy; + | ^^^^^^^^^^^^^^^ + | + = note: see issue #89122 for more information +help: move it to the end of the type declaration + | +LL - type Assoc2 where u32: Copy = () where i32: Copy; +LL + type Assoc2 = () where i32: Copy, u32: Copy; + | + +warning: where clause not allowed here + --> $DIR/type-alias-where-fixable.rs:26:17 + | +LL | type Assoc2 where u32: Copy, i32: Copy = (); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #89122 for more information +help: move it to the end of the type declaration + | +LL - type Assoc2 where u32: Copy, i32: Copy = (); +LL + type Assoc2 = () where u32: Copy, i32: Copy; + | + +warning: 3 warnings emitted + diff --git a/src/test/ui/parser/type-alias-where.rs b/src/test/ui/parser/type-alias-where.rs index 941acd5b5ab..f6e7dfb7b7b 100644 --- a/src/test/ui/parser/type-alias-where.rs +++ b/src/test/ui/parser/type-alias-where.rs @@ -10,28 +10,4 @@ type Bar = () where u32: Copy; type Baz = () where; //~^ ERROR where clauses are not allowed -trait Trait { - // Fine. - type Assoc where u32: Copy; - // Fine. - type Assoc2 where u32: Copy, i32: Copy; -} - -impl Trait for u32 { - // Not fine, suggests moving. - type Assoc where u32: Copy = (); - //~^ WARNING where clause not allowed here - // Not fine, suggests moving `u32: Copy` - type Assoc2 where u32: Copy = () where i32: Copy; - //~^ WARNING where clause not allowed here -} - -impl Trait for i32 { - // Fine. - type Assoc = () where u32: Copy; - // Not fine, suggests moving both. - type Assoc2 where u32: Copy, i32: Copy = (); - //~^ 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 166302c9e1d..8789d2665ad 100644 --- a/src/test/ui/parser/type-alias-where.stderr +++ b/src/test/ui/parser/type-alias-where.stderr @@ -3,32 +3,16 @@ error: where clauses are not allowed after the type for type aliases | LL | type Bar = () where u32: Copy; | ^^^^^^^^^^^^^^^ + | + = note: see issue #89122 for more information error: where clauses are not allowed after the type for type aliases --> $DIR/type-alias-where.rs:10:15 | LL | type Baz = () where; | ^^^^^ - -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 - -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` - -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` + = note: see issue #89122 for more information -error: aborting due to 2 previous errors; 3 warnings emitted +error: aborting due to 2 previous errors -- cgit 1.4.1-3-g733a5