aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-parser.c8
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c20
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/obj-c++.dg/invalid-method-2.mm18
-rw-r--r--gcc/testsuite/objc.dg/invalid-method-2.m18
7 files changed, 83 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aec3bbe..2efec7e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-01-08 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ PR objc/47078
+ * c-parser.c (c_parser_objc_type_name): If the type is unknown,
+ for error recovery purposes behave as if it was not specified so
+ that the default type is usd.
+
2011-01-07 Jan Hubicka <jh@suse.cz>
PR tree-optmization/46469
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index 1e868af..cf34e04 100644
--- a/gcc/c-parser.c
+++ b/gcc/c-parser.c
@@ -7482,6 +7482,14 @@ c_parser_objc_type_name (c_parser *parser)
type_name = c_parser_type_name (parser);
if (type_name)
type = groktypename (type_name, NULL, NULL);
+
+ /* If the type is unknown, and error has already been produced and
+ we need to recover from the error. In that case, use NULL_TREE
+ for the type, as if no type had been specified; this will use the
+ default type ('id') which is good for error recovery. */
+ if (type == error_mark_node)
+ type = NULL_TREE;
+
return build_tree_list (quals, type);
}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 35d8864..4cfe3e6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2011-01-08 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ PR objc/47078
+ * parser.c (cp_parser_objc_typename): If the type is unknown, for
+ error recovery purposes behave as if it was not specified so that
+ the default type is used.
+
2011-01-07 Jakub Jelinek <jakub@redhat.com>
PR c++/47022
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 43e91b0..2f11f8e 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -21915,7 +21915,25 @@ cp_parser_objc_typename (cp_parser* parser)
/* An ObjC type name may consist of just protocol qualifiers, in which
case the type shall default to 'id'. */
if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
- cp_type = cp_parser_type_id (parser);
+ {
+ cp_type = cp_parser_type_id (parser);
+
+ /* If the type could not be parsed, an error has already
+ been produced. For error recovery, behave as if it had
+ not been specified, which will use the default type
+ 'id'. */
+ if (cp_type == error_mark_node)
+ {
+ cp_type = NULL_TREE;
+ /* We need to skip to the closing parenthesis as
+ cp_parser_type_id() does not seem to do it for
+ us. */
+ cp_parser_skip_to_closing_parenthesis (parser,
+ /*recovering=*/true,
+ /*or_comma=*/false,
+ /*consume_paren=*/false);
+ }
+ }
cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
type_name = build_tree_list (proto_quals, cp_type);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2824845..459750f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2011-01-08 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ PR objc/47078
+ * objc.dg/invalid-method-2.m: New.
+ * obj-c++.dg/invalid-method-2.mm: New.
+
2011-01-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/46896
diff --git a/gcc/testsuite/obj-c++.dg/invalid-method-2.mm b/gcc/testsuite/obj-c++.dg/invalid-method-2.mm
new file mode 100644
index 0000000..48f0359
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/invalid-method-2.mm
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+/* Test that using an invalid type in a method declaration produces a
+ friendly error without a compiler crash. */
+
+@interface MyClass
+@end
+
+@implementation MyClass
+- (x) method /* { dg-error "expected" } */
+{
+ return 0;
+}
+- (id) method2: (x)argument /* { dg-error "expected" } */
+{
+ return 0;
+}
+@end
diff --git a/gcc/testsuite/objc.dg/invalid-method-2.m b/gcc/testsuite/objc.dg/invalid-method-2.m
new file mode 100644
index 0000000..cb18de9
--- /dev/null
+++ b/gcc/testsuite/objc.dg/invalid-method-2.m
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+/* Test that using an invalid type in a method declaration produces a
+ friendly error without a compiler crash. */
+
+@interface MyClass
+@end
+
+@implementation MyClass
+- (x) method /* { dg-error "unknown type name" } */
+{
+ return 0;
+}
+- (id) method2: (x)argument /* { dg-error "unknown type name" } */
+{
+ return 0;
+}
+@end