mirror of git://gcc.gnu.org/git/gcc.git
cp-demangle.c (cplus_demangle_operators): Add *_cast.
* cp-demangle.c (cplus_demangle_operators): Add *_cast. (op_is_new_cast): New. (d_expression, d_print_comp): Check it. From-SVN: r189630
This commit is contained in:
parent
1ff8c79bc5
commit
aefa74bd2b
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Test mangling of type casts
|
||||||
|
// { dg-options "-fabi-version=0" }
|
||||||
|
// { dg-do compile }
|
||||||
|
|
||||||
|
template<int i> class A {};
|
||||||
|
template<bool b> class B {};
|
||||||
|
|
||||||
|
template<int i> void f(A<i> &, B<bool(i)> &) {}
|
||||||
|
template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
A<1> a;
|
||||||
|
B<true> b;
|
||||||
|
f(a, b);
|
||||||
|
g(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// { dg-final { scan-assembler "\n_?_Z1fILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } }
|
||||||
|
// { dg-final { scan-assembler "\n_?_Z1gILi1EEvR1AIXT_EER1BIXscbT_EE\[: \t\n\]" } }
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
// Test mangling of type casts
|
// Test mangling of type casts
|
||||||
|
// { dg-options "-fabi-version=2" }
|
||||||
// { dg-do compile }
|
// { dg-do compile }
|
||||||
|
|
||||||
template<int i> class A {};
|
template<int i> class A {};
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// Test that debugging backends don't crash on NULLPTR_TYPE.
|
// Test that debugging backends don't crash on NULLPTR_TYPE.
|
||||||
// { dg-options "-std=c++0x" }
|
// { dg-options "-std=c++0x -fabi-version=0" }
|
||||||
|
|
||||||
typedef decltype(nullptr) nullptr_t;
|
typedef decltype(nullptr) nullptr_t;
|
||||||
|
|
||||||
|
|
@ -12,4 +12,4 @@ template <> nullptr_t g(A<nullptr_t>)
|
||||||
nullptr_t local;
|
nullptr_t local;
|
||||||
}
|
}
|
||||||
// { dg-final { scan-assembler "_Z1fDn" } }
|
// { dg-final { scan-assembler "_Z1fDn" } }
|
||||||
// { dg-final { scan-assembler "_Z1gI1AIDnEES1_T_" } }
|
// { dg-final { scan-assembler "_Z1gI1AIDnEEDnT_" } }
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
2012-07-18 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
* cp-demangle.c (cplus_demangle_operators): Add *_cast.
|
||||||
|
(op_is_new_cast): New.
|
||||||
|
(d_expression, d_print_comp): Check it.
|
||||||
|
|
||||||
2012-07-13 Doug Evans <dje@google.com>
|
2012-07-13 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
* filename_cmp.c (filename_hash, filename_eq): New functions.
|
* filename_cmp.c (filename_hash, filename_eq): New functions.
|
||||||
|
|
|
||||||
|
|
@ -1582,11 +1582,13 @@ const struct demangle_operator_info cplus_demangle_operators[] =
|
||||||
{ "an", NL ("&"), 2 },
|
{ "an", NL ("&"), 2 },
|
||||||
{ "at", NL ("alignof "), 1 },
|
{ "at", NL ("alignof "), 1 },
|
||||||
{ "az", NL ("alignof "), 1 },
|
{ "az", NL ("alignof "), 1 },
|
||||||
|
{ "cc", NL ("const_cast"), 2 },
|
||||||
{ "cl", NL ("()"), 2 },
|
{ "cl", NL ("()"), 2 },
|
||||||
{ "cm", NL (","), 2 },
|
{ "cm", NL (","), 2 },
|
||||||
{ "co", NL ("~"), 1 },
|
{ "co", NL ("~"), 1 },
|
||||||
{ "dV", NL ("/="), 2 },
|
{ "dV", NL ("/="), 2 },
|
||||||
{ "da", NL ("delete[] "), 1 },
|
{ "da", NL ("delete[] "), 1 },
|
||||||
|
{ "dc", NL ("dynamic_cast"), 2 },
|
||||||
{ "de", NL ("*"), 1 },
|
{ "de", NL ("*"), 1 },
|
||||||
{ "dl", NL ("delete "), 1 },
|
{ "dl", NL ("delete "), 1 },
|
||||||
{ "ds", NL (".*"), 2 },
|
{ "ds", NL (".*"), 2 },
|
||||||
|
|
@ -1626,8 +1628,10 @@ const struct demangle_operator_info cplus_demangle_operators[] =
|
||||||
{ "qu", NL ("?"), 3 },
|
{ "qu", NL ("?"), 3 },
|
||||||
{ "rM", NL ("%="), 2 },
|
{ "rM", NL ("%="), 2 },
|
||||||
{ "rS", NL (">>="), 2 },
|
{ "rS", NL (">>="), 2 },
|
||||||
|
{ "rc", NL ("reinterpret_cast"), 2 },
|
||||||
{ "rm", NL ("%"), 2 },
|
{ "rm", NL ("%"), 2 },
|
||||||
{ "rs", NL (">>"), 2 },
|
{ "rs", NL (">>"), 2 },
|
||||||
|
{ "sc", NL ("static_cast"), 2 },
|
||||||
{ "st", NL ("sizeof "), 1 },
|
{ "st", NL ("sizeof "), 1 },
|
||||||
{ "sz", NL ("sizeof "), 1 },
|
{ "sz", NL ("sizeof "), 1 },
|
||||||
{ "tr", NL ("throw"), 0 },
|
{ "tr", NL ("throw"), 0 },
|
||||||
|
|
@ -2809,6 +2813,18 @@ d_exprlist (struct d_info *di, char terminator)
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns nonzero iff OP is an operator for a C++ cast: const_cast,
|
||||||
|
dynamic_cast, static_cast or reinterpret_cast. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
op_is_new_cast (struct demangle_component *op)
|
||||||
|
{
|
||||||
|
const char *code = op->u.s_operator.op->code;
|
||||||
|
return (code[1] == 'c'
|
||||||
|
&& (code[0] == 's' || code[0] == 'd'
|
||||||
|
|| code[0] == 'c' || code[0] == 'r'));
|
||||||
|
}
|
||||||
|
|
||||||
/* <expression> ::= <(unary) operator-name> <expression>
|
/* <expression> ::= <(unary) operator-name> <expression>
|
||||||
::= <(binary) operator-name> <expression> <expression>
|
::= <(binary) operator-name> <expression> <expression>
|
||||||
::= <(trinary) operator-name> <expression> <expression> <expression>
|
::= <(trinary) operator-name> <expression> <expression> <expression>
|
||||||
|
|
@ -2971,7 +2987,10 @@ d_expression (struct d_info *di)
|
||||||
struct demangle_component *left;
|
struct demangle_component *left;
|
||||||
struct demangle_component *right;
|
struct demangle_component *right;
|
||||||
|
|
||||||
left = d_expression (di);
|
if (op_is_new_cast (op))
|
||||||
|
left = cplus_demangle_type (di);
|
||||||
|
else
|
||||||
|
left = d_expression (di);
|
||||||
if (!strcmp (code, "cl"))
|
if (!strcmp (code, "cl"))
|
||||||
right = d_exprlist (di, 'E');
|
right = d_exprlist (di, 'E');
|
||||||
else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
|
else if (!strcmp (code, "dt") || !strcmp (code, "pt"))
|
||||||
|
|
@ -4455,6 +4474,17 @@ d_print_comp (struct d_print_info *dpi, int options,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (op_is_new_cast (d_left (dc)))
|
||||||
|
{
|
||||||
|
d_print_expr_op (dpi, options, d_left (dc));
|
||||||
|
d_append_char (dpi, '<');
|
||||||
|
d_print_comp (dpi, options, d_left (d_right (dc)));
|
||||||
|
d_append_string (dpi, ">(");
|
||||||
|
d_print_comp (dpi, options, d_right (d_right (dc)));
|
||||||
|
d_append_char (dpi, ')');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* We wrap an expression which uses the greater-than operator in
|
/* We wrap an expression which uses the greater-than operator in
|
||||||
an extra layer of parens so that it does not get confused
|
an extra layer of parens so that it does not get confused
|
||||||
with the '>' which ends the template parameters. */
|
with the '>' which ends the template parameters. */
|
||||||
|
|
|
||||||
|
|
@ -4081,6 +4081,9 @@ decltype (new auto({parm#1})) f<int>(int)
|
||||||
--format=gnu-v3
|
--format=gnu-v3
|
||||||
_Z1fIiERDaRKT_S1_
|
_Z1fIiERDaRKT_S1_
|
||||||
auto& f<int>(int const&, int)
|
auto& f<int>(int const&, int)
|
||||||
|
--format=gnu-v3
|
||||||
|
_Z1gILi1EEvR1AIXT_EER1BIXscbT_EE
|
||||||
|
void g<1>(A<1>&, B<static_cast<bool>(1)>&)
|
||||||
#
|
#
|
||||||
# Ada (GNAT) tests.
|
# Ada (GNAT) tests.
|
||||||
#
|
#
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue