This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Make ObjC an extension of C (Take 2)


Ok, I've incorporated some of Neil Booth's suggestions, notably
renaming compiling_objc to flag_objc, and removing this flag
from cpplib. Selecting Objective-C will currently imply C89;
I have a fix to c-parse.in in the queue which will allow C99
designated initializers to coexist with ObjC messages; once that
goes in, we could have ObjC imply C99 instead.

I'm currently bootstrapping the whole thing on i686-pc-linux-gnu.
OK for TOT if all goes well?

2002-08-08 Ziemowit Laski <zlaski@apple.com>

* c-common.c (flag_objc): New.
(c_common_init_options): Remove uses of clk_objective_c,
replace with flag_objc as needed.
* c-common.h (c_language_kind): Get rid of clk_objective_c
enum value.
(flag_objc): New extern declaration.
* c-decl.c (implicitly_declare): Call objc_check_decl
instead of maybe_objc_check_decl.
(finish_decl): Likewise.
(grokfield): Likewise.
(finish_struct): Likewise.
* c-lang.c (maybe_objc_check_decl): Rename to objc_check_decl.
(maybe_objc_comptypes): Rename to objc_comptypes.
(maybe_building_objc_message_expr): Rename to
objc_message_selector.
* c-lex.c (lex_charconst): Remove uses of clk_objective_c,
replace with flag_objc as needed.
* c-opts.c (c_common_init_options): Likewise.
(c_common_decode_option): Likewise.
* c-parse.in (init_reswords): Likewise.
* c-tree.h (maybe_objc_check_decl): Rename to objc_check_decl.
(maybe_objc_comptypes): Rename to objc_comptypes.
(maybe_building_objc_message_expr): Rename to
objc_message_selector.
* c-typeck.c (comptypes): Call objc_comptypes instead of
maybe_objc_comptypes, and/or objc_message_selector instead of
maybe_building_objc_message_expr.
(comp_target_types): Likewise.
(convert_for_assignment): Likewise.
(warn_for_assignment): Likewise.
* cppinit.c (init_builtins): Set __OBJC__ manifest constant
independently of those for other languages.
(cpp_handle_option): Have Objective-C imply C89.
* objc/objc-act.c (maybe_objc_comptypes): Delete.
(maybe_objc_check_decl): Delete.
(maybe_building_objc_message_expr): Rename to
objc_message_selector.
* objc/objc-lang.c (objc_init_options): Use clk_c instead of
clk_objective_c; set flag_objc flag.

Index: gcc/c-common.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-common.c,v
retrieving revision 1.362
diff -c -3 -p -r1.362 c-common.c
*** gcc/c-common.c 7 Aug 2002 18:32:07 -0000 1.362
--- gcc/c-common.c 9 Aug 2002 02:09:19 -0000
*************** cpp_reader *parse_in; /* Declared in c-
*** 95,100 ****
--- 95,105 ----

enum c_language_kind c_language;

+ /* The following flag is non-zero whenever ObjC or ObjC++ is being
+ compiled. */
+
+ int flag_objc;
+
/* The following symbols are subsumed in the c_global_trees array, and
listed here individually for documentation purposes.

Index: gcc/c-common.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-common.h,v
retrieving revision 1.148
diff -c -3 -p -r1.148 c-common.h
*** gcc/c-common.h 7 Aug 2002 18:32:07 -0000 1.148
--- gcc/c-common.h 9 Aug 2002 01:36:30 -0000
*************** typedef enum c_language_kind
*** 240,247 ****
{
clk_c, /* A dialect of C: K&R C, ANSI/ISO C89, C2000,
etc. */
! clk_cplusplus, /* ANSI/ISO C++ */
! clk_objective_c /* Objective C */
}
c_language_kind;

--- 240,246 ----
{
clk_c, /* A dialect of C: K&R C, ANSI/ISO C89, C2000,
etc. */
! clk_cplusplus /* ANSI/ISO C++ */
}
c_language_kind;

