|  | // RUN: %clang_cc1 -verify -std=c++11 %s | 
|  |  | 
|  | // Unlike in C++98, C++11 allows unions to have static data members. | 
|  |  | 
|  | union U1 { | 
|  | static constexpr int k1 = 0; | 
|  | static const int k2 = k1; | 
|  | static int k3 = k2; // expected-error {{non-const static data member must be initialized out of line}} | 
|  | static constexpr double k4 = k2; | 
|  | static const double k5 = k4; // expected-error {{requires 'constexpr' specifier}} expected-note {{add 'constexpr'}} | 
|  | int n[k1 + 3]; | 
|  | }; | 
|  |  | 
|  | constexpr int U1::k1; | 
|  | constexpr int U1::k2; | 
|  | int U1::k3; | 
|  |  | 
|  | const double U1::k4; | 
|  | const double U1::k5; | 
|  |  | 
|  | template<typename T> | 
|  | union U2 { | 
|  | static const int k1; | 
|  | static double k2; | 
|  | T t; | 
|  | }; | 
|  | template<typename T> constexpr int U2<T>::k1 = sizeof(U2<T>); | 
|  | template<typename T> double U2<T>::k2 = 5.3; | 
|  |  | 
|  | static_assert(U2<int>::k1 == sizeof(int), ""); | 
|  | static_assert(U2<char>::k1 == sizeof(char), ""); | 
|  |  | 
|  | union U3 { | 
|  | static const int k; | 
|  | U3() : k(0) {} // expected-error {{does not name a non-static data member}} | 
|  | }; | 
|  |  | 
|  | struct S { | 
|  | union { | 
|  | static const int n; // expected-error {{static data member 'n' not allowed in anonymous union}} | 
|  | int a; | 
|  | int b; | 
|  | }; | 
|  | }; | 
|  | static union { | 
|  | static const int k; // expected-error {{static data member 'k' not allowed in anonymous union}} | 
|  | int n; | 
|  | }; |