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: [PATCH] Review changes --- compiler/rustc_ast/src/ast.rs | 12 ++++++ .../rustc_ast_passes/src/ast_validation.rs | 8 +++- compiler/rustc_lint/src/context.rs | 10 +++-- .../ui/parser/type-alias-where-fixable.fixed | 30 +++++++++++++ .../ui/parser/type-alias-where-fixable.rs | 30 +++++++++++++ .../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 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 @@ fn visit_item(&mut self, item: &'a Item) { } 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 @@ fn lookup_with_diagnostics( } }, 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 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 -- GitLab