===================================================================
@@ -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 },
===================================================================
@@ -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,
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);
===================================================================
@@ -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))
{
}
===================================================================
@@ -150,7 +150,7 @@ static void objc_start_function (tree, tree, tree,
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
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
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);
}
@@ -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 @@ static tree
/* 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 prop
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. */
===================================================================
@@ -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. */
===================================================================
@@ -21356,14 +21356,17 @@ 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;
}
===================================================================
@@ -6703,21 +6703,27 @@ c_parser_objc_class_instance_variables (c_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))
{
c_parser_pragma (parser, pragma_external);
Hi, This is (other than declarations) all ObjC local - but it is new code, not a merge. I also replaced the magic numbers with an enum for objc ivar visibility. OK for trunk? Iain 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. Index: gcc/testsuite/objc.dg/fsf-package-0.m =================================================================== --- gcc/testsuite/objc.dg/fsf-package-0.m (revision 0) +++ gcc/testsuite/objc.dg/fsf-package-0.m (revision 0) @@ -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 } */ +} Index: gcc/testsuite/obj-c++.dg/fsf-package-0.m =================================================================== --- gcc/testsuite/obj-c++.dg/fsf-package-0.m (revision 0) +++ gcc/testsuite/obj-c++.dg/fsf-package-0.m (revision 0) @@ -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 } */ +}