add parse support for @package to ObjC*
authorIain Sandoe <iains@gcc.gnu.org>
Sun, 17 Oct 2010 13:02:07 +0000 (13:02 +0000)
committerIain Sandoe <iains@gcc.gnu.org>
Sun, 17 Oct 2010 13:02:07 +0000 (13:02 +0000)
gcc/c-family:

* c-common.c (c_common_reswords): Add package, RID_AT_PACKAGE.
* c-common.h (enum rid): Add RID_AT_PACKAGE.
(objc_ivar_visibility_kind): New enum.
(objc_set_visibility): Adjust prototype to use visibility enum.
* stub-objc.c (objc_set_visibility): Adjust stub to use
visibility enum.

gcc/objc:

* objc-act.c: Rename 'objc_public_flag' to  objc_ivar_visibility and
make its type 'objc_ivar_visibility_kind'.
(objc_start_class_interface): Update to use visibility enum.
(objc_start_class_implementation): Likewise.
(objc_set_visibility): Update to use visibility enum, warn that
@package is handle as per @public.
(add_instance_variable): Handle OBJC_IVAR_VIS_PACKAGE.
* objc-act.h: Rename 'objc_public_flag' to  objc_ivar_visibility and
make its type 'objc_ivar_visibility_kind'.

gcc/cp:

* parser.c (cp_parser_objc_visibility_spec): Update to use visibility
enum, and handle @package.

gcc:

* c-parser.c (c_parser_objc_class_instance_variables): Update to use
visibility enum, and handle @package.

gcc/testsuite:

* objc.dg/fsf-package-0.m: New.
* obj-c++.dg/fsf-package-0.m: New.

From-SVN: r165585

14 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/c-family/stub-objc.c
gcc/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/objc/ChangeLog
gcc/objc/objc-act.c
gcc/objc/objc-act.h
gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/fsf-package-0.m [new file with mode: 0644]
gcc/testsuite/objc.dg/fsf-package-0.m [new file with mode: 0644]

index 47254d3..512ae12 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-17  Iain Sandoe  <iains@gcc.gnu.org>
+
+       * c-parser.c (c_parser_objc_class_instance_variables): Update to use 
+       visibility enum, and handle @package.
+
 2010-10-17  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * doc/objc.texi (What you can and what you cannot do in +load):
index 29fc3a1..f0ef49e 100644 (file)
@@ -1,3 +1,12 @@
+2010-10-17  Iain Sandoe  <iains@gcc.gnu.org>
+
+       * c-common.c (c_common_reswords): Add package, RID_AT_PACKAGE.
+       * c-common.h (enum rid): Add RID_AT_PACKAGE.
+       (objc_ivar_visibility_kind): New enum.
+       (objc_set_visibility): Adjust prototype to use visibility enum.
+       * stub-objc.c (objc_set_visibility): Adjust stub to use 
+       visibility enum.
+
 2010-10-14  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * c-cppbuiltin.c (builtin_define_float_constants): Emit
index 5203c05..5068c56 100644 (file)
@@ -544,6 +544,7 @@ const struct c_common_resword c_common_reswords[] =
   { "optional",                RID_AT_OPTIONAL,        D_OBJC },
   { "required",                RID_AT_REQUIRED,        D_OBJC },
   { "property",                RID_AT_PROPERTY,        D_OBJC },
+  { "package",         RID_AT_PACKAGE,         D_OBJC },
   /* These are recognized only in protocol-qualifier context
      (see above) */
   { "bycopy",          RID_BYCOPY,             D_OBJC },
index 8c79d27..8855ff7 100644 (file)
@@ -143,7 +143,7 @@ enum rid
      they follow '@')  */
   RID_AT_ENCODE,   RID_AT_END,
   RID_AT_CLASS,    RID_AT_ALIAS,     RID_AT_DEFS,
-  RID_AT_PRIVATE,  RID_AT_PROTECTED, RID_AT_PUBLIC,
+  RID_AT_PRIVATE,  RID_AT_PROTECTED, RID_AT_PUBLIC,  RID_AT_PACKAGE,
   RID_AT_PROTOCOL, RID_AT_SELECTOR,
   RID_AT_THROW,           RID_AT_TRY,       RID_AT_CATCH,
   RID_AT_FINALLY,  RID_AT_SYNCHRONIZED, 
