11364750dSJames Henderson // Purpose: 21364750dSJames Henderson // This ensures that DW_OP_deref is inserted when necessary, such as when 31364750dSJames Henderson // NRVO of a string object occurs in C++. 41364750dSJames Henderson // 5ac0f3297SOCHyams // REQUIRES: !asan, compiler-rt, lldb 61364750dSJames Henderson // UNSUPPORTED: system-windows 71364750dSJames Henderson // Zorg configures the ASAN stage2 bots to not build the asan 81364750dSJames Henderson // compiler-rt. Only run this test on non-asanified configurations. 91364750dSJames Henderson // 10*45a40c16SStephen Tozer // RUN: %clang -std=gnu++11 -O0 -glldb -fno-exceptions %s -o %t 111364750dSJames Henderson // RUN: %dexter --fail-lt 1.0 -w \ 12*45a40c16SStephen Tozer // RUN: --binary %t --debugger 'lldb' -- %s 131364750dSJames Henderson // 14*45a40c16SStephen Tozer // RUN: %clang -std=gnu++11 -O1 -glldb -fno-exceptions %s -o %t 151364750dSJames Henderson // RUN: %dexter --fail-lt 1.0 -w \ 16*45a40c16SStephen Tozer // RUN: --binary %t --debugger 'lldb' -- %s 171364750dSJames Henderson // 181364750dSJames Henderson // PR34513 191364750dSJames Henderson volatile int sideeffect = 0; stop()201364750dSJames Hendersonvoid __attribute__((noinline)) stop() { sideeffect++; } 211364750dSJames Henderson 221364750dSJames Henderson struct string { stringstring231364750dSJames Henderson string() {} stringstring241364750dSJames Henderson string(int i) : i(i) {} ~stringstring251364750dSJames Henderson ~string() {} 261364750dSJames Henderson int i = 0; 271364750dSJames Henderson }; get_string()281364750dSJames Hendersonstring __attribute__((noinline)) get_string() { 291364750dSJames Henderson string unused; 301364750dSJames Henderson string output = 3; 311364750dSJames Henderson stop(); // DexLabel('string-nrvo') 321364750dSJames Henderson return output; 331364750dSJames Henderson } some_function(int)341364750dSJames Hendersonvoid some_function(int) {} 351364750dSJames Henderson struct string2 { 361364750dSJames Henderson string2() = default; string2string2371364750dSJames Henderson string2(string2 &&other) { i = other.i; } 381364750dSJames Henderson int i; 391364750dSJames Henderson }; get_string2()401364750dSJames Hendersonstring2 __attribute__((noinline)) get_string2() { 411364750dSJames Henderson string2 output; 421364750dSJames Henderson output.i = 5; 431364750dSJames Henderson some_function(output.i); 441364750dSJames Henderson // Test that the debugger can get the value of output after another 451364750dSJames Henderson // function is called. 461364750dSJames Henderson stop(); // DexLabel('string2-nrvo') 471364750dSJames Henderson return output; 481364750dSJames Henderson } main()491364750dSJames Hendersonint main() { 501364750dSJames Henderson get_string(); 511364750dSJames Henderson get_string2(); 521364750dSJames Henderson } 531364750dSJames Henderson 541364750dSJames Henderson // DexExpectWatchValue('output.i', 3, on_line=ref('string-nrvo')) 551364750dSJames Henderson // DexExpectWatchValue('output.i', 5, on_line=ref('string2-nrvo')) 561364750dSJames Henderson 57