xref: /llvm-project/cross-project-tests/debuginfo-tests/dexter-tests/nrvo-string.cpp (revision 45a40c163932d12b72b33bd1d8a84519392b5d39)
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 Henderson void __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 Henderson string __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 Henderson void 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 Henderson string2 __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 Henderson int 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