In gcc/objc/: 2010-12-02 Nicola Pero <nicola.pero@meta-innovation.com>
In gcc/objc/: 2010-12-02 Nicola Pero <nicola.pero@meta-innovation.com> * 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 <nicola.pero@meta-innovation.com> * 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 <nicola.pero@meta-innovation.com> * objc.dg/exceptions-6.m: New. * obj-c++.dg/exceptions-6.mm: New. From-SVN: r167364
This commit is contained in:
parent
2eb2e95f8f
commit
d0f7899abb
7 changed files with 82 additions and 5 deletions
|
@ -1,3 +1,9 @@
|
|||
2010-12-02 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||
|
||||
* 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 <joseph@codesourcery.com>
|
||||
|
||||
* cp-objcp-common.c, lex.c, typeck.c: Don't include toplev.h.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-12-02 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||
|
||||
* 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 <nicola.pero@meta-innovation.com>
|
||||
|
||||
* objc-act.c (objc_build_volatilized_type): Removed.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-12-02 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||
|
||||
* objc.dg/exceptions-6.m: New.
|
||||
* obj-c++.dg/exceptions-6.mm: New.
|
||||
|
||||
2010-12-01 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* gcc.c-torture/execute/bcp-1.c: Make ready for -fuse-linker-plugin
|
||||
|
|
29
gcc/testsuite/obj-c++.dg/exceptions-6.mm
Normal file
29
gcc/testsuite/obj-c++.dg/exceptions-6.mm
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */
|
||||
/* { dg-options "-fobjc-exceptions" } */
|
||||
/* { dg-do compile } */
|
||||
|
||||
/* Test warnings when parsing syntax errors in @throw. */
|
||||
|
||||
#include <objc/objc.h>
|
||||
|
||||
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. */
|
||||
}
|
29
gcc/testsuite/objc.dg/exceptions-6.m
Normal file
29
gcc/testsuite/objc.dg/exceptions-6.m
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */
|
||||
/* { dg-options "-fobjc-exceptions" } */
|
||||
/* { dg-do compile } */
|
||||
|
||||
/* Test warnings when parsing syntax errors in @throw. */
|
||||
|
||||
#include <objc/objc.h>
|
||||
|
||||
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. */
|
||||
}
|
Loading…
Add table
Reference in a new issue