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