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