c++: Fix flexible array with synthesized constructor.
We were already rejecting initialization of a flexible array member in a constructor; we similarly shouldn't try to clean it up. PR c++/93618 * tree.c (array_of_unknown_bound_p): New. * init.c (perform_member_init): Do nothing for flexible arrays.
This commit is contained in:
parent
fd789c816b
commit
59dbb04df7
@ -1,3 +1,9 @@
|
||||
2020-02-10 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/93618
|
||||
* tree.c (array_of_unknown_bound_p): New.
|
||||
* init.c (perform_member_init): Do nothing for flexible arrays.
|
||||
|
||||
2020-02-09 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/93633
|
||||
|
@ -7424,6 +7424,7 @@ extern tree build_exception_variant (tree, tree);
|
||||
extern tree bind_template_template_parm (tree, tree);
|
||||
extern tree array_type_nelts_total (tree);
|
||||
extern tree array_type_nelts_top (tree);
|
||||
extern bool array_of_unknown_bound_p (const_tree);
|
||||
extern tree break_out_target_exprs (tree, bool = false);
|
||||
extern tree build_ctor_subob_ref (tree, tree, tree);
|
||||
extern tree replace_placeholders (tree, tree, bool * = NULL);
|
||||
|
@ -801,8 +801,11 @@ perform_member_init (tree member, tree init)
|
||||
member);
|
||||
}
|
||||
|
||||
if (maybe_reject_flexarray_init (member, init))
|
||||
return;
|
||||
if (array_of_unknown_bound_p (type))
|
||||
{
|
||||
maybe_reject_flexarray_init (member, init);
|
||||
return;
|
||||
}
|
||||
|
||||
if (init && TREE_CODE (init) == TREE_LIST
|
||||
&& (DIRECT_LIST_INIT_P (TREE_VALUE (init))
|
||||
|
@ -1135,6 +1135,15 @@ build_array_of_n_type (tree elt, int n)
|
||||
return build_cplus_array_type (elt, build_index_type (size_int (n - 1)));
|
||||
}
|
||||
|
||||
/* True iff T is an array of unknown bound. */
|
||||
|
||||
bool
|
||||
array_of_unknown_bound_p (const_tree t)
|
||||
{
|
||||
return (TREE_CODE (t) == ARRAY_TYPE
|
||||
&& !TYPE_DOMAIN (t));
|
||||
}
|
||||
|
||||
/* True iff T is an N3639 array of runtime bound (VLA). These were approved
|
||||
for C++14 but then removed. This should only be used for N3639
|
||||
specifically; code wondering more generally if something is a VLA should use
|
||||
|
18
gcc/testsuite/g++.dg/ext/flexary35.C
Normal file
18
gcc/testsuite/g++.dg/ext/flexary35.C
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c++/93618
|
||||
// { dg-do compile { target c++11 } }
|
||||
// { dg-options "" }
|
||||
|
||||
template <typename T>
|
||||
struct C {
|
||||
~C () = default;
|
||||
T *p = nullptr;
|
||||
};
|
||||
|
||||
class A {
|
||||
struct B {
|
||||
int c;
|
||||
C<B*> d[];
|
||||
};
|
||||
void foo (int f) { B s; s.c = f; }
|
||||
B e;
|
||||
};
|
Loading…
Reference in New Issue
Block a user