diff options
| author | Ben Kimock <kimockb@gmail.com> | 2024-08-29 15:39:05 -0400 |
|---|---|---|
| committer | Ben Kimock <kimockb@gmail.com> | 2024-08-29 16:20:08 -0400 |
| commit | c71ede368ce71888d8fa13708bd2cb4df9e840a3 (patch) | |
| tree | be9450f664e1dee3df990165ecaf613d0d0f4409 | |
| parent | 784d444733d65c3d305ce5edcbb41e3d0d0aee2e (diff) | |
| download | rust-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.rs | 32 |
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); |
