Make error for tuple struct pat/expr w/ FQS clearer
1. Fix "expected" and the note for the pattern case 2. Add suggestions
This commit is contained in:
parent
5f294f099a
commit
bce7fe1818
5 changed files with 222 additions and 57 deletions
48
tests/ui/associated-types/tuple-struct-expr-pat.fixed
Normal file
48
tests/ui/associated-types/tuple-struct-expr-pat.fixed
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
// Check that fully qualified syntax can **not** be used in tuple struct expressions (calls) and
|
||||
// patterns. Both tuple struct expressions and patterns are resolved in value namespace and thus
|
||||
// can't be resolved through associated *types*.
|
||||
//
|
||||
//@ run-rustfix
|
||||
|
||||
#![feature(more_qualified_paths)]
|
||||
|
||||
fn main() {
|
||||
let <T<0> as Trait>::Assoc {} = <T<0> as Trait>::Assoc {};
|
||||
//~^ error: expected method or associated constant, found associated type
|
||||
//~| error: expected tuple struct or tuple variant, found associated type
|
||||
let <T<1> as Trait>::Assoc { 0: _a } = <T<1> as Trait>::Assoc { 0: 0 };
|
||||
//~^ error: expected method or associated constant, found associated type
|
||||
//~| error: expected tuple struct or tuple variant, found associated type
|
||||
let <T<2> as Trait>::Assoc { 0: _a, 1: _b } = <T<2> as Trait>::Assoc { 0: 0, 1: 1 };
|
||||
//~^ error: expected method or associated constant, found associated type
|
||||
//~| error: expected tuple struct or tuple variant, found associated type
|
||||
let <T<3> as Trait>::Assoc { 0: ref _a, 1: ref mut _b, 2: mut _c } = <T<3> as Trait>::Assoc { 0: 0, 1: 1, 2: 2 };
|
||||
//~^ error: expected method or associated constant, found associated type
|
||||
//~| error: expected tuple struct or tuple variant, found associated type
|
||||
}
|
||||
|
||||
|
||||
struct T<const N: usize>;
|
||||
|
||||
struct T0();
|
||||
struct T1(u8);
|
||||
struct T2(u8, u8);
|
||||
struct T3(u8, u8, u8);
|
||||
|
||||
trait Trait {
|
||||
type Assoc;
|
||||
}
|
||||
|
||||
impl Trait for T<0> {
|
||||
type Assoc = T0;
|
||||
}
|
||||
|
||||
impl Trait for T<1> {
|
||||
type Assoc = T1;
|
||||
}
|
||||
impl Trait for T<2> {
|
||||
type Assoc = T2;
|
||||
}
|
||||
impl Trait for T<3> {
|
||||
type Assoc = T3;
|
||||
}
|
||||
|
|
@ -1,22 +1,24 @@
|
|||
// Check that fully qualified syntax can **not** be used in tuple struct expressions (calls) and
|
||||
// patterns. Both tuple struct expressions and patterns are resolved in value namespace and thus
|
||||
// can't be resolved through associated *types*.
|
||||
//
|
||||
//@ run-rustfix
|
||||
|
||||
#![feature(more_qualified_paths)]
|
||||
|
||||
fn main() {
|
||||
let <T<0> as Trait>::Assoc() = <T<0> as Trait>::Assoc();
|
||||
//~^ error: expected method or associated constant, found associated type
|
||||
//~| error: expected method or associated constant, found associated type
|
||||
//~| error: expected tuple struct or tuple variant, found associated type
|
||||
let <T<1> as Trait>::Assoc(_a) = <T<1> as Trait>::Assoc(0);
|
||||
//~^ error: expected method or associated constant, found associated type
|
||||
//~| error: expected method or associated constant, found associated type
|
||||
//~| error: expected tuple struct or tuple variant, found associated type
|
||||
let <T<2> as Trait>::Assoc(_a, _b) = <T<2> as Trait>::Assoc(0, 1);
|
||||
//~^ error: expected method or associated constant, found associated type
|
||||
//~| error: expected method or associated constant, found associated type
|
||||
//~| error: expected tuple struct or tuple variant, found associated type
|
||||
let <T<3> as Trait>::Assoc(ref _a, ref mut _b, mut _c) = <T<3> as Trait>::Assoc(0, 1, 2);
|
||||
//~^ error: expected method or associated constant, found associated type
|
||||
//~| error: expected method or associated constant, found associated type
|
||||
//~| error: expected tuple struct or tuple variant, found associated type
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,66 +1,96 @@
|
|||
error[E0575]: expected method or associated constant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:8:36
|
||||
--> $DIR/tuple-struct-expr-pat.rs:10:36
|
||||
|
|
||||
LL | let <T<0> as Trait>::Assoc() = <T<0> as Trait>::Assoc();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^-- help: use struct expression instead: `{}`
|
||||
|
|
||||
= note: can't use a type alias as a constructor
|
||||
|
||||
error[E0575]: expected method or associated constant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:8:9
|
||||
error[E0575]: expected tuple struct or tuple variant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:10:9
|
||||
|
|
||||
LL | let <T<0> as Trait>::Assoc() = <T<0> as Trait>::Assoc();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^-- help: use struct pattern instead: `{}`
|
||||
|
|
||||
= note: can't use a type alias as a constructor
|
||||
= note: can't use a type alias as tuple pattern
|
||||
|
||||
error[E0575]: expected method or associated constant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:11:38
|
||||
--> $DIR/tuple-struct-expr-pat.rs:13:38
|
||||
|
|
||||
LL | let <T<1> as Trait>::Assoc(_a) = <T<1> as Trait>::Assoc(0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: can't use a type alias as a constructor
|
||||
help: use struct expression instead
|
||||
|
|
||||
LL - let <T<1> as Trait>::Assoc(_a) = <T<1> as Trait>::Assoc(0);
|
||||
LL + let <T<1> as Trait>::Assoc(_a) = <T<1> as Trait>::Assoc { 0: 0 };
|
||||
|
|
||||
|
||||
error[E0575]: expected method or associated constant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:11:9
|
||||
error[E0575]: expected tuple struct or tuple variant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:13:9
|
||||
|
|
||||
LL | let <T<1> as Trait>::Assoc(_a) = <T<1> as Trait>::Assoc(0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: can't use a type alias as a constructor
|
||||
= note: can't use a type alias as tuple pattern
|
||||
help: use struct pattern instead
|
||||
|
|
||||
LL - let <T<1> as Trait>::Assoc(_a) = <T<1> as Trait>::Assoc(0);
|
||||
LL + let <T<1> as Trait>::Assoc { 0: _a } = <T<1> as Trait>::Assoc(0);
|
||||
|
|
||||
|
||||
error[E0575]: expected method or associated constant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:14:42
|
||||
--> $DIR/tuple-struct-expr-pat.rs:16:42
|
||||
|
|
||||
LL | let <T<2> as Trait>::Assoc(_a, _b) = <T<2> as Trait>::Assoc(0, 1);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: can't use a type alias as a constructor
|
||||
help: use struct expression instead
|
||||
|
|
||||
LL - let <T<2> as Trait>::Assoc(_a, _b) = <T<2> as Trait>::Assoc(0, 1);
|
||||
LL + let <T<2> as Trait>::Assoc(_a, _b) = <T<2> as Trait>::Assoc { 0: 0, 1: 1 };
|
||||
|
|
||||
|
||||
error[E0575]: expected method or associated constant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:14:9
|
||||
error[E0575]: expected tuple struct or tuple variant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:16:9
|
||||
|
|
||||
LL | let <T<2> as Trait>::Assoc(_a, _b) = <T<2> as Trait>::Assoc(0, 1);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: can't use a type alias as a constructor
|
||||
= note: can't use a type alias as tuple pattern
|
||||
help: use struct pattern instead
|
||||
|
|
||||
LL - let <T<2> as Trait>::Assoc(_a, _b) = <T<2> as Trait>::Assoc(0, 1);
|
||||
LL + let <T<2> as Trait>::Assoc { 0: _a, 1: _b } = <T<2> as Trait>::Assoc(0, 1);
|
||||
|
|
||||
|
||||
error[E0575]: expected method or associated constant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:17:62
|
||||
--> $DIR/tuple-struct-expr-pat.rs:19:62
|
||||
|
|
||||
LL | let <T<3> as Trait>::Assoc(ref _a, ref mut _b, mut _c) = <T<3> as Trait>::Assoc(0, 1, 2);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: can't use a type alias as a constructor
|
||||
help: use struct expression instead
|
||||
|
|
||||
LL - let <T<3> as Trait>::Assoc(ref _a, ref mut _b, mut _c) = <T<3> as Trait>::Assoc(0, 1, 2);
|
||||
LL + let <T<3> as Trait>::Assoc(ref _a, ref mut _b, mut _c) = <T<3> as Trait>::Assoc { 0: 0, 1: 1, 2: 2 };
|
||||
|
|
||||
|
||||
error[E0575]: expected method or associated constant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:17:9
|
||||
error[E0575]: expected tuple struct or tuple variant, found associated type `Trait::Assoc`
|
||||
--> $DIR/tuple-struct-expr-pat.rs:19:9
|
||||
|
|
||||
LL | let <T<3> as Trait>::Assoc(ref _a, ref mut _b, mut _c) = <T<3> as Trait>::Assoc(0, 1, 2);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: can't use a type alias as a constructor
|
||||
= note: can't use a type alias as tuple pattern
|
||||
help: use struct pattern instead
|
||||
|
|
||||
LL - let <T<3> as Trait>::Assoc(ref _a, ref mut _b, mut _c) = <T<3> as Trait>::Assoc(0, 1, 2);
|
||||
LL + let <T<3> as Trait>::Assoc { 0: ref _a, 1: ref mut _b, 2: mut _c } = <T<3> as Trait>::Assoc(0, 1, 2);
|
||||
|
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue