about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/test/ui/issues/issue-58344.rs50
-rw-r--r--src/test/ui/issues/issue-58344.stderr19
2 files changed, 69 insertions, 0 deletions
diff --git a/src/test/ui/issues/issue-58344.rs b/src/test/ui/issues/issue-58344.rs
new file mode 100644
index 00000000000..99b656d74f5
--- /dev/null
+++ b/src/test/ui/issues/issue-58344.rs
@@ -0,0 +1,50 @@
+use std::ops::Add;
+
+trait Trait<T> {
+    fn get(self) -> T;
+}
+
+struct Holder<T>(T);
+
+impl<T> Trait<T> for Holder<T> {
+    fn get(self) -> T {
+        self.0
+    }
+}
+
+enum Either<L, R> {
+    Left(L),
+    Right(R),
+}
+
+impl<L, R> Either<L, R> {
+    fn converge<T>(self) -> T where L: Trait<T>, R: Trait<T> {
+        match self {
+            Either::Left(val) => val.get(),
+            Either::Right(val) => val.get(),
+        }
+    }
+}
+
+fn add_generic<A: Add<B>, B>(lhs: A, rhs: B) -> Either<
+    impl Trait<<A as Add<B>>::Output>,
+    impl Trait<<A as Add<B>>::Output>
+> {
+    if true {
+        Either::Left(Holder(lhs + rhs))
+    } else {
+        Either::Right(Holder(lhs + rhs))
+    }
+}
+
+fn add_one(
+    value: u32,
+) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> {
+    //~^ ERROR: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait<u32>`
+    //~| ERROR: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait<u32>`
+    add_generic(value, 1u32)
+}
+
+pub fn main() {
+    add_one(3).converge();
+}
diff --git a/src/test/ui/issues/issue-58344.stderr b/src/test/ui/issues/issue-58344.stderr
new file mode 100644
index 00000000000..427d03b679d
--- /dev/null
+++ b/src/test/ui/issues/issue-58344.stderr
@@ -0,0 +1,19 @@
+error[E0277]: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait<u32>` is not satisfied
+  --> $DIR/issue-58344.rs:42:13
+   |
+LL | ) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> {
+   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait<u32>` is not implemented for `impl Trait<<u32 as std::ops::Add>::Output>`
+   |
+   = note: the return type of a function must have a statically known size
+
+error[E0277]: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait<u32>` is not satisfied
+  --> $DIR/issue-58344.rs:42:52
+   |
+LL | ) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> {
+   |                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait<u32>` is not implemented for `impl Trait<<u32 as std::ops::Add>::Output>`
+   |
+   = note: the return type of a function must have a statically known size
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0277`.