2012-05-17 Paolo Carlini <paolo.carlini@oracle.com>
[official-gcc.git] / gcc / objc / objc-act.c
blobb93948e9ee0a88d22cd576776684cfa69e5e0cfe
1 /* Implement classes and message passing for Objective C.
2 Copyright (C) 1992, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
5 Contributed by Steve Naroff.
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
29 #ifdef OBJCPLUS
30 #include "cp-tree.h"
31 #else
32 #include "c-tree.h"
33 #include "c-lang.h"
34 #endif
36 #include "c-family/c-common.h"
37 #include "c-family/c-objc.h"
38 #include "c-family/c-pragma.h"
39 #include "c-family/c-format.h"
40 #include "flags.h"
41 #include "langhooks.h"
42 #include "objc-act.h"
43 #include "objc-map.h"
44 #include "input.h"
45 #include "function.h"
46 #include "output.h"
47 #include "toplev.h"
48 #include "ggc.h"
49 #include "debug.h"
50 #include "c-family/c-target.h"
51 #include "diagnostic-core.h"
52 #include "intl.h"
53 #include "cgraph.h"
54 #include "tree-iterator.h"
55 #include "hashtab.h"
56 #include "langhooks-def.h"
57 /* Different initialization, code gen and meta data generation for each
58 runtime. */
59 #include "objc-runtime-hooks.h"
60 /* Routines used mainly by the runtimes. */
61 #include "objc-runtime-shared-support.h"
62 /* For default_tree_printer (). */
63 #include "tree-pretty-print.h"
65 /* For enum gimplify_status */
66 #include "gimple.h"
68 /* For encode_method_prototype(). */
69 #include "objc-encoding.h"
71 static unsigned int should_call_super_dealloc = 0;
73 /* When building Objective-C++, we are not linking against the C front-end
74 and so need to replicate the C tree-construction functions in some way. */
75 #ifdef OBJCPLUS
76 #define OBJCP_REMAP_FUNCTIONS
77 #include "objcp-decl.h"
78 #endif /* OBJCPLUS */
80 /* This is the default way of generating a method name. */
81 /* This has the problem that "test_method:argument:" and
82 "test:method_argument:" will generate the same name
83 ("_i_Test__test_method_argument_" for an instance method of the
84 class "Test"), so you can't have them both in the same class!
85 Moreover, the demangling (going from
86 "_i_Test__test_method_argument" back to the original name) is
87 undefined because there are two correct ways of demangling the
88 name. */
89 #ifndef OBJC_GEN_METHOD_LABEL
90 #define OBJC_GEN_METHOD_LABEL(BUF, IS_INST, CLASS_NAME, CAT_NAME, SEL_NAME, NUM) \
91 do { \
92 char *temp; \
93 sprintf ((BUF), "_%s_%s_%s_%s", \
94 ((IS_INST) ? "i" : "c"), \
95 (CLASS_NAME), \
96 ((CAT_NAME)? (CAT_NAME) : ""), \
97 (SEL_NAME)); \
98 for (temp = (BUF); *temp; temp++) \
99 if (*temp == ':') *temp = '_'; \
100 } while (0)
101 #endif
103 /* These need specifying. */
104 #ifndef OBJC_FORWARDING_STACK_OFFSET
105 #define OBJC_FORWARDING_STACK_OFFSET 0
106 #endif
108 #ifndef OBJC_FORWARDING_MIN_OFFSET
109 #define OBJC_FORWARDING_MIN_OFFSET 0
110 #endif
112 /*** Private Interface (procedures) ***/
114 /* Init stuff. */
115 static void synth_module_prologue (void);
117 /* Code generation. */
119 static tree start_class (enum tree_code, tree, tree, tree, tree);
120 static tree continue_class (tree);
121 static void finish_class (tree);
122 static void start_method_def (tree, tree);
124 static tree start_protocol (enum tree_code, tree, tree, tree);
125 static tree build_method_decl (enum tree_code, tree, tree, tree, bool);
126 static tree objc_add_method (tree, tree, int, bool);
127 static tree add_instance_variable (tree, objc_ivar_visibility_kind, tree);
128 static tree build_ivar_reference (tree);
129 static tree is_ivar (tree, tree);
131 /* We only need the following for ObjC; ObjC++ will use C++'s definition
132 of DERIVED_FROM_P. */
133 #ifndef OBJCPLUS
134 static bool objc_derived_from_p (tree, tree);
135 #define DERIVED_FROM_P(PARENT, CHILD) objc_derived_from_p (PARENT, CHILD)
136 #endif
138 /* Property. */
139 static void objc_gen_property_data (tree, tree);
140 static void objc_synthesize_getter (tree, tree, tree);
141 static void objc_synthesize_setter (tree, tree, tree);
142 static tree lookup_property (tree, tree);
143 static tree lookup_property_in_list (tree, tree);
144 static tree lookup_property_in_protocol_list (tree, tree);
145 static void build_common_objc_property_accessor_helpers (void);
147 static void objc_xref_basetypes (tree, tree);
149 static tree get_class_ivars (tree, bool);
151 static void build_fast_enumeration_state_template (void);
153 #ifdef OBJCPLUS
154 static void objc_generate_cxx_cdtors (void);
155 #endif
157 /* objc attribute */
158 static void objc_decl_method_attributes (tree*, tree, int);
159 static tree build_keyword_selector (tree);
161 static void hash_init (void);
163 /* Hash tables to manage the global pool of method prototypes. Each
164 of these maps map a method name (selector) identifier to either a
165 single tree (for methods with a single method prototype) or a
166 TREE_VEC (for methods with multiple method prototypes). */
167 static GTY(()) objc_map_t instance_method_map = 0;
168 static GTY(()) objc_map_t class_method_map = 0;
170 /* Hash tables to manage the global pool of class names. */
172 static GTY(()) objc_map_t class_name_map = 0;
173 static GTY(()) objc_map_t alias_name_map = 0;
175 static tree lookup_method (tree, tree);
176 static tree lookup_method_static (tree, tree, int);
178 static void interface_hash_init (void);
179 static tree add_interface (tree, tree);
180 static void add_category (tree, tree);
181 static inline tree lookup_category (tree, tree);
183 /* Protocols. */
185 static tree lookup_protocol (tree, bool, bool);
186 static tree lookup_and_install_protocols (tree, bool);
188 #ifdef OBJCPLUS
189 static void really_start_method (tree, tree);
190 #else
191 static void really_start_method (tree, struct c_arg_info *);
192 #endif
193 static int comp_proto_with_proto (tree, tree, int);
194 static tree objc_decay_parm_type (tree);
196 /* Utilities for debugging and error diagnostics. */
198 static char *gen_type_name (tree);
199 static char *gen_type_name_0 (tree);
200 static char *gen_method_decl (tree);
201 static char *gen_declaration (tree);
203 /* Everything else. */
205 static void generate_struct_by_value_array (void) ATTRIBUTE_NORETURN;
207 static void mark_referenced_methods (void);
208 static bool objc_type_valid_for_messaging (tree type, bool allow_classes);
209 static tree check_duplicates (tree, int, int);
211 /*** Private Interface (data) ***/
212 /* Flags for lookup_method_static(). */
214 /* Look for class methods. */
215 #define OBJC_LOOKUP_CLASS 1
216 /* Do not examine superclasses. */
217 #define OBJC_LOOKUP_NO_SUPER 2
218 /* Disable returning an instance method of a root class when a class
219 method can't be found. */
220 #define OBJC_LOOKUP_NO_INSTANCE_METHODS_OF_ROOT_CLASS 4
222 /* The OCTI_... enumeration itself is in objc/objc-act.h. */
223 tree objc_global_trees[OCTI_MAX];
225 struct imp_entry *imp_list = 0;
226 int imp_count = 0; /* `@implementation' */
227 int cat_count = 0; /* `@category' */
229 objc_ivar_visibility_kind objc_ivar_visibility;
231 /* Use to generate method labels. */
232 static int method_slot = 0;
234 /* Flag to say whether methods in a protocol are optional or
235 required. */
236 static bool objc_method_optional_flag = false;
238 static int objc_collecting_ivars = 0;
240 /* Flag that is set to 'true' while we are processing a class
241 extension. Since a class extension just "reopens" the main
242 @interface, this can be used to determine if we are in the main
243 @interface, or in a class extension. */
244 static bool objc_in_class_extension = false;
246 static char *errbuf; /* Buffer for error diagnostics */
248 /* An array of all the local variables in the current function that
249 need to be marked as volatile. */
250 VEC(tree,gc) *local_variables_to_volatilize = NULL;
252 /* Store all constructed constant strings in a hash table so that
253 they get uniqued properly. */
255 struct GTY(()) string_descriptor {
256 /* The literal argument . */
257 tree literal;
259 /* The resulting constant string. */
260 tree constructor;
263 static GTY((param_is (struct string_descriptor))) htab_t string_htab;
265 FILE *gen_declaration_file;
267 /* Hooks for stuff that differs between runtimes. */
268 objc_runtime_hooks runtime;
270 /* Create a temporary variable of type 'type'. If 'name' is set, uses
271 the specified name, else use no name. Returns the declaration of
272 the type. The 'name' is mostly useful for debugging.
274 tree
275 objc_create_temporary_var (tree type, const char *name)
277 tree decl;
279 if (name != NULL)
281 decl = build_decl (input_location,
282 VAR_DECL, get_identifier (name), type);
284 else
286 decl = build_decl (input_location,
287 VAR_DECL, NULL_TREE, type);
289 TREE_USED (decl) = 1;
290 DECL_ARTIFICIAL (decl) = 1;
291 DECL_IGNORED_P (decl) = 1;
292 DECL_CONTEXT (decl) = current_function_decl;
294 return decl;
297 /* Some platforms pass small structures through registers versus
298 through an invisible pointer. Determine at what size structure is
299 the transition point between the two possibilities. */
301 static void
302 generate_struct_by_value_array (void)
304 tree type;
305 tree decls;
306 int i, j;
307 int aggregate_in_mem[32];
308 int found = 0;
310 /* Presumably no platform passes 32 byte structures in a register. */
311 /* ??? As an example, m64/ppc/Darwin can pass up to 8*long+13*double
312 in registers. */
313 for (i = 1; i < 32; i++)
315 char buffer[5];
316 tree *chain = NULL;
318 /* Create an unnamed struct that has `i' character components */
319 type = objc_start_struct (NULL_TREE);
321 strcpy (buffer, "c1");
322 decls = add_field_decl (char_type_node, buffer, &chain);
324 for (j = 1; j < i; j++)
326 sprintf (buffer, "c%d", j + 1);
327 add_field_decl (char_type_node, buffer, &chain);
329 objc_finish_struct (type, decls);
331 aggregate_in_mem[i] = aggregate_value_p (type, 0);
332 if (!aggregate_in_mem[i])
333 found = 1;
336 /* We found some structures that are returned in registers instead of memory
337 so output the necessary data. */
338 if (found)
340 for (i = 31; i >= 0; i--)
341 if (!aggregate_in_mem[i])
342 break;
343 printf ("#define OBJC_MAX_STRUCT_BY_VALUE %d\n", i);
346 exit (0);
349 bool
350 objc_init (void)
352 bool ok;
353 #ifdef OBJCPLUS
354 if (cxx_init () == false)
355 #else
356 if (c_objc_common_init () == false)
357 #endif
358 return false;
360 /* print_struct_values is triggered by -print-runtime-info (used
361 when building libobjc, with an empty file as input). It does not
362 require any ObjC setup, and it never returns.
364 -fcompare-debug is used to check the compiler output; we are
365 executed twice, once with flag_compare_debug set, and once with
366 it not set. If the flag is used together with
367 -print-runtime-info, we want to print the runtime info only once,
368 else it would be output in duplicate. So we check
369 flag_compare_debug to output it in only one of the invocations.
371 As a side effect, this also that means -fcompare-debug
372 -print-runtime-info will run the compiler twice, and compare the
373 generated assembler file; the first time the compiler exits
374 immediately (producing no file), and the second time it compiles
375 an empty file. This checks, as a side effect, that compiling an
376 empty file produces no assembler output. */
377 if (print_struct_values && !flag_compare_debug)
378 generate_struct_by_value_array ();
380 /* Set up stuff used by FE parser and all runtimes. */
381 errbuf = XNEWVEC (char, 1024 * 10);
382 interface_hash_init ();
383 hash_init ();
384 objc_encoding_init ();
385 /* ... and then check flags and set-up for the selected runtime ... */
386 if (flag_next_runtime && flag_objc_abi >= 2)
387 ok = objc_next_runtime_abi_02_init (&runtime);
388 else if (flag_next_runtime)
389 ok = objc_next_runtime_abi_01_init (&runtime);
390 else
391 ok = objc_gnu_runtime_abi_01_init (&runtime);
393 /* If that part of the setup failed - bail out immediately. */
394 if (!ok)
395 return false;
397 /* Generate general types and push runtime-specific decls to file scope. */
398 synth_module_prologue ();
400 return true;
403 /* This is called automatically (at the very end of compilation) by
404 c_write_global_declarations and cp_write_global_declarations. */
405 void
406 objc_write_global_declarations (void)
408 mark_referenced_methods ();
410 /* A missing @end might not be detected by the parser. */
411 if (objc_implementation_context)
413 warning (0, "%<@end%> missing in implementation context");
414 finish_class (objc_implementation_context);
415 objc_ivar_chain = NULL_TREE;
416 objc_implementation_context = NULL_TREE;
419 if (warn_selector)
421 objc_map_iterator_t i;
423 objc_map_iterator_initialize (class_method_map, &i);
424 while (objc_map_iterator_move_to_next (class_method_map, &i))
425 check_duplicates (objc_map_iterator_current_value (class_method_map, i), 0, 1);
427 objc_map_iterator_initialize (instance_method_map, &i);
428 while (objc_map_iterator_move_to_next (instance_method_map, &i))
429 check_duplicates (objc_map_iterator_current_value (instance_method_map, i), 0, 0);
432 /* TODO: consider an early exit here if either errorcount or sorrycount
433 is non-zero. Not only is it wasting time to generate the metadata,
434 it needlessly imposes need to re-check for things that are already
435 determined to be errors. */
437 /* Finalize Objective-C runtime data. No need to generate tables
438 and code if only checking syntax, or if generating a PCH file. */
439 if (!flag_syntax_only && !pch_file)
441 location_t saved_location;
443 /* If gen_declaration desired, open the output file. */
444 if (flag_gen_declaration)
446 char * const dumpname = concat (dump_base_name, ".decl", NULL);
447 gen_declaration_file = fopen (dumpname, "w");
448 if (gen_declaration_file == 0)
449 fatal_error ("can%'t open %s: %m", dumpname);
450 free (dumpname);
453 /* Set the input location to BUILTINS_LOCATION. This is good
454 for error messages, in case any is generated while producing
455 the metadata, but it also silences warnings that would be
456 produced when compiling with -Wpadded in case when padding is
457 automatically added to the built-in runtime data structure
458 declarations. We know about this padding, and it is fine; we
459 don't want users to see any warnings about it if they use
460 -Wpadded. */
461 saved_location = input_location;
462 input_location = BUILTINS_LOCATION;
464 /* Compute and emit the meta-data tables for this runtime. */
465 (*runtime.generate_metadata) ();
467 /* Restore the original location, just in case it mattered. */
468 input_location = saved_location;
470 /* ... and then close any declaration file we opened. */
471 if (gen_declaration_file)
472 fclose (gen_declaration_file);
476 /* Return the first occurrence of a method declaration corresponding
477 to sel_name in rproto_list. Search rproto_list recursively.
478 If is_class is 0, search for instance methods, otherwise for class
479 methods. */
480 static tree
481 lookup_method_in_protocol_list (tree rproto_list, tree sel_name,
482 int is_class)
484 tree rproto, p, m;
486 for (rproto = rproto_list; rproto; rproto = TREE_CHAIN (rproto))
488 p = TREE_VALUE (rproto);
489 m = NULL_TREE;
491 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
493 /* First, search the @required protocol methods. */
494 if (is_class)
495 m = lookup_method (PROTOCOL_CLS_METHODS (p), sel_name);
496 else
497 m = lookup_method (PROTOCOL_NST_METHODS (p), sel_name);
499 if (m)
500 return m;
502 /* If still not found, search the @optional protocol methods. */
503 if (is_class)
504 m = lookup_method (PROTOCOL_OPTIONAL_CLS_METHODS (p), sel_name);
505 else
506 m = lookup_method (PROTOCOL_OPTIONAL_NST_METHODS (p), sel_name);
508 if (m)
509 return m;
511 /* If still not found, search the attached protocols. */
512 if (PROTOCOL_LIST (p))
513 m = lookup_method_in_protocol_list (PROTOCOL_LIST (p),
514 sel_name, is_class);
515 if (m)
516 return m;
518 else
520 ; /* An identifier...if we could not find a protocol. */
524 return 0;
527 static tree
528 lookup_protocol_in_reflist (tree rproto_list, tree lproto)
530 tree rproto, p;
532 /* Make sure the protocol is supported by the object on the rhs. */
533 if (TREE_CODE (lproto) == PROTOCOL_INTERFACE_TYPE)
535 tree fnd = 0;
536 for (rproto = rproto_list; rproto; rproto = TREE_CHAIN (rproto))
538 p = TREE_VALUE (rproto);
540 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
542 if (lproto == p)
543 fnd = lproto;
545 else if (PROTOCOL_LIST (p))
546 fnd = lookup_protocol_in_reflist (PROTOCOL_LIST (p), lproto);
549 if (fnd)
550 return fnd;
553 else
555 ; /* An identifier...if we could not find a protocol. */
558 return 0;
561 void
562 objc_start_class_interface (tree klass, tree super_class,
563 tree protos, tree attributes)
565 if (flag_objc1_only && attributes)
566 error_at (input_location, "class attributes are not available in Objective-C 1.0");
568 objc_interface_context
569 = objc_ivar_context
570 = start_class (CLASS_INTERFACE_TYPE, klass, super_class, protos, attributes);
571 objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
574 void
575 objc_start_category_interface (tree klass, tree categ,
576 tree protos, tree attributes)
578 if (attributes)
580 if (flag_objc1_only)
581 error_at (input_location, "category attributes are not available in Objective-C 1.0");
582 else
583 warning_at (input_location, OPT_Wattributes,
584 "category attributes are not available in this version"
585 " of the compiler, (ignored)");
587 if (categ == NULL_TREE)
589 if (flag_objc1_only)
590 error_at (input_location, "class extensions are not available in Objective-C 1.0");
591 else
593 /* Iterate over all the classes and categories implemented
594 up to now in this compilation unit. */
595 struct imp_entry *t;
597 for (t = imp_list; t; t = t->next)
599 /* If we find a class @implementation with the same name
600 as the one we are extending, produce an error. */
601 if (TREE_CODE (t->imp_context) == CLASS_IMPLEMENTATION_TYPE
602 && IDENTIFIER_POINTER (CLASS_NAME (t->imp_context)) == IDENTIFIER_POINTER (klass))
603 error_at (input_location,
604 "class extension for class %qE declared after its %<@implementation%>",
605 klass);
609 objc_interface_context
610 = start_class (CATEGORY_INTERFACE_TYPE, klass, categ, protos, NULL_TREE);
611 objc_ivar_chain
612 = continue_class (objc_interface_context);
615 void
616 objc_start_protocol (tree name, tree protos, tree attributes)
618 if (flag_objc1_only && attributes)
619 error_at (input_location, "protocol attributes are not available in Objective-C 1.0");
621 objc_interface_context
622 = start_protocol (PROTOCOL_INTERFACE_TYPE, name, protos, attributes);
623 objc_method_optional_flag = false;
626 void
627 objc_continue_interface (void)
629 objc_ivar_chain
630 = continue_class (objc_interface_context);
633 void
634 objc_finish_interface (void)
636 finish_class (objc_interface_context);
637 objc_interface_context = NULL_TREE;
638 objc_method_optional_flag = false;
639 objc_in_class_extension = false;
642 void
643 objc_start_class_implementation (tree klass, tree super_class)
645 objc_implementation_context
646 = objc_ivar_context
647 = start_class (CLASS_IMPLEMENTATION_TYPE, klass, super_class, NULL_TREE,
648 NULL_TREE);
649 objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
652 void
653 objc_start_category_implementation (tree klass, tree categ)
655 objc_implementation_context
656 = start_class (CATEGORY_IMPLEMENTATION_TYPE, klass, categ, NULL_TREE,
657 NULL_TREE);
658 objc_ivar_chain
659 = continue_class (objc_implementation_context);
662 void
663 objc_continue_implementation (void)
665 objc_ivar_chain
666 = continue_class (objc_implementation_context);
669 void
670 objc_finish_implementation (void)
672 #ifdef OBJCPLUS
673 if (flag_objc_call_cxx_cdtors)
674 objc_generate_cxx_cdtors ();
675 #endif
677 if (objc_implementation_context)
679 finish_class (objc_implementation_context);
680 objc_ivar_chain = NULL_TREE;
681 objc_implementation_context = NULL_TREE;
683 else
684 warning (0, "%<@end%> must appear in an @implementation context");
687 void
688 objc_set_visibility (objc_ivar_visibility_kind visibility)
690 if (visibility == OBJC_IVAR_VIS_PACKAGE)
692 if (flag_objc1_only)
693 error ("%<@package%> is not available in Objective-C 1.0");
694 else
695 warning (0, "%<@package%> presently has the same effect as %<@public%>");
697 objc_ivar_visibility = visibility;
700 void
701 objc_set_method_opt (bool optional)
703 if (flag_objc1_only)
705 if (optional)
706 error_at (input_location, "%<@optional%> is not available in Objective-C 1.0");
707 else
708 error_at (input_location, "%<@required%> is not available in Objective-C 1.0");
711 objc_method_optional_flag = optional;
712 if (!objc_interface_context
713 || TREE_CODE (objc_interface_context) != PROTOCOL_INTERFACE_TYPE)
715 if (optional)
716 error ("%<@optional%> is allowed in @protocol context only");
717 else
718 error ("%<@required%> is allowed in @protocol context only");
719 objc_method_optional_flag = false;
723 /* This routine looks for a given PROPERTY in a list of CLASS, CATEGORY, or
724 PROTOCOL. */
725 static tree
726 lookup_property_in_list (tree chain, tree property)
728 tree x;
729 for (x = CLASS_PROPERTY_DECL (chain); x; x = TREE_CHAIN (x))
730 if (PROPERTY_NAME (x) == property)
731 return x;
732 return NULL_TREE;
735 /* This routine looks for a given PROPERTY in the tree chain of RPROTO_LIST. */
736 static tree lookup_property_in_protocol_list (tree rproto_list, tree property)
738 tree rproto, x;
739 for (rproto = rproto_list; rproto; rproto = TREE_CHAIN (rproto))
741 tree p = TREE_VALUE (rproto);
742 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
744 if ((x = lookup_property_in_list (p, property)))
745 return x;
746 if (PROTOCOL_LIST (p))
747 return lookup_property_in_protocol_list (PROTOCOL_LIST (p), property);
749 else
751 ; /* An identifier...if we could not find a protocol. */
754 return NULL_TREE;
757 /* This routine looks up the PROPERTY in current INTERFACE, its categories and up the
758 chain of interface hierarchy. */
759 static tree
760 lookup_property (tree interface_type, tree property)
762 tree inter = interface_type;
763 while (inter)
765 tree x, category;
766 if ((x = lookup_property_in_list (inter, property)))
767 return x;
768 /* Failing that, look for the property in each category of the class. */
769 category = inter;
770 while ((category = CLASS_CATEGORY_LIST (category)))
772 if ((x = lookup_property_in_list (category, property)))
773 return x;
775 /* When checking a category, also check the protocols
776 attached with the category itself. */
777 if (CLASS_PROTOCOL_LIST (category)
778 && (x = lookup_property_in_protocol_list
779 (CLASS_PROTOCOL_LIST (category), property)))
780 return x;
783 /* Failing to find in categories, look for property in protocol list. */
784 if (CLASS_PROTOCOL_LIST (inter)
785 && (x = lookup_property_in_protocol_list
786 (CLASS_PROTOCOL_LIST (inter), property)))
787 return x;
789 /* Failing that, climb up the inheritance hierarchy. */
790 inter = lookup_interface (CLASS_SUPER_NAME (inter));
792 return inter;
795 /* This routine is called by the parser when a
796 @property... declaration is found. 'decl' is the declaration of
797 the property (type/identifier), and the other arguments represent
798 property attributes that may have been specified in the Objective-C
799 declaration. 'parsed_property_readonly' is 'true' if the attribute
800 'readonly' was specified, and 'false' if not; similarly for the
801 other bool parameters. 'parsed_property_getter_ident' is NULL_TREE
802 if the attribute 'getter' was not specified, and is the identifier
803 corresponding to the specified getter if it was; similarly for
804 'parsed_property_setter_ident'. */
805 void
806 objc_add_property_declaration (location_t location, tree decl,
807 bool parsed_property_readonly, bool parsed_property_readwrite,
808 bool parsed_property_assign, bool parsed_property_retain,
809 bool parsed_property_copy, bool parsed_property_nonatomic,
810 tree parsed_property_getter_ident, tree parsed_property_setter_ident)
812 tree property_decl;
813 tree x;
814 /* 'property_readonly' and 'property_assign_semantics' are the final
815 attributes of the property after all parsed attributes have been
816 considered (eg, if we parsed no 'readonly' and no 'readwrite', ie
817 parsed_property_readonly = false and parsed_property_readwrite =
818 false, then property_readonly will be false because the default
819 is readwrite). */
820 bool property_readonly = false;
821 objc_property_assign_semantics property_assign_semantics = OBJC_PROPERTY_ASSIGN;
822 bool property_extension_in_class_extension = false;
824 if (flag_objc1_only)
825 error_at (input_location, "%<@property%> is not available in Objective-C 1.0");
827 if (parsed_property_readonly && parsed_property_readwrite)
829 error_at (location, "%<readonly%> attribute conflicts with %<readwrite%> attribute");
830 /* In case of conflicting attributes (here and below), after
831 producing an error, we pick one of the attributes and keep
832 going. */
833 property_readonly = false;
835 else
837 if (parsed_property_readonly)
838 property_readonly = true;
840 if (parsed_property_readwrite)
841 property_readonly = false;
844 if (parsed_property_readonly && parsed_property_setter_ident)
846 error_at (location, "%<readonly%> attribute conflicts with %<setter%> attribute");
847 property_readonly = false;
850 if (parsed_property_assign && parsed_property_retain)
852 error_at (location, "%<assign%> attribute conflicts with %<retain%> attribute");
853 property_assign_semantics = OBJC_PROPERTY_RETAIN;
855 else if (parsed_property_assign && parsed_property_copy)
857 error_at (location, "%<assign%> attribute conflicts with %<copy%> attribute");
858 property_assign_semantics = OBJC_PROPERTY_COPY;
860 else if (parsed_property_retain && parsed_property_copy)
862 error_at (location, "%<retain%> attribute conflicts with %<copy%> attribute");
863 property_assign_semantics = OBJC_PROPERTY_COPY;
865 else
867 if (parsed_property_assign)
868 property_assign_semantics = OBJC_PROPERTY_ASSIGN;
870 if (parsed_property_retain)
871 property_assign_semantics = OBJC_PROPERTY_RETAIN;
873 if (parsed_property_copy)
874 property_assign_semantics = OBJC_PROPERTY_COPY;
877 if (!objc_interface_context)
879 error_at (location, "property declaration not in @interface or @protocol context");
880 return;
883 /* At this point we know that we are either in an interface, a
884 category, or a protocol. */
886 /* We expect a FIELD_DECL from the parser. Make sure we didn't get
887 something else, as that would confuse the checks below. */
888 if (TREE_CODE (decl) != FIELD_DECL)
890 error_at (location, "invalid property declaration");
891 return;
894 /* Do some spot-checks for the most obvious invalid types. */
896 if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
898 error_at (location, "property can not be an array");
899 return;
902 /* The C++/ObjC++ parser seems to reject the ':' for a bitfield when
903 parsing, while the C/ObjC parser accepts it and gives us a
904 FIELD_DECL with a DECL_INITIAL set. So we use the DECL_INITIAL
905 to check for a bitfield when doing ObjC. */
906 #ifndef OBJCPLUS
907 if (DECL_INITIAL (decl))
909 /* A @property is not an actual variable, but it is a way to
910 describe a pair of accessor methods, so its type (which is
911 the type of the return value of the getter and the first
912 argument of the setter) can't be a bitfield (as return values
913 and arguments of functions can not be bitfields). The
914 underlying instance variable could be a bitfield, but that is
915 a different matter. */
916 error_at (location, "property can not be a bit-field");
917 return;
919 #endif
921 /* TODO: Check that the property type is an Objective-C object or a
922 "POD". */
924 /* Implement -Wproperty-assign-default (which is enabled by default). */
925 if (warn_property_assign_default
926 /* If garbage collection is not being used, then 'assign' is
927 valid for objects (and typically used for delegates) but it
928 is wrong in most cases (since most objects need to be
929 retained or copied in setters). Warn users when 'assign' is
930 used implicitly. */
931 && property_assign_semantics == OBJC_PROPERTY_ASSIGN
932 /* Read-only properties are never assigned, so the assignment
933 semantics do not matter in that case. */
934 && !property_readonly
935 && !flag_objc_gc)
937 /* Please note that it would make sense to default to 'assign'
938 for non-{Objective-C objects}, and to 'retain' for
939 Objective-C objects. But that would break compatibility with
940 other compilers. */
941 if (!parsed_property_assign && !parsed_property_retain && !parsed_property_copy)
943 /* Use 'false' so we do not warn for Class objects. */
944 if (objc_type_valid_for_messaging (TREE_TYPE (decl), false))
946 warning_at (location,
948 "object property %qD has no %<assign%>, %<retain%> or %<copy%> attribute; assuming %<assign%>",
949 decl);
950 inform (location,
951 "%<assign%> can be unsafe for Objective-C objects; please state explicitly if you need it");
956 if (property_assign_semantics == OBJC_PROPERTY_RETAIN
957 && !objc_type_valid_for_messaging (TREE_TYPE (decl), true))
958 error_at (location, "%<retain%> attribute is only valid for Objective-C objects");
960 if (property_assign_semantics == OBJC_PROPERTY_COPY
961 && !objc_type_valid_for_messaging (TREE_TYPE (decl), true))
962 error_at (location, "%<copy%> attribute is only valid for Objective-C objects");
964 /* Now determine the final property getter and setter names. They
965 will be stored in the PROPERTY_DECL, from which they'll always be
966 extracted and used. */
968 /* Adjust, or fill in, setter and getter names. We overwrite the
969 parsed_property_setter_ident and parsed_property_getter_ident
970 with the final setter and getter identifiers that will be
971 used. */
972 if (parsed_property_setter_ident)
974 /* The setter should be terminated by ':', but the parser only
975 gives us an identifier without ':'. So, we need to add ':'
976 at the end. */
977 const char *parsed_setter = IDENTIFIER_POINTER (parsed_property_setter_ident);
978 size_t length = strlen (parsed_setter);
979 char *final_setter = (char *)alloca (length + 2);
981 sprintf (final_setter, "%s:", parsed_setter);
982 parsed_property_setter_ident = get_identifier (final_setter);
984 else
986 if (!property_readonly)
987 parsed_property_setter_ident = get_identifier (objc_build_property_setter_name
988 (DECL_NAME (decl)));
991 if (!parsed_property_getter_ident)
992 parsed_property_getter_ident = DECL_NAME (decl);
994 /* Check for duplicate property declarations. We first check the
995 immediate context for a property with the same name. Any such
996 declarations are an error, unless this is a class extension and
997 we are extending a property from readonly to readwrite. */
998 for (x = CLASS_PROPERTY_DECL (objc_interface_context); x; x = TREE_CHAIN (x))
1000 if (PROPERTY_NAME (x) == DECL_NAME (decl))
1002 if (objc_in_class_extension
1003 && property_readonly == 0
1004 && PROPERTY_READONLY (x) == 1)
1006 /* This is a class extension, and we are extending an
1007 existing readonly property to a readwrite one.
1008 That's fine. :-) */
1009 property_extension_in_class_extension = true;
1010 break;
1012 else
1014 location_t original_location = DECL_SOURCE_LOCATION (x);
1016 error_at (location, "redeclaration of property %qD", decl);
1018 if (original_location != UNKNOWN_LOCATION)
1019 inform (original_location, "originally specified here");
1020 return;
1025 /* If x is not NULL_TREE, we must be in a class extension and we're
1026 extending a readonly property. In that case, no point in
1027 searching for another declaration. */
1028 if (x == NULL_TREE)
1030 /* We now need to check for existing property declarations (in
1031 the superclass, other categories or protocols) and check that
1032 the new declaration is not in conflict with existing
1033 ones. */
1035 /* Search for a previous, existing declaration of a property
1036 with the same name in superclasses, protocols etc. If one is
1037 found, it will be in the 'x' variable. */
1039 /* Note that, for simplicity, the following may search again the
1040 local context. That's Ok as nothing will be found (else we'd
1041 have thrown an error above); it's only a little inefficient,
1042 but the code is simpler. */
1043 switch (TREE_CODE (objc_interface_context))
1045 case CLASS_INTERFACE_TYPE:
1046 /* Look up the property in the current @interface (which
1047 will find nothing), then its protocols and categories and
1048 superclasses. */
1049 x = lookup_property (objc_interface_context, DECL_NAME (decl));
1050 break;
1051 case CATEGORY_INTERFACE_TYPE:
1052 /* Look up the property in the main @interface, then
1053 protocols and categories (one of them is ours, and will
1054 find nothing) and superclasses. */
1055 x = lookup_property (lookup_interface (CLASS_NAME (objc_interface_context)),
1056 DECL_NAME (decl));
1057 break;
1058 case PROTOCOL_INTERFACE_TYPE:
1059 /* Looks up the property in any protocols attached to the
1060 current protocol. */
1061 if (PROTOCOL_LIST (objc_interface_context))
1063 x = lookup_property_in_protocol_list (PROTOCOL_LIST (objc_interface_context),
1064 DECL_NAME (decl));
1066 break;
1067 default:
1068 gcc_unreachable ();
1072 if (x != NULL_TREE)
1074 /* An existing property was found; check that it has the same
1075 types, or it is compatible. */
1076 location_t original_location = DECL_SOURCE_LOCATION (x);
1078 if (PROPERTY_NONATOMIC (x) != parsed_property_nonatomic)
1080 warning_at (location, 0,
1081 "'nonatomic' attribute of property %qD conflicts with previous declaration", decl);
1083 if (original_location != UNKNOWN_LOCATION)
1084 inform (original_location, "originally specified here");
1085 return;
1088 if (PROPERTY_GETTER_NAME (x) != parsed_property_getter_ident)
1090 warning_at (location, 0,
1091 "'getter' attribute of property %qD conflicts with previous declaration", decl);
1093 if (original_location != UNKNOWN_LOCATION)
1094 inform (original_location, "originally specified here");
1095 return;
1098 /* We can only compare the setter names if both the old and new property have a setter. */
1099 if (!property_readonly && !PROPERTY_READONLY(x))
1101 if (PROPERTY_SETTER_NAME (x) != parsed_property_setter_ident)
1103 warning_at (location, 0,
1104 "'setter' attribute of property %qD conflicts with previous declaration", decl);
1106 if (original_location != UNKNOWN_LOCATION)
1107 inform (original_location, "originally specified here");
1108 return;
1112 if (PROPERTY_ASSIGN_SEMANTICS (x) != property_assign_semantics)
1114 warning_at (location, 0,
1115 "assign semantics attributes of property %qD conflict with previous declaration", decl);
1117 if (original_location != UNKNOWN_LOCATION)
1118 inform (original_location, "originally specified here");
1119 return;
1122 /* It's ok to have a readonly property that becomes a readwrite, but not vice versa. */
1123 if (PROPERTY_READONLY (x) == 0 && property_readonly == 1)
1125 warning_at (location, 0,
1126 "'readonly' attribute of property %qD conflicts with previous declaration", decl);
1128 if (original_location != UNKNOWN_LOCATION)
1129 inform (original_location, "originally specified here");
1130 return;
1133 /* We now check that the new and old property declarations have
1134 the same types (or compatible one). In the Objective-C
1135 tradition of loose type checking, we do type-checking but
1136 only generate warnings (not errors) if they do not match.
1137 For non-readonly properties, the types must match exactly;
1138 for readonly properties, it is allowed to use a "more
1139 specialized" type in the new property declaration. Eg, the
1140 superclass has a getter returning (NSArray *) and the
1141 subclass a getter returning (NSMutableArray *). The object's
1142 getter returns an (NSMutableArray *); but if you cast the
1143 object to the superclass, which is allowed, you'd still
1144 expect the getter to return an (NSArray *), which works since
1145 an (NSMutableArray *) is an (NSArray *) too. So, the set of
1146 objects belonging to the type of the new @property should be
1147 a subset of the set of objects belonging to the type of the
1148 old @property. This is what "specialization" means. And the
1149 reason it only applies to readonly properties is that for a
1150 readwrite property the setter would have the opposite
1151 requirement - ie that the superclass type is more specialized
1152 then the subclass one; hence the only way to satisfy both
1153 constraints is that the types match. */
1155 /* If the types are not the same in the C sense, we warn ... */
1156 if (!comptypes (TREE_TYPE (x), TREE_TYPE (decl))
1157 /* ... unless the property is readonly, in which case we
1158 allow a new, more specialized, declaration. */
1159 && (!property_readonly
1160 || !objc_compare_types (TREE_TYPE (x),
1161 TREE_TYPE (decl), -5, NULL_TREE)))
1163 warning_at (location, 0,
1164 "type of property %qD conflicts with previous declaration", decl);
1165 if (original_location != UNKNOWN_LOCATION)
1166 inform (original_location, "originally specified here");
1167 return;
1170 /* If we are in a class extension and we're extending a readonly
1171 property in the main @interface, we'll just update the
1172 existing property with the readwrite flag and potentially the
1173 new setter name. */
1174 if (property_extension_in_class_extension)
1176 PROPERTY_READONLY (x) = 0;
1177 PROPERTY_SETTER_NAME (x) = parsed_property_setter_ident;
1178 return;
1182 /* Create a PROPERTY_DECL node. */
1183 property_decl = make_node (PROPERTY_DECL);
1185 /* Copy the basic information from the original decl. */
1186 TREE_TYPE (property_decl) = TREE_TYPE (decl);
1187 DECL_SOURCE_LOCATION (property_decl) = DECL_SOURCE_LOCATION (decl);
1188 TREE_DEPRECATED (property_decl) = TREE_DEPRECATED (decl);
1190 /* Add property-specific information. */
1191 PROPERTY_NAME (property_decl) = DECL_NAME (decl);
1192 PROPERTY_GETTER_NAME (property_decl) = parsed_property_getter_ident;
1193 PROPERTY_SETTER_NAME (property_decl) = parsed_property_setter_ident;
1194 PROPERTY_READONLY (property_decl) = property_readonly;
1195 PROPERTY_NONATOMIC (property_decl) = parsed_property_nonatomic;
1196 PROPERTY_ASSIGN_SEMANTICS (property_decl) = property_assign_semantics;
1197 PROPERTY_IVAR_NAME (property_decl) = NULL_TREE;
1198 PROPERTY_DYNAMIC (property_decl) = 0;
1200 /* Remember the fact that the property was found in the @optional
1201 section in a @protocol, or not. */
1202 if (objc_method_optional_flag)
1203 PROPERTY_OPTIONAL (property_decl) = 1;
1204 else
1205 PROPERTY_OPTIONAL (property_decl) = 0;
1207 /* Note that PROPERTY_GETTER_NAME is always set for all
1208 PROPERTY_DECLs, and PROPERTY_SETTER_NAME is always set for all
1209 PROPERTY_DECLs where PROPERTY_READONLY == 0. Any time we deal
1210 with a getter or setter, we should get the PROPERTY_DECL and use
1211 PROPERTY_GETTER_NAME and PROPERTY_SETTER_NAME to know the correct
1212 names. */
1214 /* Add the PROPERTY_DECL to the list of properties for the class. */
1215 TREE_CHAIN (property_decl) = CLASS_PROPERTY_DECL (objc_interface_context);
1216 CLASS_PROPERTY_DECL (objc_interface_context) = property_decl;
1219 /* This is a subroutine of objc_maybe_build_component_ref. Search the
1220 list of methods in the interface (and, failing that, the local list
1221 in the implementation, and failing that, the protocol list)
1222 provided for a 'setter' or 'getter' for 'component' with default
1223 names (ie, if 'component' is "name", then search for "name" and
1224 "setName:"). It is also possible to specify a different
1225 'getter_name' (this is used for @optional readonly properties). If
1226 any is found, then create an artificial property that uses them.
1227 Return NULL_TREE if 'getter' or 'setter' could not be found. */
1228 static tree
1229 maybe_make_artificial_property_decl (tree interface, tree implementation,
1230 tree protocol_list, tree component, bool is_class,
1231 tree getter_name)
1233 tree setter_name = get_identifier (objc_build_property_setter_name (component));
1234 tree getter = NULL_TREE;
1235 tree setter = NULL_TREE;
1237 if (getter_name == NULL_TREE)
1238 getter_name = component;
1240 /* First, check the @interface and all superclasses. */
1241 if (interface)
1243 int flags = 0;
1245 /* Using instance methods of the root class as accessors is most
1246 likely unwanted and can be extremely confusing (and, most
1247 importantly, other Objective-C 2.0 compilers do not do it).
1248 Turn it off. */
1249 if (is_class)
1250 flags = OBJC_LOOKUP_CLASS | OBJC_LOOKUP_NO_INSTANCE_METHODS_OF_ROOT_CLASS;
1252 getter = lookup_method_static (interface, getter_name, flags);
1253 setter = lookup_method_static (interface, setter_name, flags);
1256 /* Second, check the local @implementation context. */
1257 if (!getter && !setter)
1259 if (implementation)
1261 if (is_class)
1263 getter = lookup_method (CLASS_CLS_METHODS (implementation), getter_name);
1264 setter = lookup_method (CLASS_CLS_METHODS (implementation), setter_name);
1266 else
1268 getter = lookup_method (CLASS_NST_METHODS (implementation), getter_name);
1269 setter = lookup_method (CLASS_NST_METHODS (implementation), setter_name);
1274 /* Try the protocol_list if we didn't find anything in the
1275 @interface and in the @implementation. */
1276 if (!getter && !setter)
1278 getter = lookup_method_in_protocol_list (protocol_list, getter_name, is_class);
1279 setter = lookup_method_in_protocol_list (protocol_list, setter_name, is_class);
1282 /* There needs to be at least a getter or setter for this to be a
1283 valid 'object.component' syntax. */
1284 if (getter || setter)
1286 /* Yes ... determine the type of the expression. */
1287 tree property_decl;
1288 tree type;
1290 if (getter)
1291 type = TREE_VALUE (TREE_TYPE (getter));
1292 else
1293 type = TREE_VALUE (TREE_TYPE (METHOD_SEL_ARGS (setter)));
1295 /* Create an artificial property declaration with the
1296 information we collected on the type and getter/setter
1297 names. */
1298 property_decl = make_node (PROPERTY_DECL);
1300 TREE_TYPE (property_decl) = type;
1301 DECL_SOURCE_LOCATION (property_decl) = input_location;
1302 TREE_DEPRECATED (property_decl) = 0;
1303 DECL_ARTIFICIAL (property_decl) = 1;
1305 /* Add property-specific information. Note that one of
1306 PROPERTY_GETTER_NAME or PROPERTY_SETTER_NAME may refer to a
1307 non-existing method; this will generate an error when the
1308 expression is later compiled. At this stage we don't know if
1309 the getter or setter will be used, so we can't generate an
1310 error. */
1311 PROPERTY_NAME (property_decl) = component;
1312 PROPERTY_GETTER_NAME (property_decl) = getter_name;
1313 PROPERTY_SETTER_NAME (property_decl) = setter_name;
1314 PROPERTY_READONLY (property_decl) = 0;
1315 PROPERTY_NONATOMIC (property_decl) = 0;
1316 PROPERTY_ASSIGN_SEMANTICS (property_decl) = 0;
1317 PROPERTY_IVAR_NAME (property_decl) = NULL_TREE;
1318 PROPERTY_DYNAMIC (property_decl) = 0;
1319 PROPERTY_OPTIONAL (property_decl) = 0;
1321 if (!getter)
1322 PROPERTY_HAS_NO_GETTER (property_decl) = 1;
1324 /* The following is currently unused, but it's nice to have
1325 there. We may use it if we need in the future. */
1326 if (!setter)
1327 PROPERTY_HAS_NO_SETTER (property_decl) = 1;
1329 return property_decl;
1332 return NULL_TREE;
1335 /* This hook routine is invoked by the parser when an expression such
1336 as 'xxx.yyy' is parsed. We get a chance to process these
1337 expressions in a way that is specified to Objective-C (to implement
1338 the Objective-C 2.0 dot-syntax, properties, or non-fragile ivars).
1339 If the expression is not an Objective-C specified expression, we
1340 should return NULL_TREE; else we return the expression.
1342 At the moment this only implements dot-syntax and properties (not
1343 non-fragile ivars yet), ie 'object.property' or 'object.component'
1344 where 'component' is not a declared property, but a valid getter or
1345 setter for it could be found. */
1346 tree
1347 objc_maybe_build_component_ref (tree object, tree property_ident)
1349 tree x = NULL_TREE;
1350 tree rtype;
1352 /* If we are in Objective-C 1.0 mode, dot-syntax and properties are
1353 not available. */
1354 if (flag_objc1_only)
1355 return NULL_TREE;
1357 /* Try to determine if 'object' is an Objective-C object or not. If
1358 not, return. */
1359 if (object == NULL_TREE || object == error_mark_node
1360 || (rtype = TREE_TYPE (object)) == NULL_TREE)
1361 return NULL_TREE;
1363 if (property_ident == NULL_TREE || property_ident == error_mark_node
1364 || TREE_CODE (property_ident) != IDENTIFIER_NODE)
1365 return NULL_TREE;
1367 /* The following analysis of 'object' is similar to the one used for
1368 the 'receiver' of a method invocation. We need to determine what
1369 'object' is and find the appropriate property (either declared,
1370 or artificial) for it (in the same way as we need to find the
1371 appropriate method prototype for a method invocation). There are
1372 some simplifications here though: "object.property" is invalid if
1373 "object" has a type of "id" or "Class"; it must at least have a
1374 protocol attached to it, and "object" is never a class name as
1375 that is done by objc_build_class_component_ref. Finally, we
1376 don't know if this really is a dot-syntax expression, so we want
1377 to make a quick exit if it is not; for this reason, we try to
1378 postpone checks after determining that 'object' looks like an
1379 Objective-C object. */
1381 if (objc_is_id (rtype))
1383 /* This is the case that the 'object' is of type 'id' or
1384 'Class'. */
1386 /* Check if at least it is of type 'id <Protocol>' or 'Class
1387 <Protocol>'; if so, look the property up in the
1388 protocols. */
1389 if (TYPE_HAS_OBJC_INFO (TREE_TYPE (rtype)))
1391 tree rprotos = TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (rtype));
1393 if (rprotos)
1395 /* No point looking up declared @properties if we are
1396 dealing with a class. Classes have no declared
1397 properties. */
1398 if (!IS_CLASS (rtype))
1399 x = lookup_property_in_protocol_list (rprotos, property_ident);
1401 if (x == NULL_TREE)
1403 /* Ok, no property. Maybe it was an
1404 object.component dot-syntax without a declared
1405 property (this is valid for classes too). Look
1406 for getter/setter methods and internally declare
1407 an artifical property based on them if found. */
1408 x = maybe_make_artificial_property_decl (NULL_TREE,
1409 NULL_TREE,
1410 rprotos,
1411 property_ident,
1412 IS_CLASS (rtype),
1413 NULL_TREE);
1415 else if (PROPERTY_OPTIONAL (x) && PROPERTY_READONLY (x))
1417 /* This is a special, complicated case. If the
1418 property is optional, and is read-only, then the
1419 property is always used for reading, but an
1420 eventual existing non-property setter can be used
1421 for writing. We create an artificial property
1422 decl copying the getter from the optional
1423 property, and looking up the setter in the
1424 interface. */
1425 x = maybe_make_artificial_property_decl (NULL_TREE,
1426 NULL_TREE,
1427 rprotos,
1428 property_ident,
1429 false,
1430 PROPERTY_GETTER_NAME (x));
1434 else if (objc_method_context)
1436 /* Else, if we are inside a method it could be the case of
1437 'super' or 'self'. */
1438 tree interface_type = NULL_TREE;
1439 tree t = object;
1440 while (TREE_CODE (t) == COMPOUND_EXPR
1441 || TREE_CODE (t) == MODIFY_EXPR
1442 || CONVERT_EXPR_P (t)
1443 || TREE_CODE (t) == COMPONENT_REF)
1444 t = TREE_OPERAND (t, 0);
1446 if (t == UOBJC_SUPER_decl)
1447 interface_type = lookup_interface (CLASS_SUPER_NAME (implementation_template));
1448 else if (t == self_decl)
1449 interface_type = lookup_interface (CLASS_NAME (implementation_template));
1451 if (interface_type)
1453 if (TREE_CODE (objc_method_context) != CLASS_METHOD_DECL)
1454 x = lookup_property (interface_type, property_ident);
1456 if (x == NULL_TREE)
1458 /* Try the dot-syntax without a declared property.
1459 If this is an access to 'self', it is possible
1460 that they may refer to a setter/getter that is
1461 not declared in the interface, but exists locally
1462 in the implementation. In that case, get the
1463 implementation context and use it. */
1464 tree implementation = NULL_TREE;
1466 if (t == self_decl)
1467 implementation = objc_implementation_context;
1469 x = maybe_make_artificial_property_decl
1470 (interface_type, implementation, NULL_TREE,
1471 property_ident,
1472 (TREE_CODE (objc_method_context) == CLASS_METHOD_DECL),
1473 NULL_TREE);
1475 else if (PROPERTY_OPTIONAL (x) && PROPERTY_READONLY (x))
1477 tree implementation = NULL_TREE;
1479 if (t == self_decl)
1480 implementation = objc_implementation_context;
1482 x = maybe_make_artificial_property_decl (interface_type,
1483 implementation,
1484 NULL_TREE,
1485 property_ident,
1486 false,
1487 PROPERTY_GETTER_NAME (x));
1492 else
1494 /* This is the case where we have more information on 'rtype'. */
1495 tree basetype = TYPE_MAIN_VARIANT (rtype);
1497 /* Skip the pointer - if none, it's not an Objective-C object or
1498 class. */
1499 if (basetype != NULL_TREE && TREE_CODE (basetype) == POINTER_TYPE)
1500 basetype = TREE_TYPE (basetype);
1501 else
1502 return NULL_TREE;
1504 /* Traverse typedefs. */
1505 while (basetype != NULL_TREE
1506 && TREE_CODE (basetype) == RECORD_TYPE
1507 && OBJC_TYPE_NAME (basetype)
1508 && TREE_CODE (OBJC_TYPE_NAME (basetype)) == TYPE_DECL
1509 && DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (basetype)))
1510 basetype = DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (basetype));
1512 if (basetype != NULL_TREE && TYPED_OBJECT (basetype))
1514 tree interface_type = TYPE_OBJC_INTERFACE (basetype);
1515 tree protocol_list = TYPE_OBJC_PROTOCOL_LIST (basetype);
1517 if (interface_type
1518 && (TREE_CODE (interface_type) == CLASS_INTERFACE_TYPE
1519 || TREE_CODE (interface_type) == CATEGORY_INTERFACE_TYPE
1520 || TREE_CODE (interface_type) == PROTOCOL_INTERFACE_TYPE))
1522 /* Not sure 'rtype' could ever be a class here! Just
1523 for safety we keep the checks. */
1524 if (!IS_CLASS (rtype))
1526 x = lookup_property (interface_type, property_ident);
1528 if (x == NULL_TREE)
1529 x = lookup_property_in_protocol_list (protocol_list,
1530 property_ident);
1533 if (x == NULL_TREE)
1535 /* Try the dot-syntax without a declared property.
1536 If we are inside a method implementation, it is
1537 possible that they may refer to a setter/getter
1538 that is not declared in the interface, but exists
1539 locally in the implementation. In that case, get
1540 the implementation context and use it. */
1541 tree implementation = NULL_TREE;
1543 if (objc_implementation_context
1544 && CLASS_NAME (objc_implementation_context)
1545 == OBJC_TYPE_NAME (interface_type))
1546 implementation = objc_implementation_context;
1548 x = maybe_make_artificial_property_decl (interface_type,
1549 implementation,
1550 protocol_list,
1551 property_ident,
1552 IS_CLASS (rtype),
1553 NULL_TREE);
1555 else if (PROPERTY_OPTIONAL (x) && PROPERTY_READONLY (x))
1557 tree implementation = NULL_TREE;
1559 if (objc_implementation_context
1560 && CLASS_NAME (objc_implementation_context)
1561 == OBJC_TYPE_NAME (interface_type))
1562 implementation = objc_implementation_context;
1564 x = maybe_make_artificial_property_decl (interface_type,
1565 implementation,
1566 protocol_list,
1567 property_ident,
1568 false,
1569 PROPERTY_GETTER_NAME (x));
1575 if (x)
1577 tree expression;
1578 tree getter_call;
1579 tree deprecated_method_prototype = NULL_TREE;
1581 /* We have an additional nasty problem here; if this
1582 PROPERTY_REF needs to become a 'getter', then the conversion
1583 from PROPERTY_REF into a getter call happens in gimplify,
1584 after the selector table has already been generated and when
1585 it is too late to add another selector to it. To work around
1586 the problem, we always create the getter call at this stage,
1587 which puts the selector in the table. Note that if the
1588 PROPERTY_REF becomes a 'setter' instead of a 'getter', then
1589 we have added a selector too many to the selector table.
1590 This is a little inefficient.
1592 Also note that method calls to 'self' and 'super' require the
1593 context (self_decl, UOBJS_SUPER_decl,
1594 objc_implementation_context etc) to be built correctly; this
1595 is yet another reason why building the call at the gimplify
1596 stage (when this context has been lost) is not very
1597 practical. If we build it at this stage, we know it will
1598 always be built correctly.
1600 If the PROPERTY_HAS_NO_GETTER() (ie, it is an artificial
1601 property decl created to deal with a dotsyntax not really
1602 referring to an existing property) then do not try to build a
1603 call to the getter as there is no getter. */
1604 if (PROPERTY_HAS_NO_GETTER (x))
1605 getter_call = NULL_TREE;
1606 else
1607 getter_call = objc_finish_message_expr
1608 (object, PROPERTY_GETTER_NAME (x), NULL_TREE,
1609 /* Disable the immediate deprecation warning if the getter
1610 is deprecated, but record the fact that the getter is
1611 deprecated by setting PROPERTY_REF_DEPRECATED_GETTER to
1612 the method prototype. */
1613 &deprecated_method_prototype);
1615 expression = build4 (PROPERTY_REF, TREE_TYPE(x), object, x, getter_call,
1616 deprecated_method_prototype);
1617 SET_EXPR_LOCATION (expression, input_location);
1618 TREE_SIDE_EFFECTS (expression) = 1;
1620 return expression;
1623 return NULL_TREE;
1626 /* This hook routine is invoked by the parser when an expression such
1627 as 'xxx.yyy' is parsed, and 'xxx' is a class name. This is the
1628 Objective-C 2.0 dot-syntax applied to classes, so we need to
1629 convert it into a setter/getter call on the class. */
1630 tree
1631 objc_build_class_component_ref (tree class_name, tree property_ident)
1633 tree x = NULL_TREE;
1634 tree object, rtype;
1636 if (flag_objc1_only)
1637 error_at (input_location, "the dot syntax is not available in Objective-C 1.0");
1639 if (class_name == NULL_TREE || class_name == error_mark_node
1640 || TREE_CODE (class_name) != IDENTIFIER_NODE)
1641 return error_mark_node;
1643 if (property_ident == NULL_TREE || property_ident == error_mark_node
1644 || TREE_CODE (property_ident) != IDENTIFIER_NODE)
1645 return NULL_TREE;
1647 object = objc_get_class_reference (class_name);
1648 if (!object)
1650 /* We know that 'class_name' is an Objective-C class name as the
1651 parser won't call this function if it is not. This is only a
1652 double-check for safety. */
1653 error_at (input_location, "could not find class %qE", class_name);
1654 return error_mark_node;
1657 rtype = lookup_interface (class_name);
1658 if (!rtype)
1660 /* Again, this should never happen, but we do check. */
1661 error_at (input_location, "could not find interface for class %qE", class_name);
1662 return error_mark_node;
1664 else
1666 if (TREE_DEPRECATED (rtype))
1667 warning (OPT_Wdeprecated_declarations, "class %qE is deprecated", class_name);
1670 x = maybe_make_artificial_property_decl (rtype, NULL_TREE, NULL_TREE,
1671 property_ident,
1672 true, NULL_TREE);
1674 if (x)
1676 tree expression;
1677 tree getter_call;
1678 tree deprecated_method_prototype = NULL_TREE;
1680 if (PROPERTY_HAS_NO_GETTER (x))
1681 getter_call = NULL_TREE;
1682 else
1683 getter_call = objc_finish_message_expr
1684 (object, PROPERTY_GETTER_NAME (x), NULL_TREE,
1685 &deprecated_method_prototype);
1687 expression = build4 (PROPERTY_REF, TREE_TYPE(x), object, x, getter_call,
1688 deprecated_method_prototype);
1689 SET_EXPR_LOCATION (expression, input_location);
1690 TREE_SIDE_EFFECTS (expression) = 1;
1692 return expression;
1694 else
1696 error_at (input_location, "could not find setter/getter for %qE in class %qE",
1697 property_ident, class_name);
1698 return error_mark_node;
1701 return NULL_TREE;
1706 /* This is used because we don't want to expose PROPERTY_REF to the
1707 C/C++ frontends. Maybe we should! */
1708 bool
1709 objc_is_property_ref (tree node)
1711 if (node && TREE_CODE (node) == PROPERTY_REF)
1712 return true;
1713 else
1714 return false;
1717 /* This function builds a setter call for a PROPERTY_REF (real, for a
1718 declared property, or artificial, for a dot-syntax accessor which
1719 is not corresponding to a property). 'lhs' must be a PROPERTY_REF
1720 (the caller must check this beforehand). 'rhs' is the value to
1721 assign to the property. A plain setter call is returned, or
1722 error_mark_node if the property is readonly. */
1724 static tree
1725 objc_build_setter_call (tree lhs, tree rhs)
1727 tree object_expr = PROPERTY_REF_OBJECT (lhs);
1728 tree property_decl = PROPERTY_REF_PROPERTY_DECL (lhs);
1730 if (PROPERTY_READONLY (property_decl))
1732 error ("readonly property can not be set");
1733 return error_mark_node;
1735 else
1737 tree setter_argument = build_tree_list (NULL_TREE, rhs);
1738 tree setter;
1740 /* TODO: Check that the setter return type is 'void'. */
1742 /* TODO: Decay arguments in C. */
1743 setter = objc_finish_message_expr (object_expr,
1744 PROPERTY_SETTER_NAME (property_decl),
1745 setter_argument, NULL);
1746 return setter;
1749 /* Unreachable, but the compiler may not realize. */
1750 return error_mark_node;
1753 /* This hook routine is called when a MODIFY_EXPR is being built. We
1754 check what is being modified; if it is a PROPERTY_REF, we need to
1755 generate a 'setter' function call for the property. If this is not
1756 a PROPERTY_REF, we return NULL_TREE and the C/C++ frontend will go
1757 on creating their MODIFY_EXPR.
1759 This is used for example if you write
1761 object.count = 1;
1763 where 'count' is a property. The left-hand side creates a
1764 PROPERTY_REF, and then the compiler tries to generate a MODIFY_EXPR
1765 to assign something to it. We intercept that here, and generate a
1766 call to the 'setter' method instead. */
1767 tree
1768 objc_maybe_build_modify_expr (tree lhs, tree rhs)
1770 if (lhs && TREE_CODE (lhs) == PROPERTY_REF)
1772 /* Building a simple call to the setter method would work for cases such as
1774 object.count = 1;
1776 but wouldn't work for cases such as
1778 count = object2.count = 1;
1780 to get these to work with very little effort, we build a
1781 compound statement which does the setter call (to set the
1782 property to 'rhs'), but which can also be evaluated returning
1783 the 'rhs'. If the 'rhs' has no side effects, we can simply
1784 evaluate it twice, building
1786 ([object setProperty: rhs]; rhs)
1788 If it has side effects, we put it in a temporary variable first,
1789 so we create the following:
1791 (temp = rhs; [object setProperty: temp]; temp)
1793 setter_argument is rhs in the first case, and temp in the second
1794 case.
1796 tree setter_argument;
1798 /* s1, s2 and s3 are the tree statements that we need in the
1799 compound expression. */
1800 tree s1, s2, s3, compound_expr;
1802 if (TREE_SIDE_EFFECTS (rhs))
1804 tree bind;
1806 /* Declare __objc_property_temp in a local bind. */
1807 setter_argument = objc_create_temporary_var (TREE_TYPE (rhs), "__objc_property_temp");
1808 DECL_SOURCE_LOCATION (setter_argument) = input_location;
1809 bind = build3 (BIND_EXPR, void_type_node, setter_argument, NULL, NULL);
1810 SET_EXPR_LOCATION (bind, input_location);
1811 TREE_SIDE_EFFECTS (bind) = 1;
1812 add_stmt (bind);
1814 /* s1: x = rhs */
1815 s1 = build_modify_expr (input_location, setter_argument, NULL_TREE,
1816 NOP_EXPR,
1817 input_location, rhs, NULL_TREE);
1818 SET_EXPR_LOCATION (s1, input_location);
1820 else
1822 /* No s1. */
1823 setter_argument = rhs;
1824 s1 = NULL_TREE;
1827 /* Now build the compound statement. */
1829 /* s2: [object setProperty: x] */
1830 s2 = objc_build_setter_call (lhs, setter_argument);
1832 /* This happens if building the setter failed because the
1833 property is readonly. */
1834 if (s2 == error_mark_node)
1835 return error_mark_node;
1837 SET_EXPR_LOCATION (s2, input_location);
1839 /* s3: x */
1840 s3 = convert (TREE_TYPE (lhs), setter_argument);
1842 /* Now build the compound statement (s1, s2, s3) or (s2, s3) as
1843 appropriate. */
1844 if (s1)
1845 compound_expr = build_compound_expr (input_location, build_compound_expr (input_location, s1, s2), s3);
1846 else
1847 compound_expr = build_compound_expr (input_location, s2, s3);
1849 /* Without this, with -Wall you get a 'valued computed is not
1850 used' every time there is a "object.property = x" where the
1851 value of the resulting MODIFY_EXPR is not used. That is
1852 correct (maybe a more sophisticated implementation could
1853 avoid generating the compound expression if not needed), but
1854 we need to turn it off. */
1855 TREE_NO_WARNING (compound_expr) = 1;
1856 return compound_expr;
1858 else
1859 return NULL_TREE;
1862 /* This hook is called by the frontend when one of the four unary
1863 expressions PREINCREMENT_EXPR, POSTINCREMENT_EXPR,
1864 PREDECREMENT_EXPR and POSTDECREMENT_EXPR is being built with an
1865 argument which is a PROPERTY_REF. For example, this happens if you have
1867 object.count++;
1869 where 'count' is a property. We need to use the 'getter' and
1870 'setter' for the property in an appropriate way to build the
1871 appropriate expression. 'code' is the code for the expression (one
1872 of the four mentioned above); 'argument' is the PROPERTY_REF, and
1873 'increment' is how much we need to add or subtract. */
1874 tree
1875 objc_build_incr_expr_for_property_ref (location_t location,
1876 enum tree_code code,
1877 tree argument, tree increment)
1879 /* Here are the expressions that we want to build:
1881 For PREINCREMENT_EXPR / PREDECREMENT_EXPR:
1882 (temp = [object property] +/- increment, [object setProperty: temp], temp)
1884 For POSTINCREMENT_EXPR / POSTECREMENT_EXPR:
1885 (temp = [object property], [object setProperty: temp +/- increment], temp) */
1887 tree temp_variable_decl, bind;
1888 /* s1, s2 and s3 are the tree statements that we need in the
1889 compound expression. */
1890 tree s1, s2, s3, compound_expr;
1892 /* Safety check. */
1893 if (!argument || TREE_CODE (argument) != PROPERTY_REF)
1894 return error_mark_node;
1896 /* Declare __objc_property_temp in a local bind. */
1897 temp_variable_decl = objc_create_temporary_var (TREE_TYPE (argument), "__objc_property_temp");
1898 DECL_SOURCE_LOCATION (temp_variable_decl) = location;
1899 bind = build3 (BIND_EXPR, void_type_node, temp_variable_decl, NULL, NULL);
1900 SET_EXPR_LOCATION (bind, location);
1901 TREE_SIDE_EFFECTS (bind) = 1;
1902 add_stmt (bind);
1904 /* Now build the compound statement. */
1906 /* Note that the 'getter' is generated at gimplify time; at this
1907 time, we can simply put the property_ref (ie, argument) wherever
1908 we want the getter ultimately to be. */
1910 /* s1: __objc_property_temp = [object property] <+/- increment> */
1911 switch (code)
1913 case PREINCREMENT_EXPR:
1914 /* __objc_property_temp = [object property] + increment */
1915 s1 = build_modify_expr (location, temp_variable_decl, NULL_TREE,
1916 NOP_EXPR,
1917 location, build2 (PLUS_EXPR, TREE_TYPE (argument),
1918 argument, increment), NULL_TREE);
1919 break;
1920 case PREDECREMENT_EXPR:
1921 /* __objc_property_temp = [object property] - increment */
1922 s1 = build_modify_expr (location, temp_variable_decl, NULL_TREE,
1923 NOP_EXPR,
1924 location, build2 (MINUS_EXPR, TREE_TYPE (argument),
1925 argument, increment), NULL_TREE);
1926 break;
1927 case POSTINCREMENT_EXPR:
1928 case POSTDECREMENT_EXPR:
1929 /* __objc_property_temp = [object property] */
1930 s1 = build_modify_expr (location, temp_variable_decl, NULL_TREE,
1931 NOP_EXPR,
1932 location, argument, NULL_TREE);
1933 break;
1934 default:
1935 gcc_unreachable ();
1938 /* s2: [object setProperty: __objc_property_temp <+/- increment>] */
1939 switch (code)
1941 case PREINCREMENT_EXPR:
1942 case PREDECREMENT_EXPR:
1943 /* [object setProperty: __objc_property_temp] */
1944 s2 = objc_build_setter_call (argument, temp_variable_decl);
1945 break;
1946 case POSTINCREMENT_EXPR:
1947 /* [object setProperty: __objc_property_temp + increment] */
1948 s2 = objc_build_setter_call (argument,
1949 build2 (PLUS_EXPR, TREE_TYPE (argument),
1950 temp_variable_decl, increment));
1951 break;
1952 case POSTDECREMENT_EXPR:
1953 /* [object setProperty: __objc_property_temp - increment] */
1954 s2 = objc_build_setter_call (argument,
1955 build2 (MINUS_EXPR, TREE_TYPE (argument),
1956 temp_variable_decl, increment));
1957 break;
1958 default:
1959 gcc_unreachable ();
1962 /* This happens if building the setter failed because the property
1963 is readonly. */
1964 if (s2 == error_mark_node)
1965 return error_mark_node;
1967 SET_EXPR_LOCATION (s2, location);
1969 /* s3: __objc_property_temp */
1970 s3 = convert (TREE_TYPE (argument), temp_variable_decl);
1972 /* Now build the compound statement (s1, s2, s3) */
1973 compound_expr = build_compound_expr (location, build_compound_expr (location, s1, s2), s3);
1975 /* Prevent C++ from warning with -Wall that "right operand of comma
1976 operator has no effect". */
1977 TREE_NO_WARNING (compound_expr) = 1;
1978 return compound_expr;
1981 tree
1982 objc_build_method_signature (bool is_class_method, tree rettype, tree selector,
1983 tree optparms, bool ellipsis)
1985 if (is_class_method)
1986 return build_method_decl (CLASS_METHOD_DECL, rettype, selector,
1987 optparms, ellipsis);
1988 else
1989 return build_method_decl (INSTANCE_METHOD_DECL, rettype, selector,
1990 optparms, ellipsis);
1993 void
1994 objc_add_method_declaration (bool is_class_method, tree decl, tree attributes)
1996 if (!objc_interface_context)
1998 /* PS: At the moment, due to how the parser works, it should be
1999 impossible to get here. But it's good to have the check in
2000 case the parser changes.
2002 fatal_error ("method declaration not in @interface context");
2005 if (flag_objc1_only && attributes)
2006 error_at (input_location, "method attributes are not available in Objective-C 1.0");
2008 objc_decl_method_attributes (&decl, attributes, 0);
2009 objc_add_method (objc_interface_context,
2010 decl,
2011 is_class_method,
2012 objc_method_optional_flag);
2015 /* Return 'true' if the method definition could be started, and
2016 'false' if not (because we are outside an @implementation context).
2017 EXPR is NULL or an expression that needs to be evaluated for the
2018 side effects of array size expressions in the parameters.
2020 bool
2021 objc_start_method_definition (bool is_class_method, tree decl, tree attributes,
2022 tree expr)
2024 if (!objc_implementation_context)
2026 error ("method definition not in @implementation context");
2027 return false;
2030 if (decl != NULL_TREE && METHOD_SEL_NAME (decl) == error_mark_node)
2031 return false;
2033 #ifndef OBJCPLUS
2034 /* Indicate no valid break/continue context by setting these variables
2035 to some non-null, non-label value. We'll notice and emit the proper
2036 error message in c_finish_bc_stmt. */
2037 c_break_label = c_cont_label = size_zero_node;
2038 #endif
2040 if (attributes)
2041 warning_at (input_location, 0, "method attributes can not be specified in @implementation context");
2042 else
2043 objc_decl_method_attributes (&decl, attributes, 0);
2045 objc_add_method (objc_implementation_context,
2046 decl,
2047 is_class_method,
2048 /* is optional */ false);
2049 start_method_def (decl, expr);
2050 return true;
2053 void
2054 objc_add_instance_variable (tree decl)
2056 (void) add_instance_variable (objc_ivar_context,
2057 objc_ivar_visibility,
2058 decl);
2061 /* Construct a C struct with same name as KLASS, a base struct with tag
2062 SUPER_NAME (if any), and FIELDS indicated. */
2064 static tree
2065 objc_build_struct (tree klass, tree fields, tree super_name)
2067 tree name = CLASS_NAME (klass);
2068 tree s = objc_start_struct (name);
2069 tree super = (super_name ? xref_tag (RECORD_TYPE, super_name) : NULL_TREE);
2070 tree t;
2071 VEC(tree,heap) *objc_info = NULL;
2072 int i;
2074 if (super)
2076 /* Prepend a packed variant of the base class into the layout. This
2077 is necessary to preserve ObjC ABI compatibility. */
2078 tree base = build_decl (input_location,
2079 FIELD_DECL, NULL_TREE, super);
2080 tree field = TYPE_FIELDS (super);
2082 while (field && DECL_CHAIN (field)
2083 && TREE_CODE (DECL_CHAIN (field)) == FIELD_DECL)
2084 field = DECL_CHAIN (field);
2086 /* For ObjC ABI purposes, the "packed" size of a base class is
2087 the sum of the offset and the size (in bits) of the last field
2088 in the class. */
2089 DECL_SIZE (base)
2090 = (field && TREE_CODE (field) == FIELD_DECL
2091 ? size_binop (PLUS_EXPR,
2092 size_binop (PLUS_EXPR,
2093 size_binop
2094 (MULT_EXPR,
2095 convert (bitsizetype,
2096 DECL_FIELD_OFFSET (field)),
2097 bitsize_int (BITS_PER_UNIT)),
2098 DECL_FIELD_BIT_OFFSET (field)),
2099 DECL_SIZE (field))
2100 : bitsize_zero_node);
2101 DECL_SIZE_UNIT (base)
2102 = size_binop (FLOOR_DIV_EXPR, convert (sizetype, DECL_SIZE (base)),
2103 size_int (BITS_PER_UNIT));
2104 DECL_ARTIFICIAL (base) = 1;
2105 DECL_ALIGN (base) = 1;
2106 DECL_FIELD_CONTEXT (base) = s;
2107 #ifdef OBJCPLUS
2108 DECL_FIELD_IS_BASE (base) = 1;
2110 if (fields)
2111 TREE_NO_WARNING (fields) = 1; /* Suppress C++ ABI warnings -- we */
2112 #endif /* are following the ObjC ABI here. */
2113 DECL_CHAIN (base) = fields;
2114 fields = base;
2117 /* NB: Calling finish_struct() may cause type TYPE_OBJC_INFO
2118 information in all variants of this RECORD_TYPE to be destroyed
2119 (this is because the C frontend manipulates TYPE_LANG_SPECIFIC
2120 for something else and then will change all variants to use the
2121 same resulting TYPE_LANG_SPECIFIC, ignoring the fact that we use
2122 it for ObjC protocols and that such propagation will make all
2123 variants use the same objc_info), but it is therein that we store
2124 protocol conformance info (e.g., 'NSObject <MyProtocol>').
2125 Hence, we must save the ObjC-specific information before calling
2126 finish_struct(), and then reinstate it afterwards. */
2128 for (t = TYPE_MAIN_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t))
2130 INIT_TYPE_OBJC_INFO (t);
2131 VEC_safe_push (tree, heap, objc_info, TYPE_OBJC_INFO (t));
2134 s = objc_finish_struct (s, fields);
2136 for (i = 0, t = TYPE_MAIN_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t), i++)
2138 /* We now want to restore the different TYPE_OBJC_INFO, but we
2139 have the additional problem that the C frontend doesn't just
2140 copy TYPE_LANG_SPECIFIC from one variant to the other; it
2141 actually makes all of them the *same* TYPE_LANG_SPECIFIC. As
2142 we need a different TYPE_OBJC_INFO for each (and
2143 TYPE_OBJC_INFO is a field in TYPE_LANG_SPECIFIC), we need to
2144 make a copy of each TYPE_LANG_SPECIFIC before we modify
2145 TYPE_OBJC_INFO. */
2146 if (TYPE_LANG_SPECIFIC (t))
2148 /* Create a copy of TYPE_LANG_SPECIFIC. */
2149 struct lang_type *old_lang_type = TYPE_LANG_SPECIFIC (t);
2150 ALLOC_OBJC_TYPE_LANG_SPECIFIC (t);
2151 memcpy (TYPE_LANG_SPECIFIC (t), old_lang_type,
2152 SIZEOF_OBJC_TYPE_LANG_SPECIFIC);
2154 else
2156 /* Just create a new one. */
2157 ALLOC_OBJC_TYPE_LANG_SPECIFIC (t);
2159 /* Replace TYPE_OBJC_INFO with the saved one. This restores any
2160 protocol information that may have been associated with the
2161 type. */
2162 TYPE_OBJC_INFO (t) = VEC_index (tree, objc_info, i);
2163 /* Replace the IDENTIFIER_NODE with an actual @interface now
2164 that we have it. */
2165 TYPE_OBJC_INTERFACE (t) = klass;
2167 VEC_free (tree, heap, objc_info);
2169 /* Use TYPE_BINFO structures to point at the super class, if any. */
2170 objc_xref_basetypes (s, super);
2172 /* Mark this struct as a class template. */
2173 CLASS_STATIC_TEMPLATE (klass) = s;
2175 return s;
2178 /* Mark DECL as being 'volatile' for purposes of Darwin
2179 _setjmp()/_longjmp() exception handling. Called from
2180 objc_mark_locals_volatile(). */
2181 void
2182 objc_volatilize_decl (tree decl)
2184 /* Do not mess with variables that are 'static' or (already)
2185 'volatile'. */
2186 if (!TREE_THIS_VOLATILE (decl) && !TREE_STATIC (decl)
2187 && (TREE_CODE (decl) == VAR_DECL
2188 || TREE_CODE (decl) == PARM_DECL))
2190 if (local_variables_to_volatilize == NULL)
2191 local_variables_to_volatilize = VEC_alloc (tree, gc, 8);
2193 VEC_safe_push (tree, gc, local_variables_to_volatilize, decl);
2197 /* Called when parsing of a function completes; if any local variables
2198 in the function were marked as variables to volatilize, change them
2199 to volatile. We do this at the end of the function when the
2200 warnings about discarding 'volatile' have already been produced.
2201 We are making the variables as volatile just to force the compiler
2202 to preserve them between setjmp/longjmp, but we don't want warnings
2203 for them as they aren't really volatile. */
2204 void
2205 objc_finish_function (void)
2207 /* If there are any local variables to volatilize, volatilize them. */
2208 if (local_variables_to_volatilize)
2210 int i;
2211 tree decl;
2212 FOR_EACH_VEC_ELT (tree, local_variables_to_volatilize, i, decl)
2214 tree t = TREE_TYPE (decl);
2216 t = build_qualified_type (t, TYPE_QUALS (t) | TYPE_QUAL_VOLATILE);
2217 TREE_TYPE (decl) = t;
2218 TREE_THIS_VOLATILE (decl) = 1;
2219 TREE_SIDE_EFFECTS (decl) = 1;
2220 DECL_REGISTER (decl) = 0;
2221 #ifndef OBJCPLUS
2222 C_DECL_REGISTER (decl) = 0;
2223 #endif
2226 /* Now we delete the vector. This sets it to NULL as well. */
2227 VEC_free (tree, gc, local_variables_to_volatilize);
2231 /* Check if protocol PROTO is adopted (directly or indirectly) by class CLS
2232 (including its categories and superclasses) or by object type TYP.
2233 Issue a warning if PROTO is not adopted anywhere and WARN is set. */
2235 static bool
2236 objc_lookup_protocol (tree proto, tree cls, tree typ, bool warn)
2238 bool class_type = (cls != NULL_TREE);
2240 while (cls)
2242 tree c;
2244 /* Check protocols adopted by the class and its categories. */
2245 for (c = cls; c; c = CLASS_CATEGORY_LIST (c))
2247 if (lookup_protocol_in_reflist (CLASS_PROTOCOL_LIST (c), proto))
2248 return true;
2251 /* Repeat for superclasses. */
2252 cls = lookup_interface (CLASS_SUPER_NAME (cls));
2255 /* Check for any protocols attached directly to the object type. */
2256 if (TYPE_HAS_OBJC_INFO (typ))
2258 if (lookup_protocol_in_reflist (TYPE_OBJC_PROTOCOL_LIST (typ), proto))
2259 return true;
2262 if (warn)
2264 *errbuf = 0;
2265 gen_type_name_0 (class_type ? typ : TYPE_POINTER_TO (typ));
2266 /* NB: Types 'id' and 'Class' cannot reasonably be described as
2267 "implementing" a given protocol, since they do not have an
2268 implementation. */
2269 if (class_type)
2270 warning (0, "class %qs does not implement the %qE protocol",
2271 identifier_to_locale (errbuf), PROTOCOL_NAME (proto));
2272 else
2273 warning (0, "type %qs does not conform to the %qE protocol",
2274 identifier_to_locale (errbuf), PROTOCOL_NAME (proto));
2277 return false;
2280 /* Check if class RCLS and instance struct type RTYP conform to at least the
2281 same protocols that LCLS and LTYP conform to. */
2283 static bool
2284 objc_compare_protocols (tree lcls, tree ltyp, tree rcls, tree rtyp, bool warn)
2286 tree p;
2287 bool have_lproto = false;
2289 while (lcls)
2291 /* NB: We do _not_ look at categories defined for LCLS; these may or
2292 may not get loaded in, and therefore it is unreasonable to require
2293 that RCLS/RTYP must implement any of their protocols. */
2294 for (p = CLASS_PROTOCOL_LIST (lcls); p; p = TREE_CHAIN (p))
2296 have_lproto = true;
2298 if (!objc_lookup_protocol (TREE_VALUE (p), rcls, rtyp, warn))
2299 return warn;
2302 /* Repeat for superclasses. */
2303 lcls = lookup_interface (CLASS_SUPER_NAME (lcls));
2306 /* Check for any protocols attached directly to the object type. */
2307 if (TYPE_HAS_OBJC_INFO (ltyp))
2309 for (p = TYPE_OBJC_PROTOCOL_LIST (ltyp); p; p = TREE_CHAIN (p))
2311 have_lproto = true;
2313 if (!objc_lookup_protocol (TREE_VALUE (p), rcls, rtyp, warn))
2314 return warn;
2318 /* NB: If LTYP and LCLS have no protocols to search for, return 'true'
2319 vacuously, _unless_ RTYP is a protocol-qualified 'id'. We can get
2320 away with simply checking for 'id' or 'Class' (!RCLS), since this
2321 routine will not get called in other cases. */
2322 return have_lproto || (rcls != NULL_TREE);
2325 /* Given two types TYPE1 and TYPE2, return their least common ancestor.
2326 Both TYPE1 and TYPE2 must be pointers, and already determined to be
2327 compatible by objc_compare_types() below. */
2329 tree
2330 objc_common_type (tree type1, tree type2)
2332 tree inner1 = TREE_TYPE (type1), inner2 = TREE_TYPE (type2);
2334 while (POINTER_TYPE_P (inner1))
2336 inner1 = TREE_TYPE (inner1);
2337 inner2 = TREE_TYPE (inner2);
2340 /* If one type is derived from another, return the base type. */
2341 if (DERIVED_FROM_P (inner1, inner2))
2342 return type1;
2343 else if (DERIVED_FROM_P (inner2, inner1))
2344 return type2;
2346 /* If both types are 'Class', return 'Class'. */
2347 if (objc_is_class_id (inner1) && objc_is_class_id (inner2))
2348 return objc_class_type;
2350 /* Otherwise, return 'id'. */
2351 return objc_object_type;
2354 /* Determine if it is permissible to assign (if ARGNO is greater than -3)
2355 an instance of RTYP to an instance of LTYP or to compare the two
2356 (if ARGNO is equal to -3), per ObjC type system rules. Before
2357 returning 'true', this routine may issue warnings related to, e.g.,
2358 protocol conformance. When returning 'false', the routine must
2359 produce absolutely no warnings; the C or C++ front-end will do so
2360 instead, if needed. If either LTYP or RTYP is not an Objective-C
2361 type, the routine must return 'false'.
2363 The ARGNO parameter is encoded as follows:
2364 >= 1 Parameter number (CALLEE contains function being called);
2365 0 Return value;
2366 -1 Assignment;
2367 -2 Initialization;
2368 -3 Comparison (LTYP and RTYP may match in either direction);
2369 -4 Silent comparison (for C++ overload resolution);
2370 -5 Silent "specialization" comparison for RTYP to be a "specialization"
2371 of LTYP (a specialization means that RTYP is LTYP plus some constraints,
2372 so that each object of type RTYP is also of type LTYP). This is used
2373 when comparing property types. */
2375 bool
2376 objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee)
2378 tree lcls, rcls, lproto, rproto;
2379 bool pointers_compatible;
2381 /* We must be dealing with pointer types */
2382 if (!POINTER_TYPE_P (ltyp) || !POINTER_TYPE_P (rtyp))
2383 return false;
2387 ltyp = TREE_TYPE (ltyp); /* Remove indirections. */
2388 rtyp = TREE_TYPE (rtyp);
2390 while (POINTER_TYPE_P (ltyp) && POINTER_TYPE_P (rtyp));
2392 /* We must also handle function pointers, since ObjC is a bit more
2393 lenient than C or C++ on this. */
2394 if (TREE_CODE (ltyp) == FUNCTION_TYPE && TREE_CODE (rtyp) == FUNCTION_TYPE)
2396 function_args_iterator liter, riter;
2398 /* Return types must be covariant. */
2399 if (!comptypes (TREE_TYPE (ltyp), TREE_TYPE (rtyp))
2400 && !objc_compare_types (TREE_TYPE (ltyp), TREE_TYPE (rtyp),
2401 argno, callee))
2402 return false;
2404 /* Argument types must be contravariant. */
2405 function_args_iter_init (&liter, ltyp);
2406 function_args_iter_init (&riter, rtyp);
2408 while (1)
2410 ltyp = function_args_iter_cond (&liter);
2411 rtyp = function_args_iter_cond (&riter);
2413 /* If we've exhaused both lists simulateously, we're done. */
2414 if (ltyp == NULL_TREE && rtyp == NULL_TREE)
2415 break;
2417 /* If one list is shorter than the other, they fail to match. */
2418 if (ltyp == NULL_TREE || rtyp == NULL_TREE)
2419 return false;
2421 if (!comptypes (rtyp, ltyp)
2422 && !objc_compare_types (rtyp, ltyp, argno, callee))
2423 return false;
2425 function_args_iter_next (&liter);
2426 function_args_iter_next (&riter);
2429 return true;
2432 /* Past this point, we are only interested in ObjC class instances,
2433 or 'id' or 'Class'. */
2434 if (TREE_CODE (ltyp) != RECORD_TYPE || TREE_CODE (rtyp) != RECORD_TYPE)
2435 return false;
2437 if (!objc_is_object_id (ltyp) && !objc_is_class_id (ltyp)
2438 && !TYPE_HAS_OBJC_INFO (ltyp))
2439 return false;
2441 if (!objc_is_object_id (rtyp) && !objc_is_class_id (rtyp)
2442 && !TYPE_HAS_OBJC_INFO (rtyp))
2443 return false;
2445 /* Past this point, we are committed to returning 'true' to the caller
2446 (unless performing a silent comparison; see below). However, we can
2447 still warn about type and/or protocol mismatches. */
2449 if (TYPE_HAS_OBJC_INFO (ltyp))
2451 lcls = TYPE_OBJC_INTERFACE (ltyp);
2452 lproto = TYPE_OBJC_PROTOCOL_LIST (ltyp);
2454 else
2455 lcls = lproto = NULL_TREE;
2457 if (TYPE_HAS_OBJC_INFO (rtyp))
2459 rcls = TYPE_OBJC_INTERFACE (rtyp);
2460 rproto = TYPE_OBJC_PROTOCOL_LIST (rtyp);
2462 else
2463 rcls = rproto = NULL_TREE;
2465 /* If we could not find an @interface declaration, we must have
2466 only seen a @class declaration; for purposes of type comparison,
2467 treat it as a stand-alone (root) class. */
2469 if (lcls && TREE_CODE (lcls) == IDENTIFIER_NODE)
2470 lcls = NULL_TREE;
2472 if (rcls && TREE_CODE (rcls) == IDENTIFIER_NODE)
2473 rcls = NULL_TREE;
2475 /* If either type is an unqualified 'id', we're done. This is because
2476 an 'id' can be assigned to or from any type with no warnings. */
2477 if (argno != -5)
2479 if ((!lproto && objc_is_object_id (ltyp))
2480 || (!rproto && objc_is_object_id (rtyp)))
2481 return true;
2483 else
2485 /* For property checks, though, an 'id' is considered the most
2486 general type of object, hence if you try to specialize an
2487 'NSArray *' (ltyp) property with an 'id' (rtyp) one, we need
2488 to warn. */
2489 if (!lproto && objc_is_object_id (ltyp))
2490 return true;
2493 pointers_compatible = (TYPE_MAIN_VARIANT (ltyp) == TYPE_MAIN_VARIANT (rtyp));
2495 /* If the underlying types are the same, and at most one of them has
2496 a protocol list, we do not need to issue any diagnostics. */
2497 if (pointers_compatible && (!lproto || !rproto))
2498 return true;
2500 /* If exactly one of the types is 'Class', issue a diagnostic; any
2501 exceptions of this rule have already been handled. */
2502 if (objc_is_class_id (ltyp) ^ objc_is_class_id (rtyp))
2503 pointers_compatible = false;
2504 /* Otherwise, check for inheritance relations. */
2505 else
2507 if (!pointers_compatible)
2509 /* Again, if any of the two is an 'id', we're satisfied,
2510 unless we're comparing properties, in which case only an
2511 'id' on the left-hand side (old property) is good
2512 enough. */
2513 if (argno != -5)
2514 pointers_compatible
2515 = (objc_is_object_id (ltyp) || objc_is_object_id (rtyp));
2516 else
2517 pointers_compatible = objc_is_object_id (ltyp);
2520 if (!pointers_compatible)
2521 pointers_compatible = DERIVED_FROM_P (ltyp, rtyp);
2523 if (!pointers_compatible && (argno == -3 || argno == -4))
2524 pointers_compatible = DERIVED_FROM_P (rtyp, ltyp);
2527 /* If the pointers match modulo protocols, check for protocol conformance
2528 mismatches. */
2529 if (pointers_compatible)
2531 pointers_compatible = objc_compare_protocols (lcls, ltyp, rcls, rtyp,
2532 argno != -3);
2534 if (!pointers_compatible && argno == -3)
2535 pointers_compatible = objc_compare_protocols (rcls, rtyp, lcls, ltyp,
2536 argno != -3);
2539 if (!pointers_compatible)
2541 /* The two pointers are not exactly compatible. Issue a warning, unless
2542 we are performing a silent comparison, in which case return 'false'
2543 instead. */
2544 /* NB: For the time being, we shall make our warnings look like their
2545 C counterparts. In the future, we may wish to make them more
2546 ObjC-specific. */
2547 switch (argno)
2549 case -5:
2550 case -4:
2551 return false;
2553 case -3:
2554 warning (0, "comparison of distinct Objective-C types lacks a cast");
2555 break;
2557 case -2:
2558 warning (0, "initialization from distinct Objective-C type");
2559 break;
2561 case -1:
2562 warning (0, "assignment from distinct Objective-C type");
2563 break;
2565 case 0:
2566 warning (0, "distinct Objective-C type in return");
2567 break;
2569 default:
2570 warning (0, "passing argument %d of %qE from distinct "
2571 "Objective-C type", argno, callee);
2572 break;
2576 return true;
2579 /* This routine is similar to objc_compare_types except that function-pointers are
2580 excluded. This is because, caller assumes that common types are of (id, Object*)
2581 variety and calls objc_common_type to obtain a common type. There is no commonolty
2582 between two function-pointers in this regard. */
2584 bool
2585 objc_have_common_type (tree ltyp, tree rtyp, int argno, tree callee)
2587 if (objc_compare_types (ltyp, rtyp, argno, callee))
2589 /* exclude function-pointer types. */
2592 ltyp = TREE_TYPE (ltyp); /* Remove indirections. */
2593 rtyp = TREE_TYPE (rtyp);
2595 while (POINTER_TYPE_P (ltyp) && POINTER_TYPE_P (rtyp));
2596 return !(TREE_CODE (ltyp) == FUNCTION_TYPE && TREE_CODE (rtyp) == FUNCTION_TYPE);
2598 return false;
2601 #ifndef OBJCPLUS
2602 /* Determine if CHILD is derived from PARENT. The routine assumes that
2603 both parameters are RECORD_TYPEs, and is non-reflexive. */
2605 static bool
2606 objc_derived_from_p (tree parent, tree child)
2608 parent = TYPE_MAIN_VARIANT (parent);
2610 for (child = TYPE_MAIN_VARIANT (child);
2611 TYPE_BINFO (child) && BINFO_N_BASE_BINFOS (TYPE_BINFO (child));)
2613 child = TYPE_MAIN_VARIANT (BINFO_TYPE (BINFO_BASE_BINFO
2614 (TYPE_BINFO (child),
2615 0)));
2617 if (child == parent)
2618 return true;
2621 return false;
2623 #endif
2625 tree
2626 objc_build_component_ref (tree datum, tree component)
2628 /* If COMPONENT is NULL, the caller is referring to the anonymous
2629 base class field. */
2630 if (!component)
2632 tree base = TYPE_FIELDS (TREE_TYPE (datum));
2634 return build3 (COMPONENT_REF, TREE_TYPE (base), datum, base, NULL_TREE);
2637 /* The 'build_component_ref' routine has been removed from the C++
2638 front-end, but 'finish_class_member_access_expr' seems to be
2639 a worthy substitute. */
2640 #ifdef OBJCPLUS
2641 return finish_class_member_access_expr (datum, component, false,
2642 tf_warning_or_error);
2643 #else
2644 return build_component_ref (input_location, datum, component);
2645 #endif
2648 /* Recursively copy inheritance information rooted at BINFO. To do this,
2649 we emulate the song and dance performed by cp/tree.c:copy_binfo(). */
2651 static tree
2652 objc_copy_binfo (tree binfo)
2654 tree btype = BINFO_TYPE (binfo);
2655 tree binfo2 = make_tree_binfo (BINFO_N_BASE_BINFOS (binfo));
2656 tree base_binfo;
2657 int ix;
2659 BINFO_TYPE (binfo2) = btype;
2660 BINFO_OFFSET (binfo2) = BINFO_OFFSET (binfo);
2661 BINFO_BASE_ACCESSES (binfo2) = BINFO_BASE_ACCESSES (binfo);
2663 /* Recursively copy base binfos of BINFO. */
2664 for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
2666 tree base_binfo2 = objc_copy_binfo (base_binfo);
2668 BINFO_INHERITANCE_CHAIN (base_binfo2) = binfo2;
2669 BINFO_BASE_APPEND (binfo2, base_binfo2);
2672 return binfo2;
2675 /* Record superclass information provided in BASETYPE for ObjC class REF.
2676 This is loosely based on cp/decl.c:xref_basetypes(). */
2678 static void
2679 objc_xref_basetypes (tree ref, tree basetype)
2681 tree binfo = make_tree_binfo (basetype ? 1 : 0);
2683 TYPE_BINFO (ref) = binfo;
2684 BINFO_OFFSET (binfo) = size_zero_node;
2685 BINFO_TYPE (binfo) = ref;
2687 if (basetype)
2689 tree base_binfo = objc_copy_binfo (TYPE_BINFO (basetype));
2691 BINFO_INHERITANCE_CHAIN (base_binfo) = binfo;
2692 BINFO_BASE_ACCESSES (binfo) = VEC_alloc (tree, gc, 1);
2693 BINFO_BASE_APPEND (binfo, base_binfo);
2694 BINFO_BASE_ACCESS_APPEND (binfo, access_public_node);
2698 /* Called from finish_decl. */
2700 void
2701 objc_check_decl (tree decl)
2703 tree type = TREE_TYPE (decl);
2705 if (TREE_CODE (type) != RECORD_TYPE)
2706 return;
2707 if (OBJC_TYPE_NAME (type) && (type = objc_is_class_name (OBJC_TYPE_NAME (type))))
2708 error ("statically allocated instance of Objective-C class %qE",
2709 type);
2712 void
2713 objc_check_global_decl (tree decl)
2715 tree id = DECL_NAME (decl);
2716 if (objc_is_class_name (id) && global_bindings_p())
2717 error ("redeclaration of Objective-C class %qs", IDENTIFIER_POINTER (id));
2720 /* Construct a PROTOCOLS-qualified variant of INTERFACE, where
2721 INTERFACE may either name an Objective-C class, or refer to the
2722 special 'id' or 'Class' types. If INTERFACE is not a valid ObjC
2723 type, just return it unchanged. This function is often called when
2724 PROTOCOLS is NULL_TREE, in which case we simply look up the
2725 appropriate INTERFACE. */
2727 tree
2728 objc_get_protocol_qualified_type (tree interface, tree protocols)
2730 /* If INTERFACE is not provided, default to 'id'. */
2731 tree type = (interface ? objc_is_id (interface) : objc_object_type);
2732 bool is_ptr = (type != NULL_TREE);
2734 if (!is_ptr)
2736 type = objc_is_class_name (interface);
2738 if (type)
2740 /* If looking at a typedef, retrieve the precise type it
2741 describes. */
2742 if (TREE_CODE (interface) == IDENTIFIER_NODE)
2743 interface = identifier_global_value (interface);
2745 type = ((interface && TREE_CODE (interface) == TYPE_DECL
2746 && DECL_ORIGINAL_TYPE (interface))
2747 ? DECL_ORIGINAL_TYPE (interface)
2748 : xref_tag (RECORD_TYPE, type));
2750 else
2752 /* This case happens when we are given an 'interface' which
2753 is not a valid class name. For example if a typedef was
2754 used, and 'interface' really is the identifier of the
2755 typedef, but when you resolve it you don't get an
2756 Objective-C class, but something else, such as 'int'.
2757 This is an error; protocols make no sense unless you use
2758 them with Objective-C objects. */
2759 error_at (input_location, "only Objective-C object types can be qualified with a protocol");
2761 /* Try to recover. Ignore the invalid class name, and treat
2762 the object as an 'id' to silence further warnings about
2763 the class. */
2764 type = objc_object_type;
2765 is_ptr = true;
2769 if (protocols)
2771 type = build_variant_type_copy (type);
2773 /* For pointers (i.e., 'id' or 'Class'), attach the protocol(s)
2774 to the pointee. */
2775 if (is_ptr)
2777 tree orig_pointee_type = TREE_TYPE (type);
2778 TREE_TYPE (type) = build_variant_type_copy (orig_pointee_type);
2780 /* Set up the canonical type information. */
2781 TYPE_CANONICAL (type)
2782 = TYPE_CANONICAL (TYPE_POINTER_TO (orig_pointee_type));
2784 TYPE_POINTER_TO (TREE_TYPE (type)) = type;
2785 type = TREE_TYPE (type);
2788 /* Look up protocols and install in lang specific list. */
2789 DUP_TYPE_OBJC_INFO (type, TYPE_MAIN_VARIANT (type));
2790 TYPE_OBJC_PROTOCOL_LIST (type) = lookup_and_install_protocols
2791 (protocols, /* definition_required */ false);
2793 /* For RECORD_TYPEs, point to the @interface; for 'id' and 'Class',
2794 return the pointer to the new pointee variant. */
2795 if (is_ptr)
2796 type = TYPE_POINTER_TO (type);
2797 else
2798 TYPE_OBJC_INTERFACE (type)
2799 = TYPE_OBJC_INTERFACE (TYPE_MAIN_VARIANT (type));
2802 return type;
2805 /* Check for circular dependencies in protocols. The arguments are
2806 PROTO, the protocol to check, and LIST, a list of protocol it
2807 conforms to. */
2809 static void
2810 check_protocol_recursively (tree proto, tree list)
2812 tree p;
2814 for (p = list; p; p = TREE_CHAIN (p))
2816 tree pp = TREE_VALUE (p);
2818 if (TREE_CODE (pp) == IDENTIFIER_NODE)
2819 pp = lookup_protocol (pp, /* warn if deprecated */ false,
2820 /* definition_required */ false);
2822 if (pp == proto)
2823 fatal_error ("protocol %qE has circular dependency",
2824 PROTOCOL_NAME (pp));
2825 if (pp)
2826 check_protocol_recursively (proto, PROTOCOL_LIST (pp));
2830 /* Look up PROTOCOLS, and return a list of those that are found. If
2831 none are found, return NULL. Note that this function will emit a
2832 warning if a protocol is found and is deprecated. If
2833 'definition_required', then warn if the protocol is found but is
2834 not defined (ie, if we only saw a forward-declaration of the
2835 protocol (as in "@protocol NSObject;") not a real definition with
2836 the list of methods). */
2837 static tree
2838 lookup_and_install_protocols (tree protocols, bool definition_required)
2840 tree proto;
2841 tree return_value = NULL_TREE;
2843 if (protocols == error_mark_node)
2844 return NULL;
2846 for (proto = protocols; proto; proto = TREE_CHAIN (proto))
2848 tree ident = TREE_VALUE (proto);
2849 tree p = lookup_protocol (ident, /* warn_if_deprecated */ true,
2850 definition_required);
2852 if (p)
2853 return_value = chainon (return_value,
2854 build_tree_list (NULL_TREE, p));
2855 else if (ident != error_mark_node)
2856 error ("cannot find protocol declaration for %qE",
2857 ident);
2860 return return_value;
2863 static void
2864 build_common_objc_exception_stuff (void)
2866 tree noreturn_list, nothrow_list, temp_type;
2868 noreturn_list = tree_cons (get_identifier ("noreturn"), NULL, NULL);
2869 nothrow_list = tree_cons (get_identifier ("nothrow"), NULL, NULL);
2871 /* void objc_exception_throw(id) __attribute__((noreturn)); */
2872 /* void objc_sync_enter(id); */
2873 /* void objc_sync_exit(id); */
2874 temp_type = build_function_type_list (void_type_node,
2875 objc_object_type,
2876 NULL_TREE);
2877 objc_exception_throw_decl
2878 = add_builtin_function (TAG_EXCEPTIONTHROW, temp_type, 0, NOT_BUILT_IN, NULL,
2879 noreturn_list);
2880 /* Make sure that objc_exception_throw (id) claims that it may throw an
2881 exception. */
2882 TREE_NOTHROW (objc_exception_throw_decl) = 0;
2884 objc_sync_enter_decl
2885 = add_builtin_function (TAG_SYNCENTER, temp_type, 0, NOT_BUILT_IN,
2886 NULL, nothrow_list);
2888 objc_sync_exit_decl
2889 = add_builtin_function (TAG_SYNCEXIT, temp_type, 0, NOT_BUILT_IN,
2890 NULL, nothrow_list);
2893 /* Purpose: "play" parser, creating/installing representations
2894 of the declarations that are required by Objective-C.
2896 Model:
2898 type_spec--------->sc_spec
2899 (tree_list) (tree_list)
2902 identifier_node identifier_node */
2904 static void
2905 synth_module_prologue (void)
2907 tree type;
2908 enum debug_info_type save_write_symbols = write_symbols;
2909 const struct gcc_debug_hooks *const save_hooks = debug_hooks;
2911 /* Suppress outputting debug symbols, because
2912 dbxout_init hasn't been called yet. */
2913 write_symbols = NO_DEBUG;
2914 debug_hooks = &do_nothing_debug_hooks;
2916 #ifdef OBJCPLUS
2917 push_lang_context (lang_name_c); /* extern "C" */
2918 #endif
2920 /* The following are also defined in <objc/objc.h> and friends. */
2922 objc_object_id = get_identifier (TAG_OBJECT);
2923 objc_class_id = get_identifier (TAG_CLASS);
2925 objc_object_reference = xref_tag (RECORD_TYPE, objc_object_id);
2926 objc_class_reference = xref_tag (RECORD_TYPE, objc_class_id);
2928 objc_object_type = build_pointer_type (objc_object_reference);
2929 objc_class_type = build_pointer_type (objc_class_reference);
2931 objc_object_name = get_identifier (OBJECT_TYPEDEF_NAME);
2932 objc_class_name = get_identifier (CLASS_TYPEDEF_NAME);
2934 /* Declare the 'id' and 'Class' typedefs. */
2935 type = lang_hooks.decls.pushdecl (build_decl (input_location,
2936 TYPE_DECL,
2937 objc_object_name,
2938 objc_object_type));
2939 TREE_NO_WARNING (type) = 1;
2941 type = lang_hooks.decls.pushdecl (build_decl (input_location,
2942 TYPE_DECL,
2943 objc_class_name,
2944 objc_class_type));
2945 TREE_NO_WARNING (type) = 1;
2947 /* Forward-declare '@interface Protocol'. */
2948 type = get_identifier (PROTOCOL_OBJECT_CLASS_NAME);
2949 objc_declare_class (type);
2950 objc_protocol_type = build_pointer_type (xref_tag (RECORD_TYPE, type));
2952 /* Declare receiver type used for dispatching messages to 'super'. */
2953 /* `struct objc_super *' */
2954 objc_super_type = build_pointer_type (xref_tag (RECORD_TYPE,
2955 get_identifier (TAG_SUPER)));
2957 /* Declare pointers to method and ivar lists. */
2958 objc_method_list_ptr = build_pointer_type
2959 (xref_tag (RECORD_TYPE,
2960 get_identifier (UTAG_METHOD_LIST)));
2961 objc_method_proto_list_ptr
2962 = build_pointer_type (xref_tag (RECORD_TYPE,
2963 get_identifier (UTAG_METHOD_PROTOTYPE_LIST)));
2964 objc_ivar_list_ptr = build_pointer_type
2965 (xref_tag (RECORD_TYPE,
2966 get_identifier (UTAG_IVAR_LIST)));
2968 build_common_objc_exception_stuff ();
2970 /* Set-up runtime-specific templates, message and exception stuff. */
2971 (*runtime.initialize) ();
2973 /* Declare objc_getProperty, object_setProperty and other property
2974 accessor helpers. */
2975 build_common_objc_property_accessor_helpers ();
2977 /* Forward declare constant_string_id and constant_string_type. */
2978 if (!constant_string_class_name)
2979 constant_string_class_name = runtime.default_constant_string_class_name;
2980 constant_string_id = get_identifier (constant_string_class_name);
2981 objc_declare_class (constant_string_id);
2983 /* Pre-build the following entities - for speed/convenience. */
2984 self_id = get_identifier ("self");
2985 ucmd_id = get_identifier ("_cmd");
2987 /* Declare struct _objc_fast_enumeration_state { ... }; */
2988 build_fast_enumeration_state_template ();
2990 /* void objc_enumeration_mutation (id) */
2991 type = build_function_type_list (void_type_node,
2992 objc_object_type, NULL_TREE);
2993 objc_enumeration_mutation_decl
2994 = add_builtin_function (TAG_ENUMERATION_MUTATION, type, 0, NOT_BUILT_IN,
2995 NULL, NULL_TREE);
2996 TREE_NOTHROW (objc_enumeration_mutation_decl) = 0;
2998 #ifdef OBJCPLUS
2999 pop_lang_context ();
3000 #endif
3002 write_symbols = save_write_symbols;
3003 debug_hooks = save_hooks;
3006 /* --- const strings --- */
3008 /* Ensure that the ivar list for NSConstantString/NXConstantString
3009 (or whatever was specified via `-fconstant-string-class')
3010 contains fields at least as large as the following three, so that
3011 the runtime can stomp on them with confidence:
3013 struct STRING_OBJECT_CLASS_NAME
3015 Object isa;
3016 char *cString;
3017 unsigned int length;
3018 }; */
3020 static int
3021 check_string_class_template (void)
3023 tree field_decl = objc_get_class_ivars (constant_string_id);
3025 #define AT_LEAST_AS_LARGE_AS(F, T) \
3026 (F && TREE_CODE (F) == FIELD_DECL \
3027 && (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (F))) \
3028 >= TREE_INT_CST_LOW (TYPE_SIZE (T))))
3030 if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node))
3031 return 0;
3033 field_decl = DECL_CHAIN (field_decl);
3034 if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node))
3035 return 0;
3037 field_decl = DECL_CHAIN (field_decl);
3038 return AT_LEAST_AS_LARGE_AS (field_decl, unsigned_type_node);
3040 #undef AT_LEAST_AS_LARGE_AS
3043 /* Avoid calling `check_string_class_template ()' more than once. */
3044 static GTY(()) int string_layout_checked;
3046 /* Construct an internal string layout to be used as a template for
3047 creating NSConstantString/NXConstantString instances. */
3049 static tree
3050 objc_build_internal_const_str_type (void)
3052 tree type = (*lang_hooks.types.make_type) (RECORD_TYPE);
3053 tree fields = build_decl (input_location,
3054 FIELD_DECL, NULL_TREE, ptr_type_node);
3055 tree field = build_decl (input_location,
3056 FIELD_DECL, NULL_TREE, ptr_type_node);
3058 DECL_CHAIN (field) = fields; fields = field;
3059 field = build_decl (input_location,
3060 FIELD_DECL, NULL_TREE, unsigned_type_node);
3061 DECL_CHAIN (field) = fields; fields = field;
3062 /* NB: The finish_builtin_struct() routine expects FIELD_DECLs in
3063 reverse order! */
3064 finish_builtin_struct (type, "__builtin_ObjCString",
3065 fields, NULL_TREE);
3067 return type;
3070 /* Custom build_string which sets TREE_TYPE! */
3072 tree
3073 my_build_string (int len, const char *str)
3075 return fix_string_type (build_string (len, str));
3078 /* Build a string with contents STR and length LEN and convert it to a
3079 pointer. */
3081 tree
3082 my_build_string_pointer (int len, const char *str)
3084 tree string = my_build_string (len, str);
3085 tree ptrtype = build_pointer_type (TREE_TYPE (TREE_TYPE (string)));
3086 return build1 (ADDR_EXPR, ptrtype, string);
3089 static hashval_t
3090 string_hash (const void *ptr)
3092 const_tree const str = ((const struct string_descriptor *)ptr)->literal;
3093 const unsigned char *p = (const unsigned char *) TREE_STRING_POINTER (str);
3094 int i, len = TREE_STRING_LENGTH (str);
3095 hashval_t h = len;
3097 for (i = 0; i < len; i++)
3098 h = ((h * 613) + p[i]);
3100 return h;
3103 static int
3104 string_eq (const void *ptr1, const void *ptr2)
3106 const_tree const str1 = ((const struct string_descriptor *)ptr1)->literal;
3107 const_tree const str2 = ((const struct string_descriptor *)ptr2)->literal;
3108 int len1 = TREE_STRING_LENGTH (str1);
3110 return (len1 == TREE_STRING_LENGTH (str2)
3111 && !memcmp (TREE_STRING_POINTER (str1), TREE_STRING_POINTER (str2),
3112 len1));
3115 /* Given a chain of STRING_CST's, build a static instance of
3116 NXConstantString which points at the concatenation of those
3117 strings. We place the string object in the __string_objects
3118 section of the __OBJC segment. The Objective-C runtime will
3119 initialize the isa pointers of the string objects to point at the
3120 NXConstantString class object. */
3122 tree
3123 objc_build_string_object (tree string)
3125 tree constant_string_class;
3126 int length;
3127 tree addr;
3128 struct string_descriptor *desc, key;
3129 void **loc;
3131 /* We should be passed a STRING_CST. */
3132 gcc_checking_assert (TREE_CODE (string) == STRING_CST);
3133 length = TREE_STRING_LENGTH (string) - 1;
3135 /* The target may have different ideas on how to construct an ObjC string
3136 literal. On Darwin (Mac OS X), for example, we may wish to obtain a
3137 constant CFString reference instead.
3138 At present, this is only supported for the NeXT runtime. */
3139 if (flag_next_runtime
3140 && targetcm.objc_construct_string_object)
3142 tree constructor = (*targetcm.objc_construct_string_object) (string);
3143 if (constructor)
3144 return build1 (NOP_EXPR, objc_object_type, constructor);
3147 /* Check whether the string class being used actually exists and has the
3148 correct ivar layout. */
3149 if (!string_layout_checked)
3151 string_layout_checked = -1;
3152 constant_string_class = lookup_interface (constant_string_id);
3153 internal_const_str_type = objc_build_internal_const_str_type ();
3155 if (!constant_string_class
3156 || !(constant_string_type
3157 = CLASS_STATIC_TEMPLATE (constant_string_class)))
3158 error ("cannot find interface declaration for %qE",
3159 constant_string_id);
3160 /* The NSConstantString/NXConstantString ivar layout is now known. */
3161 else if (!check_string_class_template ())
3162 error ("interface %qE does not have valid constant string layout",
3163 constant_string_id);
3164 /* If the runtime can generate a literal reference to the string class,
3165 don't need to run a constructor. */
3166 else if (!(*runtime.setup_const_string_class_decl)())
3167 error ("cannot find reference tag for class %qE", constant_string_id);
3168 else
3170 string_layout_checked = 1; /* Success! */
3171 add_class_reference (constant_string_id);
3175 if (string_layout_checked == -1)
3176 return error_mark_node;
3178 /* Perhaps we already constructed a constant string just like this one? */
3179 key.literal = string;
3180 loc = htab_find_slot (string_htab, &key, INSERT);
3181 desc = (struct string_descriptor *) *loc;
3183 if (!desc)
3185 *loc = desc = ggc_alloc_string_descriptor ();
3186 desc->literal = string;
3187 desc->constructor =
3188 (*runtime.build_const_string_constructor) (input_location, string, length);
3191 addr = convert (build_pointer_type (constant_string_type),
3192 build_unary_op (input_location,
3193 ADDR_EXPR, desc->constructor, 1));
3195 return addr;
3198 /* Build a static constant CONSTRUCTOR
3199 with type TYPE and elements ELTS. */
3201 tree
3202 objc_build_constructor (tree type, VEC(constructor_elt,gc) *elts)
3204 tree constructor = build_constructor (type, elts);
3206 TREE_CONSTANT (constructor) = 1;
3207 TREE_STATIC (constructor) = 1;
3208 TREE_READONLY (constructor) = 1;
3210 #ifdef OBJCPLUS
3211 /* Adjust for impedance mismatch. We should figure out how to build
3212 CONSTRUCTORs that consistently please both the C and C++ gods. */
3213 if (!VEC_index (constructor_elt, elts, 0)->index)
3214 TREE_TYPE (constructor) = init_list_type_node;
3215 #endif
3217 return constructor;
3220 /* Return the DECL of the string IDENT in the SECTION. */
3222 tree
3223 get_objc_string_decl (tree ident, enum string_section section)
3225 tree chain;
3227 switch (section)
3229 case class_names:
3230 chain = class_names_chain;
3231 break;
3232 case meth_var_names:
3233 chain = meth_var_names_chain;
3234 break;
3235 case meth_var_types:
3236 chain = meth_var_types_chain;
3237 break;
3238 case prop_names_attr:
3239 chain = prop_names_attr_chain;
3240 break;
3241 default:
3242 gcc_unreachable ();
3245 for (; chain != 0; chain = TREE_CHAIN (chain))
3246 if (TREE_VALUE (chain) == ident)
3247 return (TREE_PURPOSE (chain));
3249 /* We didn't find the entry. */
3250 return NULL_TREE;
3253 /* Create a class reference, but don't create a variable to reference
3254 it. */
3256 void
3257 add_class_reference (tree ident)
3259 tree chain;
3261 if ((chain = cls_ref_chain))
3263 tree tail;
3266 if (ident == TREE_VALUE (chain))
3267 return;
3269 tail = chain;
3270 chain = TREE_CHAIN (chain);
3272 while (chain);
3274 /* Append to the end of the list */
3275 TREE_CHAIN (tail) = tree_cons (NULL_TREE, ident, NULL_TREE);
3277 else
3278 cls_ref_chain = tree_cons (NULL_TREE, ident, NULL_TREE);
3281 /* Get a class reference, creating it if necessary. Also create the
3282 reference variable. */
3283 tree
3284 objc_get_class_reference (tree ident)
3286 tree orig_ident = (DECL_P (ident)
3287 ? DECL_NAME (ident)
3288 : TYPE_P (ident)
3289 ? OBJC_TYPE_NAME (ident)
3290 : ident);
3291 bool local_scope = false;
3293 #ifdef OBJCPLUS
3294 if (processing_template_decl)
3295 /* Must wait until template instantiation time. */
3296 return build_min_nt_loc (UNKNOWN_LOCATION, CLASS_REFERENCE_EXPR, ident);
3297 #endif
3299 if (TREE_CODE (ident) == TYPE_DECL)
3300 ident = (DECL_ORIGINAL_TYPE (ident)
3301 ? DECL_ORIGINAL_TYPE (ident)
3302 : TREE_TYPE (ident));
3304 #ifdef OBJCPLUS
3305 if (TYPE_P (ident)
3306 && CP_TYPE_CONTEXT (ident) != global_namespace)
3307 local_scope = true;
3308 #endif
3310 if (local_scope || !(ident = objc_is_class_name (ident)))
3312 error ("%qE is not an Objective-C class name or alias",
3313 orig_ident);
3314 return error_mark_node;
3317 return (*runtime.get_class_reference) (ident);
3320 void
3321 objc_declare_alias (tree alias_ident, tree class_ident)
3323 tree underlying_class;
3325 #ifdef OBJCPLUS
3326 if (current_namespace != global_namespace) {
3327 error ("Objective-C declarations may only appear in global scope");
3329 #endif /* OBJCPLUS */
3331 if (!(underlying_class = objc_is_class_name (class_ident)))
3332 warning (0, "cannot find class %qE", class_ident);
3333 else if (objc_is_class_name (alias_ident))
3334 warning (0, "class %qE already exists", alias_ident);
3335 else
3337 /* Implement @compatibility_alias as a typedef. */
3338 #ifdef OBJCPLUS
3339 push_lang_context (lang_name_c); /* extern "C" */
3340 #endif
3341 lang_hooks.decls.pushdecl (build_decl
3342 (input_location,
3343 TYPE_DECL,
3344 alias_ident,
3345 xref_tag (RECORD_TYPE, underlying_class)));
3346 #ifdef OBJCPLUS
3347 pop_lang_context ();
3348 #endif
3349 objc_map_put (alias_name_map, alias_ident, underlying_class);
3353 void
3354 objc_declare_class (tree identifier)
3356 #ifdef OBJCPLUS
3357 if (current_namespace != global_namespace) {
3358 error ("Objective-C declarations may only appear in global scope");
3360 #endif /* OBJCPLUS */
3362 if (! objc_is_class_name (identifier))
3364 tree record = lookup_name (identifier), type = record;
3366 if (record)
3368 if (TREE_CODE (record) == TYPE_DECL)
3369 type = DECL_ORIGINAL_TYPE (record)
3370 ? DECL_ORIGINAL_TYPE (record)
3371 : TREE_TYPE (record);
3373 if (!TYPE_HAS_OBJC_INFO (type)
3374 || !TYPE_OBJC_INTERFACE (type))
3376 error ("%qE redeclared as different kind of symbol",
3377 identifier);
3378 error ("previous declaration of %q+D",
3379 record);
3383 record = xref_tag (RECORD_TYPE, identifier);
3384 INIT_TYPE_OBJC_INFO (record);
3385 /* In the case of a @class declaration, we store the ident in
3386 the TYPE_OBJC_INTERFACE. If later an @interface is found,
3387 we'll replace the ident with the interface. */
3388 TYPE_OBJC_INTERFACE (record) = identifier;
3389 objc_map_put (class_name_map, identifier, NULL_TREE);
3393 tree
3394 objc_is_class_name (tree ident)
3396 if (ident && TREE_CODE (ident) == IDENTIFIER_NODE)
3398 tree t = identifier_global_value (ident);
3399 if (t)
3400 ident = t;
3403 while (ident && TREE_CODE (ident) == TYPE_DECL && DECL_ORIGINAL_TYPE (ident))
3404 ident = OBJC_TYPE_NAME (DECL_ORIGINAL_TYPE (ident));
3406 if (ident && TREE_CODE (ident) == RECORD_TYPE)
3407 ident = OBJC_TYPE_NAME (ident);
3408 #ifdef OBJCPLUS
3409 if (ident && TREE_CODE (ident) == TYPE_DECL)
3411 tree type = TREE_TYPE (ident);
3412 if (type && TREE_CODE (type) == TEMPLATE_TYPE_PARM)
3413 return NULL_TREE;
3414 ident = DECL_NAME (ident);
3416 #endif
3417 if (!ident || TREE_CODE (ident) != IDENTIFIER_NODE)
3418 return NULL_TREE;
3420 if (lookup_interface (ident))
3421 return ident;
3424 tree target;
3426 target = objc_map_get (class_name_map, ident);
3427 if (target != OBJC_MAP_NOT_FOUND)
3428 return ident;
3430 target = objc_map_get (alias_name_map, ident);
3431 if (target != OBJC_MAP_NOT_FOUND)
3432 return target;
3435 return 0;
3438 /* Check whether TYPE is either 'id' or 'Class'. */
3440 tree
3441 objc_is_id (tree type)
3443 if (type && TREE_CODE (type) == IDENTIFIER_NODE)
3445 tree t = identifier_global_value (type);
3446 if (t)
3447 type = t;
3450 if (type && TREE_CODE (type) == TYPE_DECL)
3451 type = TREE_TYPE (type);
3453 /* NB: This function may be called before the ObjC front-end has
3454 been initialized, in which case OBJC_OBJECT_TYPE will (still) be NULL. */
3455 return (objc_object_type && type
3456 && (IS_ID (type) || IS_CLASS (type) || IS_SUPER (type))
3457 ? type
3458 : NULL_TREE);
3461 /* Check whether TYPE is either 'id', 'Class', or a pointer to an ObjC
3462 class instance. This is needed by other parts of the compiler to
3463 handle ObjC types gracefully. */
3465 tree
3466 objc_is_object_ptr (tree type)
3468 tree ret;
3470 type = TYPE_MAIN_VARIANT (type);
3471 if (!POINTER_TYPE_P (type))
3472 return 0;
3474 ret = objc_is_id (type);
3475 if (!ret)
3476 ret = objc_is_class_name (TREE_TYPE (type));
3478 return ret;
3481 static int
3482 objc_is_gcable_type (tree type, int or_strong_p)
3484 tree name;
3486 if (!TYPE_P (type))
3487 return 0;
3488 if (objc_is_id (TYPE_MAIN_VARIANT (type)))
3489 return 1;
3490 if (or_strong_p && lookup_attribute ("objc_gc", TYPE_ATTRIBUTES (type)))
3491 return 1;
3492 if (TREE_CODE (type) != POINTER_TYPE && TREE_CODE (type) != INDIRECT_REF)
3493 return 0;
3494 type = TREE_TYPE (type);
3495 if (TREE_CODE (type) != RECORD_TYPE)
3496 return 0;
3497 name = TYPE_NAME (type);
3498 return (objc_is_class_name (name) != NULL_TREE);
3501 static tree
3502 objc_substitute_decl (tree expr, tree oldexpr, tree newexpr)
3504 if (expr == oldexpr)
3505 return newexpr;
3507 switch (TREE_CODE (expr))
3509 case COMPONENT_REF:
3510 return objc_build_component_ref
3511 (objc_substitute_decl (TREE_OPERAND (expr, 0),
3512 oldexpr,
3513 newexpr),
3514 DECL_NAME (TREE_OPERAND (expr, 1)));
3515 case ARRAY_REF:
3516 return build_array_ref (input_location,
3517 objc_substitute_decl (TREE_OPERAND (expr, 0),
3518 oldexpr,
3519 newexpr),
3520 TREE_OPERAND (expr, 1));
3521 case INDIRECT_REF:
3522 return build_indirect_ref (input_location,
3523 objc_substitute_decl (TREE_OPERAND (expr, 0),
3524 oldexpr,
3525 newexpr), RO_ARROW);
3526 default:
3527 return expr;
3531 static tree
3532 objc_build_ivar_assignment (tree outervar, tree lhs, tree rhs)
3534 tree func_params;
3535 /* The LHS parameter contains the expression 'outervar->memberspec';
3536 we need to transform it into '&((typeof(outervar) *) 0)->memberspec',
3537 where memberspec may be arbitrarily complex (e.g., 'g->f.d[2].g[3]').
3539 tree offs
3540 = objc_substitute_decl
3541 (lhs, outervar, convert (TREE_TYPE (outervar), integer_zero_node));
3542 tree func
3543 = (flag_objc_direct_dispatch
3544 ? objc_assign_ivar_fast_decl
3545 : objc_assign_ivar_decl);
3547 offs = convert (integer_type_node, build_unary_op (input_location,
3548 ADDR_EXPR, offs, 0));
3549 offs = fold (offs);
3550 func_params = tree_cons (NULL_TREE,
3551 convert (objc_object_type, rhs),
3552 tree_cons (NULL_TREE, convert (objc_object_type, outervar),
3553 tree_cons (NULL_TREE, offs,
3554 NULL_TREE)));
3556 return build_function_call (input_location, func, func_params);
3559 static tree
3560 objc_build_global_assignment (tree lhs, tree rhs)
3562 tree func_params = tree_cons (NULL_TREE,
3563 convert (objc_object_type, rhs),
3564 tree_cons (NULL_TREE, convert (build_pointer_type (objc_object_type),
3565 build_unary_op (input_location, ADDR_EXPR, lhs, 0)),
3566 NULL_TREE));
3568 return build_function_call (input_location,
3569 objc_assign_global_decl, func_params);
3572 static tree
3573 objc_build_strong_cast_assignment (tree lhs, tree rhs)
3575 tree func_params = tree_cons (NULL_TREE,
3576 convert (objc_object_type, rhs),
3577 tree_cons (NULL_TREE, convert (build_pointer_type (objc_object_type),
3578 build_unary_op (input_location, ADDR_EXPR, lhs, 0)),
3579 NULL_TREE));
3581 return build_function_call (input_location,
3582 objc_assign_strong_cast_decl, func_params);
3585 static int
3586 objc_is_gcable_p (tree expr)
3588 return (TREE_CODE (expr) == COMPONENT_REF
3589 ? objc_is_gcable_p (TREE_OPERAND (expr, 1))
3590 : TREE_CODE (expr) == ARRAY_REF
3591 ? (objc_is_gcable_p (TREE_TYPE (expr))
3592 || objc_is_gcable_p (TREE_OPERAND (expr, 0)))
3593 : TREE_CODE (expr) == ARRAY_TYPE
3594 ? objc_is_gcable_p (TREE_TYPE (expr))
3595 : TYPE_P (expr)
3596 ? objc_is_gcable_type (expr, 1)
3597 : (objc_is_gcable_p (TREE_TYPE (expr))
3598 || (DECL_P (expr)
3599 && lookup_attribute ("objc_gc", DECL_ATTRIBUTES (expr)))));
3602 static int
3603 objc_is_ivar_reference_p (tree expr)
3605 return (TREE_CODE (expr) == ARRAY_REF
3606 ? objc_is_ivar_reference_p (TREE_OPERAND (expr, 0))
3607 : TREE_CODE (expr) == COMPONENT_REF
3608 ? TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL
3609 : 0);
3612 static int
3613 objc_is_global_reference_p (tree expr)
3615 return (TREE_CODE (expr) == INDIRECT_REF || TREE_CODE (expr) == PLUS_EXPR
3616 ? objc_is_global_reference_p (TREE_OPERAND (expr, 0))
3617 : DECL_P (expr)
3618 ? (DECL_FILE_SCOPE_P (expr) || TREE_STATIC (expr))
3619 : 0);
3622 tree
3623 objc_generate_write_barrier (tree lhs, enum tree_code modifycode, tree rhs)
3625 tree result = NULL_TREE, outer;
3626 int strong_cast_p = 0, outer_gc_p = 0, indirect_p = 0;
3628 /* This function is currently only used with the next runtime with
3629 garbage collection enabled (-fobjc-gc). */
3630 gcc_assert (flag_next_runtime);
3632 /* See if we have any lhs casts, and strip them out. NB: The lvalue casts
3633 will have been transformed to the form '*(type *)&expr'. */
3634 if (TREE_CODE (lhs) == INDIRECT_REF)
3636 outer = TREE_OPERAND (lhs, 0);
3638 while (!strong_cast_p
3639 && (CONVERT_EXPR_P (outer)
3640 || TREE_CODE (outer) == NON_LVALUE_EXPR))
3642 tree lhstype = TREE_TYPE (outer);
3644 /* Descend down the cast chain, and record the first objc_gc
3645 attribute found. */
3646 if (POINTER_TYPE_P (lhstype))
3648 tree attr
3649 = lookup_attribute ("objc_gc",
3650 TYPE_ATTRIBUTES (TREE_TYPE (lhstype)));
3652 if (attr)
3653 strong_cast_p = 1;
3656 outer = TREE_OPERAND (outer, 0);
3660 /* If we have a __strong cast, it trumps all else. */
3661 if (strong_cast_p)
3663 if (modifycode != NOP_EXPR)
3664 goto invalid_pointer_arithmetic;
3666 if (warn_assign_intercept)
3667 warning (0, "strong-cast assignment has been intercepted");
3669 result = objc_build_strong_cast_assignment (lhs, rhs);
3671 goto exit_point;
3674 /* the lhs must be of a suitable type, regardless of its underlying
3675 structure. */
3676 if (!objc_is_gcable_p (lhs))
3677 goto exit_point;
3679 outer = lhs;
3681 while (outer
3682 && (TREE_CODE (outer) == COMPONENT_REF
3683 || TREE_CODE (outer) == ARRAY_REF))
3684 outer = TREE_OPERAND (outer, 0);
3686 if (TREE_CODE (outer) == INDIRECT_REF)
3688 outer = TREE_OPERAND (outer, 0);
3689 indirect_p = 1;
3692 outer_gc_p = objc_is_gcable_p (outer);
3694 /* Handle ivar assignments. */
3695 if (objc_is_ivar_reference_p (lhs))
3697 /* if the struct to the left of the ivar is not an Objective-C object (__strong
3698 doesn't cut it here), the best we can do here is suggest a cast. */
3699 if (!objc_is_gcable_type (TREE_TYPE (outer), 0))
3701 /* We may still be able to use the global write barrier... */
3702 if (!indirect_p && objc_is_global_reference_p (outer))
3703 goto global_reference;
3705 suggest_cast:
3706 if (modifycode == NOP_EXPR)
3708 if (warn_assign_intercept)
3709 warning (0, "strong-cast may possibly be needed");
3712 goto exit_point;
3715 if (modifycode != NOP_EXPR)
3716 goto invalid_pointer_arithmetic;
3718 if (warn_assign_intercept)
3719 warning (0, "instance variable assignment has been intercepted");
3721 result = objc_build_ivar_assignment (outer, lhs, rhs);
3723 goto exit_point;
3726 /* Likewise, intercept assignment to global/static variables if their type is
3727 GC-marked. */
3728 if (objc_is_global_reference_p (outer))
3730 if (indirect_p)
3731 goto suggest_cast;
3733 global_reference:
3734 if (modifycode != NOP_EXPR)
3736 invalid_pointer_arithmetic:
3737 if (outer_gc_p)
3738 warning (0, "pointer arithmetic for garbage-collected objects not allowed");
3740 goto exit_point;
3743 if (warn_assign_intercept)
3744 warning (0, "global/static variable assignment has been intercepted");
3746 result = objc_build_global_assignment (lhs, rhs);
3749 /* In all other cases, fall back to the normal mechanism. */
3750 exit_point:
3751 return result;
3754 /* Implementation of the table mapping a class name (as an identifier)
3755 to a class node. The two public functions for it are
3756 lookup_interface() and add_interface(). add_interface() is only
3757 used in this file, so we can make it static. */
3759 static GTY(()) objc_map_t interface_map;
3761 static void
3762 interface_hash_init (void)
3764 interface_map = objc_map_alloc_ggc (200);
3767 static tree
3768 add_interface (tree class_name, tree name)
3770 /* Put interfaces on list in reverse order. */
3771 TREE_CHAIN (class_name) = interface_chain;
3772 interface_chain = class_name;
3774 /* Add it to the map. */
3775 objc_map_put (interface_map, name, class_name);
3777 return interface_chain;
3780 tree
3781 lookup_interface (tree ident)
3783 #ifdef OBJCPLUS
3784 if (ident && TREE_CODE (ident) == TYPE_DECL)
3785 ident = DECL_NAME (ident);
3786 #endif
3788 if (ident == NULL_TREE || TREE_CODE (ident) != IDENTIFIER_NODE)
3789 return NULL_TREE;
3792 tree interface = objc_map_get (interface_map, ident);
3794 if (interface == OBJC_MAP_NOT_FOUND)
3795 return NULL_TREE;
3796 else
3797 return interface;
3803 /* Implement @defs (<classname>) within struct bodies. */
3805 tree
3806 objc_get_class_ivars (tree class_name)
3808 tree interface = lookup_interface (class_name);
3810 if (interface)
3811 return get_class_ivars (interface, true);
3813 error ("cannot find interface declaration for %qE",
3814 class_name);
3816 return error_mark_node;
3820 /* Functions used by the hashtable for field duplicates in
3821 objc_detect_field_duplicates(). Ideally, we'd use a standard
3822 key-value dictionary hashtable , and store as keys the field names,
3823 and as values the actual declarations (used to print nice error
3824 messages with the locations). But, the hashtable we are using only
3825 allows us to store keys in the hashtable, without values (it looks
3826 more like a set). So, we store the DECLs, but define equality as
3827 DECLs having the same name, and hash as the hash of the name. */
3828 static hashval_t
3829 hash_instance_variable (const PTR p)
3831 const_tree q = (const_tree)p;
3832 return (hashval_t) ((intptr_t)(DECL_NAME (q)) >> 3);
3835 static int
3836 eq_instance_variable (const PTR p1, const PTR p2)
3838 const_tree a = (const_tree)p1;
3839 const_tree b = (const_tree)p2;
3840 return DECL_NAME (a) == DECL_NAME (b);
3843 /* Called when checking the variables in a struct. If we are not
3844 doing the ivars list inside an @interface context, then return
3845 false. Else, perform the check for duplicate ivars, then return
3846 true. The check for duplicates checks if an instance variable with
3847 the same name exists in the class or in a superclass. If
3848 'check_superclasses_only' is set to true, then it is assumed that
3849 checks for instance variables in the same class has already been
3850 performed (this is the case for ObjC++) and only the instance
3851 variables of superclasses are checked. */
3852 bool
3853 objc_detect_field_duplicates (bool check_superclasses_only)
3855 if (!objc_collecting_ivars || !objc_interface_context
3856 || TREE_CODE (objc_interface_context) != CLASS_INTERFACE_TYPE)
3857 return false;
3859 /* We have two ways of doing this check:
3861 "direct comparison": we iterate over the instance variables and
3862 compare them directly. This works great for small numbers of
3863 instance variables (such as 10 or 20), which are extremely common.
3864 But it will potentially take forever for the pathological case with
3865 a huge number (eg, 10k) of instance variables.
3867 "hashtable": we use a hashtable, which requires a single sweep
3868 through the list of instances variables. This is much slower for a
3869 small number of variables, and we only use it for large numbers.
3871 To decide which one to use, we need to get an idea of how many
3872 instance variables we have to compare. */
3874 unsigned int number_of_ivars_to_check = 0;
3876 tree ivar;
3877 for (ivar = CLASS_RAW_IVARS (objc_interface_context);
3878 ivar; ivar = DECL_CHAIN (ivar))
3880 /* Ignore anonymous ivars. */
3881 if (DECL_NAME (ivar))
3882 number_of_ivars_to_check++;
3886 /* Exit if there is nothing to do. */
3887 if (number_of_ivars_to_check == 0)
3888 return true;
3890 /* In case that there are only 1 or 2 instance variables to check,
3891 we always use direct comparison. If there are more, it is
3892 worth iterating over the instance variables in the superclass
3893 to count how many there are (note that this has the same cost
3894 as checking 1 instance variable by direct comparison, which is
3895 why we skip this check in the case of 1 or 2 ivars and just do
3896 the direct comparison) and then decide if it worth using a
3897 hashtable. */
3898 if (number_of_ivars_to_check > 2)
3900 unsigned int number_of_superclass_ivars = 0;
3902 tree interface;
3903 for (interface = lookup_interface (CLASS_SUPER_NAME (objc_interface_context));
3904 interface; interface = lookup_interface (CLASS_SUPER_NAME (interface)))
3906 tree ivar;
3907 for (ivar = CLASS_RAW_IVARS (interface);
3908 ivar; ivar = DECL_CHAIN (ivar))
3909 number_of_superclass_ivars++;
3913 /* We use a hashtable if we have over 10k comparisons. */
3914 if (number_of_ivars_to_check * (number_of_superclass_ivars
3915 + (number_of_ivars_to_check / 2))
3916 > 10000)
3918 /* First, build the hashtable by putting all the instance
3919 variables of superclasses in it. */
3920 htab_t htab = htab_create (37, hash_instance_variable,
3921 eq_instance_variable, NULL);
3922 tree interface;
3923 for (interface = lookup_interface (CLASS_SUPER_NAME
3924 (objc_interface_context));
3925 interface; interface = lookup_interface
3926 (CLASS_SUPER_NAME (interface)))
3928 tree ivar;
3929 for (ivar = CLASS_RAW_IVARS (interface); ivar;
3930 ivar = DECL_CHAIN (ivar))
3932 if (DECL_NAME (ivar) != NULL_TREE)
3934 void **slot = htab_find_slot (htab, ivar, INSERT);
3935 /* Do not check for duplicate instance
3936 variables in superclasses. Errors have
3937 already been generated. */
3938 *slot = ivar;
3943 /* Now, we go through all the instance variables in the
3944 class, and check that they are not in the
3945 hashtable. */
3946 if (check_superclasses_only)
3948 tree ivar;
3949 for (ivar = CLASS_RAW_IVARS (objc_interface_context); ivar;
3950 ivar = DECL_CHAIN (ivar))
3952 if (DECL_NAME (ivar) != NULL_TREE)
3954 tree duplicate_ivar = (tree)(htab_find (htab, ivar));
3955 if (duplicate_ivar != HTAB_EMPTY_ENTRY)
3957 error_at (DECL_SOURCE_LOCATION (ivar),
3958 "duplicate instance variable %q+D",
3959 ivar);
3960 inform (DECL_SOURCE_LOCATION (duplicate_ivar),
3961 "previous declaration of %q+D",
3962 duplicate_ivar);
3963 /* FIXME: Do we need the following ? */
3964 /* DECL_NAME (ivar) = NULL_TREE; */
3969 else
3971 /* If we're checking for duplicates in the class as
3972 well, we insert variables in the hashtable as we
3973 check them, so if a duplicate follows, it will be
3974 caught. */
3975 tree ivar;
3976 for (ivar = CLASS_RAW_IVARS (objc_interface_context); ivar;
3977 ivar = DECL_CHAIN (ivar))
3979 if (DECL_NAME (ivar) != NULL_TREE)
3981 void **slot = htab_find_slot (htab, ivar, INSERT);
3982 if (*slot)
3984 tree duplicate_ivar = (tree)(*slot);
3985 error_at (DECL_SOURCE_LOCATION (ivar),
3986 "duplicate instance variable %q+D",
3987 ivar);
3988 inform (DECL_SOURCE_LOCATION (duplicate_ivar),
3989 "previous declaration of %q+D",
3990 duplicate_ivar);
3991 /* FIXME: Do we need the following ? */
3992 /* DECL_NAME (ivar) = NULL_TREE; */
3994 *slot = ivar;
3998 htab_delete (htab);
3999 return true;
4004 /* This is the "direct comparison" approach, which is used in most
4005 non-pathological cases. */
4007 /* Walk up to class hierarchy, starting with this class (this is
4008 the external loop, because lookup_interface() is expensive, and
4009 we want to do it few times). */
4010 tree interface = objc_interface_context;
4012 if (check_superclasses_only)
4013 interface = lookup_interface (CLASS_SUPER_NAME (interface));
4015 for ( ; interface; interface = lookup_interface
4016 (CLASS_SUPER_NAME (interface)))
4018 tree ivar_being_checked;
4020 for (ivar_being_checked = CLASS_RAW_IVARS (objc_interface_context);
4021 ivar_being_checked;
4022 ivar_being_checked = DECL_CHAIN (ivar_being_checked))
4024 tree decl;
4026 /* Ignore anonymous ivars. */
4027 if (DECL_NAME (ivar_being_checked) == NULL_TREE)
4028 continue;
4030 /* Note how we stop when we find the ivar we are checking
4031 (this can only happen in the main class, not
4032 superclasses), to avoid comparing things twice
4033 (otherwise, for each ivar, you'd compare A to B then B
4034 to A, and get duplicated error messages). */
4035 for (decl = CLASS_RAW_IVARS (interface);
4036 decl && decl != ivar_being_checked;
4037 decl = DECL_CHAIN (decl))
4039 if (DECL_NAME (ivar_being_checked) == DECL_NAME (decl))
4041 error_at (DECL_SOURCE_LOCATION (ivar_being_checked),
4042 "duplicate instance variable %q+D",
4043 ivar_being_checked);
4044 inform (DECL_SOURCE_LOCATION (decl),
4045 "previous declaration of %q+D",
4046 decl);
4047 /* FIXME: Do we need the following ? */
4048 /* DECL_NAME (ivar_being_checked) = NULL_TREE; */
4054 return true;
4057 /* Used by: build_private_template, continue_class,
4058 and for @defs constructs. */
4060 static tree
4061 get_class_ivars (tree interface, bool inherited)
4063 tree ivar_chain = copy_list (CLASS_RAW_IVARS (interface));
4065 /* Both CLASS_RAW_IVARS and CLASS_IVARS contain a list of ivars declared
4066 by the current class (i.e., they do not include super-class ivars).
4067 However, the CLASS_IVARS list will be side-effected by a call to
4068 finish_struct(), which will fill in field offsets. */
4069 if (!CLASS_IVARS (interface))
4070 CLASS_IVARS (interface) = ivar_chain;
4072 if (!inherited)
4073 return ivar_chain;
4075 while (CLASS_SUPER_NAME (interface))
4077 /* Prepend super-class ivars. */
4078 interface = lookup_interface (CLASS_SUPER_NAME (interface));
4079 ivar_chain = chainon (copy_list (CLASS_RAW_IVARS (interface)),
4080 ivar_chain);
4083 return ivar_chain;
4086 void
4087 objc_maybe_warn_exceptions (location_t loc)
4089 /* -fobjc-exceptions is required to enable Objective-C exceptions.
4090 For example, on Darwin, ObjC exceptions require a sufficiently
4091 recent version of the runtime, so the user must ask for them
4092 explicitly. On other platforms, at the moment -fobjc-exceptions
4093 triggers -fexceptions which again is required for exceptions to
4094 work. */
4095 if (!flag_objc_exceptions)
4097 /* Warn only once per compilation unit. */
4098 static bool warned = false;
4100 if (!warned)
4102 error_at (loc, "%<-fobjc-exceptions%> is required to enable Objective-C exception syntax");
4103 warned = true;
4108 static struct objc_try_context *cur_try_context;
4110 /* Called just after parsing the @try and its associated BODY. We now
4111 must prepare for the tricky bits -- handling the catches and finally. */
4113 void
4114 objc_begin_try_stmt (location_t try_locus, tree body)
4116 struct objc_try_context *c = XCNEW (struct objc_try_context);
4117 c->outer = cur_try_context;
4118 c->try_body = body;
4119 c->try_locus = try_locus;
4120 c->end_try_locus = input_location;
4121 cur_try_context = c;
4123 /* Collect the list of local variables. We'll mark them as volatile
4124 at the end of compilation of this function to prevent them being
4125 clobbered by setjmp/longjmp. */
4126 if (flag_objc_sjlj_exceptions)
4127 objc_mark_locals_volatile (NULL);
4130 /* Called just after parsing "@catch (parm)". Open a binding level,
4131 enter DECL into the binding level, and initialize it. Leave the
4132 binding level open while the body of the compound statement is
4133 parsed. If DECL is NULL_TREE, then we are compiling "@catch(...)"
4134 which we compile as "@catch(id tmp_variable)". */
4136 void
4137 objc_begin_catch_clause (tree decl)
4139 tree compound, type, t;
4140 bool ellipsis = false;
4142 /* Begin a new scope that the entire catch clause will live in. */
4143 compound = c_begin_compound_stmt (true);
4145 /* Create the appropriate declaration for the argument. */
4146 if (decl == error_mark_node)
4147 type = error_mark_node;
4148 else
4150 if (decl == NULL_TREE)
4152 /* If @catch(...) was specified, create a temporary variable of
4153 type 'id' and use it. */
4154 decl = objc_create_temporary_var (objc_object_type, "__objc_generic_catch_var");
4155 DECL_SOURCE_LOCATION (decl) = input_location;
4156 /* ... but allow the runtime to differentiate between ellipsis and the
4157 case of @catch (id xyz). */
4158 ellipsis = true;
4160 else
4162 /* The parser passed in a PARM_DECL, but what we really want is a VAR_DECL. */
4163 decl = build_decl (input_location,
4164 VAR_DECL, DECL_NAME (decl), TREE_TYPE (decl));
4166 lang_hooks.decls.pushdecl (decl);
4168 /* Mark the declaration as used so you never any warnings whether
4169 you use the exception argument or not. TODO: Implement a
4170 -Wunused-exception-parameter flag, which would cause warnings
4171 if exception parameter is not used. */
4172 TREE_USED (decl) = 1;
4173 DECL_READ_P (decl) = 1;
4175 type = TREE_TYPE (decl);
4178 /* Verify that the type of the catch is valid. It must be a pointer
4179 to an Objective-C class, or "id" (which is catch-all). */
4180 if (type == error_mark_node)
4182 ;/* Just keep going. */
4184 else if (!objc_type_valid_for_messaging (type, false))
4186 error ("@catch parameter is not a known Objective-C class type");
4187 type = error_mark_node;
4189 else if (TYPE_HAS_OBJC_INFO (TREE_TYPE (type))
4190 && TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (type)))
4192 error ("@catch parameter can not be protocol-qualified");
4193 type = error_mark_node;
4195 else if (POINTER_TYPE_P (type) && objc_is_object_id (TREE_TYPE (type)))
4196 /* @catch (id xyz) or @catch (...) but we note this for runtimes that
4197 identify 'id'. */
4199 else
4201 /* If 'type' was built using typedefs, we need to get rid of
4202 them and get a simple pointer to the class. */
4203 bool is_typedef = false;
4204 tree x = TYPE_MAIN_VARIANT (type);
4206 /* Skip from the pointer to the pointee. */
4207 if (TREE_CODE (x) == POINTER_TYPE)
4208 x = TREE_TYPE (x);
4210 /* Traverse typedef aliases */
4211 while (TREE_CODE (x) == RECORD_TYPE && OBJC_TYPE_NAME (x)
4212 && TREE_CODE (OBJC_TYPE_NAME (x)) == TYPE_DECL
4213 && DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (x)))
4215 is_typedef = true;
4216 x = DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (x));
4219 /* If it was a typedef, build a pointer to the final, original
4220 class. */
4221 if (is_typedef)
4222 type = build_pointer_type (x);
4224 if (cur_try_context->catch_list)
4226 /* Examine previous @catch clauses and see if we've already
4227 caught the type in question. */
4228 tree_stmt_iterator i = tsi_start (cur_try_context->catch_list);
4229 for (; !tsi_end_p (i); tsi_next (&i))
4231 tree stmt = tsi_stmt (i);
4232 t = CATCH_TYPES (stmt);
4233 if (t == error_mark_node)
4234 continue;
4235 if (!t || DERIVED_FROM_P (TREE_TYPE (t), TREE_TYPE (type)))
4237 warning (0, "exception of type %<%T%> will be caught",
4238 TREE_TYPE (type));
4239 warning_at (EXPR_LOCATION (stmt), 0, " by earlier handler for %<%T%>",
4240 TREE_TYPE (t ? t : objc_object_type));
4241 break;
4247 t = (*runtime.begin_catch) (&cur_try_context, type, decl, compound, ellipsis);
4248 add_stmt (t);
4251 /* Called just after parsing the closing brace of a @catch clause. Close
4252 the open binding level, and record a CATCH_EXPR for it. */
4254 void
4255 objc_finish_catch_clause (void)
4257 tree c = cur_try_context->current_catch;
4258 cur_try_context->current_catch = NULL;
4259 cur_try_context->end_catch_locus = input_location;
4261 CATCH_BODY (c) = c_end_compound_stmt (input_location, CATCH_BODY (c), 1);
4263 (*runtime.finish_catch) (&cur_try_context, c);
4266 /* Called after parsing a @finally clause and its associated BODY.
4267 Record the body for later placement. */
4269 void
4270 objc_build_finally_clause (location_t finally_locus, tree body)
4272 cur_try_context->finally_body = body;
4273 cur_try_context->finally_locus = finally_locus;
4274 cur_try_context->end_finally_locus = input_location;
4277 /* Called to finalize a @try construct. */
4279 tree
4280 objc_finish_try_stmt (void)
4282 struct objc_try_context *c = cur_try_context;
4283 tree stmt;
4285 if (c->catch_list == NULL && c->finally_body == NULL)
4286 error ("%<@try%> without %<@catch%> or %<@finally%>");
4288 stmt = (*runtime.finish_try_stmt) (&cur_try_context);
4289 add_stmt (stmt);
4291 cur_try_context = c->outer;
4292 free (c);
4293 return stmt;
4296 tree
4297 objc_build_throw_stmt (location_t loc, tree throw_expr)
4299 bool rethrown = false;
4301 objc_maybe_warn_exceptions (loc);
4303 /* Don't waste time trying to build something if we're already dead. */
4304 if (throw_expr == error_mark_node)
4305 return error_mark_node;
4307 if (throw_expr == NULL)
4309 /* If we're not inside a @catch block, there is no "current
4310 exception" to be rethrown. */
4311 if (cur_try_context == NULL
4312 || cur_try_context->current_catch == NULL)
4314 error_at (loc, "%<@throw%> (rethrow) used outside of a @catch block");
4315 return error_mark_node;
4318 /* Otherwise the object is still sitting in the EXC_PTR_EXPR
4319 value that we get from the runtime. */
4320 throw_expr = (*runtime.build_exc_ptr) (&cur_try_context);
4321 rethrown = true;
4323 else
4325 if (!objc_type_valid_for_messaging (TREE_TYPE (throw_expr), true))
4327 error_at (loc, "%<@throw%> argument is not an object");
4328 return error_mark_node;
4332 return (*runtime.build_throw_stmt) (loc, throw_expr, rethrown);
4335 tree
4336 objc_build_synchronized (location_t start_locus, tree object_expr, tree body)
4338 /* object_expr should never be NULL; but in case it is, convert it to
4339 error_mark_node. */
4340 if (object_expr == NULL)
4341 object_expr = error_mark_node;
4343 /* Validate object_expr. If not valid, set it to error_mark_node. */
4344 if (object_expr != error_mark_node)
4346 if (!objc_type_valid_for_messaging (TREE_TYPE (object_expr), true))
4348 error_at (start_locus, "%<@synchronized%> argument is not an object");
4349 object_expr = error_mark_node;
4353 if (object_expr == error_mark_node)
4355 /* If we found an error, we simply ignore the '@synchronized'.
4356 Compile the body so we can keep going with minimal
4357 casualties. */
4358 return add_stmt (body);
4360 else
4362 tree call;
4363 tree args;
4365 /* objc_sync_enter (object_expr); */
4366 object_expr = save_expr (object_expr);
4367 args = tree_cons (NULL, object_expr, NULL);
4368 call = build_function_call (input_location,
4369 objc_sync_enter_decl, args);
4370 SET_EXPR_LOCATION (call, start_locus);
4371 add_stmt (call);
4373 /* Build "objc_sync_exit (object_expr);" but do not add it yet;
4374 it goes inside the @finalize() clause. */
4375 args = tree_cons (NULL, object_expr, NULL);
4376 call = build_function_call (input_location,
4377 objc_sync_exit_decl, args);
4378 SET_EXPR_LOCATION (call, input_location);
4380 /* @try { body; } */
4381 objc_begin_try_stmt (start_locus, body);
4383 /* @finally { objc_sync_exit (object_expr); } */
4384 objc_build_finally_clause (input_location, call);
4386 /* End of try statement. */
4387 return objc_finish_try_stmt ();
4391 /* Construct a C struct corresponding to ObjC class CLASS, with the same
4392 name as the class:
4394 struct <classname> {
4395 struct _objc_class *isa;
4397 }; */
4399 static void
4400 build_private_template (tree klass)
4402 if (!CLASS_STATIC_TEMPLATE (klass))
4404 tree record = objc_build_struct (klass,
4405 get_class_ivars (klass, false),
4406 CLASS_SUPER_NAME (klass));
4408 /* Set the TREE_USED bit for this struct, so that stab generator
4409 can emit stabs for this struct type. */
4410 if (flag_debug_only_used_symbols && TYPE_STUB_DECL (record))
4411 TREE_USED (TYPE_STUB_DECL (record)) = 1;
4413 /* Copy the attributes from the class to the type. */
4414 if (TREE_DEPRECATED (klass))
4415 TREE_DEPRECATED (record) = 1;
4419 /* Generate either '- .cxx_construct' or '- .cxx_destruct' for the
4420 current class. */
4421 #ifdef OBJCPLUS
4422 static void
4423 objc_generate_cxx_ctor_or_dtor (bool dtor)
4425 tree fn, body, compound_stmt, ivar;
4427 /* - (id) .cxx_construct { ... return self; } */
4428 /* - (void) .cxx_construct { ... } */
4430 objc_start_method_definition
4431 (false /* is_class_method */,
4432 objc_build_method_signature (false /* is_class_method */,
4433 build_tree_list (NULL_TREE,
4434 dtor
4435 ? void_type_node
4436 : objc_object_type),
4437 get_identifier (dtor
4438 ? TAG_CXX_DESTRUCT
4439 : TAG_CXX_CONSTRUCT),
4440 make_node (TREE_LIST),
4441 false), NULL, NULL_TREE);
4442 body = begin_function_body ();
4443 compound_stmt = begin_compound_stmt (0);
4445 ivar = CLASS_IVARS (implementation_template);
4446 /* Destroy ivars in reverse order. */
4447 if (dtor)
4448 ivar = nreverse (copy_list (ivar));
4450 for (; ivar; ivar = TREE_CHAIN (ivar))
4452 if (TREE_CODE (ivar) == FIELD_DECL)
4454 tree type = TREE_TYPE (ivar);
4456 /* Call the ivar's default constructor or destructor. Do not
4457 call the destructor unless a corresponding constructor call
4458 has also been made (or is not needed). */
4459 if (MAYBE_CLASS_TYPE_P (type)
4460 && (dtor
4461 ? (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
4462 && (!TYPE_NEEDS_CONSTRUCTING (type)
4463 || TYPE_HAS_DEFAULT_CONSTRUCTOR (type)))
4464 : (TYPE_NEEDS_CONSTRUCTING (type)
4465 && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))))
4466 finish_expr_stmt
4467 (build_special_member_call
4468 (build_ivar_reference (DECL_NAME (ivar)),
4469 dtor ? complete_dtor_identifier : complete_ctor_identifier,
4470 NULL, type, LOOKUP_NORMAL, tf_warning_or_error));
4474 /* The constructor returns 'self'. */
4475 if (!dtor)
4476 finish_return_stmt (self_decl);
4478 finish_compound_stmt (compound_stmt);
4479 finish_function_body (body);
4480 fn = current_function_decl;
4481 finish_function ();
4482 objc_finish_method_definition (fn);
4485 /* The following routine will examine the current @interface for any
4486 non-POD C++ ivars requiring non-trivial construction and/or
4487 destruction, and then synthesize special '- .cxx_construct' and/or
4488 '- .cxx_destruct' methods which will run the appropriate
4489 construction or destruction code. Note that ivars inherited from
4490 super-classes are _not_ considered. */
4491 static void
4492 objc_generate_cxx_cdtors (void)
4494 bool need_ctor = false, need_dtor = false;
4495 tree ivar;
4497 /* Error case, due to possibly an extra @end. */
4498 if (!objc_implementation_context)
4499 return;
4501 /* We do not want to do this for categories, since they do not have
4502 their own ivars. */
4504 if (TREE_CODE (objc_implementation_context) != CLASS_IMPLEMENTATION_TYPE)
4505 return;
4507 /* First, determine if we even need a constructor and/or destructor. */
4509 for (ivar = CLASS_IVARS (implementation_template); ivar;
4510 ivar = TREE_CHAIN (ivar))
4512 if (TREE_CODE (ivar) == FIELD_DECL)
4514 tree type = TREE_TYPE (ivar);
4516 if (MAYBE_CLASS_TYPE_P (type))
4518 if (TYPE_NEEDS_CONSTRUCTING (type)
4519 && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
4520 /* NB: If a default constructor is not available, we will not
4521 be able to initialize this ivar; the add_instance_variable()
4522 routine will already have warned about this. */
4523 need_ctor = true;
4525 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
4526 && (!TYPE_NEEDS_CONSTRUCTING (type)
4527 || TYPE_HAS_DEFAULT_CONSTRUCTOR (type)))
4528 /* NB: If a default constructor is not available, we will not
4529 call the destructor either, for symmetry. */
4530 need_dtor = true;
4535 /* Generate '- .cxx_construct' if needed. */
4537 if (need_ctor)
4538 objc_generate_cxx_ctor_or_dtor (false);
4540 /* Generate '- .cxx_destruct' if needed. */
4542 if (need_dtor)
4543 objc_generate_cxx_ctor_or_dtor (true);
4545 /* The 'imp_list' variable points at an imp_entry record for the current
4546 @implementation. Record the existence of '- .cxx_construct' and/or
4547 '- .cxx_destruct' methods therein; it will be included in the
4548 metadata for the class if the runtime needs it. */
4549 imp_list->has_cxx_cdtors = (need_ctor || need_dtor);
4551 #endif
4553 static void
4554 error_with_ivar (const char *message, tree decl)
4556 error_at (DECL_SOURCE_LOCATION (decl), "%s %qs",
4557 message, identifier_to_locale (gen_declaration (decl)));
4561 static void
4562 check_ivars (tree inter, tree imp)
4564 tree intdecls = CLASS_RAW_IVARS (inter);
4565 tree impdecls = CLASS_RAW_IVARS (imp);
4567 while (1)
4569 tree t1, t2;
4571 #ifdef OBJCPLUS
4572 if (intdecls && TREE_CODE (intdecls) == TYPE_DECL)
4573 intdecls = TREE_CHAIN (intdecls);
4574 #endif
4575 if (intdecls == 0 && impdecls == 0)
4576 break;
4577 if (intdecls == 0 || impdecls == 0)
4579 error ("inconsistent instance variable specification");
4580 break;
4583 t1 = TREE_TYPE (intdecls); t2 = TREE_TYPE (impdecls);
4585 if (!comptypes (t1, t2)
4586 || !tree_int_cst_equal (DECL_INITIAL (intdecls),
4587 DECL_INITIAL (impdecls)))
4589 if (DECL_NAME (intdecls) == DECL_NAME (impdecls))
4591 error_with_ivar ("conflicting instance variable type",
4592 impdecls);
4593 error_with_ivar ("previous declaration of",
4594 intdecls);
4596 else /* both the type and the name don't match */
4598 error ("inconsistent instance variable specification");
4599 break;
4603 else if (DECL_NAME (intdecls) != DECL_NAME (impdecls))
4605 error_with_ivar ("conflicting instance variable name",
4606 impdecls);
4607 error_with_ivar ("previous declaration of",
4608 intdecls);
4611 intdecls = DECL_CHAIN (intdecls);
4612 impdecls = DECL_CHAIN (impdecls);
4617 static void
4618 mark_referenced_methods (void)
4620 struct imp_entry *impent;
4621 tree chain;
4623 for (impent = imp_list; impent; impent = impent->next)
4625 chain = CLASS_CLS_METHODS (impent->imp_context);
4626 while (chain)
4628 cgraph_mark_force_output_node (
4629 cgraph_get_create_node (METHOD_DEFINITION (chain)));
4630 chain = DECL_CHAIN (chain);
4633 chain = CLASS_NST_METHODS (impent->imp_context);
4634 while (chain)
4636 cgraph_mark_force_output_node (
4637 cgraph_get_create_node (METHOD_DEFINITION (chain)));
4638 chain = DECL_CHAIN (chain);
4643 /* If type is empty or only type qualifiers are present, add default
4644 type of id (otherwise grokdeclarator will default to int). */
4645 static inline tree
4646 adjust_type_for_id_default (tree type)
4648 if (!type)
4649 type = make_node (TREE_LIST);
4651 if (!TREE_VALUE (type))
4652 TREE_VALUE (type) = objc_object_type;
4653 else if (TREE_CODE (TREE_VALUE (type)) == RECORD_TYPE
4654 && TYPED_OBJECT (TREE_VALUE (type)))
4655 error ("can not use an object as parameter to a method");
4657 return type;
4660 /* Return a KEYWORD_DECL built using the specified key_name, arg_type,
4661 arg_name and attributes. (TODO: Rename KEYWORD_DECL to
4662 OBJC_METHOD_PARM_DECL ?)
4664 A KEYWORD_DECL is a tree representing the declaration of a
4665 parameter of an Objective-C method. It is produced when parsing a
4666 fragment of Objective-C method declaration of the form
4668 keyworddecl:
4669 selector ':' '(' typename ')' identifier
4671 For example, take the Objective-C method
4673 -(NSString *)pathForResource:(NSString *)resource ofType:(NSString *)type;
4675 the two fragments "pathForResource:(NSString *)resource" and
4676 "ofType:(NSString *)type" will generate a KEYWORD_DECL each. The
4677 KEYWORD_DECL stores the 'key_name' (eg, identifier for
4678 "pathForResource"), the 'arg_type' (eg, tree representing a
4679 NSString *), the 'arg_name' (eg identifier for "resource") and
4680 potentially some attributes (for example, a tree representing
4681 __attribute__ ((unused)) if such an attribute was attached to a
4682 certain parameter). You can access this information using the
4683 TREE_TYPE (for arg_type), KEYWORD_ARG_NAME (for arg_name),
4684 KEYWORD_KEY_NAME (for key_name), DECL_ATTRIBUTES (for attributes).
4686 'key_name' is an identifier node (and is optional as you can omit
4687 it in Objective-C methods).
4688 'arg_type' is a tree list (and is optional too if no parameter type
4689 was specified).
4690 'arg_name' is an identifier node and is required.
4691 'attributes' is an optional tree containing parameter attributes. */
4692 tree
4693 objc_build_keyword_decl (tree key_name, tree arg_type,
4694 tree arg_name, tree attributes)
4696 tree keyword_decl;
4698 if (flag_objc1_only && attributes)
4699 error_at (input_location, "method argument attributes are not available in Objective-C 1.0");
4701 /* If no type is specified, default to "id". */
4702 arg_type = adjust_type_for_id_default (arg_type);
4704 keyword_decl = make_node (KEYWORD_DECL);
4706 TREE_TYPE (keyword_decl) = arg_type;
4707 KEYWORD_ARG_NAME (keyword_decl) = arg_name;
4708 KEYWORD_KEY_NAME (keyword_decl) = key_name;
4709 DECL_ATTRIBUTES (keyword_decl) = attributes;
4711 return keyword_decl;
4714 /* Given a chain of keyword_decl's, synthesize the full keyword selector. */
4715 static tree
4716 build_keyword_selector (tree selector)
4718 int len = 0;
4719 tree key_chain, key_name;
4720 char *buf;
4722 /* Scan the selector to see how much space we'll need. */
4723 for (key_chain = selector; key_chain; key_chain = TREE_CHAIN (key_chain))
4725 switch (TREE_CODE (selector))
4727 case KEYWORD_DECL:
4728 key_name = KEYWORD_KEY_NAME (key_chain);
4729 break;
4730 case TREE_LIST:
4731 key_name = TREE_PURPOSE (key_chain);
4732 break;
4733 default:
4734 gcc_unreachable ();
4737 if (key_name)
4738 len += IDENTIFIER_LENGTH (key_name) + 1;
4739 else
4740 /* Just a ':' arg. */
4741 len++;
4744 buf = (char *) alloca (len + 1);
4745 /* Start the buffer out as an empty string. */
4746 buf[0] = '\0';
4748 for (key_chain = selector; key_chain; key_chain = TREE_CHAIN (key_chain))
4750 switch (TREE_CODE (selector))
4752 case KEYWORD_DECL:
4753 key_name = KEYWORD_KEY_NAME (key_chain);
4754 break;
4755 case TREE_LIST:
4756 key_name = TREE_PURPOSE (key_chain);
4757 /* The keyword decl chain will later be used as a function
4758 argument chain. Unhook the selector itself so as to not
4759 confuse other parts of the compiler. */
4760 TREE_PURPOSE (key_chain) = NULL_TREE;
4761 break;
4762 default:
4763 gcc_unreachable ();
4766 if (key_name)
4767 strcat (buf, IDENTIFIER_POINTER (key_name));
4768 strcat (buf, ":");
4771 return get_identifier_with_length (buf, len);
4774 /* Used for declarations and definitions. */
4776 static tree
4777 build_method_decl (enum tree_code code, tree ret_type, tree selector,
4778 tree add_args, bool ellipsis)
4780 tree method_decl;
4782 /* If no type is specified, default to "id". */
4783 ret_type = adjust_type_for_id_default (ret_type);
4785 /* Note how a method_decl has a TREE_TYPE which is not the function
4786 type of the function implementing the method, but only the return
4787 type of the method. We may want to change this, and store the
4788 entire function type in there (eg, it may be used to simplify
4789 dealing with attributes below). */
4790 method_decl = make_node (code);
4791 TREE_TYPE (method_decl) = ret_type;
4793 /* If we have a keyword selector, create an identifier_node that
4794 represents the full selector name (`:' included)... */
4795 if (TREE_CODE (selector) == KEYWORD_DECL)
4797 METHOD_SEL_NAME (method_decl) = build_keyword_selector (selector);
4798 METHOD_SEL_ARGS (method_decl) = selector;
4799 METHOD_ADD_ARGS (method_decl) = add_args;
4800 METHOD_ADD_ARGS_ELLIPSIS_P (method_decl) = ellipsis;
4802 else
4804 METHOD_SEL_NAME (method_decl) = selector;
4805 METHOD_SEL_ARGS (method_decl) = NULL_TREE;
4806 METHOD_ADD_ARGS (method_decl) = NULL_TREE;
4809 return method_decl;
4812 /* This routine processes objective-c method attributes. */
4814 static void
4815 objc_decl_method_attributes (tree *node, tree attributes, int flags)
4817 /* TODO: Replace the hackery below. An idea would be to store the
4818 full function type in the method declaration (for example in
4819 TREE_TYPE) and then expose ObjC method declarations to c-family
4820 and they could deal with them by simply treating them as
4821 functions. */
4823 /* Because of the dangers in the hackery below, we filter out any
4824 attribute that we do not know about. For the ones we know about,
4825 we know that they work with the hackery. For the other ones,
4826 there is no guarantee, so we have to filter them out. */
4827 tree filtered_attributes = NULL_TREE;
4829 if (attributes)
4831 tree attribute;
4832 for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
4834 tree name = TREE_PURPOSE (attribute);
4836 if (is_attribute_p ("deprecated", name)
4837 || is_attribute_p ("sentinel", name)
4838 || is_attribute_p ("noreturn", name))
4840 /* An attribute that we support; add it to the filtered
4841 attributes. */
4842 filtered_attributes = chainon (filtered_attributes,
4843 copy_node (attribute));
4845 else if (is_attribute_p ("format", name))
4847 /* "format" is special because before adding it to the
4848 filtered attributes we need to adjust the specified
4849 format by adding the hidden function parameters for
4850 an Objective-C method (self, _cmd). */
4851 tree new_attribute = copy_node (attribute);
4853 /* Check the arguments specified with the attribute, and
4854 modify them adding 2 for the two hidden arguments.
4855 Note how this differs from C++; according to the
4856 specs, C++ does not do it so you have to add the +1
4857 yourself. For Objective-C, instead, the compiler
4858 adds the +2 for you. */
4860 /* The attribute arguments have not been checked yet, so
4861 we need to be careful as they could be missing or
4862 invalid. If anything looks wrong, we skip the
4863 process and the compiler will complain about it later
4864 when it validates the attribute. */
4865 /* Check that we have at least three arguments. */
4866 if (TREE_VALUE (new_attribute)
4867 && TREE_CHAIN (TREE_VALUE (new_attribute))
4868 && TREE_CHAIN (TREE_CHAIN (TREE_VALUE (new_attribute))))
4870 tree second_argument = TREE_CHAIN (TREE_VALUE (new_attribute));
4871 tree third_argument = TREE_CHAIN (second_argument);
4872 tree number;
4874 /* This is the second argument, the "string-index",
4875 which specifies the index of the format string
4876 argument. Add 2. */
4877 number = TREE_VALUE (second_argument);
4878 if (number
4879 && TREE_CODE (number) == INTEGER_CST
4880 && TREE_INT_CST_HIGH (number) == 0)
4882 TREE_VALUE (second_argument)
4883 = build_int_cst (integer_type_node,
4884 TREE_INT_CST_LOW (number) + 2);
4887 /* This is the third argument, the "first-to-check",
4888 which specifies the index of the first argument to
4889 check. This could be 0, meaning it is not available,
4890 in which case we don't need to add 2. Add 2 if not
4891 0. */
4892 number = TREE_VALUE (third_argument);
4893 if (number
4894 && TREE_CODE (number) == INTEGER_CST
4895 && TREE_INT_CST_HIGH (number) == 0
4896 && TREE_INT_CST_LOW (number) != 0)
4898 TREE_VALUE (third_argument)
4899 = build_int_cst (integer_type_node,
4900 TREE_INT_CST_LOW (number) + 2);
4903 filtered_attributes = chainon (filtered_attributes,
4904 new_attribute);
4906 else if (is_attribute_p ("nonnull", name))
4908 /* We need to fixup all the argument indexes by adding 2
4909 for the two hidden arguments of an Objective-C method
4910 invocation, similat to what we do above for the
4911 "format" attribute. */
4912 /* FIXME: This works great in terms of implementing the
4913 functionality, but the warnings that are produced by
4914 nonnull do mention the argument index (while the
4915 format ones don't). For example, you could get
4916 "warning: null argument where non-null required
4917 (argument 3)". Now in that message, "argument 3"
4918 includes the 2 hidden arguments; it would be much
4919 more friendly to call it "argument 1", as that would
4920 be consistent with __attribute__ ((nonnnull (1))).
4921 To do this, we'd need to have the C family code that
4922 checks the arguments know about adding/removing 2 to
4923 the argument index ... or alternatively we could
4924 maybe store the "printable" argument index in
4925 addition to the actual argument index ? Some
4926 refactoring is needed to do this elegantly. */
4927 tree new_attribute = copy_node (attribute);
4928 tree argument = TREE_VALUE (attribute);
4929 while (argument != NULL_TREE)
4931 /* Get the value of the argument and add 2. */
4932 tree number = TREE_VALUE (argument);
4933 if (number
4934 && TREE_CODE (number) == INTEGER_CST
4935 && TREE_INT_CST_HIGH (number) == 0
4936 && TREE_INT_CST_LOW (number) != 0)
4938 TREE_VALUE (argument)
4939 = build_int_cst (integer_type_node,
4940 TREE_INT_CST_LOW (number) + 2);
4942 argument = TREE_CHAIN (argument);
4945 filtered_attributes = chainon (filtered_attributes,
4946 new_attribute);
4948 else
4949 warning (OPT_Wattributes, "%qE attribute directive ignored", name);
4953 if (filtered_attributes)
4955 /* This hackery changes the TREE_TYPE of the ObjC method
4956 declaration to be a function type, so that decl_attributes
4957 will treat the ObjC method as if it was a function. Some
4958 attributes (sentinel, format) will be applied to the function
4959 type, changing it in place; so after calling decl_attributes,
4960 we extract the function type attributes and store them in
4961 METHOD_TYPE_ATTRIBUTES. Some other attributes (noreturn,
4962 deprecated) are applied directly to the method declaration
4963 (by setting TREE_DEPRECATED and TREE_THIS_VOLATILE) so there
4964 is nothing to do. */
4965 tree saved_type = TREE_TYPE (*node);
4966 TREE_TYPE (*node)
4967 = build_function_type_for_method (TREE_VALUE (saved_type), *node,
4968 METHOD_REF, 0);
4969 decl_attributes (node, filtered_attributes, flags);
4970 METHOD_TYPE_ATTRIBUTES (*node) = TYPE_ATTRIBUTES (TREE_TYPE (*node));
4971 TREE_TYPE (*node) = saved_type;
4975 bool
4976 objc_method_decl (enum tree_code opcode)
4978 return opcode == INSTANCE_METHOD_DECL || opcode == CLASS_METHOD_DECL;
4981 /* Return a function type for METHOD with RETURN_TYPE. CONTEXT is
4982 either METHOD_DEF or METHOD_REF, indicating whether we are defining a
4983 method or calling one. SUPER_FLAG indicates whether this is a send
4984 to super; this makes a difference for the NeXT calling sequence in
4985 which the lookup and the method call are done together. If METHOD is
4986 NULL, user-defined arguments (i.e., beyond self and _cmd) shall be
4987 represented as varargs. */
4989 tree
4990 build_function_type_for_method (tree return_type, tree method,
4991 int context, bool super_flag)
4993 VEC(tree,gc) *argtypes = make_tree_vector ();
4994 tree t, ftype;
4995 bool is_varargs = false;
4997 (*runtime.get_arg_type_list_base) (&argtypes, method, context, super_flag);
4999 /* No actual method prototype given; remaining args passed as varargs. */
5000 if (method == NULL_TREE)
5002 is_varargs = true;
5003 goto build_ftype;
5006 for (t = METHOD_SEL_ARGS (method); t; t = DECL_CHAIN (t))
5008 tree arg_type = TREE_VALUE (TREE_TYPE (t));
5010 /* Decay argument types for the underlying C function as
5011 appropriate. */
5012 arg_type = objc_decay_parm_type (arg_type);
5014 VEC_safe_push (tree, gc, argtypes, arg_type);
5017 if (METHOD_ADD_ARGS (method))
5019 for (t = TREE_CHAIN (METHOD_ADD_ARGS (method));
5020 t; t = TREE_CHAIN (t))
5022 tree arg_type = TREE_TYPE (TREE_VALUE (t));
5024 arg_type = objc_decay_parm_type (arg_type);
5026 VEC_safe_push (tree, gc, argtypes, arg_type);
5029 if (METHOD_ADD_ARGS_ELLIPSIS_P (method))
5030 is_varargs = true;
5033 build_ftype:
5034 if (is_varargs)
5035 ftype = build_varargs_function_type_vec (return_type, argtypes);
5036 else
5037 ftype = build_function_type_vec (return_type, argtypes);
5039 release_tree_vector (argtypes);
5040 return ftype;
5043 /* The 'method' argument is a tree; this tree could either be a single
5044 method, which is returned, or could be a TREE_VEC containing a list
5045 of methods. In that case, the first one is returned, and warnings
5046 are issued as appropriate. */
5047 static tree
5048 check_duplicates (tree method, int methods, int is_class)
5050 tree first_method;
5051 size_t i;
5053 if (method == NULL_TREE)
5054 return NULL_TREE;
5056 if (TREE_CODE (method) != TREE_VEC)
5057 return method;
5059 /* We have two or more methods with the same name but different
5060 types. */
5061 first_method = TREE_VEC_ELT (method, 0);
5063 /* But just how different are those types? If
5064 -Wno-strict-selector-match is specified, we shall not complain if
5065 the differences are solely among types with identical size and
5066 alignment. */
5067 if (!warn_strict_selector_match)
5069 for (i = 0; i < (size_t) TREE_VEC_LENGTH (method); i++)
5070 if (!comp_proto_with_proto (first_method, TREE_VEC_ELT (method, i), 0))
5071 goto issue_warning;
5073 return first_method;
5076 issue_warning:
5077 if (methods)
5079 bool type = TREE_CODE (first_method) == INSTANCE_METHOD_DECL;
5081 warning_at (input_location, 0,
5082 "multiple methods named %<%c%E%> found",
5083 (is_class ? '+' : '-'),
5084 METHOD_SEL_NAME (first_method));
5085 inform (DECL_SOURCE_LOCATION (first_method), "using %<%c%s%>",
5086 (type ? '-' : '+'),
5087 identifier_to_locale (gen_method_decl (first_method)));
5089 else
5091 bool type = TREE_CODE (first_method) == INSTANCE_METHOD_DECL;
5093 warning_at (input_location, 0,
5094 "multiple selectors named %<%c%E%> found",
5095 (is_class ? '+' : '-'),
5096 METHOD_SEL_NAME (first_method));
5097 inform (DECL_SOURCE_LOCATION (first_method), "found %<%c%s%>",
5098 (type ? '-' : '+'),
5099 identifier_to_locale (gen_method_decl (first_method)));
5102 for (i = 0; i < (size_t) TREE_VEC_LENGTH (method); i++)
5104 bool type = TREE_CODE (TREE_VEC_ELT (method, i)) == INSTANCE_METHOD_DECL;
5106 inform (DECL_SOURCE_LOCATION (TREE_VEC_ELT (method, i)), "also found %<%c%s%>",
5107 (type ? '-' : '+'),
5108 identifier_to_locale (gen_method_decl (TREE_VEC_ELT (method, i))));
5111 return first_method;
5114 /* If RECEIVER is a class reference, return the identifier node for
5115 the referenced class. RECEIVER is created by objc_get_class_reference,
5116 so we check the exact form created depending on which runtimes are
5117 used. */
5119 static tree
5120 receiver_is_class_object (tree receiver, int self, int super)
5122 tree exp, arg;
5124 /* The receiver is 'self' or 'super' in the context of a class method. */
5125 if (objc_method_context
5126 && TREE_CODE (objc_method_context) == CLASS_METHOD_DECL
5127 && (self || super))
5128 return (super
5129 ? CLASS_SUPER_NAME (implementation_template)
5130 : CLASS_NAME (implementation_template));
5132 /* The runtime might encapsulate things its own way. */
5133 exp = (*runtime.receiver_is_class_object) (receiver);
5134 if (exp)
5135 return exp;
5137 /* The receiver is a function call that returns an id. Check if
5138 it is a call to objc_getClass, if so, pick up the class name.
5140 This is required by the GNU runtime, which compiles
5142 [NSObject alloc]
5144 into
5146 [objc_get_class ("NSObject") alloc];
5148 and then, to check that the receiver responds to the +alloc
5149 method, needs to be able to determine that the objc_get_class()
5150 call returns the NSObject class and not just a generic Class
5151 pointer.
5153 But, traditionally this is enabled for all runtimes, not just the
5154 GNU one, which means that the compiler is smarter than you'd
5155 expect when dealing with objc_getClass(). For example, with the
5156 Apple runtime, in the code
5158 [objc_getClass ("NSObject") alloc];
5160 the compiler will recognize the objc_getClass() call as special
5161 (due to the code below) and so will know that +alloc is called on
5162 the 'NSObject' class, and can perform the corresponding checks.
5164 Programmers can disable this behaviour by casting the results of
5165 objc_getClass() to 'Class' (this may seem weird because
5166 objc_getClass() is already declared to return 'Class', but the
5167 compiler treats it as a special function). This may be useful if
5168 the class is never declared, and the compiler would complain
5169 about a missing @interface for it. Then, you can do
5171 [(Class)objc_getClass ("MyClassNeverDeclared") alloc];
5173 to silence the warnings. */
5174 if (TREE_CODE (receiver) == CALL_EXPR
5175 && (exp = CALL_EXPR_FN (receiver))
5176 && TREE_CODE (exp) == ADDR_EXPR
5177 && (exp = TREE_OPERAND (exp, 0))
5178 && TREE_CODE (exp) == FUNCTION_DECL
5179 /* For some reason, we sometimes wind up with multiple FUNCTION_DECL
5180 prototypes for objc_get_class(). Thankfully, they seem to share the
5181 same function type. */
5182 && TREE_TYPE (exp) == TREE_TYPE (objc_get_class_decl)
5183 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (exp)), runtime.tag_getclass)
5184 /* We have a call to objc_get_class/objc_getClass! */
5185 && (arg = CALL_EXPR_ARG (receiver, 0)))
5187 STRIP_NOPS (arg);
5188 if (TREE_CODE (arg) == ADDR_EXPR
5189 && (arg = TREE_OPERAND (arg, 0))
5190 && TREE_CODE (arg) == STRING_CST)
5191 /* Finally, we have the class name. */
5192 return get_identifier (TREE_STRING_POINTER (arg));
5194 return 0;
5197 /* If we are currently building a message expr, this holds
5198 the identifier of the selector of the message. This is
5199 used when printing warnings about argument mismatches. */
5201 static tree current_objc_message_selector = 0;
5203 tree
5204 objc_message_selector (void)
5206 return current_objc_message_selector;
5209 /* Construct an expression for sending a message.
5210 MESS has the object to send to in TREE_PURPOSE
5211 and the argument list (including selector) in TREE_VALUE.
5213 (*(<abstract_decl>(*)())_msg)(receiver, selTransTbl[n], ...);
5214 (*(<abstract_decl>(*)())_msgSuper)(receiver, selTransTbl[n], ...); */
5216 tree
5217 objc_build_message_expr (tree receiver, tree message_args)
5219 tree sel_name;
5220 #ifdef OBJCPLUS
5221 tree args = TREE_PURPOSE (message_args);
5222 #else
5223 tree args = message_args;
5224 #endif
5225 tree method_params = NULL_TREE;
5227 if (TREE_CODE (receiver) == ERROR_MARK || TREE_CODE (args) == ERROR_MARK)
5228 return error_mark_node;
5230 /* Obtain the full selector name. */
5231 switch (TREE_CODE (args))
5233 case IDENTIFIER_NODE:
5234 /* A unary selector. */
5235 sel_name = args;
5236 break;
5237 case TREE_LIST:
5238 sel_name = build_keyword_selector (args);
5239 break;
5240 default:
5241 gcc_unreachable ();
5244 /* Build the parameter list to give to the method. */
5245 if (TREE_CODE (args) == TREE_LIST)
5246 #ifdef OBJCPLUS
5247 method_params = chainon (args, TREE_VALUE (message_args));
5248 #else
5250 tree chain = args, prev = NULL_TREE;
5252 /* We have a keyword selector--check for comma expressions. */
5253 while (chain)
5255 tree element = TREE_VALUE (chain);
5257 /* We have a comma expression, must collapse... */
5258 if (TREE_CODE (element) == TREE_LIST)
5260 if (prev)
5261 TREE_CHAIN (prev) = element;
5262 else
5263 args = element;
5265 prev = chain;
5266 chain = TREE_CHAIN (chain);
5268 method_params = args;
5270 #endif
5272 #ifdef OBJCPLUS
5273 if (processing_template_decl)
5274 /* Must wait until template instantiation time. */
5275 return build_min_nt_loc (UNKNOWN_LOCATION, MESSAGE_SEND_EXPR, receiver,
5276 sel_name, method_params);
5277 #endif
5279 return objc_finish_message_expr (receiver, sel_name, method_params, NULL);
5282 /* Look up method SEL_NAME that would be suitable for receiver
5283 of type 'id' (if IS_CLASS is zero) or 'Class' (if IS_CLASS is
5284 nonzero), and report on any duplicates. */
5286 static tree
5287 lookup_method_in_hash_lists (tree sel_name, int is_class)
5289 tree method_prototype = OBJC_MAP_NOT_FOUND;
5291 if (!is_class)
5292 method_prototype = objc_map_get (instance_method_map, sel_name);
5294 if (method_prototype == OBJC_MAP_NOT_FOUND)
5296 method_prototype = objc_map_get (class_method_map, sel_name);
5297 is_class = 1;
5299 if (method_prototype == OBJC_MAP_NOT_FOUND)
5300 return NULL_TREE;
5303 return check_duplicates (method_prototype, 1, is_class);
5306 /* The 'objc_finish_message_expr' routine is called from within
5307 'objc_build_message_expr' for non-template functions. In the case of
5308 C++ template functions, it is called from 'build_expr_from_tree'
5309 (in decl2.c) after RECEIVER and METHOD_PARAMS have been expanded.
5311 If the DEPRECATED_METHOD_PROTOTYPE argument is NULL, then we warn
5312 if the method being used is deprecated. If it is not NULL, instead
5313 of deprecating, we set *DEPRECATED_METHOD_PROTOTYPE to the method
5314 prototype that was used and is deprecated. This is useful for
5315 getter calls that are always generated when compiling dot-syntax
5316 expressions, even if they may not be used. In that case, we don't
5317 want the warning immediately; we produce it (if needed) at gimplify
5318 stage when we are sure that the deprecated getter is being
5319 used. */
5320 tree
5321 objc_finish_message_expr (tree receiver, tree sel_name, tree method_params,
5322 tree *deprecated_method_prototype)
5324 tree method_prototype = NULL_TREE, rprotos = NULL_TREE, rtype;
5325 tree retval, class_tree;
5326 int self, super, have_cast;
5328 /* We have used the receiver, so mark it as read. */
5329 mark_exp_read (receiver);
5331 /* Extract the receiver of the message, as well as its type
5332 (where the latter may take the form of a cast or be inferred
5333 from the implementation context). */
5334 rtype = receiver;
5335 while (TREE_CODE (rtype) == COMPOUND_EXPR
5336 || TREE_CODE (rtype) == MODIFY_EXPR
5337 || CONVERT_EXPR_P (rtype)
5338 || TREE_CODE (rtype) == COMPONENT_REF)
5339 rtype = TREE_OPERAND (rtype, 0);
5341 /* self is 1 if this is a message to self, 0 otherwise */
5342 self = (rtype == self_decl);
5344 /* super is 1 if this is a message to super, 0 otherwise. */
5345 super = (rtype == UOBJC_SUPER_decl);
5347 /* rtype is the type of the receiver. */
5348 rtype = TREE_TYPE (receiver);
5350 /* have_cast is 1 if the receiver is casted. */
5351 have_cast = (TREE_CODE (receiver) == NOP_EXPR
5352 || (TREE_CODE (receiver) == COMPOUND_EXPR
5353 && !IS_SUPER (rtype)));
5355 /* If we are calling [super dealloc], reset our warning flag. */
5356 if (super && !strcmp ("dealloc", IDENTIFIER_POINTER (sel_name)))
5357 should_call_super_dealloc = 0;
5359 /* If the receiver is a class object, retrieve the corresponding
5360 @interface, if one exists. class_tree is the class name
5361 identifier, or NULL_TREE if this is not a class method or the
5362 class name could not be determined (as in the case "Class c; [c
5363 method];"). */
5364 class_tree = receiver_is_class_object (receiver, self, super);
5366 /* Now determine the receiver type (if an explicit cast has not been
5367 provided). */
5368 if (!have_cast)
5370 if (class_tree)
5372 /* We are here when we have no cast, and we have a class
5373 name. So, this is a plain method to a class object, as
5374 in [NSObject alloc]. Find the interface corresponding to
5375 the class name. */
5376 rtype = lookup_interface (class_tree);
5378 if (rtype == NULL_TREE)
5380 /* If 'rtype' is NULL_TREE at this point it means that
5381 we have seen no @interface corresponding to that
5382 class name, only a @class declaration (alternatively,
5383 this was a call such as [objc_getClass("SomeClass")
5384 alloc], where we've never seen the @interface of
5385 SomeClass). So, we have a class name (class_tree)
5386 but no actual details of the class methods. We won't
5387 be able to check that the class responds to the
5388 method, and we will have to guess the method
5389 prototype. Emit a warning, then keep going (this
5390 will use any method with a matching name, as if the
5391 receiver was of type 'Class'). */
5392 warning (0, "@interface of class %qE not found", class_tree);
5395 /* Handle `self' and `super'. */
5396 else if (super)
5398 if (!CLASS_SUPER_NAME (implementation_template))
5400 error ("no super class declared in @interface for %qE",
5401 CLASS_NAME (implementation_template));
5402 return error_mark_node;
5404 rtype = lookup_interface (CLASS_SUPER_NAME (implementation_template));
5406 else if (self)
5407 rtype = lookup_interface (CLASS_NAME (implementation_template));
5410 if (objc_is_id (rtype))
5412 /* The receiver is of type 'id' or 'Class' (with or without some
5413 protocols attached to it). */
5415 /* We set class_tree to the identifier for 'Class' if this is a
5416 class method, and to NULL_TREE if not. */
5417 class_tree = (IS_CLASS (rtype) ? objc_class_name : NULL_TREE);
5419 /* 'rprotos' is the list of protocols that the receiver
5420 supports. */
5421 rprotos = (TYPE_HAS_OBJC_INFO (TREE_TYPE (rtype))
5422 ? TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (rtype))
5423 : NULL_TREE);
5425 /* We have no information on the type, and we set it to
5426 NULL_TREE. */
5427 rtype = NULL_TREE;
5429 /* If there are any protocols, check that the method we are
5430 calling appears in the protocol list. If there are no
5431 protocols, this is a message to 'id' or 'Class' and we accept
5432 any method that exists. */
5433 if (rprotos)
5435 /* If messaging 'id <Protos>' or 'Class <Proto>', first
5436 search in protocols themselves for the method
5437 prototype. */
5438 method_prototype
5439 = lookup_method_in_protocol_list (rprotos, sel_name,
5440 class_tree != NULL_TREE);
5442 /* If messaging 'Class <Proto>' but did not find a class
5443 method prototype, search for an instance method instead,
5444 and warn about having done so. */
5445 if (!method_prototype && !rtype && class_tree != NULL_TREE)
5447 method_prototype
5448 = lookup_method_in_protocol_list (rprotos, sel_name, 0);
5450 if (method_prototype)
5451 warning (0, "found %<-%E%> instead of %<+%E%> in protocol(s)",
5452 sel_name, sel_name);
5456 else if (rtype)
5458 /* We have a receiver type which is more specific than 'id' or
5459 'Class'. */
5460 tree orig_rtype = rtype;
5462 if (TREE_CODE (rtype) == POINTER_TYPE)
5463 rtype = TREE_TYPE (rtype);
5464 /* Traverse typedef aliases */
5465 while (TREE_CODE (rtype) == RECORD_TYPE && OBJC_TYPE_NAME (rtype)
5466 && TREE_CODE (OBJC_TYPE_NAME (rtype)) == TYPE_DECL
5467 && DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (rtype)))
5468 rtype = DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (rtype));
5469 if (TYPED_OBJECT (rtype))
5471 rprotos = TYPE_OBJC_PROTOCOL_LIST (rtype);
5472 rtype = TYPE_OBJC_INTERFACE (rtype);
5474 if (!rtype || TREE_CODE (rtype) == IDENTIFIER_NODE)
5476 /* If we could not find an @interface declaration, we must
5477 have only seen a @class declaration; so, we cannot say
5478 anything more intelligent about which methods the
5479 receiver will understand. Note that this only happens
5480 for instance methods; for class methods to a class where
5481 we have only seen a @class declaration,
5482 lookup_interface() above would have set rtype to
5483 NULL_TREE. */
5484 if (rprotos)
5486 /* We could not find an @interface declaration, yet, if
5487 there are protocols attached to the type, we can
5488 still look up the method in the protocols. Ie, we
5489 are in the following case:
5491 @class MyClass;
5492 MyClass<MyProtocol> *x;
5493 [x method];
5495 If 'MyProtocol' has the method 'method', we can check
5496 and retrieve the method prototype. */
5497 method_prototype
5498 = lookup_method_in_protocol_list (rprotos, sel_name, 0);
5500 /* At this point, if we have found the method_prototype,
5501 we are quite happy. The details of the class are
5502 irrelevant. If we haven't found it, a warning will
5503 have been produced that the method could not be found
5504 in the protocol, and we won't produce further
5505 warnings (please note that this means that "@class
5506 MyClass; MyClass <MyProtocol> *x;" is exactly
5507 equivalent to "id <MyProtocol> x", which isn't too
5508 satisfactory but it's not easy to see how to do
5509 better). */
5511 else
5513 if (rtype)
5515 /* We could not find an @interface declaration, and
5516 there are no protocols attached to the receiver,
5517 so we can't complete the check that the receiver
5518 responds to the method, and we can't retrieve the
5519 method prototype. But, because the receiver has
5520 a well-specified class, the programmer did want
5521 this check to be performed. Emit a warning, then
5522 keep going as if it was an 'id'. To remove the
5523 warning, either include an @interface for the
5524 class, or cast the receiver to 'id'. Note that
5525 rtype is an IDENTIFIER_NODE at this point. */
5526 warning (0, "@interface of class %qE not found", rtype);
5530 rtype = NULL_TREE;
5532 else if (TREE_CODE (rtype) == CLASS_INTERFACE_TYPE
5533 || TREE_CODE (rtype) == CLASS_IMPLEMENTATION_TYPE)
5535 /* We have a valid ObjC class name with an associated
5536 @interface. Look up the method name in the published
5537 @interface for the class (and its superclasses). */
5538 method_prototype
5539 = lookup_method_static (rtype, sel_name, class_tree != NULL_TREE);
5541 /* If the method was not found in the @interface, it may still
5542 exist locally as part of the @implementation. */
5543 if (!method_prototype && objc_implementation_context
5544 && CLASS_NAME (objc_implementation_context)
5545 == OBJC_TYPE_NAME (rtype))
5546 method_prototype
5547 = lookup_method
5548 ((class_tree
5549 ? CLASS_CLS_METHODS (objc_implementation_context)
5550 : CLASS_NST_METHODS (objc_implementation_context)),
5551 sel_name);
5553 /* If we haven't found a candidate method by now, try looking for
5554 it in the protocol list. */
5555 if (!method_prototype && rprotos)
5556 method_prototype
5557 = lookup_method_in_protocol_list (rprotos, sel_name,
5558 class_tree != NULL_TREE);
5560 else
5562 /* We have a type, but it's not an Objective-C type (!). */
5563 warning (0, "invalid receiver type %qs",
5564 identifier_to_locale (gen_type_name (orig_rtype)));
5565 /* After issuing the "invalid receiver" warning, perform method
5566 lookup as if we were messaging 'id'. */
5567 rtype = rprotos = NULL_TREE;
5570 /* Note that rtype could also be NULL_TREE. This happens if we are
5571 messaging a class by name, but the class was only
5572 forward-declared using @class. */
5574 /* For 'id' or 'Class' receivers, search in the global hash table as
5575 a last resort. For all receivers, warn if protocol searches have
5576 failed. */
5577 if (!method_prototype)
5579 if (rprotos)
5580 warning (0, "%<%c%E%> not found in protocol(s)",
5581 (class_tree ? '+' : '-'),
5582 sel_name);
5584 if (!rtype)
5585 method_prototype
5586 = lookup_method_in_hash_lists (sel_name, class_tree != NULL_TREE);
5589 if (!method_prototype)
5591 static bool warn_missing_methods = false;
5593 if (rtype)
5594 warning (0, "%qE may not respond to %<%c%E%>",
5595 OBJC_TYPE_NAME (rtype),
5596 (class_tree ? '+' : '-'),
5597 sel_name);
5598 /* If we are messaging an 'id' or 'Class' object and made it here,
5599 then we have failed to find _any_ instance or class method,
5600 respectively. */
5601 else
5602 warning (0, "no %<%c%E%> method found",
5603 (class_tree ? '+' : '-'),
5604 sel_name);
5606 if (!warn_missing_methods)
5608 warning_at (input_location,
5609 0, "(Messages without a matching method signature");
5610 warning_at (input_location,
5611 0, "will be assumed to return %<id%> and accept");
5612 warning_at (input_location,
5613 0, "%<...%> as arguments.)");
5614 warn_missing_methods = true;
5617 else
5619 /* Warn if the method is deprecated, but not if the receiver is
5620 a generic 'id'. 'id' is used to cast an object to a generic
5621 object of an unspecified class; in that case, we'll use
5622 whatever method prototype we can find to get the method
5623 argument and return types, but it is not appropriate to
5624 produce deprecation warnings since we don't know the class
5625 that the object will be of at runtime. The @interface(s) for
5626 that class may not even be available to the compiler right
5627 now, and it is perfectly possible that the method is marked
5628 as non-deprecated in such @interface(s).
5630 In practice this makes sense since casting an object to 'id'
5631 is often used precisely to turn off warnings associated with
5632 the object being of a particular class. */
5633 if (TREE_DEPRECATED (method_prototype) && rtype != NULL_TREE)
5635 if (deprecated_method_prototype)
5636 *deprecated_method_prototype = method_prototype;
5637 else
5638 warn_deprecated_use (method_prototype, NULL_TREE);
5642 /* Save the selector name for printing error messages. */
5643 current_objc_message_selector = sel_name;
5645 /* Build the method call.
5646 TODO: Get the location from somewhere that will work for delayed
5647 expansion. */
5649 retval = (*runtime.build_objc_method_call) (input_location, method_prototype,
5650 receiver, rtype, sel_name,
5651 method_params, super);
5653 current_objc_message_selector = 0;
5655 return retval;
5659 /* This routine creates a static variable used to implement @protocol(MyProtocol)
5660 expression. This variable will be initialized to global protocol_t meta-data
5661 pointer. */
5663 /* This function is called by the parser when (and only when) a
5664 @protocol() expression is found, in order to compile it. */
5665 tree
5666 objc_build_protocol_expr (tree protoname)
5668 tree p = lookup_protocol (protoname, /* warn if deprecated */ true,
5669 /* definition_required */ false);
5671 if (!p)
5673 error ("cannot find protocol declaration for %qE", protoname);
5674 return error_mark_node;
5677 return (*runtime.get_protocol_reference) (input_location, p);
5680 /* This function is called by the parser when a @selector() expression
5681 is found, in order to compile it. It is only called by the parser
5682 and only to compile a @selector(). LOC is the location of the
5683 @selector. */
5684 tree
5685 objc_build_selector_expr (location_t loc, tree selnamelist)
5687 tree selname;
5689 /* Obtain the full selector name. */
5690 switch (TREE_CODE (selnamelist))
5692 case IDENTIFIER_NODE:
5693 /* A unary selector. */
5694 selname = selnamelist;
5695 break;
5696 case TREE_LIST:
5697 selname = build_keyword_selector (selnamelist);
5698 break;
5699 default:
5700 gcc_unreachable ();
5703 /* If we are required to check @selector() expressions as they
5704 are found, check that the selector has been declared. */
5705 if (warn_undeclared_selector)
5707 /* Look the selector up in the list of all known class and
5708 instance methods (up to this line) to check that the selector
5709 exists. */
5710 tree method;
5712 /* First try with instance methods. */
5713 method = objc_map_get (instance_method_map, selname);
5715 /* If not found, try with class methods. */
5716 if (method == OBJC_MAP_NOT_FOUND)
5718 method = objc_map_get (class_method_map, selname);
5720 /* If still not found, print out a warning. */
5721 if (method == OBJC_MAP_NOT_FOUND)
5722 warning (0, "undeclared selector %qE", selname);
5726 /* The runtimes do this differently, most particularly, GNU has typed
5727 selectors, whilst NeXT does not. */
5728 return (*runtime.build_selector_reference) (loc, selname, NULL_TREE);
5731 static tree
5732 build_ivar_reference (tree id)
5734 tree base;
5735 if (TREE_CODE (objc_method_context) == CLASS_METHOD_DECL)
5737 /* Historically, a class method that produced objects (factory
5738 method) would assign `self' to the instance that it
5739 allocated. This would effectively turn the class method into
5740 an instance method. Following this assignment, the instance
5741 variables could be accessed. That practice, while safe,
5742 violates the simple rule that a class method should not refer
5743 to an instance variable. It's better to catch the cases
5744 where this is done unknowingly than to support the above
5745 paradigm. */
5746 warning (0, "instance variable %qE accessed in class method",
5747 id);
5748 self_decl = convert (objc_instance_type, self_decl); /* cast */
5751 base = build_indirect_ref (input_location, self_decl, RO_ARROW);
5752 return (*runtime.build_ivar_reference) (input_location, base, id);
5755 static void
5756 hash_init (void)
5758 instance_method_map = objc_map_alloc_ggc (1000);
5759 class_method_map = objc_map_alloc_ggc (1000);
5761 class_name_map = objc_map_alloc_ggc (200);
5762 alias_name_map = objc_map_alloc_ggc (200);
5764 /* Initialize the hash table used to hold the constant string objects. */
5765 string_htab = htab_create_ggc (31, string_hash,
5766 string_eq, NULL);
5769 /* Use the following to add a method to class_method_map or
5770 instance_method_map. It will add the method, keyed by the
5771 METHOD_SEL_NAME. If the method already exists, but with one or
5772 more different prototypes, it will store a TREE_VEC in the map,
5773 with the method prototypes in the vector. */
5774 static void
5775 insert_method_into_method_map (bool class_method, tree method)
5777 tree method_name = METHOD_SEL_NAME (method);
5778 tree existing_entry;
5779 objc_map_t map;
5781 if (class_method)
5782 map = class_method_map;
5783 else
5784 map = instance_method_map;
5786 /* Check if the method already exists in the map. */
5787 existing_entry = objc_map_get (map, method_name);
5789 /* If not, we simply add it to the map. */
5790 if (existing_entry == OBJC_MAP_NOT_FOUND)
5791 objc_map_put (map, method_name, method);
5792 else
5794 tree new_entry;
5796 /* If an entry already exists, it's more complicated. We'll
5797 have to check whether the method prototype is the same or
5798 not. */
5799 if (TREE_CODE (existing_entry) != TREE_VEC)
5801 /* If the method prototypes are the same, there is nothing
5802 to do. */
5803 if (comp_proto_with_proto (method, existing_entry, 1))
5804 return;
5806 /* If not, create a vector to store both the method already
5807 in the map, and the new one that we are adding. */
5808 new_entry = make_tree_vec (2);
5810 TREE_VEC_ELT (new_entry, 0) = existing_entry;
5811 TREE_VEC_ELT (new_entry, 1) = method;
5813 else
5815 /* An entry already exists, and it's already a vector. This
5816 means that at least 2 different method prototypes were
5817 already found, and we're considering registering yet
5818 another one. */
5819 size_t i;
5821 /* Check all the existing prototypes. If any matches the
5822 one we need to add, there is nothing to do because it's
5823 already there. */
5824 for (i = 0; i < (size_t) TREE_VEC_LENGTH (existing_entry); i++)
5825 if (comp_proto_with_proto (method, TREE_VEC_ELT (existing_entry, i), 1))
5826 return;
5828 /* Else, create a new, bigger vector and add the new method
5829 at the end of it. This is inefficient but extremely
5830 rare; in any sane program most methods have a single
5831 prototype, and very few, if any, will have more than
5832 2! */
5833 new_entry = make_tree_vec (TREE_VEC_LENGTH (existing_entry) + 1);
5835 /* Copy the methods from the existing vector. */
5836 for (i = 0; i < (size_t) TREE_VEC_LENGTH (existing_entry); i++)
5837 TREE_VEC_ELT (new_entry, i) = TREE_VEC_ELT (existing_entry, i);
5839 /* Add the new method at the end. */
5840 TREE_VEC_ELT (new_entry, i) = method;
5843 /* Store the new vector in the map. */
5844 objc_map_put (map, method_name, new_entry);
5849 static tree
5850 lookup_method (tree mchain, tree method)
5852 tree key;
5854 if (TREE_CODE (method) == IDENTIFIER_NODE)
5855 key = method;
5856 else
5857 key = METHOD_SEL_NAME (method);
5859 while (mchain)
5861 if (METHOD_SEL_NAME (mchain) == key)
5862 return mchain;
5864 mchain = DECL_CHAIN (mchain);
5866 return NULL_TREE;
5869 /* Look up a class (if OBJC_LOOKUP_CLASS is set in FLAGS) or instance
5870 method in INTERFACE, along with any categories and protocols
5871 attached thereto. If method is not found, and the
5872 OBJC_LOOKUP_NO_SUPER is _not_ set in FLAGS, recursively examine the
5873 INTERFACE's superclass. If OBJC_LOOKUP_CLASS is set,
5874 OBJC_LOOKUP_NO_SUPER is clear, and no suitable class method could
5875 be found in INTERFACE or any of its superclasses, look for an
5876 _instance_ method of the same name in the root class as a last
5877 resort. This behaviour can be turned off by using
5878 OBJC_LOOKUP_NO_INSTANCE_METHODS_OF_ROOT_CLASS.
5880 If a suitable method cannot be found, return NULL_TREE. */
5882 static tree
5883 lookup_method_static (tree interface, tree ident, int flags)
5885 tree meth = NULL_TREE, root_inter = NULL_TREE;
5886 tree inter = interface;
5887 int is_class = (flags & OBJC_LOOKUP_CLASS);
5888 int no_superclasses = (flags & OBJC_LOOKUP_NO_SUPER);
5889 int no_instance_methods_of_root_class = (flags & OBJC_LOOKUP_NO_INSTANCE_METHODS_OF_ROOT_CLASS);
5891 while (inter)
5893 tree chain = is_class ? CLASS_CLS_METHODS (inter) : CLASS_NST_METHODS (inter);
5894 tree category = inter;
5896 /* First, look up the method in the class itself. */
5897 if ((meth = lookup_method (chain, ident)))
5898 return meth;
5900 /* Failing that, look for the method in each category of the class. */
5901 while ((category = CLASS_CATEGORY_LIST (category)))
5903 chain = is_class ? CLASS_CLS_METHODS (category) : CLASS_NST_METHODS (category);
5905 /* Check directly in each category. */
5906 if ((meth = lookup_method (chain, ident)))
5907 return meth;
5909 /* Failing that, check in each category's protocols. */
5910 if (CLASS_PROTOCOL_LIST (category))
5912 if ((meth = (lookup_method_in_protocol_list
5913 (CLASS_PROTOCOL_LIST (category), ident, is_class))))
5914 return meth;
5918 /* If not found in categories, check in protocols of the main class. */
5919 if (CLASS_PROTOCOL_LIST (inter))
5921 if ((meth = (lookup_method_in_protocol_list
5922 (CLASS_PROTOCOL_LIST (inter), ident, is_class))))
5923 return meth;
5926 /* If we were instructed not to look in superclasses, don't. */
5927 if (no_superclasses)
5928 return NULL_TREE;
5930 /* Failing that, climb up the inheritance hierarchy. */
5931 root_inter = inter;
5932 inter = lookup_interface (CLASS_SUPER_NAME (inter));
5934 while (inter);
5936 if (is_class && !no_instance_methods_of_root_class)
5938 /* If no class (factory) method was found, check if an _instance_
5939 method of the same name exists in the root class. This is what
5940 the Objective-C runtime will do. */
5941 return lookup_method_static (root_inter, ident, 0);
5943 else
5945 /* If an instance method was not found, return 0. */
5946 return NULL_TREE;
5950 static tree
5951 objc_add_method (tree klass, tree method, int is_class, bool is_optional)
5953 tree existing_method = NULL_TREE;
5955 /* The first thing we do is look up the method in the list of
5956 methods already defined in the interface (or implementation). */
5957 if (is_class)
5958 existing_method = lookup_method (CLASS_CLS_METHODS (klass), method);
5959 else
5960 existing_method = lookup_method (CLASS_NST_METHODS (klass), method);
5962 /* In the case of protocols, we have a second list of methods to
5963 consider, the list of optional ones. */
5964 if (TREE_CODE (klass) == PROTOCOL_INTERFACE_TYPE)
5966 /* @required methods are added to the protocol's normal list.
5967 @optional methods are added to the protocol's OPTIONAL lists.
5968 Note that adding the methods to the optional lists disables
5969 checking that the methods are implemented by classes
5970 implementing the protocol, since these checks only use the
5971 CLASS_CLS_METHODS and CLASS_NST_METHODS. */
5973 /* First of all, if the method to add is @optional, and we found
5974 it already existing as @required, emit an error. */
5975 if (is_optional && existing_method)
5977 error ("method %<%c%E%> declared %<@optional%> and %<@required%> at the same time",
5978 (is_class ? '+' : '-'),
5979 METHOD_SEL_NAME (existing_method));
5980 inform (DECL_SOURCE_LOCATION (existing_method),
5981 "previous declaration of %<%c%E%> as %<@required%>",
5982 (is_class ? '+' : '-'),
5983 METHOD_SEL_NAME (existing_method));
5986 /* Now check the list of @optional methods if we didn't find the
5987 method in the @required list. */
5988 if (!existing_method)
5990 if (is_class)
5991 existing_method = lookup_method (PROTOCOL_OPTIONAL_CLS_METHODS (klass), method);
5992 else
5993 existing_method = lookup_method (PROTOCOL_OPTIONAL_NST_METHODS (klass), method);
5995 if (!is_optional && existing_method)
5997 error ("method %<%c%E%> declared %<@optional%> and %<@required%> at the same time",
5998 (is_class ? '+' : '-'),
5999 METHOD_SEL_NAME (existing_method));
6000 inform (DECL_SOURCE_LOCATION (existing_method),
6001 "previous declaration of %<%c%E%> as %<@optional%>",
6002 (is_class ? '+' : '-'),
6003 METHOD_SEL_NAME (existing_method));
6008 /* If the method didn't exist already, add it. */
6009 if (!existing_method)
6011 if (is_optional)
6013 if (is_class)
6015 /* Put the method on the list in reverse order. */
6016 TREE_CHAIN (method) = PROTOCOL_OPTIONAL_CLS_METHODS (klass);
6017 PROTOCOL_OPTIONAL_CLS_METHODS (klass) = method;
6019 else
6021 TREE_CHAIN (method) = PROTOCOL_OPTIONAL_NST_METHODS (klass);
6022 PROTOCOL_OPTIONAL_NST_METHODS (klass) = method;
6025 else
6027 if (is_class)
6029 DECL_CHAIN (method) = CLASS_CLS_METHODS (klass);
6030 CLASS_CLS_METHODS (klass) = method;
6032 else
6034 DECL_CHAIN (method) = CLASS_NST_METHODS (klass);
6035 CLASS_NST_METHODS (klass) = method;
6039 else
6041 /* The method was already defined. Check that the types match
6042 for an @interface for a class or category, or for a
6043 @protocol. Give hard errors on methods with identical
6044 selectors but differing argument and/or return types. We do
6045 not do this for @implementations, because C/C++ will do it
6046 for us (i.e., there will be duplicate function definition
6047 errors). */
6048 if ((TREE_CODE (klass) == CLASS_INTERFACE_TYPE
6049 || TREE_CODE (klass) == CATEGORY_INTERFACE_TYPE
6050 /* Starting with GCC 4.6, we emit the same error for
6051 protocols too. The situation is identical to
6052 @interfaces as there is no possible meaningful reason
6053 for defining the same method with different signatures
6054 in the very same @protocol. If that was allowed,
6055 whenever the protocol is used (both at compile and run
6056 time) there wouldn't be any meaningful way to decide
6057 which of the two method signatures should be used. */
6058 || TREE_CODE (klass) == PROTOCOL_INTERFACE_TYPE)
6059 && !comp_proto_with_proto (method, existing_method, 1))
6061 error ("duplicate declaration of method %<%c%E%> with conflicting types",
6062 (is_class ? '+' : '-'),
6063 METHOD_SEL_NAME (existing_method));
6064 inform (DECL_SOURCE_LOCATION (existing_method),
6065 "previous declaration of %<%c%E%>",
6066 (is_class ? '+' : '-'),
6067 METHOD_SEL_NAME (existing_method));
6071 if (is_class)
6072 insert_method_into_method_map (true, method);
6073 else
6075 insert_method_into_method_map (false, method);
6077 /* Instance methods in root classes (and categories thereof)
6078 may act as class methods as a last resort. We also add
6079 instance methods listed in @protocol declarations to
6080 the class hash table, on the assumption that @protocols
6081 may be adopted by root classes or categories. */
6082 if (TREE_CODE (klass) == CATEGORY_INTERFACE_TYPE
6083 || TREE_CODE (klass) == CATEGORY_IMPLEMENTATION_TYPE)
6084 klass = lookup_interface (CLASS_NAME (klass));
6086 if (TREE_CODE (klass) == PROTOCOL_INTERFACE_TYPE
6087 || !CLASS_SUPER_NAME (klass))
6088 insert_method_into_method_map (true, method);
6091 return method;
6094 static void
6095 add_category (tree klass, tree category)
6097 /* Put categories on list in reverse order. */
6098 tree cat = lookup_category (klass, CLASS_SUPER_NAME (category));
6100 if (cat)
6102 warning (0, "duplicate interface declaration for category %<%E(%E)%>",
6103 CLASS_NAME (klass),
6104 CLASS_SUPER_NAME (category));
6106 else
6108 CLASS_CATEGORY_LIST (category) = CLASS_CATEGORY_LIST (klass);
6109 CLASS_CATEGORY_LIST (klass) = category;
6113 #ifndef OBJCPLUS
6114 /* A flexible array member is a C99 extension where you can use
6115 "type[]" at the end of a struct to mean a variable-length array.
6117 In Objective-C, instance variables are fundamentally members of a
6118 struct, but the struct can always be extended by subclassing; hence
6119 we need to detect and forbid all instance variables declared using
6120 flexible array members.
6122 No check for this is needed in Objective-C++, since C++ does not
6123 have flexible array members. */
6125 /* Determine whether TYPE is a structure with a flexible array member,
6126 a union containing such a structure (possibly recursively) or an
6127 array of such structures or unions. These are all invalid as
6128 instance variable. */
6129 static bool
6130 flexible_array_type_p (tree type)
6132 tree x;
6133 switch (TREE_CODE (type))
6135 case RECORD_TYPE:
6136 x = TYPE_FIELDS (type);
6137 if (x == NULL_TREE)
6138 return false;
6139 while (DECL_CHAIN (x) != NULL_TREE)
6140 x = DECL_CHAIN (x);
6141 if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
6142 && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
6143 && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE
6144 && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE)
6145 return true;
6146 return false;
6147 case UNION_TYPE:
6148 for (x = TYPE_FIELDS (type); x != NULL_TREE; x = DECL_CHAIN (x))
6150 if (flexible_array_type_p (TREE_TYPE (x)))
6151 return true;
6153 return false;
6154 /* Note that we also check for arrays of something that uses a flexible array member. */
6155 case ARRAY_TYPE:
6156 if (flexible_array_type_p (TREE_TYPE (type)))
6157 return true;
6158 return false;
6159 default:
6160 return false;
6163 #endif
6165 /* Produce a printable version of an ivar name. This is only used
6166 inside add_instance_variable. */
6167 static const char *
6168 printable_ivar_name (tree field_decl)
6170 if (DECL_NAME (field_decl))
6171 return identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (field_decl)));
6172 else
6173 return _("<unnamed>");
6176 /* Called after parsing each instance variable declaration. Necessary to
6177 preserve typedefs and implement public/private...
6179 VISIBILITY is 1 for public, 0 for protected, and 2 for private. */
6181 static tree
6182 add_instance_variable (tree klass, objc_ivar_visibility_kind visibility,
6183 tree field_decl)
6185 tree field_type = TREE_TYPE (field_decl);
6187 #ifdef OBJCPLUS
6188 if (TREE_CODE (field_type) == REFERENCE_TYPE)
6190 error ("illegal reference type specified for instance variable %qs",
6191 printable_ivar_name (field_decl));
6192 /* Return class as is without adding this ivar. */
6193 return klass;
6195 #endif
6197 if (field_type == error_mark_node || !TYPE_SIZE (field_type)
6198 || TYPE_SIZE (field_type) == error_mark_node)
6199 /* 'type[0]' is allowed, but 'type[]' is not! */
6201 error ("instance variable %qs has unknown size",
6202 printable_ivar_name (field_decl));
6203 /* Return class as is without adding this ivar. */
6204 return klass;
6207 #ifndef OBJCPLUS
6208 /* Also, in C reject a struct with a flexible array member. Ie,
6210 struct A { int x; int[] y; };
6212 @interface X
6214 struct A instance_variable;
6216 @end
6218 is not valid because if the class is subclassed, we wouldn't be able
6219 to calculate the offset of the next instance variable. */
6220 if (flexible_array_type_p (field_type))
6222 error ("instance variable %qs uses flexible array member",
6223 printable_ivar_name (field_decl));
6224 /* Return class as is without adding this ivar. */
6225 return klass;
6227 #endif
6229 #ifdef OBJCPLUS
6230 /* Check if the ivar being added has a non-POD C++ type. If so, we will
6231 need to either (1) warn the user about it or (2) generate suitable
6232 constructor/destructor call from '- .cxx_construct' or '- .cxx_destruct'
6233 methods (if '-fobjc-call-cxx-cdtors' was specified). */
6234 if (MAYBE_CLASS_TYPE_P (field_type)
6235 && (TYPE_NEEDS_CONSTRUCTING (field_type)
6236 || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (field_type)
6237 || TYPE_POLYMORPHIC_P (field_type)))
6239 tree type_name = OBJC_TYPE_NAME (field_type);
6241 if (flag_objc_call_cxx_cdtors)
6243 /* Since the ObjC runtime will be calling the constructors and
6244 destructors for us, the only thing we can't handle is the lack
6245 of a default constructor. */
6246 if (TYPE_NEEDS_CONSTRUCTING (field_type)
6247 && !TYPE_HAS_DEFAULT_CONSTRUCTOR (field_type))
6249 warning (0, "type %qE has no default constructor to call",
6250 type_name);
6252 /* If we cannot call a constructor, we should also avoid
6253 calling the destructor, for symmetry. */
6254 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (field_type))
6255 warning (0, "destructor for %qE shall not be run either",
6256 type_name);
6259 else
6261 static bool warn_cxx_ivars = false;
6263 if (TYPE_POLYMORPHIC_P (field_type))
6265 /* Vtable pointers are Real Bad(tm), since Obj-C cannot
6266 initialize them. */
6267 error ("type %qE has virtual member functions", type_name);
6268 error ("illegal aggregate type %qE specified "
6269 "for instance variable %qs",
6270 type_name, printable_ivar_name (field_decl));
6271 /* Return class as is without adding this ivar. */
6272 return klass;
6275 /* User-defined constructors and destructors are not known to Obj-C
6276 and hence will not be called. This may or may not be a problem. */
6277 if (TYPE_NEEDS_CONSTRUCTING (field_type))
6278 warning (0, "type %qE has a user-defined constructor", type_name);
6279 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (field_type))
6280 warning (0, "type %qE has a user-defined destructor", type_name);
6282 if (!warn_cxx_ivars)
6284 warning (0, "C++ constructors and destructors will not "
6285 "be invoked for Objective-C fields");
6286 warn_cxx_ivars = true;
6290 #endif
6292 /* Overload the public attribute, it is not used for FIELD_DECLs. */
6293 switch (visibility)
6295 case OBJC_IVAR_VIS_PROTECTED:
6296 TREE_PUBLIC (field_decl) = 0;
6297 TREE_PRIVATE (field_decl) = 0;
6298 TREE_PROTECTED (field_decl) = 1;
6299 break;
6301 case OBJC_IVAR_VIS_PACKAGE:
6302 /* TODO: Implement the package variant. */
6303 case OBJC_IVAR_VIS_PUBLIC:
6304 TREE_PUBLIC (field_decl) = 1;
6305 TREE_PRIVATE (field_decl) = 0;
6306 TREE_PROTECTED (field_decl) = 0;
6307 break;
6309 case OBJC_IVAR_VIS_PRIVATE:
6310 TREE_PUBLIC (field_decl) = 0;
6311 TREE_PRIVATE (field_decl) = 1;
6312 TREE_PROTECTED (field_decl) = 0;
6313 break;
6317 CLASS_RAW_IVARS (klass) = chainon (CLASS_RAW_IVARS (klass), field_decl);
6319 return klass;
6322 /* True if the ivar is private and we are not in its implementation. */
6324 static int
6325 is_private (tree decl)
6327 return (TREE_PRIVATE (decl)
6328 && ! is_ivar (CLASS_IVARS (implementation_template),
6329 DECL_NAME (decl)));
6332 /* Searches all the instance variables of 'klass' and of its
6333 superclasses for an instance variable whose name (identifier) is
6334 'ivar_name_ident'. Return the declaration (DECL) of the instance
6335 variable, if found, or NULL_TREE, if not found. */
6336 static inline tree
6337 ivar_of_class (tree klass, tree ivar_name_ident)
6339 /* First, look up the ivar in CLASS_RAW_IVARS. */
6340 tree decl_chain = CLASS_RAW_IVARS (klass);
6342 for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain))
6343 if (DECL_NAME (decl_chain) == ivar_name_ident)
6344 return decl_chain;
6346 /* If not found, search up the class hierarchy. */
6347 while (CLASS_SUPER_NAME (klass))
6349 klass = lookup_interface (CLASS_SUPER_NAME (klass));
6351 decl_chain = CLASS_RAW_IVARS (klass);
6353 for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain))
6354 if (DECL_NAME (decl_chain) == ivar_name_ident)
6355 return decl_chain;
6358 return NULL_TREE;
6361 /* We have an instance variable reference;, check to see if it is public. */
6364 objc_is_public (tree expr, tree identifier)
6366 tree basetype, decl;
6368 #ifdef OBJCPLUS
6369 if (processing_template_decl)
6370 return 1;
6371 #endif
6373 if (TREE_TYPE (expr) == error_mark_node)
6374 return 1;
6376 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (expr));
6378 if (basetype && TREE_CODE (basetype) == RECORD_TYPE)
6380 if (TYPE_HAS_OBJC_INFO (basetype) && TYPE_OBJC_INTERFACE (basetype))
6382 tree klass = lookup_interface (OBJC_TYPE_NAME (basetype));
6384 if (!klass)
6386 error ("cannot find interface declaration for %qE",
6387 OBJC_TYPE_NAME (basetype));
6388 return 0;
6391 if ((decl = ivar_of_class (klass, identifier)))
6393 if (TREE_PUBLIC (decl))
6394 return 1;
6396 /* Important difference between the Stepstone translator:
6397 all instance variables should be public within the context
6398 of the implementation. */
6399 if (objc_implementation_context
6400 && ((TREE_CODE (objc_implementation_context)
6401 == CLASS_IMPLEMENTATION_TYPE)
6402 || (TREE_CODE (objc_implementation_context)
6403 == CATEGORY_IMPLEMENTATION_TYPE)))
6405 tree curtype = TYPE_MAIN_VARIANT
6406 (CLASS_STATIC_TEMPLATE
6407 (implementation_template));
6409 if (basetype == curtype
6410 || DERIVED_FROM_P (basetype, curtype))
6412 int priv = is_private (decl);
6414 if (priv)
6415 error ("instance variable %qE is declared private",
6416 DECL_NAME (decl));
6418 return !priv;
6422 /* The 2.95.2 compiler sometimes allowed C functions to access
6423 non-@public ivars. We will let this slide for now... */
6424 if (!objc_method_context)
6426 warning (0, "instance variable %qE is %s; "
6427 "this will be a hard error in the future",
6428 identifier,
6429 TREE_PRIVATE (decl) ? "@private" : "@protected");
6430 return 1;
6433 error ("instance variable %qE is declared %s",
6434 identifier,
6435 TREE_PRIVATE (decl) ? "private" : "protected");
6436 return 0;
6441 return 1;
6444 /* Make sure all methods in CHAIN (a list of method declarations from
6445 an @interface or a @protocol) are in IMPLEMENTATION (the
6446 implementation context). This is used to check for example that
6447 all methods declared in an @interface were implemented in an
6448 @implementation.
6450 Some special methods (property setters/getters) are special and if
6451 they are not found in IMPLEMENTATION, we look them up in its
6452 superclasses. */
6454 static int
6455 check_methods (tree chain, tree implementation, int mtype)
6457 int first = 1;
6458 tree list;
6460 if (mtype == (int)'+')
6461 list = CLASS_CLS_METHODS (implementation);
6462 else
6463 list = CLASS_NST_METHODS (implementation);
6465 while (chain)
6467 /* If the method is associated with a dynamic property, then it
6468 is Ok not to have the method implementation, as it will be
6469 generated dynamically at runtime. To decide if the method is
6470 associated with a @dynamic property, we search the list of
6471 @synthesize and @dynamic for this implementation, and look
6472 for any @dynamic property with the same setter or getter name
6473 as this method. */
6474 tree x;
6475 for (x = IMPL_PROPERTY_DECL (implementation); x; x = TREE_CHAIN (x))
6476 if (PROPERTY_DYNAMIC (x)
6477 && (PROPERTY_GETTER_NAME (x) == METHOD_SEL_NAME (chain)
6478 || PROPERTY_SETTER_NAME (x) == METHOD_SEL_NAME (chain)))
6479 break;
6481 if (x != NULL_TREE)
6483 chain = TREE_CHAIN (chain); /* next method... */
6484 continue;
6487 if (!lookup_method (list, chain))
6489 /* If the method is a property setter/getter, we'll still
6490 allow it to be missing if it is implemented by
6491 'interface' or any of its superclasses. */
6492 tree property = METHOD_PROPERTY_CONTEXT (chain);
6493 if (property)
6495 /* Note that since this is a property getter/setter, it
6496 is obviously an instance method. */
6497 tree interface = NULL_TREE;
6499 /* For a category, first check the main class
6500 @interface. */
6501 if (TREE_CODE (implementation) == CATEGORY_IMPLEMENTATION_TYPE)
6503 interface = lookup_interface (CLASS_NAME (implementation));
6505 /* If the method is found in the main class, it's Ok. */
6506 if (lookup_method (CLASS_NST_METHODS (interface), chain))
6508 chain = DECL_CHAIN (chain);
6509 continue;
6512 /* Else, get the superclass. */
6513 if (CLASS_SUPER_NAME (interface))
6514 interface = lookup_interface (CLASS_SUPER_NAME (interface));
6515 else
6516 interface = NULL_TREE;
6519 /* Get the superclass for classes. */
6520 if (TREE_CODE (implementation) == CLASS_IMPLEMENTATION_TYPE)
6522 if (CLASS_SUPER_NAME (implementation))
6523 interface = lookup_interface (CLASS_SUPER_NAME (implementation));
6524 else
6525 interface = NULL_TREE;
6528 /* Now, interface is the superclass, if any; go check it. */
6529 if (interface)
6531 if (lookup_method_static (interface, chain, 0))
6533 chain = DECL_CHAIN (chain);
6534 continue;
6537 /* Else, fall through - warn. */
6539 if (first)
6541 switch (TREE_CODE (implementation))
6543 case CLASS_IMPLEMENTATION_TYPE:
6544 warning (0, "incomplete implementation of class %qE",
6545 CLASS_NAME (implementation));
6546 break;
6547 case CATEGORY_IMPLEMENTATION_TYPE:
6548 warning (0, "incomplete implementation of category %qE",
6549 CLASS_SUPER_NAME (implementation));
6550 break;
6551 default:
6552 gcc_unreachable ();
6554 first = 0;
6557 warning (0, "method definition for %<%c%E%> not found",
6558 mtype, METHOD_SEL_NAME (chain));
6561 chain = DECL_CHAIN (chain);
6564 return first;
6567 /* Check if KLASS, or its superclasses, explicitly conforms to PROTOCOL. */
6569 static int
6570 conforms_to_protocol (tree klass, tree protocol)
6572 if (TREE_CODE (protocol) == PROTOCOL_INTERFACE_TYPE)
6574 tree p = CLASS_PROTOCOL_LIST (klass);
6575 while (p && TREE_VALUE (p) != protocol)
6576 p = TREE_CHAIN (p);
6578 if (!p)
6580 tree super = (CLASS_SUPER_NAME (klass)
6581 ? lookup_interface (CLASS_SUPER_NAME (klass))
6582 : NULL_TREE);
6583 int tmp = super ? conforms_to_protocol (super, protocol) : 0;
6584 if (!tmp)
6585 return 0;
6589 return 1;
6592 /* Make sure all methods in CHAIN are accessible as MTYPE methods in
6593 CONTEXT. This is one of two mechanisms to check protocol integrity. */
6595 static int
6596 check_methods_accessible (tree chain, tree context, int mtype)
6598 int first = 1;
6599 tree list;
6600 tree base_context = context;
6602 while (chain)
6604 /* If the method is associated with a dynamic property, then it
6605 is Ok not to have the method implementation, as it will be
6606 generated dynamically at runtime. Search for any @dynamic
6607 property with the same setter or getter name as this
6608 method. TODO: Use a hashtable lookup. */
6609 tree x;
6610 for (x = IMPL_PROPERTY_DECL (base_context); x; x = TREE_CHAIN (x))
6611 if (PROPERTY_DYNAMIC (x)
6612 && (PROPERTY_GETTER_NAME (x) == METHOD_SEL_NAME (chain)
6613 || PROPERTY_SETTER_NAME (x) == METHOD_SEL_NAME (chain)))
6614 break;
6616 if (x != NULL_TREE)
6618 chain = TREE_CHAIN (chain); /* next method... */
6619 continue;
6622 context = base_context;
6623 while (context)
6625 if (mtype == '+')
6626 list = CLASS_CLS_METHODS (context);
6627 else
6628 list = CLASS_NST_METHODS (context);
6630 if (lookup_method (list, chain))
6631 break;
6633 switch (TREE_CODE (context))
6635 case CLASS_IMPLEMENTATION_TYPE:
6636 case CLASS_INTERFACE_TYPE:
6637 context = (CLASS_SUPER_NAME (context)
6638 ? lookup_interface (CLASS_SUPER_NAME (context))
6639 : NULL_TREE);
6640 break;
6641 case CATEGORY_IMPLEMENTATION_TYPE:
6642 case CATEGORY_INTERFACE_TYPE:
6643 context = (CLASS_NAME (context)
6644 ? lookup_interface (CLASS_NAME (context))
6645 : NULL_TREE);
6646 break;
6647 default:
6648 gcc_unreachable ();
6652 if (context == NULL_TREE)
6654 if (first)
6656 switch (TREE_CODE (objc_implementation_context))
6658 case CLASS_IMPLEMENTATION_TYPE:
6659 warning (0, "incomplete implementation of class %qE",
6660 CLASS_NAME (objc_implementation_context));
6661 break;
6662 case CATEGORY_IMPLEMENTATION_TYPE:
6663 warning (0, "incomplete implementation of category %qE",
6664 CLASS_SUPER_NAME (objc_implementation_context));
6665 break;
6666 default:
6667 gcc_unreachable ();
6669 first = 0;
6671 warning (0, "method definition for %<%c%E%> not found",
6672 mtype, METHOD_SEL_NAME (chain));
6675 chain = TREE_CHAIN (chain); /* next method... */
6677 return first;
6680 /* Check whether the current interface (accessible via
6681 'objc_implementation_context') actually implements protocol P, along
6682 with any protocols that P inherits. */
6684 static void
6685 check_protocol (tree p, const char *type, tree name)
6687 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
6689 int f1, f2;
6691 /* Ensure that all protocols have bodies! */
6692 if (warn_protocol)
6694 f1 = check_methods (PROTOCOL_CLS_METHODS (p),
6695 objc_implementation_context,
6696 '+');
6697 f2 = check_methods (PROTOCOL_NST_METHODS (p),
6698 objc_implementation_context,
6699 '-');
6701 else
6703 f1 = check_methods_accessible (PROTOCOL_CLS_METHODS (p),
6704 objc_implementation_context,
6705 '+');
6706 f2 = check_methods_accessible (PROTOCOL_NST_METHODS (p),
6707 objc_implementation_context,
6708 '-');
6711 if (!f1 || !f2)
6712 warning (0, "%s %qE does not fully implement the %qE protocol",
6713 type, name, PROTOCOL_NAME (p));
6716 /* Check protocols recursively. */
6717 if (PROTOCOL_LIST (p))
6719 tree subs = PROTOCOL_LIST (p);
6720 tree super_class =
6721 lookup_interface (CLASS_SUPER_NAME (implementation_template));
6723 while (subs)
6725 tree sub = TREE_VALUE (subs);
6727 /* If the superclass does not conform to the protocols
6728 inherited by P, then we must! */
6729 if (!super_class || !conforms_to_protocol (super_class, sub))
6730 check_protocol (sub, type, name);
6731 subs = TREE_CHAIN (subs);
6736 /* Check whether the current interface (accessible via
6737 'objc_implementation_context') actually implements the protocols listed
6738 in PROTO_LIST. */
6740 static void
6741 check_protocols (tree proto_list, const char *type, tree name)
6743 for ( ; proto_list; proto_list = TREE_CHAIN (proto_list))
6745 tree p = TREE_VALUE (proto_list);
6747 check_protocol (p, type, name);
6751 /* Make sure that the class CLASS_NAME is defined CODE says which kind
6752 of thing CLASS_NAME ought to be. It can be CLASS_INTERFACE_TYPE,
6753 CLASS_IMPLEMENTATION_TYPE, CATEGORY_INTERFACE_TYPE, or
6754 CATEGORY_IMPLEMENTATION_TYPE. For a CATEGORY_INTERFACE_TYPE,
6755 SUPER_NAME is the name of the category. For a class extension,
6756 CODE is CATEGORY_INTERFACE_TYPE and SUPER_NAME is NULL_TREE. */
6757 static tree
6758 start_class (enum tree_code code, tree class_name, tree super_name,
6759 tree protocol_list, tree attributes)
6761 tree klass = NULL_TREE;
6762 tree decl;
6764 #ifdef OBJCPLUS
6765 if (current_namespace != global_namespace)
6767 error ("Objective-C declarations may only appear in global scope");
6769 #endif /* OBJCPLUS */
6771 if (objc_implementation_context)
6773 warning (0, "%<@end%> missing in implementation context");
6774 finish_class (objc_implementation_context);
6775 objc_ivar_chain = NULL_TREE;
6776 objc_implementation_context = NULL_TREE;
6779 /* If this is a class extension, we'll be "reopening" the existing
6780 CLASS_INTERFACE_TYPE, so in that case there is no need to create
6781 a new node. */
6782 if (code != CATEGORY_INTERFACE_TYPE || super_name != NULL_TREE)
6784 klass = make_node (code);
6785 TYPE_LANG_SLOT_1 (klass) = make_tree_vec (CLASS_LANG_SLOT_ELTS);
6788 /* Check for existence of the super class, if one was specified. Note
6789 that we must have seen an @interface, not just a @class. If we
6790 are looking at a @compatibility_alias, traverse it first. */
6791 if ((code == CLASS_INTERFACE_TYPE || code == CLASS_IMPLEMENTATION_TYPE)
6792 && super_name)
6794 tree super = objc_is_class_name (super_name);
6795 tree super_interface = NULL_TREE;
6797 if (super)
6798 super_interface = lookup_interface (super);
6800 if (!super_interface)
6802 error ("cannot find interface declaration for %qE, superclass of %qE",
6803 super ? super : super_name,
6804 class_name);
6805 super_name = NULL_TREE;
6807 else
6809 if (TREE_DEPRECATED (super_interface))
6810 warning (OPT_Wdeprecated_declarations, "class %qE is deprecated",
6811 super);
6812 super_name = super;
6816 if (code != CATEGORY_INTERFACE_TYPE || super_name != NULL_TREE)
6818 CLASS_NAME (klass) = class_name;
6819 CLASS_SUPER_NAME (klass) = super_name;
6820 CLASS_CLS_METHODS (klass) = NULL_TREE;
6823 if (! objc_is_class_name (class_name)
6824 && (decl = lookup_name (class_name)))
6826 error ("%qE redeclared as different kind of symbol",
6827 class_name);
6828 error ("previous declaration of %q+D",
6829 decl);
6832 switch (code)
6834 case CLASS_IMPLEMENTATION_TYPE:
6836 tree chain;
6838 for (chain = implemented_classes; chain; chain = TREE_CHAIN (chain))
6839 if (TREE_VALUE (chain) == class_name)
6841 error ("reimplementation of class %qE",
6842 class_name);
6843 /* TODO: error message saying where it was previously
6844 implemented. */
6845 break;
6847 if (chain == NULL_TREE)
6848 implemented_classes = tree_cons (NULL_TREE, class_name,
6849 implemented_classes);
6852 /* Reset for multiple classes per file. */
6853 method_slot = 0;
6855 objc_implementation_context = klass;
6857 /* Lookup the interface for this implementation. */
6859 if (!(implementation_template = lookup_interface (class_name)))
6861 warning (0, "cannot find interface declaration for %qE",
6862 class_name);
6863 add_interface (implementation_template = objc_implementation_context,
6864 class_name);
6867 /* If a super class has been specified in the implementation,
6868 insure it conforms to the one specified in the interface. */
6870 if (super_name
6871 && (super_name != CLASS_SUPER_NAME (implementation_template)))
6873 tree previous_name = CLASS_SUPER_NAME (implementation_template);
6874 error ("conflicting super class name %qE",
6875 super_name);
6876 if (previous_name)
6877 error ("previous declaration of %qE", previous_name);
6878 else
6879 error ("previous declaration");
6882 else if (! super_name)
6884 CLASS_SUPER_NAME (objc_implementation_context)
6885 = CLASS_SUPER_NAME (implementation_template);
6887 break;
6889 case CLASS_INTERFACE_TYPE:
6890 if (lookup_interface (class_name))
6891 #ifdef OBJCPLUS
6892 error ("duplicate interface declaration for class %qE", class_name);
6893 #else
6894 warning (0, "duplicate interface declaration for class %qE", class_name);
6895 #endif
6896 else
6897 add_interface (klass, class_name);
6899 if (protocol_list)
6900 CLASS_PROTOCOL_LIST (klass)
6901 = lookup_and_install_protocols (protocol_list, /* definition_required */ true);
6903 if (attributes)
6905 tree attribute;
6906 for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
6908 tree name = TREE_PURPOSE (attribute);
6910 /* TODO: Document what the objc_exception attribute is/does. */
6911 /* We handle the 'deprecated' and (undocumented) 'objc_exception'
6912 attributes. */
6913 if (is_attribute_p ("deprecated", name))
6914 TREE_DEPRECATED (klass) = 1;
6915 else if (is_attribute_p ("objc_exception", name))
6916 CLASS_HAS_EXCEPTION_ATTR (klass) = 1;
6917 else
6918 /* Warn about and ignore all others for now, but store them. */
6919 warning (OPT_Wattributes, "%qE attribute directive ignored", name);
6921 TYPE_ATTRIBUTES (klass) = attributes;
6923 break;
6925 case CATEGORY_INTERFACE_TYPE:
6927 tree class_category_is_assoc_with;
6929 /* For a category, class_name is really the name of the class that
6930 the following set of methods will be associated with. We must
6931 find the interface so that can derive the objects template. */
6932 if (!(class_category_is_assoc_with = lookup_interface (class_name)))
6934 error ("cannot find interface declaration for %qE",
6935 class_name);
6936 exit (FATAL_EXIT_CODE);
6938 else
6940 if (TREE_DEPRECATED (class_category_is_assoc_with))
6941 warning (OPT_Wdeprecated_declarations, "class %qE is deprecated",
6942 class_name);
6944 if (super_name == NULL_TREE)
6946 /* This is a class extension. Get the original
6947 interface, and continue working on it. */
6948 objc_in_class_extension = true;
6949 klass = class_category_is_assoc_with;
6951 if (protocol_list)
6953 /* Append protocols to the original protocol
6954 list. */
6955 CLASS_PROTOCOL_LIST (klass)
6956 = chainon (CLASS_PROTOCOL_LIST (klass),
6957 lookup_and_install_protocols
6958 (protocol_list,
6959 /* definition_required */ true));
6962 else
6964 add_category (class_category_is_assoc_with, klass);
6966 if (protocol_list)
6967 CLASS_PROTOCOL_LIST (klass)
6968 = lookup_and_install_protocols
6969 (protocol_list, /* definition_required */ true);
6973 break;
6975 case CATEGORY_IMPLEMENTATION_TYPE:
6976 /* Reset for multiple classes per file. */
6977 method_slot = 0;
6979 objc_implementation_context = klass;
6981 /* For a category, class_name is really the name of the class that
6982 the following set of methods will be associated with. We must
6983 find the interface so that can derive the objects template. */
6985 if (!(implementation_template = lookup_interface (class_name)))
6987 error ("cannot find interface declaration for %qE",
6988 class_name);
6989 exit (FATAL_EXIT_CODE);
6991 break;
6992 default:
6993 gcc_unreachable ();
6995 return klass;
6998 static tree
6999 continue_class (tree klass)
7001 switch (TREE_CODE (klass))
7003 case CLASS_IMPLEMENTATION_TYPE:
7004 case CATEGORY_IMPLEMENTATION_TYPE:
7006 struct imp_entry *imp_entry;
7008 /* Check consistency of the instance variables. */
7010 if (CLASS_RAW_IVARS (klass))
7011 check_ivars (implementation_template, klass);
7013 /* code generation */
7014 #ifdef OBJCPLUS
7015 push_lang_context (lang_name_c);
7016 #endif
7017 build_private_template (implementation_template);
7018 uprivate_record = CLASS_STATIC_TEMPLATE (implementation_template);
7019 objc_instance_type = build_pointer_type (uprivate_record);
7021 imp_entry = ggc_alloc_imp_entry ();
7023 imp_entry->next = imp_list;
7024 imp_entry->imp_context = klass;
7025 imp_entry->imp_template = implementation_template;
7026 ucls_super_ref = uucls_super_ref = NULL;
7027 if (TREE_CODE (klass) == CLASS_IMPLEMENTATION_TYPE)
7029 imp_entry->class_decl = (*runtime.class_decl) (klass);
7030 imp_entry->meta_decl = (*runtime.metaclass_decl) (klass);
7032 else
7034 imp_entry->class_decl = (*runtime.category_decl) (klass);
7035 imp_entry->meta_decl = NULL;
7037 imp_entry->has_cxx_cdtors = 0;
7039 /* Append to front and increment count. */
7040 imp_list = imp_entry;
7041 if (TREE_CODE (klass) == CLASS_IMPLEMENTATION_TYPE)
7042 imp_count++;
7043 else
7044 cat_count++;
7045 #ifdef OBJCPLUS
7046 pop_lang_context ();
7047 #endif /* OBJCPLUS */
7049 return get_class_ivars (implementation_template, true);
7050 break;
7052 case CLASS_INTERFACE_TYPE:
7054 if (objc_in_class_extension)
7055 return NULL_TREE;
7056 #ifdef OBJCPLUS
7057 push_lang_context (lang_name_c);
7058 #endif /* OBJCPLUS */
7059 objc_collecting_ivars = 1;
7060 build_private_template (klass);
7061 objc_collecting_ivars = 0;
7062 #ifdef OBJCPLUS
7063 pop_lang_context ();
7064 #endif /* OBJCPLUS */
7065 return NULL_TREE;
7066 break;
7068 default:
7069 return error_mark_node;
7073 /* This routine builds name of the setter synthesized function. */
7074 char *
7075 objc_build_property_setter_name (tree ident)
7077 /* TODO: Use alloca to allocate buffer of appropriate size. */
7078 static char string[BUFSIZE];
7079 sprintf (string, "set%s:", IDENTIFIER_POINTER (ident));
7080 string[3] = TOUPPER (string[3]);
7081 return string;
7084 /* This routine prepares the declarations of the property accessor
7085 helper functions (objc_getProperty(), etc) that are used when
7086 @synthesize is used.
7088 runtime-specific routines are built in the respective runtime
7089 initialize functions. */
7090 static void
7091 build_common_objc_property_accessor_helpers (void)
7093 tree type;
7095 /* Declare the following function:
7097 objc_getProperty (id self, SEL _cmd,
7098 ptrdiff_t offset, BOOL is_atomic); */
7099 type = build_function_type_list (objc_object_type,
7100 objc_object_type,
7101 objc_selector_type,
7102 ptrdiff_type_node,
7103 boolean_type_node,
7104 NULL_TREE);
7105 objc_getProperty_decl = add_builtin_function ("objc_getProperty",
7106 type, 0, NOT_BUILT_IN,
7107 NULL, NULL_TREE);
7108 TREE_NOTHROW (objc_getProperty_decl) = 0;
7110 /* Declare the following function:
7111 void
7112 objc_setProperty (id self, SEL _cmd,
7113 ptrdiff_t offset, id new_value,
7114 BOOL is_atomic, BOOL should_copy); */
7115 type = build_function_type_list (void_type_node,
7116 objc_object_type,
7117 objc_selector_type,
7118 ptrdiff_type_node,
7119 objc_object_type,
7120 boolean_type_node,
7121 boolean_type_node,
7122 NULL_TREE);
7123 objc_setProperty_decl = add_builtin_function ("objc_setProperty",
7124 type, 0, NOT_BUILT_IN,
7125 NULL, NULL_TREE);
7126 TREE_NOTHROW (objc_setProperty_decl) = 0;
7129 /* This looks up an ivar in a class (including superclasses). */
7130 static tree
7131 lookup_ivar (tree interface, tree instance_variable_name)
7133 while (interface)
7135 tree decl_chain;
7137 for (decl_chain = CLASS_IVARS (interface); decl_chain; decl_chain = DECL_CHAIN (decl_chain))
7138 if (DECL_NAME (decl_chain) == instance_variable_name)
7139 return decl_chain;
7141 /* Not found. Search superclass if any. */
7142 if (CLASS_SUPER_NAME (interface))
7143 interface = lookup_interface (CLASS_SUPER_NAME (interface));
7146 return NULL_TREE;
7149 /* This routine synthesizes a 'getter' method. This is only called
7150 for @synthesize properties. */
7151 static void
7152 objc_synthesize_getter (tree klass, tree class_methods ATTRIBUTE_UNUSED, tree property)
7154 location_t location = DECL_SOURCE_LOCATION (property);
7155 tree fn, decl;
7156 tree body;
7157 tree ret_val;
7159 /* If user has implemented a getter with same name then do nothing. */
7160 if (lookup_method (CLASS_NST_METHODS (objc_implementation_context),
7161 PROPERTY_GETTER_NAME (property)))
7162 return;
7164 /* Find declaration of the property getter in the interface (or
7165 superclass, or protocol). There must be one. */
7166 decl = lookup_method_static (klass, PROPERTY_GETTER_NAME (property), 0);
7168 /* If one not declared in the interface, this condition has already
7169 been reported as user error (because property was not declared in
7170 the interface). */
7171 if (!decl)
7172 return;
7174 /* Adapt the 'decl'. Use the source location of the @synthesize
7175 statement for error messages. */
7176 decl = copy_node (decl);
7177 DECL_SOURCE_LOCATION (decl) = location;
7179 objc_start_method_definition (false /* is_class_method */, decl, NULL_TREE,
7180 NULL_TREE);
7181 body = c_begin_compound_stmt (true);
7183 /* Now we need to decide how we build the getter. There are three
7184 cases:
7186 for 'copy' or 'retain' properties we need to use the
7187 objc_getProperty() accessor helper which knows about retain and
7188 copy. It supports both 'nonatomic' and 'atomic' access.
7190 for 'nonatomic, assign' properties we can access the instance
7191 variable directly. 'nonatomic' means we don't have to use locks,
7192 and 'assign' means we don't have to worry about retain or copy.
7193 If you combine the two, it means we can just access the instance
7194 variable directly.
7196 for 'atomic, assign' properties we use objc_copyStruct() (for the
7197 next runtime) or objc_getPropertyStruct() (for the GNU runtime). */
7198 switch (PROPERTY_ASSIGN_SEMANTICS (property))
7200 case OBJC_PROPERTY_RETAIN:
7201 case OBJC_PROPERTY_COPY:
7203 /* We build "return objc_getProperty (self, _cmd, offset, is_atomic);" */
7204 tree cmd, ivar, offset, is_atomic;
7205 cmd = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
7207 /* Find the ivar to compute the offset. */
7208 ivar = lookup_ivar (klass, PROPERTY_IVAR_NAME (property));
7209 if (!ivar || is_private (ivar))
7211 /* This should never happen. */
7212 error_at (location,
7213 "can not find instance variable associated with property");
7214 ret_val = error_mark_node;
7215 break;
7217 offset = byte_position (ivar);
7219 if (PROPERTY_NONATOMIC (property))
7220 is_atomic = boolean_false_node;
7221 else
7222 is_atomic = boolean_true_node;
7224 ret_val = build_function_call
7225 (location,
7226 /* Function prototype. */
7227 objc_getProperty_decl,
7228 /* Parameters. */
7229 tree_cons /* self */
7230 (NULL_TREE, self_decl,
7231 tree_cons /* _cmd */
7232 (NULL_TREE, cmd,
7233 tree_cons /* offset */
7234 (NULL_TREE, offset,
7235 tree_cons /* is_atomic */
7236 (NULL_TREE, is_atomic, NULL_TREE)))));
7238 break;
7239 case OBJC_PROPERTY_ASSIGN:
7240 if (PROPERTY_NONATOMIC (property))
7242 /* We build "return self->PROPERTY_IVAR_NAME;" */
7243 ret_val = objc_lookup_ivar (NULL_TREE, PROPERTY_IVAR_NAME (property));
7244 break;
7246 else
7248 /* We build
7249 <property type> __objc_property_temp;
7250 objc_getPropertyStruct (&__objc_property_temp,
7251 &(self->PROPERTY_IVAR_NAME),
7252 sizeof (type of self->PROPERTY_IVAR_NAME),
7253 is_atomic,
7254 false)
7255 return __objc_property_temp;
7257 For the NeXT runtime, we need to use objc_copyStruct
7258 instead of objc_getPropertyStruct. */
7259 tree objc_property_temp_decl, function_decl, function_call;
7260 tree size_of, is_atomic;
7262 objc_property_temp_decl = objc_create_temporary_var (TREE_TYPE (property), "__objc_property_temp");
7263 DECL_SOURCE_LOCATION (objc_property_temp_decl) = location;
7264 objc_property_temp_decl = lang_hooks.decls.pushdecl (objc_property_temp_decl);
7266 /* sizeof (ivar type). Since the ivar and the property have
7267 the same type, there is no need to lookup the ivar. */
7268 size_of = c_sizeof_or_alignof_type (location, TREE_TYPE (property),
7269 true /* is_sizeof */,
7270 false /* complain */);
7272 if (PROPERTY_NONATOMIC (property))
7273 is_atomic = boolean_false_node;
7274 else
7275 is_atomic = boolean_true_node;
7277 if (objc_copyStruct_decl)
7278 function_decl = objc_copyStruct_decl;
7279 else
7280 function_decl = objc_getPropertyStruct_decl;
7282 function_call = build_function_call
7283 (location,
7284 /* Function prototype. */
7285 function_decl,
7286 /* Parameters. */
7287 tree_cons /* &__objc_property_temp_decl */
7288 /* Warning: note that using build_fold_addr_expr_loc()
7289 here causes invalid code to be generated. */
7290 (NULL_TREE, build_unary_op (location, ADDR_EXPR, objc_property_temp_decl, 0),
7291 tree_cons /* &(self->PROPERTY_IVAR_NAME); */
7292 (NULL_TREE, build_fold_addr_expr_loc (location,
7293 objc_lookup_ivar
7294 (NULL_TREE, PROPERTY_IVAR_NAME (property))),
7295 tree_cons /* sizeof (PROPERTY_IVAR) */
7296 (NULL_TREE, size_of,
7297 tree_cons /* is_atomic */
7298 (NULL_TREE, is_atomic,
7299 /* TODO: This is currently ignored by the GNU
7300 runtime, but what about the next one ? */
7301 tree_cons /* has_strong */
7302 (NULL_TREE, boolean_true_node, NULL_TREE))))));
7304 add_stmt (function_call);
7306 ret_val = objc_property_temp_decl;
7308 break;
7309 default:
7310 gcc_unreachable ();
7313 gcc_assert (ret_val);
7315 #ifdef OBJCPLUS
7316 finish_return_stmt (ret_val);
7317 #else
7318 c_finish_return (location, ret_val, NULL_TREE);
7319 #endif
7321 add_stmt (c_end_compound_stmt (location, body, true));
7322 fn = current_function_decl;
7323 #ifdef OBJCPLUS
7324 finish_function ();
7325 #endif
7326 objc_finish_method_definition (fn);
7329 /* This routine synthesizes a 'setter' method. */
7331 static void
7332 objc_synthesize_setter (tree klass, tree class_methods ATTRIBUTE_UNUSED, tree property)
7334 location_t location = DECL_SOURCE_LOCATION (property);
7335 tree fn, decl;
7336 tree body;
7337 tree new_value, statement;
7339 /* If user has implemented a setter with same name then do nothing. */
7340 if (lookup_method (CLASS_NST_METHODS (objc_implementation_context),
7341 PROPERTY_SETTER_NAME (property)))
7342 return;
7344 /* Find declaration of the property setter in the interface (or
7345 superclass, or protocol). There must be one. */
7346 decl = lookup_method_static (klass, PROPERTY_SETTER_NAME (property), 0);
7348 /* If one not declared in the interface, this condition has already
7349 been reported as user error (because property was not declared in
7350 the interface). */
7351 if (!decl)
7352 return;
7354 /* Adapt the 'decl'. Use the source location of the @synthesize
7355 statement for error messages. */
7356 decl = copy_node (decl);
7357 DECL_SOURCE_LOCATION (decl) = DECL_SOURCE_LOCATION (property);
7359 objc_start_method_definition (false /* is_class_method */, decl, NULL_TREE,
7360 NULL_TREE);
7362 body = c_begin_compound_stmt (true);
7364 /* The 'new_value' is the only argument to the method, which is the
7365 3rd argument of the function, after self and _cmd. We use twice
7366 TREE_CHAIN to move forward two arguments. */
7367 new_value = TREE_CHAIN (TREE_CHAIN (DECL_ARGUMENTS (current_function_decl)));
7369 /* This would presumably happen if the user has specified a
7370 prototype for the setter that does not have an argument! */
7371 if (new_value == NULL_TREE)
7373 /* TODO: This should be caught much earlier than this. */
7374 error_at (DECL_SOURCE_LOCATION (decl), "invalid setter, it must have one argument");
7375 /* Try to recover somehow. */
7376 new_value = error_mark_node;
7379 /* Now we need to decide how we build the setter. There are three
7380 cases:
7382 for 'copy' or 'retain' properties we need to use the
7383 objc_setProperty() accessor helper which knows about retain and
7384 copy. It supports both 'nonatomic' and 'atomic' access.
7386 for 'nonatomic, assign' properties we can access the instance
7387 variable directly. 'nonatomic' means we don't have to use locks,
7388 and 'assign' means we don't have to worry about retain or copy.
7389 If you combine the two, it means we can just access the instance
7390 variable directly.
7392 for 'atomic, assign' properties we use objc_copyStruct() (for the
7393 next runtime) or objc_setPropertyStruct() (for the GNU runtime). */
7394 switch (PROPERTY_ASSIGN_SEMANTICS (property))
7396 case OBJC_PROPERTY_RETAIN:
7397 case OBJC_PROPERTY_COPY:
7399 /* We build "objc_setProperty (self, _cmd, new_value, offset, is_atomic, should_copy);" */
7400 tree cmd, ivar, offset, is_atomic, should_copy;
7401 cmd = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
7403 /* Find the ivar to compute the offset. */
7404 ivar = lookup_ivar (klass, PROPERTY_IVAR_NAME (property));
7405 if (!ivar || is_private (ivar))
7407 error_at (location,
7408 "can not find instance variable associated with property");
7409 statement = error_mark_node;
7410 break;
7412 offset = byte_position (ivar);
7414 if (PROPERTY_NONATOMIC (property))
7415 is_atomic = boolean_false_node;
7416 else
7417 is_atomic = boolean_true_node;
7419 if (PROPERTY_ASSIGN_SEMANTICS (property) == OBJC_PROPERTY_COPY)
7420 should_copy = boolean_true_node;
7421 else
7422 should_copy = boolean_false_node;
7424 statement = build_function_call
7425 (location,
7426 /* Function prototype. */
7427 objc_setProperty_decl,
7428 /* Parameters. */
7429 tree_cons /* self */
7430 (NULL_TREE, self_decl,
7431 tree_cons /* _cmd */
7432 (NULL_TREE, cmd,
7433 tree_cons /* offset */
7434 (NULL_TREE, offset,
7435 tree_cons /* new_value */
7436 (NULL_TREE, new_value,
7437 tree_cons /* is_atomic */
7438 (NULL_TREE, is_atomic,
7439 tree_cons /* should_copy */
7440 (NULL_TREE, should_copy, NULL_TREE)))))));
7442 break;
7443 case OBJC_PROPERTY_ASSIGN:
7444 if (PROPERTY_NONATOMIC (property))
7446 /* We build "self->PROPERTY_IVAR_NAME = new_value;" */
7447 statement = build_modify_expr
7448 (location,
7449 objc_lookup_ivar (NULL_TREE, PROPERTY_IVAR_NAME (property)),
7450 NULL_TREE, NOP_EXPR,
7451 location, new_value, NULL_TREE);
7452 break;
7454 else
7456 /* We build
7457 objc_setPropertyStruct (&(self->PROPERTY_IVAR_NAME),
7458 &new_value,
7459 sizeof (type of self->PROPERTY_IVAR_NAME),
7460 is_atomic,
7461 false)
7463 For the NeXT runtime, we need to use objc_copyStruct
7464 instead of objc_getPropertyStruct. */
7465 tree function_decl, size_of, is_atomic;
7467 /* sizeof (ivar type). Since the ivar and the property have
7468 the same type, there is no need to lookup the ivar. */
7469 size_of = c_sizeof_or_alignof_type (location, TREE_TYPE (property),
7470 true /* is_sizeof */,
7471 false /* complain */);
7473 if (PROPERTY_NONATOMIC (property))
7474 is_atomic = boolean_false_node;
7475 else
7476 is_atomic = boolean_true_node;
7478 if (objc_copyStruct_decl)
7479 function_decl = objc_copyStruct_decl;
7480 else
7481 function_decl = objc_setPropertyStruct_decl;
7483 statement = build_function_call
7484 (location,
7485 /* Function prototype. */
7486 function_decl,
7487 /* Parameters. */
7488 tree_cons /* &(self->PROPERTY_IVAR_NAME); */
7489 (NULL_TREE, build_fold_addr_expr_loc (location,
7490 objc_lookup_ivar
7491 (NULL_TREE, PROPERTY_IVAR_NAME (property))),
7492 tree_cons /* &new_value */
7493 (NULL_TREE, build_fold_addr_expr_loc (location, new_value),
7494 tree_cons /* sizeof (PROPERTY_IVAR) */
7495 (NULL_TREE, size_of,
7496 tree_cons /* is_atomic */
7497 (NULL_TREE, is_atomic,
7498 /* TODO: This is currently ignored by the GNU
7499 runtime, but what about the next one ? */
7500 tree_cons /* has_strong */
7501 (NULL_TREE, boolean_true_node, NULL_TREE))))));
7503 break;
7504 default:
7505 gcc_unreachable ();
7507 gcc_assert (statement);
7509 add_stmt (statement);
7510 add_stmt (c_end_compound_stmt (location, body, true));
7511 fn = current_function_decl;
7512 #ifdef OBJCPLUS
7513 finish_function ();
7514 #endif
7515 objc_finish_method_definition (fn);
7518 /* This function is a sub-routine of objc_add_synthesize_declaration.
7519 It is called for each property to synthesize once we have
7520 determined that the context is Ok. */
7521 static void
7522 objc_add_synthesize_declaration_for_property (location_t location, tree interface,
7523 tree property_name, tree ivar_name)
7525 /* Find the @property declaration. */
7526 tree property;
7527 tree x;
7529 /* Check that synthesize or dynamic has not already been used for
7530 the same property. */
7531 for (property = IMPL_PROPERTY_DECL (objc_implementation_context); property; property = TREE_CHAIN (property))
7532 if (PROPERTY_NAME (property) == property_name)
7534 location_t original_location = DECL_SOURCE_LOCATION (property);
7536 if (PROPERTY_DYNAMIC (property))
7537 error_at (location, "property %qs already specified in %<@dynamic%>",
7538 IDENTIFIER_POINTER (property_name));
7539 else
7540 error_at (location, "property %qs already specified in %<@synthesize%>",
7541 IDENTIFIER_POINTER (property_name));
7543 if (original_location != UNKNOWN_LOCATION)
7544 inform (original_location, "originally specified here");
7545 return;
7548 /* Check that the property is declared in the interface. It could
7549 also be declared in a superclass or protocol. */
7550 property = lookup_property (interface, property_name);
7552 if (!property)
7554 error_at (location, "no declaration of property %qs found in the interface",
7555 IDENTIFIER_POINTER (property_name));
7556 return;
7558 else
7560 /* We have to copy the property, because we want to chain it to
7561 the implementation context, and we want to store the source
7562 location of the @synthesize, not of the original
7563 @property. */
7564 property = copy_node (property);
7565 DECL_SOURCE_LOCATION (property) = location;
7568 /* Determine PROPERTY_IVAR_NAME. */
7569 if (ivar_name == NULL_TREE)
7570 ivar_name = property_name;
7572 /* Check that the instance variable exists. You can only use an
7573 instance variable from the same class, not one from the
7574 superclass (this makes sense as it allows us to check that an
7575 instance variable is only used in one synthesized property). */
7577 tree ivar = is_ivar (CLASS_IVARS (interface), ivar_name);
7578 tree type_of_ivar;
7579 if (!ivar)
7581 error_at (location, "ivar %qs used by %<@synthesize%> declaration must be an existing ivar",
7582 IDENTIFIER_POINTER (property_name));
7583 return;
7586 if (DECL_BIT_FIELD_TYPE (ivar))
7587 type_of_ivar = DECL_BIT_FIELD_TYPE (ivar);
7588 else
7589 type_of_ivar = TREE_TYPE (ivar);
7591 /* If the instance variable has a different C type, we throw an error ... */
7592 if (!comptypes (TREE_TYPE (property), type_of_ivar)
7593 /* ... unless the property is readonly, in which case we allow
7594 the instance variable to be more specialized (this means we
7595 can generate the getter all right and it works). */
7596 && (!PROPERTY_READONLY (property)
7597 || !objc_compare_types (TREE_TYPE (property),
7598 type_of_ivar, -5, NULL_TREE)))
7600 location_t original_location = DECL_SOURCE_LOCATION (ivar);
7602 error_at (location, "property %qs is using instance variable %qs of incompatible type",
7603 IDENTIFIER_POINTER (property_name),
7604 IDENTIFIER_POINTER (ivar_name));
7606 if (original_location != UNKNOWN_LOCATION)
7607 inform (original_location, "originally specified here");
7610 /* If the instance variable is a bitfield, the property must be
7611 'assign', 'nonatomic' because the runtime getter/setter helper
7612 do not work with bitfield instance variables. */
7613 if (DECL_BIT_FIELD_TYPE (ivar))
7615 /* If there is an error, we return and not generate any
7616 getter/setter because trying to set up the runtime
7617 getter/setter helper calls with bitfields is at high risk
7618 of ICE. */
7620 if (PROPERTY_ASSIGN_SEMANTICS (property) != OBJC_PROPERTY_ASSIGN)
7622 location_t original_location = DECL_SOURCE_LOCATION (ivar);
7624 error_at (location, "'assign' property %qs is using bit-field instance variable %qs",
7625 IDENTIFIER_POINTER (property_name),
7626 IDENTIFIER_POINTER (ivar_name));
7628 if (original_location != UNKNOWN_LOCATION)
7629 inform (original_location, "originally specified here");
7630 return;
7633 if (!PROPERTY_NONATOMIC (property))
7635 location_t original_location = DECL_SOURCE_LOCATION (ivar);
7637 error_at (location, "'atomic' property %qs is using bit-field instance variable %qs",
7638 IDENTIFIER_POINTER (property_name),
7639 IDENTIFIER_POINTER (ivar_name));
7641 if (original_location != UNKNOWN_LOCATION)
7642 inform (original_location, "originally specified here");
7643 return;
7648 /* Check that no other property is using the same instance
7649 variable. */
7650 for (x = IMPL_PROPERTY_DECL (objc_implementation_context); x; x = TREE_CHAIN (x))
7651 if (PROPERTY_IVAR_NAME (x) == ivar_name)
7653 location_t original_location = DECL_SOURCE_LOCATION (x);
7655 error_at (location, "property %qs is using the same instance variable as property %qs",
7656 IDENTIFIER_POINTER (property_name),
7657 IDENTIFIER_POINTER (PROPERTY_NAME (x)));
7659 if (original_location != UNKNOWN_LOCATION)
7660 inform (original_location, "originally specified here");
7662 /* We keep going on. This won't cause the compiler to fail;
7663 the failure would most likely be at runtime. */
7666 /* Note that a @synthesize (and only a @synthesize) always sets
7667 PROPERTY_IVAR_NAME to a non-NULL_TREE. You can recognize a
7668 @synthesize by that. */
7669 PROPERTY_IVAR_NAME (property) = ivar_name;
7671 /* PROPERTY_SETTER_NAME and PROPERTY_GETTER_NAME are copied from the
7672 original declaration; they are always set (with the exception of
7673 PROPERTY_SETTER_NAME not being set if PROPERTY_READONLY == 1). */
7675 /* Add the property to the list of properties for current implementation. */
7676 TREE_CHAIN (property) = IMPL_PROPERTY_DECL (objc_implementation_context);
7677 IMPL_PROPERTY_DECL (objc_implementation_context) = property;
7679 /* Note how we don't actually synthesize the getter/setter here; it
7680 would be very natural, but we may miss the fact that the user has
7681 implemented his own getter/setter later on in the @implementation
7682 (in which case we shouldn't generate getter/setter). We wait
7683 until we have parsed it all before generating the code. */
7686 /* This function is called by the parser after a @synthesize
7687 expression is parsed. 'location' is the location of the
7688 @synthesize expression, and 'property_and_ivar_list' is a chained
7689 list of the property and ivar names. */
7690 void
7691 objc_add_synthesize_declaration (location_t location, tree property_and_ivar_list)
7693 tree interface, chain;
7695 if (flag_objc1_only)
7696 error_at (input_location, "%<@synthesize%> is not available in Objective-C 1.0");
7698 if (property_and_ivar_list == error_mark_node)
7699 return;
7701 if (!objc_implementation_context)
7703 /* We can get here only in Objective-C; the Objective-C++ parser
7704 detects the problem while parsing, outputs the error
7705 "misplaced '@synthesize' Objective-C++ construct" and skips
7706 the declaration. */
7707 error_at (location, "%<@synthesize%> not in @implementation context");
7708 return;
7711 if (TREE_CODE (objc_implementation_context) == CATEGORY_IMPLEMENTATION_TYPE)
7713 error_at (location, "%<@synthesize%> can not be used in categories");
7714 return;
7717 interface = lookup_interface (CLASS_NAME (objc_implementation_context));
7718 if (!interface)
7720 /* I can't see how this could happen, but it is good as a safety check. */
7721 error_at (location,
7722 "%<@synthesize%> requires the @interface of the class to be available");
7723 return;
7726 /* Now, iterate over the properties and do each of them. */
7727 for (chain = property_and_ivar_list; chain; chain = TREE_CHAIN (chain))
7729 objc_add_synthesize_declaration_for_property (location, interface, TREE_VALUE (chain),
7730 TREE_PURPOSE (chain));
7734 /* This function is a sub-routine of objc_add_dynamic_declaration. It
7735 is called for each property to mark as dynamic once we have
7736 determined that the context is Ok. */
7737 static void
7738 objc_add_dynamic_declaration_for_property (location_t location, tree interface,
7739 tree property_name)
7741 /* Find the @property declaration. */
7742 tree property;
7744 /* Check that synthesize or dynamic has not already been used for
7745 the same property. */
7746 for (property = IMPL_PROPERTY_DECL (objc_implementation_context); property; property = TREE_CHAIN (property))
7747 if (PROPERTY_NAME (property) == property_name)
7749 location_t original_location = DECL_SOURCE_LOCATION (property);
7751 if (PROPERTY_DYNAMIC (property))
7752 error_at (location, "property %qs already specified in %<@dynamic%>",
7753 IDENTIFIER_POINTER (property_name));
7754 else
7755 error_at (location, "property %qs already specified in %<@synthesize%>",
7756 IDENTIFIER_POINTER (property_name));
7758 if (original_location != UNKNOWN_LOCATION)
7759 inform (original_location, "originally specified here");
7760 return;
7763 /* Check that the property is declared in the interface. It could
7764 also be declared in a superclass or protocol. */
7765 property = lookup_property (interface, property_name);
7767 if (!property)
7769 error_at (location, "no declaration of property %qs found in the interface",
7770 IDENTIFIER_POINTER (property_name));
7771 return;
7773 else
7775 /* We have to copy the property, because we want to chain it to
7776 the implementation context, and we want to store the source
7777 location of the @synthesize, not of the original
7778 @property. */
7779 property = copy_node (property);
7780 DECL_SOURCE_LOCATION (property) = location;
7783 /* Note that a @dynamic (and only a @dynamic) always sets
7784 PROPERTY_DYNAMIC to 1. You can recognize a @dynamic by that.
7785 (actually, as explained above, PROPERTY_DECL generated by
7786 @property and associated with a @dynamic property are also marked
7787 as PROPERTY_DYNAMIC). */
7788 PROPERTY_DYNAMIC (property) = 1;
7790 /* Add the property to the list of properties for current implementation. */
7791 TREE_CHAIN (property) = IMPL_PROPERTY_DECL (objc_implementation_context);
7792 IMPL_PROPERTY_DECL (objc_implementation_context) = property;
7795 /* This function is called by the parser after a @dynamic expression
7796 is parsed. 'location' is the location of the @dynamic expression,
7797 and 'property_list' is a chained list of all the property
7798 names. */
7799 void
7800 objc_add_dynamic_declaration (location_t location, tree property_list)
7802 tree interface, chain;
7804 if (flag_objc1_only)
7805 error_at (input_location, "%<@dynamic%> is not available in Objective-C 1.0");
7807 if (property_list == error_mark_node)
7808 return;
7810 if (!objc_implementation_context)
7812 /* We can get here only in Objective-C; the Objective-C++ parser
7813 detects the problem while parsing, outputs the error
7814 "misplaced '@dynamic' Objective-C++ construct" and skips the
7815 declaration. */
7816 error_at (location, "%<@dynamic%> not in @implementation context");
7817 return;
7820 /* @dynamic is allowed in categories. */
7821 switch (TREE_CODE (objc_implementation_context))
7823 case CLASS_IMPLEMENTATION_TYPE:
7824 interface = lookup_interface (CLASS_NAME (objc_implementation_context));
7825 break;
7826 case CATEGORY_IMPLEMENTATION_TYPE:
7827 interface = lookup_category (implementation_template,
7828 CLASS_SUPER_NAME (objc_implementation_context));
7829 break;
7830 default:
7831 gcc_unreachable ();
7834 if (!interface)
7836 /* I can't see how this could happen, but it is good as a safety check. */
7837 error_at (location,
7838 "%<@dynamic%> requires the @interface of the class to be available");
7839 return;
7842 /* Now, iterate over the properties and do each of them. */
7843 for (chain = property_list; chain; chain = TREE_CHAIN (chain))
7845 objc_add_dynamic_declaration_for_property (location, interface, TREE_VALUE (chain));
7849 /* Main routine to generate code/data for all the property information for
7850 current implementation (class or category). CLASS is the interface where
7851 ivars are declared. CLASS_METHODS is where methods are found which
7852 could be a class or a category depending on whether we are implementing
7853 property of a class or a category. */
7855 static void
7856 objc_gen_property_data (tree klass, tree class_methods)
7858 tree x;
7860 for (x = IMPL_PROPERTY_DECL (objc_implementation_context); x; x = TREE_CHAIN (x))
7862 /* @dynamic property - nothing to check or synthesize. */
7863 if (PROPERTY_DYNAMIC (x))
7864 continue;
7866 /* @synthesize property - need to synthesize the accessors. */
7867 if (PROPERTY_IVAR_NAME (x))
7869 objc_synthesize_getter (klass, class_methods, x);
7871 if (PROPERTY_READONLY (x) == 0)
7872 objc_synthesize_setter (klass, class_methods, x);
7874 continue;
7877 gcc_unreachable ();
7881 /* This is called once we see the "@end" in an interface/implementation. */
7883 static void
7884 finish_class (tree klass)
7886 switch (TREE_CODE (klass))
7888 case CLASS_IMPLEMENTATION_TYPE:
7890 /* All metadata generation is done in runtime.generate_metadata(). */
7892 /* Generate what needed for property; setters, getters, etc. */
7893 objc_gen_property_data (implementation_template, implementation_template);
7895 if (implementation_template != objc_implementation_context)
7897 /* Ensure that all method listed in the interface contain bodies. */
7898 check_methods (CLASS_CLS_METHODS (implementation_template),
7899 objc_implementation_context, '+');
7900 check_methods (CLASS_NST_METHODS (implementation_template),
7901 objc_implementation_context, '-');
7903 if (CLASS_PROTOCOL_LIST (implementation_template))
7904 check_protocols (CLASS_PROTOCOL_LIST (implementation_template),
7905 "class",
7906 CLASS_NAME (objc_implementation_context));
7908 break;
7910 case CATEGORY_IMPLEMENTATION_TYPE:
7912 tree category = lookup_category (implementation_template, CLASS_SUPER_NAME (klass));
7914 if (category)
7916 /* Generate what needed for property; setters, getters, etc. */
7917 objc_gen_property_data (implementation_template, category);
7919 /* Ensure all method listed in the interface contain bodies. */
7920 check_methods (CLASS_CLS_METHODS (category),
7921 objc_implementation_context, '+');
7922 check_methods (CLASS_NST_METHODS (category),
7923 objc_implementation_context, '-');
7925 if (CLASS_PROTOCOL_LIST (category))
7926 check_protocols (CLASS_PROTOCOL_LIST (category),
7927 "category",
7928 CLASS_SUPER_NAME (objc_implementation_context));
7930 break;
7932 case CLASS_INTERFACE_TYPE:
7933 case CATEGORY_INTERFACE_TYPE:
7934 case PROTOCOL_INTERFACE_TYPE:
7936 /* Process properties of the class. */
7937 tree x;
7938 for (x = CLASS_PROPERTY_DECL (objc_interface_context); x; x = TREE_CHAIN (x))
7940 /* Now we check that the appropriate getter is declared,
7941 and if not, we declare one ourselves. */
7942 tree getter_decl = lookup_method (CLASS_NST_METHODS (klass),
7943 PROPERTY_GETTER_NAME (x));
7945 if (getter_decl)
7947 /* TODO: Check that the declaration is consistent with the property. */
7950 else
7952 /* Generate an instance method declaration for the
7953 getter; for example "- (id) name;". In general it
7954 will be of the form
7955 -(type)property_getter_name; */
7956 tree rettype = build_tree_list (NULL_TREE, TREE_TYPE (x));
7957 getter_decl = build_method_decl (INSTANCE_METHOD_DECL,
7958 rettype, PROPERTY_GETTER_NAME (x),
7959 NULL_TREE, false);
7960 if (PROPERTY_OPTIONAL (x))
7961 objc_add_method (objc_interface_context, getter_decl, false, true);
7962 else
7963 objc_add_method (objc_interface_context, getter_decl, false, false);
7964 TREE_DEPRECATED (getter_decl) = TREE_DEPRECATED (x);
7965 METHOD_PROPERTY_CONTEXT (getter_decl) = x;
7968 if (PROPERTY_READONLY (x) == 0)
7970 /* Now we check that the appropriate setter is declared,
7971 and if not, we declare on ourselves. */
7972 tree setter_decl = lookup_method (CLASS_NST_METHODS (klass),
7973 PROPERTY_SETTER_NAME (x));
7975 if (setter_decl)
7977 /* TODO: Check that the declaration is consistent with the property. */
7980 else
7982 /* The setter name is something like 'setName:'.
7983 We need the substring 'setName' to build the
7984 method declaration due to how the declaration
7985 works. TODO: build_method_decl() will then
7986 generate back 'setName:' from 'setName'; it
7987 would be more efficient to hook into there. */
7988 const char *full_setter_name = IDENTIFIER_POINTER (PROPERTY_SETTER_NAME (x));
7989 size_t length = strlen (full_setter_name);
7990 char *setter_name = (char *) alloca (length);
7991 tree ret_type, selector, arg_type, arg_name;
7993 strcpy (setter_name, full_setter_name);
7994 setter_name[length - 1] = '\0';
7995 ret_type = build_tree_list (NULL_TREE, void_type_node);
7996 arg_type = build_tree_list (NULL_TREE, TREE_TYPE (x));
7997 arg_name = get_identifier ("_value");
7998 selector = objc_build_keyword_decl (get_identifier (setter_name),
7999 arg_type, arg_name, NULL);
8000 setter_decl = build_method_decl (INSTANCE_METHOD_DECL,
8001 ret_type, selector,
8002 build_tree_list (NULL_TREE, NULL_TREE),
8003 false);
8004 if (PROPERTY_OPTIONAL (x))
8005 objc_add_method (objc_interface_context, setter_decl, false, true);
8006 else
8007 objc_add_method (objc_interface_context, setter_decl, false, false);
8008 TREE_DEPRECATED (setter_decl) = TREE_DEPRECATED (x);
8009 METHOD_PROPERTY_CONTEXT (setter_decl) = x;
8013 break;
8015 default:
8016 gcc_unreachable ();
8017 break;
8021 static tree
8022 add_protocol (tree protocol)
8024 /* Put protocol on list in reverse order. */
8025 TREE_CHAIN (protocol) = protocol_chain;
8026 protocol_chain = protocol;
8027 return protocol_chain;
8030 /* Check that a protocol is defined, and, recursively, that all
8031 protocols that this protocol conforms to are defined too. */
8032 static void
8033 check_that_protocol_is_defined (tree protocol)
8035 if (!PROTOCOL_DEFINED (protocol))
8036 warning (0, "definition of protocol %qE not found",
8037 PROTOCOL_NAME (protocol));
8039 /* If the protocol itself conforms to other protocols, check them
8040 too, recursively. */
8041 if (PROTOCOL_LIST (protocol))
8043 tree p;
8045 for (p = PROTOCOL_LIST (protocol); p; p = TREE_CHAIN (p))
8046 check_that_protocol_is_defined (TREE_VALUE (p));
8050 /* Looks up a protocol. If 'warn_if_deprecated' is true, a warning is
8051 emitted if the protocol is deprecated. If 'definition_required' is
8052 true, a warning is emitted if a full @protocol definition has not
8053 been seen. */
8054 static tree
8055 lookup_protocol (tree ident, bool warn_if_deprecated, bool definition_required)
8057 tree chain;
8059 for (chain = protocol_chain; chain; chain = TREE_CHAIN (chain))
8060 if (ident == PROTOCOL_NAME (chain))
8062 if (warn_if_deprecated && TREE_DEPRECATED (chain))
8064 /* It would be nice to use warn_deprecated_use() here, but
8065 we are using TREE_CHAIN (which is supposed to be the
8066 TYPE_STUB_DECL for a TYPE) for something different. */
8067 warning (OPT_Wdeprecated_declarations, "protocol %qE is deprecated",
8068 PROTOCOL_NAME (chain));
8071 if (definition_required)
8072 check_that_protocol_is_defined (chain);
8074 return chain;
8077 return NULL_TREE;
8080 /* This function forward declares the protocols named by NAMES. If
8081 they are already declared or defined, the function has no effect. */
8083 void
8084 objc_declare_protocol (tree name, tree attributes)
8086 bool deprecated = false;
8088 #ifdef OBJCPLUS
8089 if (current_namespace != global_namespace) {
8090 error ("Objective-C declarations may only appear in global scope");
8092 #endif /* OBJCPLUS */
8094 /* Determine if 'deprecated', the only attribute we recognize for
8095 protocols, was used. Ignore all other attributes. */
8096 if (attributes)
8098 tree attribute;
8099 for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
8101 tree name = TREE_PURPOSE (attribute);
8103 if (is_attribute_p ("deprecated", name))
8104 deprecated = true;
8105 else
8106 warning (OPT_Wattributes, "%qE attribute directive ignored", name);
8110 if (lookup_protocol (name, /* warn if deprecated */ false,
8111 /* definition_required */ false) == NULL_TREE)
8113 tree protocol = make_node (PROTOCOL_INTERFACE_TYPE);
8115 TYPE_LANG_SLOT_1 (protocol)
8116 = make_tree_vec (PROTOCOL_LANG_SLOT_ELTS);
8117 PROTOCOL_NAME (protocol) = name;
8118 PROTOCOL_LIST (protocol) = NULL_TREE;
8119 add_protocol (protocol);
8120 PROTOCOL_DEFINED (protocol) = 0;
8121 PROTOCOL_FORWARD_DECL (protocol) = NULL_TREE;
8123 if (attributes)
8125 /* TODO: Do we need to store the attributes here ? */
8126 TYPE_ATTRIBUTES (protocol) = attributes;
8127 if (deprecated)
8128 TREE_DEPRECATED (protocol) = 1;
8133 static tree
8134 start_protocol (enum tree_code code, tree name, tree list, tree attributes)
8136 tree protocol;
8137 bool deprecated = false;
8139 #ifdef OBJCPLUS
8140 if (current_namespace != global_namespace) {
8141 error ("Objective-C declarations may only appear in global scope");
8143 #endif /* OBJCPLUS */
8145 /* Determine if 'deprecated', the only attribute we recognize for
8146 protocols, was used. Ignore all other attributes. */
8147 if (attributes)
8149 tree attribute;
8150 for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
8152 tree name = TREE_PURPOSE (attribute);
8154 if (is_attribute_p ("deprecated", name))
8155 deprecated = true;
8156 else
8157 warning (OPT_Wattributes, "%qE attribute directive ignored", name);
8161 protocol = lookup_protocol (name, /* warn_if_deprecated */ false,
8162 /* definition_required */ false);
8164 if (!protocol)
8166 protocol = make_node (code);
8167 TYPE_LANG_SLOT_1 (protocol) = make_tree_vec (PROTOCOL_LANG_SLOT_ELTS);
8169 PROTOCOL_NAME (protocol) = name;
8170 PROTOCOL_LIST (protocol) = lookup_and_install_protocols (list, /* definition_required */ false);
8171 add_protocol (protocol);
8172 PROTOCOL_DEFINED (protocol) = 1;
8173 PROTOCOL_FORWARD_DECL (protocol) = NULL_TREE;
8175 check_protocol_recursively (protocol, list);
8177 else if (! PROTOCOL_DEFINED (protocol))
8179 PROTOCOL_DEFINED (protocol) = 1;
8180 PROTOCOL_LIST (protocol) = lookup_and_install_protocols (list, /* definition_required */ false);
8182 check_protocol_recursively (protocol, list);
8184 else
8186 warning (0, "duplicate declaration for protocol %qE",
8187 name);
8190 if (attributes)
8192 TYPE_ATTRIBUTES (protocol) = attributes;
8193 if (deprecated)
8194 TREE_DEPRECATED (protocol) = 1;
8197 return protocol;
8200 /* Decay array and function parameters into pointers. */
8202 static tree
8203 objc_decay_parm_type (tree type)
8205 if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == FUNCTION_TYPE)
8206 type = build_pointer_type (TREE_CODE (type) == ARRAY_TYPE
8207 ? TREE_TYPE (type)
8208 : type);
8210 return type;
8213 static GTY(()) tree objc_parmlist = NULL_TREE;
8215 /* Append PARM to a list of formal parameters of a method, making a necessary
8216 array-to-pointer adjustment along the way. */
8218 void
8219 objc_push_parm (tree parm)
8221 tree type;
8223 if (TREE_TYPE (parm) == error_mark_node)
8225 objc_parmlist = chainon (objc_parmlist, parm);
8226 return;
8229 /* Decay arrays and functions into pointers. */
8230 type = objc_decay_parm_type (TREE_TYPE (parm));
8232 /* If the parameter type has been decayed, a new PARM_DECL needs to be
8233 built as well. */
8234 if (type != TREE_TYPE (parm))
8235 parm = build_decl (input_location, PARM_DECL, DECL_NAME (parm), type);
8237 DECL_ARG_TYPE (parm)
8238 = lang_hooks.types.type_promotes_to (TREE_TYPE (parm));
8240 /* Record constancy and volatility. */
8241 c_apply_type_quals_to_decl
8242 ((TYPE_READONLY (TREE_TYPE (parm)) ? TYPE_QUAL_CONST : 0)
8243 | (TYPE_RESTRICT (TREE_TYPE (parm)) ? TYPE_QUAL_RESTRICT : 0)
8244 | (TYPE_VOLATILE (TREE_TYPE (parm)) ? TYPE_QUAL_VOLATILE : 0), parm);
8246 objc_parmlist = chainon (objc_parmlist, parm);
8249 /* Retrieve the formal parameter list constructed via preceding calls to
8250 objc_push_parm(). */
8252 #ifdef OBJCPLUS
8253 tree
8254 objc_get_parm_info (int have_ellipsis ATTRIBUTE_UNUSED,
8255 tree expr ATTRIBUTE_UNUSED)
8257 tree parm_info = objc_parmlist;
8258 objc_parmlist = NULL_TREE;
8260 return parm_info;
8262 #else
8263 struct c_arg_info *
8264 objc_get_parm_info (int have_ellipsis, tree expr)
8266 tree parm_info = objc_parmlist;
8267 struct c_arg_info *arg_info;
8268 /* The C front-end requires an elaborate song and dance at
8269 this point. */
8270 push_scope ();
8271 declare_parm_level ();
8272 while (parm_info)
8274 tree next = DECL_CHAIN (parm_info);
8276 DECL_CHAIN (parm_info) = NULL_TREE;
8277 parm_info = pushdecl (parm_info);
8278 finish_decl (parm_info, input_location, NULL_TREE, NULL_TREE, NULL_TREE);
8279 parm_info = next;
8281 arg_info = get_parm_info (have_ellipsis, expr);
8282 pop_scope ();
8283 objc_parmlist = NULL_TREE;
8284 return arg_info;
8286 #endif
8288 /* Synthesize the formal parameters 'id self' and 'SEL _cmd' needed for ObjC
8289 method definitions. In the case of instance methods, we can be more
8290 specific as to the type of 'self'. */
8292 static void
8293 synth_self_and_ucmd_args (void)
8295 tree self_type;
8297 if (objc_method_context
8298 && TREE_CODE (objc_method_context) == INSTANCE_METHOD_DECL)
8299 self_type = objc_instance_type;
8300 else
8301 /* Really a `struct objc_class *'. However, we allow people to
8302 assign to self, which changes its type midstream. */
8303 self_type = objc_object_type;
8305 /* id self; */
8306 objc_push_parm (build_decl (input_location,
8307 PARM_DECL, self_id, self_type));
8309 /* SEL _cmd; */
8310 objc_push_parm (build_decl (input_location,
8311 PARM_DECL, ucmd_id, objc_selector_type));
8314 /* Transform an Objective-C method definition into a static C function
8315 definition, synthesizing the first two arguments, "self" and "_cmd",
8316 in the process. EXPR is NULL or an expression that needs to be
8317 evaluated for the side effects of array size expressions in the
8318 parameters. */
8320 static void
8321 start_method_def (tree method, tree expr)
8323 tree parmlist;
8324 #ifdef OBJCPLUS
8325 tree parm_info;
8326 #else
8327 struct c_arg_info *parm_info;
8328 #endif
8329 int have_ellipsis = 0;
8331 /* If we are defining a "dealloc" method in a non-root class, we
8332 will need to check if a [super dealloc] is missing, and warn if
8333 it is. */
8334 if(CLASS_SUPER_NAME (objc_implementation_context)
8335 && !strcmp ("dealloc", IDENTIFIER_POINTER (METHOD_SEL_NAME (method))))
8336 should_call_super_dealloc = 1;
8337 else
8338 should_call_super_dealloc = 0;
8340 /* Required to implement _msgSuper. */
8341 objc_method_context = method;
8342 UOBJC_SUPER_decl = NULL_TREE;
8344 /* Generate prototype declarations for arguments..."new-style". */
8345 synth_self_and_ucmd_args ();
8347 /* Generate argument declarations if a keyword_decl. */
8348 parmlist = METHOD_SEL_ARGS (method);
8349 while (parmlist)
8351 /* parmlist is a KEYWORD_DECL. */
8352 tree type = TREE_VALUE (TREE_TYPE (parmlist));
8353 tree parm;
8355 parm = build_decl (input_location,
8356 PARM_DECL, KEYWORD_ARG_NAME (parmlist), type);
8357 decl_attributes (&parm, DECL_ATTRIBUTES (parmlist), 0);
8358 objc_push_parm (parm);
8359 parmlist = DECL_CHAIN (parmlist);
8362 if (METHOD_ADD_ARGS (method))
8364 tree akey;
8366 for (akey = TREE_CHAIN (METHOD_ADD_ARGS (method));
8367 akey; akey = TREE_CHAIN (akey))
8369 objc_push_parm (TREE_VALUE (akey));
8372 if (METHOD_ADD_ARGS_ELLIPSIS_P (method))
8373 have_ellipsis = 1;
8376 parm_info = objc_get_parm_info (have_ellipsis, expr);
8378 really_start_method (objc_method_context, parm_info);
8381 /* Return 1 if TYPE1 is equivalent to TYPE2 for purposes of method
8382 overloading. */
8383 static int
8384 objc_types_are_equivalent (tree type1, tree type2)
8386 if (type1 == type2)
8387 return 1;
8389 /* Strip away indirections. */
8390 while ((TREE_CODE (type1) == ARRAY_TYPE || TREE_CODE (type1) == POINTER_TYPE)
8391 && (TREE_CODE (type1) == TREE_CODE (type2)))
8392 type1 = TREE_TYPE (type1), type2 = TREE_TYPE (type2);
8393 if (TYPE_MAIN_VARIANT (type1) != TYPE_MAIN_VARIANT (type2))
8394 return 0;
8396 /* Compare the protocol lists. */
8397 type1 = (TYPE_HAS_OBJC_INFO (type1)
8398 ? TYPE_OBJC_PROTOCOL_LIST (type1)
8399 : NULL_TREE);
8400 type2 = (TYPE_HAS_OBJC_INFO (type2)
8401 ? TYPE_OBJC_PROTOCOL_LIST (type2)
8402 : NULL_TREE);
8404 /* If there are no protocols (most common case), the types are
8405 identical. */
8406 if (type1 == NULL_TREE && type2 == NULL_TREE)
8407 return 1;
8409 /* If one has protocols, and the other one hasn't, they are not
8410 identical. */
8411 if ((type1 == NULL_TREE && type2 != NULL_TREE)
8412 || (type1 != NULL_TREE && type2 == NULL_TREE))
8413 return 0;
8414 else
8416 /* Else, both have protocols, and we need to do the full
8417 comparison. It is possible that either type1 or type2
8418 contain some duplicate protocols in the list, so we can't
8419 even just compare list_length as a first check. */
8420 tree t;
8422 for (t = type2; t; t = TREE_CHAIN (t))
8423 if (!lookup_protocol_in_reflist (type1, TREE_VALUE (t)))
8424 return 0;
8426 for (t = type1; t; t = TREE_CHAIN (t))
8427 if (!lookup_protocol_in_reflist (type2, TREE_VALUE (t)))
8428 return 0;
8430 return 1;
8434 /* Return 1 if TYPE1 has the same size and alignment as TYPE2. */
8436 static int
8437 objc_types_share_size_and_alignment (tree type1, tree type2)
8439 return (simple_cst_equal (TYPE_SIZE (type1), TYPE_SIZE (type2))
8440 && TYPE_ALIGN (type1) == TYPE_ALIGN (type2));
8443 /* Return 1 if PROTO1 is equivalent to PROTO2
8444 for purposes of method overloading. Ordinarily, the type signatures
8445 should match up exactly, unless STRICT is zero, in which case we
8446 shall allow differences in which the size and alignment of a type
8447 is the same. */
8449 static int
8450 comp_proto_with_proto (tree proto1, tree proto2, int strict)
8452 tree type1, type2;
8454 /* The following test is needed in case there are hashing
8455 collisions. */
8456 if (METHOD_SEL_NAME (proto1) != METHOD_SEL_NAME (proto2))
8457 return 0;
8459 /* Compare return types. */
8460 type1 = TREE_VALUE (TREE_TYPE (proto1));
8461 type2 = TREE_VALUE (TREE_TYPE (proto2));
8463 if (!objc_types_are_equivalent (type1, type2)
8464 && (strict || !objc_types_share_size_and_alignment (type1, type2)))
8465 return 0;
8467 /* Compare argument types. */
8469 /* The first argument (objc_object_type) is always the same, no need
8470 to compare. */
8472 /* The second argument (objc_selector_type) is always the same, no
8473 need to compare. */
8475 /* Compare the other arguments. */
8477 tree arg1, arg2;
8479 /* Compare METHOD_SEL_ARGS. */
8480 for (arg1 = METHOD_SEL_ARGS (proto1), arg2 = METHOD_SEL_ARGS (proto2);
8481 arg1 && arg2;
8482 arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2))
8484 type1 = TREE_VALUE (TREE_TYPE (arg1));
8485 type2 = TREE_VALUE (TREE_TYPE (arg2));
8487 /* FIXME: Do we need to decay argument types to compare them ? */
8488 type1 = objc_decay_parm_type (type1);
8489 type2 = objc_decay_parm_type (type2);
8491 if (!objc_types_are_equivalent (type1, type2)
8492 && (strict || !objc_types_share_size_and_alignment (type1, type2)))
8493 return 0;
8496 /* The loop ends when arg1 or arg2 are NULL. Make sure they are
8497 both NULL. */
8498 if (arg1 != arg2)
8499 return 0;
8501 /* Compare METHOD_ADD_ARGS. */
8502 if ((METHOD_ADD_ARGS (proto1) && !METHOD_ADD_ARGS (proto2))
8503 || (METHOD_ADD_ARGS (proto2) && !METHOD_ADD_ARGS (proto1)))
8504 return 0;
8506 if (METHOD_ADD_ARGS (proto1))
8508 for (arg1 = TREE_CHAIN (METHOD_ADD_ARGS (proto1)), arg2 = TREE_CHAIN (METHOD_ADD_ARGS (proto2));
8509 arg1 && arg2;
8510 arg1 = TREE_CHAIN (arg1), arg2 = TREE_CHAIN (arg2))
8512 type1 = TREE_TYPE (TREE_VALUE (arg1));
8513 type2 = TREE_TYPE (TREE_VALUE (arg2));
8515 /* FIXME: Do we need to decay argument types to compare them ? */
8516 type1 = objc_decay_parm_type (type1);
8517 type2 = objc_decay_parm_type (type2);
8519 if (!objc_types_are_equivalent (type1, type2)
8520 && (strict || !objc_types_share_size_and_alignment (type1, type2)))
8521 return 0;
8525 /* The loop ends when arg1 or arg2 are NULL. Make sure they are
8526 both NULL. */
8527 if (arg1 != arg2)
8528 return 0;
8530 /* Compare METHOD_ADD_ARGS_ELLIPSIS_P. */
8531 if (METHOD_ADD_ARGS_ELLIPSIS_P (proto1) != METHOD_ADD_ARGS_ELLIPSIS_P (proto2))
8532 return 0;
8535 /* Success. */
8536 return 1;
8539 /* This routine returns true if TYPE is a valid objc object type,
8540 suitable for messaging; false otherwise. If 'accept_class' is
8541 'true', then a Class object is considered valid for messaging and
8542 'true' is returned if 'type' refers to a Class. If 'accept_class'
8543 is 'false', then a Class object is not considered valid for
8544 messaging and 'false' is returned in that case. */
8546 static bool
8547 objc_type_valid_for_messaging (tree type, bool accept_classes)
8549 if (!POINTER_TYPE_P (type))
8550 return false;
8552 /* Remove the pointer indirection; don't remove more than one
8553 otherwise we'd consider "NSObject **" a valid type for messaging,
8554 which it isn't. */
8555 type = TREE_TYPE (type);
8557 if (TREE_CODE (type) != RECORD_TYPE)
8558 return false;
8560 if (objc_is_object_id (type))
8561 return true;
8563 if (objc_is_class_id (type))
8564 return accept_classes;
8566 if (TYPE_HAS_OBJC_INFO (type))
8567 return true;
8569 return false;
8572 void
8573 objc_start_function (tree name, tree type, tree attrs,
8574 #ifdef OBJCPLUS
8575 tree params
8576 #else
8577 struct c_arg_info *params
8578 #endif
8581 tree fndecl = build_decl (input_location,
8582 FUNCTION_DECL, name, type);
8584 #ifdef OBJCPLUS
8585 DECL_ARGUMENTS (fndecl) = params;
8586 DECL_INITIAL (fndecl) = error_mark_node;
8587 DECL_EXTERNAL (fndecl) = 0;
8588 TREE_STATIC (fndecl) = 1;
8589 retrofit_lang_decl (fndecl);
8590 cplus_decl_attributes (&fndecl, attrs, 0);
8591 start_preparsed_function (fndecl, attrs, /*flags=*/SF_DEFAULT);
8592 #else
8593 current_function_returns_value = 0; /* Assume, until we see it does. */
8594 current_function_returns_null = 0;
8595 decl_attributes (&fndecl, attrs, 0);
8596 announce_function (fndecl);
8597 DECL_INITIAL (fndecl) = error_mark_node;
8598 DECL_EXTERNAL (fndecl) = 0;
8599 TREE_STATIC (fndecl) = 1;
8600 current_function_decl = pushdecl (fndecl);
8601 push_scope ();
8602 declare_parm_level ();
8603 DECL_RESULT (current_function_decl)
8604 = build_decl (input_location,
8605 RESULT_DECL, NULL_TREE,
8606 TREE_TYPE (TREE_TYPE (current_function_decl)));
8607 DECL_ARTIFICIAL (DECL_RESULT (current_function_decl)) = 1;
8608 DECL_IGNORED_P (DECL_RESULT (current_function_decl)) = 1;
8609 start_fname_decls ();
8610 store_parm_decls_from (params);
8611 #endif
8613 TREE_USED (current_function_decl) = 1;
8616 /* - Generate an identifier for the function. the format is "_n_cls",
8617 where 1 <= n <= nMethods, and cls is the name the implementation we
8618 are processing.
8619 - Install the return type from the method declaration.
8620 - If we have a prototype, check for type consistency. */
8622 static void
8623 really_start_method (tree method,
8624 #ifdef OBJCPLUS
8625 tree parmlist
8626 #else
8627 struct c_arg_info *parmlist
8628 #endif
8631 tree ret_type, meth_type;
8632 tree method_id;
8633 const char *sel_name, *class_name, *cat_name;
8634 char *buf;
8636 /* Synth the storage class & assemble the return type. */
8637 ret_type = TREE_VALUE (TREE_TYPE (method));
8639 sel_name = IDENTIFIER_POINTER (METHOD_SEL_NAME (method));
8640 class_name = IDENTIFIER_POINTER (CLASS_NAME (objc_implementation_context));
8641 cat_name = ((TREE_CODE (objc_implementation_context)
8642 == CLASS_IMPLEMENTATION_TYPE)
8643 ? NULL
8644 : IDENTIFIER_POINTER (CLASS_SUPER_NAME (objc_implementation_context)));
8645 method_slot++;
8647 /* Make sure this is big enough for any plausible method label. */
8648 buf = (char *) alloca (50 + strlen (sel_name) + strlen (class_name)
8649 + (cat_name ? strlen (cat_name) : 0));
8651 OBJC_GEN_METHOD_LABEL (buf, TREE_CODE (method) == INSTANCE_METHOD_DECL,
8652 class_name, cat_name, sel_name, method_slot);
8654 method_id = get_identifier (buf);
8656 #ifdef OBJCPLUS
8657 /* Objective-C methods cannot be overloaded, so we don't need
8658 the type encoding appended. It looks bad anyway... */
8659 push_lang_context (lang_name_c);
8660 #endif
8662 meth_type = build_function_type_for_method (ret_type, method, METHOD_DEF, 0);
8663 objc_start_function (method_id, meth_type, NULL_TREE, parmlist);
8665 /* Set self_decl from the first argument. */
8666 self_decl = DECL_ARGUMENTS (current_function_decl);
8668 /* Suppress unused warnings. */
8669 TREE_USED (self_decl) = 1;
8670 DECL_READ_P (self_decl) = 1;
8671 TREE_USED (DECL_CHAIN (self_decl)) = 1;
8672 DECL_READ_P (DECL_CHAIN (self_decl)) = 1;
8673 #ifdef OBJCPLUS
8674 pop_lang_context ();
8675 #endif
8677 METHOD_DEFINITION (method) = current_function_decl;
8679 /* Check consistency...start_function, pushdecl, duplicate_decls. */
8681 if (implementation_template != objc_implementation_context)
8683 tree proto
8684 = lookup_method_static (implementation_template,
8685 METHOD_SEL_NAME (method),
8686 ((TREE_CODE (method) == CLASS_METHOD_DECL)
8687 | OBJC_LOOKUP_NO_SUPER));
8689 if (proto)
8691 if (!comp_proto_with_proto (method, proto, 1))
8693 bool type = TREE_CODE (method) == INSTANCE_METHOD_DECL;
8695 warning_at (DECL_SOURCE_LOCATION (method), 0,
8696 "conflicting types for %<%c%s%>",
8697 (type ? '-' : '+'),
8698 identifier_to_locale (gen_method_decl (method)));
8699 inform (DECL_SOURCE_LOCATION (proto),
8700 "previous declaration of %<%c%s%>",
8701 (type ? '-' : '+'),
8702 identifier_to_locale (gen_method_decl (proto)));
8704 else
8706 /* If the method in the @interface was deprecated, mark
8707 the implemented method as deprecated too. It should
8708 never be used for messaging (when the deprecation
8709 warnings are produced), but just in case. */
8710 if (TREE_DEPRECATED (proto))
8711 TREE_DEPRECATED (method) = 1;
8713 /* If the method in the @interface was marked as
8714 'noreturn', mark the function implementing the method
8715 as 'noreturn' too. */
8716 TREE_THIS_VOLATILE (current_function_decl) = TREE_THIS_VOLATILE (proto);
8719 else
8721 /* We have a method @implementation even though we did not
8722 see a corresponding @interface declaration (which is allowed
8723 by Objective-C rules). Go ahead and place the method in
8724 the @interface anyway, so that message dispatch lookups
8725 will see it. */
8726 tree interface = implementation_template;
8728 if (TREE_CODE (objc_implementation_context)
8729 == CATEGORY_IMPLEMENTATION_TYPE)
8730 interface = lookup_category
8731 (interface,
8732 CLASS_SUPER_NAME (objc_implementation_context));
8734 if (interface)
8735 objc_add_method (interface, copy_node (method),
8736 TREE_CODE (method) == CLASS_METHOD_DECL,
8737 /* is_optional= */ false);
8742 static void *UOBJC_SUPER_scope = 0;
8744 /* _n_Method (id self, SEL sel, ...)
8746 struct objc_super _S;
8747 _msgSuper ((_S.self = self, _S.class = _cls, &_S), ...);
8748 } */
8750 static tree
8751 get_super_receiver (void)
8753 if (objc_method_context)
8755 tree super_expr, super_expr_list, class_expr;
8756 bool inst_meth;
8757 if (!UOBJC_SUPER_decl)
8759 UOBJC_SUPER_decl = build_decl (input_location,
8760 VAR_DECL, get_identifier (TAG_SUPER),
8761 objc_super_template);
8762 /* This prevents `unused variable' warnings when compiling with -Wall. */
8763 TREE_USED (UOBJC_SUPER_decl) = 1;
8764 DECL_READ_P (UOBJC_SUPER_decl) = 1;
8765 lang_hooks.decls.pushdecl (UOBJC_SUPER_decl);
8766 finish_decl (UOBJC_SUPER_decl, input_location, NULL_TREE, NULL_TREE,
8767 NULL_TREE);
8768 UOBJC_SUPER_scope = objc_get_current_scope ();
8771 /* Set receiver to self. */
8772 super_expr = objc_build_component_ref (UOBJC_SUPER_decl, self_id);
8773 super_expr = build_modify_expr (input_location, super_expr, NULL_TREE,
8774 NOP_EXPR, input_location, self_decl,
8775 NULL_TREE);
8776 super_expr_list = super_expr;
8778 /* Set class to begin searching. */
8779 /* Get the ident for the superclass class field & build a ref to it.
8780 ??? maybe we should just name the field the same for all runtimes. */
8781 super_expr = (*runtime.super_superclassfield_ident) ();
8782 super_expr = objc_build_component_ref (UOBJC_SUPER_decl, super_expr);
8784 gcc_assert (imp_list->imp_context == objc_implementation_context
8785 && imp_list->imp_template == implementation_template);
8786 inst_meth = (TREE_CODE (objc_method_context) == INSTANCE_METHOD_DECL);
8788 if (TREE_CODE (objc_implementation_context) == CLASS_IMPLEMENTATION_TYPE)
8789 class_expr = (*runtime.get_class_super_ref) (input_location,
8790 imp_list, inst_meth);
8791 else
8792 /* We have a category. */
8794 tree super_name = CLASS_SUPER_NAME (imp_list->imp_template);
8795 tree super_class;
8797 /* Barf if super used in a category of a root object. */
8798 if (!super_name)
8800 error ("no super class declared in interface for %qE",
8801 CLASS_NAME (imp_list->imp_template));
8802 return error_mark_node;
8805 super_class = (*runtime.get_category_super_ref) (input_location,
8806 imp_list, inst_meth);
8807 class_expr = build_c_cast (input_location,
8808 TREE_TYPE (super_expr), super_class);
8811 super_expr = build_modify_expr (input_location, super_expr, NULL_TREE,
8812 NOP_EXPR,
8813 input_location, class_expr, NULL_TREE);
8815 super_expr_list = build_compound_expr (input_location,
8816 super_expr_list, super_expr);
8818 super_expr = build_unary_op (input_location,
8819 ADDR_EXPR, UOBJC_SUPER_decl, 0);
8820 super_expr_list = build_compound_expr (input_location,
8821 super_expr_list, super_expr);
8823 return super_expr_list;
8825 else
8827 error ("[super ...] must appear in a method context");
8828 return error_mark_node;
8832 /* When exiting a scope, sever links to a 'super' declaration (if any)
8833 therein contained. */
8835 void
8836 objc_clear_super_receiver (void)
8838 if (objc_method_context
8839 && UOBJC_SUPER_scope == objc_get_current_scope ())
8841 UOBJC_SUPER_decl = 0;
8842 UOBJC_SUPER_scope = 0;
8846 void
8847 objc_finish_method_definition (tree fndecl)
8849 /* We cannot validly inline ObjC methods, at least not without a language
8850 extension to declare that a method need not be dynamically
8851 dispatched, so suppress all thoughts of doing so. */
8852 DECL_UNINLINABLE (fndecl) = 1;
8854 #ifndef OBJCPLUS
8855 /* The C++ front-end will have called finish_function() for us. */
8856 finish_function ();
8857 #endif
8859 METHOD_ENCODING (objc_method_context)
8860 = encode_method_prototype (objc_method_context);
8862 /* Required to implement _msgSuper. This must be done AFTER finish_function,
8863 since the optimizer may find "may be used before set" errors. */
8864 objc_method_context = NULL_TREE;
8866 if (should_call_super_dealloc)
8867 warning (0, "method possibly missing a [super dealloc] call");
8870 /* Given a tree DECL node, produce a printable description of it in the given
8871 buffer, overwriting the buffer. */
8873 static char *
8874 gen_declaration (tree decl)
8876 errbuf[0] = '\0';
8878 if (DECL_P (decl))
8880 gen_type_name_0 (TREE_TYPE (decl));
8882 if (DECL_NAME (decl))
8884 if (!POINTER_TYPE_P (TREE_TYPE (decl)))
8885 strcat (errbuf, " ");
8887 strcat (errbuf, IDENTIFIER_POINTER (DECL_NAME (decl)));
8890 if (DECL_INITIAL (decl)
8891 && TREE_CODE (DECL_INITIAL (decl)) == INTEGER_CST)
8892 sprintf (errbuf + strlen (errbuf), ": " HOST_WIDE_INT_PRINT_DEC,
8893 TREE_INT_CST_LOW (DECL_INITIAL (decl)));
8896 return errbuf;
8899 /* Given a tree TYPE node, produce a printable description of it in the given
8900 buffer, overwriting the buffer. */
8902 static char *
8903 gen_type_name_0 (tree type)
8905 tree orig = type, proto;
8907 if (TYPE_P (type) && TYPE_NAME (type))
8908 type = TYPE_NAME (type);
8909 else if (POINTER_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
8911 tree inner = TREE_TYPE (type);
8913 while (TREE_CODE (inner) == ARRAY_TYPE)
8914 inner = TREE_TYPE (inner);
8916 gen_type_name_0 (inner);
8918 if (!POINTER_TYPE_P (inner))
8919 strcat (errbuf, " ");
8921 if (POINTER_TYPE_P (type))
8922 strcat (errbuf, "*");
8923 else
8924 while (type != inner)
8926 strcat (errbuf, "[");
8928 if (TYPE_DOMAIN (type))
8930 char sz[20];
8932 sprintf (sz, HOST_WIDE_INT_PRINT_DEC,
8933 (TREE_INT_CST_LOW
8934 (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + 1));
8935 strcat (errbuf, sz);
8938 strcat (errbuf, "]");
8939 type = TREE_TYPE (type);
8942 goto exit_function;
8945 if (TREE_CODE (type) == TYPE_DECL && DECL_NAME (type))
8946 type = DECL_NAME (type);
8948 strcat (errbuf, TREE_CODE (type) == IDENTIFIER_NODE
8949 ? IDENTIFIER_POINTER (type)
8950 : "");
8952 /* For 'id' and 'Class', adopted protocols are stored in the pointee. */
8953 if (objc_is_id (orig))
8954 orig = TREE_TYPE (orig);
8956 proto = TYPE_HAS_OBJC_INFO (orig) ? TYPE_OBJC_PROTOCOL_LIST (orig) : NULL_TREE;
8958 if (proto)
8960 strcat (errbuf, " <");
8962 while (proto) {
8963 strcat (errbuf,
8964 IDENTIFIER_POINTER (PROTOCOL_NAME (TREE_VALUE (proto))));
8965 proto = TREE_CHAIN (proto);
8966 strcat (errbuf, proto ? ", " : ">");
8970 exit_function:
8971 return errbuf;
8974 static char *
8975 gen_type_name (tree type)
8977 errbuf[0] = '\0';
8979 return gen_type_name_0 (type);
8982 /* Given a method tree, put a printable description into the given
8983 buffer (overwriting) and return a pointer to the buffer. */
8985 static char *
8986 gen_method_decl (tree method)
8988 tree chain;
8990 strcpy (errbuf, "("); /* NB: Do _not_ call strcat() here. */
8991 gen_type_name_0 (TREE_VALUE (TREE_TYPE (method)));
8992 strcat (errbuf, ")");
8993 chain = METHOD_SEL_ARGS (method);
8995 if (chain)
8997 /* We have a chain of keyword_decls. */
9000 if (KEYWORD_KEY_NAME (chain))
9001 strcat (errbuf, IDENTIFIER_POINTER (KEYWORD_KEY_NAME (chain)));
9003 strcat (errbuf, ":(");
9004 gen_type_name_0 (TREE_VALUE (TREE_TYPE (chain)));
9005 strcat (errbuf, ")");
9007 strcat (errbuf, IDENTIFIER_POINTER (KEYWORD_ARG_NAME (chain)));
9008 if ((chain = DECL_CHAIN (chain)))
9009 strcat (errbuf, " ");
9011 while (chain);
9013 if (METHOD_ADD_ARGS (method))
9015 chain = TREE_CHAIN (METHOD_ADD_ARGS (method));
9017 /* Know we have a chain of parm_decls. */
9018 while (chain)
9020 strcat (errbuf, ", ");
9021 gen_type_name_0 (TREE_TYPE (TREE_VALUE (chain)));
9022 chain = TREE_CHAIN (chain);
9025 if (METHOD_ADD_ARGS_ELLIPSIS_P (method))
9026 strcat (errbuf, ", ...");
9030 else
9031 /* We have a unary selector. */
9032 strcat (errbuf, IDENTIFIER_POINTER (METHOD_SEL_NAME (method)));
9034 return errbuf;
9037 /* Debug info. */
9040 /* Dump an @interface declaration of the supplied class CHAIN to the
9041 supplied file FP. Used to implement the -gen-decls option (which
9042 prints out an @interface declaration of all classes compiled in
9043 this run); potentially useful for debugging the compiler too. */
9044 void
9045 dump_interface (FILE *fp, tree chain)
9047 /* FIXME: A heap overflow here whenever a method (or ivar)
9048 declaration is so long that it doesn't fit in the buffer. The
9049 code and all the related functions should be rewritten to avoid
9050 using fixed size buffers. */
9051 const char *my_name = IDENTIFIER_POINTER (CLASS_NAME (chain));
9052 tree ivar_decls = CLASS_RAW_IVARS (chain);
9053 tree nst_methods = CLASS_NST_METHODS (chain);
9054 tree cls_methods = CLASS_CLS_METHODS (chain);
9056 fprintf (fp, "\n@interface %s", my_name);
9058 /* CLASS_SUPER_NAME is used to store the superclass name for
9059 classes, and the category name for categories. */
9060 if (CLASS_SUPER_NAME (chain))
9062 const char *name = IDENTIFIER_POINTER (CLASS_SUPER_NAME (chain));
9064 switch (TREE_CODE (chain))
9066 case CATEGORY_IMPLEMENTATION_TYPE:
9067 case CATEGORY_INTERFACE_TYPE:
9068 fprintf (fp, " (%s)\n", name);
9069 break;
9070 default:
9071 fprintf (fp, " : %s\n", name);
9072 break;
9075 else
9076 fprintf (fp, "\n");
9078 /* FIXME - the following doesn't seem to work at the moment. */
9079 if (ivar_decls)
9081 fprintf (fp, "{\n");
9084 fprintf (fp, "\t%s;\n", gen_declaration (ivar_decls));
9085 ivar_decls = TREE_CHAIN (ivar_decls);
9087 while (ivar_decls);
9088 fprintf (fp, "}\n");
9091 while (nst_methods)
9093 fprintf (fp, "- %s;\n", gen_method_decl (nst_methods));
9094 nst_methods = TREE_CHAIN (nst_methods);
9097 while (cls_methods)
9099 fprintf (fp, "+ %s;\n", gen_method_decl (cls_methods));
9100 cls_methods = TREE_CHAIN (cls_methods);
9103 fprintf (fp, "@end\n");
9106 #if 0
9107 /* Produce the pretty printing for an Objective-C method. This is
9108 currently unused, but could be handy while reorganizing the pretty
9109 printing to be more robust. */
9110 static const char *
9111 objc_pretty_print_method (bool is_class_method,
9112 const char *class_name,
9113 const char *category_name,
9114 const char *selector)
9116 if (category_name)
9118 char *result = XNEWVEC (char, strlen (class_name) + strlen (category_name)
9119 + strlen (selector) + 7);
9121 if (is_class_method)
9122 sprintf (result, "+[%s(%s) %s]", class_name, category_name, selector);
9123 else
9124 sprintf (result, "-[%s(%s) %s]", class_name, category_name, selector);
9126 return result;
9128 else
9130 char *result = XNEWVEC (char, strlen (class_name)
9131 + strlen (selector) + 5);
9133 if (is_class_method)
9134 sprintf (result, "+[%s %s]", class_name, selector);
9135 else
9136 sprintf (result, "-[%s %s]", class_name, selector);
9138 return result;
9141 #endif
9143 /* Demangle function for Objective-C. Attempt to demangle the
9144 function name associated with a method (eg, going from
9145 "_i_NSObject__class" to "-[NSObject class]"); usually for the
9146 purpose of pretty printing or error messages. Return the demangled
9147 name, or NULL if the string is not an Objective-C mangled method
9148 name.
9150 Because of how the mangling is done, any method that has a '_' in
9151 its original name is at risk of being demangled incorrectly. In
9152 some cases there are multiple valid ways to demangle a method name
9153 and there is no way we can decide.
9155 TODO: objc_demangle() can't always get it right; the right way to
9156 get this correct for all method names would be to store the
9157 Objective-C method name somewhere in the function decl. Then,
9158 there is no demangling to do; we'd just pull the method name out of
9159 the decl. As an additional bonus, when printing error messages we
9160 could check for such a method name, and if we find it, we know the
9161 function is actually an Objective-C method and we could print error
9162 messages saying "In method '+[NSObject class]" instead of "In
9163 function '+[NSObject class]" as we do now. */
9164 static const char *
9165 objc_demangle (const char *mangled)
9167 char *demangled, *cp;
9169 /* First of all, if the name is too short it can't be an Objective-C
9170 mangled method name. */
9171 if (mangled[0] == '\0' || mangled[1] == '\0' || mangled[2] == '\0')
9172 return NULL;
9174 /* If the name looks like an already demangled one, return it
9175 unchanged. This should only happen on Darwin, where method names
9176 are mangled differently into a pretty-print form (such as
9177 '+[NSObject class]', see darwin.h). In that case, demangling is
9178 a no-op, but we need to return the demangled name if it was an
9179 ObjC one, and return NULL if not. We should be safe as no C/C++
9180 function can start with "-[" or "+[". */
9181 if ((mangled[0] == '-' || mangled[0] == '+')
9182 && (mangled[1] == '['))
9183 return mangled;
9185 if (mangled[0] == '_' &&
9186 (mangled[1] == 'i' || mangled[1] == 'c') &&
9187 mangled[2] == '_')
9189 cp = demangled = XNEWVEC (char, strlen(mangled) + 2);
9190 if (mangled[1] == 'i')
9191 *cp++ = '-'; /* for instance method */
9192 else
9193 *cp++ = '+'; /* for class method */
9194 *cp++ = '['; /* opening left brace */
9195 strcpy(cp, mangled+3); /* tack on the rest of the mangled name */
9196 while (*cp && *cp == '_')
9197 cp++; /* skip any initial underbars in class name */
9198 cp = strchr(cp, '_'); /* find first non-initial underbar */
9199 if (cp == NULL)
9201 free(demangled); /* not mangled name */
9202 return NULL;
9204 if (cp[1] == '_') /* easy case: no category name */
9206 *cp++ = ' '; /* replace two '_' with one ' ' */
9207 strcpy(cp, mangled + (cp - demangled) + 2);
9209 else
9211 *cp++ = '('; /* less easy case: category name */
9212 cp = strchr(cp, '_');
9213 if (cp == 0)
9215 free(demangled); /* not mangled name */
9216 return NULL;
9218 *cp++ = ')';
9219 *cp++ = ' '; /* overwriting 1st char of method name... */
9220 strcpy(cp, mangled + (cp - demangled)); /* get it back */
9222 /* Now we have the method name. We need to generally replace
9223 '_' with ':' but trying to preserve '_' if it could only have
9224 been in the mangled string because it was already in the
9225 original name. In cases where it's ambiguous, we assume that
9226 any '_' originated from a ':'. */
9228 /* Initial '_'s in method name can't have been generating by
9229 converting ':'s. Skip them. */
9230 while (*cp && *cp == '_')
9231 cp++;
9233 /* If the method name does not end with '_', then it has no
9234 arguments and there was no replacement of ':'s with '_'s
9235 during mangling. Check for that case, and skip any
9236 replacement if so. This at least guarantees that methods
9237 with no arguments are always demangled correctly (unless the
9238 original name ends with '_'). */
9239 if (*(mangled + strlen (mangled) - 1) != '_')
9241 /* Skip to the end. */
9242 for (; *cp; cp++)
9245 else
9247 /* Replace remaining '_' with ':'. This may get it wrong if
9248 there were '_'s in the original name. In most cases it
9249 is impossible to disambiguate. */
9250 for (; *cp; cp++)
9251 if (*cp == '_')
9252 *cp = ':';
9254 *cp++ = ']'; /* closing right brace */
9255 *cp++ = 0; /* string terminator */
9256 return demangled;
9258 else
9259 return NULL; /* not an objc mangled name */
9262 /* Try to pretty-print a decl. If the 'decl' is an Objective-C
9263 specific decl, return the printable name for it. If not, return
9264 NULL. */
9265 const char *
9266 objc_maybe_printable_name (tree decl, int v ATTRIBUTE_UNUSED)
9268 switch (TREE_CODE (decl))
9270 case FUNCTION_DECL:
9271 return objc_demangle (IDENTIFIER_POINTER (DECL_NAME (decl)));
9272 break;
9274 /* The following happens when we are printing a deprecation
9275 warning for a method. The warn_deprecation() will end up
9276 trying to print the decl for INSTANCE_METHOD_DECL or
9277 CLASS_METHOD_DECL. It would be nice to be able to print
9278 "-[NSObject autorelease] is deprecated", but to do that, we'd
9279 need to store the class and method name in the method decl,
9280 which we currently don't do. For now, just return the name
9281 of the method. We don't return NULL, because that may
9282 trigger further attempts to pretty-print the decl in C/C++,
9283 but they wouldn't know how to pretty-print it. */
9284 case INSTANCE_METHOD_DECL:
9285 case CLASS_METHOD_DECL:
9286 return IDENTIFIER_POINTER (DECL_NAME (decl));
9287 break;
9288 /* This happens when printing a deprecation warning for a
9289 property. We may want to consider some sort of pretty
9290 printing (eg, include the class name where it was declared
9291 ?). */
9292 case PROPERTY_DECL:
9293 return IDENTIFIER_POINTER (PROPERTY_NAME (decl));
9294 break;
9295 default:
9296 return NULL;
9297 break;
9301 /* Return a printable name for 'decl'. This first tries
9302 objc_maybe_printable_name(), and if that fails, it returns the name
9303 in the decl. This is used as LANG_HOOKS_DECL_PRINTABLE_NAME for
9304 Objective-C; in Objective-C++, setting the hook is not enough
9305 because lots of C++ Front-End code calls cxx_printable_name,
9306 dump_decl and other C++ functions directly. So instead we have
9307 modified dump_decl to call objc_maybe_printable_name directly. */
9308 const char *
9309 objc_printable_name (tree decl, int v)
9311 const char *demangled_name = objc_maybe_printable_name (decl, v);
9313 if (demangled_name != NULL)
9314 return demangled_name;
9315 else
9316 return IDENTIFIER_POINTER (DECL_NAME (decl));
9319 /* Routine is called to issue diagnostic when reference to a private
9320 ivar is made and no other variable with same name is found in
9321 current scope. */
9322 bool
9323 objc_diagnose_private_ivar (tree id)
9325 tree ivar;
9326 if (!objc_method_context)
9327 return false;
9328 ivar = is_ivar (objc_ivar_chain, id);
9329 if (ivar && is_private (ivar))
9331 error ("instance variable %qs is declared private",
9332 IDENTIFIER_POINTER (id));
9333 return true;
9335 return false;
9338 /* Look up ID as an instance variable. OTHER contains the result of
9339 the C or C++ lookup, which we may want to use instead. */
9340 /* To use properties inside an instance method, use self.property. */
9341 tree
9342 objc_lookup_ivar (tree other, tree id)
9344 tree ivar;
9346 /* If we are not inside of an ObjC method, ivar lookup makes no sense. */
9347 if (!objc_method_context)
9348 return other;
9350 if (!strcmp (IDENTIFIER_POINTER (id), "super"))
9351 /* We have a message to super. */
9352 return get_super_receiver ();
9354 /* In a class method, look up an instance variable only as a last
9355 resort. */
9356 if (TREE_CODE (objc_method_context) == CLASS_METHOD_DECL
9357 && other && other != error_mark_node)
9358 return other;
9360 /* Look up the ivar, but do not use it if it is not accessible. */
9361 ivar = is_ivar (objc_ivar_chain, id);
9363 if (!ivar || is_private (ivar))
9364 return other;
9366 /* In an instance method, a local variable (or parameter) may hide the
9367 instance variable. */
9368 if (TREE_CODE (objc_method_context) == INSTANCE_METHOD_DECL
9369 && other && other != error_mark_node
9370 #ifdef OBJCPLUS
9371 && CP_DECL_CONTEXT (other) != global_namespace)
9372 #else
9373 && !DECL_FILE_SCOPE_P (other))
9374 #endif
9376 warning (0, "local declaration of %qE hides instance variable", id);
9378 return other;
9381 /* At this point, we are either in an instance method with no obscuring
9382 local definitions, or in a class method with no alternate definitions
9383 at all. */
9384 return build_ivar_reference (id);
9387 /* Possibly rewrite a function CALL into an OBJ_TYPE_REF expression. This
9388 needs to be done if we are calling a function through a cast. */
9390 tree
9391 objc_rewrite_function_call (tree function, tree first_param)
9393 if (TREE_CODE (function) == NOP_EXPR
9394 && TREE_CODE (TREE_OPERAND (function, 0)) == ADDR_EXPR
9395 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (function, 0), 0))
9396 == FUNCTION_DECL)
9398 function = build3 (OBJ_TYPE_REF, TREE_TYPE (function),
9399 TREE_OPERAND (function, 0),
9400 first_param, size_zero_node);
9403 return function;
9406 /* This is called to "gimplify" a PROPERTY_REF node. It builds the
9407 corresponding 'getter' function call. Note that we assume the
9408 PROPERTY_REF to be valid since we generated it while parsing. */
9409 static void
9410 objc_gimplify_property_ref (tree *expr_p)
9412 tree getter = PROPERTY_REF_GETTER_CALL (*expr_p);
9413 tree call_exp;
9415 if (getter == NULL_TREE)
9417 tree property_decl = PROPERTY_REF_PROPERTY_DECL (*expr_p);
9418 /* This can happen if DECL_ARTIFICIAL (*expr_p), but
9419 should be impossible for real properties, which always
9420 have a getter. */
9421 error_at (EXPR_LOCATION (*expr_p), "no %qs getter found",
9422 IDENTIFIER_POINTER (PROPERTY_NAME (property_decl)));
9423 /* Try to recover from the error to prevent an ICE. We take
9424 zero and cast it to the type of the property. */
9425 *expr_p = convert (TREE_TYPE (property_decl),
9426 integer_zero_node);
9427 return;
9430 if (PROPERTY_REF_DEPRECATED_GETTER (*expr_p))
9432 /* PROPERTY_REF_DEPRECATED_GETTER contains the method prototype
9433 that is deprecated. */
9434 warn_deprecated_use (PROPERTY_REF_DEPRECATED_GETTER (*expr_p),
9435 NULL_TREE);
9438 call_exp = getter;
9439 #ifdef OBJCPLUS
9440 /* In C++, a getter which returns an aggregate value results in a
9441 target_expr which initializes a temporary to the call
9442 expression. */
9443 if (TREE_CODE (getter) == TARGET_EXPR)
9445 gcc_assert (MAYBE_CLASS_TYPE_P (TREE_TYPE (getter)));
9446 gcc_assert (TREE_CODE (TREE_OPERAND (getter, 0)) == VAR_DECL);
9447 call_exp = TREE_OPERAND (getter, 1);
9449 #endif
9450 gcc_assert (TREE_CODE (call_exp) == CALL_EXPR);
9452 *expr_p = call_exp;
9455 /* This is called when "gimplifying" the trees. We need to gimplify
9456 the Objective-C/Objective-C++ specific trees, then hand over the
9457 process to C/C++. */
9459 objc_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
9461 enum tree_code code = TREE_CODE (*expr_p);
9462 switch (code)
9464 /* Look for the special case of OBJC_TYPE_REF with the address
9465 of a function in OBJ_TYPE_REF_EXPR (presumably objc_msgSend
9466 or one of its cousins). */
9467 case OBJ_TYPE_REF:
9468 if (TREE_CODE (OBJ_TYPE_REF_EXPR (*expr_p)) == ADDR_EXPR
9469 && TREE_CODE (TREE_OPERAND (OBJ_TYPE_REF_EXPR (*expr_p), 0))
9470 == FUNCTION_DECL)
9472 enum gimplify_status r0, r1;
9474 /* Postincrements in OBJ_TYPE_REF_OBJECT don't affect the
9475 value of the OBJ_TYPE_REF, so force them to be emitted
9476 during subexpression evaluation rather than after the
9477 OBJ_TYPE_REF. This permits objc_msgSend calls in
9478 Objective C to use direct rather than indirect calls when
9479 the object expression has a postincrement. */
9480 r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, NULL,
9481 is_gimple_val, fb_rvalue);
9482 r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
9483 is_gimple_val, fb_rvalue);
9485 return MIN (r0, r1);
9487 break;
9488 case PROPERTY_REF:
9489 objc_gimplify_property_ref (expr_p);
9490 /* Do not return yet; let C/C++ gimplify the resulting expression. */
9491 break;
9492 default:
9493 break;
9496 #ifdef OBJCPLUS
9497 return (enum gimplify_status) cp_gimplify_expr (expr_p, pre_p, post_p);
9498 #else
9499 return (enum gimplify_status) c_gimplify_expr (expr_p, pre_p, post_p);
9500 #endif
9503 /* --- FAST ENUMERATION --- */
9504 /* Begin code generation for fast enumeration (foreach) ... */
9506 /* Defines
9508 struct __objcFastEnumerationState
9510 unsigned long state;
9511 id *itemsPtr;
9512 unsigned long *mutationsPtr;
9513 unsigned long extra[5];
9516 Confusingly enough, NSFastEnumeration is then defined by libraries
9517 to be the same structure.
9520 static void
9521 build_fast_enumeration_state_template (void)
9523 tree decls, *chain = NULL;
9525 /* { */
9526 objc_fast_enumeration_state_template = objc_start_struct (get_identifier
9527 (TAG_FAST_ENUMERATION_STATE));
9529 /* unsigned long state; */
9530 decls = add_field_decl (long_unsigned_type_node, "state", &chain);
9532 /* id *itemsPtr; */
9533 add_field_decl (build_pointer_type (objc_object_type),
9534 "itemsPtr", &chain);
9536 /* unsigned long *mutationsPtr; */
9537 add_field_decl (build_pointer_type (long_unsigned_type_node),
9538 "mutationsPtr", &chain);
9540 /* unsigned long extra[5]; */
9541 add_field_decl (build_sized_array_type (long_unsigned_type_node, 5),
9542 "extra", &chain);
9544 /* } */
9545 objc_finish_struct (objc_fast_enumeration_state_template, decls);
9549 'objc_finish_foreach_loop()' generates the code for an Objective-C
9550 foreach loop. The 'location' argument is the location of the 'for'
9551 that starts the loop. The 'object_expression' is the expression of
9552 the 'object' that iterates; the 'collection_expression' is the
9553 expression of the collection that we iterate over (we need to make
9554 sure we evaluate this only once); the 'for_body' is the set of
9555 statements to be executed in each iteration; 'break_label' and
9556 'continue_label' are the break and continue labels which we need to
9557 emit since the <statements> may be jumping to 'break_label' (if they
9558 contain 'break') or to 'continue_label' (if they contain
9559 'continue').
9561 The syntax is
9563 for (<object expression> in <collection expression>)
9564 <statements>
9566 which is compiled into the following blurb:
9569 id __objc_foreach_collection;
9570 __objc_fast_enumeration_state __objc_foreach_enum_state;
9571 unsigned long __objc_foreach_batchsize;
9572 id __objc_foreach_items[16];
9573 __objc_foreach_collection = <collection expression>;
9574 __objc_foreach_enum_state = { 0 };
9575 __objc_foreach_batchsize = [__objc_foreach_collection countByEnumeratingWithState: &__objc_foreach_enum_state objects: __objc_foreach_items count: 16];
9577 if (__objc_foreach_batchsize == 0)
9578 <object expression> = nil;
9579 else
9581 unsigned long __objc_foreach_mutations_pointer = *__objc_foreach_enum_state.mutationsPtr;
9582 next_batch:
9584 unsigned long __objc_foreach_index;
9585 __objc_foreach_index = 0;
9587 next_object:
9588 if (__objc_foreach_mutation_pointer != *__objc_foreach_enum_state.mutationsPtr) objc_enumeration_mutation (<collection expression>);
9589 <object expression> = enumState.itemsPtr[__objc_foreach_index];
9590 <statements> [PS: inside <statments>, 'break' jumps to break_label and 'continue' jumps to continue_label]
9592 continue_label:
9593 __objc_foreach_index++;
9594 if (__objc_foreach_index < __objc_foreach_batchsize) goto next_object;
9595 __objc_foreach_batchsize = [__objc_foreach_collection countByEnumeratingWithState: &__objc_foreach_enum_state objects: __objc_foreach_items count: 16];
9597 if (__objc_foreach_batchsize != 0) goto next_batch;
9598 <object expression> = nil;
9599 break_label:
9603 'statements' may contain a 'continue' or 'break' instruction, which
9604 the user expects to 'continue' or 'break' the entire foreach loop.
9605 We are provided the labels that 'break' and 'continue' jump to, so
9606 we place them where we want them to jump to when they pick them.
9608 Optimization TODO: we could cache the IMP of
9609 countByEnumeratingWithState:objects:count:.
9612 /* If you need to debug objc_finish_foreach_loop(), uncomment the following line. */
9613 /* #define DEBUG_OBJC_FINISH_FOREACH_LOOP 1 */
9615 #ifdef DEBUG_OBJC_FINISH_FOREACH_LOOP
9616 #include "tree-pretty-print.h"
9617 #endif
9619 void
9620 objc_finish_foreach_loop (location_t location, tree object_expression, tree collection_expression, tree for_body,
9621 tree break_label, tree continue_label)
9623 /* A tree representing the __objcFastEnumerationState struct type,
9624 or NSFastEnumerationState struct, whatever we are using. */
9625 tree objc_fast_enumeration_state_type;
9627 /* The trees representing the declarations of each of the local variables. */
9628 tree objc_foreach_collection_decl;
9629 tree objc_foreach_enum_state_decl;
9630 tree objc_foreach_items_decl;
9631 tree objc_foreach_batchsize_decl;
9632 tree objc_foreach_mutations_pointer_decl;
9633 tree objc_foreach_index_decl;
9635 /* A tree representing the selector countByEnumeratingWithState:objects:count:. */
9636 tree selector_name;
9638 /* A tree representing the local bind. */
9639 tree bind;
9641 /* A tree representing the external 'if (__objc_foreach_batchsize)' */
9642 tree first_if;
9644 /* A tree representing the 'else' part of 'first_if' */
9645 tree first_else;
9647 /* A tree representing the 'next_batch' label. */
9648 tree next_batch_label_decl;
9650 /* A tree representing the binding after the 'next_batch' label. */
9651 tree next_batch_bind;
9653 /* A tree representing the 'next_object' label. */
9654 tree next_object_label_decl;
9656 /* Temporary variables. */
9657 tree t;
9658 int i;
9660 if (flag_objc1_only)
9661 error_at (location, "fast enumeration is not available in Objective-C 1.0");
9663 if (object_expression == error_mark_node)
9664 return;
9666 if (collection_expression == error_mark_node)
9667 return;
9669 if (!objc_type_valid_for_messaging (TREE_TYPE (object_expression), true))
9671 error_at (location, "iterating variable in fast enumeration is not an object");
9672 return;
9675 if (!objc_type_valid_for_messaging (TREE_TYPE (collection_expression), true))
9677 error_at (location, "collection in fast enumeration is not an object");
9678 return;
9681 /* TODO: Check that object_expression is either a variable
9682 declaration, or an lvalue. */
9684 /* This kludge is an idea from apple. We use the
9685 __objcFastEnumerationState struct implicitly defined by the
9686 compiler, unless a NSFastEnumerationState struct has been defined
9687 (by a Foundation library such as GNUstep Base) in which case, we
9688 use that one.
9690 objc_fast_enumeration_state_type = objc_fast_enumeration_state_template;
9692 tree objc_NSFastEnumeration_type = lookup_name (get_identifier ("NSFastEnumerationState"));
9694 if (objc_NSFastEnumeration_type)
9696 /* TODO: We really need to check that
9697 objc_NSFastEnumeration_type is the same as ours! */
9698 if (TREE_CODE (objc_NSFastEnumeration_type) == TYPE_DECL)
9700 /* If it's a typedef, use the original type. */
9701 if (DECL_ORIGINAL_TYPE (objc_NSFastEnumeration_type))
9702 objc_fast_enumeration_state_type = DECL_ORIGINAL_TYPE (objc_NSFastEnumeration_type);
9703 else
9704 objc_fast_enumeration_state_type = TREE_TYPE (objc_NSFastEnumeration_type);
9709 /* { */
9710 /* Done by c-parser.c. */
9712 /* type object; */
9713 /* Done by c-parser.c. */
9715 /* Disable warnings that 'object' is unused. For example the code
9717 for (id object in collection)
9718 i++;
9720 which can be used to count how many objects there are in the
9721 collection is fine and should generate no warnings even if
9722 'object' is technically unused. */
9723 TREE_USED (object_expression) = 1;
9724 if (DECL_P (object_expression))
9725 DECL_READ_P (object_expression) = 1;
9727 /* id __objc_foreach_collection */
9728 objc_foreach_collection_decl = objc_create_temporary_var (objc_object_type, "__objc_foreach_collection");
9730 /* __objcFastEnumerationState __objc_foreach_enum_state; */
9731 objc_foreach_enum_state_decl = objc_create_temporary_var (objc_fast_enumeration_state_type, "__objc_foreach_enum_state");
9732 TREE_CHAIN (objc_foreach_enum_state_decl) = objc_foreach_collection_decl;
9734 /* id __objc_foreach_items[16]; */
9735 objc_foreach_items_decl = objc_create_temporary_var (build_sized_array_type (objc_object_type, 16), "__objc_foreach_items");
9736 TREE_CHAIN (objc_foreach_items_decl) = objc_foreach_enum_state_decl;
9738 /* unsigned long __objc_foreach_batchsize; */
9739 objc_foreach_batchsize_decl = objc_create_temporary_var (long_unsigned_type_node, "__objc_foreach_batchsize");
9740 TREE_CHAIN (objc_foreach_batchsize_decl) = objc_foreach_items_decl;
9742 /* Generate the local variable binding. */
9743 bind = build3 (BIND_EXPR, void_type_node, objc_foreach_batchsize_decl, NULL, NULL);
9744 SET_EXPR_LOCATION (bind, location);
9745 TREE_SIDE_EFFECTS (bind) = 1;
9747 /* __objc_foreach_collection = <collection expression>; */
9748 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_collection_decl, collection_expression);
9749 SET_EXPR_LOCATION (t, location);
9750 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9751 /* We have used 'collection_expression'. */
9752 mark_exp_read (collection_expression);
9754 /* __objc_foreach_enum_state.state = 0; */
9755 t = build2 (MODIFY_EXPR, void_type_node, objc_build_component_ref (objc_foreach_enum_state_decl,
9756 get_identifier ("state")),
9757 build_int_cst (long_unsigned_type_node, 0));
9758 SET_EXPR_LOCATION (t, location);
9759 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9761 /* __objc_foreach_enum_state.itemsPtr = NULL; */
9762 t = build2 (MODIFY_EXPR, void_type_node, objc_build_component_ref (objc_foreach_enum_state_decl,
9763 get_identifier ("itemsPtr")),
9764 null_pointer_node);
9765 SET_EXPR_LOCATION (t, location);
9766 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9768 /* __objc_foreach_enum_state.mutationsPtr = NULL; */
9769 t = build2 (MODIFY_EXPR, void_type_node, objc_build_component_ref (objc_foreach_enum_state_decl,
9770 get_identifier ("mutationsPtr")),
9771 null_pointer_node);
9772 SET_EXPR_LOCATION (t, location);
9773 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9775 /* __objc_foreach_enum_state.extra[0] = 0; */
9776 /* __objc_foreach_enum_state.extra[1] = 0; */
9777 /* __objc_foreach_enum_state.extra[2] = 0; */
9778 /* __objc_foreach_enum_state.extra[3] = 0; */
9779 /* __objc_foreach_enum_state.extra[4] = 0; */
9780 for (i = 0; i < 5 ; i++)
9782 t = build2 (MODIFY_EXPR, void_type_node,
9783 build_array_ref (location, objc_build_component_ref (objc_foreach_enum_state_decl,
9784 get_identifier ("extra")),
9785 build_int_cst (NULL_TREE, i)),
9786 build_int_cst (long_unsigned_type_node, 0));
9787 SET_EXPR_LOCATION (t, location);
9788 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9791 /* __objc_foreach_batchsize = [__objc_foreach_collection countByEnumeratingWithState: &__objc_foreach_enum_state objects: __objc_foreach_items count: 16]; */
9792 selector_name = get_identifier ("countByEnumeratingWithState:objects:count:");
9793 #ifdef OBJCPLUS
9794 t = objc_finish_message_expr (objc_foreach_collection_decl, selector_name,
9795 /* Parameters. */
9796 tree_cons /* &__objc_foreach_enum_state */
9797 (NULL_TREE, build_fold_addr_expr_loc (location, objc_foreach_enum_state_decl),
9798 tree_cons /* __objc_foreach_items */
9799 (NULL_TREE, objc_foreach_items_decl,
9800 tree_cons /* 16 */
9801 (NULL_TREE, build_int_cst (NULL_TREE, 16), NULL_TREE))), NULL);
9802 #else
9803 /* In C, we need to decay the __objc_foreach_items array that we are passing. */
9805 struct c_expr array;
9806 array.value = objc_foreach_items_decl;
9807 t = objc_finish_message_expr (objc_foreach_collection_decl, selector_name,
9808 /* Parameters. */
9809 tree_cons /* &__objc_foreach_enum_state */
9810 (NULL_TREE, build_fold_addr_expr_loc (location, objc_foreach_enum_state_decl),
9811 tree_cons /* __objc_foreach_items */
9812 (NULL_TREE, default_function_array_conversion (location, array).value,
9813 tree_cons /* 16 */
9814 (NULL_TREE, build_int_cst (NULL_TREE, 16), NULL_TREE))), NULL);
9816 #endif
9817 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_batchsize_decl,
9818 convert (long_unsigned_type_node, t));
9819 SET_EXPR_LOCATION (t, location);
9820 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9822 /* if (__objc_foreach_batchsize == 0) */
9823 first_if = build3 (COND_EXPR, void_type_node,
9824 /* Condition. */
9825 c_fully_fold
9826 (c_common_truthvalue_conversion
9827 (location,
9828 build_binary_op (location,
9829 EQ_EXPR,
9830 objc_foreach_batchsize_decl,
9831 build_int_cst (long_unsigned_type_node, 0), 1)),
9832 false, NULL),
9833 /* Then block (we fill it in later). */
9834 NULL_TREE,
9835 /* Else block (we fill it in later). */
9836 NULL_TREE);
9837 SET_EXPR_LOCATION (first_if, location);
9838 append_to_statement_list (first_if, &BIND_EXPR_BODY (bind));
9840 /* then <object expression> = nil; */
9841 t = build2 (MODIFY_EXPR, void_type_node, object_expression, convert (objc_object_type, null_pointer_node));
9842 SET_EXPR_LOCATION (t, location);
9843 COND_EXPR_THEN (first_if) = t;
9845 /* Now we build the 'else' part of the if; once we finish building
9846 it, we attach it to first_if as the 'else' part. */
9848 /* else */
9849 /* { */
9851 /* unsigned long __objc_foreach_mutations_pointer; */
9852 objc_foreach_mutations_pointer_decl = objc_create_temporary_var (long_unsigned_type_node, "__objc_foreach_mutations_pointer");
9854 /* Generate the local variable binding. */
9855 first_else = build3 (BIND_EXPR, void_type_node, objc_foreach_mutations_pointer_decl, NULL, NULL);
9856 SET_EXPR_LOCATION (first_else, location);
9857 TREE_SIDE_EFFECTS (first_else) = 1;
9859 /* __objc_foreach_mutations_pointer = *__objc_foreach_enum_state.mutationsPtr; */
9860 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_mutations_pointer_decl,
9861 build_indirect_ref (location, objc_build_component_ref (objc_foreach_enum_state_decl,
9862 get_identifier ("mutationsPtr")),
9863 RO_UNARY_STAR));
9864 SET_EXPR_LOCATION (t, location);
9865 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
9867 /* next_batch: */
9868 next_batch_label_decl = create_artificial_label (location);
9869 t = build1 (LABEL_EXPR, void_type_node, next_batch_label_decl);
9870 SET_EXPR_LOCATION (t, location);
9871 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
9873 /* { */
9875 /* unsigned long __objc_foreach_index; */
9876 objc_foreach_index_decl = objc_create_temporary_var (long_unsigned_type_node, "__objc_foreach_index");
9878 /* Generate the local variable binding. */
9879 next_batch_bind = build3 (BIND_EXPR, void_type_node, objc_foreach_index_decl, NULL, NULL);
9880 SET_EXPR_LOCATION (next_batch_bind, location);
9881 TREE_SIDE_EFFECTS (next_batch_bind) = 1;
9882 append_to_statement_list (next_batch_bind, &BIND_EXPR_BODY (first_else));
9884 /* __objc_foreach_index = 0; */
9885 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_index_decl,
9886 build_int_cst (long_unsigned_type_node, 0));
9887 SET_EXPR_LOCATION (t, location);
9888 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9890 /* next_object: */
9891 next_object_label_decl = create_artificial_label (location);
9892 t = build1 (LABEL_EXPR, void_type_node, next_object_label_decl);
9893 SET_EXPR_LOCATION (t, location);
9894 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9896 /* if (__objc_foreach_mutation_pointer != *__objc_foreach_enum_state.mutationsPtr) objc_enumeration_mutation (<collection expression>); */
9897 t = build3 (COND_EXPR, void_type_node,
9898 /* Condition. */
9899 c_fully_fold
9900 (c_common_truthvalue_conversion
9901 (location,
9902 build_binary_op
9903 (location,
9904 NE_EXPR,
9905 objc_foreach_mutations_pointer_decl,
9906 build_indirect_ref (location,
9907 objc_build_component_ref (objc_foreach_enum_state_decl,
9908 get_identifier ("mutationsPtr")),
9909 RO_UNARY_STAR), 1)),
9910 false, NULL),
9911 /* Then block. */
9912 build_function_call (input_location,
9913 objc_enumeration_mutation_decl,
9914 tree_cons (NULL, collection_expression, NULL)),
9915 /* Else block. */
9916 NULL_TREE);
9917 SET_EXPR_LOCATION (t, location);
9918 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9920 /* <object expression> = enumState.itemsPtr[__objc_foreach_index]; */
9921 t = build2 (MODIFY_EXPR, void_type_node, object_expression,
9922 build_array_ref (location, objc_build_component_ref (objc_foreach_enum_state_decl,
9923 get_identifier ("itemsPtr")),
9924 objc_foreach_index_decl));
9925 SET_EXPR_LOCATION (t, location);
9926 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9928 /* <statements> [PS: in <statments>, 'break' jumps to break_label and 'continue' jumps to continue_label] */
9929 append_to_statement_list (for_body, &BIND_EXPR_BODY (next_batch_bind));
9931 /* continue_label: */
9932 if (continue_label)
9934 t = build1 (LABEL_EXPR, void_type_node, continue_label);
9935 SET_EXPR_LOCATION (t, location);
9936 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9939 /* __objc_foreach_index++; */
9940 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_index_decl,
9941 build_binary_op (location,
9942 PLUS_EXPR,
9943 objc_foreach_index_decl,
9944 build_int_cst (long_unsigned_type_node, 1), 1));
9945 SET_EXPR_LOCATION (t, location);
9946 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9948 /* if (__objc_foreach_index < __objc_foreach_batchsize) goto next_object; */
9949 t = build3 (COND_EXPR, void_type_node,
9950 /* Condition. */
9951 c_fully_fold
9952 (c_common_truthvalue_conversion
9953 (location,
9954 build_binary_op (location,
9955 LT_EXPR,
9956 objc_foreach_index_decl,
9957 objc_foreach_batchsize_decl, 1)),
9958 false, NULL),
9959 /* Then block. */
9960 build1 (GOTO_EXPR, void_type_node, next_object_label_decl),
9961 /* Else block. */
9962 NULL_TREE);
9963 SET_EXPR_LOCATION (t, location);
9964 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9966 /* __objc_foreach_batchsize = [__objc_foreach_collection countByEnumeratingWithState: &__objc_foreach_enum_state objects: __objc_foreach_items count: 16]; */
9967 #ifdef OBJCPLUS
9968 t = objc_finish_message_expr (objc_foreach_collection_decl, selector_name,
9969 /* Parameters. */
9970 tree_cons /* &__objc_foreach_enum_state */
9971 (NULL_TREE, build_fold_addr_expr_loc (location, objc_foreach_enum_state_decl),
9972 tree_cons /* __objc_foreach_items */
9973 (NULL_TREE, objc_foreach_items_decl,
9974 tree_cons /* 16 */
9975 (NULL_TREE, build_int_cst (NULL_TREE, 16), NULL_TREE))), NULL);
9976 #else
9977 /* In C, we need to decay the __objc_foreach_items array that we are passing. */
9979 struct c_expr array;
9980 array.value = objc_foreach_items_decl;
9981 t = objc_finish_message_expr (objc_foreach_collection_decl, selector_name,
9982 /* Parameters. */
9983 tree_cons /* &__objc_foreach_enum_state */
9984 (NULL_TREE, build_fold_addr_expr_loc (location, objc_foreach_enum_state_decl),
9985 tree_cons /* __objc_foreach_items */
9986 (NULL_TREE, default_function_array_conversion (location, array).value,
9987 tree_cons /* 16 */
9988 (NULL_TREE, build_int_cst (NULL_TREE, 16), NULL_TREE))), NULL);
9990 #endif
9991 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_batchsize_decl,
9992 convert (long_unsigned_type_node, t));
9993 SET_EXPR_LOCATION (t, location);
9994 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9996 /* } */
9998 /* if (__objc_foreach_batchsize != 0) goto next_batch; */
9999 t = build3 (COND_EXPR, void_type_node,
10000 /* Condition. */
10001 c_fully_fold
10002 (c_common_truthvalue_conversion
10003 (location,
10004 build_binary_op (location,
10005 NE_EXPR,
10006 objc_foreach_batchsize_decl,
10007 build_int_cst (long_unsigned_type_node, 0), 1)),
10008 false, NULL),
10009 /* Then block. */
10010 build1 (GOTO_EXPR, void_type_node, next_batch_label_decl),
10011 /* Else block. */
10012 NULL_TREE);
10013 SET_EXPR_LOCATION (t, location);
10014 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
10016 /* <object expression> = nil; */
10017 t = build2 (MODIFY_EXPR, void_type_node, object_expression, convert (objc_object_type, null_pointer_node));
10018 SET_EXPR_LOCATION (t, location);
10019 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
10021 /* break_label: */
10022 if (break_label)
10024 t = build1 (LABEL_EXPR, void_type_node, break_label);
10025 SET_EXPR_LOCATION (t, location);
10026 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
10029 /* } */
10030 COND_EXPR_ELSE (first_if) = first_else;
10032 /* Do the whole thing. */
10033 add_stmt (bind);
10035 #ifdef DEBUG_OBJC_FINISH_FOREACH_LOOP
10036 /* This will print to stderr the whole blurb generated by the
10037 compiler while compiling (assuming the compiler doesn't crash
10038 before getting here).
10040 debug_generic_stmt (bind);
10041 #endif
10043 /* } */
10044 /* Done by c-parser.c */
10047 /* --- SUPPORT FOR FORMAT ARG CHECKING --- */
10048 /* Return true if we have an NxString object pointer. */
10050 bool
10051 objc_string_ref_type_p (tree strp)
10053 tree tmv;
10054 if (!strp || TREE_CODE (strp) != POINTER_TYPE)
10055 return false;
10057 tmv = TYPE_MAIN_VARIANT (TREE_TYPE (strp));
10058 tmv = OBJC_TYPE_NAME (tmv);
10059 return (tmv
10060 && TREE_CODE (tmv) == IDENTIFIER_NODE
10061 && IDENTIFIER_POINTER (tmv)
10062 && !strncmp (IDENTIFIER_POINTER (tmv), "NSString", 8));
10065 /* At present the behavior of this is undefined and it does nothing. */
10066 void
10067 objc_check_format_arg (tree ARG_UNUSED (format_arg),
10068 tree ARG_UNUSED (args_list))
10072 void
10073 objc_common_init_ts (void)
10075 c_common_init_ts ();
10077 MARK_TS_DECL_NON_COMMON (CLASS_METHOD_DECL);
10078 MARK_TS_DECL_NON_COMMON (INSTANCE_METHOD_DECL);
10079 MARK_TS_DECL_NON_COMMON (KEYWORD_DECL);
10080 MARK_TS_DECL_NON_COMMON (PROPERTY_DECL);
10082 MARK_TS_COMMON (CLASS_INTERFACE_TYPE);
10083 MARK_TS_COMMON (PROTOCOL_INTERFACE_TYPE);
10084 MARK_TS_COMMON (CLASS_IMPLEMENTATION_TYPE);
10086 MARK_TS_TYPED (MESSAGE_SEND_EXPR);
10087 MARK_TS_TYPED (PROPERTY_REF);
10090 #include "gt-objc-objc-act.h"