mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
68a830fe3a
commit
5d69ba1faa
|
@ -1,3 +1,10 @@
|
||||||
|
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)
|
||||||
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)
|
||||||
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 @@
|
||||||
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. */
|
||||||
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
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
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,
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
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
|
||||||
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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
::= 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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
|
|
||||||
/* 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, ')'));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue