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 // 9 // PR34513 10 volatile int sideeffect = 0; 11 void __attribute__((noinline)) stop() { sideeffect++; } 12 13 struct string { 14 string() {} 15 string(int i) : i(i) {} 16 ~string() {} 17 int i = 0; 18 }; 19 string __attribute__((noinline)) get_string() { 20 string unused; 21 string result = 3; 22 // DEBUGGER: break 23 23 stop(); 24 return result; 25 } 26 void some_function(int) {} 27 struct string2 { 28 string2() = default; 29 string2(string2 &&other) { i = other.i; } 30 int i; 31 }; 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 } 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