aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Pero <nicola.pero@meta-innovation.com>2010-12-08 23:46:28 +0000
committerNicola Pero <nicola@gcc.gnu.org>2010-12-08 23:46:28 +0000
commit6347cf3119969c89259c269f8eba9c267ff098b8 (patch)
treeff57e0beed9ef0ff7353af054bd1a49d3e4061e6
parente493bdc219725a41e2c9d5a549fac1bf46c31d07 (diff)
downloadgcc-6347cf3119969c89259c269f8eba9c267ff098b8.zip
gcc-6347cf3119969c89259c269f8eba9c267ff098b8.tar.gz
gcc-6347cf3119969c89259c269f8eba9c267ff098b8.tar.bz2
In gcc/objc/: 2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com>
In gcc/objc/: 2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com> * objc-act.c (objc_build_throw_stmt): Check that the argument of @throw is an object and emit an error if not. In gcc/testsuite/: 2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com> * objc.dg/exceptions-7.m: New. * obj-c++.dg/exceptions-7.mm: New. * obj-c++.dg/exceptions-3.mm: Adjust for new C++ messages. * obj-c++.dg/exceptions-5.mm: Same change. From-SVN: r167615
-rw-r--r--gcc/objc/ChangeLog5
-rw-r--r--gcc/objc/objc-act.c8
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/obj-c++.dg/exceptions-3.mm4
-rw-r--r--gcc/testsuite/obj-c++.dg/exceptions-5.mm3
-rw-r--r--gcc/testsuite/obj-c++.dg/exceptions-7.mm18
-rw-r--r--gcc/testsuite/objc.dg/exceptions-7.m18
7 files changed, 60 insertions, 3 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index 0997727..09cc1f6 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,5 +1,10 @@
2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com>
+ * objc-act.c (objc_build_throw_stmt): Check that the argument of
+ @throw is an object and emit an error if not.
+
+2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com>
+
* objc-act.c (objc_finish_foreach_loop): Use error_at() instead of
error() when printing an error about the iterating variable or
collection not being an object.
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index f760aad..1b815df 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -5528,6 +5528,14 @@ objc_build_throw_stmt (location_t loc, tree throw_expr)
value that we get from the runtime. */
throw_expr = objc_build_exc_ptr ();
}
+ else if (throw_expr != error_mark_node)
+ {
+ if (!objc_type_valid_for_messaging (TREE_TYPE (throw_expr), true))
+ {
+ error_at (loc, "%<@throw%> argument is not an object");
+ return error_mark_node;
+ }
+ }
/* A throw is just a call to the runtime throw function with the
object as a parameter. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c7e0e21..cdddb9a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com>
+ * objc.dg/exceptions-7.m: New.
+ * obj-c++.dg/exceptions-7.mm: New.
+ * obj-c++.dg/exceptions-3.mm: Adjust for new C++ messages.
+ * obj-c++.dg/exceptions-5.mm: Same change.
+
+2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com>
+
* objc.dg/foreach-6.m: Updated location of error messages.
* objc.dg/foreach-7.m: Same change.
diff --git a/gcc/testsuite/obj-c++.dg/exceptions-3.mm b/gcc/testsuite/obj-c++.dg/exceptions-3.mm
index b1ba185..adae263 100644
--- a/gcc/testsuite/obj-c++.dg/exceptions-3.mm
+++ b/gcc/testsuite/obj-c++.dg/exceptions-3.mm
@@ -72,8 +72,8 @@ int test (id object)
@catch (MyObject x) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
{ /* { dg-error "no matching function" "" { target *-*-* } 72 } */
dummy++; /* { dg-warning "MyObject" "" { target *-*-* } 13 } */
- }
-
+ } /* { dg-warning "candidate" "" { target *-*-* } 13 } */
+ /* { dg-warning "candidate" "" { target *-*-* } 72 } */
@try { @throw object; }
@catch (static MyObject *x) /* { dg-error "storage class" } */
{
diff --git a/gcc/testsuite/obj-c++.dg/exceptions-5.mm b/gcc/testsuite/obj-c++.dg/exceptions-5.mm
index f740496..ba0e543 100644
--- a/gcc/testsuite/obj-c++.dg/exceptions-5.mm
+++ b/gcc/testsuite/obj-c++.dg/exceptions-5.mm
@@ -72,7 +72,8 @@ int test (id object)
@catch (MyObject) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
{ /* { dg-error "no matching function" "" { target *-*-* } 72 } */
dummy++; /* { dg-warning "MyObject" "" { target *-*-* } 13 } */
- }
+ } /* { dg-warning "candidate" "" { target *-*-* } 13 } */
+ /* { dg-warning "candidate" "" { target *-*-* } 72 } */
@try { @throw object; }
@catch (static MyObject *) /* { dg-error "storage class" } */
diff --git a/gcc/testsuite/obj-c++.dg/exceptions-7.mm b/gcc/testsuite/obj-c++.dg/exceptions-7.mm
new file mode 100644
index 0000000..1f5adfc
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/exceptions-7.mm
@@ -0,0 +1,18 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010. */
+/* { dg-options "-fobjc-exceptions" } */
+/* { dg-do compile } */
+
+/* Test warnings when the argument of @throw is invalid. */
+
+#include <objc/objc.h>
+
+void test (id object)
+{
+ struct x { int i; } invalid_1, *invalid_2;
+
+ @throw object; /* Ok */
+ @throw 1; /* { dg-error ".@throw. argument is not an object" } */
+ @throw "string"; /* { dg-error ".@throw. argument is not an object" } */
+ @throw invalid_1; /* { dg-error ".@throw. argument is not an object" } */
+ @throw invalid_2; /* { dg-error ".@throw. argument is not an object" } */
+}
diff --git a/gcc/testsuite/objc.dg/exceptions-7.m b/gcc/testsuite/objc.dg/exceptions-7.m
new file mode 100644
index 0000000..1f5adfc
--- /dev/null
+++ b/gcc/testsuite/objc.dg/exceptions-7.m
@@ -0,0 +1,18 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010. */
+/* { dg-options "-fobjc-exceptions" } */
+/* { dg-do compile } */
+
+/* Test warnings when the argument of @throw is invalid. */
+
+#include <objc/objc.h>
+
+void test (id object)
+{
+ struct x { int i; } invalid_1, *invalid_2;
+
+ @throw object; /* Ok */
+ @throw 1; /* { dg-error ".@throw. argument is not an object" } */
+ @throw "string"; /* { dg-error ".@throw. argument is not an object" } */
+ @throw invalid_1; /* { dg-error ".@throw. argument is not an object" } */
+ @throw invalid_2; /* { dg-error ".@throw. argument is not an object" } */
+}