@@ -440,6 +440,14 @@ typedef enum objc_property_attribute_kind {
   OBJC_PATTR_COPIES    = 5
 } objc_property_attribute_kind;
 
+/* ObjC ivar visibility types.  */
+typedef enum objc_ivar_visibility_kind {
+  OBJC_IVAR_VIS_PROTECTED = 0,
+  OBJC_IVAR_VIS_PUBLIC    = 1,
+  OBJC_IVAR_VIS_PRIVATE   = 2,
+  OBJC_IVAR_VIS_PACKAGE   = 3
+} objc_ivar_visibility_kind;
+
 /* The various name of operator that appears in error messages. */
 typedef enum ref_operator {
   /* NULL */
@@ -1009,7 +1017,7 @@ extern void objc_start_class_implementation (tree, tree);
 extern void objc_start_category_implementation (tree, tree);
 extern void objc_continue_implementation (void);
 extern void objc_finish_implementation (void);
-extern void objc_set_visibility (int);
+extern void objc_set_visibility (objc_ivar_visibility_kind);
 extern void objc_set_method_type (enum tree_code);
 extern tree objc_build_method_signature (tree, tree, tree, bool);
 extern void objc_add_method_declaration (tree, tree);
index 4a8a2b5..cff4d79 100644 (file)
@@ -163,7 +163,7 @@ objc_add_instance_variable (tree ARG_UNUSED (decl))
 }
 
 void
-objc_set_visibility (int ARG_UNUSED (vis))
+objc_set_visibility (objc_ivar_visibility_kind ARG_UNUSED (vis))
 {
 }
 
index 36ed951..e4230b9 100644 (file)
@@ -6703,19 +6703,25 @@ c_parser_objc_class_instance_variables (c_parser *parser)
       if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
        {
          c_parser_consume_token (parser);
-         objc_set_visibility (2);
+         objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
          continue;
        }
       else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
        {
          c_parser_consume_token (parser);
-         objc_set_visibility (0);
+         objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
          continue;
        }
       else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
        {
          c_parser_consume_token (parser);
-         objc_set_visibility (1);
+         objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
+         continue;
+       }
+      else if (c_parser_next_token_is_keyword (parser, RID_AT_PACKAGE))
+       {
+         c_parser_consume_token (parser);
+         objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
          continue;
        }
       else if (c_parser_next_token_is (parser, CPP_PRAGMA))
index 16b9307..b72d43d 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-17  Iain Sandoe  <iains@gcc.gnu.org>
+
+       * parser.c (cp_parser_objc_visibility_spec): Update to use visibility 
+       enum, and handle @package.
+
 2010-10-15  Jason Merrill  <jason@redhat.com>
 
        PR c++/45983
