aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2024-01-25 12:02:07 -0500
committerJason Merrill <jason@redhat.com>2024-01-25 15:22:32 -0500
commit136a828754ff65079a834555582b49d54bd5bc64 (patch)
tree2a84969850e95d727b6b4d03e9df468d1eb94510 /gcc
parent44868e7298de5048d6f04d7fa098d5bc767c8cb8 (diff)
downloadgcc-136a828754ff65079a834555582b49d54bd5bc64.zip
gcc-136a828754ff65079a834555582b49d54bd5bc64.tar.gz
gcc-136a828754ff65079a834555582b49d54bd5bc64.tar.bz2
c++: array of PMF [PR113598]
Here AGGREGATE_TYPE_P includes pointers to member functions, which is not what we want. Instead we should use class||array, as elsewhere in the function. PR c++/113598 gcc/cp/ChangeLog: * init.cc (build_vec_init): Don't use {} for PMF. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/initlist-pmf2.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/init.cc4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist-pmf2.C12
2 files changed, 15 insertions, 1 deletions
diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc
index adbdfc2..ac37330 100644
--- a/gcc/cp/init.cc
+++ b/gcc/cp/init.cc
@@ -4864,7 +4864,9 @@ build_vec_init (tree base, tree maxindex, tree init,
But for non-classes, that's the same as value-initialization. */
if (empty_list)
{
- if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
+ if (cxx_dialect >= cxx11
+ && (CLASS_TYPE_P (type)
+ || TREE_CODE (type) == ARRAY_TYPE))
{
init = build_constructor (init_list_type_node, NULL);
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-pmf2.C b/gcc/testsuite/g++.dg/cpp0x/initlist-pmf2.C
new file mode 100644
index 0000000..0fac833
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist-pmf2.C
@@ -0,0 +1,12 @@
+// PR c++/113598
+// { dg-additional-options -Wno-c++11-extensions }
+
+struct Cpu
+{
+ int op_nop();
+};
+typedef int(Cpu::*OpCode)();
+void f()
+{
+ new OpCode[256]{&Cpu::op_nop};
+}