re PR c++/18757 (ICE (on invalid) in get_innermost_template_args)
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 1 Feb 2005 05:56:08 +0000 (05:56 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 1 Feb 2005 05:56:08 +0000 (05:56 +0000)
gcc/cp/ChangeLog:
PR c++/18757
PR c++/19366
PR c++/19499
* parser.c (cp_parser_template_id): Revert 2004-12-09's patch.
Issue an error when creating the template id.
* pt.c (fn_type_unification): Return early if the explicit
template arg list is an error_mark_node.
gcc/testsuite/ChangeLog:
* g++.dg/parse/typename7.C: Adjust error messages.

From-SVN: r94520

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/typename7.C

index 92cebfa..2aa42c1 100644 (file)
@@ -1,3 +1,13 @@
+2005-02-01  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR c++/18757
+       PR c++/19366
+       PR c++/19499
+       * parser.c (cp_parser_template_id): Revert 2004-12-09's patch.
+       Issue an error when creating the template id.
+       * pt.c (fn_type_unification): Return early if the explicit
+       template arg list is an error_mark_node.
+
 2005-01-31  Mark Mitchell  <mark@codesourcery.com>
 
        * decl.c (build_enumerator): Do not issue duplicate error messages
index e5ea069..473d205 100644 (file)
@@ -8514,7 +8514,7 @@ cp_parser_template_id (cp_parser *parser,
      error messages about problems during instantiation of the
      template.  Do so only if parsing succeeded, otherwise we may
      silently accept template arguments with syntax errors.  */
-  if (start_of_id && !cp_parser_error_occurred (parser))
+  if (start_of_id)
     {
       cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
       
@@ -8525,6 +8525,13 @@ cp_parser_template_id (cp_parser *parser,
       
       /* Purge all subsequent tokens.  */
       cp_lexer_purge_tokens_after (parser->lexer, start_of_id);
+
+      /* ??? Can we actually assume that, if template_id ==
+        error_mark_node, we will have issued a diagnostic to the
+        user, as opposed to simply marking the tentative parse as
+        failed?  */
+      if (cp_parser_error_occurred (parser) && template_id != error_mark_node)
+       error ("parse error in template argument list");
     }
 
   pop_deferring_access_checks ();
index 176e6a3..3252f36 100644 (file)
@@ -9123,6 +9123,9 @@ fn_type_unification (tree fn,
       tree converted_args;
       bool incomplete;
 
+      if (explicit_targs == error_mark_node)
+       return 1;
+
       converted_args
        = (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (fn), 
                                  explicit_targs, NULL_TREE, tf_none, 
index b697d41..defd090 100644 (file)
@@ -1,3 +1,7 @@
+2005-02-01  Alexandre Oliva  <aoliva@redhat.com>
+
+       * g++.dg/parse/typename7.C: Adjust error messages.
+
 2005-01-31  Jeff Law  <law@redhat.com>
 
        * gcc.c-torture/execute/20050131-1.c: New test.
index 2119317..56fcc74 100644 (file)
@@ -9,23 +9,23 @@ struct A
 {
   template<typename>   void foo(int);
   template<typename T> void bar(T t) {
-    this->foo<typename T>(t); } // { dg-error "expected" }
+    this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
   template<typename T> void bad(T t) {
-    foo<typename T>(t); } // { dg-error "expected" }
+    foo<typename T>(t); } // { dg-error "expected|parse error" }
 };
 
 template <typename T>
 struct B
 {
   void bar(T t) {
-    A().bar<typename T>(t); } // { dg-error "expected" }
+    A().bar<typename T>(t); } // { dg-error "expected|parse error|no matching" }
   void bad(T t) {
     B<typename T>::bar(t); } // { dg-error "invalid|not a template" }
 };
 
 void baz()
 {
-    A().bar(0);
-    A().bad(0);
-    B<int>().bar(0);
+  A().bar(0);
+  A().bad(0);
+  B<int>().bar(0);
 }