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