p2-0x.cpp revision b4b1d69f19f32e8aeb2ce1e0239c6e20a7f9e952
11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// RUN: %clang_cc1 -verify -std=c++11 %s 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// Unlike in C++98, C++11 allows unions to have static data members. 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertunion U1 { 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static constexpr int k1 = 0; 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static const int k2 = k1; 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static int k3 = k2; // expected-error {{non-const static data member must be initialized out of line}} 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static constexpr double k4 = k2; 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static const double k5 = k4; // expected-error {{requires 'constexpr' specifier}} 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int n[k1 + 3]; 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}; 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertconstexpr int U1::k1; 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertconstexpr int U1::k2; 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertint U1::k3; 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertconst double U1::k4; 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertconst double U1::k5; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringerttemplate<typename T> 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertunion U2 { 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static const int k1; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static double k2; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert T t; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringerttemplate<typename T> constexpr int U2<T>::k1 = sizeof(U2<T>); 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringerttemplate<typename T> double U2<T>::k2 = 5.3; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertstatic_assert(U2<int>::k1 == sizeof(int), ""); 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertstatic_assert(U2<char>::k1 == sizeof(char), ""); 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertunion U3 { 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static const int k; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert U3() : k(0) {} // expected-error {{does not name a non-static data member}} 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}; 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertstruct S { 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert union { 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static const int n; // expected-error {{static members cannot be declared in an anonymous union}} 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int a; 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int b; 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}; 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertstatic union { 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static const int k; // expected-error {{static members cannot be declared in an anonymous union}} 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int n; 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}; 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert