re PR c++/39054 (ICE with invalid pseudo-dtor in template)
authorJason Merrill <jason@redhat.com>
Mon, 2 Feb 2009 18:38:10 +0000 (13:38 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 2 Feb 2009 18:38:10 +0000 (13:38 -0500)
        PR c++/39054
        * parser.c (cp_parser_unqualified_id): Don't wrap error_mark_node
        in BIT_NOT_EXPR.

From-SVN: r143876

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/dtor14.C [new file with mode: 0644]

index eeec03d466fe4b8adb78b881771ac9eee626483d..50fe9c2cbd95b58566bdbfa6f0f36a14ed988d2d 100644 (file)
@@ -1,3 +1,9 @@
+2009-02-02  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39054
+       * parser.c (cp_parser_unqualified_id): Don't wrap error_mark_node 
+       in BIT_NOT_EXPR.
+
 2009-02-01  Paolo Carlini  <paolo.carlini@oracle.com>
 
         PR c++/39053
index 5675e9bca12a777c702ab63e3d38bfcbd1a43a48..138fe427b31b3e8157c1e090fdc1bab7bdda4efb 100644 (file)
@@ -3896,7 +3896,9 @@ cp_parser_unqualified_id (cp_parser* parser,
                /* We couldn't find a type with this name, so just accept
                   it and check for a match at instantiation time.  */
                type_decl = cp_parser_identifier (parser);
-               return build_nt (BIT_NOT_EXPR, type_decl);
+               if (type_decl != error_mark_node)
+                 type_decl = build_nt (BIT_NOT_EXPR, type_decl);
+               return type_decl;
              }
          }
        /* If an error occurred, assume that the name of the
index 828af3fad7ab4a71b6bfa458d9de644af9588702..d6adb2e072dcca272a7cb0eca9d49ec8e1434cc5 100644 (file)
@@ -1,3 +1,8 @@
+2009-02-02  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39054
+       * g++.dg/parse/dtor14.C: New test.
+
 2009-02-02  Jakub Jelinek  <jakub@redhat.com>
 
        * lib/target-supports.exp
diff --git a/gcc/testsuite/g++.dg/parse/dtor14.C b/gcc/testsuite/g++.dg/parse/dtor14.C
new file mode 100644 (file)
index 0000000..6ba7a5b
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/39054
+
+struct A {};
+
+template<typename> void foo()
+{ 
+  A().~int();                  // { dg-error "expected" }
+}