187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited -triple x86_64-apple-darwin %s -o - | FileCheck %s 23b10cfe6b804cef041ddf85854d2d536f7a82cb6Eric Christopher 3d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikiestruct MyClass { 4d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie template <int i> int add(int j) { 5d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie return i + j; 6d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie } 711fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie virtual void func() { 811fa7518cb2cf92db977ccc15f0db97307eac58cDavid Blaikie } 93b10cfe6b804cef041ddf85854d2d536f7a82cb6Eric Christopher}; 103b10cfe6b804cef041ddf85854d2d536f7a82cb6Eric Christopher 11d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikieint add2(int x) { 12d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie return MyClass().add<2>(x); 13d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie} 143b10cfe6b804cef041ddf85854d2d536f7a82cb6Eric Christopher 15d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikieinline int add3(int x) { 16d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie return MyClass().add<3>(x); // even though add<3> is ODR used, don't emit it since we don't codegen it 17d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie} 18d6d5d69f61fba69fdbc5aae72b88a5b367a210ecDavid Blaikie 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// The compile unit pulls in the global variables first. 204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: !DIGlobalVariable(name: "x", 214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: type: ![[OUTER_FOO_INNER_ID:[0-9]+]] 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: variable: %"struct.outer<foo>::inner"* @x 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: ![[OUTER_FOO_INNER_ID:[0-9]*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "inner"{{.*}}, identifier: 25b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo" 263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-SAME: elements: [[FOO_MEM:![0-9]*]] 273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-SAME: identifier: "_ZTS3foo" 280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[FOO_MEM]] = !{[[FOO_FUNC:![0-9]*]]} 29b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK: [[FOO_FUNC]] = !DISubprogram(name: "func", linkageName: "_ZN3foo4funcEN5outerIS_E5innerE", 303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-SAME: type: [[FOO_FUNC_TYPE:![0-9]*]] 31b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK: [[FOO_FUNC_TYPE]] = !DISubroutineType(types: [[FOO_FUNC_PARAMS:![0-9]*]]) 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[FOO_FUNC_PARAMS]] = !{null, !{{[0-9]*}}, ![[OUTER_FOO_INNER_ID]]} 330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[C:![0-9]*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "MyClass" 353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-SAME: elements: [[C_MEM:![0-9]*]] 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: vtableHolder: [[C]] 373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-SAME: identifier: "_ZTS7MyClass") 380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[C_MEM]] = !{[[C_VPTR:![0-9]*]], [[C_FUNC:![0-9]*]]} 39b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK: [[C_VPTR]] = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$MyClass" 4083369bf8f6244f20ae8bfa2fcb3a556f94da27deManman Ren 41b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK: [[C_FUNC]] = !DISubprogram(name: "func",{{.*}} line: 7, 42c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie 434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: !DISubprogram(name: "add<2>" 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: scope: [[C]] 454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[VIRT_TEMP:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "virt<elem>" 474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: elements: [[VIRT_MEM:![0-9]*]] 484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: vtableHolder: [[VIRT_TEMP]] 494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: templateParams: [[VIRT_TEMP_PARAM:![0-9]*]] 504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: identifier: "_ZTS4virtI4elemE" 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[ELEM:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "elem" 533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-SAME: elements: [[ELEM_MEM:![0-9]*]] 543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-SAME: identifier: "_ZTS4elem" 550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: [[ELEM_MEM]] = !{[[ELEM_X:![0-9]*]]} 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[ELEM_X]] = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: [[ELEM]] 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: baseType: [[VIRT_TEMP:![0-9]+]] 58c6d680003196028ed0a05e8da29ab269d6f79651Manman Ren 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[VIRT_TEMP_PARAM]] = !{[[VIRT_T:![0-9]*]]} 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[VIRT_T]] = !DITemplateTypeParameter(name: "T", type: [[ELEM]]) 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 62c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikietemplate<typename T> 63c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikiestruct outer { 64c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie struct inner { 65c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie int i; 66c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie }; 67c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie}; 68c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie 69c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikiestruct foo { 70c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie void func(outer<foo>::inner); 71c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie}; 72c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie 73c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikieinline void func() { 74c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // require 'foo' to be complete before the emission of 'inner' so that, when 75c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // constructing the context chain for 'x' we emit the full definition of 76c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie // 'foo', which requires the definition of 'inner' again 77c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie foo f; 78c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie} 79c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie 80c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikieouter<foo>::inner x; 81c138ff58683565a0b7f29fd28ac8577710aa5751David Blaikie 8274341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikietemplate <typename T> 8374341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikiestruct virt { 8474341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie T* values; 8574341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie virtual ~virt(); 8674341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie}; 8774341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikiestruct elem { 8874341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie static virt<elem> x; // ensure that completing 'elem' will require/completing 'virt<elem>' 8974341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie}; 9074341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikieinline void f1() { 9174341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie elem e; // ensure 'elem' is required to be complete when it is emitted as a template argument for 'virt<elem>' 9274341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie}; 9374341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikievoid f2() { 9474341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie virt<elem> d; // emit 'virt<elem>' 9574341d8fd49db382e83008ecea5c0d8ff9d8b6cbDavid Blaikie} 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Check that the member function template specialization and implicit special 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// members (the default ctor) refer to their class by scope, even though they 994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// didn't appear in the class's member list (C_MEM). This prevents the functions 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// from being added to type units, while still appearing in the type 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// declaration/reference in the compile unit. 1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: !DISubprogram(name: "MyClass" 1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-SAME: scope: [[C]] 104