142973755SRichard Smith // RUN: %clang_cc1 -verify -std=c++11 %s 242973755SRichard Smith 342973755SRichard Smith // Unlike in C++98, C++11 allows unions to have static data members. 442973755SRichard Smith 542973755SRichard Smith union U1 { 642973755SRichard Smith static constexpr int k1 = 0; 742973755SRichard Smith static const int k2 = k1; 842973755SRichard Smith static int k3 = k2; // expected-error {{non-const static data member must be initialized out of line}} 942973755SRichard Smith static constexpr double k4 = k2; 108505c295SDavid Blaikie static const double k5 = k4; // expected-error {{requires 'constexpr' specifier}} expected-note {{add 'constexpr'}} 1142973755SRichard Smith int n[k1 + 3]; 1242973755SRichard Smith }; 1342973755SRichard Smith 1442973755SRichard Smith constexpr int U1::k1; 1542973755SRichard Smith constexpr int U1::k2; 1642973755SRichard Smith int U1::k3; 1742973755SRichard Smith 1842973755SRichard Smith const double U1::k4; 1942973755SRichard Smith const double U1::k5; 2042973755SRichard Smith 2142973755SRichard Smith template<typename T> 2242973755SRichard Smith union U2 { 2342973755SRichard Smith static const int k1; 2442973755SRichard Smith static double k2; 2542973755SRichard Smith T t; 2642973755SRichard Smith }; 2742973755SRichard Smith template<typename T> constexpr int U2<T>::k1 = sizeof(U2<T>); 2842973755SRichard Smith template<typename T> double U2<T>::k2 = 5.3; 2942973755SRichard Smith 3042973755SRichard Smith static_assert(U2<int>::k1 == sizeof(int), ""); 3142973755SRichard Smith static_assert(U2<char>::k1 == sizeof(char), ""); 3242973755SRichard Smith 3342973755SRichard Smith union U3 { 3442973755SRichard Smith static const int k; U3()3542973755SRichard Smith U3() : k(0) {} // expected-error {{does not name a non-static data member}} 3642973755SRichard Smith }; 374fa6aec9SRichard Smith 384fa6aec9SRichard Smith struct S { 394fa6aec9SRichard Smith union { 40*7ae1b4a0SRichard Smith static const int n; // expected-error {{static data member 'n' not allowed in anonymous union}} 414fa6aec9SRichard Smith int a; 424fa6aec9SRichard Smith int b; 434fa6aec9SRichard Smith }; 444fa6aec9SRichard Smith }; 454fa6aec9SRichard Smith static union { 46*7ae1b4a0SRichard Smith static const int k; // expected-error {{static data member 'k' not allowed in anonymous union}} 474fa6aec9SRichard Smith int n; 484fa6aec9SRichard Smith }; 49