summaryrefslogtreecommitdiffstats
path: root/src/test/debuginfo/generator-objects.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /src/test/debuginfo/generator-objects.rs
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/test/debuginfo/generator-objects.rs')
-rw-r--r--src/test/debuginfo/generator-objects.rs103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/test/debuginfo/generator-objects.rs b/src/test/debuginfo/generator-objects.rs
new file mode 100644
index 000000000..d6d7e5b44
--- /dev/null
+++ b/src/test/debuginfo/generator-objects.rs
@@ -0,0 +1,103 @@
+// Require a gdb that can read DW_TAG_variant_part.
+// min-gdb-version: 8.2
+
+// LLDB without native Rust support cannot read DW_TAG_variant_part,
+// so it prints nothing for generators. But those tests are kept to
+// ensure that LLDB won't crash at least (like #57822).
+
+// compile-flags:-g
+
+// === GDB TESTS ===================================================================================
+
+// gdb-command:run
+// gdb-command:print b
+// gdb-check:$1 = generator_objects::main::{generator_env#0}::Unresumed{_ref__a: 0x[...]}
+// gdb-command:continue
+// gdb-command:print b
+// gdb-check:$2 = generator_objects::main::{generator_env#0}::Suspend0{c: 6, d: 7, _ref__a: 0x[...]}
+// gdb-command:continue
+// gdb-command:print b
+// gdb-check:$3 = generator_objects::main::{generator_env#0}::Suspend1{c: 7, d: 8, _ref__a: 0x[...]}
+// gdb-command:continue
+// gdb-command:print b
+// gdb-check:$4 = generator_objects::main::{generator_env#0}::Returned{_ref__a: 0x[...]}
+
+// === LLDB TESTS ==================================================================================
+
+// lldb-command:run
+// lldb-command:print b
+// lldbg-check:(generator_objects::main::{generator_env#0}) $0 =
+// lldb-command:continue
+// lldb-command:print b
+// lldbg-check:(generator_objects::main::{generator_env#0}) $1 =
+// lldb-command:continue
+// lldb-command:print b
+// lldbg-check:(generator_objects::main::{generator_env#0}) $2 =
+// lldb-command:continue
+// lldb-command:print b
+// lldbg-check:(generator_objects::main::{generator_env#0}) $3 =
+
+// === CDB TESTS ===================================================================================
+
+// cdb-command: g
+// cdb-command: dx b
+// cdb-check: b : Unresumed [Type: enum$<generator_objects::main::generator_env$0>]
+// cdb-check: [variant] : Unresumed
+// cdb-check: [+0x[...]] _ref__a : 0x[...] : 5 [Type: int *]
+
+// cdb-command: g
+// cdb-command: dx b
+// cdb-check: b : Suspend0 [Type: enum$<generator_objects::main::generator_env$0>]
+// cdb-check: [variant] : Suspend0
+// cdb-check: [+0x[...]] c : 6 [Type: int]
+// cdb-check: [+0x[...]] d : 7 [Type: int]
+// cdb-check: [+0x[...]] _ref__a : 0x[...] : 5 [Type: int *]
+
+// cdb-command: g
+// cdb-command: dx b
+// cdb-check: b : Suspend1 [Type: enum$<generator_objects::main::generator_env$0>]
+// cdb-check: [variant] : Suspend1
+// cdb-check: [+0x[...]] c : 7 [Type: int]
+// cdb-check: [+0x[...]] d : 8 [Type: int]
+// cdb-check: [+0x[...]] _ref__a : 0x[...] : 6 [Type: int *]
+
+// cdb-command: g
+// cdb-command: dx b
+// cdb-check: b : Returned [Type: enum$<generator_objects::main::generator_env$0>]
+// cdb-check: [<Raw View>] [Type: enum$<generator_objects::main::generator_env$0>]
+// cdb-check: [variant] : Returned
+// cdb-check: [+0x[...]] _ref__a : 0x[...] : 6 [Type: int *]
+
+#![feature(omit_gdb_pretty_printer_section, generators, generator_trait)]
+#![omit_gdb_pretty_printer_section]
+
+use std::ops::Generator;
+use std::pin::Pin;
+
+fn main() {
+ let mut a = 5;
+ let mut b = || {
+ let mut c = 6;
+ let mut d = 7;
+
+ yield;
+ a += 1;
+ c += 1;
+ d += 1;
+
+ yield;
+ println!("{} {} {}", a, c, d);
+ };
+ _zzz(); // #break
+ Pin::new(&mut b).resume(());
+ _zzz(); // #break
+ Pin::new(&mut b).resume(());
+ _zzz(); // #break
+ Pin::new(&mut b).resume(());
+ _zzz(); // #break
+}
+
+#[inline(never)]
+fn _zzz() {
+ ()
+}