Skip to content

Commit 20679b1

Browse files
Still-further-specializable projections are ambiguous
1 parent 96bd50d commit 20679b1

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

compiler/rustc_trait_selection/src/solve/project_goals.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> {
174174
goal.predicate.def_id(),
175175
impl_def_id
176176
)? else {
177-
return ecx.evaluate_added_goals_and_make_canonical_response(Certainty::Yes);
177+
return ecx.evaluate_added_goals_and_make_canonical_response(Certainty::AMBIGUOUS);
178178
};
179179

180180
if !assoc_def.item.defaultness(tcx).has_value() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// compile-flags: -Ztrait-solver=next
2+
3+
#![feature(specialization)]
4+
//~^ WARN the feature `specialization` is incomplete
5+
6+
// Do not treat the RHS of a projection-goal as an unconstrained `Certainty::Yes` response
7+
// if the impl is still further specializable.
8+
9+
trait Default {
10+
type Id;
11+
}
12+
13+
impl<T> Default for T {
14+
default type Id = T;
15+
}
16+
17+
fn test<T: Default<Id = U>, U>() {}
18+
19+
fn main() {
20+
test::<u32, ()>();
21+
//~^ ERROR cannot satisfy `<u32 as Default>::Id == ()`
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
2+
--> $DIR/specialization-unconstrained.rs:3:12
3+
|
4+
LL | #![feature(specialization)]
5+
| ^^^^^^^^^^^^^^
6+
|
7+
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
8+
= help: consider using `min_specialization` instead, which is more stable and complete
9+
= note: `#[warn(incomplete_features)]` on by default
10+
11+
error[E0284]: type annotations needed: cannot satisfy `<u32 as Default>::Id == ()`
12+
--> $DIR/specialization-unconstrained.rs:20:5
13+
|
14+
LL | test::<u32, ()>();
15+
| ^^^^^^^^^^^^^^^ cannot satisfy `<u32 as Default>::Id == ()`
16+
|
17+
note: required by a bound in `test`
18+
--> $DIR/specialization-unconstrained.rs:17:20
19+
|
20+
LL | fn test<T: Default<Id = U>, U>() {}
21+
| ^^^^^^ required by this bound in `test`
22+
23+
error: aborting due to previous error; 1 warning emitted
24+
25+
For more information about this error, try `rustc --explain E0284`.

0 commit comments

Comments
 (0)