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:
Waffle Lapkin 2025-04-27 16:05:44 +02:00
parent 5f294f099a
commit bce7fe1818
No known key found for this signature in database
5 changed files with 222 additions and 57 deletions

View 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;
}

View file

@ -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
}

View file

@ -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