From d0f7899abb4d765cfe9da433cb17b38a425d55e8 Mon Sep 17 00:00:00 2001
From: Nicola Pero <nicola.pero@meta-innovation.com>
Date: Thu, 2 Dec 2010 00:25:42 +0000
Subject: [PATCH] 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
---
 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 bfc522a6f580..c167e9434569 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 826de0c4106e..729b33f2f98a 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 90765eb93e53..70ca6a8807e6 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -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.
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index b9cb6508ec6a..7eba65e31059 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 332c0bc1a225..51b34fcbbe50 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
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 000000000000..58882fed8b71
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/exceptions-6.mm
@@ -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.  */
+}
diff --git a/gcc/testsuite/objc.dg/exceptions-6.m b/gcc/testsuite/objc.dg/exceptions-6.m
new file mode 100644
index 000000000000..58882fed8b71
--- /dev/null
+++ b/gcc/testsuite/objc.dg/exceptions-6.m
@@ -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.  */
+}
-- 
GitLab