about summary refs log tree commit diff
path: root/tests/ui/impl-trait/non-defining-uses/avoid-inference-constraints-from-blanket.rs
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2025-09-12 14:28:42 +0000
committerbors <bors@rust-lang.org>2025-09-12 14:28:42 +0000
commita171994070dc18c3a32fc1aa2d98cf03ae96b63e (patch)
treef154c23ea33b4eced0f770a6c7caeb965c6a5c08 /tests/ui/impl-trait/non-defining-uses/avoid-inference-constraints-from-blanket.rs
parent408eacfb95ea19e248c0fe5e377980bc00682c1b (diff)
parentcf224ea1fbe2fb7eb64812288338a2c4cfe1d084 (diff)
downloadrust-a171994070dc18c3a32fc1aa2d98cf03ae96b63e.tar.gz
rust-a171994070dc18c3a32fc1aa2d98cf03ae96b63e.zip
Auto merge of #146329 - lcnr:opaque-type-infer-alias-candidates, r=BoxyUwU
consider item bounds for non-yet-defined opaque types

Based on rust-lang/rust#140405.

fixes https://github.com/rust-lang/trait-system-refactor-initiative/issues/182
fixes https://github.com/rust-lang/trait-system-refactor-initiative/issues/196
fixes https://github.com/rust-lang/trait-system-refactor-initiative/issues/205

there's some jank here, see https://github.com/rust-lang/trait-system-refactor-initiative/issues/229

## Design

If the self type is an inference variable which has been sub-unified with am opaque type, we need to incompletely guide inference to avoid breakage.

In this case, we
- look at the item bounds of all sub-unified opaque types, and
- blanket impls which do not constrain the self type

Even if there are applicable candidates, we always force their certainty to be `Maybe`, so they will always have to be reproven once we've constrained the inference variable.

This is a bit iffy, see the added tests.

r? `@BoxyUwU`
Diffstat (limited to 'tests/ui/impl-trait/non-defining-uses/avoid-inference-constraints-from-blanket.rs')
-rw-r--r--tests/ui/impl-trait/non-defining-uses/avoid-inference-constraints-from-blanket.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/tests/ui/impl-trait/non-defining-uses/avoid-inference-constraints-from-blanket.rs b/tests/ui/impl-trait/non-defining-uses/avoid-inference-constraints-from-blanket.rs
new file mode 100644
index 00000000000..bb3acfde5bc
--- /dev/null
+++ b/tests/ui/impl-trait/non-defining-uses/avoid-inference-constraints-from-blanket.rs
@@ -0,0 +1,25 @@
+//@ revisions: current next
+//@[next] compile-flags: -Znext-solver
+//@ ignore-compare-mode-next-solver (explicit revisions)
+//@ check-pass
+
+// Regression test for trait-system-refactor-initiative#205. Avoid constraining
+// the opaque type when applying blanket impls.
+
+trait Trait<T> {}
+
+impl<T> Trait<T> for T {}
+impl Trait<u32> for u64 {}
+
+fn impls_trait<T: Trait<U>, U>() -> T {
+    todo!()
+}
+
+fn foo() -> impl Sized {
+    if false {
+        // `opaque: Trait<u32>` shouldn't constrain `opaque` to `u32` via the blanket impl
+        return impls_trait::<_, u32>();
+    }
+    1u64
+}
+fn main() {}