1// RUN: %clang_cc1 -std=c++11 -debug-info-kind=standalone -emit-llvm -triple x86_64-apple-darwin %s -o %t
2// 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;
20// CHECK0: ![[DECL:[0-9]+]] = !DISubprogram(name: "OuterClass"
21// CHECK0-SAME: line: [[@LINE+2]]
22// CHECK0-SAME: isDefinition: false
23  OuterClass(const Foo *); // line 10
24};
25OuterClass::InnerClass OuterClass::theInnerClass; // This toplevel decl causes InnerClass to be generated.
26// CHECK0: !DISubprogram(name: "OuterClass"
27// CHECK0-SAME: line: [[@LINE+3]]
28// CHECK0-SAME: isDefinition: true
29// CHECK0-SAME: declaration: ![[DECL]]
30OuterClass::OuterClass(const Foo *meta) { } // line 13
31
32
33
34
35
36
37class Foo1;
38class OuterClass1
39{
40  static class InnerClass1 {
41  public:
42    InnerClass1();
43  } theInnerClass1;
44// CHECK1: ![[DECL:[0-9]+]] = !DISubprogram(name: "Bar"
45// CHECK1-SAME: line: [[@LINE+2]]
46// CHECK1-SAME: isDefinition: false
47  void Bar(const Foo1 *);
48};
49OuterClass1::InnerClass1 OuterClass1::theInnerClass1;
50// CHECK1: !DISubprogram(name: "Bar"
51// CHECK1-SAME: line: [[@LINE+3]]
52// CHECK1-SAME: isDefinition: true
53// CHECK1-SAME: declaration: ![[DECL]]
54void 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;
67// CHECK2: ![[DECL:[0-9]+]] = !DISubprogram(name: "~OuterClass2"
68// CHECK2-SAME: line: [[@LINE+2]]
69// CHECK2-SAME: isDefinition: false
70  ~OuterClass2(); // line 10
71};
72OuterClass2::InnerClass2 OuterClass2::theInnerClass2;
73// CHECK4: !DISubprogram(name: "~OuterClass2"
74// CHECK4-SAME: line: [[@LINE+3]]
75// CHECK4-SAME: isDefinition: true
76// CHECK4-SAME: declaration: ![[DECL]]
77OuterClass2::~OuterClass2() { }
78