diff options
| author | The 8472 <git@infinite-source.de> | 2024-03-15 22:25:00 +0100 |
|---|---|---|
| committer | The 8472 <git@infinite-source.de> | 2024-03-17 14:58:22 +0100 |
| commit | fefd06dc02eea5c5bd96aedce17a5e58c8645f9a (patch) | |
| tree | 4d0131e4da92e7b01107cedf0aa100b9ca098d90 | |
| parent | 3cbb93223f33024db464a4df27a13c7cce870173 (diff) | |
| download | rust-fefd06dc02eea5c5bd96aedce17a5e58c8645f9a.tar.gz rust-fefd06dc02eea5c5bd96aedce17a5e58c8645f9a.zip | |
add test for #122301 to cover behavior that's on stable
if this ought to be broken it should at least happen intentionally
| -rw-r--r-- | tests/ui/consts/control-flow/dead_branches_dont_eval.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/ui/consts/control-flow/dead_branches_dont_eval.rs b/tests/ui/consts/control-flow/dead_branches_dont_eval.rs new file mode 100644 index 00000000000..374349732f9 --- /dev/null +++ b/tests/ui/consts/control-flow/dead_branches_dont_eval.rs @@ -0,0 +1,46 @@ +//@ build-pass + +// issue 122301 - currently the only way to supress +// const eval and codegen of code conditional on some other const + +struct Foo<T, const N: usize>(T); + +impl<T, const N: usize> Foo<T, N> { + const BAR: () = if N == 0 { + panic!() + }; +} + +struct Invoke<T, const N: usize>(T); + +impl<T, const N: usize> Invoke<T, N> { + const FUN: fn() = if N != 0 { + || Foo::<T, N>::BAR + } else { + || {} + }; +} + +// without closures + +struct S<T>(T); +impl<T> S<T> { + const C: () = panic!(); +} + +const fn bar<T>() { S::<T>::C } + +struct ConstIf<T, const N: usize>(T); + +impl<T, const N: usize> ConstIf<T, N> { + const VAL: () = if N != 0 { + bar::<T>() // not called for N == 0, and hence not monomorphized + } else { + () + }; +} + +fn main() { + let _val = Invoke::<(), 0>::FUN(); + let _val = ConstIf::<(), 0>::VAL; +} |
