Commit 9be4f715 by Marek Polacek Committed by Marek Polacek

re PR c/67784 (Incorrect parsing when using declarations in for loops and typedefs)

	PR c/67784
	* c-parser.c (c_parser_for_statement): Reclassify the token in
	a correct scope.

	* gcc.dg/pr67784-1.c: New test.
	* gcc.dg/pr67784-2.c: New test.

From-SVN: r230273
parent 3f9bdfc3
2015-11-12 Marek Polacek <polacek@redhat.com>
PR c/67784
* c-parser.c (c_parser_for_statement): Reclassify the token in
a correct scope.
2015-11-11 Marek Polacek <polacek@redhat.com>
PR c/68107
......
......@@ -5749,6 +5749,21 @@ c_parser_for_statement (c_parser *parser, bool ivdep)
c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
add_stmt (c_end_compound_stmt (loc, block, flag_isoc99 || c_dialect_objc ()));
/* We might need to reclassify any previously-lexed identifier, e.g.
when we've left a for loop with an if-statement without else in the
body - we might have used a wrong scope for the token. See PR67784. */
if (c_parser_next_token_is (parser, CPP_NAME))
{
c_token *token = c_parser_peek_token (parser);
tree decl = lookup_name (token->value);
if (decl == NULL_TREE)
;
else if (TREE_CODE (decl) == TYPE_DECL)
token->id_kind = C_ID_TYPENAME;
else if (VAR_P (decl))
token->id_kind = C_ID_ID;
}
token_indent_info next_tinfo
= get_token_indent_info (c_parser_peek_token (parser));
warn_for_misleading_indentation (for_tinfo, body_tinfo, next_tinfo);
......
2015-11-12 Marek Polacek <polacek@redhat.com>
PR c/67784
* gcc.dg/pr67784-1.c: New test.
* gcc.dg/pr67784-2.c: New test.
2015-11-12 Martin Liska <mliska@suse.cz>
* gcc.dg/ipa/pr68035.c: New test.
......
/* PR c/67784 */
/* { dg-do compile } */
/* { dg-options "" } */
typedef int T;
void
fn1 (void)
{
for (int T;;)
if (1)
;
T *x;
}
void
fn2 (void)
{
for (int T;;)
if (1)
T = 1;
T *x;
}
void
fn3 (void)
{
for (int T;;)
if (1)
{
}
T *x;
}
void
fn4 (void)
{
for (int T;;)
if (1)
L:
;
T *x;
}
void
fn5 (void)
{
for (int T;;)
if (1)
;
else
;
T *x;
}
/* PR c/67784 */
/* { dg-do compile } */
/* { dg-options "" } */
int T;
void
fn1 (void)
{
for (typedef int T;;) /* { dg-error "declaration of non-variable" } */
if (1)
;
T *x; /* { dg-error "undeclared" } */
}
void
fn2 (void)
{
for (typedef int T;;) /* { dg-error "declaration of non-variable" } */
if (1)
T = 1; /* { dg-error "expected expression" } */
T *x; /* { dg-error "undeclared" } */
}
void
fn3 (void)
{
for (typedef int T;;) /* { dg-error "declaration of non-variable" } */
if (1)
{
}
T *x; /* { dg-error "undeclared" } */
}
void
fn4 (void)
{
for (typedef int T;;) /* { dg-error "declaration of non-variable" } */
if (1)
L:
;
T *x; /* { dg-error "undeclared" } */
}
void
fn5 (void)
{
for (typedef int T;;) /* { dg-error "declaration of non-variable" } */
if (1)
;
else
;
T *x; /* { dg-error "undeclared" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment