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
8 changed files with 144 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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 %<;%>");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
39
gcc/testsuite/obj-c++.dg/pr48187.mm
Normal file
39
gcc/testsuite/obj-c++.dg/pr48187.mm
Normal 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
|
15
gcc/testsuite/objc.dg/ivar-extra-semicolon.m
Normal file
15
gcc/testsuite/objc.dg/ivar-extra-semicolon.m
Normal 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
|
39
gcc/testsuite/objc.dg/pr48187.m
Normal file
39
gcc/testsuite/objc.dg/pr48187.m
Normal 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
|
Loading…
Add table
Reference in a new issue