diff options
author | Martin Sebor <msebor@redhat.com> | 2017-01-25 23:11:53 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2017-01-25 16:11:53 -0700 |
commit | 58feaa5f529ef7c5afec8f6f323d7bcf596313a4 (patch) | |
tree | 30c2ef8b24d6ce50fc021a738a786fe04f4800df | |
parent | a25608aa6fc14c49fb23247f60c5f83225d00c29 (diff) | |
download | gcc-58feaa5f529ef7c5afec8f6f323d7bcf596313a4.zip gcc-58feaa5f529ef7c5afec8f6f323d7bcf596313a4.tar.gz gcc-58feaa5f529ef7c5afec8f6f323d7bcf596313a4.tar.bz2 |
PR c++/71290 - Flexible array member is not diagnosed with -pedantic
gcc/cp/ChangeLog:
PR c++/71290
* decl.c (grokdeclarator): Warn on flexible array members.
gcc/testsuite/ChangeLog:
PR c++/71290
* g++.dg/ext/flexarray-mangle-2.C: Adjust.
* g++.dg/ext/flexarray-mangle.C: Same.
* g++.dg/ext/flexarray-subst.C: Same.
* g++.dg/ext/flexary10.C: Same.
* g++.dg/ext/flexary11.C: Same.
* g++.dg/ext/flexary14.C: Same.
* g++.dg/ext/flexary16.C: Same.
* g++.dg/ext/flexary18.C: Same.
* g++.dg/ext/flexary19.C: Same.
* g++.dg/ext/flexary7.C: Same.
* gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations1.C: Same.
* gcc/testsuite/g++.dg/ubsan/object-size-1.C: Same.
* gcc/testsuite/obj-c++.dg/property/at-property-23.mm: Same.
From-SVN: r244910
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations1.C | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexarray-mangle-2.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexarray-mangle.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexarray-subst.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary10.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary11.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary14.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary16.C | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary18.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary19.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/flexary7.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/pr71290.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ubsan/object-size-1.C | 5 | ||||
-rw-r--r-- | gcc/testsuite/obj-c++.dg/property/at-property-23.mm | 2 |
16 files changed, 67 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6144ad7..11c30ca 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-01-25 Martin Sebor <msebor@redhat.com> + + PR c++/71290 + * decl.c (grokdeclarator): Warn on flexible array members. + 2017-01-25 Jakub Jelinek <jakub@redhat.com> PR c++/78896 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 4b64ba1..39e7fbd 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11804,6 +11804,17 @@ grokdeclarator (const cp_declarator *declarator, } else { + /* Array is a flexible member. */ + if (in_system_header_at (input_location)) + /* Do not warn flexible them in system headers because glibc + uses them. */; + else if (name) + pedwarn (input_location, OPT_Wpedantic, + "ISO C++ forbids flexible array member %<%s%>", name); + else + pedwarn (input_location, OPT_Wpedantic, + "ISO C++ forbids flexible array members"); + /* Flexible array member has a null domain. */ type = build_cplus_array_type (TREE_TYPE (type), NULL_TREE); } diff --git a/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations1.C b/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations1.C index 73d80bf..bca03a1 100644 --- a/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations1.C +++ b/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations1.C @@ -1,4 +1,5 @@ // { dg-do compile { target c++11 } } +// { dg-additional-options "-Wno-error=pedantic" } #define INTB (__SIZEOF_INT__ * __CHAR_BIT__) struct S { int i : INTB * 3 / 4; S (); }; @@ -7,7 +8,9 @@ struct U { int i : INTB * 3 / 4; int j : INTB / 4; }; struct V { int i : INTB * 3 / 4; int j : INTB / 4 + 1; }; struct W {}; struct X : public W { int i; void bar (); }; -struct Y { char a[3]; char b[]; }; +struct Y { + char a[3]; char b[]; // { dg-warning "forbids flexible array member" } +}; struct Z { int a; float b; }; struct A { int i : INTB * 2; int j; }; // { dg-warning "exceeds its type" } union B { long a; unsigned long b; }; diff --git a/gcc/testsuite/g++.dg/ext/flexarray-mangle-2.C b/gcc/testsuite/g++.dg/ext/flexarray-mangle-2.C index 98bd5f5..3abb407 100644 --- a/gcc/testsuite/g++.dg/ext/flexarray-mangle-2.C +++ b/gcc/testsuite/g++.dg/ext/flexarray-mangle-2.C @@ -1,9 +1,10 @@ // PR c++/69277 - [6 Regression] ICE mangling a flexible array member // { dg-do compile { target c++11 } } +// { dg-additional-options "-Wno-error=pedantic" } struct A { int n; - char a []; + char a[]; // { dg-warning "forbids flexible array member" } }; // Declare but do not define function templates. diff --git a/gcc/testsuite/g++.dg/ext/flexarray-mangle.C b/gcc/testsuite/g++.dg/ext/flexarray-mangle.C index d8a8c0a..658d935 100644 --- a/gcc/testsuite/g++.dg/ext/flexarray-mangle.C +++ b/gcc/testsuite/g++.dg/ext/flexarray-mangle.C @@ -1,9 +1,10 @@ // PR c++/69277 - [6 Regression] ICE mangling a flexible array member // { dg-do compile } +// { dg-additional-options "-Wno-error=pedantic" } struct A { int n; - char a []; + char a[]; // { dg-warning "forbids flexible array member" } }; // Declare but do not define function templates. diff --git a/gcc/testsuite/g++.dg/ext/flexarray-subst.C b/gcc/testsuite/g++.dg/ext/flexarray-subst.C index f644636..6cf03a4 100644 --- a/gcc/testsuite/g++.dg/ext/flexarray-subst.C +++ b/gcc/testsuite/g++.dg/ext/flexarray-subst.C @@ -1,8 +1,12 @@ // PR c++/69251 - [6 Regression] ICE (segmentation fault) in unify_array_domain // on i686-linux-gnu // { dg-do compile } +// { dg-additional-options "-Wno-error=pedantic" } -struct A { int n; char a[]; }; +struct A { + int n; + char a[]; // { dg-warning "forbids flexible array member" } +}; template <class> struct B; diff --git a/gcc/testsuite/g++.dg/ext/flexary10.C b/gcc/testsuite/g++.dg/ext/flexary10.C index f2868f3..4d1ff56 100644 --- a/gcc/testsuite/g++.dg/ext/flexary10.C +++ b/gcc/testsuite/g++.dg/ext/flexary10.C @@ -4,7 +4,7 @@ struct A { int n; - int a []; + int a[]; // { dg-warning "forbids flexible array member" } }; struct A foo (void) diff --git a/gcc/testsuite/g++.dg/ext/flexary11.C b/gcc/testsuite/g++.dg/ext/flexary11.C index 5bf774f..f958cc5 100644 --- a/gcc/testsuite/g++.dg/ext/flexary11.C +++ b/gcc/testsuite/g++.dg/ext/flexary11.C @@ -4,7 +4,7 @@ struct A { int n; - char a []; + char a[]; // { dg-error "forbids flexible array member" } }; void f () diff --git a/gcc/testsuite/g++.dg/ext/flexary14.C b/gcc/testsuite/g++.dg/ext/flexary14.C index 7365357..add150a 100644 --- a/gcc/testsuite/g++.dg/ext/flexary14.C +++ b/gcc/testsuite/g++.dg/ext/flexary14.C @@ -9,7 +9,9 @@ struct A<T[]> { typedef int X; }; template <class T> int foo (T&, typename A<T>::X = 0) { return 0; } -struct B { int n, a[]; }; +struct B { + int n, a[]; // { dg-error "forbids flexible array member" } +}; void bar (B *b) { diff --git a/gcc/testsuite/g++.dg/ext/flexary16.C b/gcc/testsuite/g++.dg/ext/flexary16.C index a3e040d..64a9f5d 100644 --- a/gcc/testsuite/g++.dg/ext/flexary16.C +++ b/gcc/testsuite/g++.dg/ext/flexary16.C @@ -1,6 +1,7 @@ // PR c++/71147 - [6 Regression] Flexible array member wrongly rejected // in template // { dg-do compile } +// { dg-options "-Wpedantic -Wno-error=pedantic" } template <typename> struct container @@ -11,7 +12,7 @@ struct container struct incomplete { int x; - elem array[]; + elem array[]; // { dg-warning "forbids flexible array member" } }; }; @@ -26,7 +27,7 @@ struct D: container<T> { struct S { int x; - typename container<T>::elem array[]; + typename container<T>::elem array[]; // { dg-warning "forbids flexible array member" } }; }; diff --git a/gcc/testsuite/g++.dg/ext/flexary18.C b/gcc/testsuite/g++.dg/ext/flexary18.C index 4353425..4ab864d 100644 --- a/gcc/testsuite/g++.dg/ext/flexary18.C +++ b/gcc/testsuite/g++.dg/ext/flexary18.C @@ -211,3 +211,5 @@ struct StructUnion9 { // { dg-message "in the definition" } b2; // { dg-warning "invalid use" } } a2; // { dg-message "next member" } }; + +// { dg-prune-output "forbids flexible array member" } diff --git a/gcc/testsuite/g++.dg/ext/flexary19.C b/gcc/testsuite/g++.dg/ext/flexary19.C index 27d08ec..5eaf11b 100644 --- a/gcc/testsuite/g++.dg/ext/flexary19.C +++ b/gcc/testsuite/g++.dg/ext/flexary19.C @@ -341,3 +341,4 @@ struct S35 typedef D D2; }; +// { dg-prune-output "forbids flexible array member" } diff --git a/gcc/testsuite/g++.dg/ext/flexary7.C b/gcc/testsuite/g++.dg/ext/flexary7.C index fdea4d4..1b22f21 100644 --- a/gcc/testsuite/g++.dg/ext/flexary7.C +++ b/gcc/testsuite/g++.dg/ext/flexary7.C @@ -5,7 +5,7 @@ struct FlexChar { int n; - char a[]; + char a[]; // { dg-warning "forbids flexible array member" } }; struct FlexChar ac = @@ -18,7 +18,7 @@ typedef __WCHAR_TYPE__ wchar_t; struct FlexWchar { int n; - wchar_t a[]; + wchar_t a[]; // { dg-warning "forbids flexible array member" } }; struct FlexWchar awc = @@ -27,7 +27,7 @@ struct FlexWchar awc = struct FlexInt { int n; - int a[]; + int a[]; // { dg-warning "forbids flexible array member" } }; // Verify that no warning is issued for the case when a flexible array @@ -48,7 +48,7 @@ struct FlexInt ai2 = template <class T> struct FlexT { int n; - T a[]; + T a[]; // { dg-warning "forbids flexible array member" } }; struct FlexT<char> atc = diff --git a/gcc/testsuite/g++.dg/ext/pr71290.C b/gcc/testsuite/g++.dg/ext/pr71290.C new file mode 100644 index 0000000..e782eb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr71290.C @@ -0,0 +1,17 @@ +// PR c++/71290 - [6/7 Regression] Flexible array member is not diagnosed +// with -pedantic + +// { dg-do compile }s +// { dg-options "-Wall -Wpedantic" } + +struct A +{ + int i; + int arr[]; // { dg-warning "forbids flexible array member .arr." } +}; + +template <class T> +struct B { + T n; + T a[]; // { dg-warning "forbids flexible array member .a." } +}; diff --git a/gcc/testsuite/g++.dg/ubsan/object-size-1.C b/gcc/testsuite/g++.dg/ubsan/object-size-1.C index e6cdefc..d2881d6 100644 --- a/gcc/testsuite/g++.dg/ubsan/object-size-1.C +++ b/gcc/testsuite/g++.dg/ubsan/object-size-1.C @@ -1,7 +1,10 @@ // { dg-do compile } // { dg-options "-Wpedantic -Wno-error=pedantic -fsanitize=undefined -fpermissive" } -struct T { int c; char d[]; }; +struct T +{ + int c; char d[]; // { dg-warning "forbids flexible array member" } +}; struct T t = { 1, "a" }; // { dg-warning "initialization of a flexible array member " } diff --git a/gcc/testsuite/obj-c++.dg/property/at-property-23.mm b/gcc/testsuite/obj-c++.dg/property/at-property-23.mm index 035cc8b..0edb37b 100644 --- a/gcc/testsuite/obj-c++.dg/property/at-property-23.mm +++ b/gcc/testsuite/obj-c++.dg/property/at-property-23.mm @@ -14,4 +14,6 @@ @property int a[8]; /* { dg-error "property can not be an array" } */ @property int b:8; /* { dg-error "expected" } */ @property int c[]; /* { dg-error "property can not be an array" } */ +/* { dg-error "forbids flexible array member" "flexible array member" { target \ +*-*-* } .-1 } */ @end |