re PR c++/8720 (ICE with bitwise or (3 operands))
authorMark Mitchell <mark@codesourcery.com>
Tue, 3 Dec 2002 06:52:25 +0000 (06:52 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 3 Dec 2002 06:52:25 +0000 (06:52 +0000)
PR c++/8720
* spew.c (remove_last_token): Make sure that last_chunk is set
correctly.

PR c++/8615
* error.c (dump_expr): Handle character constants with
TREE_OVERFLOW set.

PR c++/8720
* g++.dg/parse/defarg1.C: New test.

PR c++/8615
* g++.dg/template/char1.C: New test.

From-SVN: r59757

gcc/cp/ChangeLog
gcc/cp/error.c
gcc/cp/spew.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/defarg1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/char1.C [new file with mode: 0644]

index 2ade3e3..befdf12 100644 (file)
@@ -1,3 +1,13 @@
+2002-12-02  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/8720
+       * spew.c (remove_last_token): Make sure that last_chunk is set
+       correctly.
+
+       PR c++/8615
+       * error.c (dump_expr): Handle character constants with
+       TREE_OVERFLOW set.
+       
 2002-12-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        DR 180
index 872a556..495320d 100644 (file)
@@ -1473,7 +1473,10 @@ dump_expr (t, flags)
        else if (type == char_type_node)
          {
            output_add_character (scratch_buffer, '\'');
-           dump_char (tree_low_cst (t, 0));
+           if (host_integerp (t, TREE_UNSIGNED (type)))
+             dump_char (tree_low_cst (t, TREE_UNSIGNED (type)));
+           else
+             output_printf (scratch_buffer, "\\x%x", TREE_INT_CST_LOW (t));
            output_add_character (scratch_buffer, '\'');
          }
        else
index 380d693..adc3ffd 100644 (file)
@@ -1042,11 +1042,13 @@ remove_last_token (t)
   t->last_pos--;
   if (t->last_pos == 0 && t->last_chunk != t->tokens)
     {
-      struct token_chunk **tc;
-      for (tc = &t->tokens; (*tc)->next != NULL; tc = &(*tc)->next)
-       ;
-      *tc = NULL;
-      t->last_pos = ARRAY_SIZE ((*tc)->toks);
+      struct token_chunk *c;
+      c = t->tokens;
+      while (c->next != t->last_chunk)
+       c = c->next;
+      c->next = NULL;
+      t->last_chunk = c;
+      t->last_pos = ARRAY_SIZE (c->toks);
     }
   return result;
 }
index 68a874e..0c51391 100644 (file)
@@ -4,6 +4,12 @@
 
 2002-12-02  Mark Mitchell  <mark@codesourcery.com>
 
+       PR c++/8720
+       * g++.dg/parse/defarg1.C: New test.
+
+       PR c++/8615
+       * g++.dg/template/char1.C: New test.
+
        * g++.dg/template/varmod1.C: Fix typo.
 
 2002-12-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
diff --git a/gcc/testsuite/g++.dg/parse/defarg1.C b/gcc/testsuite/g++.dg/parse/defarg1.C
new file mode 100644 (file)
index 0000000..77c50e8
--- /dev/null
@@ -0,0 +1,5 @@
+class A
+{
+public:
+    A(int nBits = ((int)0x8) | ((int)0x4) | ((int)0x2));
+};
diff --git a/gcc/testsuite/g++.dg/template/char1.C b/gcc/testsuite/g++.dg/template/char1.C
new file mode 100644 (file)
index 0000000..64ffda8
--- /dev/null
@@ -0,0 +1,4 @@
+template <class CharType, CharType line_terminator = 0>
+class String {};
+
+String<char, 255> s;