1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only %s -Wall 2a5bf7f13d7772b164750997f95ab18487bbc4114Douglas Gregor 3a5bf7f13d7772b164750997f95ab18487bbc4114Douglas Gregortemplate <typename T> class A { struct { }; }; 4a5bf7f13d7772b164750997f95ab18487bbc4114Douglas Gregor 5a5bf7f13d7772b164750997f95ab18487bbc4114Douglas GregorA<int> a0; 6a5bf7f13d7772b164750997f95ab18487bbc4114Douglas Gregor 7d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlssontemplate <typename T> struct B { 8d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson union { 9d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson int a; 10d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson void* b; 11d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson }; 12d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 13d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson void f() { 14d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson a = 10; 15d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson b = 0; 16d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 17d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson}; 18d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 19d8b285fee4471f393da8ee30f552ceacdc362afaAnders CarlssonB<int> b0; 209988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson 219988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlssontemplate <typename T> struct C { 229988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson union { 239988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson int a; 249988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson void* b; 259988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson }; 269988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson 279988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson C(int a) : a(a) { } 289988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson C(void* b) : b(b) { } 299988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson}; 309988d5d9ad0850e455bd413b03ba7dc8ecee5999Anders Carlsson 31cdc83c777973fa56b6f828bfe88210290ca58d62Anders CarlssonC<int> c0(0); 329901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor 339901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregornamespace PR7088 { 349901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor template<typename T> 359901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor void f() { 369901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor union { 379901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor int a; 389901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor union { 399901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor float real; 409901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor T d; 419901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor }; 429901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor }; 439901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor 449901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor a = 17; 459901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor d = 3.14; 469901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor } 479901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor 489901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor template void f<double>(); 499901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor} 50030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth 51030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth// Check for problems related to PR7402 that occur when template instantiation 52030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth// instantiates implicit initializers. 53030ef472f31709e175895853fcb43d61d09022c7Chandler Carruthnamespace PR7402 { 54030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth struct X { 55030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth union { 56030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth struct { 57030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth int x; 58030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth int y; 59030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth }; 60030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth int v[2]; 61030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth }; 62030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth 63030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth // Check that this requirement survives instantiation. 64030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth template <typename T> X(const T& t) : x(t), y(t) {} 65030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth }; 66030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth 67030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth X x(42.0); 68030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth} 69f58483268995daef120529687813a6c5340ff09dDouglas Gregor 70f58483268995daef120529687813a6c5340ff09dDouglas Gregornamespace PR9188 { 71f58483268995daef120529687813a6c5340ff09dDouglas Gregor struct X0 { 72f58483268995daef120529687813a6c5340ff09dDouglas Gregor union { 73f58483268995daef120529687813a6c5340ff09dDouglas Gregor int member; 74f58483268995daef120529687813a6c5340ff09dDouglas Gregor }; 75f58483268995daef120529687813a6c5340ff09dDouglas Gregor }; 76f58483268995daef120529687813a6c5340ff09dDouglas Gregor 77f58483268995daef120529687813a6c5340ff09dDouglas Gregor static union { 78f58483268995daef120529687813a6c5340ff09dDouglas Gregor int global; 79f58483268995daef120529687813a6c5340ff09dDouglas Gregor }; 80f58483268995daef120529687813a6c5340ff09dDouglas Gregor 81f58483268995daef120529687813a6c5340ff09dDouglas Gregor struct X1 : X0 { 82f58483268995daef120529687813a6c5340ff09dDouglas Gregor template<typename T> 83f58483268995daef120529687813a6c5340ff09dDouglas Gregor int f() { 84f58483268995daef120529687813a6c5340ff09dDouglas Gregor return this->X0::member + PR9188::global; 85f58483268995daef120529687813a6c5340ff09dDouglas Gregor } 86f58483268995daef120529687813a6c5340ff09dDouglas Gregor }; 87f58483268995daef120529687813a6c5340ff09dDouglas Gregor 88f58483268995daef120529687813a6c5340ff09dDouglas Gregor template int X1::f<int>(); 89f58483268995daef120529687813a6c5340ff09dDouglas Gregor} 90