]> git.lizzy.rs Git - rust.git/blob - tests/mir-opt/inline/exponential_runtime.rs
Rollup merge of #106644 - alexcrichton:update-wasi-toolchain, r=cuviper
[rust.git] / tests / mir-opt / inline / exponential_runtime.rs
1 // Checks that code with exponential runtime does not have exponential behavior in inlining.
2
3 trait A {
4     fn call();
5 }
6
7 trait B {
8     fn call();
9 }
10 impl<T: A> B for T {
11     #[inline]
12     fn call() {
13         <T as A>::call();
14         <T as A>::call();
15         <T as A>::call();
16     }
17 }
18
19 trait C {
20     fn call();
21 }
22 impl<T: B> C for T {
23     #[inline]
24     fn call() {
25         <T as B>::call();
26         <T as B>::call();
27         <T as B>::call();
28     }
29 }
30
31 trait D {
32     fn call();
33 }
34 impl<T: C> D for T {
35     #[inline]
36     fn call() {
37         <T as C>::call();
38         <T as C>::call();
39         <T as C>::call();
40     }
41 }
42
43 trait E {
44     fn call();
45 }
46 impl<T: D> E for T {
47     #[inline]
48     fn call() {
49         <T as D>::call();
50         <T as D>::call();
51         <T as D>::call();
52     }
53 }
54
55 trait F {
56     fn call();
57 }
58 impl<T: E> F for T {
59     #[inline]
60     fn call() {
61         <T as E>::call();
62         <T as E>::call();
63         <T as E>::call();
64     }
65 }
66
67 trait G {
68     fn call();
69 }
70 impl<T: F> G for T {
71     #[inline]
72     fn call() {
73         <T as F>::call();
74         <T as F>::call();
75         <T as F>::call();
76     }
77 }
78
79 impl A for () {
80     #[inline(never)]
81     fn call() {}
82 }
83
84 // EMIT_MIR exponential_runtime.main.Inline.diff
85 fn main() {
86     <() as G>::call();
87 }