File tree Expand file tree Collapse file tree 3 files changed +106
-0
lines changed Expand file tree Collapse file tree 3 files changed +106
-0
lines changed Original file line number Diff line number Diff line change 1+ error[E0034]: multiple applicable items in scope
2+ --> $DIR/rigid-alias-bound-is-not-inherent.rs:42:7
3+ |
4+ LL | x.method();
5+ | ^^^^^^ multiple `method` found
6+ |
7+ note: candidate #1 is defined in the trait `Trait1`
8+ --> $DIR/rigid-alias-bound-is-not-inherent.rs:21:5
9+ |
10+ LL | fn method(&self) {
11+ | ^^^^^^^^^^^^^^^^
12+ note: candidate #2 is defined in an impl of the trait `Trait2` for the type `T`
13+ --> $DIR/rigid-alias-bound-is-not-inherent.rs:27:5
14+ |
15+ LL | fn method(&self) {
16+ | ^^^^^^^^^^^^^^^^
17+ help: disambiguate the method for candidate #1
18+ |
19+ LL - x.method();
20+ LL + Trait1::method(&x);
21+ |
22+ help: disambiguate the method for candidate #2
23+ |
24+ LL - x.method();
25+ LL + Trait2::method(&x);
26+ |
27+
28+ error: aborting due to 1 previous error
29+
30+ For more information about this error, try `rustc --explain E0034`.
Original file line number Diff line number Diff line change 1+ error[E0034]: multiple applicable items in scope
2+ --> $DIR/rigid-alias-bound-is-not-inherent.rs:42:7
3+ |
4+ LL | x.method();
5+ | ^^^^^^ multiple `method` found
6+ |
7+ note: candidate #1 is defined in the trait `Trait1`
8+ --> $DIR/rigid-alias-bound-is-not-inherent.rs:21:5
9+ |
10+ LL | fn method(&self) {
11+ | ^^^^^^^^^^^^^^^^
12+ note: candidate #2 is defined in the trait `Trait2`
13+ --> $DIR/rigid-alias-bound-is-not-inherent.rs:27:5
14+ |
15+ LL | fn method(&self) {
16+ | ^^^^^^^^^^^^^^^^
17+ help: disambiguate the method for candidate #1
18+ |
19+ LL - x.method();
20+ LL + Trait1::method(&x);
21+ |
22+ help: disambiguate the method for candidate #2
23+ |
24+ LL - x.method();
25+ LL + Trait2::method(&x);
26+ |
27+
28+ error: aborting due to 1 previous error
29+
30+ For more information about this error, try `rustc --explain E0034`.
Original file line number Diff line number Diff line change 1+ //@ revisions: current next
2+ //@ ignore-compare-mode-next-solver (explicit revisions)
3+ //@[next] compile-flags: -Znext-solver
4+
5+ // See the code below.
6+ //
7+ // We were using `DeepRejectCtxt` to ensure that `assemble_inherent_candidates_from_param`
8+ // did not rely on the param-env being eagerly normalized. Since aliases unify with all
9+ // types, this meant that a rigid param-env candidate like `<T as Deref>::Target: Trait1`
10+ // would be registered as a "WhereClauseCandidate", which is treated as inherent. Since
11+ // we evaluate these candidates for all self types in the deref chain, this candidate
12+ // would be satisfied for `<T as Deref>::Target`, meaning that it would be preferred over
13+ // an "extension" candidate like `<T as Deref>::Target: Trait2` even though it holds.
14+ // This is problematic, since it causes ambiguities to be broken somewhat arbitrarily.
15+ // And as a side-effect, it also caused our computation of "used" traits to be miscalculated
16+ // since inherent candidates don't count as an import usage.
17+
18+ use std:: ops:: Deref ;
19+
20+ trait Trait1 {
21+ fn method ( & self ) {
22+ println ! ( "1" ) ;
23+ }
24+ }
25+
26+ trait Trait2 {
27+ fn method ( & self ) {
28+ println ! ( "2" ) ;
29+ }
30+ }
31+ impl < T : Other + ?Sized > Trait2 for T { }
32+
33+ trait Other { }
34+
35+ fn foo < T > ( x : T )
36+ where
37+ T : Deref ,
38+ <T as Deref >:: Target : Trait1 + Other ,
39+ {
40+ // Make sure that we don't prefer methods from where clauses for rigid aliases,
41+ // just for params. We could revisit this behavior, but it would be a lang change.
42+ x. method ( ) ;
43+ //~^ ERROR multiple applicable items in scope
44+ }
45+
46+ fn main ( ) { }
You can’t perform that action at this time.
0 commit comments