about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBen Kimock <kimockb@gmail.com>2024-08-29 15:39:05 -0400
committerBen Kimock <kimockb@gmail.com>2024-08-29 16:20:08 -0400
commitc71ede368ce71888d8fa13708bd2cb4df9e840a3 (patch)
treebe9450f664e1dee3df990165ecaf613d0d0f4409
parent784d444733d65c3d305ce5edcbb41e3d0d0aee2e (diff)
downloadrust-c71ede368ce71888d8fa13708bd2cb4df9e840a3.tar.gz
rust-c71ede368ce71888d8fa13708bd2cb4df9e840a3.zip
Add a test for trait solver overflow in MIR inliner cycle detection
-rw-r--r--tests/mir-opt/inline/type_overflow.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/mir-opt/inline/type_overflow.rs b/tests/mir-opt/inline/type_overflow.rs
new file mode 100644
index 00000000000..bfd9e71b9e7
--- /dev/null
+++ b/tests/mir-opt/inline/type_overflow.rs
@@ -0,0 +1,32 @@
+// This is a regression test for one of the problems in #128887; it checks that the
+// strategy in #129714 avoids trait solver overflows in this specific case.
+
+// skip-filecheck
+//@ compile-flags: -Zinline-mir
+
+pub trait Foo {
+    type Associated;
+    type Chain: Foo<Associated = Self::Associated>;
+}
+
+trait FooExt {
+    fn do_ext() {}
+}
+impl<T: Foo<Associated = f64>> FooExt for T {}
+
+#[allow(unconditional_recursion)]
+fn recurse<T: Foo<Associated = f64>>() {
+    T::do_ext();
+    recurse::<T::Chain>();
+}
+
+macro_rules! emit {
+    ($($m:ident)*) => {$(
+        pub fn $m<T: Foo<Associated = f64>>() {
+            recurse::<T>();
+        }
+    )*}
+}
+
+// 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);