index 3e02cd5..670337e 100644 (file)
@@ -21356,13 +21356,16 @@ cp_parser_objc_visibility_spec (cp_parser* parser)
   switch (vis->keyword)
     {
     case RID_AT_PRIVATE:
-      objc_set_visibility (2);
+      objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
       break;
     case RID_AT_PROTECTED:
-      objc_set_visibility (0);
+      objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
       break;
     case RID_AT_PUBLIC:
-      objc_set_visibility (1);
+      objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
+      break;
+    case RID_AT_PACKAGE:
+      objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
       break;
     default:
       return;
index 1a51c14..7917d60 100644 (file)
@@ -1,3 +1,15 @@
+2010-10-17  Iain Sandoe  <iains@gcc.gnu.org>
+
+       * objc-act.c: Rename 'objc_public_flag' to  objc_ivar_visibility and
+       make its type 'objc_ivar_visibility_kind'.  
+       (objc_start_class_interface): Update to use visibility enum.
+       (objc_start_class_implementation): Likewise.
+       (objc_set_visibility): Update to use visibility enum, warn that 
+       @package is handle as per @public.
+       (add_instance_variable): Handle OBJC_IVAR_VIS_PACKAGE.
+       * objc-act.h: Rename 'objc_public_flag' to  objc_ivar_visibility and
+       make its type 'objc_ivar_visibility_kind'.
+
 2010-10-14  Iain Sandoe  <iains@gcc.gnu.org>
 
        merge from FSF apple 'trunk' branch. 
index 88f5d6c..1be52d9 100644 (file)
@@ -150,7 +150,7 @@ static void objc_start_function (tree, tree, tree, struct c_arg_info *);
 static tree start_protocol (enum tree_code, tree, tree);
 static tree build_method_decl (enum tree_code, tree, tree, tree, bool);
 static tree objc_add_method (tree, tree, int, bool);
-static tree add_instance_variable (tree, int, tree);
+static tree add_instance_variable (tree, objc_ivar_visibility_kind, tree);
 static tree build_ivar_reference (tree);
 static tree is_ivar (tree, tree);
 
@@ -385,7 +385,7 @@ int imp_count = 0;  /* `@implementation' */
 int cat_count = 0;     /* `@category' */
 
 enum tree_code objc_inherit_code;
-int objc_public_flag;
+objc_ivar_visibility_kind objc_ivar_visibility;
 
 /* Use to generate method labels.  */
 static int method_slot = 0;
@@ -734,7 +734,7 @@ objc_start_class_interface (tree klass, tree super_class,
   objc_interface_context
     = objc_ivar_context
     = start_class (CLASS_INTERFACE_TYPE, klass, super_class, protos);
-  objc_public_flag = 0;
+  objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
 }
 
 void
@@ -784,7 +784,7 @@ objc_start_class_implementation (tree klass, tree super_class)
   objc_implementation_context
     = objc_ivar_context
     = start_class (CLASS_IMPLEMENTATION_TYPE, klass, super_class, NULL_TREE);
-  objc_public_flag = 0;
+  objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
 }
 
 void
@@ -822,9 +822,11 @@ objc_finish_implementation (void)
 }
 
 void
-objc_set_visibility (int visibility)
+objc_set_visibility (objc_ivar_visibility_kind visibility)
 {
-  objc_public_flag = visibility;
+  if (visibility == OBJC_IVAR_VIS_PACKAGE)
+    warning (0, "%<@package%> presently has the same effect as %<@public%>");
+  objc_ivar_visibility = visibility;
 }
 
 void
@@ -1352,7 +1354,7 @@ void
 objc_add_instance_variable (tree decl)
 {
   (void) add_instance_variable (objc_ivar_context,
-                               objc_public_flag,
+                               objc_ivar_visibility,
                                decl);
 }
 
