https://gcc.gnu.org/g:38de942670ad39c60ba4feae893d11843e0aebe8
commit r11-11449-g38de942670ad39c60ba4feae893d11843e0aebe8 Author: Jason Merrill <ja...@redhat.com> Date: Thu Jan 25 12:02:07 2024 -0500 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.c (build_vec_init): Don't use {} for PMF. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/initlist-pmf2.C: New test. (cherry picked from commit 136a828754ff65079a834555582b49d54bd5bc64) Diff: --- gcc/cp/init.c | 4 +++- gcc/testsuite/g++.dg/cpp0x/initlist-pmf2.C | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 08b26ba9a17..b6e63ee8f28 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -4479,7 +4479,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 00000000000..59c3698a9f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-pmf2.C @@ -0,0 +1,12 @@ +// PR c++/113598 +// { dg-additional-options -w } + +struct Cpu +{ + int op_nop(); +}; +typedef int(Cpu::*OpCode)(); +void f() +{ + new OpCode[256]{&Cpu::op_nop}; +}