diff options
author | Jason Merrill <jason@redhat.com> | 2024-11-04 17:48:46 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-11-05 11:02:36 -0500 |
commit | 3545aab00152ed3db1d7ce6ca4e1671dde276980 (patch) | |
tree | 2fa9c16b10f74c7c8f6993cad9f37f6d9401cc70 /gcc | |
parent | 6543a214485c0a722152e34de37424f9a0104bbb (diff) | |
download | gcc-3545aab00152ed3db1d7ce6ca4e1671dde276980.zip gcc-3545aab00152ed3db1d7ce6ca4e1671dde276980.tar.gz gcc-3545aab00152ed3db1d7ce6ca4e1671dde276980.tar.bz2 |
c++: allow array mem-init with -fpermissive [PR116634]
We've accidentally accepted this forever (at least as far back as 4.7), but
it's always been ill-formed; this was PR59465. And we didn't accept it for
scalar types. But rather than switch to a hard error for this code, let's
give a permerror so affected code can continue to work with -fpermissive.
PR c++/116634
gcc/cp/ChangeLog:
* init.cc (can_init_array_with_p): Allow PR59465 case with
permerror.
gcc/testsuite/ChangeLog:
* g++.dg/diagnostic/aggr-init1.C: Expect warning with -fpermissive.
* g++.dg/init/array62.C: Adjust diagnostic.
* g++.dg/init/array63.C: Adjust diagnostic.
* g++.dg/init/array64.C: Adjust diagnostic.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/init.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/diagnostic/aggr-init1.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/array62.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/array63.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/array64.C | 2 |
5 files changed, 8 insertions, 5 deletions
diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc index 12c673e..62b3d6f 100644 --- a/gcc/cp/init.cc +++ b/gcc/cp/init.cc @@ -967,7 +967,9 @@ can_init_array_with_p (tree type, tree init) return true; } - return false; + permerror (input_location, "array must be initialized " + "with a brace-enclosed initializer"); + return true; } /* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of diff --git a/gcc/testsuite/g++.dg/diagnostic/aggr-init1.C b/gcc/testsuite/g++.dg/diagnostic/aggr-init1.C index 3c32124..906d256 100644 --- a/gcc/testsuite/g++.dg/diagnostic/aggr-init1.C +++ b/gcc/testsuite/g++.dg/diagnostic/aggr-init1.C @@ -1,5 +1,6 @@ // PR c++/116634 // { dg-do compile { target c++11 } } +// { dg-additional-options -fpermissive } namespace std { using size_t = decltype(sizeof(42)); @@ -20,7 +21,7 @@ private: template<int N> struct Any final { constexpr - Any(ConstString (&&_vec)[N]) noexcept: vec(_vec){} // { dg-error "array" } + Any(ConstString (&&_vec)[N]) noexcept: vec(_vec){} // { dg-warning "array" } ConstString vec[N]; }; diff --git a/gcc/testsuite/g++.dg/init/array62.C b/gcc/testsuite/g++.dg/init/array62.C index 2a786a3..6d3935d 100644 --- a/gcc/testsuite/g++.dg/init/array62.C +++ b/gcc/testsuite/g++.dg/init/array62.C @@ -4,7 +4,7 @@ struct string {} a[1]; struct pair { string s[1]; - pair() : s(a) {} // { dg-error "invalid initializer for array member" } + pair() : s(a) {} // { dg-error "array must be initialized" } }; struct S { diff --git a/gcc/testsuite/g++.dg/init/array63.C b/gcc/testsuite/g++.dg/init/array63.C index 57e9805..96bc9a6 100644 --- a/gcc/testsuite/g++.dg/init/array63.C +++ b/gcc/testsuite/g++.dg/init/array63.C @@ -7,7 +7,7 @@ struct I { struct O { I a[2]; static I const data[2]; - O() : a(data){} // { dg-error "invalid initializer for array member" } + O() : a(data){} // { dg-error "array must be initialized" } }; I const O::data[2] = {true, false}; diff --git a/gcc/testsuite/g++.dg/init/array64.C b/gcc/testsuite/g++.dg/init/array64.C index e0afdfa..bbdd70c 100644 --- a/gcc/testsuite/g++.dg/init/array64.C +++ b/gcc/testsuite/g++.dg/init/array64.C @@ -16,7 +16,7 @@ typedef UserType Array[my_size]; class Foo { public: - Foo(Array& m) : m_(m) {}; // { dg-error "invalid initializer for array member" } + Foo(Array& m) : m_(m) {}; // { dg-error "array must be initialized" } private: Array m_; }; |