Patchwork ObjC/ObjC++: Fix missing check that a class extension is declared before the class implementation

login
register
mail settings
Submitter Nicola Pero
Date Dec. 28, 2010, 5:07 a.m.
Message ID <28E30061-901F-432A-B9FA-E53E9EE315D1@meta-innovation.com>
Download mbox | patch
Permalink /patch/76815/
State New
Headers show

Comments

Nicola Pero - Dec. 28, 2010, 5:07 a.m.
This patch fixes the ObjC/ObjC++ compiler so that it detects when a  
class extension
is declared after the class implementation, and produces the  
appropriate error.

Ok to commit to trunk ?

Thanks

class .MyObject. declared after its ..implementation." } */
+- (void) test;
+@end
Mike Stump - Dec. 28, 2010, 7 a.m.
On Dec 27, 2010, at 9:07 PM, Nicola Pero <nicola.pero@meta-innovation.com> wrote:
> This patch fixes the ObjC/ObjC++ compiler so that it detects when a class extension
> is chain after the class implementation, and produces the appropriate error.
> 
> Ok to commit to trunk ?

Ok.
>

Patch

Index: gcc/objc/objc-act.c
===================================================================
--- gcc/objc/objc-act.c (revision 168285)
+++ gcc/objc/objc-act.c (working copy)
@@ -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);
Index: objc/ChangeLog
===================================================================
--- objc/ChangeLog      (revision 168285)
+++ objc/ChangeLog      (working copy)
@@ -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".
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog (revision 168285)
+++ testsuite/ChangeLog (working copy)
@@ -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.

Index: testsuite/objc.dg/class-extension-4.m
===================================================================
--- testsuite/objc.dg/class-extension-4.m       (revision 0)
+++ testsuite/objc.dg/class-extension-4.m       (revision 0)
@@ -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
Index: testsuite/obj-c++.dg/class-extension-4.mm
===================================================================
--- testsuite/obj-c++.dg/class-extension-4.mm   (revision 0)
+++ testsuite/obj-c++.dg/class-extension-4.mm   (revision 0)
@@ -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