OSDN Git Service

PR c++/9298
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Jan 2003 22:24:30 +0000 (22:24 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Jan 2003 22:24:30 +0000 (22:24 +0000)
* parser.c (cp_parser_consume_semicolon_at_end_of_statement): New
function.
(cp_parser_expression_statement): Use it.
(cp_parser_explicit_instantiation): Likewise.
* pt.c (do_decl_instantiation): Improve error handling logic.

PR c++/9298
* g++.dg/parse/template1.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61618 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 02262fd..f871077 100644 (file)
@@ -1,5 +1,14 @@
 2003-01-22  Mark Mitchell  <mark@codesourcery.com>
 
+       PR c++/9298
+       * parser.c (cp_parser_consume_semicolon_at_end_of_statement): New
+       function.
+       (cp_parser_expression_statement): Use it.
+       (cp_parser_explicit_instantiation): Likewise.
+       * pt.c (do_decl_instantiation): Improve error handling logic.
+       
+2003-01-22  Mark Mitchell  <mark@codesourcery.com>
+
        PR c++/9384
        * parser.c (cp_parser_using_declaration): Issue error messages
        about name resolution failures here.
index 7f4eeaf..d64f0b4 100644 (file)
@@ -1766,6 +1766,8 @@ static bool cp_parser_skip_to_closing_parenthesis_or_comma
   (cp_parser *);
 static void cp_parser_skip_to_end_of_statement
   PARAMS ((cp_parser *));
+static void cp_parser_consume_semicolon_at_end_of_statement
+  (cp_parser *);
 static void cp_parser_skip_to_end_of_block_or_statement
   PARAMS ((cp_parser *));
 static void cp_parser_skip_to_closing_brace
@@ -2107,6 +2109,25 @@ cp_parser_skip_to_end_of_statement (parser)
     }
 }
 
+/* This function is called at the end of a statement or declaration.
+   If the next token is a semicolon, it is consumed; otherwise, error
+   recovery is attempted.  */
+
+static void
+cp_parser_consume_semicolon_at_end_of_statement (cp_parser *parser)
+{
+  /* Look for the trailing `;'.  */
+  if (!cp_parser_require (parser, CPP_SEMICOLON, "`;'"))
+    {
+      /* If there is additional (erroneous) input, skip to the end of
+        the statement.  */
+      cp_parser_skip_to_end_of_statement (parser);
+      /* If the next token is now a `;', consume it.  */
+      if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
+       cp_lexer_consume_token (parser->lexer);
+    }
+}
+
 /* Skip tokens until we have consumed an entire block, or until we
    have consumed a non-nested `;'.  */
 
@@ -5628,15 +5649,7 @@ cp_parser_expression_statement (parser)
       statement = NULL_TREE;
     }
   /* Consume the final `;'.  */
-  if (!cp_parser_require (parser, CPP_SEMICOLON, "`;'"))
-    {
-      /* If there is additional (erroneous) input, skip to the end of
-        the statement.  */
-      cp_parser_skip_to_end_of_statement (parser);
-      /* If the next token is now a `;', consume it.  */
-      if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
-       cp_lexer_consume_token (parser->lexer);
-    }
+  cp_parser_consume_semicolon_at_end_of_statement (parser);
 
   return statement;
 }
@@ -8256,8 +8269,7 @@ cp_parser_explicit_instantiation (parser)
   /* Trun access control back on.  */
   scope_chain->check_access = flag_access_control;
 
-  /* Look for the trailing `;'.  */
-  cp_parser_require (parser, CPP_SEMICOLON, "`;'");
+  cp_parser_consume_semicolon_at_end_of_statement (parser);
 }
 
 /* Parse an explicit-specialization.
index 9f391eb..ca75cb0 100644 (file)
@@ -10219,9 +10219,9 @@ do_decl_instantiation (tree decl, tree storage)
         should handle VAR_DECLs as it currently handles
         FUNCTION_DECLs.  */
       result = lookup_field (DECL_CONTEXT (decl), DECL_NAME (decl), 0, 0);
-      if (result && TREE_CODE (result) != VAR_DECL)
+      if (!result || TREE_CODE (result) != VAR_DECL)
        {
-         error ("no matching template for `%D' found", result);
+         error ("no matching template for `%D' found", decl);
          return;
        }
     }
index 1bc7453..fed915c 100644 (file)
@@ -1,5 +1,8 @@
 2003-01-22  Mark Mitchell  <mark@codesourcery.com>
 
+       PR c++/9298
+       * g++.dg/parse/template1.C: New test.
+
        PR c++/9384
        * g++.dg/parse/using1.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/parse/template1.C b/gcc/testsuite/g++.dg/parse/template1.C
new file mode 100644 (file)
index 0000000..d7bbb07
--- /dev/null
@@ -0,0 +1,11 @@
+struct CPU {
+    typedef int (*pfun)();
+
+    template <pfun step1>
+    static int dispatch();
+};
+
+template<int>
+static int foo();
+
+template int CPU::dispatch<&template foo<2> > (); // { dg-error "" }