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()11void __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()19string __attribute__((noinline)) get_string() { 20 string unused; 21 string result = 3; 22 // DEBUGGER: break 23 23 stop(); 24 return result; 25 } some_function(int)26void some_function(int) {} 27 struct string2 { 28 string2() = default; string2string229 string2(string2 &&other) { i = other.i; } 30 int i; 31 }; get_string2()32string2 __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()42int 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