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