blob: feab1d7090944502c65df6db545cdd77b0fe3656 [file] [log] [blame]
Douglas Katzman3459ce22015-10-08 04:24:12 +00001// RUN: %clang_cc1 -std=c++11 -debug-info-kind=standalone -emit-llvm -triple x86_64-apple-darwin %s -o %t
Adrian Prantlffcf4ba2013-05-09 23:16:27 +00002// RUN: cat %t | FileCheck %s -check-prefix=CHECK0
3// RUN: cat %t | FileCheck %s -check-prefix=CHECK1
4// RUN: cat %t | FileCheck %s -check-prefix=CHECK2
5//
6// This test ensures that we associate a declaration with the
7// definition of the constructor for OuterClass. The declaration is
8// necessary so the backend can emit the DW_AT_specification attribute
9// for the definition.
10//
11// rdar://problem/13116508
12
13class Foo;
14class OuterClass
15{
16 static class InnerClass {
17 public:
18 InnerClass(); // Here createContextChain() generates a limited type for OuterClass.
19 } theInnerClass;
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000020// CHECK0: ![[DECL:[0-9]+]] = !DISubprogram(name: "OuterClass"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000021// CHECK0-SAME: line: [[@LINE+2]]
22// CHECK0-SAME: isDefinition: false
Adrian Prantlffcf4ba2013-05-09 23:16:27 +000023 OuterClass(const Foo *); // line 10
24};
25OuterClass::InnerClass OuterClass::theInnerClass; // This toplevel decl causes InnerClass to be generated.
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000026// CHECK0: !DISubprogram(name: "OuterClass"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000027// CHECK0-SAME: line: [[@LINE+3]]
28// CHECK0-SAME: isDefinition: true
29// CHECK0-SAME: declaration: ![[DECL]]
Adrian Prantlffcf4ba2013-05-09 23:16:27 +000030OuterClass::OuterClass(const Foo *meta) { } // line 13
31
32
33
34
35
Duncan P. N. Exon Smith3c51fa62014-10-03 20:01:52 +000036
Adrian Prantlffcf4ba2013-05-09 23:16:27 +000037class Foo1;
38class OuterClass1
39{
40 static class InnerClass1 {
41 public:
42 InnerClass1();
43 } theInnerClass1;
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000044// CHECK1: ![[DECL:[0-9]+]] = !DISubprogram(name: "Bar"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000045// CHECK1-SAME: line: [[@LINE+2]]
46// CHECK1-SAME: isDefinition: false
Adrian Prantlffcf4ba2013-05-09 23:16:27 +000047 void Bar(const Foo1 *);
48};
49OuterClass1::InnerClass1 OuterClass1::theInnerClass1;
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000050// CHECK1: !DISubprogram(name: "Bar"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000051// CHECK1-SAME: line: [[@LINE+3]]
52// CHECK1-SAME: isDefinition: true
53// CHECK1-SAME: declaration: ![[DECL]]
Adrian Prantlffcf4ba2013-05-09 23:16:27 +000054void OuterClass1::Bar(const Foo1 *meta) { }
55
56
57
58
59
60class Foo2;
61class OuterClass2
62{
63 static class InnerClass2 {
64 public:
65 InnerClass2();
66 } theInnerClass2;
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000067// CHECK2: ![[DECL:[0-9]+]] = !DISubprogram(name: "~OuterClass2"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000068// CHECK2-SAME: line: [[@LINE+2]]
69// CHECK2-SAME: isDefinition: false
Adrian Prantlffcf4ba2013-05-09 23:16:27 +000070 ~OuterClass2(); // line 10
71};
72OuterClass2::InnerClass2 OuterClass2::theInnerClass2;
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000073// CHECK4: !DISubprogram(name: "~OuterClass2"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000074// CHECK4-SAME: line: [[@LINE+3]]
75// CHECK4-SAME: isDefinition: true
76// CHECK4-SAME: declaration: ![[DECL]]
Adrian Prantlffcf4ba2013-05-09 23:16:27 +000077OuterClass2::~OuterClass2() { }