Make ProjectionTy::trait_ref truncate substs again
Also make sure that type arguments of associated types are printed in some error messages.
This commit is contained in:
parent
79f6f11816
commit
dfee89f755
12 changed files with 216 additions and 49 deletions
|
|
@ -0,0 +1,17 @@
|
|||
// Test that correct syntax is used in suggestion to constrain associated type
|
||||
|
||||
#![feature(generic_associated_types)]
|
||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
||||
|
||||
trait X {
|
||||
type Y<T>;
|
||||
}
|
||||
|
||||
fn f<T: X>(a: T::Y<i32>) {
|
||||
//~^ HELP consider constraining the associated type `<T as X>::Y<i32>` to `Vec<i32>`
|
||||
//~| SUGGESTION Y<i32> = Vec<i32>>
|
||||
let b: Vec<i32> = a;
|
||||
//~^ ERROR mismatched types
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/constraint-assoc-type-suggestion.rs:3:12
|
||||
|
|
||||
LL | #![feature(generic_associated_types)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/constraint-assoc-type-suggestion.rs:13:23
|
||||
|
|
||||
LL | let b: Vec<i32> = a;
|
||||
| -------- ^ expected struct `Vec`, found associated type
|
||||
| |
|
||||
| expected due to this
|
||||
|
|
||||
= note: expected struct `Vec<i32>`
|
||||
found associated type `<T as X>::Y<i32>`
|
||||
help: consider constraining the associated type `<T as X>::Y<i32>` to `Vec<i32>`
|
||||
|
|
||||
LL | fn f<T: X<Y<i32> = Vec<i32>>>(a: T::Y<i32>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
// Test that the predicate printed in an unresolved method error prints the
|
||||
// generics for a generic associated type.
|
||||
|
||||
#![feature(generic_associated_types)]
|
||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
||||
//~| NOTE `#[warn(incomplete_features)]` on by default
|
||||
//~| NOTE see issue #44265
|
||||
|
||||
trait X {
|
||||
type Y<T>;
|
||||
}
|
||||
|
||||
trait M {
|
||||
fn f(&self) {}
|
||||
}
|
||||
|
||||
impl<T: X<Y<i32> = i32>> M for T {}
|
||||
|
||||
struct S;
|
||||
//~^ NOTE method `f` not found for this
|
||||
//~| NOTE doesn't satisfy `<S as X>::Y<i32> = i32`
|
||||
//~| NOTE doesn't satisfy `S: M`
|
||||
|
||||
impl X for S {
|
||||
type Y<T> = bool;
|
||||
}
|
||||
|
||||
fn f(a: S) {
|
||||
a.f();
|
||||
//~^ ERROR the method `f` exists for struct `S`, but its trait bounds were not satisfied
|
||||
//~| NOTE method cannot be called on `S` due to unsatisfied trait bounds
|
||||
//~| NOTE the following trait bounds were not satisfied:
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/method-unsatified-assoc-type-predicate.rs:4:12
|
||||
|
|
||||
LL | #![feature(generic_associated_types)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
|
||||
|
||||
error[E0599]: the method `f` exists for struct `S`, but its trait bounds were not satisfied
|
||||
--> $DIR/method-unsatified-assoc-type-predicate.rs:29:7
|
||||
|
|
||||
LL | struct S;
|
||||
| ---------
|
||||
| |
|
||||
| method `f` not found for this
|
||||
| doesn't satisfy `<S as X>::Y<i32> = i32`
|
||||
| doesn't satisfy `S: M`
|
||||
...
|
||||
LL | a.f();
|
||||
| ^ method cannot be called on `S` due to unsatisfied trait bounds
|
||||
|
|
||||
= note: the following trait bounds were not satisfied:
|
||||
`<S as X>::Y<i32> = i32`
|
||||
which is required by `S: M`
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0599`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue