diff options
author | Jason Merrill <jason@redhat.com> | 2024-01-25 12:02:07 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-01-25 15:22:32 -0500 |
commit | 136a828754ff65079a834555582b49d54bd5bc64 (patch) | |
tree | 2a84969850e95d727b6b4d03e9df468d1eb94510 /gcc | |
parent | 44868e7298de5048d6f04d7fa098d5bc767c8cb8 (diff) | |
download | gcc-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.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/initlist-pmf2.C | 12 |
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}; +} |