1 // { dg-do compile { target c++11 } }
2 // { dg-skip-if "" { powerpc-ibm-aix* } { "*" } { "" } }
3 // { dg-options "-gpubnames -gdwarf-4 -fno-debug-types-section -dA" }
4 // { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubnames" 1 } }
5 // { dg-final { scan-assembler "\"\\(anonymous namespace\\)\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
6 // { dg-final { scan-assembler "\"one\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
7 // { dg-final { scan-assembler "\"one::G_A\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
8 // { dg-final { scan-assembler "\"one::G_B\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
9 // { dg-final { scan-assembler "\"one::G_C\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
10 // { dg-final { scan-assembler "\"one::\\(anonymous namespace\\)\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
11 // { dg-final { scan-assembler "\"two\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
12 // { dg-final { scan-assembler "\"F_A\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
13 // { dg-final { scan-assembler "\"F_B\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
14 // { dg-final { scan-assembler "\"F_C\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
15 // { dg-final { scan-assembler "\"inline_func_1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
16 // { dg-final { scan-assembler "\"one::c1::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
17 // { dg-final { scan-assembler "\"one::c1::~c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
18 // { dg-final { scan-assembler "\"one::c1::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
19 // { dg-final { scan-assembler "\"check_enum\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
20 // { dg-final { scan-assembler "\"main\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
21 // { dg-final { scan-assembler "\"two::c2<int>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
22 // { dg-final { scan-assembler "\"two::c2<double>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
23 // { dg-final { scan-assembler "\"two::c2<int const\\\*>::c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
24 // { dg-final { scan-assembler "\"check<one::c1>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
25 // { dg-final { scan-assembler "\"check<two::c2<int> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
26 // { dg-final { scan-assembler "\"check<two::c2<double> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
27 // { dg-final { scan-assembler "\"check<two::c2<int const\\\*> \\>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
28 // { dg-final { scan-assembler "\"two::c2<int>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
29 // { dg-final { scan-assembler "\"two::c2<double>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
30 // { dg-final { scan-assembler "\"two::c2<int const\\\*>::val\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
31 // { dg-final { scan-assembler "\"__static_initialization_and_destruction_0\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
32 // { dg-final { scan-assembler "\"two::c2<int>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
33 // { dg-final { scan-assembler "\"two::c2<double>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
34 // { dg-final { scan-assembler "\"two::c2<int const\\\*>::~c2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
35 // { dg-final { scan-assembler "\"anonymous_union_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
36 // { dg-final { scan-assembler "\"two::ci\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
37 // { dg-final { scan-assembler "\"two::c2v1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
38 // { dg-final { scan-assembler "\"two::c2v2\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
39 // { dg-final { scan-assembler "\"two::c2v3\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
40 // { dg-final { scan-assembler "\"one::c1v\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
41 // { dg-final { scan-assembler "\"one::\\(anonymous namespace\\)::one_anonymous_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
42 // { dg-final { scan-assembler "\"\\(anonymous namespace\\)::c1_count\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
43 // { dg-final { scan-assembler "\"\\(anonymous namespace\\)::c2_count\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
44 // { dg-final { scan-assembler "\"\\(anonymous namespace\\)::three\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
45 // { dg-final { scan-assembler "\"\\(anonymous namespace\\)::three::anonymous_three_var\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
46 // { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubtypes" 1 } }
47 // { dg-final { scan-assembler "\"one::G\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
48 // { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
49 // { dg-final { scan-assembler "\"int\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
50 // { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
51 // { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
52 // { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
53 // { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
54 // { dg-final { scan-assembler "\"double\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
55 // { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
56 // { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
57 // { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
58 // { dg-final { scan-assembler "\"F\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
59 // { dg-final { scan-assembler "\"anonymous_union_container\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
60 // { dg-final { scan-assembler "\"bool\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
61
62 namespace
63 {
64 int c1_count;
65 int c2_count;
66
67 namespace three
68 {
69 int anonymous_three_var;
70 }
71 };
72
73 namespace one
74 {
75
76 enum G
77 {
78 G_A,
79 G_B,
80 G_C
81 };
82
83 namespace {
84 int one_anonymous_var;
85 }
86
87 class c1
88 {
89 public:
90 static int count;
91
c1()92 c1()
93 { ++c1_count; }
94
~c1()95 ~c1()
96 {
97 --c1_count;
98 }
99
100 enum E
101 {
102 E_A,
103 E_B,
104 E_C,
105 };
106
107 int
val()108 val()
109 { return E_A; }
110 };
111
112 c1 c1v;
113 };
114
115 namespace two
116 {
117 const int ci = 3;
118
119 template <typename T>
120 class c2
121 {
122 public:
c2(T t)123 c2(T t)
124 : t_(t)
125 {
126 ++c2_count;
127 }
128
~c2()129 ~c2()
130 { --c2_count; }
131
132 T
val()133 val()
134 { return this->t_; }
135
136 T t_;
137 };
138
139 c2<int> c2v1(1);
140 c2<double> c2v2(2.0);
141 c2<int const*> c2v3(&ci);
142 };
143
144 enum F
145 {
146 F_A,
147 F_B,
148 F_C
149 };
150
151 template <class C>
152 bool
check(C * c)153 check(C* c)
154 { return c->val() == 0; }
155
156 bool
check_enum(int i)157 check_enum(int i)
158 { return i > 0; }
159
160 struct anonymous_union_container {
161 union {
162 struct astruct {
163 int a;
164 };
165 int b;
166 } u;
167 };
168
169 anonymous_union_container anonymous_union_var;
170
171 #ifdef __GNUC__
172 #define ALWAYS_INLINE __attribute__((always_inline))
173 #else
174 #define ALWAYS_INLINE
175 #endif
176
177 static inline ALWAYS_INLINE int
inline_func_1(int i)178 inline_func_1(int i)
179 { return i * 17; }
180
181 int
main()182 main()
183 {
184 F f = F_A;
185 one::G g = one::G_A;
186 check_enum(f);
187 check_enum(g);
188 check(&one::c1v);
189 check(&two::c2v1);
190 check(&two::c2v2);
191 check(&two::c2v3);
192 anonymous_union_var.u.b = inline_func_1(3) - 51;
193 return anonymous_union_var.u.b;
194 }
195