]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Don't crash when mangling member with anonymous union or template type [PR100632...
authorSimon Martin <simon@nasilyan.com>
Mon, 16 Sep 2024 11:45:32 +0000 (13:45 +0200)
committerSimon Martin <simon@nasilyan.com>
Mon, 23 Sep 2024 13:05:48 +0000 (15:05 +0200)
commita030fcad4f9f490a08db0a4cad4c22635a0585c1
tree54bf220b752e67c228e461fbe8a8ab22f60bd441
parentd7bf5e53887a467b8c5c8439e5aae3ad4e11e62e
c++: Don't crash when mangling member with anonymous union or template type [PR100632, PR109790]

We currently crash upon mangling members that have an anonymous union or
a template operator type.

The problem is that before calling write_unqualified_name,
write_member_name asserts that it has a declaration whose DECL_NAME is
an identifier node that is not that of an operator. This is wrong:
 - In PR100632, it's an anonymous union declaration, hence a 0 DECL_NAME
 - In PR109790, it's a legitimate template declaration for an operator
   (this was accepted up to GCC 10)

This assert was added via r11-6301, to be sure that we do write the "on"
marker for operator members.

This patch removes that assert and instead
 - Lets members with an anonymous union type go through
 - For operators, adds the missing "on" marker for ABI versions greater
   than the highest usable with GCC 10

PR c++/109790
PR c++/100632

gcc/cp/ChangeLog:

* mangle.cc (write_member_name): Handle members whose type is an
anonymous union member. Write missing "on" marker for operators
when ABI version is at least 16.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/decltype83.C: New test.
* g++.dg/cpp0x/decltype83a.C: New test.
* g++.dg/cpp1y/lambda-ice3.C: New test.
* g++.dg/cpp1y/lambda-ice3a.C: New test.
* g++.dg/cpp2a/nontype-class67.C: New test.
gcc/cp/mangle.cc
gcc/testsuite/g++.dg/cpp0x/decltype83.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/decltype83a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-ice3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-ice3a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/nontype-class67.C [new file with mode: 0644]