1// { dg-do compile }
2// { dg-options "--std=c++11 -dA -gdwarf-4 -fdebug-types-section -fno-merge-debug-strings" }
3
4// Check that -fdebug-types-sections does not copy a full referenced type
5// into a type unit.
6
7// Checks that at least one type unit is generated.
8//
9// { dg-final { scan-assembler "DIE \\(\[^\n\]*\\) DW_TAG_type_unit" } }
10//
11// Check that func is declared exactly once in the debug info (in the
12// compile unit).
13//
14// { dg-final { scan-assembler-times "\\.ascii \"func\\\\0\"\[^\n\]*DW_AT_name" 1 } }
15//
16// Check to make sure that no type unit contains a DIE with DW_AT_low_pc
17// or DW_AT_ranges.  These patterns assume that the compile unit is always
18// emitted after all type units.
19//
20// { dg-final { scan-assembler-not "\\.quad\[^\n\]*DW_AT_low_pc.*DIE \\(\[^\n\]*\\) DW_TAG_compile_unit" } }
21// { dg-final { scan-assembler-not "\\.quad\[^\n\]*DW_AT_ranges.*DIE \\(\[^\n\]*\\) DW_TAG_compile_unit" } }
22
23struct A {
24  A();
25  virtual ~A();
26  virtual void foo();
27 private:
28  int data;
29};
30
31struct B {
32  B();
33  virtual ~B();
34};
35
36extern B* table[];
37
38struct D {
39  template <typename T>
40  T* get(int i)
41  {
42    B*& cell = table[i];
43    if (cell == 0)
44      cell = new T();
45    return static_cast<T*>(cell);
46  }
47};
48
49void func(D* d)
50{
51  struct C : B {
52    A a;
53  };
54  d->get<C>(0)->a.foo();
55}
56