===================================================================
@@ -763,6 +763,23 @@ objc_start_category_interface (tree klas
{
if (flag_objc1_only)
error_at (input_location, "class extensions are not available
in Objective-C 1.0");
+ else
+ {
+ /* Iterate over all the classes and categories implemented
+ up to now in this compilation unit. */
+ struct imp_entry *t;
+
+ for (t = imp_list; t; t = t->next)
+ {
+ /* If we find a class @implementation with the same name
+ as the one we are extending, produce an error. */
+ if (TREE_CODE (t->imp_context) == CLASS_IMPLEMENTATION_TYPE
+ && IDENTIFIER_POINTER (CLASS_NAME (t->imp_context)) ==
IDENTIFIER_POINTER (klass))
+ error_at (input_location,
+ "class extension for class %qE declared after
its %<@implementation%>",
+ klass);
+ }
+ }
}
objc_interface_context
= start_class (CATEGORY_INTERFACE_TYPE, klass, categ, protos,
NULL_TREE);
===================================================================
@@ -1,5 +1,10 @@
2010-12-28 Nicola Pero <nicola.pero@meta-innovation.com>
+ * objc-act.c (objc_start_category_interface): Produce an error
if
+ a class extension is found after the class @implementation.
+
+2010-12-28 Nicola Pero <nicola.pero@meta-innovation.com>
+
PR objc/47073
* objc-act.c (encode_method_prototype): Fixed both location and
format string of error "type %qT does not have a known size".
===================================================================
@@ -1,5 +1,10 @@
2010-12-28 Nicola Pero <nicola.pero@meta-innovation.com>
+ * objc.dg/class-extension-4.m: New.
+ * obj-c++.dg/class-extension-4.mm: New.
+
+2010-12-28 Nicola Pero <nicola.pero@meta-innovation.com>
+
PR objc/47073
* objc.dg/incomplete-type-1.m: New test.
===================================================================
@@ -0,0 +1,19 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>,
December 2010. */
+/* { dg-do compile } */
+
+/* This test tests you can not declare a class extension after the
class @implementation. */
+
+#include <objc/objc.h>
+
+@interface MyObject
+{
+ Class isa;
+}
+@end
+
+@implementation MyObject
+@end
+
+@interface MyObject ()
+- (void) test; /* { dg-error "class extension for class .MyObject.
declared after its ..implementation." } */
+@end
===================================================================
@@ -0,0 +1,19 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>,
December 2010. */
+/* { dg-do compile } */
+
+/* This test tests you can not declare a class extension after the
class @implementation. */
+
+#include <objc/objc.h>
+
+@interface MyObject
+{
+ Class isa;
+}
+@end
+
+@implementation MyObject
+@end
+
+@interface MyObject () /* { dg-error "class extension for