mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 12:00:11 -05:00
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.
20 lines
664 B
C
20 lines
664 B
C
// PR c++/109790
|
|
// This used to work until GCC 10; force the usage of ABI 15 (the highest
|
|
// usable in GCC 10) and check that the mangling (actually wrong; see
|
|
// lambda-ice3a.C) matches that of GCC 10's default ABI version (14).
|
|
|
|
// { dg-do compile { target c++14 } }
|
|
// { dg-additional-options "-fabi-version=15" }
|
|
|
|
auto ll = [](auto ... ){};
|
|
template <class _Impl, class _Args>
|
|
void mm(void (_Impl::*__p)(_Args) const);
|
|
template <class _Ts>
|
|
using __impl_for = decltype(mm(&decltype(ll)::operator()<_Ts>));
|
|
template <class _Ts> __impl_for<_Ts> f() { }
|
|
void aaa() {
|
|
f<int>();
|
|
}
|
|
|
|
// { dg-final { scan-assembler "_Z1fIiEDTcl2mmadsrN2llMUlDpT_E_EclIT_EEEv" } }
|