xref: /llvm-project/cross-project-tests/debuginfo-tests/llgdb-tests/nrvo-string.cpp (revision 5257efdc5b30212b62a9d68857dc8e66d0e1a863)
1 // This ensures that DW_OP_deref is inserted when necessary, such as when NRVO
2 // of a string object occurs in C++.
3 //
4 // RUN: %clangxx -O0 -fno-exceptions %target_itanium_abi_host_triple %s -o %t.out -g
5 // RUN: %test_debuginfo %s %t.out
6 // RUN: %clangxx -O1 -fno-exceptions %target_itanium_abi_host_triple %s -o %t.out -g
7 // RUN: %test_debuginfo %s %t.out
8 // XFAIL: !system-darwin && gdb-clang-incompatibility
9 // PR34513
10 volatile int sideeffect = 0;
stop()11 void __attribute__((noinline)) stop() { sideeffect++; }
12 
13 struct string {
stringstring14   string() {}
stringstring15   string(int i) : i(i) {}
~stringstring16   ~string() {}
17   int i = 0;
18 };
get_string()19 string __attribute__((noinline)) get_string() {
20   string unused;
21   string result = 3;
22   // DEBUGGER: break 23
23   stop();
24   return result;
25 }
some_function(int)26 void some_function(int) {}
27 struct string2 {
28   string2() = default;
string2string229   string2(string2 &&other) { i = other.i; }
30   int i;
31 };
get_string2()32 string2 __attribute__((noinline)) get_string2() {
33   string2 result;
34   result.i = 5;
35   some_function(result.i);
36   // Test that the debugger can get the value of result after another
37   // function is called.
38   // DEBUGGER: break 39
39   stop();
40   return result;
41 }
main()42 int main() {
43   get_string();
44   get_string2();
45 }
46 
47 // DEBUGGER: r
48 // DEBUGGER: print result.i
49 // CHECK:  = 3
50 // DEBUGGER: c
51 // DEBUGGER: print result.i
52 // CHECK:  = 5
53