In gcc/objc/: 2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com>
authorNicola Pero <nicola.pero@meta-innovation.com>
Wed, 8 Dec 2010 23:46:28 +0000 (23:46 +0000)
committerNicola Pero <nicola@gcc.gnu.org>
Wed, 8 Dec 2010 23:46:28 +0000 (23:46 +0000)
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

gcc/objc/ChangeLog
gcc/objc/objc-act.c
gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/exceptions-3.mm
gcc/testsuite/obj-c++.dg/exceptions-5.mm
gcc/testsuite/obj-c++.dg/exceptions-7.mm [new file with mode: 0644]
gcc/testsuite/objc.dg/exceptions-7.m [new file with mode: 0644]

index 0997727..09cc1f6 100644 (file)
@@ -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.
index f760aad..1b815df 100644 (file)
@@ -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.  */
index c7e0e21..cdddb9a 100644 (file)
@@ -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.
        
index b1ba185..adae263 100644 (file)
@@ -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" } */
     {
index f740496..ba0e543 100644 (file)
@@ -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 (file)
index 0000000..1f5adfc
--- /dev/null
@@ -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 (file)
index 0000000..1f5adfc
--- /dev/null
@@ -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" } */
+}