11364750dSJames Henderson // This ensures that DW_OP_deref is inserted when necessary, such as when NRVO 21364750dSJames Henderson // of a string object occurs in C++. 31364750dSJames Henderson // 41364750dSJames Henderson // RUN: %clangxx -O0 -fno-exceptions %target_itanium_abi_host_triple %s -o %t.out -g 51364750dSJames Henderson // RUN: %test_debuginfo %s %t.out 61364750dSJames Henderson // RUN: %clangxx -O1 -fno-exceptions %target_itanium_abi_host_triple %s -o %t.out -g 71364750dSJames Henderson // RUN: %test_debuginfo %s %t.out 8*5257efdcSOCHyams // XFAIL: !system-darwin && gdb-clang-incompatibility 91364750dSJames Henderson // PR34513 101364750dSJames Henderson volatile int sideeffect = 0; stop()111364750dSJames Hendersonvoid __attribute__((noinline)) stop() { sideeffect++; } 121364750dSJames Henderson 131364750dSJames Henderson struct string { stringstring141364750dSJames Henderson string() {} stringstring151364750dSJames Henderson string(int i) : i(i) {} ~stringstring161364750dSJames Henderson ~string() {} 171364750dSJames Henderson int i = 0; 181364750dSJames Henderson }; get_string()191364750dSJames Hendersonstring __attribute__((noinline)) get_string() { 201364750dSJames Henderson string unused; 211364750dSJames Henderson string result = 3; 221364750dSJames Henderson // DEBUGGER: break 23 231364750dSJames Henderson stop(); 241364750dSJames Henderson return result; 251364750dSJames Henderson } some_function(int)261364750dSJames Hendersonvoid some_function(int) {} 271364750dSJames Henderson struct string2 { 281364750dSJames Henderson string2() = default; string2string2291364750dSJames Henderson string2(string2 &&other) { i = other.i; } 301364750dSJames Henderson int i; 311364750dSJames Henderson }; get_string2()321364750dSJames Hendersonstring2 __attribute__((noinline)) get_string2() { 331364750dSJames Henderson string2 result; 341364750dSJames Henderson result.i = 5; 351364750dSJames Henderson some_function(result.i); 361364750dSJames Henderson // Test that the debugger can get the value of result after another 371364750dSJames Henderson // function is called. 381364750dSJames Henderson // DEBUGGER: break 39 391364750dSJames Henderson stop(); 401364750dSJames Henderson return result; 411364750dSJames Henderson } main()421364750dSJames Hendersonint main() { 431364750dSJames Henderson get_string(); 441364750dSJames Henderson get_string2(); 451364750dSJames Henderson } 461364750dSJames Henderson 471364750dSJames Henderson // DEBUGGER: r 481364750dSJames Henderson // DEBUGGER: print result.i 491364750dSJames Henderson // CHECK: = 3 501364750dSJames Henderson // DEBUGGER: c 511364750dSJames Henderson // DEBUGGER: print result.i 521364750dSJames Henderson // CHECK: = 5 53