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:
commit
efc55fac53
4 changed files with 62 additions and 1 deletions
|
|
@ -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,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
16
tests/ui/traits/object/no-incomplete-inference.next.stderr
Normal file
16
tests/ui/traits/object/no-incomplete-inference.next.stderr
Normal 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`.
|
||||
18
tests/ui/traits/object/no-incomplete-inference.rs
Normal file
18
tests/ui/traits/object/no-incomplete-inference.rs
Normal 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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue