]> git.lizzy.rs Git - rust.git/blob - src/test/ui/issues/issue-58344.rs
Require Drop impls to have the same constness on its bounds as the bounds on the...
[rust.git] / src / test / 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 }