* [Patch ObjC*] add parse-side support for @package.
@ 2010-10-15 10:41 IainS
2010-10-15 16:08 ` Mike Stump
0 siblings, 1 reply; 3+ messages in thread
From: IainS @ 2010-10-15 10:41 UTC (permalink / raw)
To: GCC Patches; +Cc: Mike Stump, Nicola Pero
[-- Attachment #1: Type: text/plain, Size: 1223 bytes --]
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.
[-- Attachment #2: 165498-parse-atpackage.txt --]
[-- Type: text/plain, Size: 8593 bytes --]
Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c (revision 165498)
+++ gcc/c-family/c-common.c (working copy)
@@ -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: gcc/c-family/c-common.h
===================================================================
--- gcc/c-family/c-common.h (revision 165498)
+++ gcc/c-family/c-common.h (working copy)
@@ -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);
Index: gcc/c-family/stub-objc.c
===================================================================
--- gcc/c-family/stub-objc.c (revision 165498)
+++ gcc/c-family/stub-objc.c (working copy)
@@ -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: gcc/objc/objc-act.c
===================================================================
--- gcc/objc/objc-act.c (revision 165498)
+++ gcc/objc/objc-act.c (working copy)
@@ -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. */
Index: gcc/objc/objc-act.h
===================================================================
--- gcc/objc/objc-act.h (revision 165498)
+++ gcc/objc/objc-act.h (working copy)
@@ -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: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c (revision 165498)
+++ gcc/cp/parser.c (working copy)
@@ -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;
}
Index: gcc/c-parser.c
===================================================================
--- gcc/c-parser.c (revision 165498)
+++ gcc/c-parser.c (working copy)
@@ -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);
[-- Attachment #3: Type: text/plain, Size: 89 bytes --]
gcc/testsuite:
* objc.dg/fsf-package-0.m: New.
* obj-c++.dg/fsf-package-0.m: New.
[-- Attachment #4: 165498-package-testsuite.txt --]
[-- Type: text/plain, Size: 1985 bytes --]
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 } */
+}
[-- Attachment #5: Type: text/plain, Size: 1 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Patch ObjC*] add parse-side support for @package.
2010-10-15 10:41 [Patch ObjC*] add parse-side support for @package IainS
@ 2010-10-15 16:08 ` Mike Stump
2010-10-17 14:14 ` IainS
0 siblings, 1 reply; 3+ messages in thread
From: Mike Stump @ 2010-10-15 16:08 UTC (permalink / raw)
To: IainS; +Cc: GCC Patches, Mike Stump, Nicola Pero
On Oct 15, 2010, at 3:37 AM, IainS wrote:
> I also replaced the magic numbers with an enum for objc ivar visibility.
Excellent, much more readable... Thanks.
> OK for trunk?
Ok.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Patch ObjC*] add parse-side support for @package.
2010-10-15 16:08 ` Mike Stump
@ 2010-10-17 14:14 ` IainS
0 siblings, 0 replies; 3+ messages in thread
From: IainS @ 2010-10-17 14:14 UTC (permalink / raw)
To: GCC Patches; +Cc: Mike Stump, Nicola Pero
On 15 Oct 2010, at 16:34, Mike Stump wrote:
> On Oct 15, 2010, at 3:37 AM, IainS wrote:
>> I also replaced the magic numbers with an enum for objc ivar
>> visibility.
>
> Excellent, much more readable... Thanks.
>
>> OK for trunk?
>
> Ok.
r165585
Iain
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-10-17 13:03 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-15 10:41 [Patch ObjC*] add parse-side support for @package IainS
2010-10-15 16:08 ` Mike Stump
2010-10-17 14:14 ` IainS
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).