1 // RUN: %clang_cc1 -Wno-uninitialized -fsyntax-only -verify -std=c++11 -Wno-error=static-float-init %s
2 
3 int vs = 0;
4 
5 class C {
6 public:
7   struct NestedC {
8     NestedC(int);
9   };
10 
11   int i = 0;
12   static int si = 0; // expected-error {{non-const static data member must be initialized out of line}}
13   static const NestedC ci = 0; // expected-error {{static data member of type 'const C::NestedC' must be initialized out of line}}
14   static const int nci = vs; // expected-error {{in-class initializer for static data member is not a constant expression}}
15   static const int vi = 0;
16   static const volatile int cvi = 0; // expected-error {{static const volatile data member must be initialized out of line}}
17 };
18 
19 namespace rdar8367341 {
20   float foo(); // expected-note {{here}}
21 
22   struct A {
23     static const float x = 5.0f; // expected-warning {{requires 'constexpr'}} expected-note {{add 'constexpr'}}
24     static const float y = foo(); // expected-warning {{requires 'constexpr'}} expected-note {{add 'constexpr'}}
25     static constexpr float x2 = 5.0f;
26     static constexpr float y2 = foo(); // expected-error {{must be initialized by a constant expression}} expected-note {{non-constexpr function 'foo'}}
27   };
28 }
29 
30 
31 namespace Foo {
32   // Regression test -- forward declaration of Foo should not cause error about
33   // nonstatic data member.
34   class Foo;
35   class Foo {
36     int x;
37     int y = x;
38   };
39 }
40 
41 // Instantiating another default member initializer while parsing one should
42 // not cause us to mess up the 'this' override.
43 template<typename> struct DefaultMemberTemplate { int n = 0; };
44 class DefaultMemberInitSelf {
45   DefaultMemberTemplate<int> t = {};
46   int *p = &t.n;
47 };
48 
49 namespace composed_templates {
50   // Regression test -- obtaining the type from composed templates should not
51   // require out-of-line definition.
52   template <typename T> struct Zero { static const typename T::type value = 0; };
53   struct Integer { using type = int; };
54   template struct Zero<Integer>;
55 }
56