xref: /llvm-project/clang/test/CodeGenCXX/debug-info-composite-cc.cpp (revision 69fce12c38ff605b2c65747746e4c635a9fac900)
16c5f03a1SAdrian Prantl // RUN: %clang_cc1 -emit-llvm -debug-info-kind=standalone -triple %itanium_abi_triple %s -o - | FileCheck %s
26c5f03a1SAdrian Prantl 
36c5f03a1SAdrian Prantl // Not trivially copyable because of the explicit destructor.
46c5f03a1SAdrian Prantl // CHECK-DAG: !DICompositeType({{.*}}, name: "RefDtor",{{.*}}flags: DIFlagTypePassByReference
56c5f03a1SAdrian Prantl struct RefDtor {
66c5f03a1SAdrian Prantl   int i;
~RefDtorRefDtor76c5f03a1SAdrian Prantl   ~RefDtor() {}
86c5f03a1SAdrian Prantl } refDtor;
96c5f03a1SAdrian Prantl 
106c5f03a1SAdrian Prantl // Not trivially copyable because of the explicit copy constructor.
116c5f03a1SAdrian Prantl // CHECK-DAG: !DICompositeType({{.*}}, name: "RefCopy",{{.*}}flags: DIFlagTypePassByReference
126c5f03a1SAdrian Prantl struct RefCopy {
136c5f03a1SAdrian Prantl   int i;
146c5f03a1SAdrian Prantl   RefCopy() = default;
RefCopyRefCopy156c5f03a1SAdrian Prantl   RefCopy(RefCopy &Copy) {}
166c5f03a1SAdrian Prantl } refCopy;
176c5f03a1SAdrian Prantl 
186c5f03a1SAdrian Prantl // POD-like type even though it defines a destructor.
196c5f03a1SAdrian Prantl // CHECK-DAG: !DICompositeType({{.*}}, name: "Podlike", {{.*}}flags: DIFlagTypePassByValue
206c5f03a1SAdrian Prantl struct Podlike {
216c5f03a1SAdrian Prantl   int i;
226c5f03a1SAdrian Prantl   Podlike() = default;
236c5f03a1SAdrian Prantl   Podlike(Podlike &&Move) = default;
246c5f03a1SAdrian Prantl   ~Podlike() = default;
256c5f03a1SAdrian Prantl } podlike;
266c5f03a1SAdrian Prantl 
276c5f03a1SAdrian Prantl 
286c5f03a1SAdrian Prantl // This is a POD type.
296c5f03a1SAdrian Prantl // CHECK-DAG: !DICompositeType({{.*}}, name: "Pod",{{.*}}flags: DIFlagTypePassByValue
306c5f03a1SAdrian Prantl struct Pod {
316c5f03a1SAdrian Prantl   int i;
326c5f03a1SAdrian Prantl } pod;
336c5f03a1SAdrian Prantl 
346c5f03a1SAdrian Prantl // This is definitely not a POD type.
356c5f03a1SAdrian Prantl // CHECK-DAG: !DICompositeType({{.*}}, name: "Complex",{{.*}}flags: DIFlagTypePassByReference
366c5f03a1SAdrian Prantl struct Complex {
ComplexComplex376c5f03a1SAdrian Prantl   Complex() {}
ComplexComplex386c5f03a1SAdrian Prantl   Complex(Complex &Copy) : i(Copy.i) {};
396c5f03a1SAdrian Prantl   int i;
406c5f03a1SAdrian Prantl } complex;
41*69fce12cSAdrian Prantl 
42*69fce12cSAdrian Prantl // This type is manually marked as trivial_abi.
43*69fce12cSAdrian Prantl // CHECK-DAG: !DICompositeType({{.*}}, name: "Marked",{{.*}}flags: DIFlagTypePassByValue
44*69fce12cSAdrian Prantl struct __attribute__((trivial_abi)) Marked {
45*69fce12cSAdrian Prantl   int *p;
46*69fce12cSAdrian Prantl   Marked();
47*69fce12cSAdrian Prantl   ~Marked();
48*69fce12cSAdrian Prantl   Marked(const Marked &) noexcept;
49*69fce12cSAdrian Prantl   Marked &operator=(const Marked &);
50*69fce12cSAdrian Prantl } marked;
51