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