*************** struct c_lang_decl GTY(()) {
*** 367,372 ****
--- 366,375 ----

extern c_language_kind c_language;

+ /* The following flag is non-zero whenever ObjC or ObjC++ is being
+ compiled. */
+
+ extern int flag_objc;

/* Switches common to the C front ends. */

*************** extern int warn_deprecated;
*** 793,801 ****
infinite template instantiations. */

extern int max_tinst_depth;
-
-
-

/* C types are partitioned into three subsets: object, function, and
incomplete types. */
--- 796,801 ----
Index: gcc/c-decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-decl.c,v
retrieving revision 1.346
diff -c -3 -p -r1.346 c-decl.c
*** gcc/c-decl.c 7 Aug 2002 18:32:07 -0000 1.346
--- gcc/c-decl.c 9 Aug 2002 01:36:32 -0000
*************** implicitly_declare (functionid)
*** 2059,2066 ****
So we record the decl in the standard fashion. */
pushdecl (decl);

! /* This is a no-op in c-lang.c or something real in objc-actions.c. */
! maybe_objc_check_decl (decl);

rest_of_decl_compilation (decl, NULL, 0, 0);

--- 2059,2067 ----
So we record the decl in the standard fashion. */
pushdecl (decl);

! /* This is a no-op in c-lang.c or something real in objc-act.c. */
! if (flag_objc)
! objc_check_decl (decl);

rest_of_decl_compilation (decl, NULL, 0, 0);

*************** finish_decl (decl, init, asmspec_tree)
*** 3097,3104 ****

if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
{
! /* This is a no-op in c-lang.c or something real in objc-actions.c. */
! maybe_objc_check_decl (decl);

if (!DECL_CONTEXT (decl))
{
--- 3098,3106 ----

if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
{
! /* This is a no-op in c-lang.c or something real in objc-act.c. */
! if (flag_objc)
! objc_check_decl (decl);

if (!DECL_CONTEXT (decl))
{
*************** finish_decl (decl, init, asmspec_tree)
*** 3160,3167 ****

if (TREE_CODE (decl) == TYPE_DECL)
{
! /* This is a no-op in c-lang.c or something real in objc-actions.c. */
! maybe_objc_check_decl (decl);
rest_of_decl_compilation (decl, NULL, DECL_CONTEXT (decl) == 0, 0);
}

--- 3162,3170 ----

if (TREE_CODE (decl) == TYPE_DECL)
{
! /* This is a no-op in c-lang.c or something real in objc-act.c. */
! if (flag_objc)
! objc_check_decl (decl);
rest_of_decl_compilation (decl, NULL, DECL_CONTEXT (decl) == 0, 0);
}

*************** grokfield (filename, line, declarator, d
*** 5009,5015 ****
finish_decl (value, NULL_TREE, NULL_TREE);
DECL_INITIAL (value) = width;

! maybe_objc_check_decl (value);
return value;
}


--- 5012,5019 ----
finish_decl (value, NULL_TREE, NULL_TREE);
DECL_INITIAL (value) = width;

! if (flag_objc)
! objc_check_decl (value);
return value;
}


*************** finish_struct (t, fieldlist, attributes)
*** 5297,5304 ****
&& TREE_CODE (decl) != TYPE_DECL)
{
layout_decl (decl, 0);
! /* This is a no-op in c-lang.c or something real in objc-actions.c. */
! maybe_objc_check_decl (decl);
rest_of_decl_compilation (decl, NULL, toplevel, 0);
if (! toplevel)
expand_decl (decl);
--- 5301,5309 ----
&& TREE_CODE (decl) != TYPE_DECL)
{
layout_decl (decl, 0);
! /* This is a no-op in c-lang.c or something real in objc-act.c. */
! if (flag_objc)
! objc_check_decl (decl);
rest_of_decl_compilation (decl, NULL, toplevel, 0);
if (! toplevel)
expand_decl (decl);
*************** finish_struct (t, fieldlist, attributes)
*** 5320,5326 ****
if (TREE_CODE (decl) != TYPE_DECL)
{
layout_decl (decl, 0);
! maybe_objc_check_decl (decl);
rest_of_decl_compilation (decl, NULL, toplevel, 0);
if (! toplevel)
expand_decl (decl);
--- 5325,5332 ----
if (TREE_CODE (decl) != TYPE_DECL)
{
layout_decl (decl, 0);
! if (flag_objc)
! objc_check_decl (decl);
rest_of_decl_compilation (decl, NULL, toplevel, 0);
if (! toplevel)
expand_decl (decl);
Index: gcc/c-lang.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-lang.c,v
retrieving revision 1.96
diff -c -3 -p -r1.96 c-lang.c
*** gcc/c-lang.c 7 Aug 2002 18:32:07 -0000 1.96
--- gcc/c-lang.c 9 Aug 2002 01:36:33 -0000
*************** is_class_name (arg)
*** 183,195 ****
}

void
! maybe_objc_check_decl (decl)
tree decl ATTRIBUTE_UNUSED;
{
}

int
! maybe_objc_comptypes (lhs, rhs, reflexive)
tree lhs ATTRIBUTE_UNUSED;
tree rhs ATTRIBUTE_UNUSED;
int reflexive ATTRIBUTE_UNUSED;
--- 183,195 ----
}

void
! objc_check_decl (decl)
tree decl ATTRIBUTE_UNUSED;
{
}

int
! objc_comptypes (lhs, rhs, reflexive)
tree lhs ATTRIBUTE_UNUSED;
tree rhs ATTRIBUTE_UNUSED;
int reflexive ATTRIBUTE_UNUSED;
*************** maybe_objc_comptypes (lhs, rhs, reflexiv
*** 198,204 ****
}

tree
! maybe_building_objc_message_expr ()
{
return 0;
}
--- 198,204 ----
}

tree
! objc_message_selector ()
{
return 0;
}
Index: gcc/c-lex.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-lex.c,v
retrieving revision 1.185
diff -c -3 -p -r1.185 c-lex.c
*** gcc/c-lex.c 21 Jul 2002 21:59:02 -0000 1.185
--- gcc/c-lex.c 9 Aug 2002 01:36:34 -0000
*************** lex_charconst (token)
*** 1078,1085 ****
type = wchar_type_node;
/* In C, a character constant has type 'int'.
In C++ 'char', but multi-char charconsts have type 'int'. */
! else if ((c_language == clk_c || c_language == clk_objective_c)
! || chars_seen > 1)
type = integer_type_node;
else
type = char_type_node;
--- 1078,1084 ----
type = wchar_type_node;
/* In C, a character constant has type 'int'.
In C++ 'char', but multi-char charconsts have type 'int'. */
! else if ((c_language == clk_c) || chars_seen > 1)
type = integer_type_node;
else
type = char_type_node;
Index: gcc/c-opts.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-opts.c,v
retrieving revision 1.2
diff -c -3 -p -r1.2 c-opts.c
*** gcc/c-opts.c 8 Aug 2002 06:30:12 -0000 1.2
--- gcc/c-opts.c 9 Aug 2002 01:36:35 -0000
*************** c_common_init_options (lang)
*** 366,376 ****
#endif

c_language = lang;
! parse_in = cpp_create_reader (lang == clk_c || lang == clk_objective_c
? CLK_GNUC89 : CLK_GNUCXX);
cpp_opts = cpp_get_options (parse_in);

! if (lang == clk_objective_c)
cpp_opts->objc = 1;

flag_const_strings = (lang == clk_cplusplus);
--- 366,376 ----
#endif

c_language = lang;
! parse_in = cpp_create_reader (lang == clk_c
? CLK_GNUC89 : CLK_GNUCXX);
cpp_opts = cpp_get_options (parse_in);

! if (flag_objc)
cpp_opts->objc = 1;

flag_const_strings = (lang == clk_cplusplus);
*************** c_common_decode_option (argc, argv)
*** 409,415 ****
{
case clk_c: lang_flag = CL_C_ONLY; break;
case clk_cplusplus: lang_flag = CL_CXX_ONLY; break;
- case clk_objective_c: lang_flag = CL_OBJC_ONLY; break;
default: abort ();
}

--- 409,414 ----
*************** c_common_decode_option (argc, argv)
*** 493,499 ****
if (warn_uninitialized != 1)
warn_uninitialized = (on ? 2 : 0);

! if (c_language == clk_c || c_language == clk_objective_c)
/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
can turn it off only if it's not explicit. */
warn_main = on * 2;
--- 492,498 ----
if (warn_uninitialized != 1)
warn_uninitialized = (on ? 2 : 0);

! if (c_language == clk_c)
/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
can turn it off only if it's not explicit. */
warn_main = on * 2;
*************** c_common_decode_option (argc, argv)
*** 751,764 ****
break;

case OPT_Wwrite_strings:
! if (c_language == clk_c || c_language == clk_objective_c)
flag_const_strings = on;
else
warn_write_strings = on;
break;

case OPT_fcond_mismatch:
! if (c_language == clk_c || c_language == clk_objective_c)
{
flag_cond_mismatch = on;
break;
--- 750,763 ----
break;

case OPT_Wwrite_strings:
! if (c_language == clk_c)
flag_const_strings = on;
else
warn_write_strings = on;
break;

case OPT_fcond_mismatch:
! if (c_language == clk_c)
{
flag_cond_mismatch = on;
break;
*************** c_common_decode_option (argc, argv)
*** 1046,1052 ****
case OPT_std_iso9899_199409:
case OPT_ansi:
/* Note: -ansi is used by both the C and C++ front ends. */
! if (c_language == clk_c || c_language == clk_objective_c)
{
flag_no_asm = 1;
flag_writable_strings = 0;
--- 1045,1051 ----
case OPT_std_iso9899_199409:
case OPT_ansi:
/* Note: -ansi is used by both the C and C++ front ends. */
! if (c_language == clk_c)
{
flag_no_asm = 1;
flag_writable_strings = 0;
Index: gcc/c-parse.in
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-parse.in,v
retrieving revision 1.150
diff -c -3 -p -r1.150 c-parse.in
*** gcc/c-parse.in 26 Jul 2002 16:23:05 -0000 1.150
--- gcc/c-parse.in 9 Aug 2002 01:36:36 -0000
*************** init_reswords ()
*** 3546,3552 ****
int mask = (flag_isoc99 ? 0 : D_C89)
| (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0);

! if (c_language != clk_objective_c)
mask |= D_OBJC;

/* It is not necessary to register ridpointers as a GC root, because
--- 3546,3552 ----
int mask = (flag_isoc99 ? 0 : D_C89)
| (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0);

! if (!flag_objc)
mask |= D_OBJC;

/* It is not necessary to register ridpointers as a GC root, because
Index: gcc/c-tree.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-tree.h,v
retrieving revision 1.103
diff -c -3 -p -r1.103 c-tree.h
*** gcc/c-tree.h 7 Aug 2002 18:32:07 -0000 1.103
--- gcc/c-tree.h 9 Aug 2002 01:36:37 -0000
*************** struct lang_type GTY(())
*** 165,174 ****
/* in c-lang.c and objc-act.c */
extern tree lookup_interface PARAMS ((tree));
extern tree is_class_name PARAMS ((tree));
! extern void maybe_objc_check_decl PARAMS ((tree));
extern void finish_file PARAMS ((void));
! extern int maybe_objc_comptypes PARAMS ((tree, tree, int));
! extern tree maybe_building_objc_message_expr PARAMS ((void));
extern int recognize_objc_keyword PARAMS ((void));
extern tree lookup_objc_ivar PARAMS ((tree));

--- 165,174 ----
/* in c-lang.c and objc-act.c */
extern tree lookup_interface PARAMS ((tree));
extern tree is_class_name PARAMS ((tree));
! extern void objc_check_decl PARAMS ((tree));
extern void finish_file PARAMS ((void));
! extern int objc_comptypes PARAMS ((tree, tree, int));
! extern tree objc_message_selector PARAMS ((void));
extern int recognize_objc_keyword PARAMS ((void));
extern tree lookup_objc_ivar PARAMS ((tree));

Index: gcc/c-typeck.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-typeck.c,v
retrieving revision 1.201
diff -c -3 -p -r1.201 c-typeck.c
*** gcc/c-typeck.c 25 Jul 2002 08:58:02 -0000 1.201
--- gcc/c-typeck.c 9 Aug 2002 01:36:38 -0000
*************** comptypes (type1, type2)
*** 568,574 ****
}

case RECORD_TYPE:
! if (maybe_objc_comptypes (t1, t2, 0) == 1)
val = 1;
break;

--- 568,574 ----
}

case RECORD_TYPE:
! if (flag_objc && objc_comptypes (t1, t2, 0) == 1)
val = 1;
break;

*************** comp_target_types (ttl, ttr)
*** 588,594 ****
int val;

/* Give maybe_objc_comptypes a crack at letting these types through. */
! if ((val = maybe_objc_comptypes (ttl, ttr, 1)) >= 0)
return val;

val = comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (ttl)),
--- 588,594 ----
int val;

/* Give maybe_objc_comptypes a crack at letting these types through. */
! if ((val = objc_comptypes (ttl, ttr, 1)) >= 0)
return val;

val = comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (ttl)),
*************** convert_for_assignment (type, rhs, errty
*** 3985,3991 ****
overflow_warning (rhs);
/* Check for Objective-C protocols. This will issue a warning if
there are protocol violations. No need to use the return value. */
! maybe_objc_comptypes (type, rhstype, 0);
return rhs;
}

--- 3985,3992 ----
overflow_warning (rhs);
/* Check for Objective-C protocols. This will issue a warning if
there are protocol violations. No need to use the return value. */
! if (flag_objc)
! objc_comptypes (type, rhstype, 0);
return rhs;
}

*************** convert_for_assignment (type, rhs, errty
*** 4213,4219 ****
{
if (funname)
{
! tree selector = maybe_building_objc_message_expr ();

if (selector && parmnum > 2)
error ("incompatible type for argument %d of `%s'",
--- 4214,4220 ----
{
if (funname)
{
! tree selector = objc_message_selector ();

if (selector && parmnum > 2)
error ("incompatible type for argument %d of `%s'",
*************** warn_for_assignment (msgid, opname, func
*** 4271,4277 ****
{
if (opname == 0)
{
! tree selector = maybe_building_objc_message_expr ();
char * new_opname;

if (selector && argnum > 2)
--- 4272,4278 ----
{
if (opname == 0)
{
! tree selector = objc_message_selector ();
char * new_opname;

if (selector && argnum > 2)
Index: gcc/cppinit.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cppinit.c,v
retrieving revision 1.250
diff -c -3 -p -r1.250 cppinit.c
*** gcc/cppinit.c 8 Aug 2002 06:30:12 -0000 1.250
--- gcc/cppinit.c 9 Aug 2002 01:36:40 -0000
*************** init_builtins (pfile)
*** 695,710 ****

if (CPP_OPTION (pfile, cplusplus))
_cpp_define_builtin (pfile, "__cplusplus 1");
- else if (CPP_OPTION (pfile, objc))
- _cpp_define_builtin (pfile, "__OBJC__ 1");
else if (CPP_OPTION (pfile, lang) == CLK_ASM)
_cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
!
! if (CPP_OPTION (pfile, lang) == CLK_STDC94)
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
else if (CPP_OPTION (pfile, c99))
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");

if (pfile->cb.register_builtins)
(*pfile->cb.register_builtins) (pfile);
}
--- 695,710 ----

if (CPP_OPTION (pfile, cplusplus))
_cpp_define_builtin (pfile, "__cplusplus 1");
else if (CPP_OPTION (pfile, lang) == CLK_ASM)
_cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
! else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
else if (CPP_OPTION (pfile, c99))
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");

+ if (CPP_OPTION (pfile, objc))
+ _cpp_define_builtin (pfile, "__OBJC__ 1");
+
if (pfile->cb.register_builtins)
(*pfile->cb.register_builtins) (pfile);
}
*************** cpp_handle_option (pfile, argc, argv)
*** 1388,1393 ****
--- 1388,1394 ----
break;
case OPT_lang_objc:
CPP_OPTION (pfile, objc) = 1;
+ set_lang (pfile, CLK_STDC89);
break;
case OPT_lang_asm:
set_lang (pfile, CLK_ASM);
Index: gcc/objc/objc-act.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/objc/objc-act.c,v
retrieving revision 1.148
diff -c -3 -p -r1.148 objc-act.c
*** gcc/objc/objc-act.c 7 Aug 2002 18:32:11 -0000 1.148
--- gcc/objc/objc-act.c 9 Aug 2002 01:36:41 -0000
*************** define_decl (declarator, declspecs)
*** 518,531 ****
`a' and `b' are the same class type, or
`a' and `b' are of class types A and B such that B is a descendant of A. */

- int
- maybe_objc_comptypes (lhs, rhs, reflexive)
- tree lhs, rhs;
- int reflexive;
- {
- return objc_comptypes (lhs, rhs, reflexive);
- }
-
static tree
lookup_method_in_protocol_list (rproto_list, sel_name, class_meth)
tree rproto_list;
--- 518,523 ----
*************** objc_check_decl (decl)
*** 764,776 ****
error_with_decl (decl, "`%s' cannot be statically allocated");
}

- void
- maybe_objc_check_decl (decl)
- tree decl;
- {
- objc_check_decl (decl);
- }
-
/* Implement static typing. At this point, we know we have an interface. */

tree
--- 756,761 ----
*************** receiver_is_class_object (receiver)
*** 4664,4670 ****
static tree building_objc_message_expr = 0;

tree
! maybe_building_objc_message_expr ()
{
return building_objc_message_expr;
}
--- 4649,4655 ----
static tree building_objc_message_expr = 0;

tree
! objc_message_selector ()
{
return building_objc_message_expr;
}
Index: gcc/objc/objc-lang.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/objc/objc-lang.c,v
retrieving revision 1.25
diff -c -3 -p -r1.25 objc-lang.c
*** gcc/objc/objc-lang.c 7 Aug 2002 18:32:11 -0000 1.25
--- gcc/objc/objc-lang.c 9 Aug 2002 01:36:42 -0000
*************** const char * const tree_code_name[] = {
*** 162,166 ****
static void
objc_init_options ()
{
! c_common_init_options (clk_objective_c);
! }
--- 162,171 ----
static void
objc_init_options ()
{
! flag_objc = 1;
! #ifdef OBJCPLUS
! cxx_init_options (clk_cplusplus);
! #else
! c_common_init_options (clk_c);
! #endif
! }

--------------------------------------------------------------
Ziemowit Laski 1 Infinite Loop, MS 301-2K
Mac OS X Compiler Group Cupertino, CA USA 95014-2083
Apple Computer, Inc. +1.408.974.6229 Fax .5477


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]