2024-03-20 07:00:12 +00:00
|
|
|
LL| |#![feature(coverage_attribute)]
|
|
|
|
LL| |//@ edition: 2021
|
2024-03-20 07:17:23 +00:00
|
|
|
LL| |
|
2024-03-20 07:00:12 +00:00
|
|
|
LL| |// Regression test for <https://github.com/rust-lang/rust/issues/122738>.
|
|
|
|
LL| |// These code patterns should not trigger an ICE when allocating a physical
|
|
|
|
LL| |// counter to a node and also one of its in-edges, because that is allowed
|
|
|
|
LL| |// when the node contains a tight loop to itself.
|
|
|
|
LL| |
|
|
|
|
LL| 1|fn loopy(cond: bool) {
|
|
|
|
LL| 1| let true = cond else { loop {} };
|
|
|
|
^0
|
|
|
|
LL| 1|}
|
|
|
|
LL| |
|
|
|
|
LL| |// Variant that also has `loop {}` on the success path.
|
|
|
|
LL| |// This isn't needed to catch the original ICE, but might help detect regressions.
|
|
|
|
LL| 0|fn _loop_either_way(cond: bool) {
|
|
|
|
LL| 0| let true = cond else { loop {} };
|
|
|
|
LL| 0| loop {}
|
|
|
|
LL| |}
|
|
|
|
LL| |
|
|
|
|
LL| |// Variant using regular `if` instead of let-else.
|
|
|
|
LL| |// This doesn't trigger the original ICE, but might help detect regressions.
|
|
|
|
LL| 0|fn _if(cond: bool) {
|
|
|
|
LL| 0| if cond {
|
|
|
|
LL| 0| loop {}
|
|
|
|
LL| | } else {
|
|
|
|
LL| 0| loop {}
|
|
|
|
LL| | }
|
|
|
|
LL| |}
|
|
|
|
LL| |
|
|
|
|
LL| |#[coverage(off)]
|
|
|
|
LL| |fn main() {
|
|
|
|
LL| | loopy(true);
|
|
|
|
LL| |}
|
|
|
|
|