* parser.c (cp_parser_skip_until_found): Rename to
cp_parser_skip_to_end_of_template_parameter_list. Remove last two
parameters. Track levels of '< ... >'. Stop at '{', '}', or ';'.
Reorganize. Adjust comment.
(cp_parser_template_declaration_after_export): Adjust call.
(cp_parser_enclosed_template_argument_list): Likewise.
* g++.dg/parse/template20.C: New test.
* g++.dg/template/operator8.C: Remove obsolete part.
* g++.dg/parse/def-tmpl-arg1.C: Adjust error-markers.
* g++.old-deja/g++.pt/crash65.C: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116788
138bc75d-0d04-0410-961f-
82ee72b054a4
+2006-09-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/28858
+ * parser.c (cp_parser_skip_until_found): Rename to
+ cp_parser_skip_to_end_of_template_parameter_list. Remove last two
+ parameters. Track levels of '< ... >'. Stop at '{', '}', or ';'.
+ Reorganize. Adjust comment.
+ (cp_parser_template_declaration_after_export): Adjust call.
+ (cp_parser_enclosed_template_argument_list): Likewise.
+
2006-09-07 Andrew Pinski <pinskia@physics.uc.edu>
PR C++/28906
2006-09-07 Andrew Pinski <pinskia@physics.uc.edu>
PR C++/28906
(cp_parser *);
static void cp_parser_skip_to_closing_brace
(cp_parser *);
(cp_parser *);
static void cp_parser_skip_to_closing_brace
(cp_parser *);
-static void cp_parser_skip_until_found
- (cp_parser *, enum cpp_ttype, const char *);
+static void cp_parser_skip_to_end_of_template_parameter_list
+ (cp_parser *);
static void cp_parser_skip_to_pragma_eol
(cp_parser*, cp_token *);
static bool cp_parser_error_occurred
static void cp_parser_skip_to_pragma_eol
(cp_parser*, cp_token *);
static bool cp_parser_error_occurred
checks = get_deferred_access_checks ();
/* Look for the `>'. */
checks = get_deferred_access_checks ();
/* Look for the `>'. */
- cp_parser_skip_until_found (parser, CPP_GREATER, "`>'");
+ cp_parser_skip_to_end_of_template_parameter_list (parser);
/* We just processed one more parameter list. */
++parser->num_template_parameter_lists;
/* If the next token is `template', there are more template
/* We just processed one more parameter list. */
++parser->num_template_parameter_lists;
/* If the next token is `template', there are more template
- cp_parser_skip_until_found (parser, CPP_GREATER, "`>'");
+ cp_parser_skip_to_end_of_template_parameter_list (parser);
/* The `>' token might be a greater-than operator again now. */
parser->greater_than_is_operator_p
= saved_greater_than_is_operator_p;
/* The `>' token might be a greater-than operator again now. */
parser->greater_than_is_operator_p
= saved_greater_than_is_operator_p;
-/* Like cp_parser_require, except that tokens will be skipped until
- the desired token is found. An error message is still produced if
- the next token is not as expected. */
+/* An error message is produced if the next token is not '>'.
+ All further tokens are skipped until the desired token is
+ found or '{', '}', ';' or an unbalanced ')' or ']'. */
-cp_parser_skip_until_found (cp_parser* parser,
- enum cpp_ttype type,
- const char* token_desc)
+cp_parser_skip_to_end_of_template_parameter_list (cp_parser* parser)
+ /* Current level of '< ... >'. */
+ unsigned level = 0;
+ /* Ignore '<' and '>' nested inside '( ... )' or '[ ... ]'. */
unsigned nesting_depth = 0;
unsigned nesting_depth = 0;
- if (cp_parser_require (parser, type, token_desc))
+ /* Are we ready, yet? If not, issue error message. */
+ if (cp_parser_require (parser, CPP_GREATER, "%<>%>"))
return;
/* Skip tokens until the desired token is found. */
while (true)
{
/* Peek at the next token. */
return;
/* Skip tokens until the desired token is found. */
while (true)
{
/* Peek at the next token. */
- token = cp_lexer_peek_token (parser->lexer);
-
- /* If we've reached the token we want, consume it and stop. */
- if (token->type == type && !nesting_depth)
+ switch (cp_lexer_peek_token (parser->lexer)->type)
- cp_lexer_consume_token (parser->lexer);
- return;
- }
+ case CPP_LESS:
+ if (!nesting_depth)
+ ++level;
+ break;
- switch (token->type)
- {
- case CPP_EOF:
- case CPP_PRAGMA_EOL:
- /* If we've run out of tokens, stop. */
- return;
+ case CPP_GREATER:
+ if (!nesting_depth && level-- == 0)
+ {
+ /* We've reached the token we want, consume it and stop. */
+ cp_lexer_consume_token (parser->lexer);
+ return;
+ }
+ break;
case CPP_OPEN_PAREN:
case CPP_OPEN_SQUARE:
++nesting_depth;
break;
case CPP_OPEN_PAREN:
case CPP_OPEN_SQUARE:
++nesting_depth;
break;
case CPP_CLOSE_PAREN:
case CPP_CLOSE_SQUARE:
if (nesting_depth-- == 0)
return;
break;
case CPP_CLOSE_PAREN:
case CPP_CLOSE_SQUARE:
if (nesting_depth-- == 0)
return;
break;
+ case CPP_EOF:
+ case CPP_PRAGMA_EOL:
+ case CPP_SEMICOLON:
+ case CPP_OPEN_BRACE:
+ case CPP_CLOSE_BRACE:
+ /* The '>' was probably forgotten, don't look further. */
+ return;
+
+2006-09-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/28858
+ * g++.dg/parse/template20.C: New test.
+ * g++.dg/template/operator8.C: Remove obsolete part.
+ * g++.dg/parse/def-tmpl-arg1.C: Adjust error-markers.
+ * g++.old-deja/g++.pt/crash65.C: Likewise.
+
2006-09-07 Andrew Pinski <pinskia@physics.uc.edu>
PR C++/28906
2006-09-07 Andrew Pinski <pinskia@physics.uc.edu>
PR C++/28906
--- /dev/null
+// PR c++/28858
+// { dg-do compile }
+
+template<int N struct A; // { dg-error "before" }
+
+bool i = 1 > 0; // { dg-bogus "" }
+int j = i; // { dg-bogus "" }
{
template<operator+> void foo() {} // { dg-error "identifier|non-function|template arguments" }
};
{
template<operator+> void foo() {} // { dg-error "identifier|non-function|template arguments" }
};
-
-struct B
-{
- template<operator> void foo() {} // { dg-error "identifier|non-function|'void'" }
- template<int> void bar() {} // { dg-error "template arguments" }
-};
-struct W {}; // { dg-error "" } inside template parms
-> struct S{};
+struct W {}; // { dg-error "inside template parameter list|before" }
+> struct S{}; // { dg-error "before" }