In gcc/: 2011-05-24 Nicola Pero <nicola.pero@meta-innovation.com>

In gcc/:
2011-05-24  Nicola Pero  <nicola.pero@meta-innovation.com>

	PR objc/48187
	* c-parser.c (c_parser_objc_class_instance_variables): More robust
	parsing of syntax error in ObjC instance variable lists.  In
	particular, avoid an infinite loop if there is a stray ']'.
	Updated error message.

In gcc/cp/:
2011-05-24  Nicola Pero  <nicola.pero@meta-innovation.com>,

	* parser.c (cp_parser_objc_class_ivars): Deal gracefully with a
	syntax error in declaring an ObjC instance variable.

In gcc/testsuite/:
2011-05-24  Nicola Pero  <nicola.pero@meta-innovation.com>

	PR objc/48187
	* objc.dg/pr48187.m: New testcase.
	* obj-c++.dg/pr48187.mm: New testcase.
	* objc.dg/ivar-extra-semicolon.m: New testcase.

From-SVN: r174142
This commit is contained in:
Nicola Pero 2011-05-24 21:29:35 +00:00
parent 936fd13c5b
commit 4e26ba9022
8 changed files with 144 additions and 9 deletions

View file

@ -1,3 +1,11 @@
2011-05-24 Nicola Pero <nicola.pero@meta-innovation.com>
PR objc/48187
* c-parser.c (c_parser_objc_class_instance_variables): More robust
parsing of syntax error in ObjC instance variable lists. In
particular, avoid an infinite loop if there is a stray ']'.
Updated error message.
2011-05-24 Ian Lance Taylor <iant@google.com>
* godump.c (go_define): Don't accept a string immediately after

View file

@ -6945,7 +6945,7 @@ c_parser_objc_class_instance_variables (c_parser *parser)
if (c_parser_next_token_is (parser, CPP_SEMICOLON))
{
pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
"extra semicolon in struct or union specified");
"extra semicolon");
c_parser_consume_token (parser);
continue;
}
@ -6988,13 +6988,34 @@ c_parser_objc_class_instance_variables (c_parser *parser)
/* Parse some comma-separated declarations. */
decls = c_parser_struct_declaration (parser);
{
/* Comma-separated instance variables are chained together in
reverse order; add them one by one. */
tree ivar = nreverse (decls);
for (; ivar; ivar = DECL_CHAIN (ivar))
objc_add_instance_variable (copy_node (ivar));
}
if (decls == NULL)
{
/* There is a syntax error. We want to skip the offending
tokens up to the next ';' (included) or '}'
(excluded). */
/* First, skip manually a ')' or ']'. This is because they
reduce the nesting level, so c_parser_skip_until_found()
wouldn't be able to skip past them. */
c_token *token = c_parser_peek_token (parser);
if (token->type == CPP_CLOSE_PAREN || token->type == CPP_CLOSE_SQUARE)
c_parser_consume_token (parser);
/* Then, do the standard skipping. */
c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
/* We hopefully recovered. Start normal parsing again. */
parser->error = false;
continue;
}
else
{
/* Comma-separated instance variables are chained together
in reverse order; add them one by one. */
tree ivar = nreverse (decls);
for (; ivar; ivar = DECL_CHAIN (ivar))
objc_add_instance_variable (copy_node (ivar));
}
c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
}
}

View file

@ -1,3 +1,8 @@
2011-05-24 Nicola Pero <nicola.pero@meta-innovation.com>,
* parser.c (cp_parser_objc_class_ivars): Deal gracefully with a
syntax error in declaring an ObjC instance variable.
2011-05-24 Jason Merrill <jason@redhat.com>
PR c++/48884

View file

@ -22494,7 +22494,8 @@ cp_parser_objc_class_ivars (cp_parser* parser)
NULL_TREE, attributes);
/* Add the instance variable. */
objc_add_instance_variable (decl);
if (decl != error_mark_node && decl != NULL_TREE)
objc_add_instance_variable (decl);
/* Reset PREFIX_ATTRIBUTES. */
while (attributes && TREE_CHAIN (attributes) != first_attribute)

View file

@ -1,3 +1,10 @@
2011-05-24 Nicola Pero <nicola.pero@meta-innovation.com>
PR objc/48187
* objc.dg/pr48187.m: New testcase.
* obj-c++.dg/pr48187.mm: New testcase.
* objc.dg/ivar-extra-semicolon.m: New testcase.
2011-05-24 Jason Merrill <jason@redhat.com>
* g++.dg/template/access21.C: New.

View file

@ -0,0 +1,39 @@
/* { dg-do compile } */
@interface A
{
] /* { dg-error "xpected" } */
}
@end
@interface B
{
]; /* { dg-error "xpected" } */
}
@end
@interface C
{
]; /* { dg-error "xpected" } */
int x;
}
@end
@interface D
{
(
} /* { dg-error "xpected" } */
@end
@interface E
{
(; /* { dg-error "xpected" } */
}
@end
@interface F
{
(; /* { dg-error "xpected" } */
int x;
}
@end

View file

@ -0,0 +1,15 @@
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, May 2011. */
/* { dg-do compile } */
/* { dg-options "-pedantic" } */
#include <objc/objc.h>
@interface MyClass
{
; /* { dg-warning "extra semicolon" } */
int a;
; /* { dg-warning "extra semicolon" } */
int b;
; /* { dg-warning "extra semicolon" } */
}
@end

View file

@ -0,0 +1,39 @@
/* { dg-do compile } */
@interface A
{
] /* { dg-error "xpected" } */
}
@end
@interface B
{
]; /* { dg-error "xpected" } */
}
@end
@interface C
{
]; /* { dg-error "xpected" } */
int x;
}
@end
@interface D
{
) /* { dg-error "xpected" } */
}
@end
@interface E
{
); /* { dg-error "xpected" } */
}
@end
@interface F
{
); /* { dg-error "xpected" } */
int x;
}
@end