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
10volatile int sideeffect = 0;
11void __attribute__((noinline)) stop() { sideeffect++; }
12
13struct string {
14 string() {}
15 string(int i) : i(i) {}
16 ~string() {}
17 int i = 0;
18};
19string __attribute__((noinline)) get_string() {
20 string unused;
21 string result = 3;
22 // DEBUGGER: break 23
23 stop();
24 return result;
25}
26void some_function(int) {}
27struct string2 {
28 string2() = default;
29 string2(string2 &&other) { i = other.i; }
30 int i;
31};
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}
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

source code of cross-project-tests/debuginfo-tests/llgdb-tests/nrvo-string.cpp