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