mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
936fd13c5b
commit
4e26ba9022
|
@ -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>
|
2011-05-24 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
* godump.c (go_define): Don't accept a string immediately after
|
* godump.c (go_define): Don't accept a string immediately after
|
||||||
|
|
|
@ -6945,7 +6945,7 @@ c_parser_objc_class_instance_variables (c_parser *parser)
|
||||||
if (c_parser_next_token_is (parser, CPP_SEMICOLON))
|
if (c_parser_next_token_is (parser, CPP_SEMICOLON))
|
||||||
{
|
{
|
||||||
pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
|
pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
|
||||||
"extra semicolon in struct or union specified");
|
"extra semicolon");
|
||||||
c_parser_consume_token (parser);
|
c_parser_consume_token (parser);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -6988,13 +6988,34 @@ c_parser_objc_class_instance_variables (c_parser *parser)
|
||||||
|
|
||||||
/* Parse some comma-separated declarations. */
|
/* Parse some comma-separated declarations. */
|
||||||
decls = c_parser_struct_declaration (parser);
|
decls = c_parser_struct_declaration (parser);
|
||||||
{
|
if (decls == NULL)
|
||||||
/* Comma-separated instance variables are chained together in
|
{
|
||||||
reverse order; add them one by one. */
|
/* There is a syntax error. We want to skip the offending
|
||||||
tree ivar = nreverse (decls);
|
tokens up to the next ';' (included) or '}'
|
||||||
for (; ivar; ivar = DECL_CHAIN (ivar))
|
(excluded). */
|
||||||
objc_add_instance_variable (copy_node (ivar));
|
|
||||||
}
|
/* 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 %<;%>");
|
c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
2011-05-24 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
PR c++/48884
|
PR c++/48884
|
||||||
|
|
|
@ -22494,7 +22494,8 @@ cp_parser_objc_class_ivars (cp_parser* parser)
|
||||||
NULL_TREE, attributes);
|
NULL_TREE, attributes);
|
||||||
|
|
||||||
/* Add the instance variable. */
|
/* 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. */
|
/* Reset PREFIX_ATTRIBUTES. */
|
||||||
while (attributes && TREE_CHAIN (attributes) != first_attribute)
|
while (attributes && TREE_CHAIN (attributes) != first_attribute)
|
||||||
|
|
|
@ -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>
|
2011-05-24 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
* g++.dg/template/access21.C: New.
|
* g++.dg/template/access21.C: New.
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue