+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):
+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
{ "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 },
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,
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 */
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);
}
void
-objc_set_visibility (int ARG_UNUSED (vis))
+objc_set_visibility (objc_ivar_visibility_kind ARG_UNUSED (vis))
{
}
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))
+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
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;
+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.
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);
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;
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
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
}
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
objc_add_instance_variable (tree decl)
{
(void) add_instance_variable (objc_ivar_context,
- objc_public_flag,
+ objc_ivar_visibility,
decl);
}
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;
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)
/* 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;
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. */
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. */
+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
--- /dev/null
+/* { 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 } */
+}
--- /dev/null
+/* { 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 } */
+}