Add test
This commit is contained in:
parent
2f85c80f9c
commit
b0ec0ec10d
3 changed files with 106 additions and 0 deletions
|
|
@ -0,0 +1,30 @@
|
|||
error[E0034]: multiple applicable items in scope
|
||||
--> $DIR/rigid-alias-bound-is-not-inherent.rs:42:7
|
||||
|
|
||||
LL | x.method();
|
||||
| ^^^^^^ multiple `method` found
|
||||
|
|
||||
note: candidate #1 is defined in the trait `Trait1`
|
||||
--> $DIR/rigid-alias-bound-is-not-inherent.rs:21:5
|
||||
|
|
||||
LL | fn method(&self) {
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
note: candidate #2 is defined in an impl of the trait `Trait2` for the type `T`
|
||||
--> $DIR/rigid-alias-bound-is-not-inherent.rs:27:5
|
||||
|
|
||||
LL | fn method(&self) {
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
help: disambiguate the method for candidate #1
|
||||
|
|
||||
LL - x.method();
|
||||
LL + Trait1::method(&x);
|
||||
|
|
||||
help: disambiguate the method for candidate #2
|
||||
|
|
||||
LL - x.method();
|
||||
LL + Trait2::method(&x);
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0034`.
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
error[E0034]: multiple applicable items in scope
|
||||
--> $DIR/rigid-alias-bound-is-not-inherent.rs:42:7
|
||||
|
|
||||
LL | x.method();
|
||||
| ^^^^^^ multiple `method` found
|
||||
|
|
||||
note: candidate #1 is defined in the trait `Trait1`
|
||||
--> $DIR/rigid-alias-bound-is-not-inherent.rs:21:5
|
||||
|
|
||||
LL | fn method(&self) {
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
note: candidate #2 is defined in the trait `Trait2`
|
||||
--> $DIR/rigid-alias-bound-is-not-inherent.rs:27:5
|
||||
|
|
||||
LL | fn method(&self) {
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
help: disambiguate the method for candidate #1
|
||||
|
|
||||
LL - x.method();
|
||||
LL + Trait1::method(&x);
|
||||
|
|
||||
help: disambiguate the method for candidate #2
|
||||
|
|
||||
LL - x.method();
|
||||
LL + Trait2::method(&x);
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0034`.
|
||||
46
tests/ui/methods/rigid-alias-bound-is-not-inherent.rs
Normal file
46
tests/ui/methods/rigid-alias-bound-is-not-inherent.rs
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
//@ revisions: current next
|
||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||
//@[next] compile-flags: -Znext-solver
|
||||
|
||||
// See the code below.
|
||||
//
|
||||
// We were using `DeepRejectCtxt` to ensure that `assemble_inherent_candidates_from_param`
|
||||
// did not rely on the param-env being eagerly normalized. Since aliases unify with all
|
||||
// types, this meant that a rigid param-env candidate like `<T as Deref>::Target: Trait1`
|
||||
// would be registered as a "WhereClauseCandidate", which is treated as inherent. Since
|
||||
// we evaluate these candidates for all self types in the deref chain, this candidate
|
||||
// would be satisfied for `<T as Deref>::Target`, meaning that it would be preferred over
|
||||
// an "extension" candidate like `<T as Deref>::Target: Trait2` even though it holds.
|
||||
// This is problematic, since it causes ambiguities to be broken somewhat arbitrarily.
|
||||
// And as a side-effect, it also caused our computation of "used" traits to be miscalculated
|
||||
// since inherent candidates don't count as an import usage.
|
||||
|
||||
use std::ops::Deref;
|
||||
|
||||
trait Trait1 {
|
||||
fn method(&self) {
|
||||
println!("1");
|
||||
}
|
||||
}
|
||||
|
||||
trait Trait2 {
|
||||
fn method(&self) {
|
||||
println!("2");
|
||||
}
|
||||
}
|
||||
impl<T: Other + ?Sized> Trait2 for T {}
|
||||
|
||||
trait Other {}
|
||||
|
||||
fn foo<T>(x: T)
|
||||
where
|
||||
T: Deref,
|
||||
<T as Deref>::Target: Trait1 + Other,
|
||||
{
|
||||
// Make sure that we don't prefer methods from where clauses for rigid aliases,
|
||||
// just for params. We could revisit this behavior, but it would be a lang change.
|
||||
x.method();
|
||||
//~^ ERROR multiple applicable items in scope
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue