about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThe 8472 <git@infinite-source.de>2024-03-15 22:25:00 +0100
committerThe 8472 <git@infinite-source.de>2024-03-17 14:58:22 +0100
commitfefd06dc02eea5c5bd96aedce17a5e58c8645f9a (patch)
tree4d0131e4da92e7b01107cedf0aa100b9ca098d90
parent3cbb93223f33024db464a4df27a13c7cce870173 (diff)
downloadrust-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.rs46
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;
+}