]>
Commit | Line | Data |
---|---|---|
1 | //@ check-pass | |
2 | //@ aux-build: rpitit.rs | |
3 | ||
4 | #![feature(lint_reasons)] | |
5 | ||
6 | extern crate rpitit; | |
7 | ||
8 | use rpitit::{Foo, Foreign}; | |
9 | use std::sync::Arc; | |
10 | ||
11 | // Implement an RPITIT from another crate. | |
12 | pub struct Local; | |
13 | impl Foo for Local { | |
14 | #[expect(refining_impl_trait)] | |
15 | fn bar(self) -> Arc<String> { | |
16 | Arc::new(String::new()) | |
17 | } | |
18 | } | |
19 | ||
20 | struct LocalOnlyRefiningA; | |
21 | impl Foo for LocalOnlyRefiningA { | |
22 | #[warn(refining_impl_trait)] | |
23 | fn bar(self) -> Arc<String> { | |
24 | //~^ WARN impl method signature does not match trait method signature | |
25 | Arc::new(String::new()) | |
26 | } | |
27 | } | |
28 | ||
29 | struct LocalOnlyRefiningB; | |
30 | impl Foo for LocalOnlyRefiningB { | |
31 | #[warn(refining_impl_trait)] | |
32 | #[allow(refining_impl_trait_reachable)] | |
33 | fn bar(self) -> Arc<String> { | |
34 | //~^ WARN impl method signature does not match trait method signature | |
35 | Arc::new(String::new()) | |
36 | } | |
37 | } | |
38 | ||
39 | struct LocalOnlyRefiningC; | |
40 | impl Foo for LocalOnlyRefiningC { | |
41 | #[warn(refining_impl_trait)] | |
42 | #[allow(refining_impl_trait_internal)] | |
43 | fn bar(self) -> Arc<String> { | |
44 | Arc::new(String::new()) | |
45 | } | |
46 | } | |
47 | ||
48 | fn generic(f: impl Foo) { | |
49 | let x = &*f.bar(); | |
50 | } | |
51 | ||
52 | fn main() { | |
53 | // Witness an RPITIT from another crate. | |
54 | let &() = Foreign.bar(); | |
55 | ||
56 | let x: Arc<String> = Local.bar(); | |
57 | let x: Arc<String> = LocalOnlyRefiningA.bar(); | |
58 | let x: Arc<String> = LocalOnlyRefiningB.bar(); | |
59 | let x: Arc<String> = LocalOnlyRefiningC.bar(); | |
60 | } |