mirror of git://gcc.gnu.org/git/gcc.git
backport: re PR other/61321 (demangler crash on casts in template parameters)
Backported from mainline 2015-11-27 Pedro Alves <palves@redhat.com> PR other/61321 PR other/61233 * demangle.h (enum demangle_component_type) <DEMANGLE_COMPONENT_CONVERSION>: New value. * cp-demangle.c (d_demangle_callback, d_make_comp): Handle DEMANGLE_COMPONENT_CONVERSION. (is_ctor_dtor_or_conversion): Handle DEMANGLE_COMPONENT_CONVERSION instead of DEMANGLE_COMPONENT_CAST. (d_operator_name): Return a DEMANGLE_COMPONENT_CONVERSION component if handling a conversion. (d_count_templates_scopes, d_print_comp_inner): Handle DEMANGLE_COMPONENT_CONVERSION. (d_print_comp_inner): Handle DEMANGLE_COMPONENT_CONVERSION instead of DEMANGLE_COMPONENT_CAST. (d_print_cast): Rename as ... (d_print_conversion): ... this. Adjust comments. (d_print_cast): Rewrite - simply print the left subcomponent. * cp-demint.c (cplus_demangle_fill_component): Handle DEMANGLE_COMPONENT_CONVERSION. * testsuite/demangle-expected: Add tests. From-SVN: r236451
This commit is contained in:
parent
b9a5c52ec7
commit
164bbc0d3b
|
|
@ -1,3 +1,13 @@
|
||||||
|
2016-05-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
Backported from mainline
|
||||||
|
2015-11-27 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
PR other/61321
|
||||||
|
PR other/61233
|
||||||
|
* demangle.h (enum demangle_component_type)
|
||||||
|
<DEMANGLE_COMPONENT_CONVERSION>: New value.
|
||||||
|
|
||||||
2015-12-04 Release Manager
|
2015-12-04 Release Manager
|
||||||
|
|
||||||
* GCC 5.3.0 released.
|
* GCC 5.3.0 released.
|
||||||
|
|
|
||||||
|
|
@ -380,6 +380,10 @@ enum demangle_component_type
|
||||||
/* A typecast, represented as a unary operator. The one subtree is
|
/* A typecast, represented as a unary operator. The one subtree is
|
||||||
the type to which the argument should be cast. */
|
the type to which the argument should be cast. */
|
||||||
DEMANGLE_COMPONENT_CAST,
|
DEMANGLE_COMPONENT_CAST,
|
||||||
|
/* A conversion operator, represented as a unary operator. The one
|
||||||
|
subtree is the type to which the argument should be converted
|
||||||
|
to. */
|
||||||
|
DEMANGLE_COMPONENT_CONVERSION,
|
||||||
/* A nullary expression. The left subtree is the operator. */
|
/* A nullary expression. The left subtree is the operator. */
|
||||||
DEMANGLE_COMPONENT_NULLARY,
|
DEMANGLE_COMPONENT_NULLARY,
|
||||||
/* A unary expression. The left subtree is the operator, and the
|
/* A unary expression. The left subtree is the operator, and the
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,28 @@
|
||||||
2016-05-19 Jakub Jelinek <jakub@redhat.com>
|
2016-05-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
Backported from mainline
|
Backported from mainline
|
||||||
|
2015-11-27 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
PR other/61321
|
||||||
|
PR other/61233
|
||||||
|
* cp-demangle.c (d_demangle_callback, d_make_comp): Handle
|
||||||
|
DEMANGLE_COMPONENT_CONVERSION.
|
||||||
|
(is_ctor_dtor_or_conversion): Handle DEMANGLE_COMPONENT_CONVERSION
|
||||||
|
instead of DEMANGLE_COMPONENT_CAST.
|
||||||
|
(d_operator_name): Return a DEMANGLE_COMPONENT_CONVERSION
|
||||||
|
component if handling a conversion.
|
||||||
|
(d_count_templates_scopes, d_print_comp_inner): Handle
|
||||||
|
DEMANGLE_COMPONENT_CONVERSION.
|
||||||
|
(d_print_comp_inner): Handle DEMANGLE_COMPONENT_CONVERSION instead
|
||||||
|
of DEMANGLE_COMPONENT_CAST.
|
||||||
|
(d_print_cast): Rename as ...
|
||||||
|
(d_print_conversion): ... this. Adjust comments.
|
||||||
|
(d_print_cast): Rewrite - simply print the left subcomponent.
|
||||||
|
* cp-demint.c (cplus_demangle_fill_component): Handle
|
||||||
|
DEMANGLE_COMPONENT_CONVERSION.
|
||||||
|
|
||||||
|
* testsuite/demangle-expected: Add tests.
|
||||||
|
|
||||||
2015-07-13 Mikhail Maltsev <maltsevm@gmail.com>
|
2015-07-13 Mikhail Maltsev <maltsevm@gmail.com>
|
||||||
|
|
||||||
* cp-demangle.c (d_dump): Fix syntax error.
|
* cp-demangle.c (d_dump): Fix syntax error.
|
||||||
|
|
|
||||||
|
|
@ -538,8 +538,10 @@ d_print_array_type (struct d_print_info *, int,
|
||||||
static void
|
static void
|
||||||
d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
|
d_print_expr_op (struct d_print_info *, int, const struct demangle_component *);
|
||||||
|
|
||||||
static void
|
static void d_print_cast (struct d_print_info *, int,
|
||||||
d_print_cast (struct d_print_info *, int, const struct demangle_component *);
|
const struct demangle_component *);
|
||||||
|
static void d_print_conversion (struct d_print_info *, int,
|
||||||
|
const struct demangle_component *);
|
||||||
|
|
||||||
static int d_demangle_callback (const char *, int,
|
static int d_demangle_callback (const char *, int,
|
||||||
demangle_callbackref, void *);
|
demangle_callbackref, void *);
|
||||||
|
|
@ -729,6 +731,9 @@ d_dump (struct demangle_component *dc, int indent)
|
||||||
case DEMANGLE_COMPONENT_CAST:
|
case DEMANGLE_COMPONENT_CAST:
|
||||||
printf ("cast\n");
|
printf ("cast\n");
|
||||||
break;
|
break;
|
||||||
|
case DEMANGLE_COMPONENT_CONVERSION:
|
||||||
|
printf ("conversion operator\n");
|
||||||
|
break;
|
||||||
case DEMANGLE_COMPONENT_NULLARY:
|
case DEMANGLE_COMPONENT_NULLARY:
|
||||||
printf ("nullary operator\n");
|
printf ("nullary operator\n");
|
||||||
break;
|
break;
|
||||||
|
|
@ -938,6 +943,7 @@ d_make_comp (struct d_info *di, enum demangle_component_type type,
|
||||||
case DEMANGLE_COMPONENT_IMAGINARY:
|
case DEMANGLE_COMPONENT_IMAGINARY:
|
||||||
case DEMANGLE_COMPONENT_VENDOR_TYPE:
|
case DEMANGLE_COMPONENT_VENDOR_TYPE:
|
||||||
case DEMANGLE_COMPONENT_CAST:
|
case DEMANGLE_COMPONENT_CAST:
|
||||||
|
case DEMANGLE_COMPONENT_CONVERSION:
|
||||||
case DEMANGLE_COMPONENT_JAVA_RESOURCE:
|
case DEMANGLE_COMPONENT_JAVA_RESOURCE:
|
||||||
case DEMANGLE_COMPONENT_DECLTYPE:
|
case DEMANGLE_COMPONENT_DECLTYPE:
|
||||||
case DEMANGLE_COMPONENT_PACK_EXPANSION:
|
case DEMANGLE_COMPONENT_PACK_EXPANSION:
|
||||||
|
|
@ -1229,7 +1235,7 @@ is_ctor_dtor_or_conversion (struct demangle_component *dc)
|
||||||
return is_ctor_dtor_or_conversion (d_right (dc));
|
return is_ctor_dtor_or_conversion (d_right (dc));
|
||||||
case DEMANGLE_COMPONENT_CTOR:
|
case DEMANGLE_COMPONENT_CTOR:
|
||||||
case DEMANGLE_COMPONENT_DTOR:
|
case DEMANGLE_COMPONENT_DTOR:
|
||||||
case DEMANGLE_COMPONENT_CAST:
|
case DEMANGLE_COMPONENT_CONVERSION:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1785,11 +1791,16 @@ d_operator_name (struct d_info *di)
|
||||||
{
|
{
|
||||||
struct demangle_component *type;
|
struct demangle_component *type;
|
||||||
int was_conversion = di->is_conversion;
|
int was_conversion = di->is_conversion;
|
||||||
|
struct demangle_component *res;
|
||||||
|
|
||||||
di->is_conversion = ! di->is_expression;
|
di->is_conversion = ! di->is_expression;
|
||||||
type = cplus_demangle_type (di);
|
type = cplus_demangle_type (di);
|
||||||
|
if (di->is_conversion)
|
||||||
|
res = d_make_comp (di, DEMANGLE_COMPONENT_CONVERSION, type, NULL);
|
||||||
|
else
|
||||||
|
res = d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
|
||||||
di->is_conversion = was_conversion;
|
di->is_conversion = was_conversion;
|
||||||
return d_make_comp (di, DEMANGLE_COMPONENT_CAST, type, NULL);
|
return res;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -3897,6 +3908,7 @@ d_count_templates_scopes (int *num_templates, int *num_scopes,
|
||||||
case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
|
case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
|
||||||
case DEMANGLE_COMPONENT_INITIALIZER_LIST:
|
case DEMANGLE_COMPONENT_INITIALIZER_LIST:
|
||||||
case DEMANGLE_COMPONENT_CAST:
|
case DEMANGLE_COMPONENT_CAST:
|
||||||
|
case DEMANGLE_COMPONENT_CONVERSION:
|
||||||
case DEMANGLE_COMPONENT_NULLARY:
|
case DEMANGLE_COMPONENT_NULLARY:
|
||||||
case DEMANGLE_COMPONENT_UNARY:
|
case DEMANGLE_COMPONENT_UNARY:
|
||||||
case DEMANGLE_COMPONENT_BINARY:
|
case DEMANGLE_COMPONENT_BINARY:
|
||||||
|
|
@ -5030,9 +5042,9 @@ d_print_comp_inner (struct d_print_info *dpi, int options,
|
||||||
d_print_comp (dpi, options, dc->u.s_extended_operator.name);
|
d_print_comp (dpi, options, dc->u.s_extended_operator.name);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case DEMANGLE_COMPONENT_CAST:
|
case DEMANGLE_COMPONENT_CONVERSION:
|
||||||
d_append_string (dpi, "operator ");
|
d_append_string (dpi, "operator ");
|
||||||
d_print_cast (dpi, options, dc);
|
d_print_conversion (dpi, options, dc);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case DEMANGLE_COMPONENT_NULLARY:
|
case DEMANGLE_COMPONENT_NULLARY:
|
||||||
|
|
@ -5766,10 +5778,19 @@ d_print_expr_op (struct d_print_info *dpi, int options,
|
||||||
static void
|
static void
|
||||||
d_print_cast (struct d_print_info *dpi, int options,
|
d_print_cast (struct d_print_info *dpi, int options,
|
||||||
const struct demangle_component *dc)
|
const struct demangle_component *dc)
|
||||||
|
{
|
||||||
|
d_print_comp (dpi, options, d_left (dc));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print a conversion operator. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
d_print_conversion (struct d_print_info *dpi, int options,
|
||||||
|
const struct demangle_component *dc)
|
||||||
{
|
{
|
||||||
struct d_print_template dpt;
|
struct d_print_template dpt;
|
||||||
|
|
||||||
/* For a cast operator, we need the template parameters from
|
/* For a conversion operator, we need the template parameters from
|
||||||
the enclosing template in scope for processing the type. */
|
the enclosing template in scope for processing the type. */
|
||||||
if (dpi->current_template != NULL)
|
if (dpi->current_template != NULL)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,7 @@ cplus_demangle_fill_component (struct demangle_component *p,
|
||||||
case DEMANGLE_COMPONENT_IMAGINARY:
|
case DEMANGLE_COMPONENT_IMAGINARY:
|
||||||
case DEMANGLE_COMPONENT_VENDOR_TYPE:
|
case DEMANGLE_COMPONENT_VENDOR_TYPE:
|
||||||
case DEMANGLE_COMPONENT_CAST:
|
case DEMANGLE_COMPONENT_CAST:
|
||||||
|
case DEMANGLE_COMPONENT_CONVERSION:
|
||||||
if (right != NULL)
|
if (right != NULL)
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -4386,3 +4386,26 @@ _QueueNotification_QueueController__$4PPPPPPPM_A_INotice___Z
|
||||||
--format=gnu-v3
|
--format=gnu-v3
|
||||||
_Z1fSsB3fooS_
|
_Z1fSsB3fooS_
|
||||||
f(std::string[abi:foo], std::string[abi:foo])
|
f(std::string[abi:foo], std::string[abi:foo])
|
||||||
|
#
|
||||||
|
# These two are from gcc PR61321, and gcc PR61233 / gdb PR16957
|
||||||
|
#
|
||||||
|
--format=gnu-v3
|
||||||
|
_Z13function_tempIiEv1AIXszcvT_Li999EEE
|
||||||
|
void function_temp<int>(A<sizeof ((int)(999))>)
|
||||||
|
#
|
||||||
|
--format=gnu-v3
|
||||||
|
_Z7ZipWithI7QStringS0_5QListZN4oral6detail16AdaptCreateTableI7AccountEES0_RKNS3_16CachedFieldsDataEEUlRKS0_SA_E_ET1_IDTclfp1_cvT__EcvT0__EEEERKT1_ISC_ERKT1_ISD_ET2_
|
||||||
|
QList<decltype ({parm#3}((QString)(), (QString)()))> ZipWith<QString, QString, QList, QString oral::detail::AdaptCreateTable<Account>(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}>(QList<QString oral::detail::AdaptCreateTable<Account>(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}> const&, QList<QList> const&, QString oral::detail::AdaptCreateTable<Account>(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1})
|
||||||
|
#
|
||||||
|
# These three are symbols generated by g++'s testsuite, which triggered the same bug as above.
|
||||||
|
--format=gnu-v3
|
||||||
|
_Z14int_if_addableI1YERiP1AIXszpldecvPT_Li0EdecvS4_Li0EEE
|
||||||
|
int& int_if_addable<Y>(A<sizeof ((*((Y*)(0)))+(*((Y*)(0))))>*)
|
||||||
|
#
|
||||||
|
--format=gnu-v3
|
||||||
|
_Z3bazIiEvP1AIXszcl3foocvT__ELCf00000000_00000000EEEE
|
||||||
|
void baz<int>(A<sizeof (foo((int)(), (floatcomplex )00000000_00000000))>*)
|
||||||
|
#
|
||||||
|
--format=gnu-v3
|
||||||
|
_Z3fooI1FEN1XIXszdtcl1PclcvT__EEE5arrayEE4TypeEv
|
||||||
|
X<sizeof ((P(((F)())())).array)>::Type foo<F>()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue