about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2024-04-17 10:01:34 +0000
committerOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2024-05-23 16:02:20 +0000
commit7f292f41a0c6c5ebbc915d487dd49741f9982684 (patch)
tree4b3e75fcc076d282522716c57863b5b99f40371c
parent29a630eb72ffb94c3708947afae1e948ad3cb189 (diff)
downloadrust-7f292f41a0c6c5ebbc915d487dd49741f9982684.tar.gz
rust-7f292f41a0c6c5ebbc915d487dd49741f9982684.zip
Allow defining opaque types during trait object upcasting.
No stable code is affected, as this requires the `trait_upcasting` feature gate.
-rw-r--r--compiler/rustc_trait_selection/src/traits/select/mod.rs2
-rw-r--r--tests/ui/traits/trait-upcasting/upcast-defining-opaque.current.stderr17
-rw-r--r--tests/ui/traits/trait-upcasting/upcast-defining-opaque.rs4
3 files changed, 3 insertions, 20 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs
index 86a5d464b7b..ee4b81b046f 100644
--- a/compiler/rustc_trait_selection/src/traits/select/mod.rs
+++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs
@@ -2631,7 +2631,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
                     nested.extend(
                         self.infcx
                             .at(&obligation.cause, obligation.param_env)
-                            .eq(DefineOpaqueTypes::No, source_projection, target_projection)
+                            .eq(DefineOpaqueTypes::Yes, source_projection, target_projection)
                             .map_err(|_| SelectionError::Unimplemented)?
                             .into_obligations(),
                     );
diff --git a/tests/ui/traits/trait-upcasting/upcast-defining-opaque.current.stderr b/tests/ui/traits/trait-upcasting/upcast-defining-opaque.current.stderr
deleted file mode 100644
index a259abb28ae..00000000000
--- a/tests/ui/traits/trait-upcasting/upcast-defining-opaque.current.stderr
+++ /dev/null
@@ -1,17 +0,0 @@
-error[E0308]: mismatched types
-  --> $DIR/upcast-defining-opaque.rs:21:5
-   |
-LL | type Foo = impl Sized;
-   |            ---------- the found opaque type
-LL |
-LL | fn upcast(x: &dyn Sub<Assoc = Foo>) -> &dyn Super<Assoc = i32> {
-   |                                        ----------------------- expected `&dyn Super<Assoc = i32>` because of return type
-LL |     x
-   |     ^ expected trait `Super`, found trait `Sub`
-   |
-   = note: expected reference `&dyn Super<Assoc = i32>`
-              found reference `&dyn Sub<Assoc = Foo>`
-
-error: aborting due to 1 previous error
-
-For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/traits/trait-upcasting/upcast-defining-opaque.rs b/tests/ui/traits/trait-upcasting/upcast-defining-opaque.rs
index cb1501a94a2..07f1549e177 100644
--- a/tests/ui/traits/trait-upcasting/upcast-defining-opaque.rs
+++ b/tests/ui/traits/trait-upcasting/upcast-defining-opaque.rs
@@ -1,7 +1,7 @@
 //@ revisions: current next
 //@[next] compile-flags: -Znext-solver
 //@ ignore-compare-mode-next-solver (explicit revisions)
-//@[next] check-pass
+//@check-pass
 
 #![feature(trait_upcasting, type_alias_impl_trait)]
 
@@ -18,7 +18,7 @@ impl<T: ?Sized> Super for T {
 type Foo = impl Sized;
 
 fn upcast(x: &dyn Sub<Assoc = Foo>) -> &dyn Super<Assoc = i32> {
-    x //[current]~ mismatched types
+    x
 }
 
 fn main() {}