]> git.lizzy.rs Git - rust.git/blob - src/test/mir-opt/inline/inline_cycle.rs
Rollup merge of #103757 - ffmancera:ff/clarify_E0207, r=jackh726
[rust.git] / src / test / mir-opt / inline / inline_cycle.rs
1 // Check that inliner handles various forms of recursion and doesn't fall into
2 // an infinite inlining cycle. The particular outcome of inlining is not
3 // crucial otherwise.
4 //
5 // Regression test for issue #78573.
6
7 fn main() {
8     one();
9     two();
10 }
11
12 // EMIT_MIR inline_cycle.one.Inline.diff
13 fn one() {
14     <C as Call>::call();
15 }
16
17 pub trait Call {
18     fn call();
19 }
20
21 pub struct A<T>(T);
22 pub struct B<T>(T);
23 pub struct C;
24
25 impl<T: Call> Call for A<T> {
26     #[inline]
27     fn call() {
28         <B<T> as Call>::call()
29     }
30 }
31
32
33 impl<T: Call> Call for B<T> {
34     #[inline]
35     fn call() {
36         <T as Call>::call()
37     }
38 }
39
40 impl Call for C {
41     #[inline]
42     fn call() {
43         A::<C>::call()
44     }
45 }
46
47 // EMIT_MIR inline_cycle.two.Inline.diff
48 fn two() {
49     call(f);
50 }
51
52 #[inline]
53 fn call<F: FnOnce()>(f: F) {
54     f();
55 }
56
57 #[inline]
58 fn f() {
59     call(f);
60 }