1 | // RUN: %clang_cc1 -fsyntax-only %s -Wall |
2 | |
3 | template <typename T> class A { struct { }; }; |
4 | |
5 | A<int> a0; |
6 | |
7 | template <typename T> struct B { |
8 | union { |
9 | int a; |
10 | void* b; |
11 | }; |
12 | |
13 | void f() { |
14 | a = 10; |
15 | b = 0; |
16 | } |
17 | }; |
18 | |
19 | B<int> b0; |
20 | |
21 | template <typename T> struct C { |
22 | union { |
23 | int a; |
24 | void* b; |
25 | }; |
26 | |
27 | C(int a) : a(a) { } |
28 | C(void* b) : b(b) { } |
29 | }; |
30 | |
31 | C<int> c0(0); |
32 | |
33 | namespace PR7088 { |
34 | template<typename T> |
35 | void f() { |
36 | union { |
37 | int a; |
38 | union { |
39 | float real; |
40 | T d; |
41 | }; |
42 | }; |
43 | |
44 | a = 17; |
45 | d = 3.14; |
46 | } |
47 | |
48 | template void f<double>(); |
49 | } |
50 | |
51 | // Check for problems related to PR7402 that occur when template instantiation |
52 | // instantiates implicit initializers. |
53 | namespace PR7402 { |
54 | struct X { |
55 | union { |
56 | struct { |
57 | int x; |
58 | int y; |
59 | }; |
60 | int v[2]; |
61 | }; |
62 | |
63 | // Check that this requirement survives instantiation. |
64 | template <typename T> X(const T& t) : x(t), y(t) {} |
65 | }; |
66 | |
67 | X x(42.0); |
68 | } |
69 | |
70 | namespace PR9188 { |
71 | struct X0 { |
72 | union { |
73 | int member; |
74 | }; |
75 | }; |
76 | |
77 | static union { |
78 | int global; |
79 | }; |
80 | |
81 | struct X1 : X0 { |
82 | template<typename T> |
83 | int f() { |
84 | return this->X0::member + PR9188::global; |
85 | } |
86 | }; |
87 | |
88 | template int X1::f<int>(); |
89 | } |
90 | |