diff options
author | Jason Merrill <jason@redhat.com> | 2020-02-10 00:47:34 +0100 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-02-10 09:50:34 +0100 |
commit | 59dbb04df76da41f26192c2c219584fc3d6017cc (patch) | |
tree | ec482184d1fd95fedf476bdf3f847f3a38080263 | |
parent | fd789c816b06235b04698636db69e302b24c83ba (diff) | |
download | gcc-59dbb04df76da41f26192c2c219584fc3d6017cc.zip gcc-59dbb04df76da41f26192c2c219584fc3d6017cc.tar.gz gcc-59dbb04df76da41f26192c2c219584fc3d6017cc.tar.bz2 |
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.
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/init.c | 7 | ||||
-rw-r--r-- | gcc/cp/tree.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary35.C | 18 |
5 files changed, 39 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 90f26c9..876e2eb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 037d3b6..043bc40 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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); diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 625062b..d480660 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -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)) diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index fda6307..eb540f8 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -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 diff --git a/gcc/testsuite/g++.dg/ext/flexary35.C b/gcc/testsuite/g++.dg/ext/flexary35.C new file mode 100644 index 0000000..b62c718 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary35.C @@ -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; +}; |