1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -debug-info-kind=standalone -emit-llvm -triple x86_64-apple-darwin %s -o %t 2*67e74705SXin Li // RUN: cat %t | FileCheck %s -check-prefix=CHECK0 3*67e74705SXin Li // RUN: cat %t | FileCheck %s -check-prefix=CHECK1 4*67e74705SXin Li // RUN: cat %t | FileCheck %s -check-prefix=CHECK2 5*67e74705SXin Li // 6*67e74705SXin Li // This test ensures that we associate a declaration with the 7*67e74705SXin Li // definition of the constructor for OuterClass. The declaration is 8*67e74705SXin Li // necessary so the backend can emit the DW_AT_specification attribute 9*67e74705SXin Li // for the definition. 10*67e74705SXin Li // 11*67e74705SXin Li // rdar://problem/13116508 12*67e74705SXin Li 13*67e74705SXin Li class Foo; 14*67e74705SXin Li class OuterClass 15*67e74705SXin Li { 16*67e74705SXin Li static class InnerClass { 17*67e74705SXin Li public: 18*67e74705SXin Li InnerClass(); // Here createContextChain() generates a limited type for OuterClass. 19*67e74705SXin Li } theInnerClass; 20*67e74705SXin Li // CHECK0: ![[DECL:[0-9]+]] = !DISubprogram(name: "OuterClass" 21*67e74705SXin Li // CHECK0-SAME: line: [[@LINE+2]] 22*67e74705SXin Li // CHECK0-SAME: isDefinition: false 23*67e74705SXin Li OuterClass(const Foo *); // line 10 24*67e74705SXin Li }; 25*67e74705SXin Li OuterClass::InnerClass OuterClass::theInnerClass; // This toplevel decl causes InnerClass to be generated. 26*67e74705SXin Li // CHECK0: !DISubprogram(name: "OuterClass" 27*67e74705SXin Li // CHECK0-SAME: line: [[@LINE+3]] 28*67e74705SXin Li // CHECK0-SAME: isDefinition: true 29*67e74705SXin Li // CHECK0-SAME: declaration: ![[DECL]] OuterClass(const Foo * meta)30*67e74705SXin LiOuterClass::OuterClass(const Foo *meta) { } // line 13 31*67e74705SXin Li 32*67e74705SXin Li 33*67e74705SXin Li 34*67e74705SXin Li 35*67e74705SXin Li 36*67e74705SXin Li 37*67e74705SXin Li class Foo1; 38*67e74705SXin Li class OuterClass1 39*67e74705SXin Li { 40*67e74705SXin Li static class InnerClass1 { 41*67e74705SXin Li public: 42*67e74705SXin Li InnerClass1(); 43*67e74705SXin Li } theInnerClass1; 44*67e74705SXin Li // CHECK1: ![[DECL:[0-9]+]] = !DISubprogram(name: "Bar" 45*67e74705SXin Li // CHECK1-SAME: line: [[@LINE+2]] 46*67e74705SXin Li // CHECK1-SAME: isDefinition: false 47*67e74705SXin Li void Bar(const Foo1 *); 48*67e74705SXin Li }; 49*67e74705SXin Li OuterClass1::InnerClass1 OuterClass1::theInnerClass1; 50*67e74705SXin Li // CHECK1: !DISubprogram(name: "Bar" 51*67e74705SXin Li // CHECK1-SAME: line: [[@LINE+3]] 52*67e74705SXin Li // CHECK1-SAME: isDefinition: true 53*67e74705SXin Li // CHECK1-SAME: declaration: ![[DECL]] Bar(const Foo1 * meta)54*67e74705SXin Livoid OuterClass1::Bar(const Foo1 *meta) { } 55*67e74705SXin Li 56*67e74705SXin Li 57*67e74705SXin Li 58*67e74705SXin Li 59*67e74705SXin Li 60*67e74705SXin Li class Foo2; 61*67e74705SXin Li class OuterClass2 62*67e74705SXin Li { 63*67e74705SXin Li static class InnerClass2 { 64*67e74705SXin Li public: 65*67e74705SXin Li InnerClass2(); 66*67e74705SXin Li } theInnerClass2; 67*67e74705SXin Li // CHECK2: ![[DECL:[0-9]+]] = !DISubprogram(name: "~OuterClass2" 68*67e74705SXin Li // CHECK2-SAME: line: [[@LINE+2]] 69*67e74705SXin Li // CHECK2-SAME: isDefinition: false 70*67e74705SXin Li ~OuterClass2(); // line 10 71*67e74705SXin Li }; 72*67e74705SXin Li OuterClass2::InnerClass2 OuterClass2::theInnerClass2; 73*67e74705SXin Li // CHECK4: !DISubprogram(name: "~OuterClass2" 74*67e74705SXin Li // CHECK4-SAME: line: [[@LINE+3]] 75*67e74705SXin Li // CHECK4-SAME: isDefinition: true 76*67e74705SXin Li // CHECK4-SAME: declaration: ![[DECL]] ~OuterClass2()77*67e74705SXin LiOuterClass2::~OuterClass2() { } 78