[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaCXX / cxx0x-class.cpp
bloba612a5c07e6edf1145d5d826a26ec8c7675ec18a
1 // RUN: %clang_cc1 -Wno-uninitialized -fsyntax-only -verify -std=c++11 -Wno-error=static-float-init %s
3 int vs = 0;
5 class C {
6 public:
7 struct NestedC {
8 NestedC(int);
9 };
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 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}}
19 namespace rdar8367341 {
20 float foo(); // expected-note {{here}}
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'}}
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;
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;
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>;