about summary refs log tree commit diff
path: root/tests/mir-opt/inline/polymorphic_recursion.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/mir-opt/inline/polymorphic_recursion.rs')
-rw-r--r--tests/mir-opt/inline/polymorphic_recursion.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/tests/mir-opt/inline/polymorphic_recursion.rs b/tests/mir-opt/inline/polymorphic_recursion.rs
new file mode 100644
index 00000000000..7388722b776
--- /dev/null
+++ b/tests/mir-opt/inline/polymorphic_recursion.rs
@@ -0,0 +1,25 @@
+// Make sure that the MIR inliner does not loop indefinitely on polymorphic recursion.
+// compile-flags: --crate-type lib
+
+// Randomize `def_path_hash` by defining them under a module with different names
+macro_rules! emit {
+    ($($m:ident)*) => {$(
+        pub mod $m {
+            pub trait Tr { type Next: Tr; }
+
+            pub fn hoge<const N: usize, T: Tr>() {
+                inner::<N, T>();
+            }
+
+            #[inline(always)]
+            fn inner<const N: usize, T: Tr>()
+            {
+                inner::<N, T::Next>();
+                inner::<N, T::Next>();
+            }
+        }
+    )*};
+}
+
+// Increase the chance of triggering the bug
+emit!(m00 m01 m02 m03 m04 m05 m06 m07 m08 m09 m10 m11 m12 m13 m14 m15 m16 m17 m18 m19);