summaryrefslogtreecommitdiff
path: root/debuginfo-tests/llgdb-tests/nrvo-string.cpp
diff options
context:
space:
mode:
authorJeremy Morse <jeremy.morse@sony.com>2019-10-31 16:51:53 +0000
committerJeremy Morse <jeremy.morse@sony.com>2019-10-31 16:51:53 +0000
commit984fad243d179564df31c5f9531a52442e24581a (patch)
treeaba85a27f1596d456079f6f5eb69e09408730b49 /debuginfo-tests/llgdb-tests/nrvo-string.cpp
parent34f3c0fc44a5fd8a0f9186002749336e398837cf (diff)
downloadllvm-984fad243d179564df31c5f9531a52442e24581a.tar.gz
Reapply "Import Dexter to debuginfo-tests""
This reverts commit cb935f345683194e42e6e883d79c5a16479acd74. Discussion in D68708 advises that green dragon is being briskly refurbished, and it's good to have this patch up testing it.
Diffstat (limited to 'debuginfo-tests/llgdb-tests/nrvo-string.cpp')
-rw-r--r--debuginfo-tests/llgdb-tests/nrvo-string.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/debuginfo-tests/llgdb-tests/nrvo-string.cpp b/debuginfo-tests/llgdb-tests/nrvo-string.cpp
new file mode 100644
index 000000000000..ba8d9d42f6f4
--- /dev/null
+++ b/debuginfo-tests/llgdb-tests/nrvo-string.cpp
@@ -0,0 +1,52 @@
+// This ensures that DW_OP_deref is inserted when necessary, such as when NRVO
+// of a string object occurs in C++.
+//
+// RUN: %clangxx -O0 -fno-exceptions %target_itanium_abi_host_triple %s -o %t.out -g
+// RUN: %test_debuginfo %s %t.out
+// RUN: %clangxx -O1 -fno-exceptions %target_itanium_abi_host_triple %s -o %t.out -g
+// RUN: %test_debuginfo %s %t.out
+//
+// PR34513
+volatile int sideeffect = 0;
+void __attribute__((noinline)) stop() { sideeffect++; }
+
+struct string {
+ string() {}
+ string(int i) : i(i) {}
+ ~string() {}
+ int i = 0;
+};
+string get_string() {
+ string unused;
+ string result = 3;
+ // DEBUGGER: break 23
+ stop();
+ return result;
+}
+void some_function(int) {}
+struct string2 {
+ string2() = default;
+ string2(string2 &&other) { i = other.i; }
+ int i;
+};
+string2 get_string2() {
+ string2 result;
+ result.i = 5;
+ some_function(result.i);
+ // Test that the debugger can get the value of result after another
+ // function is called.
+ // DEBUGGER: break 39
+ stop();
+ return result;
+}
+int main() {
+ get_string();
+ get_string2();
+}
+
+// DEBUGGER: r
+// DEBUGGER: print result.i
+// CHECK: = 3
+// DEBUGGER: c
+// DEBUGGER: print result.i
+// CHECK: = 5