https://gcc.gnu.org/g:3545aab00152ed3db1d7ce6ca4e1671dde276980

commit r15-4961-g3545aab00152ed3db1d7ce6ca4e1671dde276980
Author: Jason Merrill <ja...@redhat.com>
Date:   Mon Nov 4 17:48:46 2024 -0500

    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.

Diff:
---
 gcc/cp/init.cc                               | 4 +++-
 gcc/testsuite/g++.dg/diagnostic/aggr-init1.C | 3 ++-
 gcc/testsuite/g++.dg/init/array62.C          | 2 +-
 gcc/testsuite/g++.dg/init/array63.C          | 2 +-
 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 12c673efb2ac..62b3d6f6ce91 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 3c32124d6fde..906d2564bda8 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 2a786a36e4e8..6d3935d7a668 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 57e980561680..96bc9a64b26c 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 e0afdfab39a5..bbdd70c6df8c 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_;
 };

Reply via email to