C++11 requires const objects to have a user-provided constructor, even for classes without any fields. DR 253 relaxes this to say "If the implicit default constructor initializes all subobjects, no initializer should be required." clang is currently the only compiler that implements this C++11 rule, and e.g. libstdc++ relies on something like DR 253 to compile in newer versions. This change makes it possible to build code that says `const vector<int> v;' again when using libstdc++5.2 and _GLIBCXX_DEBUG (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60284). Fixes PR23381. http://reviews.llvm.org/D16552 llvm-svn: 261297
38 lines
1.0 KiB
C++
38 lines
1.0 KiB
C++
// RUN: %clang_cc1 %s -Wno-uninitialized -std=c++11 -fsyntax-only -verify
|
|
|
|
struct A {
|
|
constexpr A() : a(b + 1), b(a + 1) {} // expected-note {{outside its lifetime}}
|
|
int a;
|
|
int b;
|
|
};
|
|
struct B {
|
|
A a;
|
|
};
|
|
|
|
constexpr A a; // ok, zero initialization precedes static initialization
|
|
void f() {
|
|
constexpr A a; // expected-error {{constant expression}} expected-note {{in call to 'A()'}}
|
|
}
|
|
|
|
constexpr B b1; // ok
|
|
constexpr B b2 = B(); // ok
|
|
static_assert(b2.a.a == 1, "");
|
|
static_assert(b2.a.b == 2, "");
|
|
|
|
struct C {
|
|
int c;
|
|
};
|
|
struct D : C { int d; };
|
|
constexpr C c1; // expected-error {{without a user-provided default constructor}}
|
|
constexpr C c2 = C(); // ok
|
|
constexpr D d1; // expected-error {{without a user-provided default constructor}}
|
|
constexpr D d2 = D(); // ok with DR1452
|
|
static_assert(D().c == 0, "");
|
|
static_assert(D().d == 0, "");
|
|
|
|
struct V : virtual C {};
|
|
template<typename T> struct Z : T {
|
|
constexpr Z() : V() {}
|
|
};
|
|
constexpr int n = Z<V>().c; // expected-error {{constant expression}} expected-note {{virtual base class}}
|