diff options
author | Jason Merrill <jason@redhat.com> | 2017-04-21 15:26:54 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-04-21 15:26:54 -0400 |
commit | 176e79b51e9e778a768e9e33bd4daa47600300fd (patch) | |
tree | 1b7f1130a6566026e8fc26a717b0af8ca08acc61 /gcc | |
parent | f2f3e54dec0244e27ae22720713b8249430dbe95 (diff) | |
download | gcc-176e79b51e9e778a768e9e33bd4daa47600300fd.zip gcc-176e79b51e9e778a768e9e33bd4daa47600300fd.tar.gz gcc-176e79b51e9e778a768e9e33bd4daa47600300fd.tar.bz2 |
PR c++/80179 - ICE with initialized flexible array member.
* constexpr.c (verify_ctor_sanity): Handle flexible array members.
From-SVN: r247067
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary24.C | 12 |
3 files changed, 27 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dad7a0a..6799e2e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-04-21 Jason Merrill <jason@redhat.com> + + PR c++/80179 - ICE with initialized flexible array member. + * constexpr.c (verify_ctor_sanity): Handle flexible array members. + 2017-04-21 Richard Biener <rguenther@suse.de> * cp-tree.h (copy_decl): Annotate with CXX_MEM_STAT_INFO. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 9dde4a4..366d562 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -2643,8 +2643,16 @@ verify_ctor_sanity (const constexpr_ctx *ctx, tree type) /* We used to check that ctx->ctor was empty, but that isn't the case when the object is zero-initialized before calling the constructor. */ if (ctx->object) - gcc_assert (same_type_ignoring_top_level_qualifiers_p - (type, TREE_TYPE (ctx->object))); + { + tree otype = TREE_TYPE (ctx->object); + gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, otype) + /* Handle flexible array members. */ + || (TREE_CODE (otype) == ARRAY_TYPE + && TYPE_DOMAIN (otype) == NULL_TREE + && TREE_CODE (type) == ARRAY_TYPE + && (same_type_ignoring_top_level_qualifiers_p + (TREE_TYPE (type), TREE_TYPE (otype))))); + } gcc_assert (!ctx->object || !DECL_P (ctx->object) || *(ctx->values->get (ctx->object)) == ctx->ctor); } diff --git a/gcc/testsuite/g++.dg/ext/flexary24.C b/gcc/testsuite/g++.dg/ext/flexary24.C new file mode 100644 index 0000000..c25e540 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary24.C @@ -0,0 +1,12 @@ +// PR c++/80179 +// { dg-options "" } + +struct S { + int n; + const char *a[]; +}; + +void bar (const char *a) +{ + static const S t = { 1, { a, "b" } }; +} |