diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:03 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:03 +0000 |
commit | 64d98f8ee037282c35007b64c2649055c56af1db (patch) | |
tree | 5492bcf97fce41ee1c0b1cc2add283f3e66cdab0 /tests/ui/mir/mir_codegen_critical_edge.rs | |
parent | Adding debian version 1.67.1+dfsg1-1. (diff) | |
download | rustc-64d98f8ee037282c35007b64c2649055c56af1db.tar.xz rustc-64d98f8ee037282c35007b64c2649055c56af1db.zip |
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/mir/mir_codegen_critical_edge.rs')
-rw-r--r-- | tests/ui/mir/mir_codegen_critical_edge.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/ui/mir/mir_codegen_critical_edge.rs b/tests/ui/mir/mir_codegen_critical_edge.rs new file mode 100644 index 000000000..5c1f1c3b7 --- /dev/null +++ b/tests/ui/mir/mir_codegen_critical_edge.rs @@ -0,0 +1,44 @@ +// run-pass +#![allow(dead_code)] +// This code produces a CFG with critical edges that, if we don't +// handle properly, will cause invalid codegen. + +#![feature(rustc_attrs)] + +enum State { + Both, + Front, + Back +} + +pub struct Foo<A: Iterator, B: Iterator> { + state: State, + a: A, + b: B +} + +impl<A, B> Foo<A, B> +where A: Iterator, B: Iterator<Item=A::Item> +{ + // This is the function we care about + fn next(&mut self) -> Option<A::Item> { + match self.state { + State::Both => match self.a.next() { + elt @ Some(..) => elt, + None => { + self.state = State::Back; + self.b.next() + } + }, + State::Front => self.a.next(), + State::Back => self.b.next(), + } + } +} + +// Make sure we actually codegen a version of the function +pub fn do_stuff(mut f: Foo<Box<dyn Iterator<Item=u32>>, Box<dyn Iterator<Item=u32>>>) { + let _x = f.next(); +} + +fn main() {} |