diff options
author | Marek Polacek <polacek@redhat.com> | 2016-12-14 20:41:43 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2016-12-14 20:41:43 +0000 |
commit | 964b79eb330d5df3e851696e2d0bfa30b0e0307b (patch) | |
tree | f6f66a11d2a821e98fa7c953cadb8f50678c0dff /gcc | |
parent | cc99421ec4b3b94aa328175635782f6f5c36f9e9 (diff) | |
download | gcc-964b79eb330d5df3e851696e2d0bfa30b0e0307b.zip gcc-964b79eb330d5df3e851696e2d0bfa30b0e0307b.tar.gz gcc-964b79eb330d5df3e851696e2d0bfa30b0e0307b.tar.bz2 |
re PR c++/72775 (internal compiler error: in finish_expr_stmt, at cp/semantics.c:677)
PR c++/72775
* init.c (perform_member_init): Diagnose member initializer for
flexible array member.
* g++.dg/ext/flexary12.C: Adjust dg-error.
* g++.dg/ext/flexary20.C: New.
* g++.dg/ext/flexary21.C: New.
From-SVN: r243669
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/init.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary12.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary20.C | 49 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary21.C | 15 |
6 files changed, 86 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4061bed..a08c93a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-12-14 Marek Polacek <polacek@redhat.com> + + PR c++/72775 + * init.c (perform_member_init): Diagnose member initializer for + flexible array member. + 2016-12-14 Nathan Sidwell <nathan@acm.org> PR c++/78701 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index b4b6cdb..47428b9 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -800,6 +800,14 @@ perform_member_init (tree member, tree init) in that case. */ init = build_x_compound_expr_from_list (init, ELK_MEM_INIT, tf_warning_or_error); + if (TREE_CODE (type) == ARRAY_TYPE + && TYPE_DOMAIN (type) == NULL_TREE + && init != NULL_TREE) + { + error_at (DECL_SOURCE_LOCATION (current_function_decl), + "member initializer for flexible array member"); + inform (DECL_SOURCE_LOCATION (member), "%q#D initialized", member); + } if (init) finish_expr_stmt (cp_build_modify_expr (input_location, decl, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7875060..5026f07b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-12-14 Marek Polacek <polacek@redhat.com> + + PR c++/72775 + * g++.dg/ext/flexary12.C: Adjust dg-error. + * g++.dg/ext/flexary20.C: New. + * g++.dg/ext/flexary21.C: New. + 2016-12-14 Uros Bizjak <ubizjak@gmail.com> PR target/59874 diff --git a/gcc/testsuite/g++.dg/ext/flexary12.C b/gcc/testsuite/g++.dg/ext/flexary12.C index 3d8c805..db80bf4 100644 --- a/gcc/testsuite/g++.dg/ext/flexary12.C +++ b/gcc/testsuite/g++.dg/ext/flexary12.C @@ -44,7 +44,7 @@ struct D { D (); }; -D::D (): +D::D (): // { dg-error "member initializer for flexible array member" } a ("c") // { dg-error "incompatible types in assignment of .const char \\\[2\\\]. to .int \\\[\\\]." } { } diff --git a/gcc/testsuite/g++.dg/ext/flexary20.C b/gcc/testsuite/g++.dg/ext/flexary20.C new file mode 100644 index 0000000..2c8ab29 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary20.C @@ -0,0 +1,49 @@ +// PR c++/72775 +// { dg-do compile { target c++11 } } +// { dg-options -Wno-pedantic } + +struct S { + int i; + char a[] = "foo"; + S () {} // { dg-error "member initializer for flexible array member" } +}; + +struct T { // { dg-error "member initializer for flexible array member" } + int i; + char a[] = "foo"; +}; + +struct U { + int i; + char a[] = "foo"; + U (); +}; + +U::U() {} // { dg-error "member initializer for flexible array member" } + +int +main () +{ + struct T t; +} + +struct V { + int i; + struct W { // { dg-error "member initializer for flexible array member" } + int j; + char a[] = "foo"; + } w; + V () {} +}; + +template <class T> +struct X { // { dg-error "member initializer for flexible array member" } + int i; + T a[] = "foo"; +}; + +void +fn () +{ + struct X<char> x; +} diff --git a/gcc/testsuite/g++.dg/ext/flexary21.C b/gcc/testsuite/g++.dg/ext/flexary21.C new file mode 100644 index 0000000..5675bf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary21.C @@ -0,0 +1,15 @@ +// PR c++/72775 +// { dg-do compile { target c++11 } } +// { dg-options -Wno-pedantic } + +struct S { + int i; + char a[]; + S () : a("bob") {} // { dg-error "member initializer for flexible array member" } +}; + +struct T { + int i; + char a[] = "bob"; + T () : a("bob") {} // { dg-error "member initializer for flexible array member" } +}; |