Commit 6347cf31 by Nicola Pero Committed by Nicola Pero

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
parent e493bdc2
2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com> 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 * objc-act.c (objc_finish_foreach_loop): Use error_at() instead of
error() when printing an error about the iterating variable or error() when printing an error about the iterating variable or
collection not being an object. collection not being an object.
......
...@@ -5528,6 +5528,14 @@ objc_build_throw_stmt (location_t loc, tree throw_expr) ...@@ -5528,6 +5528,14 @@ objc_build_throw_stmt (location_t loc, tree throw_expr)
value that we get from the runtime. */ value that we get from the runtime. */
throw_expr = objc_build_exc_ptr (); 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 /* A throw is just a call to the runtime throw function with the
object as a parameter. */ object as a parameter. */
......
2010-12-08 Nicola Pero <nicola.pero@meta-innovation.com> 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-6.m: Updated location of error messages.
* objc.dg/foreach-7.m: Same change. * objc.dg/foreach-7.m: Same change.
......
...@@ -72,8 +72,8 @@ int test (id object) ...@@ -72,8 +72,8 @@ int test (id object)
@catch (MyObject x) /* { dg-error "@catch parameter is not a known Objective-C class type" } */ @catch (MyObject x) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
{ /* { dg-error "no matching function" "" { target *-*-* } 72 } */ { /* { dg-error "no matching function" "" { target *-*-* } 72 } */
dummy++; /* { dg-warning "MyObject" "" { target *-*-* } 13 } */ dummy++; /* { dg-warning "MyObject" "" { target *-*-* } 13 } */
} } /* { dg-warning "candidate" "" { target *-*-* } 13 } */
/* { dg-warning "candidate" "" { target *-*-* } 72 } */
@try { @throw object; } @try { @throw object; }
@catch (static MyObject *x) /* { dg-error "storage class" } */ @catch (static MyObject *x) /* { dg-error "storage class" } */
{ {
......
...@@ -72,7 +72,8 @@ int test (id object) ...@@ -72,7 +72,8 @@ int test (id object)
@catch (MyObject) /* { dg-error "@catch parameter is not a known Objective-C class type" } */ @catch (MyObject) /* { dg-error "@catch parameter is not a known Objective-C class type" } */
{ /* { dg-error "no matching function" "" { target *-*-* } 72 } */ { /* { dg-error "no matching function" "" { target *-*-* } 72 } */
dummy++; /* { dg-warning "MyObject" "" { target *-*-* } 13 } */ dummy++; /* { dg-warning "MyObject" "" { target *-*-* } 13 } */
} } /* { dg-warning "candidate" "" { target *-*-* } 13 } */
/* { dg-warning "candidate" "" { target *-*-* } 72 } */
@try { @throw object; } @try { @throw object; }
@catch (static MyObject *) /* { dg-error "storage class" } */ @catch (static MyObject *) /* { dg-error "storage class" } */
......
/* 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" } */
}
/* 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" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment