Rollup merge of #141352 - lcnr:no-builtin-preference, r=compiler-errors

builtin dyn impl no guide inference

cc https://github.com/rust-lang/rust/pull/141347

we can already slightly restrict this behavior in the old solver, so why not do so. Needs crater and an FCP.

r? `@compiler-errors`
This commit is contained in:
Jubilee 2025-06-13 20:59:15 -07:00 committed by GitHub
commit efc55fac53
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 62 additions and 1 deletions

View file

@ -1919,12 +1919,23 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
// impl `impl<T: ?Sized> Any for T { .. }`. This really shouldn't exist but is
// necessary due to #57893. We again arbitrarily prefer the applicable candidate
// with the lowest index.
//
// We do not want to use these impls to guide inference in case a user-written impl
// may also apply.
let object_bound = candidates
.iter()
.filter_map(|c| if let ObjectCandidate(i) = c.candidate { Some(i) } else { None })
.try_reduce(|c1, c2| if has_non_region_infer { None } else { Some(c1.min(c2)) });
match object_bound {
Some(Some(index)) => return Some(ObjectCandidate(index)),
Some(Some(index)) => {
return if has_non_region_infer
&& candidates.iter().any(|c| matches!(c.candidate, ImplCandidate(_)))
{
None
} else {
Some(ObjectCandidate(index))
};
}
Some(None) => {}
None => return None,
}

View file

@ -0,0 +1,16 @@
error[E0283]: type annotations needed
--> $DIR/no-incomplete-inference.rs:16:5
|
LL | impls_equals::<dyn Equals<u32>, _>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type of the type parameter `U` declared on the function `impls_equals`
|
= note: cannot satisfy `dyn Equals<u32>: Equals<_>`
note: required by a bound in `impls_equals`
--> $DIR/no-incomplete-inference.rs:13:20
|
LL | fn impls_equals<T: Equals<U> + ?Sized, U: ?Sized>() {}
| ^^^^^^^^^ required by this bound in `impls_equals`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0283`.

View file

@ -0,0 +1,16 @@
error[E0283]: type annotations needed
--> $DIR/no-incomplete-inference.rs:16:5
|
LL | impls_equals::<dyn Equals<u32>, _>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type of the type parameter `U` declared on the function `impls_equals`
|
= note: cannot satisfy `dyn Equals<u32>: Equals<_>`
note: required by a bound in `impls_equals`
--> $DIR/no-incomplete-inference.rs:13:20
|
LL | fn impls_equals<T: Equals<U> + ?Sized, U: ?Sized>() {}
| ^^^^^^^^^ required by this bound in `impls_equals`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0283`.

View file

@ -0,0 +1,18 @@
//@ revisions: current next
//@ ignore-compare-mode-next-solver (explicit revisions)
//@[next] compile-flags: -Znext-solver
// Make sure that having an applicable user-written
// and builtin impl is ambiguous.
trait Equals<T: ?Sized> {}
impl<T: ?Sized> Equals<T> for T {}
fn impls_equals<T: Equals<U> + ?Sized, U: ?Sized>() {}
fn main() {
impls_equals::<dyn Equals<u32>, _>();
//~^ ERROR type annotations needed
}