From d0f7899abb4d765cfe9da433cb17b38a425d55e8 Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Thu, 2 Dec 2010 00:25:42 +0000 Subject: [PATCH] In gcc/objc/: 2010-12-02 Nicola Pero In gcc/objc/: 2010-12-02 Nicola Pero * objc-act.c (objc_build_throw_stmt): Return error_mark_node and not NULL_TREE when a @throw is used outside of a @catch block. In gcc/cp/: 2010-12-02 Nicola Pero * parser.c (cp_parser_objc_throw_statement): Use cp_parser_expression, not cp_parser_assignment_expression, to parse the argument of a @throw. In gcc/testsuite/: 2010-12-02 Nicola Pero * objc.dg/exceptions-6.m: New. * obj-c++.dg/exceptions-6.mm: New. From-SVN: r167364 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 11 +++++++---- gcc/objc/ChangeLog | 5 +++++ gcc/objc/objc-act.c | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/obj-c++.dg/exceptions-6.mm | 29 +++++++++++++++++++++++++++++ gcc/testsuite/objc.dg/exceptions-6.m | 29 +++++++++++++++++++++++++++++ 7 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/obj-c++.dg/exceptions-6.mm create mode 100644 gcc/testsuite/objc.dg/exceptions-6.m diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bfc522a6f58..c167e943456 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-12-02 Nicola Pero + + * parser.c (cp_parser_objc_throw_statement): Use + cp_parser_expression, not cp_parser_assignment_expression, to + parse the argument of a @throw. + 2010-12-01 Joseph Myers * cp-objcp-common.c, lex.c, typeck.c: Don't include toplev.h. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 826de0c4106..729b33f2f98 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -22705,7 +22705,8 @@ cp_parser_objc_try_catch_finally_statement (cp_parser *parser) Returns NULL_TREE. */ static tree -cp_parser_objc_synchronized_statement (cp_parser *parser) { +cp_parser_objc_synchronized_statement (cp_parser *parser) +{ location_t location; tree lock, stmt; @@ -22732,14 +22733,15 @@ cp_parser_objc_synchronized_statement (cp_parser *parser) { Returns a constructed '@throw' statement. */ static tree -cp_parser_objc_throw_statement (cp_parser *parser) { +cp_parser_objc_throw_statement (cp_parser *parser) +{ tree expr = NULL_TREE; location_t loc = cp_lexer_peek_token (parser->lexer)->location; cp_parser_require_keyword (parser, RID_AT_THROW, RT_AT_THROW); if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)) - expr = cp_parser_assignment_expression (parser, false, NULL); + expr = cp_parser_expression (parser, /*cast_p=*/false, NULL); cp_parser_consume_semicolon_at_end_of_statement (parser); @@ -22749,7 +22751,8 @@ cp_parser_objc_throw_statement (cp_parser *parser) { /* Parse an Objective-C statement. */ static tree -cp_parser_objc_statement (cp_parser * parser) { +cp_parser_objc_statement (cp_parser * parser) +{ /* Try to figure out what kind of declaration is present. */ cp_token *kwd = cp_lexer_peek_token (parser->lexer); diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 90765eb93e5..70ca6a8807e 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,8 @@ +2010-12-02 Nicola Pero + + * objc-act.c (objc_build_throw_stmt): Return error_mark_node and + not NULL_TREE when a @throw is used outside of a @catch block. + 2010-11-30 Nicola Pero * objc-act.c (objc_build_volatilized_type): Removed. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index b9cb6508ec6..7eba65e3105 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -5520,7 +5520,7 @@ objc_build_throw_stmt (location_t loc, tree throw_expr) || cur_try_context->current_catch == NULL) { error_at (loc, "%<@throw%> (rethrow) used outside of a @catch block"); - return NULL_TREE; + return error_mark_node; } /* Otherwise the object is still sitting in the EXC_PTR_EXPR diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 332c0bc1a22..51b34fcbbe5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-02 Nicola Pero + + * objc.dg/exceptions-6.m: New. + * obj-c++.dg/exceptions-6.mm: New. + 2010-12-01 Jan Hubicka * gcc.c-torture/execute/bcp-1.c: Make ready for -fuse-linker-plugin diff --git a/gcc/testsuite/obj-c++.dg/exceptions-6.mm b/gcc/testsuite/obj-c++.dg/exceptions-6.mm new file mode 100644 index 00000000000..58882fed8b7 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/exceptions-6.mm @@ -0,0 +1,29 @@ +/* Contributed by Nicola Pero , November 2010. */ +/* { dg-options "-fobjc-exceptions" } */ +/* { dg-do compile } */ + +/* Test warnings when parsing syntax errors in @throw. */ + +#include + +void test (id object) +{ + @throw object; /* Ok */ + @throw; /* { dg-error ".@throw. .rethrow. used outside of a @catch block" } */ + @throw (object); /* Ok. */ + @throw (id)0 +} /* { dg-error "expected" } */ + +void test2 (id object) +{ + @throw object); /* { dg-error "expected" } */ + @throw (...); /* { dg-error "expected" } */ + @throw (); /* { dg-error "expected" } */ + @throw +} /* { dg-error "expected" } */ + +void test3 (id object1, id object2) +{ + /* This is apparently valid. */ + @throw object1, object2; /* Ok. */ +} diff --git a/gcc/testsuite/objc.dg/exceptions-6.m b/gcc/testsuite/objc.dg/exceptions-6.m new file mode 100644 index 00000000000..58882fed8b7 --- /dev/null +++ b/gcc/testsuite/objc.dg/exceptions-6.m @@ -0,0 +1,29 @@ +/* Contributed by Nicola Pero , November 2010. */ +/* { dg-options "-fobjc-exceptions" } */ +/* { dg-do compile } */ + +/* Test warnings when parsing syntax errors in @throw. */ + +#include + +void test (id object) +{ + @throw object; /* Ok */ + @throw; /* { dg-error ".@throw. .rethrow. used outside of a @catch block" } */ + @throw (object); /* Ok. */ + @throw (id)0 +} /* { dg-error "expected" } */ + +void test2 (id object) +{ + @throw object); /* { dg-error "expected" } */ + @throw (...); /* { dg-error "expected" } */ + @throw (); /* { dg-error "expected" } */ + @throw +} /* { dg-error "expected" } */ + +void test3 (id object1, id object2) +{ + /* This is apparently valid. */ + @throw object1, object2; /* Ok. */ +} -- 2.11.4.GIT