blob: 638e9c2ecca9a07f5469f468850f8b4d63634829 [file] [log] [blame]
// PR c++/91363 - P0960R3: Parenthesized initialization of aggregates.
// { dg-do compile { target c++20 } }
// Test ill-formed code.
// If k is greater than the size of the array, the program is ill-formed.
int a1[2](1, 2, 3); // { dg-error "too many initializers" }
int a2[](); // { dg-error "array of functions" }
int a3[](()); // { dg-error "expected primary-expression" }
int a4[]("raccoon"); // { dg-error "invalid conversion" }
struct S {
int i;
int j;
};
S s1(1, 1, 1); // { dg-error "too many initializers" }
union U2 {
int a;
float b;
};
// [dcl.init.aggr]/19:
// When a union is initialized with an initializer list, there shall not be
// more than one explicitly initialized element.
U2 u4 = U2(1, 2); // { dg-error "too many initializers" }
// Test there is no brace elision.
int a[2][2](1, 2, 3, 4); // { dg-error "too many initializers|array must be initialized with a brace-enclosed initializer" }
// private/protected/virtual base class -> not an aggregate.
struct B { };
struct D : private B {
int i;
int j;
};
D d({}, 1, 2); // { dg-error "no matching function" }
// Private non-static data member -> not an aggregate.
struct P {
int i;
private:
int j;
};
P p(1, 2); // { dg-error "no matching function" }
// User-declared constructor -> not an aggregate.
struct U {
U() {}
int i;
int j;
};
U u(1, 2); // { dg-error "no matching function" }
// virtual member function -> not an aggregate.
struct V {
int i;
int j;
virtual int foo(int);
};
V v(1, 2); // { dg-error "no matching function" }
struct nonaggr {
int i;
int j;
private:
int x;
};
struct F {
nonaggr n;
F() : n(1) { } // { dg-error "no matching function" }
};
struct G {
char a[4];
};
struct H {
G g;
H() : g("oaks") { } // { dg-error "initializer-string" }
};