xref: /llvm-project/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp (revision d8a1a559f3009a31c517f864156db91d2ae3012c)
1 // RUN: %clang_cc1 -debug-info-kind=constructor -emit-llvm %s -o - | FileCheck %s
2 // RUN: %clang_cc1 -debug-info-kind=constructor -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM %s
3 
4 // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "A"{{.*}}DIFlagTypePassByValue
5 struct A {
6 } TestA;
7 
8 // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "B"{{.*}}flags: DIFlagFwdDecl
9 struct B {
10   B();
11 } TestB;
12 
13 // CHECK-DAG: ![[C:[0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "C"{{.*}}DIFlagTypePassByValue
14 struct C {
CC15   C() {}
16 } TestC;
17 
18 // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "D"{{.*}}DIFlagTypePassByValue
19 struct D {
20   D();
21 };
D()22 D::D() {}
23 
24 // Test for constexpr constructor.
25 // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "E"{{.*}}DIFlagTypePassByValue
26 struct E {
EE27   constexpr E(){};
28 } TestE;
29 
30 // Test for trivial constructor.
31 // CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "F"{{.*}}DIFlagTypePassByValue
32 struct F {
33   F() = default;
FF34   F(int) {}
35   int i;
36 } TestF;
37 
38 // Test for trivial constructor.
39 // CHECK-DAG: ![[G:.*]] ={{.*}}!DICompositeType({{.*}}name: "G"{{.*}}DIFlagTypePassByValue
40 // CHECK-DAG: !DICompositeType({{.*}}scope: ![[G]], {{.*}}DIFlagTypePassByValue
41 struct G {
GG42   G() : g_(0) {}
43   struct {
44     int g_;
45   };
46 } TestG;
47 
48 // Test for an aggregate class with an implicit non-trivial default constructor
49 // that is not instantiated.
50 // CHECK-DAG: !DICompositeType({{.*}}name: "H",{{.*}}DIFlagTypePassByValue
51 struct H {
52   B b;
53 };
f(H h)54 void f(H h) {}
55 
56 // Test for an aggregate class with an implicit non-trivial default constructor
57 // that is instantiated.
58 // CHECK-DAG: !DICompositeType({{.*}}name: "J",{{.*}}DIFlagTypePassByValue
59 struct J {
60   B b;
61 };
f(decltype(J ()) j)62 void f(decltype(J()) j) {}
63 
64 // Test for a class with trivial default constructor that is not instantiated.
65 // CHECK-DAG: !DICompositeType({{.*}}name: "K",{{.*}}DIFlagTypePassByValue
66 class K {
67   int i;
68 };
f(K k)69 void f(K k) {}
70 
71 // CHECK-DAG: !DICompositeType({{.*}}name: "DeletedCtors",{{.*}}DIFlagTypePassBy
72 struct NonTrivial {
73   NonTrivial();
74 };
75 struct DeletedCtors {
76   DeletedCtors() = delete;
77   DeletedCtors(const DeletedCtors &) = default;
78   void f1();
79   NonTrivial t;
80 };
81 
f(const DeletedCtors & D)82 const NonTrivial &f(const DeletedCtors &D) {
83   return D.t;
84 }
85 
86 // Test that we don't use constructor homing on lambdas.
87 // CHECK-DAG: ![[L:.*]] ={{.*}}!DISubprogram({{.*}}name: "L"
88 // CHECK-DAG: !DICompositeType({{.*}}scope: ![[L]], {{.*}}DIFlagTypePassByValue
L()89 void L() {
90   auto func = [&]() {};
91 }
92 
93 // Check that types are being added to retained types list.
94 // CHECK-DAG: !DICompileUnit{{.*}}retainedTypes: ![[RETAINED:[0-9]+]]
95 // CHECK-DAG: ![[RETAINED]] = {{.*}}![[C]]
96 
97 
98 struct VTableAndCtor {
99   virtual void f1();
100   VTableAndCtor();
101 };
102 
VTableAndCtor()103 VTableAndCtor::VTableAndCtor() {
104 }
105 
106 // ITANIUM-DAG: !DICompositeType({{.*}}name: "VTableAndCtor", {{.*}}flags: DIFlagFwdDecl
107 
108