]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: allow array mem-init with -fpermissive [PR116634]
authorJason Merrill <jason@redhat.com>
Mon, 4 Nov 2024 22:48:46 +0000 (17:48 -0500)
committerJason Merrill <jason@redhat.com>
Tue, 5 Nov 2024 16:02:36 +0000 (11:02 -0500)
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.

gcc/cp/init.cc
gcc/testsuite/g++.dg/diagnostic/aggr-init1.C
gcc/testsuite/g++.dg/init/array62.C
gcc/testsuite/g++.dg/init/array63.C
gcc/testsuite/g++.dg/init/array64.C

index 12c673efb2ac494ca1237df0256aa386015cb22b..62b3d6f6ce91dfe418cf163e3ce44261b7bb0197 100644 (file)
@@ -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
index 3c32124d6fde551a1c19436f65520985b7636d1d..906d2564bda828386920b64bc19393e43d99538d 100644 (file)
@@ -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];
 };
index 2a786a36e4e8cd3e77b8e1a01bb988f8fc78deb2..6d3935d7a668d62c5693e078f662a6fb2c68b79d 100644 (file)
@@ -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 {
index 57e9805616804e4838acdfb11d022a8a6825018e..96bc9a64b26cf38c3f963fce8e53e0e4c5cc8653 100644 (file)
@@ -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};
index e0afdfab39a59678fa63bd9dd180ac382f0c2d6a..bbdd70c6df8c59d7876fe27d629fb9406a35d8e6 100644 (file)
@@ -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_;
 };