]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/7112 (Regression: ICE on C++ code involving templates and sizeof)
authorMark Mitchell <mark@codesourcery.com>
Tue, 2 Jul 2002 03:14:24 +0000 (03:14 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 2 Jul 2002 03:14:24 +0000 (03:14 +0000)
PR c++/7112
* g++.dg/template/sizeof1.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: r55168

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/cp/operators.def
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/sizeof1.C
libiberty/ChangeLog
libiberty/cp-demangle.c

index 68fa15549bf05264a0b0bad3ffb6d006f98aa987..d65a58eeee0f287f368a68de2ba8cd6376290733 100644 (file)
@@ -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-27  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/6695
index 2e79581487cd1035451ca5b2272c3afe57d1ab42..7bfbb4bc46050763b49b3b4d664446c4a15ed1cf 100644 (file)
@@ -1818,6 +1818,12 @@ write_expression (expr)
       write_mangled_name (expr);
       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
     {
       int i;
@@ -1856,6 +1862,7 @@ write_expression (expr)
          write_expression (TREE_OPERAND (expr, 0));
          break;
 
+         
        /* Handle pointers-to-members specially.  */
        case SCOPE_REF:
          write_type (TREE_OPERAND (expr, 0));
index 775f59db05208d8aba14cdff8e690c2cea804635..85043803f4d9675866c35e042dda07a62f3dd342 100644 (file)
@@ -5,7 +5,7 @@
    non-overloadable operators (like the `?:' ternary operator).  
    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.
 
@@ -46,10 +46,6 @@ Boston, MA 02111-1307, USA.  */
      mangled under the new ABI.  For `operator +', for example, this
      would be "pl".
 
-   OLD_MANGLING
-
-     Analogous, but for the old ABI.
-
    ARITY
    
      The arity of the operator, or -1 if any arity is allowed.  (As
index e5900c5c738e7ea87f16797e512045b553f1913b..78f24d822a54882443a2ee17a17cf465fed97036 100644 (file)
@@ -1,3 +1,8 @@
+2002-07-01  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/7112
+       * g++.dg/template/sizeof1.C: New test.
+
 2002-07-01  Hans-Peter Nilsson  <hp@axis.com>
 
        PR target/7177
index 328d647473cdc5f27caef9df0de49c4e2bd30fc3..76d1cf44c4e3801e50783e1c72e7ab46b5e55708 100644 (file)
@@ -1,15 +1,23 @@
-// Test use of `sizeof' as a template parameter.
-// Origin: smacdonald@seimac.com
-
 // { dg-do compile }
 
-template <unsigned I> struct A {};
+template<int size>
+struct Foobar {
+    // Contents irrelevant
+};
+
+template <typename A>
+struct Wrapper {
+    // Contents irrelevant
+};
 
-template <typename SizeType>
-struct B
+template <typename A>
+Foobar<sizeof(Wrapper<A>)> *
+compiler_bug (A)
 {
-char * f() const
+    return 0;
+}
+
+int main()
 {
-return (A<sizeof(void *)>::value);
+    compiler_bug(1);
 }
-};
index d795263dfe5178d348cb9f1439b55964948fbca3..123242b5008e6d942524ac13ba5a8bc581021783 100644 (file)
@@ -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-05-31  Roman Lechtchinsky  <rl@cs.tu-berlin.de>
 
        * configure.in: Fix typo in the code checking for sys_errlist.
index 53eeaaf32c3fdc36426fae8bc1e955d213e55cf2..162aafca78e37de3cfe3ee967b3cb85dababe815 100644 (file)
@@ -1,5 +1,5 @@
 /* Demangler for IA64 / g++ V3 ABI.
-   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
    Written by Alex Samuel <samuel@codesourcery.com>. 
 
    This file is part of GNU CC.
@@ -898,7 +898,7 @@ static status_t demangle_number_literally
 static status_t demangle_identifier
   PARAMS ((demangling_t, int, dyn_string_t));
 static status_t demangle_operator_name
-  PARAMS ((demangling_t, int, int *));
+  PARAMS ((demangling_t, int, int *, int *));
 static status_t demangle_nv_offset
   PARAMS ((demangling_t));
 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')
        *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')
     {
@@ -1501,7 +1501,9 @@ demangle_identifier (dm, length, identifier)
 /* Demangles and emits an <operator-name>.  If SHORT_NAME is non-zero,
    the short form is emitted; otherwise the full source form
    (`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>
                   ::= nw        # new           
@@ -1551,15 +1553,17 @@ demangle_identifier (dm, length, identifier)
                   ::= cl        # ()            
                   ::= ix        # []            
                   ::= qu        # ?
-                  ::= sz        # sizeof 
+                 ::= st        # sizeof (a type)
+                  ::= sz        # sizeof (an expression)
                   ::= cv <type> # cast        
                  ::= v [0-9] <source-name>  # vendor extended operator  */
 
 static status_t
-demangle_operator_name (dm, short_name, num_args)
+demangle_operator_name (dm, short_name, num_args, type_arg)
      demangling_t dm;
      int short_name;
      int *num_args;
+     int *type_arg;
 {
   struct operator_code
   {
@@ -1633,6 +1637,10 @@ demangle_operator_name (dm, short_name, num_args)
 
   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?  */
   if (c0 == 'v' && IS_DIGIT (c1))
     {
@@ -1652,6 +1660,16 @@ demangle_operator_name (dm, short_name, num_args)
       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.  */
   while (1)
     {
@@ -3154,6 +3172,7 @@ demangle_expression (dm)
     /* An operator expression.  */
     {
       int num_args;
+      int type_arg;
       status_t status = STATUS_OK;
       dyn_string_t operator_name;
 
@@ -3161,7 +3180,8 @@ demangle_expression (dm)
         operations in infix notation, capture the operator name
         first.  */
       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);
 
       /* If it's binary, do an operand first.  */
@@ -3182,7 +3202,10 @@ demangle_expression (dm)
       
       /* Emit its second (if binary) or only (if unary) operand.  */
       RETURN_IF_ERROR (result_add_char (dm, '('));
-      RETURN_IF_ERROR (demangle_expression (dm));
+      if (type_arg)
+       RETURN_IF_ERROR (demangle_type (dm));
+      else
+       RETURN_IF_ERROR (demangle_expression (dm));
       RETURN_IF_ERROR (result_add_char (dm, ')'));
 
       /* The ternary operator takes a third operand.  */