]> git.proxmox.com Git - rustc.git/blob - tests/ui/issues/issue-58344.rs
New upstream version 1.68.2+dfsg1
[rustc.git] / tests / ui / issues / issue-58344.rs
1 // check-pass
2
3 use std::ops::Add;
4
5 trait Trait<T> {
6 fn get(self) -> T;
7 }
8
9 struct Holder<T>(T);
10
11 impl<T> Trait<T> for Holder<T> {
12 fn get(self) -> T {
13 self.0
14 }
15 }
16
17 enum Either<L, R> {
18 Left(L),
19 Right(R),
20 }
21
22 impl<L, R> Either<L, R> {
23 fn converge<T>(self) -> T
24 where
25 L: Trait<T>,
26 R: Trait<T>,
27 {
28 match self {
29 Either::Left(val) => val.get(),
30 Either::Right(val) => val.get(),
31 }
32 }
33 }
34
35 fn add_generic<A: Add<B>, B>(
36 lhs: A,
37 rhs: B,
38 ) -> Either<impl Trait<<A as Add<B>>::Output>, impl Trait<<A as Add<B>>::Output>> {
39 if true { Either::Left(Holder(lhs + rhs)) } else { Either::Right(Holder(lhs + rhs)) }
40 }
41
42 fn add_one(
43 value: u32,
44 ) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> {
45 add_generic(value, 1u32)
46 }
47
48 pub fn main() {
49 add_one(3).converge();
50 }