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