@@ -2592,7 +2594,7 @@ string_eq (const void *ptr1, const void *ptr2)
 tree
 objc_build_string_object (tree string)
 {
-  tree constructor, constant_string_class;
+  tree constructor = NULL_TREE, constant_string_class;
   int length;
   tree fields, addr;
   struct string_descriptor *desc, key;
@@ -7795,7 +7797,8 @@ add_category (tree klass, tree category)
    VISIBILITY is 1 for public, 0 for protected, and 2 for private.  */
 
 static tree
-add_instance_variable (tree klass, int visibility, tree field_decl)
+add_instance_variable (tree klass, objc_ivar_visibility_kind visibility, 
+                      tree field_decl)
 {
   tree field_type = TREE_TYPE (field_decl);
   const char *ivar_name = DECL_NAME (field_decl)
@@ -7887,19 +7890,21 @@ add_instance_variable (tree klass, int visibility, tree field_decl)
   /* Overload the public attribute, it is not used for FIELD_DECLs.  */
   switch (visibility)
     {
-    case 0:
+    case OBJC_IVAR_VIS_PROTECTED:
       TREE_PUBLIC (field_decl) = 0;
       TREE_PRIVATE (field_decl) = 0;
       TREE_PROTECTED (field_decl) = 1;
       break;
 
-    case 1:
+    case OBJC_IVAR_VIS_PACKAGE:
+    /* TODO: Implement the package variant.  */
+    case OBJC_IVAR_VIS_PUBLIC:
       TREE_PUBLIC (field_decl) = 1;
       TREE_PRIVATE (field_decl) = 0;
       TREE_PROTECTED (field_decl) = 0;
       break;
 
-    case 2:
+    case OBJC_IVAR_VIS_PRIVATE:
       TREE_PUBLIC (field_decl) = 0;
       TREE_PRIVATE (field_decl) = 1;
       TREE_PROTECTED (field_decl) = 0;
@@ -8520,7 +8525,7 @@ objc_gen_one_property_datum (tree klass, tree property, tree class_methods, bool
                                      objc_build_property_ivar_name (property));
       DECL_CONTEXT (field_decl) = record;
       (void) add_instance_variable (klass, 
-                                   1, field_decl);
+                                   OBJC_IVAR_VIS_PUBLIC, field_decl);
       /* Unfortunately, CLASS_IVARS is completed when interface is completed.
         Must add the new ivar by hand to its list here. */
       
index 1dd777c..a11a6de 100644 (file)
@@ -175,7 +175,7 @@ extern GTY(()) int imp_count;       /* `@implementation' */
 extern GTY(()) int cat_count;  /* `@category' */
 
 extern GTY(()) enum tree_code objc_inherit_code;
-extern GTY(()) int objc_public_flag;
+extern GTY(()) objc_ivar_visibility_kind objc_ivar_visibility;
 
 /* Objective-C/Objective-C++ global tree enumeration.  */
 
index b236d20..d678a0a 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-17  Iain Sandoe  <iains@gcc.gnu.org>
+
+       * objc.dg/fsf-package-0.m: New.
+       * obj-c++.dg/fsf-package-0.m: New.
+
 2010-10-17  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        PR objc/18255
diff --git a/gcc/testsuite/obj-c++.dg/fsf-package-0.m b/gcc/testsuite/obj-c++.dg/fsf-package-0.m
new file mode 100644 (file)
index 0000000..d6b4db2
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+
+#import "../objc-obj-c++-shared/Object1.h"
+#include <objc/objc-api.h>
+
+@interface obj : Object
+{
+@public
+  int v1;
+@package       /* { dg-warning ".@package. presently has the same effect as .@public." } */
+  int v2;
+@protected
+  int v3;
+@private
+  int v4;
+}
+- (int) value;
+- (void) setValue: (int)number;
+@end
+
+@implementation obj : Object
+
+- (int) value { return v1; }
+- (void) setValue: (int)number { v1 = number; }
+
+@end
+
+void foo (void)
+{
+  obj *a;
+
+  [a setValue:2];
+  a->v2 = 1;
+  a->v3 = [a value] - a->v2;   /* { dg-warning ".v3. is @protected" } */
+  a->v4 = a->v3 - 1;           /* { dg-warning ".v4. is @private" } */
+                               /* { dg-warning ".v3. is @protected" "" { target *-*-* } 35 } */
+}
diff --git a/gcc/testsuite/objc.dg/fsf-package-0.m b/gcc/testsuite/objc.dg/fsf-package-0.m
new file mode 100644 (file)
index 0000000..d6b4db2
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+
+#import "../objc-obj-c++-shared/Object1.h"
+#include <objc/objc-api.h>
+
+@interface obj : Object
+{
+@public
+  int v1;
+@package       /* { dg-warning ".@package. presently has the same effect as .@public." } */
+  int v2;
+@protected
+  int v3;
+@private
+  int v4;
+}
+- (int) value;
+- (void) setValue: (int)number;
+@end
+
+@implementation obj : Object
+
+- (int) value { return v1; }
+- (void) setValue: (int)number { v1 = number; }
+
+@end
+
+void foo (void)
+{
+  obj *a;
+
+  [a setValue:2];
+  a->v2 = 1;
+  a->v3 = [a value] - a->v2;   /* { dg-warning ".v3. is @protected" } */
+  a->v4 = a->v3 - 1;           /* { dg-warning ".v4. is @private" } */
+                               /* { dg-warning ".v3. is @protected" "" { target *-*-* } 35 } */
+}