| // skip-filecheck |
| //@ compile-flags: -C debuginfo=full |
| // EMIT_MIR_FOR_EACH_PANIC_STRATEGY |
| // Check that inliner handles various forms of recursion and doesn't fall into |
| // an infinite inlining cycle. The particular outcome of inlining is not |
| // crucial otherwise. |
| // |
| // Regression test for issue #78573. |
| |
| fn main() { |
| one(); |
| two(); |
| } |
| |
| // EMIT_MIR inline_cycle.one.Inline.diff |
| fn one() { |
| <C as Call>::call(); |
| } |
| |
| pub trait Call { |
| fn call(); |
| } |
| |
| pub struct A<T>(T); |
| pub struct B<T>(T); |
| pub struct C; |
| |
| impl<T: Call> Call for A<T> { |
| #[inline] |
| fn call() { |
| <B<T> as Call>::call() |
| } |
| } |
| |
| impl<T: Call> Call for B<T> { |
| #[inline] |
| fn call() { |
| <T as Call>::call() |
| } |
| } |
| |
| impl Call for C { |
| #[inline] |
| fn call() { |
| A::<C>::call() |
| } |
| } |
| |
| // EMIT_MIR inline_cycle.two.Inline.diff |
| fn two() { |
| call(f); |
| } |
| |
| #[inline] |
| fn call<F: FnOnce()>(f: F) { |
| f(); |
| } |
| |
| #[inline] |
| fn f() { |
| call(f); |
| } |