https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61321
Bug ID: 61321
Summary: demangler crash on casts in template parameters
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: other
Assignee: unassigned at gcc dot gnu.org
Reporter: palves at redhat dot com
The fix for bug 59195 (C++ demangler handles conversion operator incorrectly)
makes the demangler crash crash due to infinite recursion, in case of casts in
template parameters. For example:
template<int> struct A {};
template <typename Y> void function_temp(A<sizeof ((Y)(999))>) {}
template void function_temp<int>(A<sizeof (int)>);
The function_temp<int> instantiation mangles to:
_Z13function_tempIiEv1AIXszcvT_Li999EEE
The demangler parses this as:
typed name
template
name 'function_temp'
template argument list
builtin type int
function type
builtin type void
argument list
template
name 'A'
template argument list
unary operator
operator sizeof
unary operator
cast
template parameter 0
literal
builtin type int
name '999'
And after this patch, when printing the template argument list of A (what
should be "<sizeof (int)>"), the template parameter 0 (that is, "T_") now
refers to the first parameter of the the template argument list of the 'A'
template, exactly what we were trying to print, while it should actually refer
to the first parameter of the 'function_temp' template. This leads to infinite
recursion, and stack exaustion.
(This is particularly nasty for GDB, as it causes an immediate crash at
startup.)