C++20 isn't final quite yet, but all that remains is formalities, so let's go ahead and change all the references. I think for the next C++ standard we can just call it C++23 rather than C++2b, since the committee has been consistent about time-based releases rather than feature-based. gcc/c-family/ChangeLog 2020-05-13 Jason Merrill <jason@redhat.com> * c.opt (std=c++20): Make c++2a the alias. (std=gnu++20): Likewise. * c-common.h (cxx_dialect): Change cxx2a to cxx20. * c-opts.c: Adjust. * c-cppbuiltin.c: Adjust. * c-ubsan.c: Adjust. * c-warn.c: Adjust. gcc/cp/ChangeLog 2020-05-13 Jason Merrill <jason@redhat.com> * call.c, class.c, constexpr.c, constraint.cc, decl.c, init.c, lambda.c, lex.c, method.c, name-lookup.c, parser.c, pt.c, tree.c, typeck2.c: Change cxx2a to cxx20. libcpp/ChangeLog 2020-05-13 Jason Merrill <jason@redhat.com> * include/cpplib.h (enum c_lang): Change CXX2A to CXX20. * init.c, lex.c: Adjust.
62 lines
1.3 KiB
C
62 lines
1.3 KiB
C
// PR c++/91353 - P1331R2: Allow trivial default init in constexpr contexts.
|
|
// { dg-do compile { target c++20 } }
|
|
|
|
// This bullet in [dcl.constexpr] is now gone:
|
|
// - every non-static data member and base class sub-object shall be initialized
|
|
|
|
struct A {
|
|
int i;
|
|
constexpr A(int _i) { i = _i; }
|
|
};
|
|
|
|
struct B {
|
|
int i;
|
|
constexpr B() { }
|
|
};
|
|
|
|
// Anonymous members.
|
|
struct E {
|
|
int a;
|
|
union {
|
|
char b;
|
|
__extension__ struct {
|
|
double c;
|
|
long d;
|
|
};
|
|
union {
|
|
char e;
|
|
void *f;
|
|
};
|
|
};
|
|
__extension__ struct {
|
|
long long g;
|
|
__extension__ struct {
|
|
int h;
|
|
double i;
|
|
};
|
|
union {
|
|
char *j;
|
|
E *k;
|
|
};
|
|
};
|
|
|
|
// Completely initialized.
|
|
constexpr E(int(&)[1]) : a(), b(), g(), h(), i(), j() {}
|
|
constexpr E(int(&)[3]) : a(), e(), g(), h(), i(), k() {}
|
|
constexpr E(int(&)[7]) : a(), b(), g(), h(), i(), j() {}
|
|
constexpr E(int(&)[8]) : a(), f(), g(), h(), i(), k() {}
|
|
constexpr E(int(&)[9]) : a(), c(), d(), g(), h(), i(), k() {}
|
|
|
|
// Missing d, i, j/k union init.
|
|
constexpr E(int(&)[2]) : a(), c(), g(), h() {}
|
|
|
|
// Missing h, j/k union init.
|
|
constexpr E(int(&)[4]) : a(), c(), d(), g(), i() {}
|
|
|
|
// Missing b/c/d/e/f union init.
|
|
constexpr E(int(&)[5]) : a(), g(), h(), i(), k() {}
|
|
|
|
// Missing a, b/c/d/e/f union, g/h/i/j/k struct init.
|
|
constexpr E(int(&)[6]) {}
|
|
};
|