Commit 5d69ba1f by Mark Mitchell Committed by Mark Mitchell

re PR c++/7112 (Regression: ICE on C++ code involving templates and sizeof)

	PR c++/7112
	* g++.dg/template/sizeof2.C: New test.

	PR c++/7112
	* mangle.c (write_expression): Add mangling for sizeof when
	applied to a type.
	* operators.def: Remove stale comment.

	* cp-demangle.c (demangle_operator_name): Add type_arg parameter.
	Set it for the "st" operator.
	(demangle_expression): Handle expressions with types as arguments.

From-SVN: r55169
parent 68a830fe
2002-07-01 Mark Mitchell <mark@codesourcery.com>
PR c++/7112
* mangle.c (write_expression): Add mangling for sizeof when
applied to a type.
* operators.def: Remove stale comment.
2002-06-30 Nathan Sidwell <nathan@codesourcery.com> 2002-06-30 Nathan Sidwell <nathan@codesourcery.com>
* cp-tree.h (CPTI_TINFO_DECL_TYPE): Replace with ... * cp-tree.h (CPTI_TINFO_DECL_TYPE): Replace with ...
......
...@@ -1834,6 +1834,12 @@ write_expression (expr) ...@@ -1834,6 +1834,12 @@ write_expression (expr)
write_mangled_name (expr); write_mangled_name (expr);
write_char ('E'); write_char ('E');
} }
else if (TREE_CODE (expr) == SIZEOF_EXPR
&& TYPE_P (TREE_OPERAND (expr, 0)))
{
write_string ("st");
write_type (TREE_OPERAND (expr, 0));
}
else else
{ {
int i; int i;
...@@ -1872,6 +1878,7 @@ write_expression (expr) ...@@ -1872,6 +1878,7 @@ write_expression (expr)
write_expression (TREE_OPERAND (expr, 0)); write_expression (TREE_OPERAND (expr, 0));
break; break;
/* Handle pointers-to-members specially. */ /* Handle pointers-to-members specially. */
case SCOPE_REF: case SCOPE_REF:
write_type (TREE_OPERAND (expr, 0)); write_type (TREE_OPERAND (expr, 0));
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
non-overloadable operators (like the `?:' ternary operator). non-overloadable operators (like the `?:' ternary operator).
Writtey by Mark Mitchell <mark@codesourcery.com> Writtey by Mark Mitchell <mark@codesourcery.com>
Copyright (C) 2000, 2001 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -46,10 +46,6 @@ Boston, MA 02111-1307, USA. */ ...@@ -46,10 +46,6 @@ Boston, MA 02111-1307, USA. */
mangled under the new ABI. For `operator +', for example, this mangled under the new ABI. For `operator +', for example, this
would be "pl". would be "pl".
OLD_MANGLING
Analogous, but for the old ABI.
ARITY ARITY
The arity of the operator, or -1 if any arity is allowed. (As The arity of the operator, or -1 if any arity is allowed. (As
......
2002-07-01 Mark Mitchell <mark@codesourcery.com>
PR c++/7112
* g++.dg/template/sizeof2.C: New test.
2002-07-01 Neil Booth <neil@daikokuya.co.uk> 2002-07-01 Neil Booth <neil@daikokuya.co.uk>
* gcc.dg/cpp/trad/cmdlne-dD.c, gcc.dg/cpp/trad/cmdlne-dM.c, * gcc.dg/cpp/trad/cmdlne-dD.c, gcc.dg/cpp/trad/cmdlne-dM.c,
......
2002-07-01 Mark Mitchell <mark@codesourcery.com>
* cp-demangle.c (demangle_operator_name): Add type_arg parameter.
Set it for the "st" operator.
(demangle_expression): Handle expressions with types as arguments.
2002-06-30 Douglas Rupp <rupp@gnat.com> 2002-06-30 Douglas Rupp <rupp@gnat.com>
* configure.in (OUTPUT_OPTION,NO_MINUS_C_MINUS_O): Configure. * configure.in (OUTPUT_OPTION,NO_MINUS_C_MINUS_O): Configure.
......
...@@ -898,7 +898,7 @@ static status_t demangle_number_literally ...@@ -898,7 +898,7 @@ static status_t demangle_number_literally
static status_t demangle_identifier static status_t demangle_identifier
PARAMS ((demangling_t, int, dyn_string_t)); PARAMS ((demangling_t, int, dyn_string_t));
static status_t demangle_operator_name static status_t demangle_operator_name
PARAMS ((demangling_t, int, int *)); PARAMS ((demangling_t, int, int *, int *));
static status_t demangle_nv_offset static status_t demangle_nv_offset
PARAMS ((demangling_t)); PARAMS ((demangling_t));
static status_t demangle_v_offset static status_t demangle_v_offset
...@@ -1325,7 +1325,7 @@ demangle_unqualified_name (dm, suppress_return_type) ...@@ -1325,7 +1325,7 @@ demangle_unqualified_name (dm, suppress_return_type)
if (peek == 'c' && peek_char_next (dm) == 'v') if (peek == 'c' && peek_char_next (dm) == 'v')
*suppress_return_type = 1; *suppress_return_type = 1;
RETURN_IF_ERROR (demangle_operator_name (dm, 0, &num_args)); RETURN_IF_ERROR (demangle_operator_name (dm, 0, &num_args, NULL));
} }
else if (peek == 'C' || peek == 'D') else if (peek == 'C' || peek == 'D')
{ {
...@@ -1501,7 +1501,9 @@ demangle_identifier (dm, length, identifier) ...@@ -1501,7 +1501,9 @@ demangle_identifier (dm, length, identifier)
/* Demangles and emits an <operator-name>. If SHORT_NAME is non-zero, /* Demangles and emits an <operator-name>. If SHORT_NAME is non-zero,
the short form is emitted; otherwise the full source form the short form is emitted; otherwise the full source form
(`operator +' etc.) is emitted. *NUM_ARGS is set to the number of (`operator +' etc.) is emitted. *NUM_ARGS is set to the number of
operands that the operator takes. operands that the operator takes. If TYPE_ARG is non-NULL,
*TYPE_ARG is set to 1 if the first argument is a type and 0
otherwise.
<operator-name> <operator-name>
::= nw # new ::= nw # new
...@@ -1551,15 +1553,17 @@ demangle_identifier (dm, length, identifier) ...@@ -1551,15 +1553,17 @@ demangle_identifier (dm, length, identifier)
::= cl # () ::= cl # ()
::= ix # [] ::= ix # []
::= qu # ? ::= qu # ?
::= sz # sizeof ::= st # sizeof (a type)
::= sz # sizeof (an expression)
::= cv <type> # cast ::= cv <type> # cast
::= v [0-9] <source-name> # vendor extended operator */ ::= v [0-9] <source-name> # vendor extended operator */
static status_t static status_t
demangle_operator_name (dm, short_name, num_args) demangle_operator_name (dm, short_name, num_args, type_arg)
demangling_t dm; demangling_t dm;
int short_name; int short_name;
int *num_args; int *num_args;
int *type_arg;
{ {
struct operator_code struct operator_code
{ {
...@@ -1633,6 +1637,10 @@ demangle_operator_name (dm, short_name, num_args) ...@@ -1633,6 +1637,10 @@ demangle_operator_name (dm, short_name, num_args)
DEMANGLE_TRACE ("operator-name", dm); DEMANGLE_TRACE ("operator-name", dm);
/* Assume the first argument is not a type. */
if (type_arg)
*type_arg = 0;
/* Is this a vendor-extended operator? */ /* Is this a vendor-extended operator? */
if (c0 == 'v' && IS_DIGIT (c1)) if (c0 == 'v' && IS_DIGIT (c1))
{ {
...@@ -1652,6 +1660,16 @@ demangle_operator_name (dm, short_name, num_args) ...@@ -1652,6 +1660,16 @@ demangle_operator_name (dm, short_name, num_args)
return STATUS_OK; return STATUS_OK;
} }
/* Is it the sizeof variant that takes a type? */
if (c0 == 's' && c1 == 't')
{
RETURN_IF_ERROR (result_add (dm, " sizeof"));
*num_args = 1;
if (type_arg)
*type_arg = 1;
return STATUS_OK;
}
/* Perform a binary search for the operator code. */ /* Perform a binary search for the operator code. */
while (1) while (1)
{ {
...@@ -3154,6 +3172,7 @@ demangle_expression (dm) ...@@ -3154,6 +3172,7 @@ demangle_expression (dm)
/* An operator expression. */ /* An operator expression. */
{ {
int num_args; int num_args;
int type_arg;
status_t status = STATUS_OK; status_t status = STATUS_OK;
dyn_string_t operator_name; dyn_string_t operator_name;
...@@ -3161,7 +3180,8 @@ demangle_expression (dm) ...@@ -3161,7 +3180,8 @@ demangle_expression (dm)
operations in infix notation, capture the operator name operations in infix notation, capture the operator name
first. */ first. */
RETURN_IF_ERROR (result_push (dm)); RETURN_IF_ERROR (result_push (dm));
RETURN_IF_ERROR (demangle_operator_name (dm, 1, &num_args)); RETURN_IF_ERROR (demangle_operator_name (dm, 1, &num_args,
&type_arg));
operator_name = (dyn_string_t) result_pop (dm); operator_name = (dyn_string_t) result_pop (dm);
/* If it's binary, do an operand first. */ /* If it's binary, do an operand first. */
...@@ -3182,6 +3202,9 @@ demangle_expression (dm) ...@@ -3182,6 +3202,9 @@ demangle_expression (dm)
/* Emit its second (if binary) or only (if unary) operand. */ /* Emit its second (if binary) or only (if unary) operand. */
RETURN_IF_ERROR (result_add_char (dm, '(')); RETURN_IF_ERROR (result_add_char (dm, '('));
if (type_arg)
RETURN_IF_ERROR (demangle_type (dm));
else
RETURN_IF_ERROR (demangle_expression (dm)); RETURN_IF_ERROR (demangle_expression (dm));
RETURN_IF_ERROR (result_add_char (dm, ')')); RETURN_IF_ERROR (result_add_char (dm, ')'));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment