2004-02-11 Eric Christopher <echristo@redhat.com>
[official-gcc.git] / gcc / java / parse.y
blob390b8cdaefd5bf87b0bb6f3afca3a0d68583c825
1 /* Source code parsing and tree node generation for the GNU compiler
2 for the Java(TM) language.
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
4 Free Software Foundation, Inc.
5 Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
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 2, 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 COPYING. If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA.
24 Java and all Java-based marks are trademarks or registered trademarks
25 of Sun Microsystems, Inc. in the United States and other countries.
26 The Free Software Foundation is independent of Sun Microsystems, Inc. */
28 /* This file parses java source code and issues a tree node image
29 suitable for code generation (byte code and targeted CPU assembly
30 language).
32 The grammar conforms to the Java grammar described in "The Java(TM)
33 Language Specification. J. Gosling, B. Joy, G. Steele. Addison Wesley
34 1996, ISBN 0-201-63451-1"
36 The following modifications were brought to the original grammar:
38 method_body: added the rule '| block SC_TK'
39 static_initializer: added the rule 'static block SC_TK'.
41 Note: All the extra rules described above should go away when the
42 empty_statement rule will work.
44 statement_nsi: 'nsi' should be read no_short_if.
46 Some rules have been modified to support JDK1.1 inner classes
47 definitions and other extensions. */
50 #include "config.h"
51 #include "system.h"
52 #include "coretypes.h"
53 #include "tm.h"
54 #include <dirent.h>
55 #include "tree.h"
56 #include "rtl.h"
57 #include "real.h"
58 #include "obstack.h"
59 #include "toplev.h"
60 #include "flags.h"
61 #include "java-tree.h"
62 #include "jcf.h"
63 #include "lex.h"
64 #include "parse.h"
65 #include "zipfile.h"
66 #include "convert.h"
67 #include "buffer.h"
68 #include "xref.h"
69 #include "function.h"
70 #include "except.h"
71 #include "ggc.h"
72 #include "debug.h"
73 #include "tree-inline.h"
74 #include "cgraph.h"
75 #include "target.h"
77 /* Local function prototypes */
78 static char *java_accstring_lookup (int);
79 static void classitf_redefinition_error (const char *,tree, tree, tree);
80 static void variable_redefinition_error (tree, tree, tree, int);
81 static tree create_class (int, tree, tree, tree);
82 static tree create_interface (int, tree, tree);
83 static void end_class_declaration (int);
84 static tree find_field (tree, tree);
85 static tree lookup_field_wrapper (tree, tree);
86 static int duplicate_declaration_error_p (tree, tree, tree);
87 static void register_fields (int, tree, tree);
88 static tree parser_qualified_classname (tree);
89 static int parser_check_super (tree, tree, tree);
90 static int parser_check_super_interface (tree, tree, tree);
91 static void check_modifiers_consistency (int);
92 static tree lookup_cl (tree);
93 static tree lookup_java_method2 (tree, tree, int);
94 static tree method_header (int, tree, tree, tree);
95 static void fix_method_argument_names (tree ,tree);
96 static tree method_declarator (tree, tree);
97 static void parse_warning_context (tree cl, const char *msg, ...)
98 ATTRIBUTE_PRINTF_2;
99 static void issue_warning_error_from_context (tree, const char *msg, va_list)
100 ATTRIBUTE_PRINTF (2, 0);
101 static void parse_ctor_invocation_error (void);
102 static tree parse_jdk1_1_error (const char *);
103 static void complete_class_report_errors (jdep *);
104 static int process_imports (void);
105 static void read_import_dir (tree);
106 static int find_in_imports_on_demand (tree, tree);
107 static void find_in_imports (tree, tree);
108 static void check_inner_class_access (tree, tree, tree);
109 static int check_pkg_class_access (tree, tree, bool);
110 static void register_package (tree);
111 static tree resolve_package (tree, tree *, tree *);
112 static tree resolve_class (tree, tree, tree, tree);
113 static void declare_local_variables (int, tree, tree);
114 static void dump_java_tree (enum tree_dump_index, tree);
115 static void source_start_java_method (tree);
116 static void source_end_java_method (void);
117 static tree find_name_in_single_imports (tree);
118 static void check_abstract_method_header (tree);
119 static tree lookup_java_interface_method2 (tree, tree);
120 static tree resolve_expression_name (tree, tree *);
121 static tree maybe_create_class_interface_decl (tree, tree, tree, tree);
122 static int check_class_interface_creation (int, int, tree, tree, tree, tree);
123 static tree patch_method_invocation (tree, tree, tree, int, int *, tree *);
124 static int breakdown_qualified (tree *, tree *, tree);
125 static int in_same_package (tree, tree);
126 static tree resolve_and_layout (tree, tree);
127 static tree qualify_and_find (tree, tree, tree);
128 static tree resolve_no_layout (tree, tree);
129 static int invocation_mode (tree, int);
130 static tree find_applicable_accessible_methods_list (int, tree, tree, tree);
131 static void search_applicable_methods_list (int, tree, tree, tree, tree *, tree *);
132 static tree find_most_specific_methods_list (tree);
133 static int argument_types_convertible (tree, tree);
134 static tree patch_invoke (tree, tree, tree);
135 static int maybe_use_access_method (int, tree *, tree *);
136 static tree lookup_method_invoke (int, tree, tree, tree, tree);
137 static tree register_incomplete_type (int, tree, tree, tree);
138 static tree check_inner_circular_reference (tree, tree);
139 static tree check_circular_reference (tree);
140 static tree obtain_incomplete_type (tree);
141 static tree java_complete_lhs (tree);
142 static tree java_complete_tree (tree);
143 static tree maybe_generate_pre_expand_clinit (tree);
144 static int analyze_clinit_body (tree, tree);
145 static int maybe_yank_clinit (tree);
146 static void java_complete_expand_method (tree);
147 static void java_expand_method_bodies (tree);
148 static int unresolved_type_p (tree, tree *);
149 static void create_jdep_list (struct parser_ctxt *);
150 static tree build_expr_block (tree, tree);
151 static tree enter_block (void);
152 static tree exit_block (void);
153 static tree lookup_name_in_blocks (tree);
154 static void maybe_absorb_scoping_blocks (void);
155 static tree build_method_invocation (tree, tree);
156 static tree build_new_invocation (tree, tree);
157 static tree build_assignment (int, int, tree, tree);
158 static tree build_binop (enum tree_code, int, tree, tree);
159 static tree patch_assignment (tree, tree);
160 static tree patch_binop (tree, tree, tree);
161 static tree build_unaryop (int, int, tree);
162 static tree build_incdec (int, int, tree, int);
163 static tree patch_unaryop (tree, tree);
164 static tree build_cast (int, tree, tree);
165 static tree build_null_of_type (tree);
166 static tree patch_cast (tree, tree);
167 static int valid_ref_assignconv_cast_p (tree, tree, int);
168 static int valid_builtin_assignconv_identity_widening_p (tree, tree);
169 static int valid_cast_to_p (tree, tree);
170 static int valid_method_invocation_conversion_p (tree, tree);
171 static tree try_builtin_assignconv (tree, tree, tree);
172 static tree try_reference_assignconv (tree, tree);
173 static tree build_unresolved_array_type (tree);
174 static int build_type_name_from_array_name (tree, tree *);
175 static tree build_array_from_name (tree, tree, tree, tree *);
176 static tree build_array_ref (int, tree, tree);
177 static tree patch_array_ref (tree);
178 static tree make_qualified_name (tree, tree, int);
179 static tree merge_qualified_name (tree, tree);
180 static tree make_qualified_primary (tree, tree, int);
181 static int resolve_qualified_expression_name (tree, tree *, tree *, tree *);
182 static void qualify_ambiguous_name (tree);
183 static tree resolve_field_access (tree, tree *, tree *);
184 static tree build_newarray_node (tree, tree, int);
185 static tree patch_newarray (tree);
186 static tree resolve_type_during_patch (tree);
187 static tree build_this (int);
188 static tree build_wfl_wrap (tree, int);
189 static tree build_return (int, tree);
190 static tree patch_return (tree);
191 static tree maybe_access_field (tree, tree, tree);
192 static int complete_function_arguments (tree);
193 static int check_for_static_method_reference (tree, tree, tree, tree, tree);
194 static int not_accessible_p (tree, tree, tree, int);
195 static void check_deprecation (tree, tree);
196 static int class_in_current_package (tree);
197 static tree build_if_else_statement (int, tree, tree, tree);
198 static tree patch_if_else_statement (tree);
199 static tree add_stmt_to_compound (tree, tree, tree);
200 static tree add_stmt_to_block (tree, tree, tree);
201 static tree patch_exit_expr (tree);
202 static tree build_labeled_block (int, tree);
203 static tree finish_labeled_statement (tree, tree);
204 static tree build_bc_statement (int, int, tree);
205 static tree patch_bc_statement (tree);
206 static tree patch_loop_statement (tree);
207 static tree build_new_loop (tree);
208 static tree build_loop_body (int, tree, int);
209 static tree finish_loop_body (int, tree, tree, int);
210 static tree build_debugable_stmt (int, tree);
211 static tree finish_for_loop (int, tree, tree, tree);
212 static tree patch_switch_statement (tree);
213 static tree string_constant_concatenation (tree, tree);
214 static tree build_string_concatenation (tree, tree);
215 static tree patch_string_cst (tree);
216 static tree patch_string (tree);
217 static tree encapsulate_with_try_catch (int, tree, tree, tree);
218 static tree build_assertion (int, tree, tree);
219 static tree build_try_statement (int, tree, tree);
220 static tree build_try_finally_statement (int, tree, tree);
221 static tree patch_try_statement (tree);
222 static tree patch_synchronized_statement (tree, tree);
223 static tree patch_throw_statement (tree, tree);
224 static void check_thrown_exceptions (int, tree, tree);
225 static int check_thrown_exceptions_do (tree);
226 static void purge_unchecked_exceptions (tree);
227 static bool ctors_unchecked_throws_clause_p (tree);
228 static void check_concrete_throws_clauses (tree, tree, tree, tree);
229 static void check_throws_clauses (tree, tree, tree);
230 static void finish_method_declaration (tree);
231 static tree build_super_invocation (tree);
232 static int verify_constructor_circularity (tree, tree);
233 static char *constructor_circularity_msg (tree, tree);
234 static tree build_this_super_qualified_invocation (int, tree, tree, int, int);
235 static const char *get_printable_method_name (tree);
236 static tree patch_conditional_expr (tree, tree, tree);
237 static tree generate_finit (tree);
238 static tree generate_instinit (tree);
239 static tree build_instinit_invocation (tree);
240 static void fix_constructors (tree);
241 static tree build_alias_initializer_parameter_list (int, tree, tree, int *);
242 static tree craft_constructor (tree, tree);
243 static int verify_constructor_super (tree);
244 static tree create_artificial_method (tree, int, tree, tree, tree);
245 static void start_artificial_method_body (tree);
246 static void end_artificial_method_body (tree);
247 static int check_method_redefinition (tree, tree);
248 static int check_method_types_complete (tree);
249 static bool hack_is_accessible_p (tree, tree);
250 static void java_check_regular_methods (tree);
251 static void check_interface_throws_clauses (tree, tree);
252 static void java_check_abstract_methods (tree);
253 static void unreachable_stmt_error (tree);
254 static int not_accessible_field_error (tree, tree);
255 static tree find_expr_with_wfl (tree);
256 static void missing_return_error (tree);
257 static tree build_new_array_init (int, tree);
258 static tree patch_new_array_init (tree, tree);
259 static tree maybe_build_array_element_wfl (tree);
260 static int array_constructor_check_entry (tree, tree);
261 static const char *purify_type_name (const char *);
262 static tree fold_constant_for_init (tree, tree);
263 static tree strip_out_static_field_access_decl (tree);
264 static jdeplist *reverse_jdep_list (struct parser_ctxt *);
265 static void static_ref_err (tree, tree, tree);
266 static void parser_add_interface (tree, tree, tree);
267 static void add_superinterfaces (tree, tree);
268 static tree jdep_resolve_class (jdep *);
269 static int note_possible_classname (const char *, int);
270 static void java_complete_expand_classes (void);
271 static void java_complete_expand_class (tree);
272 static void java_complete_expand_methods (tree);
273 static tree cut_identifier_in_qualified (tree);
274 static tree java_stabilize_reference (tree);
275 static tree do_unary_numeric_promotion (tree);
276 static char * operator_string (tree);
277 static tree do_merge_string_cste (tree, const char *, int, int);
278 static tree merge_string_cste (tree, tree, int);
279 static tree java_refold (tree);
280 static int java_decl_equiv (tree, tree);
281 static int binop_compound_p (enum tree_code);
282 static tree search_loop (tree);
283 static int labeled_block_contains_loop_p (tree, tree);
284 static int check_abstract_method_definitions (int, tree, tree);
285 static void java_check_abstract_method_definitions (tree);
286 static void java_debug_context_do (int);
287 static void java_parser_context_push_initialized_field (void);
288 static void java_parser_context_pop_initialized_field (void);
289 static tree reorder_static_initialized (tree);
290 static void java_parser_context_suspend (void);
291 static void java_parser_context_resume (void);
292 static int pop_current_osb (struct parser_ctxt *);
294 /* JDK 1.1 work. FIXME */
296 static tree maybe_make_nested_class_name (tree);
297 static int make_nested_class_name (tree);
298 static void set_nested_class_simple_name_value (tree, int);
299 static void link_nested_class_to_enclosing (void);
300 static tree resolve_inner_class (htab_t, tree, tree *, tree *, tree);
301 static tree find_as_inner_class (tree, tree, tree);
302 static tree find_as_inner_class_do (tree, tree);
303 static int check_inner_class_redefinition (tree, tree);
305 static tree build_thisn_assign (void);
306 static tree build_current_thisn (tree);
307 static tree build_access_to_thisn (tree, tree, int);
308 static tree maybe_build_thisn_access_method (tree);
310 static tree build_outer_field_access (tree, tree);
311 static tree build_outer_field_access_methods (tree);
312 static tree build_outer_field_access_expr (int, tree, tree,
313 tree, tree);
314 static tree build_outer_method_access_method (tree);
315 static tree build_new_access_id (void);
316 static tree build_outer_field_access_method (tree, tree, tree,
317 tree, tree);
319 static int outer_field_access_p (tree, tree);
320 static int outer_field_expanded_access_p (tree, tree *,
321 tree *, tree *);
322 static tree outer_field_access_fix (tree, tree, tree);
323 static tree build_incomplete_class_ref (int, tree);
324 static tree patch_incomplete_class_ref (tree);
325 static tree create_anonymous_class (int, tree);
326 static void patch_anonymous_class (tree, tree, tree);
327 static void add_inner_class_fields (tree, tree);
329 static tree build_dot_class_method (tree);
330 static tree build_dot_class_method_invocation (tree, tree);
331 static void create_new_parser_context (int);
332 static tree maybe_build_class_init_for_field (tree, tree);
334 static int attach_init_test_initialization_flags (void **, void *);
335 static int emit_test_initialization (void **, void *);
337 static char *string_convert_int_cst (tree);
339 /* Number of error found so far. */
340 int java_error_count;
341 /* Number of warning found so far. */
342 int java_warning_count;
343 /* Tell when not to fold, when doing xrefs */
344 int do_not_fold;
345 /* Cyclic inheritance report, as it can be set by layout_class */
346 const char *cyclic_inheritance_report;
348 /* The current parser context */
349 struct parser_ctxt *ctxp;
351 /* List of things that were analyzed for which code will be generated */
352 struct parser_ctxt *ctxp_for_generation = NULL;
354 /* binop_lookup maps token to tree_code. It is used where binary
355 operations are involved and required by the parser. RDIV_EXPR
356 covers both integral/floating point division. The code is changed
357 once the type of both operator is worked out. */
359 static const enum tree_code binop_lookup[19] =
361 PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR,
362 LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR,
363 BIT_AND_EXPR, BIT_XOR_EXPR, BIT_IOR_EXPR,
364 TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR,
365 EQ_EXPR, NE_EXPR, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR,
367 #define BINOP_LOOKUP(VALUE) \
368 binop_lookup [((VALUE) - PLUS_TK) % ARRAY_SIZE (binop_lookup)]
370 /* This is the end index for binary operators that can also be used
371 in compound assignments. */
372 #define BINOP_COMPOUND_CANDIDATES 11
374 /* The "$L" identifier we use to create labels. */
375 static GTY(()) tree label_id;
377 /* The "StringBuffer" identifier used for the String `+' operator. */
378 static GTY(()) tree wfl_string_buffer;
380 /* The "append" identifier used for String `+' operator. */
381 static GTY(()) tree wfl_append;
383 /* The "toString" identifier used for String `+' operator. */
384 static GTY(()) tree wfl_to_string;
386 /* The "java.lang" import qualified name. */
387 static GTY(()) tree java_lang_id;
389 /* The generated `inst$' identifier used for generated enclosing
390 instance/field access functions. */
391 static GTY(()) tree inst_id;
393 /* Context and flag for static blocks */
394 static GTY(()) tree current_static_block;
396 /* The generated `write_parm_value$' identifier. */
397 static GTY(()) tree wpv_id;
399 /* The list of all packages we've seen so far */
400 static GTY(()) tree package_list;
402 /* Hold THIS for the scope of the current method decl. */
403 static GTY(()) tree current_this;
405 /* Hold a list of catch clauses list. The first element of this list is
406 the list of the catch clauses of the currently analyzed try block. */
407 static GTY(()) tree currently_caught_type_list;
409 /* This holds a linked list of all the case labels for the current
410 switch statement. It is only used when checking to see if there
411 are duplicate labels. FIXME: probably this should just be attached
412 to the switch itself; then it could be referenced via
413 `ctxp->current_loop'. */
414 static GTY(()) tree case_label_list;
416 /* Anonymous class counter. Will be reset to 1 every time a non
417 anonymous class gets created. */
418 static int anonymous_class_counter = 1;
420 static GTY(()) tree src_parse_roots[1];
422 /* All classes seen from source code */
423 #define gclass_list src_parse_roots[0]
425 /* Check modifiers. If one doesn't fit, retrieve it in its declaration
426 line and point it out. */
427 /* Should point out the one that don't fit. ASCII/unicode, going
428 backward. FIXME */
430 #define check_modifiers(__message, __value, __mask) do { \
431 if ((__value) & ~(__mask)) \
433 size_t i, remainder = (__value) & ~(__mask); \
434 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++) \
435 if ((1 << i) & remainder) \
436 parse_error_context (ctxp->modifier_ctx [i], (__message), \
437 java_accstring_lookup (1 << i)); \
439 } while (0)
443 %union {
444 tree node;
445 int sub_token;
446 struct {
447 int token;
448 int location;
449 } operator;
450 int value;
454 #include "lex.c"
457 %pure_parser
459 /* Things defined here have to match the order of what's in the
460 binop_lookup table. */
462 %token PLUS_TK MINUS_TK MULT_TK DIV_TK REM_TK
463 %token LS_TK SRS_TK ZRS_TK
464 %token AND_TK XOR_TK OR_TK
465 %token BOOL_AND_TK BOOL_OR_TK
466 %token EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
468 /* This maps to the same binop_lookup entry than the token above */
470 %token PLUS_ASSIGN_TK MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
471 %token REM_ASSIGN_TK
472 %token LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
473 %token AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
476 /* Modifier TOKEN have to be kept in this order. Don't scramble it */
478 %token PUBLIC_TK PRIVATE_TK PROTECTED_TK
479 %token STATIC_TK FINAL_TK SYNCHRONIZED_TK
480 %token VOLATILE_TK TRANSIENT_TK NATIVE_TK
481 %token PAD_TK ABSTRACT_TK STRICT_TK
482 %token MODIFIER_TK
484 /* Keep those two in order, too */
485 %token DECR_TK INCR_TK
487 /* From now one, things can be in any order */
489 %token DEFAULT_TK IF_TK THROW_TK
490 %token BOOLEAN_TK DO_TK IMPLEMENTS_TK
491 %token THROWS_TK BREAK_TK IMPORT_TK
492 %token ELSE_TK INSTANCEOF_TK RETURN_TK
493 %token VOID_TK CATCH_TK INTERFACE_TK
494 %token CASE_TK EXTENDS_TK FINALLY_TK
495 %token SUPER_TK WHILE_TK CLASS_TK
496 %token SWITCH_TK CONST_TK TRY_TK
497 %token FOR_TK NEW_TK CONTINUE_TK
498 %token GOTO_TK PACKAGE_TK THIS_TK
499 %token ASSERT_TK
501 %token BYTE_TK SHORT_TK INT_TK LONG_TK
502 %token CHAR_TK INTEGRAL_TK
504 %token FLOAT_TK DOUBLE_TK FP_TK
506 %token ID_TK
508 %token REL_QM_TK REL_CL_TK NOT_TK NEG_TK
510 %token ASSIGN_ANY_TK ASSIGN_TK
511 %token OP_TK CP_TK OCB_TK CCB_TK OSB_TK CSB_TK SC_TK C_TK DOT_TK
513 %token STRING_LIT_TK CHAR_LIT_TK INT_LIT_TK FP_LIT_TK
514 %token TRUE_TK FALSE_TK BOOL_LIT_TK NULL_TK
516 %type <value> modifiers MODIFIER_TK final synchronized
518 %type <node> super ID_TK identifier
519 %type <node> name simple_name qualified_name
520 %type <node> type_declaration compilation_unit
521 field_declaration method_declaration extends_interfaces
522 interfaces interface_type_list
523 import_declarations package_declaration
524 type_declarations interface_body
525 interface_member_declaration constant_declaration
526 interface_member_declarations interface_type
527 abstract_method_declaration
528 %type <node> class_body_declaration class_member_declaration
529 static_initializer constructor_declaration block
530 %type <node> class_body_declarations constructor_header
531 %type <node> class_or_interface_type class_type class_type_list
532 constructor_declarator explicit_constructor_invocation
533 %type <node> dim_expr dim_exprs this_or_super throws
535 %type <node> variable_declarator_id variable_declarator
536 variable_declarators variable_initializer
537 variable_initializers constructor_body
538 array_initializer
540 %type <node> class_body block_end constructor_block_end
541 %type <node> statement statement_without_trailing_substatement
542 labeled_statement if_then_statement label_decl
543 if_then_else_statement while_statement for_statement
544 statement_nsi labeled_statement_nsi do_statement
545 if_then_else_statement_nsi while_statement_nsi
546 for_statement_nsi statement_expression_list for_init
547 for_update statement_expression expression_statement
548 primary_no_new_array expression primary
549 array_creation_expression array_type
550 class_instance_creation_expression field_access
551 method_invocation array_access something_dot_new
552 argument_list postfix_expression while_expression
553 post_increment_expression post_decrement_expression
554 unary_expression_not_plus_minus unary_expression
555 pre_increment_expression pre_decrement_expression
556 cast_expression
557 multiplicative_expression additive_expression
558 shift_expression relational_expression
559 equality_expression and_expression
560 exclusive_or_expression inclusive_or_expression
561 conditional_and_expression conditional_or_expression
562 conditional_expression assignment_expression
563 left_hand_side assignment for_header for_begin
564 constant_expression do_statement_begin empty_statement
565 switch_statement synchronized_statement throw_statement
566 try_statement assert_statement
567 switch_expression switch_block
568 catches catch_clause catch_clause_parameter finally
569 anonymous_class_creation trap_overflow_corner_case
570 %type <node> return_statement break_statement continue_statement
572 %type <operator> ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
573 %type <operator> REM_ASSIGN_TK PLUS_ASSIGN_TK MINUS_ASSIGN_TK
574 %type <operator> LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
575 %type <operator> AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
576 %type <operator> ASSIGN_ANY_TK assignment_operator
577 %token <operator> EQ_TK GTE_TK ZRS_TK SRS_TK GT_TK LTE_TK LS_TK
578 %token <operator> BOOL_AND_TK AND_TK BOOL_OR_TK OR_TK INCR_TK PLUS_TK
579 %token <operator> DECR_TK MINUS_TK MULT_TK DIV_TK XOR_TK REM_TK NEQ_TK
580 %token <operator> NEG_TK REL_QM_TK REL_CL_TK NOT_TK LT_TK OCB_TK CCB_TK
581 %token <operator> OP_TK OSB_TK DOT_TK THROW_TK INSTANCEOF_TK
582 %type <operator> THIS_TK SUPER_TK RETURN_TK BREAK_TK CONTINUE_TK
583 %type <operator> CASE_TK DEFAULT_TK TRY_TK CATCH_TK SYNCHRONIZED_TK
584 %type <operator> NEW_TK ASSERT_TK
586 %type <node> method_body
588 %type <node> literal INT_LIT_TK FP_LIT_TK BOOL_LIT_TK CHAR_LIT_TK
589 STRING_LIT_TK NULL_TK VOID_TK
591 %type <node> IF_TK WHILE_TK FOR_TK
593 %type <node> formal_parameter_list formal_parameter
594 method_declarator method_header
596 %type <node> primitive_type reference_type type
597 BOOLEAN_TK INTEGRAL_TK FP_TK
599 /* Added or modified JDK 1.1 rule types */
600 %type <node> type_literals
603 /* 19.2 Production from 2.3: The Syntactic Grammar */
604 goal: compilation_unit
608 /* 19.3 Productions from 3: Lexical structure */
609 literal:
610 INT_LIT_TK
611 | FP_LIT_TK
612 | BOOL_LIT_TK
613 | CHAR_LIT_TK
614 | STRING_LIT_TK
615 | NULL_TK
618 /* 19.4 Productions from 4: Types, Values and Variables */
619 type:
620 primitive_type
621 | reference_type
624 primitive_type:
625 INTEGRAL_TK
626 | FP_TK
627 | BOOLEAN_TK
630 reference_type:
631 class_or_interface_type
632 | array_type
635 class_or_interface_type:
636 name
639 class_type:
640 class_or_interface_type /* Default rule */
643 interface_type:
644 class_or_interface_type
647 array_type:
648 primitive_type dims
650 int osb = pop_current_osb (ctxp);
651 tree t = build_java_array_type (($1), -1);
652 while (--osb)
653 t = build_unresolved_array_type (t);
654 $$ = t;
656 | name dims
658 int osb = pop_current_osb (ctxp);
659 tree t = $1;
660 while (osb--)
661 t = build_unresolved_array_type (t);
662 $$ = t;
666 /* 19.5 Productions from 6: Names */
667 name:
668 simple_name /* Default rule */
669 | qualified_name /* Default rule */
672 simple_name:
673 identifier /* Default rule */
676 qualified_name:
677 name DOT_TK identifier
678 { $$ = make_qualified_name ($1, $3, $2.location); }
681 identifier:
682 ID_TK
685 /* 19.6: Production from 7: Packages */
686 compilation_unit:
687 {$$ = NULL;}
688 | package_declaration
689 | import_declarations
690 | type_declarations
691 | package_declaration import_declarations
692 | package_declaration type_declarations
693 | import_declarations type_declarations
694 | package_declaration import_declarations type_declarations
697 import_declarations:
698 import_declaration
700 $$ = NULL;
702 | import_declarations import_declaration
704 $$ = NULL;
708 type_declarations:
709 type_declaration
710 | type_declarations type_declaration
713 package_declaration:
714 PACKAGE_TK name SC_TK
716 ctxp->package = EXPR_WFL_NODE ($2);
717 register_package (ctxp->package);
719 | PACKAGE_TK error
720 {yyerror ("Missing name"); RECOVER;}
721 | PACKAGE_TK name error
722 {yyerror ("';' expected"); RECOVER;}
725 import_declaration:
726 single_type_import_declaration
727 | type_import_on_demand_declaration
730 single_type_import_declaration:
731 IMPORT_TK name SC_TK
733 tree name = EXPR_WFL_NODE ($2), last_name;
734 int i = IDENTIFIER_LENGTH (name)-1;
735 const char *last = &IDENTIFIER_POINTER (name)[i];
736 while (last != IDENTIFIER_POINTER (name))
738 if (last [0] == '.')
739 break;
740 last--;
742 last_name = get_identifier (++last);
743 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (last_name))
745 tree err = find_name_in_single_imports (last_name);
746 if (err && err != name)
747 parse_error_context
748 ($2, "Ambiguous class: `%s' and `%s'",
749 IDENTIFIER_POINTER (name),
750 IDENTIFIER_POINTER (err));
751 else
752 REGISTER_IMPORT ($2, last_name);
754 else
755 REGISTER_IMPORT ($2, last_name);
757 | IMPORT_TK error
758 {yyerror ("Missing name"); RECOVER;}
759 | IMPORT_TK name error
760 {yyerror ("';' expected"); RECOVER;}
763 type_import_on_demand_declaration:
764 IMPORT_TK name DOT_TK MULT_TK SC_TK
766 tree name = EXPR_WFL_NODE ($2);
767 tree it;
768 /* Search for duplicates. */
769 for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it))
770 if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name)
771 break;
772 /* Don't import the same thing more than once, just ignore
773 duplicates (7.5.2) */
774 if (! it)
776 read_import_dir ($2);
777 ctxp->import_demand_list =
778 chainon (ctxp->import_demand_list,
779 build_tree_list ($2, NULL_TREE));
782 | IMPORT_TK name DOT_TK error
783 {yyerror ("'*' expected"); RECOVER;}
784 | IMPORT_TK name DOT_TK MULT_TK error
785 {yyerror ("';' expected"); RECOVER;}
788 type_declaration:
789 class_declaration
790 { end_class_declaration (0); }
791 | interface_declaration
792 { end_class_declaration (0); }
793 | empty_statement
794 | error
796 YYERROR_NOW;
797 yyerror ("Class or interface declaration expected");
801 /* 19.7 Shortened from the original:
802 modifiers: modifier | modifiers modifier
803 modifier: any of public... */
804 modifiers:
805 MODIFIER_TK
807 $$ = (1 << $1);
809 | modifiers MODIFIER_TK
811 int acc = (1 << $2);
812 if ($$ & acc)
813 parse_error_context
814 (ctxp->modifier_ctx [$2], "Modifier `%s' declared twice",
815 java_accstring_lookup (acc));
816 else
818 $$ |= acc;
823 /* 19.8.1 Production from $8.1: Class Declaration */
824 class_declaration:
825 modifiers CLASS_TK identifier super interfaces
826 { create_class ($1, $3, $4, $5); }
827 class_body
829 | CLASS_TK identifier super interfaces
830 { create_class (0, $2, $3, $4); }
831 class_body
833 | modifiers CLASS_TK error
834 { yyerror ("Missing class name"); RECOVER; }
835 | CLASS_TK error
836 { yyerror ("Missing class name"); RECOVER; }
837 | CLASS_TK identifier error
839 if (!ctxp->class_err) yyerror ("'{' expected");
840 DRECOVER(class1);
842 | modifiers CLASS_TK identifier error
843 { if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER; }
846 super:
847 { $$ = NULL; }
848 | EXTENDS_TK class_type
849 { $$ = $2; }
850 | EXTENDS_TK class_type error
851 {yyerror ("'{' expected"); ctxp->class_err=1;}
852 | EXTENDS_TK error
853 {yyerror ("Missing super class name"); ctxp->class_err=1;}
856 interfaces:
857 { $$ = NULL_TREE; }
858 | IMPLEMENTS_TK interface_type_list
859 { $$ = $2; }
860 | IMPLEMENTS_TK error
862 ctxp->class_err=1;
863 yyerror ("Missing interface name");
867 interface_type_list:
868 interface_type
870 ctxp->interface_number = 1;
871 $$ = build_tree_list ($1, NULL_TREE);
873 | interface_type_list C_TK interface_type
875 ctxp->interface_number++;
876 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
878 | interface_type_list C_TK error
879 {yyerror ("Missing interface name"); RECOVER;}
882 class_body:
883 OCB_TK CCB_TK
885 /* Store the location of the `}' when doing xrefs */
886 if (flag_emit_xref)
887 DECL_END_SOURCE_LINE (GET_CPC ()) =
888 EXPR_WFL_ADD_COL ($2.location, 1);
889 $$ = GET_CPC ();
891 | OCB_TK class_body_declarations CCB_TK
893 /* Store the location of the `}' when doing xrefs */
894 if (flag_emit_xref)
895 DECL_END_SOURCE_LINE (GET_CPC ()) =
896 EXPR_WFL_ADD_COL ($3.location, 1);
897 $$ = GET_CPC ();
901 class_body_declarations:
902 class_body_declaration
903 | class_body_declarations class_body_declaration
906 class_body_declaration:
907 class_member_declaration
908 | static_initializer
909 | constructor_declaration
910 | block /* Added, JDK1.1, instance initializer */
912 if ($1 != empty_stmt_node)
914 TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
915 SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
920 class_member_declaration:
921 field_declaration
922 | method_declaration
923 | class_declaration /* Added, JDK1.1 inner classes */
924 { end_class_declaration (1); }
925 | interface_declaration /* Added, JDK1.1 inner interfaces */
926 { end_class_declaration (1); }
927 | empty_statement
930 /* 19.8.2 Productions from 8.3: Field Declarations */
931 field_declaration:
932 type variable_declarators SC_TK
933 { register_fields (0, $1, $2); }
934 | modifiers type variable_declarators SC_TK
936 check_modifiers
937 ("Illegal modifier `%s' for field declaration",
938 $1, FIELD_MODIFIERS);
939 check_modifiers_consistency ($1);
940 register_fields ($1, $2, $3);
944 variable_declarators:
945 /* Should we use build_decl_list () instead ? FIXME */
946 variable_declarator /* Default rule */
947 | variable_declarators C_TK variable_declarator
948 { $$ = chainon ($1, $3); }
949 | variable_declarators C_TK error
950 {yyerror ("Missing term"); RECOVER;}
953 variable_declarator:
954 variable_declarator_id
955 { $$ = build_tree_list ($1, NULL_TREE); }
956 | variable_declarator_id ASSIGN_TK variable_initializer
958 if (java_error_count)
959 $3 = NULL_TREE;
960 $$ = build_tree_list
961 ($1, build_assignment ($2.token, $2.location, $1, $3));
963 | variable_declarator_id ASSIGN_TK error
965 yyerror ("Missing variable initializer");
966 $$ = build_tree_list ($1, NULL_TREE);
967 RECOVER;
969 | variable_declarator_id ASSIGN_TK variable_initializer error
971 yyerror ("';' expected");
972 $$ = build_tree_list ($1, NULL_TREE);
973 RECOVER;
977 variable_declarator_id:
978 identifier
979 | variable_declarator_id OSB_TK CSB_TK
980 { $$ = build_unresolved_array_type ($1); }
981 | identifier error
982 {yyerror ("Invalid declaration"); DRECOVER(vdi);}
983 | variable_declarator_id OSB_TK error
985 yyerror ("']' expected");
986 DRECOVER(vdi);
988 | variable_declarator_id CSB_TK error
989 {yyerror ("Unbalanced ']'"); DRECOVER(vdi);}
992 variable_initializer:
993 expression
994 | array_initializer
997 /* 19.8.3 Productions from 8.4: Method Declarations */
998 method_declaration:
999 method_header
1001 current_function_decl = $1;
1002 if (current_function_decl
1003 && TREE_CODE (current_function_decl) == FUNCTION_DECL)
1004 source_start_java_method (current_function_decl);
1005 else
1006 current_function_decl = NULL_TREE;
1008 method_body
1009 { finish_method_declaration ($3); }
1010 | method_header error
1011 {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;}
1014 method_header:
1015 type method_declarator throws
1016 { $$ = method_header (0, $1, $2, $3); }
1017 | VOID_TK method_declarator throws
1018 { $$ = method_header (0, void_type_node, $2, $3); }
1019 | modifiers type method_declarator throws
1020 { $$ = method_header ($1, $2, $3, $4); }
1021 | modifiers VOID_TK method_declarator throws
1022 { $$ = method_header ($1, void_type_node, $3, $4); }
1023 | type error
1025 yyerror ("Invalid method declaration, method name required");
1026 RECOVER;
1028 | modifiers type error
1030 yyerror ("Identifier expected");
1031 RECOVER;
1033 | VOID_TK error
1035 yyerror ("Identifier expected");
1036 RECOVER;
1038 | modifiers VOID_TK error
1040 yyerror ("Identifier expected");
1041 RECOVER;
1043 | modifiers error
1045 yyerror ("Invalid method declaration, return type required");
1046 RECOVER;
1050 method_declarator:
1051 identifier OP_TK CP_TK
1053 ctxp->formal_parameter_number = 0;
1054 $$ = method_declarator ($1, NULL_TREE);
1056 | identifier OP_TK formal_parameter_list CP_TK
1057 { $$ = method_declarator ($1, $3); }
1058 | method_declarator OSB_TK CSB_TK
1060 EXPR_WFL_LINECOL (wfl_operator) = $2.location;
1061 TREE_PURPOSE ($1) =
1062 build_unresolved_array_type (TREE_PURPOSE ($1));
1063 parse_warning_context
1064 (wfl_operator,
1065 "Discouraged form of returned type specification");
1067 | identifier OP_TK error
1068 {yyerror ("')' expected"); DRECOVER(method_declarator);}
1069 | method_declarator OSB_TK error
1070 {yyerror ("']' expected"); RECOVER;}
1073 formal_parameter_list:
1074 formal_parameter
1076 ctxp->formal_parameter_number = 1;
1078 | formal_parameter_list C_TK formal_parameter
1080 ctxp->formal_parameter_number += 1;
1081 $$ = chainon ($1, $3);
1083 | formal_parameter_list C_TK error
1084 { yyerror ("Missing formal parameter term"); RECOVER; }
1087 formal_parameter:
1088 type variable_declarator_id
1090 $$ = build_tree_list ($2, $1);
1092 | final type variable_declarator_id /* Added, JDK1.1 final parms */
1094 $$ = build_tree_list ($3, $2);
1095 ARG_FINAL_P ($$) = 1;
1097 | type error
1099 yyerror ("Missing identifier"); RECOVER;
1100 $$ = NULL_TREE;
1102 | final type error
1104 yyerror ("Missing identifier"); RECOVER;
1105 $$ = NULL_TREE;
1109 final:
1110 modifiers
1112 check_modifiers ("Illegal modifier `%s'. Only `final' was expected here",
1113 $1, ACC_FINAL);
1114 if ($1 != ACC_FINAL)
1115 MODIFIER_WFL (FINAL_TK) = build_wfl_node (NULL_TREE);
1119 throws:
1120 { $$ = NULL_TREE; }
1121 | THROWS_TK class_type_list
1122 { $$ = $2; }
1123 | THROWS_TK error
1124 {yyerror ("Missing class type term"); RECOVER;}
1127 class_type_list:
1128 class_type
1129 { $$ = build_tree_list ($1, $1); }
1130 | class_type_list C_TK class_type
1131 { $$ = tree_cons ($3, $3, $1); }
1132 | class_type_list C_TK error
1133 {yyerror ("Missing class type term"); RECOVER;}
1136 method_body:
1137 block
1138 | SC_TK { $$ = NULL_TREE; }
1141 /* 19.8.4 Productions from 8.5: Static Initializers */
1142 static_initializer:
1143 static block
1145 TREE_CHAIN ($2) = CPC_STATIC_INITIALIZER_STMT (ctxp);
1146 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, $2);
1147 current_static_block = NULL_TREE;
1151 static: /* Test lval.sub_token here */
1152 modifiers
1154 check_modifiers ("Illegal modifier `%s' for static initializer", $1, ACC_STATIC);
1155 /* Can't have a static initializer in an innerclass */
1156 if ($1 | ACC_STATIC &&
1157 GET_CPC_LIST () && !TOPLEVEL_CLASS_DECL_P (GET_CPC ()))
1158 parse_error_context
1159 (MODIFIER_WFL (STATIC_TK),
1160 "Can't define static initializer in class `%s'. Static initializer can only be defined in top-level classes",
1161 IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())));
1162 SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
1166 /* 19.8.5 Productions from 8.6: Constructor Declarations */
1167 constructor_declaration:
1168 constructor_header
1170 current_function_decl = $1;
1171 source_start_java_method (current_function_decl);
1173 constructor_body
1174 { finish_method_declaration ($3); }
1177 constructor_header:
1178 constructor_declarator throws
1179 { $$ = method_header (0, NULL_TREE, $1, $2); }
1180 | modifiers constructor_declarator throws
1181 { $$ = method_header ($1, NULL_TREE, $2, $3); }
1184 constructor_declarator:
1185 simple_name OP_TK CP_TK
1187 ctxp->formal_parameter_number = 0;
1188 $$ = method_declarator ($1, NULL_TREE);
1190 | simple_name OP_TK formal_parameter_list CP_TK
1191 { $$ = method_declarator ($1, $3); }
1194 constructor_body:
1195 /* Unlike regular method, we always need a complete (empty)
1196 body so we can safely perform all the required code
1197 addition (super invocation and field initialization) */
1198 block_begin constructor_block_end
1200 BLOCK_EXPR_BODY ($2) = empty_stmt_node;
1201 $$ = $2;
1203 | block_begin explicit_constructor_invocation constructor_block_end
1204 { $$ = $3; }
1205 | block_begin block_statements constructor_block_end
1206 { $$ = $3; }
1207 | block_begin explicit_constructor_invocation block_statements constructor_block_end
1208 { $$ = $4; }
1211 constructor_block_end:
1212 block_end
1215 /* Error recovery for that rule moved down expression_statement: rule. */
1216 explicit_constructor_invocation:
1217 this_or_super OP_TK CP_TK SC_TK
1219 $$ = build_method_invocation ($1, NULL_TREE);
1220 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1221 $$ = java_method_add_stmt (current_function_decl, $$);
1223 | this_or_super OP_TK argument_list CP_TK SC_TK
1225 $$ = build_method_invocation ($1, $3);
1226 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1227 $$ = java_method_add_stmt (current_function_decl, $$);
1229 /* Added, JDK1.1 inner classes. Modified because the rule
1230 'primary' couldn't work. */
1231 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
1232 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1233 | name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
1234 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1237 this_or_super: /* Added, simplifies error diagnostics */
1238 THIS_TK
1240 tree wfl = build_wfl_node (this_identifier_node);
1241 EXPR_WFL_LINECOL (wfl) = $1.location;
1242 $$ = wfl;
1244 | SUPER_TK
1246 tree wfl = build_wfl_node (super_identifier_node);
1247 EXPR_WFL_LINECOL (wfl) = $1.location;
1248 $$ = wfl;
1252 /* 19.9 Productions from 9: Interfaces */
1253 /* 19.9.1 Productions from 9.1: Interfaces Declarations */
1254 interface_declaration:
1255 INTERFACE_TK identifier
1256 { create_interface (0, $2, NULL_TREE); }
1257 interface_body
1258 { ; }
1259 | modifiers INTERFACE_TK identifier
1260 { create_interface ($1, $3, NULL_TREE); }
1261 interface_body
1262 { ; }
1263 | INTERFACE_TK identifier extends_interfaces
1264 { create_interface (0, $2, $3); }
1265 interface_body
1266 { ; }
1267 | modifiers INTERFACE_TK identifier extends_interfaces
1268 { create_interface ($1, $3, $4); }
1269 interface_body
1270 { ; }
1271 | INTERFACE_TK identifier error
1272 { yyerror ("'{' expected"); RECOVER; }
1273 | modifiers INTERFACE_TK identifier error
1274 { yyerror ("'{' expected"); RECOVER; }
1277 extends_interfaces:
1278 EXTENDS_TK interface_type
1280 ctxp->interface_number = 1;
1281 $$ = build_tree_list ($2, NULL_TREE);
1283 | extends_interfaces C_TK interface_type
1285 ctxp->interface_number++;
1286 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
1288 | EXTENDS_TK error
1289 {yyerror ("Invalid interface type"); RECOVER;}
1290 | extends_interfaces C_TK error
1291 {yyerror ("Missing term"); RECOVER;}
1294 interface_body:
1295 OCB_TK CCB_TK
1296 { $$ = NULL_TREE; }
1297 | OCB_TK interface_member_declarations CCB_TK
1298 { $$ = NULL_TREE; }
1301 interface_member_declarations:
1302 interface_member_declaration
1303 | interface_member_declarations interface_member_declaration
1306 interface_member_declaration:
1307 constant_declaration
1308 | abstract_method_declaration
1309 | class_declaration /* Added, JDK1.1 inner classes */
1310 { end_class_declaration (1); }
1311 | interface_declaration /* Added, JDK1.1 inner interfaces */
1312 { end_class_declaration (1); }
1315 constant_declaration:
1316 field_declaration
1319 abstract_method_declaration:
1320 method_header SC_TK
1322 check_abstract_method_header ($1);
1323 current_function_decl = NULL_TREE; /* FIXME ? */
1325 | method_header error
1326 {yyerror ("';' expected"); RECOVER;}
1329 /* 19.10 Productions from 10: Arrays */
1330 array_initializer:
1331 OCB_TK CCB_TK
1332 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1333 | OCB_TK C_TK CCB_TK
1334 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1335 | OCB_TK variable_initializers CCB_TK
1336 { $$ = build_new_array_init ($1.location, $2); }
1337 | OCB_TK variable_initializers C_TK CCB_TK
1338 { $$ = build_new_array_init ($1.location, $2); }
1341 variable_initializers:
1342 variable_initializer
1344 $$ = tree_cons (maybe_build_array_element_wfl ($1),
1345 $1, NULL_TREE);
1347 | variable_initializers C_TK variable_initializer
1349 $$ = tree_cons (maybe_build_array_element_wfl ($3), $3, $1);
1351 | variable_initializers C_TK error
1352 {yyerror ("Missing term"); RECOVER;}
1355 /* 19.11 Production from 14: Blocks and Statements */
1356 block:
1357 block_begin block_end
1358 { $$ = $2; }
1359 | block_begin block_statements block_end
1360 { $$ = $3; }
1363 block_begin:
1364 OCB_TK
1365 { enter_block (); }
1368 block_end:
1369 CCB_TK
1371 maybe_absorb_scoping_blocks ();
1372 /* Store the location of the `}' when doing xrefs */
1373 if (current_function_decl && flag_emit_xref)
1374 DECL_END_SOURCE_LINE (current_function_decl) =
1375 EXPR_WFL_ADD_COL ($1.location, 1);
1376 $$ = exit_block ();
1377 if (!BLOCK_SUBBLOCKS ($$))
1378 BLOCK_SUBBLOCKS ($$) = empty_stmt_node;
1382 block_statements:
1383 block_statement
1384 | block_statements block_statement
1387 block_statement:
1388 local_variable_declaration_statement
1389 | statement
1390 { java_method_add_stmt (current_function_decl, $1); }
1391 | class_declaration /* Added, JDK1.1 local classes */
1393 LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1;
1394 end_class_declaration (1);
1398 local_variable_declaration_statement:
1399 local_variable_declaration SC_TK /* Can't catch missing ';' here */
1402 local_variable_declaration:
1403 type variable_declarators
1404 { declare_local_variables (0, $1, $2); }
1405 | final type variable_declarators /* Added, JDK1.1 final locals */
1406 { declare_local_variables ($1, $2, $3); }
1409 statement:
1410 statement_without_trailing_substatement
1411 | labeled_statement
1412 | if_then_statement
1413 | if_then_else_statement
1414 | while_statement
1415 | for_statement
1416 { $$ = exit_block (); }
1419 statement_nsi:
1420 statement_without_trailing_substatement
1421 | labeled_statement_nsi
1422 | if_then_else_statement_nsi
1423 | while_statement_nsi
1424 | for_statement_nsi
1425 { $$ = exit_block (); }
1428 statement_without_trailing_substatement:
1429 block
1430 | empty_statement
1431 | expression_statement
1432 | switch_statement
1433 | do_statement
1434 | break_statement
1435 | continue_statement
1436 | return_statement
1437 | synchronized_statement
1438 | throw_statement
1439 | try_statement
1440 | assert_statement
1443 empty_statement:
1444 SC_TK
1446 if (flag_extraneous_semicolon
1447 && ! current_static_block
1448 && (! current_function_decl ||
1449 /* Verify we're not in a inner class declaration */
1450 (GET_CPC () != TYPE_NAME
1451 (DECL_CONTEXT (current_function_decl)))))
1454 EXPR_WFL_SET_LINECOL (wfl_operator, input_line, -1);
1455 parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used");
1457 $$ = empty_stmt_node;
1461 label_decl:
1462 identifier REL_CL_TK
1464 $$ = build_labeled_block (EXPR_WFL_LINECOL ($1),
1465 EXPR_WFL_NODE ($1));
1466 pushlevel (2);
1467 push_labeled_block ($$);
1468 PUSH_LABELED_BLOCK ($$);
1472 labeled_statement:
1473 label_decl statement
1474 { $$ = finish_labeled_statement ($1, $2); }
1475 | identifier error
1476 {yyerror ("':' expected"); RECOVER;}
1479 labeled_statement_nsi:
1480 label_decl statement_nsi
1481 { $$ = finish_labeled_statement ($1, $2); }
1484 /* We concentrate here a bunch of error handling rules that we couldn't write
1485 earlier, because expression_statement catches a missing ';'. */
1486 expression_statement:
1487 statement_expression SC_TK
1489 /* We have a statement. Generate a WFL around it so
1490 we can debug it */
1491 $$ = build_expr_wfl ($1, input_filename, input_line, 0);
1492 /* We know we have a statement, so set the debug
1493 info to be eventually generate here. */
1494 $$ = JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
1496 | error SC_TK
1498 YYNOT_TWICE yyerror ("Invalid expression statement");
1499 DRECOVER (expr_stmt);
1501 | error OCB_TK
1503 YYNOT_TWICE yyerror ("Invalid expression statement");
1504 DRECOVER (expr_stmt);
1506 | error CCB_TK
1508 YYNOT_TWICE yyerror ("Invalid expression statement");
1509 DRECOVER (expr_stmt);
1511 | this_or_super OP_TK error
1512 {yyerror ("')' expected"); RECOVER;}
1513 | this_or_super OP_TK CP_TK error
1515 parse_ctor_invocation_error ();
1516 RECOVER;
1518 | this_or_super OP_TK argument_list error
1519 {yyerror ("')' expected"); RECOVER;}
1520 | this_or_super OP_TK argument_list CP_TK error
1522 parse_ctor_invocation_error ();
1523 RECOVER;
1525 | name DOT_TK SUPER_TK error
1526 {yyerror ("'(' expected"); RECOVER;}
1527 | name DOT_TK SUPER_TK OP_TK error
1528 {yyerror ("')' expected"); RECOVER;}
1529 | name DOT_TK SUPER_TK OP_TK argument_list error
1530 {yyerror ("')' expected"); RECOVER;}
1531 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK error
1532 {yyerror ("';' expected"); RECOVER;}
1533 | name DOT_TK SUPER_TK OP_TK CP_TK error
1534 {yyerror ("';' expected"); RECOVER;}
1537 statement_expression:
1538 assignment
1539 | pre_increment_expression
1540 | pre_decrement_expression
1541 | post_increment_expression
1542 | post_decrement_expression
1543 | method_invocation
1544 | class_instance_creation_expression
1547 if_then_statement:
1548 IF_TK OP_TK expression CP_TK statement
1550 $$ = build_if_else_statement ($2.location, $3,
1551 $5, NULL_TREE);
1553 | IF_TK error
1554 {yyerror ("'(' expected"); RECOVER;}
1555 | IF_TK OP_TK error
1556 {yyerror ("Missing term"); RECOVER;}
1557 | IF_TK OP_TK expression error
1558 {yyerror ("')' expected"); RECOVER;}
1561 if_then_else_statement:
1562 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
1563 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1566 if_then_else_statement_nsi:
1567 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
1568 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1571 switch_statement:
1572 switch_expression
1574 enter_block ();
1576 switch_block
1578 /* Make into "proper list" of COMPOUND_EXPRs.
1579 I.e. make the last statement also have its own
1580 COMPOUND_EXPR. */
1581 maybe_absorb_scoping_blocks ();
1582 TREE_OPERAND ($1, 1) = exit_block ();
1583 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $1);
1587 switch_expression:
1588 SWITCH_TK OP_TK expression CP_TK
1590 $$ = build (SWITCH_EXPR, NULL_TREE, $3, NULL_TREE);
1591 EXPR_WFL_LINECOL ($$) = $2.location;
1593 | SWITCH_TK error
1594 {yyerror ("'(' expected"); RECOVER;}
1595 | SWITCH_TK OP_TK error
1596 {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);}
1597 | SWITCH_TK OP_TK expression CP_TK error
1598 {yyerror ("'{' expected"); RECOVER;}
1601 /* Default assignment is there to avoid type node on switch_block
1602 node. */
1604 switch_block:
1605 OCB_TK CCB_TK
1606 { $$ = NULL_TREE; }
1607 | OCB_TK switch_labels CCB_TK
1608 { $$ = NULL_TREE; }
1609 | OCB_TK switch_block_statement_groups CCB_TK
1610 { $$ = NULL_TREE; }
1611 | OCB_TK switch_block_statement_groups switch_labels CCB_TK
1612 { $$ = NULL_TREE; }
1615 switch_block_statement_groups:
1616 switch_block_statement_group
1617 | switch_block_statement_groups switch_block_statement_group
1620 switch_block_statement_group:
1621 switch_labels block_statements
1624 switch_labels:
1625 switch_label
1626 | switch_labels switch_label
1629 switch_label:
1630 CASE_TK constant_expression REL_CL_TK
1632 tree lab = build1 (CASE_EXPR, NULL_TREE, $2);
1633 EXPR_WFL_LINECOL (lab) = $1.location;
1634 java_method_add_stmt (current_function_decl, lab);
1636 | DEFAULT_TK REL_CL_TK
1638 tree lab = build (DEFAULT_EXPR, NULL_TREE, NULL_TREE);
1639 EXPR_WFL_LINECOL (lab) = $1.location;
1640 java_method_add_stmt (current_function_decl, lab);
1642 | CASE_TK error
1643 {yyerror ("Missing or invalid constant expression"); RECOVER;}
1644 | CASE_TK constant_expression error
1645 {yyerror ("':' expected"); RECOVER;}
1646 | DEFAULT_TK error
1647 {yyerror ("':' expected"); RECOVER;}
1650 while_expression:
1651 WHILE_TK OP_TK expression CP_TK
1653 tree body = build_loop_body ($2.location, $3, 0);
1654 $$ = build_new_loop (body);
1658 while_statement:
1659 while_expression statement
1660 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1661 | WHILE_TK error
1662 {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;}
1663 | WHILE_TK OP_TK error
1664 {yyerror ("Missing term and ')' expected"); RECOVER;}
1665 | WHILE_TK OP_TK expression error
1666 {yyerror ("')' expected"); RECOVER;}
1669 while_statement_nsi:
1670 while_expression statement_nsi
1671 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1674 do_statement_begin:
1675 DO_TK
1677 tree body = build_loop_body (0, NULL_TREE, 1);
1678 $$ = build_new_loop (body);
1680 /* Need error handing here. FIXME */
1683 do_statement:
1684 do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1685 { $$ = finish_loop_body ($4.location, $5, $2, 1); }
1688 for_statement:
1689 for_begin SC_TK expression SC_TK for_update CP_TK statement
1691 if (TREE_CODE_CLASS (TREE_CODE ($3)) == 'c')
1692 $3 = build_wfl_node ($3);
1693 $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);
1695 | for_begin SC_TK SC_TK for_update CP_TK statement
1697 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1698 /* We have not condition, so we get rid of the EXIT_EXPR */
1699 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1700 empty_stmt_node;
1702 | for_begin SC_TK error
1703 {yyerror ("Invalid control expression"); RECOVER;}
1704 | for_begin SC_TK expression SC_TK error
1705 {yyerror ("Invalid update expression"); RECOVER;}
1706 | for_begin SC_TK SC_TK error
1707 {yyerror ("Invalid update expression"); RECOVER;}
1710 for_statement_nsi:
1711 for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
1712 { $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);}
1713 | for_begin SC_TK SC_TK for_update CP_TK statement_nsi
1715 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1716 /* We have not condition, so we get rid of the EXIT_EXPR */
1717 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1718 empty_stmt_node;
1722 for_header:
1723 FOR_TK OP_TK
1725 /* This scope defined for local variable that may be
1726 defined within the scope of the for loop */
1727 enter_block ();
1729 | FOR_TK error
1730 {yyerror ("'(' expected"); DRECOVER(for_1);}
1731 | FOR_TK OP_TK error
1732 {yyerror ("Invalid init statement"); RECOVER;}
1735 for_begin:
1736 for_header for_init
1738 /* We now declare the loop body. The loop is
1739 declared as a for loop. */
1740 tree body = build_loop_body (0, NULL_TREE, 0);
1741 $$ = build_new_loop (body);
1742 FOR_LOOP_P ($$) = 1;
1743 /* The loop is added to the current block the for
1744 statement is defined within */
1745 java_method_add_stmt (current_function_decl, $$);
1748 for_init: /* Can be empty */
1749 { $$ = empty_stmt_node; }
1750 | statement_expression_list
1752 /* Init statement recorded within the previously
1753 defined block scope */
1754 $$ = java_method_add_stmt (current_function_decl, $1);
1756 | local_variable_declaration
1758 /* Local variable are recorded within the previously
1759 defined block scope */
1760 $$ = NULL_TREE;
1762 | statement_expression_list error
1763 {yyerror ("';' expected"); DRECOVER(for_init_1);}
1766 for_update: /* Can be empty */
1767 {$$ = empty_stmt_node;}
1768 | statement_expression_list
1769 { $$ = build_debugable_stmt (BUILD_LOCATION (), $1); }
1772 statement_expression_list:
1773 statement_expression
1774 { $$ = add_stmt_to_compound (NULL_TREE, NULL_TREE, $1); }
1775 | statement_expression_list C_TK statement_expression
1776 { $$ = add_stmt_to_compound ($1, NULL_TREE, $3); }
1777 | statement_expression_list C_TK error
1778 {yyerror ("Missing term"); RECOVER;}
1781 break_statement:
1782 BREAK_TK SC_TK
1783 { $$ = build_bc_statement ($1.location, 1, NULL_TREE); }
1784 | BREAK_TK identifier SC_TK
1785 { $$ = build_bc_statement ($1.location, 1, $2); }
1786 | BREAK_TK error
1787 {yyerror ("Missing term"); RECOVER;}
1788 | BREAK_TK identifier error
1789 {yyerror ("';' expected"); RECOVER;}
1792 continue_statement:
1793 CONTINUE_TK SC_TK
1794 { $$ = build_bc_statement ($1.location, 0, NULL_TREE); }
1795 | CONTINUE_TK identifier SC_TK
1796 { $$ = build_bc_statement ($1.location, 0, $2); }
1797 | CONTINUE_TK error
1798 {yyerror ("Missing term"); RECOVER;}
1799 | CONTINUE_TK identifier error
1800 {yyerror ("';' expected"); RECOVER;}
1803 return_statement:
1804 RETURN_TK SC_TK
1805 { $$ = build_return ($1.location, NULL_TREE); }
1806 | RETURN_TK expression SC_TK
1807 { $$ = build_return ($1.location, $2); }
1808 | RETURN_TK error
1809 {yyerror ("Missing term"); RECOVER;}
1810 | RETURN_TK expression error
1811 {yyerror ("';' expected"); RECOVER;}
1814 throw_statement:
1815 THROW_TK expression SC_TK
1817 $$ = build1 (THROW_EXPR, NULL_TREE, $2);
1818 EXPR_WFL_LINECOL ($$) = $1.location;
1820 | THROW_TK error
1821 {yyerror ("Missing term"); RECOVER;}
1822 | THROW_TK expression error
1823 {yyerror ("';' expected"); RECOVER;}
1826 assert_statement:
1827 ASSERT_TK expression REL_CL_TK expression SC_TK
1829 $$ = build_assertion ($1.location, $2, $4);
1831 | ASSERT_TK expression SC_TK
1833 $$ = build_assertion ($1.location, $2, NULL_TREE);
1835 | ASSERT_TK error
1836 {yyerror ("Missing term"); RECOVER;}
1837 | ASSERT_TK expression error
1838 {yyerror ("';' expected"); RECOVER;}
1841 synchronized_statement:
1842 synchronized OP_TK expression CP_TK block
1844 $$ = build (SYNCHRONIZED_EXPR, NULL_TREE, $3, $5);
1845 EXPR_WFL_LINECOL ($$) =
1846 EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK));
1848 | synchronized OP_TK expression CP_TK error
1849 {yyerror ("'{' expected"); RECOVER;}
1850 | synchronized error
1851 {yyerror ("'(' expected"); RECOVER;}
1852 | synchronized OP_TK error CP_TK
1853 {yyerror ("Missing term"); RECOVER;}
1854 | synchronized OP_TK error
1855 {yyerror ("Missing term"); RECOVER;}
1858 synchronized:
1859 modifiers
1861 check_modifiers (
1862 "Illegal modifier `%s'. Only `synchronized' was expected here",
1863 $1, ACC_SYNCHRONIZED);
1864 if ($1 != ACC_SYNCHRONIZED)
1865 MODIFIER_WFL (SYNCHRONIZED_TK) =
1866 build_wfl_node (NULL_TREE);
1870 try_statement:
1871 TRY_TK block catches
1872 { $$ = build_try_statement ($1.location, $2, $3); }
1873 | TRY_TK block finally
1874 { $$ = build_try_finally_statement ($1.location, $2, $3); }
1875 | TRY_TK block catches finally
1876 { $$ = build_try_finally_statement
1877 ($1.location, build_try_statement ($1.location,
1878 $2, $3), $4);
1880 | TRY_TK error
1881 {yyerror ("'{' expected"); DRECOVER (try_statement);}
1884 catches:
1885 catch_clause
1886 | catches catch_clause
1888 TREE_CHAIN ($2) = $1;
1889 $$ = $2;
1893 catch_clause:
1894 catch_clause_parameter block
1896 java_method_add_stmt (current_function_decl, $2);
1897 exit_block ();
1898 $$ = $1;
1902 catch_clause_parameter:
1903 CATCH_TK OP_TK formal_parameter CP_TK
1905 /* We add a block to define a scope for
1906 formal_parameter (CCBP). The formal parameter is
1907 declared initialized by the appropriate function
1908 call */
1909 tree ccpb;
1910 tree init;
1911 if ($3)
1913 ccpb = enter_block ();
1914 init = build_assignment
1915 (ASSIGN_TK, $2.location, TREE_PURPOSE ($3),
1916 build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
1917 declare_local_variables (0, TREE_VALUE ($3),
1918 build_tree_list
1919 (TREE_PURPOSE ($3), init));
1920 $$ = build1 (CATCH_EXPR, NULL_TREE, ccpb);
1921 EXPR_WFL_LINECOL ($$) = $1.location;
1923 else
1925 $$ = error_mark_node;
1928 | CATCH_TK error
1929 {yyerror ("'(' expected"); RECOVER; $$ = NULL_TREE;}
1930 | CATCH_TK OP_TK error
1932 yyerror ("Missing term or ')' expected");
1933 RECOVER; $$ = NULL_TREE;
1935 | CATCH_TK OP_TK error CP_TK /* That's for () */
1936 {yyerror ("Missing term"); RECOVER; $$ = NULL_TREE;}
1939 finally:
1940 FINALLY_TK block
1941 { $$ = $2; }
1942 | FINALLY_TK error
1943 {yyerror ("'{' expected"); RECOVER; }
1946 /* 19.12 Production from 15: Expressions */
1947 primary:
1948 primary_no_new_array
1949 | array_creation_expression
1952 primary_no_new_array:
1953 literal
1954 | THIS_TK
1955 { $$ = build_this ($1.location); }
1956 | OP_TK expression CP_TK
1957 {$$ = $2;}
1958 | class_instance_creation_expression
1959 | field_access
1960 | method_invocation
1961 | array_access
1962 | type_literals
1963 /* Added, JDK1.1 inner classes. Documentation is wrong
1964 refering to a 'ClassName' (class_name) rule that doesn't
1965 exist. Used name: instead. */
1966 | name DOT_TK THIS_TK
1968 tree wfl = build_wfl_node (this_identifier_node);
1969 $$ = make_qualified_primary ($1, wfl, EXPR_WFL_LINECOL ($1));
1971 | OP_TK expression error
1972 {yyerror ("')' expected"); RECOVER;}
1973 | name DOT_TK error
1974 {yyerror ("'class' or 'this' expected" ); RECOVER;}
1975 | primitive_type DOT_TK error
1976 {yyerror ("'class' expected" ); RECOVER;}
1977 | VOID_TK DOT_TK error
1978 {yyerror ("'class' expected" ); RECOVER;}
1981 type_literals:
1982 name DOT_TK CLASS_TK
1983 { $$ = build_incomplete_class_ref ($2.location, $1); }
1984 | array_type DOT_TK CLASS_TK
1985 { $$ = build_incomplete_class_ref ($2.location, $1); }
1986 | primitive_type DOT_TK CLASS_TK
1987 { $$ = build_incomplete_class_ref ($2.location, $1); }
1988 | VOID_TK DOT_TK CLASS_TK
1990 $$ = build_incomplete_class_ref ($2.location,
1991 void_type_node);
1995 class_instance_creation_expression:
1996 NEW_TK class_type OP_TK argument_list CP_TK
1997 { $$ = build_new_invocation ($2, $4); }
1998 | NEW_TK class_type OP_TK CP_TK
1999 { $$ = build_new_invocation ($2, NULL_TREE); }
2000 | anonymous_class_creation
2001 /* Added, JDK1.1 inner classes, modified to use name or
2002 primary instead of primary solely which couldn't work in
2003 all situations. */
2004 | something_dot_new identifier OP_TK CP_TK
2006 tree ctor = build_new_invocation ($2, NULL_TREE);
2007 $$ = make_qualified_primary ($1, ctor,
2008 EXPR_WFL_LINECOL ($1));
2010 | something_dot_new identifier OP_TK CP_TK class_body
2011 | something_dot_new identifier OP_TK argument_list CP_TK
2013 tree ctor = build_new_invocation ($2, $4);
2014 $$ = make_qualified_primary ($1, ctor,
2015 EXPR_WFL_LINECOL ($1));
2017 | something_dot_new identifier OP_TK argument_list CP_TK class_body
2018 | NEW_TK error SC_TK
2019 {yyerror ("'(' expected"); DRECOVER(new_1);}
2020 | NEW_TK class_type error
2021 {yyerror ("'(' expected"); RECOVER;}
2022 | NEW_TK class_type OP_TK error
2023 {yyerror ("')' or term expected"); RECOVER;}
2024 | NEW_TK class_type OP_TK argument_list error
2025 {yyerror ("')' expected"); RECOVER;}
2026 | something_dot_new error
2027 {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;}
2028 | something_dot_new identifier error
2029 {yyerror ("'(' expected"); RECOVER;}
2032 /* Created after JDK1.1 rules originally added to
2033 class_instance_creation_expression, but modified to use
2034 'class_type' instead of 'TypeName' (type_name) which is mentioned
2035 in the documentation but doesn't exist. */
2037 anonymous_class_creation:
2038 NEW_TK class_type OP_TK argument_list CP_TK
2039 { create_anonymous_class ($1.location, $2); }
2040 class_body
2042 tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2043 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2045 end_class_declaration (1);
2047 /* Now we can craft the new expression */
2048 $$ = build_new_invocation (id, $4);
2050 /* Note that we can't possibly be here if
2051 `class_type' is an interface (in which case the
2052 anonymous class extends Object and implements
2053 `class_type', hence its constructor can't have
2054 arguments.) */
2056 /* Otherwise, the innerclass must feature a
2057 constructor matching `argument_list'. Anonymous
2058 classes are a bit special: it's impossible to
2059 define constructor for them, hence constructors
2060 must be generated following the hints provided by
2061 the `new' expression. Whether a super constructor
2062 of that nature exists or not is to be verified
2063 later on in verify_constructor_super.
2065 It's during the expansion of a `new' statement
2066 refering to an anonymous class that a ctor will
2067 be generated for the anonymous class, with the
2068 right arguments. */
2071 | NEW_TK class_type OP_TK CP_TK
2072 { create_anonymous_class ($1.location, $2); }
2073 class_body
2075 tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2076 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2078 end_class_declaration (1);
2080 /* Now we can craft the new expression. The
2081 statement doesn't need to be remember so that a
2082 constructor can be generated, since its signature
2083 is already known. */
2084 $$ = build_new_invocation (id, NULL_TREE);
2088 something_dot_new: /* Added, not part of the specs. */
2089 name DOT_TK NEW_TK
2090 { $$ = $1; }
2091 | primary DOT_TK NEW_TK
2092 { $$ = $1; }
2095 argument_list:
2096 expression
2098 $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
2099 ctxp->formal_parameter_number = 1;
2101 | argument_list C_TK expression
2103 ctxp->formal_parameter_number += 1;
2104 $$ = tree_cons (NULL_TREE, $3, $1);
2106 | argument_list C_TK error
2107 {yyerror ("Missing term"); RECOVER;}
2110 array_creation_expression:
2111 NEW_TK primitive_type dim_exprs
2112 { $$ = build_newarray_node ($2, $3, 0); }
2113 | NEW_TK class_or_interface_type dim_exprs
2114 { $$ = build_newarray_node ($2, $3, 0); }
2115 | NEW_TK primitive_type dim_exprs dims
2116 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2117 | NEW_TK class_or_interface_type dim_exprs dims
2118 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2119 /* Added, JDK1.1 anonymous array. Initial documentation rule
2120 modified */
2121 | NEW_TK class_or_interface_type dims array_initializer
2123 char *sig;
2124 int osb = pop_current_osb (ctxp);
2125 while (osb--)
2126 obstack_grow (&temporary_obstack, "[]", 2);
2127 obstack_1grow (&temporary_obstack, '\0');
2128 sig = obstack_finish (&temporary_obstack);
2129 $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2130 $2, get_identifier (sig), $4);
2132 | NEW_TK primitive_type dims array_initializer
2134 int osb = pop_current_osb (ctxp);
2135 tree type = $2;
2136 while (osb--)
2137 type = build_java_array_type (type, -1);
2138 $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2139 build_pointer_type (type), NULL_TREE, $4);
2141 | NEW_TK error CSB_TK
2142 {yyerror ("'[' expected"); DRECOVER ("]");}
2143 | NEW_TK error OSB_TK
2144 {yyerror ("']' expected"); RECOVER;}
2147 dim_exprs:
2148 dim_expr
2149 { $$ = build_tree_list (NULL_TREE, $1); }
2150 | dim_exprs dim_expr
2151 { $$ = tree_cons (NULL_TREE, $2, $$); }
2154 dim_expr:
2155 OSB_TK expression CSB_TK
2157 if (JNUMERIC_TYPE_P (TREE_TYPE ($2)))
2159 $2 = build_wfl_node ($2);
2160 TREE_TYPE ($2) = NULL_TREE;
2162 EXPR_WFL_LINECOL ($2) = $1.location;
2163 $$ = $2;
2165 | OSB_TK expression error
2166 {yyerror ("']' expected"); RECOVER;}
2167 | OSB_TK error
2169 yyerror ("Missing term");
2170 yyerror ("']' expected");
2171 RECOVER;
2175 dims:
2176 OSB_TK CSB_TK
2178 int allocate = 0;
2179 /* If not initialized, allocate memory for the osb
2180 numbers stack */
2181 if (!ctxp->osb_limit)
2183 allocate = ctxp->osb_limit = 32;
2184 ctxp->osb_depth = -1;
2186 /* If capacity overflown, reallocate a bigger chunk */
2187 else if (ctxp->osb_depth+1 == ctxp->osb_limit)
2188 allocate = ctxp->osb_limit << 1;
2190 if (allocate)
2192 allocate *= sizeof (int);
2193 if (ctxp->osb_number)
2194 ctxp->osb_number = xrealloc (ctxp->osb_number,
2195 allocate);
2196 else
2197 ctxp->osb_number = xmalloc (allocate);
2199 ctxp->osb_depth++;
2200 CURRENT_OSB (ctxp) = 1;
2202 | dims OSB_TK CSB_TK
2203 { CURRENT_OSB (ctxp)++; }
2204 | dims OSB_TK error
2205 { yyerror ("']' expected"); RECOVER;}
2208 field_access:
2209 primary DOT_TK identifier
2210 { $$ = make_qualified_primary ($1, $3, $2.location); }
2211 /* FIXME - REWRITE TO:
2212 { $$ = build_binop (COMPONENT_REF, $2.location, $1, $3); } */
2213 | SUPER_TK DOT_TK identifier
2215 tree super_wfl = build_wfl_node (super_identifier_node);
2216 EXPR_WFL_LINECOL (super_wfl) = $1.location;
2217 $$ = make_qualified_name (super_wfl, $3, $2.location);
2219 | SUPER_TK error
2220 {yyerror ("Field expected"); DRECOVER (super_field_acces);}
2223 method_invocation:
2224 name OP_TK CP_TK
2225 { $$ = build_method_invocation ($1, NULL_TREE); }
2226 | name OP_TK argument_list CP_TK
2227 { $$ = build_method_invocation ($1, $3); }
2228 | primary DOT_TK identifier OP_TK CP_TK
2230 if (TREE_CODE ($1) == THIS_EXPR)
2231 $$ = build_this_super_qualified_invocation
2232 (1, $3, NULL_TREE, 0, $2.location);
2233 else
2235 tree invok = build_method_invocation ($3, NULL_TREE);
2236 $$ = make_qualified_primary ($1, invok, $2.location);
2239 | primary DOT_TK identifier OP_TK argument_list CP_TK
2241 if (TREE_CODE ($1) == THIS_EXPR)
2242 $$ = build_this_super_qualified_invocation
2243 (1, $3, $5, 0, $2.location);
2244 else
2246 tree invok = build_method_invocation ($3, $5);
2247 $$ = make_qualified_primary ($1, invok, $2.location);
2250 | SUPER_TK DOT_TK identifier OP_TK CP_TK
2252 $$ = build_this_super_qualified_invocation
2253 (0, $3, NULL_TREE, $1.location, $2.location);
2255 | SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
2257 $$ = build_this_super_qualified_invocation
2258 (0, $3, $5, $1.location, $2.location);
2260 /* Screws up thing. I let it here until I'm convinced it can
2261 be removed. FIXME
2262 | primary DOT_TK error
2263 {yyerror ("'(' expected"); DRECOVER(bad);} */
2264 | SUPER_TK DOT_TK error CP_TK
2265 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2266 | SUPER_TK DOT_TK error DOT_TK
2267 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2270 array_access:
2271 name OSB_TK expression CSB_TK
2272 { $$ = build_array_ref ($2.location, $1, $3); }
2273 | primary_no_new_array OSB_TK expression CSB_TK
2274 { $$ = build_array_ref ($2.location, $1, $3); }
2275 | name OSB_TK error
2277 yyerror ("Missing term and ']' expected");
2278 DRECOVER(array_access);
2280 | name OSB_TK expression error
2282 yyerror ("']' expected");
2283 DRECOVER(array_access);
2285 | primary_no_new_array OSB_TK error
2287 yyerror ("Missing term and ']' expected");
2288 DRECOVER(array_access);
2290 | primary_no_new_array OSB_TK expression error
2292 yyerror ("']' expected");
2293 DRECOVER(array_access);
2297 postfix_expression:
2298 primary
2299 | name
2300 | post_increment_expression
2301 | post_decrement_expression
2304 post_increment_expression:
2305 postfix_expression INCR_TK
2306 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2309 post_decrement_expression:
2310 postfix_expression DECR_TK
2311 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2314 trap_overflow_corner_case:
2315 pre_increment_expression
2316 | pre_decrement_expression
2317 | PLUS_TK unary_expression
2318 {$$ = build_unaryop ($1.token, $1.location, $2); }
2319 | unary_expression_not_plus_minus
2320 | PLUS_TK error
2321 {yyerror ("Missing term"); RECOVER}
2324 unary_expression:
2325 trap_overflow_corner_case
2327 error_if_numeric_overflow ($1);
2328 $$ = $1;
2330 | MINUS_TK trap_overflow_corner_case
2331 {$$ = build_unaryop ($1.token, $1.location, $2); }
2332 | MINUS_TK error
2333 {yyerror ("Missing term"); RECOVER}
2336 pre_increment_expression:
2337 INCR_TK unary_expression
2338 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2339 | INCR_TK error
2340 {yyerror ("Missing term"); RECOVER}
2343 pre_decrement_expression:
2344 DECR_TK unary_expression
2345 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2346 | DECR_TK error
2347 {yyerror ("Missing term"); RECOVER}
2350 unary_expression_not_plus_minus:
2351 postfix_expression
2352 | NOT_TK unary_expression
2353 {$$ = build_unaryop ($1.token, $1.location, $2); }
2354 | NEG_TK unary_expression
2355 {$$ = build_unaryop ($1.token, $1.location, $2); }
2356 | cast_expression
2357 | NOT_TK error
2358 {yyerror ("Missing term"); RECOVER}
2359 | NEG_TK error
2360 {yyerror ("Missing term"); RECOVER}
2363 cast_expression: /* Error handling here is potentially weak */
2364 OP_TK primitive_type dims CP_TK unary_expression
2366 tree type = $2;
2367 int osb = pop_current_osb (ctxp);
2368 while (osb--)
2369 type = build_java_array_type (type, -1);
2370 $$ = build_cast ($1.location, type, $5);
2372 | OP_TK primitive_type CP_TK unary_expression
2373 { $$ = build_cast ($1.location, $2, $4); }
2374 | OP_TK expression CP_TK unary_expression_not_plus_minus
2375 { $$ = build_cast ($1.location, $2, $4); }
2376 | OP_TK name dims CP_TK unary_expression_not_plus_minus
2378 const char *ptr;
2379 int osb = pop_current_osb (ctxp);
2380 obstack_grow (&temporary_obstack,
2381 IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)),
2382 IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2)));
2383 while (osb--)
2384 obstack_grow (&temporary_obstack, "[]", 2);
2385 obstack_1grow (&temporary_obstack, '\0');
2386 ptr = obstack_finish (&temporary_obstack);
2387 EXPR_WFL_NODE ($2) = get_identifier (ptr);
2388 $$ = build_cast ($1.location, $2, $5);
2390 | OP_TK primitive_type OSB_TK error
2391 {yyerror ("']' expected, invalid type expression");}
2392 | OP_TK error
2394 YYNOT_TWICE yyerror ("Invalid type expression"); RECOVER;
2395 RECOVER;
2397 | OP_TK primitive_type dims CP_TK error
2398 {yyerror ("Missing term"); RECOVER;}
2399 | OP_TK primitive_type CP_TK error
2400 {yyerror ("Missing term"); RECOVER;}
2401 | OP_TK name dims CP_TK error
2402 {yyerror ("Missing term"); RECOVER;}
2405 multiplicative_expression:
2406 unary_expression
2407 | multiplicative_expression MULT_TK unary_expression
2409 $$ = build_binop (BINOP_LOOKUP ($2.token),
2410 $2.location, $1, $3);
2412 | multiplicative_expression DIV_TK unary_expression
2414 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2415 $1, $3);
2417 | multiplicative_expression REM_TK unary_expression
2419 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2420 $1, $3);
2422 | multiplicative_expression MULT_TK error
2423 {yyerror ("Missing term"); RECOVER;}
2424 | multiplicative_expression DIV_TK error
2425 {yyerror ("Missing term"); RECOVER;}
2426 | multiplicative_expression REM_TK error
2427 {yyerror ("Missing term"); RECOVER;}
2430 additive_expression:
2431 multiplicative_expression
2432 | additive_expression PLUS_TK multiplicative_expression
2434 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2435 $1, $3);
2437 | additive_expression MINUS_TK multiplicative_expression
2439 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2440 $1, $3);
2442 | additive_expression PLUS_TK error
2443 {yyerror ("Missing term"); RECOVER;}
2444 | additive_expression MINUS_TK error
2445 {yyerror ("Missing term"); RECOVER;}
2448 shift_expression:
2449 additive_expression
2450 | shift_expression LS_TK additive_expression
2452 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2453 $1, $3);
2455 | shift_expression SRS_TK additive_expression
2457 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2458 $1, $3);
2460 | shift_expression ZRS_TK additive_expression
2462 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2463 $1, $3);
2465 | shift_expression LS_TK error
2466 {yyerror ("Missing term"); RECOVER;}
2467 | shift_expression SRS_TK error
2468 {yyerror ("Missing term"); RECOVER;}
2469 | shift_expression ZRS_TK error
2470 {yyerror ("Missing term"); RECOVER;}
2473 relational_expression:
2474 shift_expression
2475 | relational_expression LT_TK shift_expression
2477 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2478 $1, $3);
2480 | relational_expression GT_TK shift_expression
2482 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2483 $1, $3);
2485 | relational_expression LTE_TK shift_expression
2487 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2488 $1, $3);
2490 | relational_expression GTE_TK shift_expression
2492 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2493 $1, $3);
2495 | relational_expression INSTANCEOF_TK reference_type
2496 { $$ = build_binop (INSTANCEOF_EXPR, $2.location, $1, $3); }
2497 | relational_expression LT_TK error
2498 {yyerror ("Missing term"); RECOVER;}
2499 | relational_expression GT_TK error
2500 {yyerror ("Missing term"); RECOVER;}
2501 | relational_expression LTE_TK error
2502 {yyerror ("Missing term"); RECOVER;}
2503 | relational_expression GTE_TK error
2504 {yyerror ("Missing term"); RECOVER;}
2505 | relational_expression INSTANCEOF_TK error
2506 {yyerror ("Invalid reference type"); RECOVER;}
2509 equality_expression:
2510 relational_expression
2511 | equality_expression EQ_TK relational_expression
2513 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2514 $1, $3);
2516 | equality_expression NEQ_TK relational_expression
2518 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2519 $1, $3);
2521 | equality_expression EQ_TK error
2522 {yyerror ("Missing term"); RECOVER;}
2523 | equality_expression NEQ_TK error
2524 {yyerror ("Missing term"); RECOVER;}
2527 and_expression:
2528 equality_expression
2529 | and_expression AND_TK equality_expression
2531 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2532 $1, $3);
2534 | and_expression AND_TK error
2535 {yyerror ("Missing term"); RECOVER;}
2538 exclusive_or_expression:
2539 and_expression
2540 | exclusive_or_expression XOR_TK and_expression
2542 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2543 $1, $3);
2545 | exclusive_or_expression XOR_TK error
2546 {yyerror ("Missing term"); RECOVER;}
2549 inclusive_or_expression:
2550 exclusive_or_expression
2551 | inclusive_or_expression OR_TK exclusive_or_expression
2553 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2554 $1, $3);
2556 | inclusive_or_expression OR_TK error
2557 {yyerror ("Missing term"); RECOVER;}
2560 conditional_and_expression:
2561 inclusive_or_expression
2562 | conditional_and_expression BOOL_AND_TK inclusive_or_expression
2564 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2565 $1, $3);
2567 | conditional_and_expression BOOL_AND_TK error
2568 {yyerror ("Missing term"); RECOVER;}
2571 conditional_or_expression:
2572 conditional_and_expression
2573 | conditional_or_expression BOOL_OR_TK conditional_and_expression
2575 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2576 $1, $3);
2578 | conditional_or_expression BOOL_OR_TK error
2579 {yyerror ("Missing term"); RECOVER;}
2582 conditional_expression: /* Error handling here is weak */
2583 conditional_or_expression
2584 | conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
2586 $$ = build (CONDITIONAL_EXPR, NULL_TREE, $1, $3, $5);
2587 EXPR_WFL_LINECOL ($$) = $2.location;
2589 | conditional_or_expression REL_QM_TK REL_CL_TK error
2591 YYERROR_NOW;
2592 yyerror ("Missing term");
2593 DRECOVER (1);
2595 | conditional_or_expression REL_QM_TK error
2596 {yyerror ("Missing term"); DRECOVER (2);}
2597 | conditional_or_expression REL_QM_TK expression REL_CL_TK error
2598 {yyerror ("Missing term"); DRECOVER (3);}
2601 assignment_expression:
2602 conditional_expression
2603 | assignment
2606 assignment:
2607 left_hand_side assignment_operator assignment_expression
2608 { $$ = build_assignment ($2.token, $2.location, $1, $3); }
2609 | left_hand_side assignment_operator error
2611 YYNOT_TWICE yyerror ("Missing term");
2612 DRECOVER (assign);
2616 left_hand_side:
2617 name
2618 | field_access
2619 | array_access
2622 assignment_operator:
2623 ASSIGN_ANY_TK
2624 | ASSIGN_TK
2627 expression:
2628 assignment_expression
2631 constant_expression:
2632 expression
2637 /* Helper function to retrieve an OSB count. Should be used when the
2638 `dims:' rule is being used. */
2640 static int
2641 pop_current_osb (struct parser_ctxt *ctxp)
2643 int to_return;
2645 if (ctxp->osb_depth < 0)
2646 abort ();
2648 to_return = CURRENT_OSB (ctxp);
2649 ctxp->osb_depth--;
2651 return to_return;
2656 /* This section of the code deal with save/restoring parser contexts.
2657 Add mode documentation here. FIXME */
2659 /* Helper function. Create a new parser context. With
2660 COPY_FROM_PREVIOUS set to a nonzero value, content of the previous
2661 context is copied, otherwise, the new context is zeroed. The newly
2662 created context becomes the current one. */
2664 static void
2665 create_new_parser_context (int copy_from_previous)
2667 struct parser_ctxt *new;
2669 new = ggc_alloc (sizeof (struct parser_ctxt));
2670 if (copy_from_previous)
2672 memcpy (new, ctxp, sizeof (struct parser_ctxt));
2673 /* This flag, indicating the context saves global values,
2674 should only be set by java_parser_context_save_global. */
2675 new->saved_data_ctx = 0;
2677 else
2678 memset (new, 0, sizeof (struct parser_ctxt));
2680 new->next = ctxp;
2681 ctxp = new;
2684 /* Create a new parser context and make it the current one. */
2686 void
2687 java_push_parser_context (void)
2689 create_new_parser_context (0);
2692 void
2693 java_pop_parser_context (int generate)
2695 tree current;
2696 struct parser_ctxt *toFree, *next;
2698 if (!ctxp)
2699 return;
2701 toFree = ctxp;
2702 next = ctxp->next;
2703 if (next)
2705 input_line = ctxp->lineno;
2706 current_class = ctxp->class_type;
2709 /* If the old and new lexers differ, then free the old one. */
2710 if (ctxp->lexer && next && ctxp->lexer != next->lexer)
2711 java_destroy_lexer (ctxp->lexer);
2713 /* Set the single import class file flag to 0 for the current list
2714 of imported things */
2715 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2716 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 0;
2718 /* And restore those of the previous context */
2719 if ((ctxp = next)) /* Assignment is really meant here */
2720 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2721 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 1;
2723 /* If we pushed a context to parse a class intended to be generated,
2724 we keep it so we can remember the class. What we could actually
2725 do is to just update a list of class names. */
2726 if (generate)
2728 toFree->next = ctxp_for_generation;
2729 ctxp_for_generation = toFree;
2733 /* Create a parser context for the use of saving some global
2734 variables. */
2736 void
2737 java_parser_context_save_global (void)
2739 if (!ctxp)
2741 java_push_parser_context ();
2742 ctxp->saved_data_ctx = 1;
2745 /* If this context already stores data, create a new one suitable
2746 for data storage. */
2747 else if (ctxp->saved_data)
2749 create_new_parser_context (1);
2750 ctxp->saved_data_ctx = 1;
2753 ctxp->lineno = input_line;
2754 ctxp->class_type = current_class;
2755 ctxp->filename = input_filename;
2756 ctxp->function_decl = current_function_decl;
2757 ctxp->saved_data = 1;
2760 /* Restore some global variables from the previous context. Make the
2761 previous context the current one. */
2763 void
2764 java_parser_context_restore_global (void)
2766 input_line = ctxp->lineno;
2767 current_class = ctxp->class_type;
2768 input_filename = ctxp->filename;
2769 if (wfl_operator)
2771 tree s;
2772 BUILD_FILENAME_IDENTIFIER_NODE (s, input_filename);
2773 EXPR_WFL_FILENAME_NODE (wfl_operator) = s;
2775 current_function_decl = ctxp->function_decl;
2776 ctxp->saved_data = 0;
2777 if (ctxp->saved_data_ctx)
2778 java_pop_parser_context (0);
2781 /* Suspend vital data for the current class/function being parsed so
2782 that an other class can be parsed. Used to let local/anonymous
2783 classes be parsed. */
2785 static void
2786 java_parser_context_suspend (void)
2788 /* This makes debugging through java_debug_context easier */
2789 static const char *const name = "<inner buffer context>";
2791 /* Duplicate the previous context, use it to save the globals we're
2792 interested in */
2793 create_new_parser_context (1);
2794 ctxp->function_decl = current_function_decl;
2795 ctxp->class_type = current_class;
2797 /* Then create a new context which inherits all data from the
2798 previous one. This will be the new current context */
2799 create_new_parser_context (1);
2801 /* Help debugging */
2802 ctxp->next->filename = name;
2805 /* Resume vital data for the current class/function being parsed so
2806 that an other class can be parsed. Used to let local/anonymous
2807 classes be parsed. The trick is the data storing file position
2808 informations must be restored to their current value, so parsing
2809 can resume as if no context was ever saved. */
2811 static void
2812 java_parser_context_resume (void)
2814 struct parser_ctxt *old = ctxp; /* This one is to be discarded */
2815 struct parser_ctxt *saver = old->next; /* This one contain saved info */
2816 struct parser_ctxt *restored = saver->next; /* This one is the old current */
2818 /* We need to inherit the list of classes to complete/generate */
2819 restored->classd_list = old->classd_list;
2820 restored->class_list = old->class_list;
2822 /* Restore the current class and function from the saver */
2823 current_class = saver->class_type;
2824 current_function_decl = saver->function_decl;
2826 /* Retrieve the restored context */
2827 ctxp = restored;
2829 /* Re-installed the data for the parsing to carry on */
2830 memcpy (&ctxp->marker_begining, &old->marker_begining,
2831 (size_t)(&ctxp->marker_end - &ctxp->marker_begining));
2834 /* Add a new anchor node to which all statement(s) initializing static
2835 and non static initialized upon declaration field(s) will be
2836 linked. */
2838 static void
2839 java_parser_context_push_initialized_field (void)
2841 tree node;
2843 node = build_tree_list (NULL_TREE, NULL_TREE);
2844 TREE_CHAIN (node) = CPC_STATIC_INITIALIZER_LIST (ctxp);
2845 CPC_STATIC_INITIALIZER_LIST (ctxp) = node;
2847 node = build_tree_list (NULL_TREE, NULL_TREE);
2848 TREE_CHAIN (node) = CPC_INITIALIZER_LIST (ctxp);
2849 CPC_INITIALIZER_LIST (ctxp) = node;
2851 node = build_tree_list (NULL_TREE, NULL_TREE);
2852 TREE_CHAIN (node) = CPC_INSTANCE_INITIALIZER_LIST (ctxp);
2853 CPC_INSTANCE_INITIALIZER_LIST (ctxp) = node;
2856 /* Pop the lists of initialized field. If this lists aren't empty,
2857 remember them so we can use it to create and populate the finit$
2858 or <clinit> functions. */
2860 static void
2861 java_parser_context_pop_initialized_field (void)
2863 tree stmts;
2864 tree class_type = TREE_TYPE (GET_CPC ());
2866 if (CPC_INITIALIZER_LIST (ctxp))
2868 stmts = CPC_INITIALIZER_STMT (ctxp);
2869 CPC_INITIALIZER_LIST (ctxp) = TREE_CHAIN (CPC_INITIALIZER_LIST (ctxp));
2870 if (stmts && !java_error_count)
2871 TYPE_FINIT_STMT_LIST (class_type) = reorder_static_initialized (stmts);
2874 if (CPC_STATIC_INITIALIZER_LIST (ctxp))
2876 stmts = CPC_STATIC_INITIALIZER_STMT (ctxp);
2877 CPC_STATIC_INITIALIZER_LIST (ctxp) =
2878 TREE_CHAIN (CPC_STATIC_INITIALIZER_LIST (ctxp));
2879 /* Keep initialization in order to enforce 8.5 */
2880 if (stmts && !java_error_count)
2881 TYPE_CLINIT_STMT_LIST (class_type) = nreverse (stmts);
2884 /* JDK 1.1 instance initializers */
2885 if (CPC_INSTANCE_INITIALIZER_LIST (ctxp))
2887 stmts = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
2888 CPC_INSTANCE_INITIALIZER_LIST (ctxp) =
2889 TREE_CHAIN (CPC_INSTANCE_INITIALIZER_LIST (ctxp));
2890 if (stmts && !java_error_count)
2891 TYPE_II_STMT_LIST (class_type) = nreverse (stmts);
2895 static tree
2896 reorder_static_initialized (tree list)
2898 /* We have to keep things in order. The alias initializer have to
2899 come first, then the initialized regular field, in reverse to
2900 keep them in lexical order. */
2901 tree marker, previous = NULL_TREE;
2902 for (marker = list; marker; previous = marker, marker = TREE_CHAIN (marker))
2903 if (TREE_CODE (marker) == TREE_LIST
2904 && !TREE_VALUE (marker) && !TREE_PURPOSE (marker))
2905 break;
2907 /* No static initialized, the list is fine as is */
2908 if (!previous)
2909 list = TREE_CHAIN (marker);
2911 /* No marker? reverse the whole list */
2912 else if (!marker)
2913 list = nreverse (list);
2915 /* Otherwise, reverse what's after the marker and the new reordered
2916 sublist will replace the marker. */
2917 else
2919 TREE_CHAIN (previous) = NULL_TREE;
2920 list = nreverse (list);
2921 list = chainon (TREE_CHAIN (marker), list);
2923 return list;
2926 /* Helper functions to dump the parser context stack. */
2928 #define TAB_CONTEXT(C) \
2929 {int i; for (i = 0; i < (C); i++) fputc (' ', stderr);}
2931 static void
2932 java_debug_context_do (int tab)
2934 struct parser_ctxt *copy = ctxp;
2935 while (copy)
2937 TAB_CONTEXT (tab);
2938 fprintf (stderr, "ctxt: 0x%0lX\n", (unsigned long)copy);
2939 TAB_CONTEXT (tab);
2940 fprintf (stderr, "filename: %s\n", copy->filename);
2941 TAB_CONTEXT (tab);
2942 fprintf (stderr, "lineno: %d\n", copy->lineno);
2943 TAB_CONTEXT (tab);
2944 fprintf (stderr, "package: %s\n",
2945 (copy->package ?
2946 IDENTIFIER_POINTER (copy->package) : "<none>"));
2947 TAB_CONTEXT (tab);
2948 fprintf (stderr, "context for saving: %d\n", copy->saved_data_ctx);
2949 TAB_CONTEXT (tab);
2950 fprintf (stderr, "saved data: %d\n", copy->saved_data);
2951 copy = copy->next;
2952 tab += 2;
2956 /* Dump the stacked up parser contexts. Intended to be called from a
2957 debugger. */
2959 void
2960 java_debug_context (void)
2962 java_debug_context_do (0);
2967 /* Flag for the error report routine to issue the error the first time
2968 it's called (overriding the default behavior which is to drop the
2969 first invocation and honor the second one, taking advantage of a
2970 richer context. */
2971 static int force_error = 0;
2973 /* Reporting an constructor invocation error. */
2974 static void
2975 parse_ctor_invocation_error (void)
2977 if (DECL_CONSTRUCTOR_P (current_function_decl))
2978 yyerror ("Constructor invocation must be first thing in a constructor");
2979 else
2980 yyerror ("Only constructors can invoke constructors");
2983 /* Reporting JDK1.1 features not implemented. */
2985 static tree
2986 parse_jdk1_1_error (const char *msg)
2988 sorry (": `%s' JDK1.1(TM) feature", msg);
2989 java_error_count++;
2990 return empty_stmt_node;
2993 static int do_warning = 0;
2995 void
2996 yyerror (const char *msg)
2998 static java_lc elc;
2999 static int prev_lineno;
3000 static const char *prev_msg;
3002 int save_lineno;
3003 char *remainder, *code_from_source;
3005 if (!force_error && prev_lineno == input_line)
3006 return;
3008 /* Save current error location but report latter, when the context is
3009 richer. */
3010 if (ctxp->java_error_flag == 0)
3012 ctxp->java_error_flag = 1;
3013 elc = ctxp->elc;
3014 /* Do something to use the previous line if we're reaching the
3015 end of the file... */
3016 #ifdef VERBOSE_SKELETON
3017 printf ("* Error detected (%s)\n", (msg ? msg : "(null)"));
3018 #endif
3019 return;
3022 /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
3023 if (!force_error && msg == prev_msg && prev_lineno == elc.line)
3024 return;
3026 ctxp->java_error_flag = 0;
3027 if (do_warning)
3028 java_warning_count++;
3029 else
3030 java_error_count++;
3032 if (elc.col == 0 && msg && msg[1] == ';')
3034 elc.col = ctxp->p_line->char_col-1;
3035 elc.line = ctxp->p_line->lineno;
3038 save_lineno = input_line;
3039 prev_lineno = input_line = elc.line;
3040 prev_msg = msg;
3042 code_from_source = java_get_line_col (ctxp->filename, elc.line, elc.col);
3043 obstack_grow0 (&temporary_obstack,
3044 code_from_source, strlen (code_from_source));
3045 remainder = obstack_finish (&temporary_obstack);
3046 if (do_warning)
3047 warning ("%s.\n%s", msg, remainder);
3048 else
3049 error ("%s.\n%s", msg, remainder);
3051 /* This allow us to cheaply avoid an extra 'Invalid expression
3052 statement' error report when errors have been already reported on
3053 the same line. This occurs when we report an error but don't have
3054 a synchronization point other than ';', which
3055 expression_statement is the only one to take care of. */
3056 ctxp->prevent_ese = input_line = save_lineno;
3059 static void
3060 issue_warning_error_from_context (tree cl, const char *msg, va_list ap)
3062 const char *saved, *saved_input_filename;
3063 char buffer [4096];
3064 vsprintf (buffer, msg, ap);
3065 force_error = 1;
3067 ctxp->elc.line = EXPR_WFL_LINENO (cl);
3068 ctxp->elc.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1 :
3069 (EXPR_WFL_COLNO (cl) == 0xffe ? -2 : EXPR_WFL_COLNO (cl)));
3071 /* We have a CL, that's a good reason for using it if it contains data */
3072 saved = ctxp->filename;
3073 if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
3074 ctxp->filename = EXPR_WFL_FILENAME (cl);
3075 saved_input_filename = input_filename;
3076 input_filename = ctxp->filename;
3077 java_error (NULL);
3078 java_error (buffer);
3079 ctxp->filename = saved;
3080 input_filename = saved_input_filename;
3081 force_error = 0;
3084 /* Issue an error message at a current source line CL */
3086 void
3087 parse_error_context (tree cl, const char *msg, ...)
3089 va_list ap;
3090 va_start (ap, msg);
3091 issue_warning_error_from_context (cl, msg, ap);
3092 va_end (ap);
3095 /* Issue a warning at a current source line CL */
3097 static void
3098 parse_warning_context (tree cl, const char *msg, ...)
3100 va_list ap;
3101 va_start (ap, msg);
3103 force_error = do_warning = 1;
3104 issue_warning_error_from_context (cl, msg, ap);
3105 do_warning = force_error = 0;
3106 va_end (ap);
3109 static tree
3110 find_expr_with_wfl (tree node)
3112 while (node)
3114 char code;
3115 tree to_return;
3117 switch (TREE_CODE (node))
3119 case BLOCK:
3120 node = BLOCK_EXPR_BODY (node);
3121 continue;
3123 case COMPOUND_EXPR:
3124 to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
3125 if (to_return)
3126 return to_return;
3127 node = TREE_OPERAND (node, 1);
3128 continue;
3130 case LOOP_EXPR:
3131 node = TREE_OPERAND (node, 0);
3132 continue;
3134 case LABELED_BLOCK_EXPR:
3135 node = TREE_OPERAND (node, 1);
3136 continue;
3138 default:
3139 code = TREE_CODE_CLASS (TREE_CODE (node));
3140 if (((code == '1') || (code == '2') || (code == 'e'))
3141 && EXPR_WFL_LINECOL (node))
3142 return node;
3143 return NULL_TREE;
3146 return NULL_TREE;
3149 /* Issue a missing return statement error. Uses METHOD to figure the
3150 last line of the method the error occurs in. */
3152 static void
3153 missing_return_error (tree method)
3155 EXPR_WFL_SET_LINECOL (wfl_operator, DECL_FUNCTION_LAST_LINE (method), -2);
3156 parse_error_context (wfl_operator, "Missing return statement");
3159 /* Issue an unreachable statement error. From NODE, find the next
3160 statement to report appropriately. */
3161 static void
3162 unreachable_stmt_error (tree node)
3164 /* Browse node to find the next expression node that has a WFL. Use
3165 the location to report the error */
3166 if (TREE_CODE (node) == COMPOUND_EXPR)
3167 node = find_expr_with_wfl (TREE_OPERAND (node, 1));
3168 else
3169 node = find_expr_with_wfl (node);
3171 if (node)
3173 EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
3174 parse_error_context (wfl_operator, "Unreachable statement");
3176 else
3177 abort ();
3180 static int
3181 not_accessible_field_error (tree wfl, tree decl)
3183 parse_error_context
3184 (wfl, "Can't access %s field `%s.%s' from `%s'",
3185 java_accstring_lookup (get_access_flags_from_decl (decl)),
3186 GET_TYPE_NAME (DECL_CONTEXT (decl)),
3187 IDENTIFIER_POINTER (DECL_NAME (decl)),
3188 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
3189 return 1;
3193 java_report_errors (void)
3195 if (java_error_count)
3196 fprintf (stderr, "%d error%s",
3197 java_error_count, (java_error_count == 1 ? "" : "s"));
3198 if (java_warning_count)
3199 fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
3200 java_warning_count, (java_warning_count == 1 ? "" : "s"));
3201 if (java_error_count || java_warning_count)
3202 putc ('\n', stderr);
3203 return java_error_count;
3206 static char *
3207 java_accstring_lookup (int flags)
3209 static char buffer [80];
3210 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
3212 /* Access modifier looked-up first for easier report on forbidden
3213 access. */
3214 if (flags & ACC_PUBLIC) COPY_RETURN ("public");
3215 if (flags & ACC_PRIVATE) COPY_RETURN ("private");
3216 if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
3217 if (flags & ACC_STATIC) COPY_RETURN ("static");
3218 if (flags & ACC_FINAL) COPY_RETURN ("final");
3219 if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
3220 if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
3221 if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
3222 if (flags & ACC_NATIVE) COPY_RETURN ("native");
3223 if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
3224 if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
3226 buffer [0] = '\0';
3227 return buffer;
3228 #undef COPY_RETURN
3231 /* Issuing error messages upon redefinition of classes, interfaces or
3232 variables. */
3234 static void
3235 classitf_redefinition_error (const char *context, tree id, tree decl, tree cl)
3237 parse_error_context (cl, "%s `%s' already defined in %s:%d",
3238 context, IDENTIFIER_POINTER (id),
3239 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3240 /* Here we should point out where its redefined. It's a unicode. FIXME */
3243 static void
3244 variable_redefinition_error (tree context, tree name, tree type, int line)
3246 const char *type_name;
3248 /* Figure a proper name for type. We might haven't resolved it */
3249 if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
3250 type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
3251 else
3252 type_name = lang_printable_name (type, 0);
3254 parse_error_context (context,
3255 "Variable `%s' is already defined in this method and was declared `%s %s' at line %d",
3256 IDENTIFIER_POINTER (name),
3257 type_name, IDENTIFIER_POINTER (name), line);
3260 /* If ANAME is terminated with `[]', it indicates an array. This
3261 function returns the number of `[]' found and if this number is
3262 greater than zero, it extracts the array type name and places it in
3263 the node pointed to by TRIMMED unless TRIMMED is null. */
3265 static int
3266 build_type_name_from_array_name (tree aname, tree *trimmed)
3268 const char *name = IDENTIFIER_POINTER (aname);
3269 int len = IDENTIFIER_LENGTH (aname);
3270 int array_dims;
3272 STRING_STRIP_BRACKETS (name, len, array_dims);
3274 if (array_dims && trimmed)
3275 *trimmed = get_identifier_with_length (name, len);
3277 return array_dims;
3280 static tree
3281 build_array_from_name (tree type, tree type_wfl, tree name, tree *ret_name)
3283 int more_dims = 0;
3285 /* Eventually get more dims */
3286 more_dims = build_type_name_from_array_name (name, &name);
3288 /* If we have, then craft a new type for this variable */
3289 if (more_dims)
3291 tree save = type;
3293 /* If we have a pointer, use its type */
3294 if (TREE_CODE (type) == POINTER_TYPE)
3295 type = TREE_TYPE (type);
3297 /* Building the first dimension of a primitive type uses this
3298 function */
3299 if (JPRIMITIVE_TYPE_P (type))
3301 type = build_java_array_type (type, -1);
3302 more_dims--;
3304 /* Otherwise, if we have a WFL for this type, use it (the type
3305 is already an array on an unresolved type, and we just keep
3306 on adding dimensions) */
3307 else if (type_wfl)
3309 type = type_wfl;
3310 more_dims += build_type_name_from_array_name (TYPE_NAME (save),
3311 NULL);
3314 /* Add all the dimensions */
3315 while (more_dims--)
3316 type = build_unresolved_array_type (type);
3318 /* The type may have been incomplete in the first place */
3319 if (type_wfl)
3320 type = obtain_incomplete_type (type);
3323 if (ret_name)
3324 *ret_name = name;
3325 return type;
3328 /* Build something that the type identifier resolver will identify as
3329 being an array to an unresolved type. TYPE_WFL is a WFL on a
3330 identifier. */
3332 static tree
3333 build_unresolved_array_type (tree type_or_wfl)
3335 const char *ptr;
3336 tree wfl;
3338 /* TYPE_OR_WFL might be an array on a resolved type. In this case,
3339 just create a array type */
3340 if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
3341 return build_java_array_type (type_or_wfl, -1);
3343 obstack_grow (&temporary_obstack,
3344 IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
3345 IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
3346 obstack_grow0 (&temporary_obstack, "[]", 2);
3347 ptr = obstack_finish (&temporary_obstack);
3348 wfl = build_expr_wfl (get_identifier (ptr),
3349 EXPR_WFL_FILENAME (type_or_wfl),
3350 EXPR_WFL_LINENO (type_or_wfl),
3351 EXPR_WFL_COLNO (type_or_wfl));
3352 /* Re-install the existing qualifications so that the type can be
3353 resolved properly. */
3354 EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl);
3355 return wfl;
3358 static void
3359 parser_add_interface (tree class_decl, tree interface_decl, tree wfl)
3361 if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
3362 parse_error_context (wfl, "Interface `%s' repeated",
3363 IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
3366 /* Bulk of common class/interface checks. Return 1 if an error was
3367 encountered. TAG is 0 for a class, 1 for an interface. */
3369 static int
3370 check_class_interface_creation (int is_interface, int flags, tree raw_name,
3371 tree qualified_name, tree decl, tree cl)
3373 tree node;
3374 int sca = 0; /* Static class allowed */
3375 int icaf = 0; /* Inner class allowed flags */
3376 int uaaf = CLASS_MODIFIERS; /* Usually allowed access flags */
3378 if (!quiet_flag)
3379 fprintf (stderr, " %s%s %s",
3380 (CPC_INNER_P () ? "inner" : ""),
3381 (is_interface ? "interface" : "class"),
3382 IDENTIFIER_POINTER (qualified_name));
3384 /* Scope of an interface/class type name:
3385 - Can't be imported by a single type import
3386 - Can't already exists in the package */
3387 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
3388 && (node = find_name_in_single_imports (raw_name))
3389 && !CPC_INNER_P ())
3391 parse_error_context
3392 (cl, "%s name `%s' clashes with imported type `%s'",
3393 (is_interface ? "Interface" : "Class"),
3394 IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
3395 return 1;
3397 if (decl && CLASS_COMPLETE_P (decl))
3399 classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
3400 qualified_name, decl, cl);
3401 return 1;
3404 if (check_inner_class_redefinition (raw_name, cl))
3405 return 1;
3407 /* If public, file name should match class/interface name, except
3408 when dealing with an inner class */
3409 if (!CPC_INNER_P () && (flags & ACC_PUBLIC ))
3411 const char *f;
3413 for (f = &input_filename [strlen (input_filename)];
3414 f != input_filename && ! IS_DIR_SEPARATOR (f[0]);
3415 f--)
3417 if (IS_DIR_SEPARATOR (f[0]))
3418 f++;
3419 if (strncmp (IDENTIFIER_POINTER (raw_name),
3420 f , IDENTIFIER_LENGTH (raw_name)) ||
3421 f [IDENTIFIER_LENGTH (raw_name)] != '.')
3422 parse_error_context
3423 (cl, "Public %s `%s' must be defined in a file called `%s.java'",
3424 (is_interface ? "interface" : "class"),
3425 IDENTIFIER_POINTER (qualified_name),
3426 IDENTIFIER_POINTER (raw_name));
3429 /* Static classes can be declared only in top level classes. Note:
3430 once static, a inner class is a top level class. */
3431 if (flags & ACC_STATIC)
3433 /* Catch the specific error of declaring an class inner class
3434 with no toplevel enclosing class. Prevent check_modifiers from
3435 complaining a second time */
3436 if (CPC_INNER_P () && !TOPLEVEL_CLASS_DECL_P (GET_CPC()))
3438 parse_error_context (cl, "Inner class `%s' can't be static. Static classes can only occur in interfaces and top-level classes",
3439 IDENTIFIER_POINTER (qualified_name));
3440 sca = ACC_STATIC;
3442 /* Else, in the context of a top-level class declaration, let
3443 `check_modifiers' do its job, otherwise, give it a go */
3444 else
3445 sca = (GET_CPC_LIST () ? ACC_STATIC : 0);
3448 /* Inner classes can be declared private or protected
3449 within their enclosing classes. */
3450 if (CPC_INNER_P ())
3452 /* A class which is local to a block can't be public, private,
3453 protected or static. But it is created final, so allow this
3454 one. */
3455 if (current_function_decl)
3456 icaf = sca = uaaf = ACC_FINAL;
3457 else
3459 check_modifiers_consistency (flags);
3460 icaf = ACC_PROTECTED;
3461 if (! CLASS_INTERFACE (GET_CPC ()))
3462 icaf |= ACC_PRIVATE;
3466 if (is_interface)
3468 if (CPC_INNER_P ())
3469 uaaf = INTERFACE_INNER_MODIFIERS;
3470 else
3471 uaaf = INTERFACE_MODIFIERS;
3473 check_modifiers ("Illegal modifier `%s' for interface declaration",
3474 flags, uaaf);
3476 else
3477 check_modifiers ((current_function_decl ?
3478 "Illegal modifier `%s' for local class declaration" :
3479 "Illegal modifier `%s' for class declaration"),
3480 flags, uaaf|sca|icaf);
3481 return 0;
3484 /* Construct a nested class name. If the final component starts with
3485 a digit, return true. Otherwise return false. */
3486 static int
3487 make_nested_class_name (tree cpc_list)
3489 tree name;
3491 if (!cpc_list)
3492 return 0;
3494 make_nested_class_name (TREE_CHAIN (cpc_list));
3496 /* Pick the qualified name when dealing with the first upmost
3497 enclosing class */
3498 name = (TREE_CHAIN (cpc_list)
3499 ? TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list)));
3500 obstack_grow (&temporary_obstack,
3501 IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name));
3502 obstack_1grow (&temporary_obstack, '$');
3504 return ISDIGIT (IDENTIFIER_POINTER (name)[0]);
3507 /* Can't redefine a class already defined in an earlier scope. */
3509 static int
3510 check_inner_class_redefinition (tree raw_name, tree cl)
3512 tree scope_list;
3514 for (scope_list = GET_CPC_LIST (); scope_list;
3515 scope_list = GET_NEXT_ENCLOSING_CPC (scope_list))
3516 if (raw_name == GET_CPC_UN_NODE (scope_list))
3518 parse_error_context
3519 (cl, "The class name `%s' is already defined in this scope. An inner class may not have the same simple name as any of its enclosing classes",
3520 IDENTIFIER_POINTER (raw_name));
3521 return 1;
3523 return 0;
3526 /* Tries to find a decl for CLASS_TYPE within ENCLOSING. If we fail,
3527 we remember ENCLOSING and SUPER. */
3529 static tree
3530 resolve_inner_class (htab_t circularity_hash, tree cl, tree *enclosing,
3531 tree *super, tree class_type)
3533 tree local_enclosing = *enclosing;
3534 tree local_super = NULL_TREE;
3536 while (local_enclosing)
3538 tree intermediate, decl;
3540 *htab_find_slot (circularity_hash, local_enclosing, INSERT) =
3541 local_enclosing;
3543 if ((decl = find_as_inner_class (local_enclosing, class_type, cl)))
3544 return decl;
3546 intermediate = local_enclosing;
3547 /* Explore enclosing contexts. */
3548 while (INNER_CLASS_DECL_P (intermediate))
3550 intermediate = DECL_CONTEXT (intermediate);
3551 if ((decl = find_as_inner_class (intermediate, class_type, cl)))
3552 return decl;
3555 /* Now go to the upper classes, bail out if necessary. We will
3556 analyze the returned SUPER and act accordingly (see
3557 do_resolve_class). */
3558 if (JPRIMITIVE_TYPE_P (TREE_TYPE (local_enclosing))
3559 || TREE_TYPE (local_enclosing) == void_type_node)
3561 parse_error_context (cl, "Qualifier must be a reference");
3562 local_enclosing = NULL_TREE;
3563 break;
3565 local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing));
3566 if (!local_super || local_super == object_type_node)
3567 break;
3569 if (TREE_CODE (local_super) == POINTER_TYPE)
3570 local_super = do_resolve_class (NULL, local_super, NULL, NULL);
3571 else
3572 local_super = TYPE_NAME (local_super);
3574 /* We may not have checked for circular inheritance yet, so do so
3575 here to prevent an infinite loop. */
3576 if (htab_find (circularity_hash, local_super) != NULL)
3578 if (!cl)
3579 cl = lookup_cl (local_enclosing);
3581 parse_error_context
3582 (cl, "Cyclic inheritance involving %s",
3583 IDENTIFIER_POINTER (DECL_NAME (local_enclosing)));
3584 local_enclosing = NULL_TREE;
3586 else
3587 local_enclosing = local_super;
3590 /* We failed. Return LOCAL_SUPER and LOCAL_ENCLOSING. */
3591 *super = local_super;
3592 *enclosing = local_enclosing;
3594 return NULL_TREE;
3597 /* Within ENCLOSING, find a decl for NAME and return it. NAME can be
3598 qualified. */
3600 static tree
3601 find_as_inner_class (tree enclosing, tree name, tree cl)
3603 tree qual, to_return;
3604 if (!enclosing)
3605 return NULL_TREE;
3607 name = TYPE_NAME (name);
3609 /* First search: within the scope of `enclosing', search for name */
3610 if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3611 qual = EXPR_WFL_QUALIFICATION (cl);
3612 else if (cl)
3613 qual = build_tree_list (cl, NULL_TREE);
3614 else
3615 qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3617 if ((to_return = find_as_inner_class_do (qual, enclosing)))
3618 return to_return;
3620 /* We're dealing with a qualified name. Try to resolve thing until
3621 we get something that is an enclosing class. */
3622 if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3624 tree acc = NULL_TREE, decl = NULL_TREE, ptr;
3626 for (qual = EXPR_WFL_QUALIFICATION (cl); qual && !decl;
3627 qual = TREE_CHAIN (qual))
3629 acc = merge_qualified_name (acc,
3630 EXPR_WFL_NODE (TREE_PURPOSE (qual)));
3631 BUILD_PTR_FROM_NAME (ptr, acc);
3632 decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl);
3635 /* A NULL qual and a decl means that the search ended
3636 successfully?!? We have to do something then. FIXME */
3638 if (decl)
3639 enclosing = decl;
3640 else
3641 qual = EXPR_WFL_QUALIFICATION (cl);
3643 /* Otherwise, create a qual for the other part of the resolution. */
3644 else
3645 qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3647 return find_as_inner_class_do (qual, enclosing);
3650 /* We go inside the list of sub classes and try to find a way
3651 through. */
3653 static tree
3654 find_as_inner_class_do (tree qual, tree enclosing)
3656 if (!qual)
3657 return NULL_TREE;
3659 for (; qual && enclosing; qual = TREE_CHAIN (qual))
3661 tree name_to_match = EXPR_WFL_NODE (TREE_PURPOSE (qual));
3662 tree next_enclosing = NULL_TREE;
3663 tree inner_list;
3665 for (inner_list = DECL_INNER_CLASS_LIST (enclosing);
3666 inner_list; inner_list = TREE_CHAIN (inner_list))
3668 if (TREE_VALUE (inner_list) == name_to_match)
3670 next_enclosing = TREE_PURPOSE (inner_list);
3671 break;
3674 enclosing = next_enclosing;
3677 return (!qual && enclosing ? enclosing : NULL_TREE);
3680 /* Reach all inner classes and tie their unqualified name to a
3681 DECL. */
3683 static void
3684 set_nested_class_simple_name_value (tree outer, int set)
3686 tree l;
3688 for (l = DECL_INNER_CLASS_LIST (outer); l; l = TREE_CHAIN (l))
3689 IDENTIFIER_GLOBAL_VALUE (TREE_VALUE (l)) = (set ?
3690 TREE_PURPOSE (l) : NULL_TREE);
3693 static void
3694 link_nested_class_to_enclosing (void)
3696 if (GET_ENCLOSING_CPC ())
3698 tree enclosing = GET_ENCLOSING_CPC_CONTEXT ();
3699 DECL_INNER_CLASS_LIST (enclosing) =
3700 tree_cons (GET_CPC (), GET_CPC_UN (),
3701 DECL_INNER_CLASS_LIST (enclosing));
3705 static tree
3706 maybe_make_nested_class_name (tree name)
3708 tree id = NULL_TREE;
3710 if (CPC_INNER_P ())
3712 /* If we're in a function, we must append a number to create the
3713 nested class name. However, we don't do this if the class we
3714 are constructing is anonymous, because in that case we'll
3715 already have a number as the class name. */
3716 if (! make_nested_class_name (GET_CPC_LIST ())
3717 && current_function_decl != NULL_TREE
3718 && ! ISDIGIT (IDENTIFIER_POINTER (name)[0]))
3720 char buf[10];
3721 sprintf (buf, "%d", anonymous_class_counter);
3722 ++anonymous_class_counter;
3723 obstack_grow (&temporary_obstack, buf, strlen (buf));
3724 obstack_1grow (&temporary_obstack, '$');
3726 obstack_grow0 (&temporary_obstack,
3727 IDENTIFIER_POINTER (name),
3728 IDENTIFIER_LENGTH (name));
3729 id = get_identifier (obstack_finish (&temporary_obstack));
3730 if (ctxp->package)
3731 QUALIFIED_P (id) = 1;
3733 return id;
3736 /* If DECL is NULL, create and push a new DECL, record the current
3737 line CL and do other maintenance things. */
3739 static tree
3740 maybe_create_class_interface_decl (tree decl, tree raw_name,
3741 tree qualified_name, tree cl)
3743 if (!decl)
3744 decl = push_class (make_class (), qualified_name);
3746 /* Take care of the file and line business */
3747 DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
3748 /* If we're emitting xrefs, store the line/col number information */
3749 if (flag_emit_xref)
3750 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
3751 else
3752 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
3753 CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
3754 CLASS_PARSED_P (TREE_TYPE (decl)) = 1;
3755 CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
3756 IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
3758 PUSH_CPC (decl, raw_name);
3759 DECL_CONTEXT (decl) = GET_ENCLOSING_CPC_CONTEXT ();
3761 /* Link the declaration to the already seen ones */
3762 TREE_CHAIN (decl) = ctxp->class_list;
3763 ctxp->class_list = decl;
3765 /* Create a new nodes in the global lists */
3766 gclass_list = tree_cons (NULL_TREE, decl, gclass_list);
3767 all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
3769 /* Install a new dependency list element */
3770 create_jdep_list (ctxp);
3772 SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
3773 IDENTIFIER_POINTER (qualified_name)));
3774 return decl;
3777 static void
3778 add_superinterfaces (tree decl, tree interface_list)
3780 tree node;
3781 /* Superinterface(s): if present and defined, parser_check_super_interface ()
3782 takes care of ensuring that:
3783 - This is an accessible interface type,
3784 - Circularity detection.
3785 parser_add_interface is then called. If present but not defined,
3786 the check operation is delayed until the super interface gets
3787 defined. */
3788 for (node = interface_list; node; node = TREE_CHAIN (node))
3790 tree current = TREE_PURPOSE (node);
3791 tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
3792 if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
3794 if (!parser_check_super_interface (idecl, decl, current))
3795 parser_add_interface (decl, idecl, current);
3797 else
3798 register_incomplete_type (JDEP_INTERFACE,
3799 current, decl, NULL_TREE);
3803 /* Create an interface in pass1 and return its decl. Return the
3804 interface's decl in pass 2. */
3806 static tree
3807 create_interface (int flags, tree id, tree super)
3809 tree raw_name = EXPR_WFL_NODE (id);
3810 tree q_name = parser_qualified_classname (raw_name);
3811 tree decl = IDENTIFIER_CLASS_VALUE (q_name);
3813 /* Certain syntax errors are making SUPER be like ID. Avoid this
3814 case. */
3815 if (ctxp->class_err && id == super)
3816 super = NULL;
3818 EXPR_WFL_NODE (id) = q_name; /* Keep source location, even if refined. */
3820 /* Basic checks: scope, redefinition, modifiers */
3821 if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
3823 PUSH_ERROR ();
3824 return NULL_TREE;
3827 /* Suspend the current parsing context if we're parsing an inner
3828 interface */
3829 if (CPC_INNER_P ())
3831 java_parser_context_suspend ();
3832 /* Interface members are public. */
3833 if (CLASS_INTERFACE (GET_CPC ()))
3834 flags |= ACC_PUBLIC;
3837 /* Push a new context for (static) initialized upon declaration fields */
3838 java_parser_context_push_initialized_field ();
3840 /* Interface modifiers check
3841 - public/abstract allowed (already done at that point)
3842 - abstract is obsolete (comes first, it's a warning, or should be)
3843 - Can't use twice the same (checked in the modifier rule) */
3844 if ((flags & ACC_ABSTRACT) && flag_redundant)
3845 parse_warning_context
3846 (MODIFIER_WFL (ABSTRACT_TK),
3847 "Redundant use of `abstract' modifier. Interface `%s' is implicitly abstract", IDENTIFIER_POINTER (raw_name));
3849 /* Create a new decl if DECL is NULL, otherwise fix it */
3850 decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id);
3852 /* Set super info and mark the class a complete */
3853 set_super_info (ACC_INTERFACE | flags, TREE_TYPE (decl),
3854 object_type_node, ctxp->interface_number);
3855 ctxp->interface_number = 0;
3856 CLASS_COMPLETE_P (decl) = 1;
3857 add_superinterfaces (decl, super);
3859 /* Eventually sets the @deprecated tag flag */
3860 CHECK_DEPRECATED (decl);
3862 return decl;
3865 /* Patch anonymous class CLASS, by either extending or implementing
3866 DEP. */
3868 static void
3869 patch_anonymous_class (tree type_decl, tree class_decl, tree wfl)
3871 tree class = TREE_TYPE (class_decl);
3872 tree type = TREE_TYPE (type_decl);
3873 tree binfo = TYPE_BINFO (class);
3875 /* If it's an interface, implement it */
3876 if (CLASS_INTERFACE (type_decl))
3878 tree s_binfo;
3879 int length;
3881 if (parser_check_super_interface (type_decl, class_decl, wfl))
3882 return;
3884 s_binfo = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (class)), 0);
3885 length = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (class))+1;
3886 TYPE_BINFO_BASETYPES (class) = make_tree_vec (length);
3887 TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (class)), 0) = s_binfo;
3888 /* And add the interface */
3889 parser_add_interface (class_decl, type_decl, wfl);
3891 /* Otherwise, it's a type we want to extend */
3892 else
3894 if (parser_check_super (type_decl, class_decl, wfl))
3895 return;
3896 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (binfo), 0)) = type;
3900 static tree
3901 create_anonymous_class (int location, tree type_name)
3903 char buffer [80];
3904 tree super = NULL_TREE, itf = NULL_TREE;
3905 tree id, type_decl, class;
3907 /* The unqualified name of the anonymous class. It's just a number. */
3908 sprintf (buffer, "%d", anonymous_class_counter++);
3909 id = build_wfl_node (get_identifier (buffer));
3910 EXPR_WFL_LINECOL (id) = location;
3912 /* We know about the type to extend/implement. We go ahead */
3913 if ((type_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (type_name))))
3915 /* Create a class which either implements on extends the designated
3916 class. The class bears an inaccessible name. */
3917 if (CLASS_INTERFACE (type_decl))
3919 /* It's OK to modify it here. It's been already used and
3920 shouldn't be reused */
3921 ctxp->interface_number = 1;
3922 /* Interfaces should presented as a list of WFLs */
3923 itf = build_tree_list (type_name, NULL_TREE);
3925 else
3926 super = type_name;
3929 class = create_class (ACC_FINAL, id, super, itf);
3931 /* We didn't know anything about the stuff. We register a dependence. */
3932 if (!type_decl)
3933 register_incomplete_type (JDEP_ANONYMOUS, type_name, class, NULL_TREE);
3935 ANONYMOUS_CLASS_P (TREE_TYPE (class)) = 1;
3936 return class;
3939 /* Create a class in pass1 and return its decl. Return class
3940 interface's decl in pass 2. */
3942 static tree
3943 create_class (int flags, tree id, tree super, tree interfaces)
3945 tree raw_name = EXPR_WFL_NODE (id);
3946 tree class_id, decl;
3947 tree super_decl_type;
3949 /* Certain syntax errors are making SUPER be like ID. Avoid this
3950 case. */
3951 if (ctxp->class_err && id == super)
3952 super = NULL;
3954 class_id = parser_qualified_classname (raw_name);
3955 decl = IDENTIFIER_CLASS_VALUE (class_id);
3956 EXPR_WFL_NODE (id) = class_id;
3958 /* Basic check: scope, redefinition, modifiers */
3959 if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
3961 PUSH_ERROR ();
3962 return NULL_TREE;
3965 /* Suspend the current parsing context if we're parsing an inner
3966 class or an anonymous class. */
3967 if (CPC_INNER_P ())
3969 java_parser_context_suspend ();
3970 /* Interface members are public. */
3971 if (CLASS_INTERFACE (GET_CPC ()))
3972 flags |= ACC_PUBLIC;
3975 /* Push a new context for (static) initialized upon declaration fields */
3976 java_parser_context_push_initialized_field ();
3978 /* Class modifier check:
3979 - Allowed modifier (already done at that point)
3980 - abstract AND final forbidden
3981 - Public classes defined in the correct file */
3982 if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
3983 parse_error_context
3984 (id, "Class `%s' can't be declared both abstract and final",
3985 IDENTIFIER_POINTER (raw_name));
3987 /* Create a new decl if DECL is NULL, otherwise fix it */
3988 decl = maybe_create_class_interface_decl (decl, raw_name, class_id, id);
3990 /* If SUPER exists, use it, otherwise use Object */
3991 if (super)
3993 /* Can't extend java.lang.Object */
3994 if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
3996 parse_error_context (id, "Can't extend `java.lang.Object'");
3997 return NULL_TREE;
4000 super_decl_type =
4001 register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
4003 else if (TREE_TYPE (decl) != object_type_node)
4004 super_decl_type = object_type_node;
4005 /* We're defining java.lang.Object */
4006 else
4007 super_decl_type = NULL_TREE;
4009 /* A class nested in an interface is implicitly static. */
4010 if (INNER_CLASS_DECL_P (decl)
4011 && CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (DECL_CONTEXT (decl)))))
4013 flags |= ACC_STATIC;
4016 /* Set super info and mark the class as complete. */
4017 set_super_info (flags, TREE_TYPE (decl), super_decl_type,
4018 ctxp->interface_number);
4019 ctxp->interface_number = 0;
4020 CLASS_COMPLETE_P (decl) = 1;
4021 add_superinterfaces (decl, interfaces);
4023 /* Add the private this$<n> field, Replicate final locals still in
4024 scope as private final fields mangled like val$<local_name>.
4025 This doesn't not occur for top level (static) inner classes. */
4026 if (PURE_INNER_CLASS_DECL_P (decl))
4027 add_inner_class_fields (decl, current_function_decl);
4029 /* If doing xref, store the location at which the inherited class
4030 (if any) was seen. */
4031 if (flag_emit_xref && super)
4032 DECL_INHERITED_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (super);
4034 /* Eventually sets the @deprecated tag flag */
4035 CHECK_DEPRECATED (decl);
4037 /* Reset the anonymous class counter when declaring non inner classes */
4038 if (!INNER_CLASS_DECL_P (decl))
4039 anonymous_class_counter = 1;
4041 return decl;
4044 /* End a class declaration: register the statements used to create
4045 finit$ and <clinit>, pop the current class and resume the prior
4046 parser context if necessary. */
4048 static void
4049 end_class_declaration (int resume)
4051 /* If an error occurred, context weren't pushed and won't need to be
4052 popped by a resume. */
4053 int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node;
4055 if (GET_CPC () != error_mark_node)
4056 dump_java_tree (TDI_class, GET_CPC ());
4058 java_parser_context_pop_initialized_field ();
4059 POP_CPC ();
4060 if (resume && no_error_occurred)
4061 java_parser_context_resume ();
4063 /* We're ending a class declaration, this is a good time to reset
4064 the interface cout. Note that might have been already done in
4065 create_interface, but if at that time an inner class was being
4066 dealt with, the interface count was reset in a context created
4067 for the sake of handling inner classes declaration. */
4068 ctxp->interface_number = 0;
4071 static void
4072 add_inner_class_fields (tree class_decl, tree fct_decl)
4074 tree block, marker, f;
4076 f = add_field (TREE_TYPE (class_decl),
4077 build_current_thisn (TREE_TYPE (class_decl)),
4078 build_pointer_type (TREE_TYPE (DECL_CONTEXT (class_decl))),
4079 ACC_PRIVATE);
4080 FIELD_THISN (f) = 1;
4082 if (!fct_decl)
4083 return;
4085 for (block = GET_CURRENT_BLOCK (fct_decl);
4086 block && TREE_CODE (block) == BLOCK; block = BLOCK_SUPERCONTEXT (block))
4088 tree decl;
4089 for (decl = BLOCK_EXPR_DECLS (block); decl; decl = TREE_CHAIN (decl))
4091 tree name, pname;
4092 tree wfl, init, list;
4094 /* Avoid non final arguments. */
4095 if (!LOCAL_FINAL_P (decl))
4096 continue;
4098 MANGLE_OUTER_LOCAL_VARIABLE_NAME (name, DECL_NAME (decl));
4099 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID (pname, DECL_NAME (decl));
4100 wfl = build_wfl_node (name);
4101 init = build_wfl_node (pname);
4102 /* Build an initialization for the field: it will be
4103 initialized by a parameter added to finit$, bearing a
4104 mangled name of the field itself (param$<n>.) The
4105 parameter is provided to finit$ by the constructor
4106 invoking it (hence the constructor will also feature a
4107 hidden parameter, set to the value of the outer context
4108 local at the time the inner class is created.)
4110 Note: we take into account all possible locals that can
4111 be accessed by the inner class. It's actually not trivial
4112 to minimize these aliases down to the ones really
4113 used. One way to do that would be to expand all regular
4114 methods first, then finit$ to get a picture of what's
4115 used. It works with the exception that we would have to
4116 go back on all constructor invoked in regular methods to
4117 have their invocation reworked (to include the right amount
4118 of alias initializer parameters.)
4120 The only real way around, I think, is a first pass to
4121 identify locals really used in the inner class. We leave
4122 the flag FIELD_LOCAL_ALIAS_USED around for that future
4123 use.
4125 On the other hand, it only affect local inner classes,
4126 whose constructors (and finit$ call) will be featuring
4127 unnecessary arguments. It's easy for a developer to keep
4128 this number of parameter down by using the `final'
4129 keyword only when necessary. For the time being, we can
4130 issue a warning on unnecessary finals. FIXME */
4131 init = build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (wfl),
4132 wfl, init);
4134 /* Register the field. The TREE_LIST holding the part
4135 initialized/initializer will be marked ARG_FINAL_P so
4136 that the created field can be marked
4137 FIELD_LOCAL_ALIAS. */
4138 list = build_tree_list (wfl, init);
4139 ARG_FINAL_P (list) = 1;
4140 register_fields (ACC_PRIVATE | ACC_FINAL, TREE_TYPE (decl), list);
4144 if (!CPC_INITIALIZER_STMT (ctxp))
4145 return;
4147 /* If we ever registered an alias field, insert and marker to
4148 remember where the list ends. The second part of the list (the one
4149 featuring initialized fields) so it can be later reversed to
4150 enforce 8.5. The marker will be removed during that operation. */
4151 marker = build_tree_list (NULL_TREE, NULL_TREE);
4152 TREE_CHAIN (marker) = CPC_INITIALIZER_STMT (ctxp);
4153 SET_CPC_INITIALIZER_STMT (ctxp, marker);
4156 /* Can't use lookup_field () since we don't want to load the class and
4157 can't set the CLASS_LOADED_P flag */
4159 static tree
4160 find_field (tree class, tree name)
4162 tree decl;
4163 for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
4165 if (DECL_NAME (decl) == name)
4166 return decl;
4168 return NULL_TREE;
4171 /* Wrap around lookup_field that doesn't potentially upset the value
4172 of CLASS */
4174 static tree
4175 lookup_field_wrapper (tree class, tree name)
4177 tree type = class;
4178 tree decl = NULL_TREE;
4179 java_parser_context_save_global ();
4181 /* Last chance: if we're within the context of an inner class, we
4182 might be trying to access a local variable defined in an outer
4183 context. We try to look for it now. */
4184 if (INNER_CLASS_TYPE_P (class) && TREE_CODE (name) == IDENTIFIER_NODE)
4186 tree new_name;
4187 MANGLE_OUTER_LOCAL_VARIABLE_NAME (new_name, name);
4188 decl = lookup_field (&type, new_name);
4189 if (decl && decl != error_mark_node)
4190 FIELD_LOCAL_ALIAS_USED (decl) = 1;
4192 if (!decl || decl == error_mark_node)
4194 type = class;
4195 decl = lookup_field (&type, name);
4198 /* If the field still hasn't been found, try the next enclosing context. */
4199 if (!decl && INNER_CLASS_TYPE_P (class))
4201 tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class)));
4202 decl = lookup_field_wrapper (outer_type, name);
4205 java_parser_context_restore_global ();
4206 return decl == error_mark_node ? NULL : decl;
4209 /* Find duplicate field within the same class declarations and report
4210 the error. Returns 1 if a duplicated field was found, 0
4211 otherwise. */
4213 static int
4214 duplicate_declaration_error_p (tree new_field_name, tree new_type, tree cl)
4216 /* This might be modified to work with method decl as well */
4217 tree decl = find_field (TREE_TYPE (GET_CPC ()), new_field_name);
4218 if (decl)
4220 char *t1 = xstrdup (purify_type_name
4221 ((TREE_CODE (new_type) == POINTER_TYPE
4222 && TREE_TYPE (new_type) == NULL_TREE) ?
4223 IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
4224 lang_printable_name (new_type, 1)));
4225 /* The type may not have been completed by the time we report
4226 the error */
4227 char *t2 = xstrdup (purify_type_name
4228 ((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
4229 && TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
4230 IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
4231 lang_printable_name (TREE_TYPE (decl), 1)));
4232 parse_error_context
4233 (cl , "Duplicate variable declaration: `%s %s' was `%s %s' (%s:%d)",
4234 t1, IDENTIFIER_POINTER (new_field_name),
4235 t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
4236 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4237 free (t1);
4238 free (t2);
4239 return 1;
4241 return 0;
4244 /* Field registration routine. If TYPE doesn't exist, field
4245 declarations are linked to the undefined TYPE dependency list, to
4246 be later resolved in java_complete_class () */
4248 static void
4249 register_fields (int flags, tree type, tree variable_list)
4251 tree current, saved_type;
4252 tree class_type = NULL_TREE;
4253 int saved_lineno = input_line;
4254 int must_chain = 0;
4255 tree wfl = NULL_TREE;
4257 if (GET_CPC ())
4258 class_type = TREE_TYPE (GET_CPC ());
4260 if (!class_type || class_type == error_mark_node)
4261 return;
4263 /* If we're adding fields to interfaces, those fields are public,
4264 static, final */
4265 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
4267 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
4268 flags, ACC_PUBLIC, "interface field(s)");
4269 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
4270 flags, ACC_STATIC, "interface field(s)");
4271 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
4272 flags, ACC_FINAL, "interface field(s)");
4273 check_modifiers ("Illegal interface member modifier `%s'", flags,
4274 INTERFACE_FIELD_MODIFIERS);
4275 flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
4278 /* Obtain a suitable type for resolution, if necessary */
4279 SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
4281 /* If TYPE is fully resolved and we don't have a reference, make one */
4282 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4284 for (current = variable_list, saved_type = type; current;
4285 current = TREE_CHAIN (current), type = saved_type)
4287 tree real_type;
4288 tree field_decl;
4289 tree cl = TREE_PURPOSE (current);
4290 tree init = TREE_VALUE (current);
4291 tree current_name = EXPR_WFL_NODE (cl);
4293 /* Can't declare non-final static fields in inner classes */
4294 if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (class_type)
4295 && !(flags & ACC_FINAL))
4296 parse_error_context
4297 (cl, "Field `%s' can't be static in inner class `%s' unless it is final",
4298 IDENTIFIER_POINTER (EXPR_WFL_NODE (cl)),
4299 lang_printable_name (class_type, 0));
4301 /* Process NAME, as it may specify extra dimension(s) for it */
4302 type = build_array_from_name (type, wfl, current_name, &current_name);
4304 /* Type adjustment. We may have just readjusted TYPE because
4305 the variable specified more dimensions. Make sure we have
4306 a reference if we can and don't have one already. Also
4307 change the name if we have an init. */
4308 if (type != saved_type)
4310 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4311 if (init)
4312 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
4315 real_type = GET_REAL_TYPE (type);
4316 /* Check for redeclarations */
4317 if (duplicate_declaration_error_p (current_name, real_type, cl))
4318 continue;
4320 /* Set lineno to the line the field was found and create a
4321 declaration for it. Eventually sets the @deprecated tag flag. */
4322 if (flag_emit_xref)
4323 input_line = EXPR_WFL_LINECOL (cl);
4324 else
4325 input_line = EXPR_WFL_LINENO (cl);
4326 field_decl = add_field (class_type, current_name, real_type, flags);
4327 CHECK_DEPRECATED_NO_RESET (field_decl);
4329 /* If the field denotes a final instance variable, then we
4330 allocate a LANG_DECL_SPECIFIC part to keep track of its
4331 initialization. We also mark whether the field was
4332 initialized upon its declaration. We don't do that if the
4333 created field is an alias to a final local. */
4334 if (!ARG_FINAL_P (current) && (flags & ACC_FINAL))
4336 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl);
4337 DECL_FIELD_FINAL_WFL (field_decl) = cl;
4340 /* If the couple initializer/initialized is marked ARG_FINAL_P,
4341 we mark the created field FIELD_LOCAL_ALIAS, so that we can
4342 hide parameters to this inner class finit$ and
4343 constructors. It also means that the field isn't final per
4344 say. */
4345 if (ARG_FINAL_P (current))
4347 FIELD_LOCAL_ALIAS (field_decl) = 1;
4348 FIELD_FINAL (field_decl) = 0;
4351 /* Check if we must chain. */
4352 if (must_chain)
4353 register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
4355 /* If we have an initialization value tied to the field */
4356 if (init)
4358 /* The field is declared static */
4359 if (flags & ACC_STATIC)
4361 /* We include the field and its initialization part into
4362 a list used to generate <clinit>. After <clinit> is
4363 walked, field initializations will be processed and
4364 fields initialized with known constants will be taken
4365 out of <clinit> and have their DECL_INITIAL set
4366 appropriately. */
4367 TREE_CHAIN (init) = CPC_STATIC_INITIALIZER_STMT (ctxp);
4368 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, init);
4369 if (TREE_OPERAND (init, 1)
4370 && TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
4371 TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
4373 /* A non-static field declared with an immediate initialization is
4374 to be initialized in <init>, if any. This field is remembered
4375 to be processed at the time of the generation of <init>. */
4376 else
4378 TREE_CHAIN (init) = CPC_INITIALIZER_STMT (ctxp);
4379 SET_CPC_INITIALIZER_STMT (ctxp, init);
4381 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
4382 DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
4386 CLEAR_DEPRECATED;
4387 input_line = saved_lineno;
4390 /* Generate finit$, using the list of initialized fields to populate
4391 its body. finit$'s parameter(s) list is adjusted to include the
4392 one(s) used to initialized the field(s) caching outer context
4393 local(s). */
4395 static tree
4396 generate_finit (tree class_type)
4398 int count = 0;
4399 tree list = TYPE_FINIT_STMT_LIST (class_type);
4400 tree mdecl, current, parms;
4402 parms = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
4403 class_type, NULL_TREE,
4404 &count);
4405 CRAFTED_PARAM_LIST_FIXUP (parms);
4406 mdecl = create_artificial_method (class_type, ACC_PRIVATE, void_type_node,
4407 finit_identifier_node, parms);
4408 fix_method_argument_names (parms, mdecl);
4409 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4410 mdecl, NULL_TREE);
4411 DECL_FUNCTION_NAP (mdecl) = count;
4412 start_artificial_method_body (mdecl);
4414 for (current = list; current; current = TREE_CHAIN (current))
4415 java_method_add_stmt (mdecl,
4416 build_debugable_stmt (EXPR_WFL_LINECOL (current),
4417 current));
4418 end_artificial_method_body (mdecl);
4419 return mdecl;
4422 /* Generate a function to run the instance initialization code. The
4423 private method is called `instinit$'. Unless we're dealing with an
4424 anonymous class, we determine whether all ctors of CLASS_TYPE
4425 declare a checked exception in their `throws' clause in order to
4426 see whether it's necessary to encapsulate the instance initializer
4427 statements in a try/catch/rethrow sequence. */
4429 static tree
4430 generate_instinit (tree class_type)
4432 tree current;
4433 tree compound = NULL_TREE;
4434 tree parms = tree_cons (this_identifier_node,
4435 build_pointer_type (class_type), end_params_node);
4436 tree mdecl = create_artificial_method (class_type, ACC_PRIVATE,
4437 void_type_node,
4438 instinit_identifier_node, parms);
4440 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4441 mdecl, NULL_TREE);
4443 /* Gather all the statements in a compound */
4444 for (current = TYPE_II_STMT_LIST (class_type);
4445 current; current = TREE_CHAIN (current))
4446 compound = add_stmt_to_compound (compound, NULL_TREE, current);
4448 /* We need to encapsulate COMPOUND by a try/catch statement to
4449 rethrow exceptions that might occur in the instance initializer.
4450 We do that only if all ctors of CLASS_TYPE are set to catch a
4451 checked exception. This doesn't apply to anonymous classes (since
4452 they don't have declared ctors.) */
4453 if (!ANONYMOUS_CLASS_P (class_type) &&
4454 ctors_unchecked_throws_clause_p (class_type))
4456 compound = encapsulate_with_try_catch (0, exception_type_node, compound,
4457 build1 (THROW_EXPR, NULL_TREE,
4458 build_wfl_node (wpv_id)));
4459 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE,
4460 exception_type_node);
4463 start_artificial_method_body (mdecl);
4464 java_method_add_stmt (mdecl, compound);
4465 end_artificial_method_body (mdecl);
4467 return mdecl;
4470 /* FIXME */
4471 static tree
4472 build_instinit_invocation (tree class_type)
4474 tree to_return = NULL_TREE;
4476 if (TYPE_II_STMT_LIST (class_type))
4478 tree parm = build_tree_list (NULL_TREE,
4479 build_wfl_node (this_identifier_node));
4480 to_return =
4481 build_method_invocation (build_wfl_node (instinit_identifier_node),
4482 parm);
4484 return to_return;
4487 /* Shared across method_declarator and method_header to remember the
4488 patch stage that was reached during the declaration of the method.
4489 A method DECL is built differently is there is no patch
4490 (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
4491 pending on the currently defined method. */
4493 static int patch_stage;
4495 /* Check the method declaration and add the method to its current
4496 class. If the argument list is known to contain incomplete types,
4497 the method is partially added and the registration will be resume
4498 once the method arguments resolved. If TYPE is NULL, we're dealing
4499 with a constructor. */
4501 static tree
4502 method_header (int flags, tree type, tree mdecl, tree throws)
4504 tree type_wfl = NULL_TREE;
4505 tree meth_name = NULL_TREE;
4506 tree current, orig_arg, this_class = NULL;
4507 tree id, meth;
4508 int saved_lineno;
4509 int constructor_ok = 0, must_chain;
4510 int count;
4512 if (mdecl == error_mark_node)
4513 return error_mark_node;
4514 meth = TREE_VALUE (mdecl);
4515 id = TREE_PURPOSE (mdecl);
4517 check_modifiers_consistency (flags);
4519 if (GET_CPC ())
4520 this_class = TREE_TYPE (GET_CPC ());
4522 if (!this_class || this_class == error_mark_node)
4523 return NULL_TREE;
4525 /* There are some forbidden modifiers for an abstract method and its
4526 class must be abstract as well. */
4527 if (type && (flags & ACC_ABSTRACT))
4529 ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
4530 ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
4531 ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
4532 ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
4533 ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized");
4534 ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp");
4535 if (!CLASS_ABSTRACT (TYPE_NAME (this_class))
4536 && !CLASS_INTERFACE (TYPE_NAME (this_class)))
4537 parse_error_context
4538 (id, "Class `%s' must be declared abstract to define abstract method `%s'",
4539 IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())),
4540 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4543 /* A native method can't be strictfp. */
4544 if ((flags & ACC_NATIVE) && (flags & ACC_STRICT))
4545 parse_error_context (id, "native method `%s' can't be strictfp",
4546 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4547 /* No such thing as a transient or volatile method. */
4548 if ((flags & ACC_TRANSIENT))
4549 parse_error_context (id, "method `%s' can't be transient",
4550 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4551 if ((flags & ACC_VOLATILE))
4552 parse_error_context (id, "method `%s' can't be volatile",
4553 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4555 /* Things to be checked when declaring a constructor */
4556 if (!type)
4558 int ec = java_error_count;
4559 /* 8.6: Constructor declarations: we might be trying to define a
4560 method without specifying a return type. */
4561 if (EXPR_WFL_NODE (id) != GET_CPC_UN ())
4562 parse_error_context
4563 (id, "Invalid method declaration, return type required");
4564 /* 8.6.3: Constructor modifiers */
4565 else
4567 JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
4568 JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
4569 JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
4570 JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
4571 JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
4572 JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp");
4574 /* If we found error here, we don't consider it's OK to tread
4575 the method definition as a constructor, for the rest of this
4576 function */
4577 if (ec == java_error_count)
4578 constructor_ok = 1;
4581 /* Method declared within the scope of an interface are implicitly
4582 abstract and public. Conflicts with other erroneously provided
4583 modifiers are checked right after. */
4585 if (CLASS_INTERFACE (TYPE_NAME (this_class)))
4587 /* If FLAGS isn't set because of a modifier, turn the
4588 corresponding modifier WFL to NULL so we issue a warning on
4589 the obsolete use of the modifier */
4590 if (!(flags & ACC_PUBLIC))
4591 MODIFIER_WFL (PUBLIC_TK) = NULL;
4592 if (!(flags & ACC_ABSTRACT))
4593 MODIFIER_WFL (ABSTRACT_TK) = NULL;
4594 flags |= ACC_PUBLIC;
4595 flags |= ACC_ABSTRACT;
4598 /* Inner class can't declare static methods */
4599 if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (this_class))
4601 parse_error_context
4602 (id, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
4603 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)),
4604 lang_printable_name (this_class, 0));
4607 /* Modifiers context reset moved up, so abstract method declaration
4608 modifiers can be later checked. */
4610 /* Set constructor returned type to void and method name to <init>,
4611 unless we found an error identifier the constructor (in which
4612 case we retain the original name) */
4613 if (!type)
4615 type = void_type_node;
4616 if (constructor_ok)
4617 meth_name = init_identifier_node;
4619 else
4620 meth_name = EXPR_WFL_NODE (id);
4622 /* Do the returned type resolution and registration if necessary */
4623 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4625 if (meth_name)
4626 type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
4627 EXPR_WFL_NODE (id) = meth_name;
4628 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4630 if (must_chain)
4632 patch_stage = JDEP_METHOD_RETURN;
4633 register_incomplete_type (patch_stage, type_wfl, id, type);
4634 TREE_TYPE (meth) = GET_REAL_TYPE (type);
4636 else
4637 TREE_TYPE (meth) = type;
4639 saved_lineno = input_line;
4640 /* When defining an abstract or interface method, the curly
4641 bracket at level 1 doesn't exist because there is no function
4642 body */
4643 input_line = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
4644 EXPR_WFL_LINENO (id));
4646 /* Remember the original argument list */
4647 orig_arg = TYPE_ARG_TYPES (meth);
4649 if (patch_stage) /* includes ret type and/or all args */
4651 jdep *jdep;
4652 meth = add_method_1 (this_class, flags, meth_name, meth);
4653 /* Patch for the return type */
4654 if (patch_stage == JDEP_METHOD_RETURN)
4656 jdep = CLASSD_LAST (ctxp->classd_list);
4657 JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
4659 /* This is the stop JDEP. METH allows the function's signature
4660 to be computed. */
4661 register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
4663 else
4664 meth = add_method (this_class, flags, meth_name,
4665 build_java_signature (meth));
4667 /* Remember final parameters */
4668 MARK_FINAL_PARMS (meth, orig_arg);
4670 /* Fix the method argument list so we have the argument name
4671 information */
4672 fix_method_argument_names (orig_arg, meth);
4674 /* Register the parameter number and re-install the current line
4675 number */
4676 DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
4677 input_line = saved_lineno;
4679 /* Register exception specified by the `throws' keyword for
4680 resolution and set the method decl appropriate field to the list.
4681 Note: the grammar ensures that what we get here are class
4682 types. */
4683 if (throws)
4685 throws = nreverse (throws);
4686 for (current = throws; current; current = TREE_CHAIN (current))
4688 register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
4689 NULL_TREE, NULL_TREE);
4690 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
4691 &TREE_VALUE (current);
4693 DECL_FUNCTION_THROWS (meth) = throws;
4696 if (TREE_TYPE (GET_CPC ()) != object_type_node)
4697 DECL_FUNCTION_WFL (meth) = id;
4699 /* Set the flag if we correctly processed a constructor */
4700 if (constructor_ok)
4702 DECL_CONSTRUCTOR_P (meth) = 1;
4703 /* Compute and store the number of artificial parameters declared
4704 for this constructor */
4705 for (count = 0, current = TYPE_FIELDS (this_class); current;
4706 current = TREE_CHAIN (current))
4707 if (FIELD_LOCAL_ALIAS (current))
4708 count++;
4709 DECL_FUNCTION_NAP (meth) = count;
4712 /* Eventually set the @deprecated tag flag */
4713 CHECK_DEPRECATED (meth);
4715 /* If doing xref, store column and line number information instead
4716 of the line number only. */
4717 if (flag_emit_xref)
4718 DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
4720 return meth;
4723 static void
4724 fix_method_argument_names (tree orig_arg, tree meth)
4726 tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
4727 if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
4729 TREE_PURPOSE (arg) = this_identifier_node;
4730 arg = TREE_CHAIN (arg);
4732 while (orig_arg != end_params_node)
4734 TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
4735 orig_arg = TREE_CHAIN (orig_arg);
4736 arg = TREE_CHAIN (arg);
4740 /* Complete the method declaration with METHOD_BODY. */
4742 static void
4743 finish_method_declaration (tree method_body)
4745 int flags;
4747 if (!current_function_decl)
4748 return;
4750 flags = get_access_flags_from_decl (current_function_decl);
4752 /* 8.4.5 Method Body */
4753 if ((flags & ACC_ABSTRACT || flags & ACC_NATIVE) && method_body)
4755 tree name = DECL_NAME (current_function_decl);
4756 parse_error_context (DECL_FUNCTION_WFL (current_function_decl),
4757 "%s method `%s' can't have a body defined",
4758 (METHOD_NATIVE (current_function_decl) ?
4759 "Native" : "Abstract"),
4760 IDENTIFIER_POINTER (name));
4761 method_body = NULL_TREE;
4763 else if (!(flags & ACC_ABSTRACT) && !(flags & ACC_NATIVE) && !method_body)
4765 tree name = DECL_NAME (current_function_decl);
4766 parse_error_context
4767 (DECL_FUNCTION_WFL (current_function_decl),
4768 "Non native and non abstract method `%s' must have a body defined",
4769 IDENTIFIER_POINTER (name));
4770 method_body = NULL_TREE;
4773 if (flag_emit_class_files && method_body
4774 && TREE_CODE (method_body) == NOP_EXPR
4775 && TREE_TYPE (current_function_decl)
4776 && TREE_TYPE (TREE_TYPE (current_function_decl)) == void_type_node)
4777 method_body = build1 (RETURN_EXPR, void_type_node, NULL);
4779 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
4780 maybe_absorb_scoping_blocks ();
4781 /* Exit function's body */
4782 exit_block ();
4783 /* Merge last line of the function with first line, directly in the
4784 function decl. It will be used to emit correct debug info. */
4785 if (!flag_emit_xref)
4786 DECL_FUNCTION_LAST_LINE (current_function_decl) = ctxp->last_ccb_indent1;
4788 /* Since function's argument's list are shared, reset the
4789 ARG_FINAL_P parameter that might have been set on some of this
4790 function parameters. */
4791 UNMARK_FINAL_PARMS (current_function_decl);
4793 /* So we don't have an irrelevant function declaration context for
4794 the next static block we'll see. */
4795 current_function_decl = NULL_TREE;
4798 /* Build a an error message for constructor circularity errors. */
4800 static char *
4801 constructor_circularity_msg (tree from, tree to)
4803 static char string [4096];
4804 char *t = xstrdup (lang_printable_name (from, 0));
4805 sprintf (string, "`%s' invokes `%s'", t, lang_printable_name (to, 0));
4806 free (t);
4807 return string;
4810 /* Verify a circular call to METH. Return 1 if an error is found, 0
4811 otherwise. */
4813 static GTY(()) tree vcc_list;
4814 static int
4815 verify_constructor_circularity (tree meth, tree current)
4817 tree c;
4819 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4821 if (TREE_VALUE (c) == meth)
4823 char *t;
4824 if (vcc_list)
4826 tree liste;
4827 vcc_list = nreverse (vcc_list);
4828 for (liste = vcc_list; liste; liste = TREE_CHAIN (liste))
4830 parse_error_context
4831 (TREE_PURPOSE (TREE_PURPOSE (liste)), "%s",
4832 constructor_circularity_msg
4833 (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
4834 java_error_count--;
4837 t = xstrdup (lang_printable_name (meth, 0));
4838 parse_error_context (TREE_PURPOSE (c),
4839 "%s: recursive invocation of constructor `%s'",
4840 constructor_circularity_msg (current, meth), t);
4841 free (t);
4842 vcc_list = NULL_TREE;
4843 return 1;
4846 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4848 vcc_list = tree_cons (c, current, vcc_list);
4849 if (verify_constructor_circularity (meth, TREE_VALUE (c)))
4850 return 1;
4851 vcc_list = TREE_CHAIN (vcc_list);
4853 return 0;
4856 /* Check modifiers that can be declared but exclusively */
4858 static void
4859 check_modifiers_consistency (int flags)
4861 int acc_count = 0;
4862 tree cl = NULL_TREE;
4864 THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, PUBLIC_TK, acc_count, cl);
4865 THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, PRIVATE_TK, acc_count, cl);
4866 THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, PROTECTED_TK, acc_count, cl);
4867 if (acc_count > 1)
4868 parse_error_context
4869 (cl, "Inconsistent member declaration. At most one of `public', `private', or `protected' may be specified");
4871 acc_count = 0;
4872 cl = NULL_TREE;
4873 THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK, acc_count, cl);
4874 THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK, acc_count, cl);
4875 if (acc_count > 1)
4876 parse_error_context (cl,
4877 "Inconsistent member declaration. At most one of `final' or `volatile' may be specified");
4880 /* Check the methode header METH for abstract specifics features */
4882 static void
4883 check_abstract_method_header (tree meth)
4885 int flags = get_access_flags_from_decl (meth);
4887 OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (ABSTRACT_TK), flags,
4888 ACC_ABSTRACT, "abstract method",
4889 IDENTIFIER_POINTER (DECL_NAME (meth)));
4890 OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (PUBLIC_TK), flags,
4891 ACC_PUBLIC, "abstract method",
4892 IDENTIFIER_POINTER (DECL_NAME (meth)));
4894 check_modifiers ("Illegal modifier `%s' for interface method",
4895 flags, INTERFACE_METHOD_MODIFIERS);
4898 /* Create a FUNCTION_TYPE node and start augmenting it with the
4899 declared function arguments. Arguments type that can't be resolved
4900 are left as they are, but the returned node is marked as containing
4901 incomplete types. */
4903 static tree
4904 method_declarator (tree id, tree list)
4906 tree arg_types = NULL_TREE, current, node;
4907 tree meth = make_node (FUNCTION_TYPE);
4908 jdep *jdep;
4910 patch_stage = JDEP_NO_PATCH;
4912 if (GET_CPC () == error_mark_node)
4913 return error_mark_node;
4915 /* If we're dealing with an inner class constructor, we hide the
4916 this$<n> decl in the name field of its parameter declaration. We
4917 also might have to hide the outer context local alias
4918 initializers. Not done when the class is a toplevel class. */
4919 if (PURE_INNER_CLASS_DECL_P (GET_CPC ())
4920 && EXPR_WFL_NODE (id) == GET_CPC_UN ())
4922 tree aliases_list, type, thisn;
4923 /* First the aliases, linked to the regular parameters */
4924 aliases_list =
4925 build_alias_initializer_parameter_list (AIPL_FUNCTION_DECLARATION,
4926 TREE_TYPE (GET_CPC ()),
4927 NULL_TREE, NULL);
4928 list = chainon (nreverse (aliases_list), list);
4930 /* Then this$<n> */
4931 type = TREE_TYPE (DECL_CONTEXT (GET_CPC ()));
4932 thisn = build_current_thisn (TREE_TYPE (GET_CPC ()));
4933 list = tree_cons (build_wfl_node (thisn), build_pointer_type (type),
4934 list);
4937 for (current = list; current; current = TREE_CHAIN (current))
4939 int must_chain = 0;
4940 tree wfl_name = TREE_PURPOSE (current);
4941 tree type = TREE_VALUE (current);
4942 tree name = EXPR_WFL_NODE (wfl_name);
4943 tree already, arg_node;
4944 tree type_wfl = NULL_TREE;
4945 tree real_type;
4947 /* Obtain a suitable type for resolution, if necessary */
4948 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4950 /* Process NAME, as it may specify extra dimension(s) for it */
4951 type = build_array_from_name (type, type_wfl, name, &name);
4952 EXPR_WFL_NODE (wfl_name) = name;
4954 real_type = GET_REAL_TYPE (type);
4955 if (TREE_CODE (real_type) == RECORD_TYPE)
4957 real_type = promote_type (real_type);
4958 if (TREE_CODE (type) == TREE_LIST)
4959 TREE_PURPOSE (type) = real_type;
4962 /* Check redefinition */
4963 for (already = arg_types; already; already = TREE_CHAIN (already))
4964 if (TREE_PURPOSE (already) == name)
4966 parse_error_context
4967 (wfl_name, "Variable `%s' is used more than once in the argument list of method `%s'",
4968 IDENTIFIER_POINTER (name),
4969 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4970 break;
4973 /* If we've an incomplete argument type, we know there is a location
4974 to patch when the type get resolved, later. */
4975 jdep = NULL;
4976 if (must_chain)
4978 patch_stage = JDEP_METHOD;
4979 type = register_incomplete_type (patch_stage,
4980 type_wfl, wfl_name, type);
4981 jdep = CLASSD_LAST (ctxp->classd_list);
4982 JDEP_MISC (jdep) = id;
4985 /* The argument node: a name and a (possibly) incomplete type. */
4986 arg_node = build_tree_list (name, real_type);
4987 /* Remember arguments declared final. */
4988 ARG_FINAL_P (arg_node) = ARG_FINAL_P (current);
4990 if (jdep)
4991 JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
4992 TREE_CHAIN (arg_node) = arg_types;
4993 arg_types = arg_node;
4995 TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
4996 node = build_tree_list (id, meth);
4997 return node;
5000 static int
5001 unresolved_type_p (tree wfl, tree *returned)
5004 if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
5006 if (returned)
5008 tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
5009 if (decl && current_class && (decl == TYPE_NAME (current_class)))
5010 *returned = TREE_TYPE (decl);
5011 else if (GET_CPC_UN () == EXPR_WFL_NODE (wfl))
5012 *returned = TREE_TYPE (GET_CPC ());
5013 else
5014 *returned = NULL_TREE;
5016 return 1;
5018 if (returned)
5019 *returned = wfl;
5020 return 0;
5023 /* From NAME, build a qualified identifier node using the
5024 qualification from the current package definition. */
5026 static tree
5027 parser_qualified_classname (tree name)
5029 tree nested_class_name;
5031 if ((nested_class_name = maybe_make_nested_class_name (name)))
5032 return nested_class_name;
5034 if (ctxp->package)
5035 return merge_qualified_name (ctxp->package, name);
5036 else
5037 return name;
5040 /* Called once the type a interface extends is resolved. Returns 0 if
5041 everything is OK. */
5043 static int
5044 parser_check_super_interface (tree super_decl, tree this_decl, tree this_wfl)
5046 tree super_type = TREE_TYPE (super_decl);
5048 /* Has to be an interface */
5049 if (!CLASS_INTERFACE (super_decl))
5051 parse_error_context
5052 (this_wfl, "%s `%s' can't implement/extend %s `%s'",
5053 (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
5054 "Interface" : "Class"),
5055 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5056 (TYPE_ARRAY_P (super_type) ? "array" : "class"),
5057 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5058 return 1;
5061 /* Check top-level interface access. Inner classes are subject to member
5062 access rules (6.6.1). */
5063 if (! INNER_CLASS_P (super_type)
5064 && check_pkg_class_access (DECL_NAME (super_decl),
5065 lookup_cl (this_decl), true))
5066 return 1;
5068 SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
5069 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5070 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5071 return 0;
5074 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
5075 0 if everything is OK. */
5077 static int
5078 parser_check_super (tree super_decl, tree this_decl, tree wfl)
5080 tree super_type = TREE_TYPE (super_decl);
5082 /* SUPER should be a CLASS (neither an array nor an interface) */
5083 if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
5085 parse_error_context
5086 (wfl, "Class `%s' can't subclass %s `%s'",
5087 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5088 (CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
5089 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5090 return 1;
5093 if (CLASS_FINAL (TYPE_NAME (super_type)))
5095 parse_error_context (wfl, "Can't subclass final classes: %s",
5096 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5097 return 1;
5100 /* Check top-level class scope. Inner classes are subject to member access
5101 rules (6.6.1). */
5102 if (! INNER_CLASS_P (super_type)
5103 && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true)))
5104 return 1;
5106 SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
5107 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5108 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5109 return 0;
5112 /* Create a new dependency list and link it (in a LIFO manner) to the
5113 CTXP list of type dependency list. */
5115 static void
5116 create_jdep_list (struct parser_ctxt *ctxp)
5118 jdeplist *new = xmalloc (sizeof (jdeplist));
5119 new->first = new->last = NULL;
5120 new->next = ctxp->classd_list;
5121 ctxp->classd_list = new;
5124 static jdeplist *
5125 reverse_jdep_list (struct parser_ctxt *ctxp)
5127 jdeplist *prev = NULL, *current, *next;
5128 for (current = ctxp->classd_list; current; current = next)
5130 next = current->next;
5131 current->next = prev;
5132 prev = current;
5134 return prev;
5137 /* Create a fake pointer based on the ID stored in
5138 TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
5139 registered again. */
5141 static tree
5142 obtain_incomplete_type (tree type_name)
5144 tree ptr = NULL_TREE, name;
5146 if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
5147 name = EXPR_WFL_NODE (type_name);
5148 else if (INCOMPLETE_TYPE_P (type_name))
5149 name = TYPE_NAME (type_name);
5150 else
5151 abort ();
5153 /* Workaround from build_pointer_type for incomplete types. */
5154 BUILD_PTR_FROM_NAME (ptr, name);
5155 TYPE_MODE (ptr) = ptr_mode;
5156 layout_type (ptr);
5158 return ptr;
5161 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
5162 non NULL instead of computing a new fake type based on WFL. The new
5163 dependency is inserted in the current type dependency list, in FIFO
5164 manner. */
5166 static tree
5167 register_incomplete_type (int kind, tree wfl, tree decl, tree ptr)
5169 jdep *new = xmalloc (sizeof (jdep));
5171 if (!ptr && kind != JDEP_METHOD_END) /* JDEP_METHOD_END is a mere marker */
5172 ptr = obtain_incomplete_type (wfl);
5174 JDEP_KIND (new) = kind;
5175 JDEP_DECL (new) = decl;
5176 JDEP_TO_RESOLVE (new) = ptr;
5177 JDEP_WFL (new) = wfl;
5178 JDEP_CHAIN (new) = NULL;
5179 JDEP_MISC (new) = NULL_TREE;
5180 /* For some dependencies, set the enclosing class of the current
5181 class to be the enclosing context */
5182 if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS)
5183 && GET_ENCLOSING_CPC ())
5184 JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ());
5185 else if (kind == JDEP_SUPER)
5186 JDEP_ENCLOSING (new) = (GET_ENCLOSING_CPC () ?
5187 TREE_VALUE (GET_ENCLOSING_CPC ()) : NULL_TREE);
5188 else
5189 JDEP_ENCLOSING (new) = GET_CPC ();
5190 JDEP_GET_PATCH (new) = (tree *)NULL;
5192 JDEP_INSERT (ctxp->classd_list, new);
5194 return ptr;
5197 /* This checks for circular references with innerclasses. We start
5198 from SOURCE and should never reach TARGET. Extended/implemented
5199 types in SOURCE have their enclosing context checked not to reach
5200 TARGET. When the last enclosing context of SOURCE is reached, its
5201 extended/implemented types are also checked not to reach TARGET.
5202 In case of error, WFL of the offending type is returned; NULL_TREE
5203 otherwise. */
5205 static tree
5206 check_inner_circular_reference (tree source, tree target)
5208 tree basetype_vec = TYPE_BINFO_BASETYPES (source);
5209 tree ctx, cl;
5210 int i;
5212 if (!basetype_vec)
5213 return NULL_TREE;
5215 for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
5217 tree su;
5219 /* We can end up with a NULL_TREE or an incomplete type here if
5220 we encountered previous type resolution errors. It's safe to
5221 simply ignore these cases. */
5222 if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE)
5223 continue;
5224 su = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
5225 if (INCOMPLETE_TYPE_P (su))
5226 continue;
5228 if (inherits_from_p (su, target))
5229 return lookup_cl (TYPE_NAME (su));
5231 for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx))
5233 /* An enclosing context shouldn't be TARGET */
5234 if (ctx == TYPE_NAME (target))
5235 return lookup_cl (TYPE_NAME (su));
5237 /* When we reach the enclosing last context, start a check
5238 on it, with the same target */
5239 if (! DECL_CONTEXT (ctx) &&
5240 (cl = check_inner_circular_reference (TREE_TYPE (ctx), target)))
5241 return cl;
5244 return NULL_TREE;
5247 /* Explore TYPE's `extends' clause member(s) and return the WFL of the
5248 offending type if a circularity is detected. NULL_TREE is returned
5249 otherwise. TYPE can be an interface or a class. */
5251 static tree
5252 check_circular_reference (tree type)
5254 tree basetype_vec = TYPE_BINFO_BASETYPES (type);
5255 int i;
5257 if (!basetype_vec)
5258 return NULL_TREE;
5260 if (! CLASS_INTERFACE (TYPE_NAME (type)))
5262 if (inherits_from_p (CLASSTYPE_SUPER (type), type))
5263 return lookup_cl (TYPE_NAME (type));
5264 return NULL_TREE;
5267 for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
5269 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
5270 if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node
5271 && interface_of_p (type, BINFO_TYPE (vec_elt)))
5272 return lookup_cl (TYPE_NAME (BINFO_TYPE (vec_elt)));
5274 return NULL_TREE;
5277 void
5278 java_check_circular_reference (void)
5280 tree current;
5281 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5283 tree type = TREE_TYPE (current);
5284 tree cl;
5286 cl = check_circular_reference (type);
5287 if (! cl)
5288 cl = check_inner_circular_reference (type, type);
5289 if (cl)
5290 parse_error_context (cl, "Cyclic class inheritance%s",
5291 (cyclic_inheritance_report ?
5292 cyclic_inheritance_report : ""));
5296 /* Augment the parameter list PARM with parameters crafted to
5297 initialize outer context locals aliases. Through ARTIFICIAL, a
5298 count is kept of the number of crafted parameters. MODE governs
5299 what eventually gets created: something suitable for a function
5300 creation or a function invocation, either the constructor or
5301 finit$. */
5303 static tree
5304 build_alias_initializer_parameter_list (int mode, tree class_type, tree parm,
5305 int *artificial)
5307 tree field;
5308 tree additional_parms = NULL_TREE;
5310 for (field = TYPE_FIELDS (class_type); field; field = TREE_CHAIN (field))
5311 if (FIELD_LOCAL_ALIAS (field))
5313 const char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
5314 tree purpose = NULL_TREE, value = NULL_TREE, name = NULL_TREE;
5315 tree mangled_id;
5317 switch (mode)
5319 case AIPL_FUNCTION_DECLARATION:
5320 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5321 &buffer [4]);
5322 purpose = build_wfl_node (mangled_id);
5323 if (TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE)
5324 value = build_wfl_node (TYPE_NAME (TREE_TYPE (field)));
5325 else
5326 value = TREE_TYPE (field);
5327 break;
5329 case AIPL_FUNCTION_CREATION:
5330 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (purpose,
5331 &buffer [4]);
5332 value = TREE_TYPE (field);
5333 break;
5335 case AIPL_FUNCTION_FINIT_INVOCATION:
5336 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5337 &buffer [4]);
5338 /* Now, this is wrong. purpose should always be the NAME
5339 of something and value its matching value (decl, type,
5340 etc...) FIXME -- but there is a lot to fix. */
5342 /* When invoked for this kind of operation, we already
5343 know whether a field is used or not. */
5344 purpose = TREE_TYPE (field);
5345 value = build_wfl_node (mangled_id);
5346 break;
5348 case AIPL_FUNCTION_CTOR_INVOCATION:
5349 /* There are two case: the constructor invocation happens
5350 outside the local inner, in which case, locales from the outer
5351 context are directly used.
5353 Otherwise, we fold to using the alias directly. */
5354 if (class_type == current_class)
5355 value = field;
5356 else
5358 name = get_identifier (&buffer[4]);
5359 value = IDENTIFIER_LOCAL_VALUE (name);
5361 break;
5363 additional_parms = tree_cons (purpose, value, additional_parms);
5364 if (artificial)
5365 *artificial +=1;
5367 if (additional_parms)
5369 if (ANONYMOUS_CLASS_P (class_type)
5370 && mode == AIPL_FUNCTION_CTOR_INVOCATION)
5371 additional_parms = nreverse (additional_parms);
5372 parm = chainon (additional_parms, parm);
5375 return parm;
5378 /* Craft a constructor for CLASS_DECL -- what we should do when none
5379 where found. ARGS is non NULL when a special signature must be
5380 enforced. This is the case for anonymous classes. */
5382 static tree
5383 craft_constructor (tree class_decl, tree args)
5385 tree class_type = TREE_TYPE (class_decl);
5386 tree parm = NULL_TREE;
5387 int flags = (get_access_flags_from_decl (class_decl) & ACC_PUBLIC ?
5388 ACC_PUBLIC : 0);
5389 int i = 0, artificial = 0;
5390 tree decl, ctor_name;
5391 char buffer [80];
5393 /* The constructor name is <init> unless we're dealing with an
5394 anonymous class, in which case the name will be fixed after having
5395 be expanded. */
5396 if (ANONYMOUS_CLASS_P (class_type))
5397 ctor_name = DECL_NAME (class_decl);
5398 else
5399 ctor_name = init_identifier_node;
5401 /* If we're dealing with an inner class constructor, we hide the
5402 this$<n> decl in the name field of its parameter declaration. */
5403 if (PURE_INNER_CLASS_TYPE_P (class_type))
5405 tree type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_type)));
5406 parm = tree_cons (build_current_thisn (class_type),
5407 build_pointer_type (type), parm);
5409 /* Some more arguments to be hidden here. The values of the local
5410 variables of the outer context that the inner class needs to see. */
5411 parm = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
5412 class_type, parm,
5413 &artificial);
5416 /* Then if there are any args to be enforced, enforce them now */
5417 for (; args && args != end_params_node; args = TREE_CHAIN (args))
5419 sprintf (buffer, "parm%d", i++);
5420 parm = tree_cons (get_identifier (buffer), TREE_VALUE (args), parm);
5423 CRAFTED_PARAM_LIST_FIXUP (parm);
5424 decl = create_artificial_method (class_type, flags, void_type_node,
5425 ctor_name, parm);
5426 fix_method_argument_names (parm, decl);
5427 /* Now, mark the artificial parameters. */
5428 DECL_FUNCTION_NAP (decl) = artificial;
5429 DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1;
5430 DECL_INLINE (decl) = 1;
5431 return decl;
5435 /* Fix the constructors. This will be called right after circular
5436 references have been checked. It is necessary to fix constructors
5437 early even if no code generation will take place for that class:
5438 some generated constructor might be required by the class whose
5439 compilation triggered this one to be simply loaded. */
5441 void
5442 java_fix_constructors (void)
5444 tree current;
5446 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5448 tree class_type = TREE_TYPE (current);
5449 int saw_ctor = 0;
5450 tree decl;
5452 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
5453 continue;
5455 output_class = current_class = class_type;
5456 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
5458 if (DECL_CONSTRUCTOR_P (decl))
5460 fix_constructors (decl);
5461 saw_ctor = 1;
5465 /* Anonymous class constructor can't be generated that early. */
5466 if (!saw_ctor && !ANONYMOUS_CLASS_P (class_type))
5467 craft_constructor (current, NULL_TREE);
5471 /* safe_layout_class just makes sure that we can load a class without
5472 disrupting the current_class, input_file, lineno, etc, information
5473 about the class processed currently. */
5475 void
5476 safe_layout_class (tree class)
5478 tree save_current_class = current_class;
5479 location_t save_location = input_location;
5481 layout_class (class);
5483 current_class = save_current_class;
5484 input_location = save_location;
5487 static tree
5488 jdep_resolve_class (jdep *dep)
5490 tree decl;
5492 if (JDEP_RESOLVED_P (dep))
5493 decl = JDEP_RESOLVED_DECL (dep);
5494 else
5496 decl = resolve_class (JDEP_ENCLOSING (dep), JDEP_TO_RESOLVE (dep),
5497 JDEP_DECL (dep), JDEP_WFL (dep));
5498 JDEP_RESOLVED (dep, decl);
5499 /* If there is no WFL, that's ok. We generate this warning
5500 elsewhere. */
5501 if (decl && JDEP_WFL (dep) != NULL_TREE)
5502 check_deprecation (JDEP_WFL (dep), decl);
5505 if (!decl)
5506 complete_class_report_errors (dep);
5507 else if (PURE_INNER_CLASS_DECL_P (decl))
5509 tree inner = TREE_TYPE (decl);
5510 if (! CLASS_LOADED_P (inner))
5512 safe_layout_class (inner);
5513 if (TYPE_SIZE (inner) == error_mark_node)
5514 TYPE_SIZE (inner) = NULL_TREE;
5516 check_inner_class_access (decl, JDEP_ENCLOSING (dep), JDEP_WFL (dep));
5518 return decl;
5521 /* Complete unsatisfied class declaration and their dependencies */
5523 void
5524 java_complete_class (void)
5526 tree cclass;
5527 jdeplist *cclassd;
5528 int error_found;
5529 tree type;
5531 /* Process imports */
5532 process_imports ();
5534 /* Reverse things so we have the right order */
5535 ctxp->class_list = nreverse (ctxp->class_list);
5536 ctxp->classd_list = reverse_jdep_list (ctxp);
5538 for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
5539 cclass && cclassd;
5540 cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
5542 jdep *dep;
5544 /* We keep the compilation unit imports in the class so that
5545 they can be used later to resolve type dependencies that
5546 aren't necessary to solve now. */
5547 TYPE_IMPORT_LIST (TREE_TYPE (cclass)) = ctxp->import_list;
5548 TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (cclass)) = ctxp->import_demand_list;
5550 for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
5552 tree decl;
5553 if (!(decl = jdep_resolve_class (dep)))
5554 continue;
5556 /* Now it's time to patch */
5557 switch (JDEP_KIND (dep))
5559 case JDEP_SUPER:
5560 /* Simply patch super */
5561 if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
5562 continue;
5563 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO
5564 (TREE_TYPE (JDEP_DECL (dep)))), 0)) = TREE_TYPE (decl);
5565 break;
5567 case JDEP_FIELD:
5569 /* We do part of the job done in add_field */
5570 tree field_decl = JDEP_DECL (dep);
5571 tree field_type = TREE_TYPE (decl);
5572 if (TREE_CODE (field_type) == RECORD_TYPE)
5573 field_type = promote_type (field_type);
5574 TREE_TYPE (field_decl) = field_type;
5575 DECL_ALIGN (field_decl) = 0;
5576 DECL_USER_ALIGN (field_decl) = 0;
5577 layout_decl (field_decl, 0);
5578 SOURCE_FRONTEND_DEBUG
5579 (("Completed field/var decl `%s' with `%s'",
5580 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
5581 IDENTIFIER_POINTER (DECL_NAME (decl))));
5582 break;
5584 case JDEP_METHOD: /* We start patching a method */
5585 case JDEP_METHOD_RETURN:
5586 error_found = 0;
5587 while (1)
5589 if (decl)
5591 type = TREE_TYPE(decl);
5592 if (TREE_CODE (type) == RECORD_TYPE)
5593 type = promote_type (type);
5594 JDEP_APPLY_PATCH (dep, type);
5595 SOURCE_FRONTEND_DEBUG
5596 (((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
5597 "Completing fct `%s' with ret type `%s'":
5598 "Completing arg `%s' with type `%s'"),
5599 IDENTIFIER_POINTER (EXPR_WFL_NODE
5600 (JDEP_DECL_WFL (dep))),
5601 IDENTIFIER_POINTER (DECL_NAME (decl))));
5603 else
5604 error_found = 1;
5605 dep = JDEP_CHAIN (dep);
5606 if (JDEP_KIND (dep) == JDEP_METHOD_END)
5607 break;
5608 else
5609 decl = jdep_resolve_class (dep);
5611 if (!error_found)
5613 tree mdecl = JDEP_DECL (dep), signature;
5614 /* Recompute and reset the signature, check first that
5615 all types are now defined. If they're not,
5616 don't build the signature. */
5617 if (check_method_types_complete (mdecl))
5619 signature = build_java_signature (TREE_TYPE (mdecl));
5620 set_java_signature (TREE_TYPE (mdecl), signature);
5623 else
5624 continue;
5625 break;
5627 case JDEP_INTERFACE:
5628 if (parser_check_super_interface (decl, JDEP_DECL (dep),
5629 JDEP_WFL (dep)))
5630 continue;
5631 parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
5632 break;
5634 case JDEP_PARM:
5635 case JDEP_VARIABLE:
5636 type = TREE_TYPE(decl);
5637 if (TREE_CODE (type) == RECORD_TYPE)
5638 type = promote_type (type);
5639 JDEP_APPLY_PATCH (dep, type);
5640 break;
5642 case JDEP_TYPE:
5643 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5644 SOURCE_FRONTEND_DEBUG
5645 (("Completing a random type dependency on a '%s' node",
5646 tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
5647 break;
5649 case JDEP_EXCEPTION:
5650 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5651 SOURCE_FRONTEND_DEBUG
5652 (("Completing `%s' `throws' argument node",
5653 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
5654 break;
5656 case JDEP_ANONYMOUS:
5657 patch_anonymous_class (decl, JDEP_DECL (dep), JDEP_WFL (dep));
5658 break;
5660 default:
5661 abort ();
5665 return;
5668 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
5669 array. */
5671 static tree
5672 resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5674 tree tname = TYPE_NAME (class_type);
5675 tree resolved_type = TREE_TYPE (class_type);
5676 int array_dims = 0;
5677 tree resolved_type_decl;
5679 if (resolved_type != NULL_TREE)
5681 tree resolved_type_decl = TYPE_NAME (resolved_type);
5682 if (resolved_type_decl == NULL_TREE
5683 || TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
5685 resolved_type_decl = build_decl (TYPE_DECL,
5686 TYPE_NAME (class_type),
5687 resolved_type);
5689 return resolved_type_decl;
5692 /* 1- Check to see if we have an array. If true, find what we really
5693 want to resolve */
5694 if ((array_dims = build_type_name_from_array_name (tname,
5695 &TYPE_NAME (class_type))))
5696 WFL_STRIP_BRACKET (cl, cl);
5698 /* 2- Resolve the bare type */
5699 if (!(resolved_type_decl = do_resolve_class (enclosing, class_type,
5700 decl, cl)))
5701 return NULL_TREE;
5702 resolved_type = TREE_TYPE (resolved_type_decl);
5704 /* 3- If we have an array, reconstruct the array down to its nesting */
5705 if (array_dims)
5707 for (; array_dims; array_dims--)
5708 resolved_type = build_java_array_type (resolved_type, -1);
5709 resolved_type_decl = TYPE_NAME (resolved_type);
5711 TREE_TYPE (class_type) = resolved_type;
5712 return resolved_type_decl;
5715 /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL
5716 are used to report error messages; CL must either be NULL_TREE or a
5717 WFL wrapping a class. Do not try to replace TYPE_NAME (class_type)
5718 by a variable, since it is changed by find_in_imports{_on_demand}
5719 and (but it doesn't really matter) qualify_and_find. */
5721 tree
5722 do_resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5724 tree new_class_decl = NULL_TREE, super = NULL_TREE;
5725 tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
5726 tree decl_result;
5727 htab_t circularity_hash;
5729 if (QUALIFIED_P (TYPE_NAME (class_type)))
5731 /* If the type name is of the form `Q . Id', then Q is either a
5732 package name or a class name. First we try to find Q as a
5733 class and then treat Id as a member type. If we can't find Q
5734 as a class then we fall through. */
5735 tree q, left, left_type, right;
5736 if (breakdown_qualified (&left, &right, TYPE_NAME (class_type)) == 0)
5738 BUILD_PTR_FROM_NAME (left_type, left);
5739 q = do_resolve_class (enclosing, left_type, decl, cl);
5740 if (q)
5742 enclosing = q;
5743 saved_enclosing_type = TREE_TYPE (q);
5744 BUILD_PTR_FROM_NAME (class_type, right);
5749 if (enclosing)
5751 /* This hash table is used to register the classes we're going
5752 through when searching the current class as an inner class, in
5753 order to detect circular references. Remember to free it before
5754 returning the section 0- of this function. */
5755 circularity_hash = htab_create (20, htab_hash_pointer, htab_eq_pointer,
5756 NULL);
5758 /* 0- Search in the current class as an inner class.
5759 Maybe some code here should be added to load the class or
5760 something, at least if the class isn't an inner class and ended
5761 being loaded from class file. FIXME. */
5762 while (enclosing)
5764 new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing,
5765 &super, class_type);
5766 if (new_class_decl)
5767 break;
5769 /* If we haven't found anything because SUPER reached Object and
5770 ENCLOSING happens to be an innerclass, try the enclosing context. */
5771 if ((!super || super == object_type_node) &&
5772 enclosing && INNER_CLASS_DECL_P (enclosing))
5773 enclosing = DECL_CONTEXT (enclosing);
5774 else
5775 enclosing = NULL_TREE;
5778 htab_delete (circularity_hash);
5780 if (new_class_decl)
5781 return new_class_decl;
5784 /* 1- Check for the type in single imports. This will change
5785 TYPE_NAME() if something relevant is found */
5786 find_in_imports (saved_enclosing_type, class_type);
5788 /* 2- And check for the type in the current compilation unit */
5789 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5791 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
5792 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
5793 load_class (TYPE_NAME (class_type), 0);
5794 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5797 /* 3- Search according to the current package definition */
5798 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5800 if ((new_class_decl = qualify_and_find (class_type, ctxp->package,
5801 TYPE_NAME (class_type))))
5802 return new_class_decl;
5805 /* 4- Check the import on demands. Don't allow bar.baz to be
5806 imported from foo.* */
5807 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5808 if (find_in_imports_on_demand (saved_enclosing_type, class_type))
5809 return NULL_TREE;
5811 /* If found in find_in_imports_on_demand, the type has already been
5812 loaded. */
5813 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5814 return new_class_decl;
5816 /* 5- Try with a name qualified with the package name we've seen so far */
5817 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5819 tree package;
5821 /* If there is a current package (ctxp->package), it's the first
5822 element of package_list and we can skip it. */
5823 for (package = (ctxp->package ?
5824 TREE_CHAIN (package_list) : package_list);
5825 package; package = TREE_CHAIN (package))
5826 if ((new_class_decl = qualify_and_find (class_type,
5827 TREE_PURPOSE (package),
5828 TYPE_NAME (class_type))))
5829 return new_class_decl;
5832 /* 5- Check another compilation unit that bears the name of type */
5833 load_class (TYPE_NAME (class_type), 0);
5835 if (!cl)
5836 cl = lookup_cl (decl);
5838 /* If we don't have a value for CL, then we're being called recursively.
5839 We can't check package access just yet, but it will be taken care of
5840 by the caller. */
5841 if (cl)
5843 if (check_pkg_class_access (TYPE_NAME (class_type), cl, true))
5844 return NULL_TREE;
5847 /* 6- Last call for a resolution */
5848 decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5850 /* The final lookup might have registered a.b.c into a.b$c If we
5851 failed at the first lookup, progressively change the name if
5852 applicable and use the matching DECL instead. */
5853 if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
5855 char *separator;
5856 tree name = TYPE_NAME (class_type);
5857 char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1);
5859 strcpy (namebuffer, IDENTIFIER_POINTER (name));
5861 do {
5863 /* Reach the last '.', and if applicable, replace it by a `$' and
5864 see if this exists as a type. */
5865 if ((separator = strrchr (namebuffer, '.')))
5867 *separator = '$';
5868 name = get_identifier (namebuffer);
5869 decl_result = IDENTIFIER_CLASS_VALUE (name);
5871 } while (!decl_result && separator);
5873 return decl_result;
5876 static tree
5877 qualify_and_find (tree class_type, tree package, tree name)
5879 tree new_qualified = merge_qualified_name (package, name);
5880 tree new_class_decl;
5882 if (!IDENTIFIER_CLASS_VALUE (new_qualified))
5883 load_class (new_qualified, 0);
5884 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_qualified)))
5886 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
5887 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
5888 load_class (new_qualified, 0);
5889 TYPE_NAME (class_type) = new_qualified;
5890 return IDENTIFIER_CLASS_VALUE (new_qualified);
5892 return NULL_TREE;
5895 /* Resolve NAME and lay it out (if not done and if not the current
5896 parsed class). Return a decl node. This function is meant to be
5897 called when type resolution is necessary during the walk pass. */
5899 static tree
5900 resolve_and_layout (tree something, tree cl)
5902 tree decl, decl_type;
5904 /* Don't do that on the current class */
5905 if (something == current_class)
5906 return TYPE_NAME (current_class);
5908 /* Don't do anything for void and other primitive types */
5909 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5910 return NULL_TREE;
5912 /* Pointer types can be reall pointer types or fake pointers. When
5913 finding a real pointer, recheck for primitive types */
5914 if (TREE_CODE (something) == POINTER_TYPE)
5916 if (TREE_TYPE (something))
5918 something = TREE_TYPE (something);
5919 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5920 return NULL_TREE;
5922 else
5923 something = TYPE_NAME (something);
5926 /* Don't do anything for arrays of primitive types */
5927 if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
5928 && JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
5929 return NULL_TREE;
5931 /* Something might be a WFL */
5932 if (TREE_CODE (something) == EXPR_WITH_FILE_LOCATION)
5933 something = EXPR_WFL_NODE (something);
5935 /* Otherwise, if something is not and IDENTIFIER_NODE, it can be a a
5936 TYPE_DECL or a real TYPE */
5937 else if (TREE_CODE (something) != IDENTIFIER_NODE)
5938 something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
5939 DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
5941 if (!(decl = resolve_no_layout (something, cl)))
5942 return NULL_TREE;
5944 /* Resolve and layout if necessary */
5945 decl_type = TREE_TYPE (decl);
5946 layout_class_methods (decl_type);
5947 /* Check methods */
5948 if (CLASS_FROM_SOURCE_P (decl_type))
5949 java_check_methods (decl);
5950 /* Layout the type if necessary */
5951 if (decl_type != current_class && !CLASS_LOADED_P (decl_type))
5952 safe_layout_class (decl_type);
5954 return decl;
5957 /* Resolve a class, returns its decl but doesn't perform any
5958 layout. The current parsing context is saved and restored */
5960 static tree
5961 resolve_no_layout (tree name, tree cl)
5963 tree ptr, decl;
5964 BUILD_PTR_FROM_NAME (ptr, name);
5965 java_parser_context_save_global ();
5966 decl = resolve_class (TYPE_NAME (current_class), ptr, NULL_TREE, cl);
5967 java_parser_context_restore_global ();
5969 return decl;
5972 /* Called when reporting errors. Skip the '[]'s in a complex array
5973 type description that failed to be resolved. purify_type_name can't
5974 use an identifier tree. */
5976 static const char *
5977 purify_type_name (const char *name)
5979 int len = strlen (name);
5980 int bracket_found;
5982 STRING_STRIP_BRACKETS (name, len, bracket_found);
5983 if (bracket_found)
5985 char *stripped_name = xmemdup (name, len, len+1);
5986 stripped_name [len] = '\0';
5987 return stripped_name;
5989 return name;
5992 /* The type CURRENT refers to can't be found. We print error messages. */
5994 static void
5995 complete_class_report_errors (jdep *dep)
5997 const char *name;
5999 if (!JDEP_WFL (dep))
6000 return;
6002 name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
6003 switch (JDEP_KIND (dep))
6005 case JDEP_SUPER:
6006 parse_error_context
6007 (JDEP_WFL (dep), "Superclass `%s' of class `%s' not found",
6008 purify_type_name (name),
6009 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6010 break;
6011 case JDEP_FIELD:
6012 parse_error_context
6013 (JDEP_WFL (dep), "Type `%s' not found in declaration of field `%s'",
6014 purify_type_name (name),
6015 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6016 break;
6017 case JDEP_METHOD: /* Covers arguments */
6018 parse_error_context
6019 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the argument `%s' of method `%s'",
6020 purify_type_name (name),
6021 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
6022 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
6023 break;
6024 case JDEP_METHOD_RETURN: /* Covers return type */
6025 parse_error_context
6026 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the return type of method `%s'",
6027 purify_type_name (name),
6028 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
6029 break;
6030 case JDEP_INTERFACE:
6031 parse_error_context
6032 (JDEP_WFL (dep), "Superinterface `%s' of %s `%s' not found",
6033 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
6034 (CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
6035 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6036 break;
6037 case JDEP_VARIABLE:
6038 parse_error_context
6039 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the local variable `%s'",
6040 purify_type_name (IDENTIFIER_POINTER
6041 (EXPR_WFL_NODE (JDEP_WFL (dep)))),
6042 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6043 break;
6044 case JDEP_EXCEPTION: /* As specified by `throws' */
6045 parse_error_context
6046 (JDEP_WFL (dep), "Class `%s' not found in `throws'",
6047 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
6048 break;
6049 default:
6050 /* Fix for -Wall. Just break doing nothing. The error will be
6051 caught later */
6052 break;
6056 /* Return a static string containing the DECL prototype string. If
6057 DECL is a constructor, use the class name instead of the form
6058 <init> */
6060 static const char *
6061 get_printable_method_name (tree decl)
6063 const char *to_return;
6064 tree name = NULL_TREE;
6066 if (DECL_CONSTRUCTOR_P (decl))
6068 name = DECL_NAME (decl);
6069 DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
6072 to_return = lang_printable_name (decl, 0);
6073 if (DECL_CONSTRUCTOR_P (decl))
6074 DECL_NAME (decl) = name;
6076 return to_return;
6079 /* Track method being redefined inside the same class. As a side
6080 effect, set DECL_NAME to an IDENTIFIER (prior entering this
6081 function it's a FWL, so we can track errors more accurately.) */
6083 static int
6084 check_method_redefinition (tree class, tree method)
6086 tree redef, sig;
6088 /* There's no need to verify <clinit> and finit$ and instinit$ */
6089 if (DECL_CLINIT_P (method)
6090 || DECL_FINIT_P (method) || DECL_INSTINIT_P (method))
6091 return 0;
6093 sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
6094 for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
6096 if (redef == method)
6097 break;
6098 if (DECL_NAME (redef) == DECL_NAME (method)
6099 && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))
6100 && !DECL_ARTIFICIAL (method))
6102 parse_error_context
6103 (DECL_FUNCTION_WFL (method), "Duplicate %s declaration `%s'",
6104 (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
6105 get_printable_method_name (redef));
6106 return 1;
6109 return 0;
6112 /* Return 1 if check went ok, 0 otherwise. */
6113 static int
6114 check_abstract_method_definitions (int do_interface, tree class_decl,
6115 tree type)
6117 tree class = TREE_TYPE (class_decl);
6118 tree method, end_type;
6119 int ok = 1;
6121 end_type = (do_interface ? object_type_node : type);
6122 for (method = TYPE_METHODS (type); method; method = TREE_CHAIN (method))
6124 tree other_super, other_method, method_sig, method_name;
6125 int found = 0;
6126 int end_type_reached = 0;
6128 if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
6129 continue;
6131 /* Now verify that somewhere in between TYPE and CLASS,
6132 abstract method METHOD gets a non abstract definition
6133 that is inherited by CLASS. */
6135 method_sig = build_java_signature (TREE_TYPE (method));
6136 method_name = DECL_NAME (method);
6137 if (TREE_CODE (method_name) == EXPR_WITH_FILE_LOCATION)
6138 method_name = EXPR_WFL_NODE (method_name);
6140 other_super = class;
6141 do {
6142 if (other_super == end_type)
6143 end_type_reached = 1;
6145 /* Method search */
6146 for (other_method = TYPE_METHODS (other_super); other_method;
6147 other_method = TREE_CHAIN (other_method))
6149 tree s = build_java_signature (TREE_TYPE (other_method));
6150 tree other_name = DECL_NAME (other_method);
6152 if (TREE_CODE (other_name) == EXPR_WITH_FILE_LOCATION)
6153 other_name = EXPR_WFL_NODE (other_name);
6154 if (!DECL_CLINIT_P (other_method)
6155 && !DECL_CONSTRUCTOR_P (other_method)
6156 && method_name == other_name
6157 && method_sig == s
6158 && !METHOD_ABSTRACT (other_method))
6160 found = 1;
6161 break;
6164 other_super = CLASSTYPE_SUPER (other_super);
6165 } while (!end_type_reached);
6167 /* Report that abstract METHOD didn't find an implementation
6168 that CLASS can use. */
6169 if (!found)
6171 char *t = xstrdup (lang_printable_name
6172 (TREE_TYPE (TREE_TYPE (method)), 0));
6173 tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
6175 parse_error_context
6176 (lookup_cl (class_decl),
6177 "Class `%s' doesn't define the abstract method `%s %s' from %s `%s'. This method must be defined or %s `%s' must be declared abstract",
6178 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6179 t, lang_printable_name (method, 0),
6180 (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))) ?
6181 "interface" : "class"),
6182 IDENTIFIER_POINTER (ccn),
6183 (CLASS_INTERFACE (class_decl) ? "interface" : "class"),
6184 IDENTIFIER_POINTER (DECL_NAME (class_decl)));
6185 ok = 0;
6186 free (t);
6190 if (ok && do_interface)
6192 /* Check for implemented interfaces. */
6193 int i;
6194 tree vector = TYPE_BINFO_BASETYPES (type);
6195 for (i = 1; ok && vector && i < TREE_VEC_LENGTH (vector); i++)
6197 tree super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
6198 ok = check_abstract_method_definitions (1, class_decl, super);
6202 return ok;
6205 /* Check that CLASS_DECL somehow implements all inherited abstract
6206 methods. */
6208 static void
6209 java_check_abstract_method_definitions (tree class_decl)
6211 tree class = TREE_TYPE (class_decl);
6212 tree super, vector;
6213 int i;
6215 if (CLASS_ABSTRACT (class_decl))
6216 return;
6218 /* Check for inherited types */
6219 super = class;
6220 do {
6221 super = CLASSTYPE_SUPER (super);
6222 check_abstract_method_definitions (0, class_decl, super);
6223 } while (super != object_type_node);
6225 /* Check for implemented interfaces. */
6226 vector = TYPE_BINFO_BASETYPES (class);
6227 for (i = 1; i < TREE_VEC_LENGTH (vector); i++)
6229 super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
6230 check_abstract_method_definitions (1, class_decl, super);
6234 /* Check all the types method DECL uses and return 1 if all of them
6235 are now complete, 0 otherwise. This is used to check whether its
6236 safe to build a method signature or not. */
6238 static int
6239 check_method_types_complete (tree decl)
6241 tree type = TREE_TYPE (decl);
6242 tree args;
6244 if (!INCOMPLETE_TYPE_P (TREE_TYPE (type)))
6245 return 0;
6247 args = TYPE_ARG_TYPES (type);
6248 if (TREE_CODE (type) == METHOD_TYPE)
6249 args = TREE_CHAIN (args);
6250 for (; args != end_params_node; args = TREE_CHAIN (args))
6251 if (INCOMPLETE_TYPE_P (TREE_VALUE (args)))
6252 return 0;
6254 return 1;
6257 /* Visible interface to check methods contained in CLASS_DECL */
6259 void
6260 java_check_methods (tree class_decl)
6262 if (CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)))
6263 return;
6265 if (CLASS_INTERFACE (class_decl))
6266 java_check_abstract_methods (class_decl);
6267 else
6268 java_check_regular_methods (class_decl);
6270 CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)) = 1;
6273 /* Like not_accessible_p, but doesn't refer to the current class at
6274 all. */
6275 static bool
6276 hack_is_accessible_p (tree member, tree from_where)
6278 int flags = get_access_flags_from_decl (member);
6280 if (from_where == DECL_CONTEXT (member)
6281 || (flags & ACC_PUBLIC))
6282 return true;
6284 if ((flags & ACC_PROTECTED))
6286 if (inherits_from_p (from_where, DECL_CONTEXT (member)))
6287 return true;
6290 if ((flags & ACC_PRIVATE))
6291 return false;
6293 /* Package private, or protected. */
6294 return in_same_package (TYPE_NAME (from_where),
6295 TYPE_NAME (DECL_CONTEXT (member)));
6298 /* Check all the methods of CLASS_DECL. Methods are first completed
6299 then checked according to regular method existence rules. If no
6300 constructor for CLASS_DECL were encountered, then build its
6301 declaration. */
6302 static void
6303 java_check_regular_methods (tree class_decl)
6305 int saw_constructor = ANONYMOUS_CLASS_P (TREE_TYPE (class_decl));
6306 tree method;
6307 tree class = TREE_TYPE (class_decl);
6308 tree found = NULL_TREE;
6309 tree mthrows;
6311 /* It is not necessary to check methods defined in java.lang.Object */
6312 if (class == object_type_node)
6313 return;
6315 if (!TYPE_NVIRTUALS (class))
6316 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6318 /* Should take interfaces into account. FIXME */
6319 for (method = TYPE_METHODS (class); method; method = TREE_CHAIN (method))
6321 tree sig;
6322 tree method_wfl = DECL_FUNCTION_WFL (method);
6323 int aflags;
6325 /* Check for redefinitions */
6326 if (check_method_redefinition (class, method))
6327 continue;
6329 /* We verify things thrown by the method. They must inherit from
6330 java.lang.Throwable. */
6331 for (mthrows = DECL_FUNCTION_THROWS (method);
6332 mthrows; mthrows = TREE_CHAIN (mthrows))
6334 if (!inherits_from_p (TREE_VALUE (mthrows), throwable_type_node))
6335 parse_error_context
6336 (TREE_PURPOSE (mthrows), "Class `%s' in `throws' clause must be a subclass of class `java.lang.Throwable'",
6337 IDENTIFIER_POINTER
6338 (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))));
6341 /* If we see one constructor a mark so we don't generate the
6342 default one. Also skip other verifications: constructors
6343 can't be inherited hence hidden or overridden. */
6344 if (DECL_CONSTRUCTOR_P (method))
6346 saw_constructor = 1;
6347 continue;
6350 sig = build_java_argument_signature (TREE_TYPE (method));
6351 found = lookup_argument_method_generic (class, DECL_NAME (method), sig,
6352 SEARCH_SUPER | SEARCH_INTERFACE);
6354 /* Inner class can't declare static methods */
6355 if (METHOD_STATIC (method) && !TOPLEVEL_CLASS_DECL_P (class_decl))
6357 char *t = xstrdup (lang_printable_name (class, 0));
6358 parse_error_context
6359 (method_wfl, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
6360 lang_printable_name (method, 0), t);
6361 free (t);
6364 /* Nothing overrides or it's a private method. */
6365 if (!found)
6366 continue;
6367 if (METHOD_PRIVATE (found))
6369 found = NULL_TREE;
6370 continue;
6373 /* If `found' is declared in an interface, make sure the
6374 modifier matches. */
6375 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6376 && clinit_identifier_node != DECL_NAME (found)
6377 && !METHOD_PUBLIC (method))
6379 tree found_decl = TYPE_NAME (DECL_CONTEXT (found));
6380 parse_error_context (method_wfl, "Class `%s' must override `%s' with a public method in order to implement interface `%s'",
6381 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6382 lang_printable_name (method, 0),
6383 IDENTIFIER_POINTER (DECL_NAME (found_decl)));
6386 /* Can't override a method with the same name and different return
6387 types. */
6388 if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
6390 char *t = xstrdup
6391 (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6392 parse_error_context
6393 (method_wfl,
6394 "Method `%s' was defined with return type `%s' in class `%s'",
6395 lang_printable_name (found, 0), t,
6396 IDENTIFIER_POINTER
6397 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6398 free (t);
6401 aflags = get_access_flags_from_decl (found);
6403 /* Can't override final. Can't override static. */
6404 if (METHOD_FINAL (found) || METHOD_STATIC (found))
6406 /* Static *can* override static */
6407 if (METHOD_STATIC (found) && METHOD_STATIC (method))
6408 continue;
6409 parse_error_context
6410 (method_wfl,
6411 "%s methods can't be overridden. Method `%s' is %s in class `%s'",
6412 (METHOD_FINAL (found) ? "Final" : "Static"),
6413 lang_printable_name (found, 0),
6414 (METHOD_FINAL (found) ? "final" : "static"),
6415 IDENTIFIER_POINTER
6416 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6417 continue;
6420 /* Static method can't override instance method. */
6421 if (METHOD_STATIC (method))
6423 parse_error_context
6424 (method_wfl,
6425 "Instance methods can't be overridden by a static method. Method `%s' is an instance method in class `%s'",
6426 lang_printable_name (found, 0),
6427 IDENTIFIER_POINTER
6428 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6429 continue;
6432 /* - Overriding/hiding public must be public
6433 - Overriding/hiding protected must be protected or public
6434 - If the overridden or hidden method has default (package)
6435 access, then the overriding or hiding method must not be
6436 private; otherwise, a compile-time error occurs. If
6437 `found' belongs to an interface, things have been already
6438 taken care of. */
6439 if (!CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6440 && ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
6441 || (METHOD_PROTECTED (found)
6442 && !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
6443 || (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
6444 && METHOD_PRIVATE (method))))
6446 parse_error_context
6447 (method_wfl,
6448 "Methods can't be overridden to be more private. Method `%s' is not %s in class `%s'", lang_printable_name (method, 0),
6449 (METHOD_PUBLIC (method) ? "public" :
6450 (METHOD_PRIVATE (method) ? "private" : "protected")),
6451 IDENTIFIER_POINTER (DECL_NAME
6452 (TYPE_NAME (DECL_CONTEXT (found)))));
6453 continue;
6456 /* Check this method against all the other implementations it
6457 overrides. Here we only check the class hierarchy; the rest
6458 of the checking is done later. If this method is just a
6459 Miranda method, we can skip the check. */
6460 if (! METHOD_INVISIBLE (method))
6461 check_concrete_throws_clauses (class, method, DECL_NAME (method), sig);
6464 /* The above throws clause check only looked at superclasses. Now
6465 we must also make sure that all methods declared in interfaces
6466 have compatible throws clauses. FIXME: there are more efficient
6467 ways to organize this checking; we should implement one. */
6468 check_interface_throws_clauses (class, class);
6470 if (!TYPE_NVIRTUALS (class))
6471 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6473 /* Search for inherited abstract method not yet implemented in this
6474 class. */
6475 java_check_abstract_method_definitions (class_decl);
6477 if (!saw_constructor)
6478 abort ();
6481 /* Check to make sure that all the methods in all the interfaces
6482 implemented by CLASS_DECL are compatible with the concrete
6483 implementations available in CHECK_CLASS_DECL. */
6484 static void
6485 check_interface_throws_clauses (tree check_class_decl, tree class_decl)
6487 for (; class_decl != NULL_TREE; class_decl = CLASSTYPE_SUPER (class_decl))
6489 tree bases;
6490 int iface_len;
6491 int i;
6493 if (! CLASS_LOADED_P (class_decl))
6495 if (CLASS_FROM_SOURCE_P (class_decl))
6496 safe_layout_class (class_decl);
6497 else
6498 load_class (class_decl, 1);
6501 bases = TYPE_BINFO_BASETYPES (class_decl);
6502 iface_len = TREE_VEC_LENGTH (bases) - 1;
6503 for (i = iface_len; i > 0; --i)
6505 tree interface = BINFO_TYPE (TREE_VEC_ELT (bases, i));
6506 tree iface_method;
6508 for (iface_method = TYPE_METHODS (interface);
6509 iface_method != NULL_TREE;
6510 iface_method = TREE_CHAIN (iface_method))
6512 tree sig, method;
6514 /* First look for a concrete method implemented or
6515 inherited by this class. No need to search
6516 interfaces here, since we're already looking through
6517 all of them. */
6518 sig = build_java_argument_signature (TREE_TYPE (iface_method));
6519 method
6520 = lookup_argument_method_generic (check_class_decl,
6521 DECL_NAME (iface_method),
6522 sig, SEARCH_VISIBLE);
6523 /* If we don't find an implementation, that is ok. Any
6524 potential errors from that are diagnosed elsewhere.
6525 Also, multiple inheritance with conflicting throws
6526 clauses is fine in the absence of a concrete
6527 implementation. */
6528 if (method != NULL_TREE && !METHOD_ABSTRACT (method))
6530 tree method_wfl = DECL_FUNCTION_WFL (method);
6531 check_throws_clauses (method, method_wfl, iface_method);
6535 /* Now check superinterfaces. */
6536 check_interface_throws_clauses (check_class_decl, interface);
6541 /* Check throws clauses of a method against the clauses of all the
6542 methods it overrides. We do this by searching up the class
6543 hierarchy, examining all matching accessible methods. */
6544 static void
6545 check_concrete_throws_clauses (tree class, tree self_method,
6546 tree name, tree signature)
6548 tree method = lookup_argument_method_generic (class, name, signature,
6549 SEARCH_SUPER | SEARCH_VISIBLE);
6550 while (method != NULL_TREE)
6552 if (! METHOD_INVISIBLE (method) && hack_is_accessible_p (method, class))
6553 check_throws_clauses (self_method, DECL_FUNCTION_WFL (self_method),
6554 method);
6556 method = lookup_argument_method_generic (DECL_CONTEXT (method),
6557 name, signature,
6558 SEARCH_SUPER | SEARCH_VISIBLE);
6562 /* Generate an error if the `throws' clause of METHOD (if any) is
6563 incompatible with the `throws' clause of FOUND (if any). */
6564 static void
6565 check_throws_clauses (tree method, tree method_wfl, tree found)
6567 tree mthrows;
6569 /* Can't check these things with class loaded from bytecode. FIXME */
6570 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
6571 return;
6573 for (mthrows = DECL_FUNCTION_THROWS (method);
6574 mthrows; mthrows = TREE_CHAIN (mthrows))
6576 tree fthrows;
6578 /* We don't verify unchecked expressions */
6579 if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
6580 continue;
6581 /* Checked expression must be compatible */
6582 for (fthrows = DECL_FUNCTION_THROWS (found);
6583 fthrows; fthrows = TREE_CHAIN (fthrows))
6585 if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
6586 break;
6588 if (!fthrows)
6590 parse_error_context
6591 (method_wfl, "Invalid checked exception class `%s' in `throws' clause. The exception must be a subclass of an exception thrown by `%s' from class `%s'",
6592 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
6593 lang_printable_name (found, 0),
6594 IDENTIFIER_POINTER
6595 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6600 /* Check abstract method of interface INTERFACE */
6601 static void
6602 java_check_abstract_methods (tree interface_decl)
6604 int i, n;
6605 tree method, basetype_vec, found;
6606 tree interface = TREE_TYPE (interface_decl);
6608 for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
6610 /* 2- Check for double definition inside the defining interface */
6611 if (check_method_redefinition (interface, method))
6612 continue;
6614 /* 3- Overriding is OK as far as we preserve the return type. */
6615 found = lookup_java_interface_method2 (interface, method);
6616 if (found)
6618 char *t;
6619 t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6620 parse_error_context
6621 (DECL_FUNCTION_WFL (found),
6622 "Method `%s' was defined with return type `%s' in class `%s'",
6623 lang_printable_name (found, 0), t,
6624 IDENTIFIER_POINTER
6625 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6626 free (t);
6627 continue;
6631 /* 4- Inherited methods can't differ by their returned types */
6632 if (!(basetype_vec = TYPE_BINFO_BASETYPES (interface)))
6633 return;
6634 n = TREE_VEC_LENGTH (basetype_vec);
6635 for (i = 0; i < n; i++)
6637 tree sub_interface_method, sub_interface;
6638 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
6639 if (!vec_elt)
6640 continue;
6641 sub_interface = BINFO_TYPE (vec_elt);
6642 for (sub_interface_method = TYPE_METHODS (sub_interface);
6643 sub_interface_method;
6644 sub_interface_method = TREE_CHAIN (sub_interface_method))
6646 found = lookup_java_interface_method2 (interface,
6647 sub_interface_method);
6648 if (found && (found != sub_interface_method))
6650 parse_error_context
6651 (lookup_cl (sub_interface_method),
6652 "Interface `%s' inherits method `%s' from interface `%s'. This method is redefined with a different return type in interface `%s'",
6653 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
6654 lang_printable_name (found, 0),
6655 IDENTIFIER_POINTER
6656 (DECL_NAME (TYPE_NAME
6657 (DECL_CONTEXT (sub_interface_method)))),
6658 IDENTIFIER_POINTER
6659 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6665 /* Lookup methods in interfaces using their name and partial
6666 signature. Return a matching method only if their types differ. */
6668 static tree
6669 lookup_java_interface_method2 (tree class, tree method_decl)
6671 int i, n;
6672 tree basetype_vec = TYPE_BINFO_BASETYPES (class), to_return;
6674 if (!basetype_vec)
6675 return NULL_TREE;
6677 n = TREE_VEC_LENGTH (basetype_vec);
6678 for (i = 0; i < n; i++)
6680 tree vec_elt = TREE_VEC_ELT (basetype_vec, i), to_return;
6681 if ((BINFO_TYPE (vec_elt) != object_type_node)
6682 && (to_return =
6683 lookup_java_method2 (BINFO_TYPE (vec_elt), method_decl, 1)))
6684 return to_return;
6686 for (i = 0; i < n; i++)
6688 to_return = lookup_java_interface_method2
6689 (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)), method_decl);
6690 if (to_return)
6691 return to_return;
6694 return NULL_TREE;
6697 /* Lookup method using their name and partial signature. Return a
6698 matching method only if their types differ. */
6700 static tree
6701 lookup_java_method2 (tree clas, tree method_decl, int do_interface)
6703 tree method, method_signature, method_name, method_type, name;
6705 method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
6706 name = DECL_NAME (method_decl);
6707 method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6708 EXPR_WFL_NODE (name) : name);
6709 method_type = TREE_TYPE (TREE_TYPE (method_decl));
6711 while (clas != NULL_TREE)
6713 for (method = TYPE_METHODS (clas);
6714 method != NULL_TREE; method = TREE_CHAIN (method))
6716 tree method_sig = build_java_argument_signature (TREE_TYPE (method));
6717 tree name = DECL_NAME (method);
6718 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6719 EXPR_WFL_NODE (name) : name) == method_name
6720 && method_sig == method_signature
6721 && TREE_TYPE (TREE_TYPE (method)) != method_type)
6722 return method;
6724 clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
6726 return NULL_TREE;
6729 /* Return the line that matches DECL line number, and try its best to
6730 position the column number. Used during error reports. */
6732 static GTY(()) tree cl_v;
6733 static tree
6734 lookup_cl (tree decl)
6736 char *line, *found;
6738 if (!decl)
6739 return NULL_TREE;
6741 if (cl_v == NULL_TREE)
6743 cl_v = build_expr_wfl (NULL_TREE, NULL, 0, 0);
6746 EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
6747 EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE (decl), -1);
6749 line = java_get_line_col (EXPR_WFL_FILENAME (cl_v),
6750 EXPR_WFL_LINENO (cl_v), EXPR_WFL_COLNO (cl_v));
6752 found = strstr ((const char *)line,
6753 (const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
6754 if (found)
6755 EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
6757 return cl_v;
6760 /* Look for a simple name in the single-type import list */
6762 static tree
6763 find_name_in_single_imports (tree name)
6765 tree node;
6767 for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
6768 if (TREE_VALUE (node) == name)
6769 return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
6771 return NULL_TREE;
6774 /* Process all single-type import. */
6776 static int
6777 process_imports (void)
6779 tree import;
6780 int error_found;
6782 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
6784 tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
6785 char *original_name;
6787 original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
6788 IDENTIFIER_LENGTH (to_be_found),
6789 IDENTIFIER_LENGTH (to_be_found) + 1);
6791 /* Don't load twice something already defined. */
6792 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6793 continue;
6795 while (1)
6797 tree left;
6799 QUALIFIED_P (to_be_found) = 1;
6800 load_class (to_be_found, 0);
6801 error_found =
6802 check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true);
6804 /* We found it, we can bail out */
6805 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6807 check_deprecation (TREE_PURPOSE (import),
6808 IDENTIFIER_CLASS_VALUE (to_be_found));
6809 break;
6812 /* We haven't found it. Maybe we're trying to access an
6813 inner class. The only way for us to know is to try again
6814 after having dropped a qualifier. If we can't break it further,
6815 we have an error. */
6816 if (breakdown_qualified (&left, NULL, to_be_found))
6817 break;
6819 to_be_found = left;
6821 if (!IDENTIFIER_CLASS_VALUE (to_be_found))
6823 parse_error_context (TREE_PURPOSE (import),
6824 "Class or interface `%s' not found in import",
6825 original_name);
6826 error_found = 1;
6829 free (original_name);
6830 if (error_found)
6831 return 1;
6833 return 0;
6836 /* Possibly find and mark a class imported by a single-type import
6837 statement. */
6839 static void
6840 find_in_imports (tree enclosing_type, tree class_type)
6842 tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) :
6843 ctxp->import_list);
6844 while (import)
6846 if (TREE_VALUE (import) == TYPE_NAME (class_type))
6848 TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
6849 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
6850 return;
6852 import = TREE_CHAIN (import);
6856 static int
6857 note_possible_classname (const char *name, int len)
6859 tree node;
6860 if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
6861 len = len - 5;
6862 else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
6863 len = len - 6;
6864 else
6865 return 0;
6866 node = ident_subst (name, len, "", '/', '.', "");
6867 IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
6868 QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
6869 return 1;
6872 /* Read a import directory, gathering potential match for further type
6873 references. Indifferently reads a filesystem or a ZIP archive
6874 directory. */
6876 static void
6877 read_import_dir (tree wfl)
6879 tree package_id = EXPR_WFL_NODE (wfl);
6880 const char *package_name = IDENTIFIER_POINTER (package_id);
6881 int package_length = IDENTIFIER_LENGTH (package_id);
6882 DIR *dirp = NULL;
6883 JCF *saved_jcf = current_jcf;
6885 int found = 0;
6886 int k;
6887 void *entry;
6888 struct buffer filename[1];
6890 if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
6891 return;
6892 IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
6894 BUFFER_INIT (filename);
6895 buffer_grow (filename, package_length + 100);
6897 for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
6899 const char *entry_name = jcf_path_name (entry);
6900 int entry_length = strlen (entry_name);
6901 if (jcf_path_is_zipfile (entry))
6903 ZipFile *zipf;
6904 buffer_grow (filename, entry_length);
6905 memcpy (filename->data, entry_name, entry_length - 1);
6906 filename->data[entry_length-1] = '\0';
6907 zipf = opendir_in_zip (filename->data, jcf_path_is_system (entry));
6908 if (zipf == NULL)
6909 error ("malformed .zip archive in CLASSPATH: %s", entry_name);
6910 else
6912 ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
6913 BUFFER_RESET (filename);
6914 for (k = 0; k < package_length; k++)
6916 char ch = package_name[k];
6917 *filename->ptr++ = ch == '.' ? '/' : ch;
6919 *filename->ptr++ = '/';
6921 for (k = 0; k < zipf->count; k++, zipd = ZIPDIR_NEXT (zipd))
6923 const char *current_entry = ZIPDIR_FILENAME (zipd);
6924 int current_entry_len = zipd->filename_length;
6926 if (current_entry_len >= BUFFER_LENGTH (filename)
6927 && strncmp (filename->data, current_entry,
6928 BUFFER_LENGTH (filename)) != 0)
6929 continue;
6930 found |= note_possible_classname (current_entry,
6931 current_entry_len);
6935 else
6937 BUFFER_RESET (filename);
6938 buffer_grow (filename, entry_length + package_length + 4);
6939 strcpy (filename->data, entry_name);
6940 filename->ptr = filename->data + entry_length;
6941 for (k = 0; k < package_length; k++)
6943 char ch = package_name[k];
6944 *filename->ptr++ = ch == '.' ? '/' : ch;
6946 *filename->ptr = '\0';
6948 dirp = opendir (filename->data);
6949 if (dirp == NULL)
6950 continue;
6951 *filename->ptr++ = '/';
6952 for (;;)
6954 int len;
6955 const char *d_name;
6956 struct dirent *direntp = readdir (dirp);
6957 if (!direntp)
6958 break;
6959 d_name = direntp->d_name;
6960 len = strlen (direntp->d_name);
6961 buffer_grow (filename, len+1);
6962 strcpy (filename->ptr, d_name);
6963 found |= note_possible_classname (filename->data + entry_length,
6964 package_length+len+1);
6966 if (dirp)
6967 closedir (dirp);
6971 free (filename->data);
6973 /* Here we should have a unified way of retrieving an entry, to be
6974 indexed. */
6975 if (!found)
6977 static int first = 1;
6978 if (first)
6980 error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives", package_name);
6981 java_error_count++;
6982 first = 0;
6984 else
6985 parse_error_context (wfl, "Package `%s' not found in import",
6986 package_name);
6987 current_jcf = saved_jcf;
6988 return;
6990 current_jcf = saved_jcf;
6993 /* Possibly find a type in the import on demands specified
6994 types. Returns 1 if an error occurred, 0 otherwise. Run through the
6995 entire list, to detected potential double definitions. */
6997 static int
6998 find_in_imports_on_demand (tree enclosing_type, tree class_type)
7000 tree class_type_name = TYPE_NAME (class_type);
7001 tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) :
7002 ctxp->import_demand_list);
7003 tree cl = NULL_TREE;
7004 int seen_once = -1; /* -1 when not set, 1 if seen once, >1 otherwise. */
7005 int to_return = -1; /* -1 when not set, 0 or 1 otherwise */
7006 tree node;
7008 for (; import; import = TREE_CHAIN (import))
7010 int saved_lineno = input_line;
7011 int access_check;
7012 const char *id_name;
7013 tree decl, type_name_copy;
7015 obstack_grow (&temporary_obstack,
7016 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
7017 IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
7018 obstack_1grow (&temporary_obstack, '.');
7019 obstack_grow0 (&temporary_obstack,
7020 IDENTIFIER_POINTER (class_type_name),
7021 IDENTIFIER_LENGTH (class_type_name));
7022 id_name = obstack_finish (&temporary_obstack);
7024 if (! (node = maybe_get_identifier (id_name)))
7025 continue;
7027 /* Setup lineno so that it refers to the line of the import (in
7028 case we parse a class file and encounter errors */
7029 input_line = EXPR_WFL_LINENO (TREE_PURPOSE (import));
7031 type_name_copy = TYPE_NAME (class_type);
7032 TYPE_NAME (class_type) = node;
7033 QUALIFIED_P (node) = 1;
7034 decl = IDENTIFIER_CLASS_VALUE (node);
7035 access_check = -1;
7036 /* If there is no DECL set for the class or if the class isn't
7037 loaded and not seen in source yet, then load */
7038 if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl))
7039 && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl))))
7041 load_class (node, 0);
7042 decl = IDENTIFIER_CLASS_VALUE (node);
7044 if (decl && ! INNER_CLASS_P (TREE_TYPE (decl)))
7045 access_check = check_pkg_class_access (node, TREE_PURPOSE (import),
7046 false);
7047 else
7048 /* 6.6.1: Inner classes are subject to member access rules. */
7049 access_check = 0;
7051 input_line = saved_lineno;
7053 /* If the loaded class is not accessible or couldn't be loaded,
7054 we restore the original TYPE_NAME and process the next
7055 import. */
7056 if (access_check || !decl)
7058 TYPE_NAME (class_type) = type_name_copy;
7059 continue;
7062 /* If the loaded class is accessible, we keep a tab on it to
7063 detect and report multiple inclusions. */
7064 if (IS_A_CLASSFILE_NAME (node))
7066 if (seen_once < 0)
7068 cl = TREE_PURPOSE (import);
7069 seen_once = 1;
7071 else if (seen_once >= 0)
7073 tree location = (cl ? cl : TREE_PURPOSE (import));
7074 tree package = (cl ? EXPR_WFL_NODE (cl) :
7075 EXPR_WFL_NODE (TREE_PURPOSE (import)));
7076 seen_once++;
7077 parse_error_context
7078 (location,
7079 "Type `%s' also potentially defined in package `%s'",
7080 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
7081 IDENTIFIER_POINTER (package));
7084 to_return = access_check;
7087 if (seen_once == 1)
7088 return to_return;
7089 else
7090 return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
7093 /* Add package NAME to the list of packages encountered so far. To
7094 speed up class lookup in do_resolve_class, we make sure a
7095 particular package is added only once. */
7097 static void
7098 register_package (tree name)
7100 static htab_t pht;
7101 void **e;
7103 if (pht == NULL)
7104 pht = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
7106 e = htab_find_slot (pht, name, INSERT);
7107 if (*e == NULL)
7109 package_list = chainon (package_list, build_tree_list (name, NULL));
7110 *e = name;
7114 static tree
7115 resolve_package (tree pkg, tree *next, tree *type_name)
7117 tree current;
7118 tree decl = NULL_TREE;
7119 *type_name = NULL_TREE;
7121 /* The trick is to determine when the package name stops and were
7122 the name of something contained in the package starts. Then we
7123 return a fully qualified name of what we want to get. */
7125 *next = EXPR_WFL_QUALIFICATION (pkg);
7127 /* Try to progressively construct a type name */
7128 if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION)
7129 for (current = EXPR_WFL_QUALIFICATION (pkg);
7130 current; current = TREE_CHAIN (current))
7132 /* If we don't have what we're expecting, exit now. TYPE_NAME
7133 will be null and the error caught later. */
7134 if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION)
7135 break;
7136 *type_name =
7137 merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current)));
7138 if ((decl = resolve_no_layout (*type_name, NULL_TREE)))
7140 /* resolve_package should be used in a loop, hence we
7141 point at this one to naturally process the next one at
7142 the next iteration. */
7143 *next = current;
7144 break;
7147 return decl;
7151 /* Check accessibility of inner classes according to member access rules.
7152 DECL is the inner class, ENCLOSING_DECL is the class from which the
7153 access is being attempted. */
7155 static void
7156 check_inner_class_access (tree decl, tree enclosing_decl, tree cl)
7158 const char *access;
7159 tree enclosing_decl_type;
7161 /* We don't issue an error message when CL is null. CL can be null
7162 as a result of processing a JDEP crafted by source_start_java_method
7163 for the purpose of patching its parm decl. But the error would
7164 have been already trapped when fixing the method's signature.
7165 DECL can also be NULL in case of earlier errors. */
7166 if (!decl || !cl)
7167 return;
7169 enclosing_decl_type = TREE_TYPE (enclosing_decl);
7171 if (CLASS_PRIVATE (decl))
7173 /* Access is permitted only within the body of the top-level
7174 class in which DECL is declared. */
7175 tree top_level = decl;
7176 while (DECL_CONTEXT (top_level))
7177 top_level = DECL_CONTEXT (top_level);
7178 while (DECL_CONTEXT (enclosing_decl))
7179 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7180 if (top_level == enclosing_decl)
7181 return;
7182 access = "private";
7184 else if (CLASS_PROTECTED (decl))
7186 tree decl_context;
7187 /* Access is permitted from within the same package... */
7188 if (in_same_package (decl, enclosing_decl))
7189 return;
7191 /* ... or from within the body of a subtype of the context in which
7192 DECL is declared. */
7193 decl_context = DECL_CONTEXT (decl);
7194 while (enclosing_decl)
7196 if (CLASS_INTERFACE (decl))
7198 if (interface_of_p (TREE_TYPE (decl_context),
7199 enclosing_decl_type))
7200 return;
7202 else
7204 /* Eww. The order of the arguments is different!! */
7205 if (inherits_from_p (enclosing_decl_type,
7206 TREE_TYPE (decl_context)))
7207 return;
7209 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7211 access = "protected";
7213 else if (! CLASS_PUBLIC (decl))
7215 /* Access is permitted only from within the same package as DECL. */
7216 if (in_same_package (decl, enclosing_decl))
7217 return;
7218 access = "non-public";
7220 else
7221 /* Class is public. */
7222 return;
7224 parse_error_context (cl, "Nested %s %s is %s; cannot be accessed from here",
7225 (CLASS_INTERFACE (decl) ? "interface" : "class"),
7226 lang_printable_name (decl, 0), access);
7229 /* Accessibility check for top-level classes. If CLASS_NAME is in a
7230 foreign package, it must be PUBLIC. Return 0 if no access
7231 violations were found, 1 otherwise. If VERBOSE is true and an error
7232 was found, it is reported and accounted for. */
7234 static int
7235 check_pkg_class_access (tree class_name, tree cl, bool verbose)
7237 tree type;
7239 if (!IDENTIFIER_CLASS_VALUE (class_name))
7240 return 0;
7242 if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
7243 return 0;
7245 if (!CLASS_PUBLIC (TYPE_NAME (type)))
7247 /* Access to a private class within the same package is
7248 allowed. */
7249 tree l, r;
7250 breakdown_qualified (&l, &r, class_name);
7251 if (!QUALIFIED_P (class_name) && !ctxp->package)
7252 /* Both in the empty package. */
7253 return 0;
7254 if (l == ctxp->package)
7255 /* Both in the same package. */
7256 return 0;
7258 if (verbose)
7259 parse_error_context
7260 (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed",
7261 (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
7262 IDENTIFIER_POINTER (class_name));
7263 return 1;
7265 return 0;
7268 /* Local variable declaration. */
7270 static void
7271 declare_local_variables (int modifier, tree type, tree vlist)
7273 tree decl, current, saved_type;
7274 tree type_wfl = NULL_TREE;
7275 int must_chain = 0;
7276 int final_p = 0;
7278 /* Push a new block if statements were seen between the last time we
7279 pushed a block and now. Keep a count of blocks to close */
7280 if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
7282 tree b = enter_block ();
7283 BLOCK_IS_IMPLICIT (b) = 1;
7286 if (modifier)
7288 size_t i;
7289 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)
7290 if (1 << i & modifier)
7291 break;
7292 if (modifier == ACC_FINAL)
7293 final_p = 1;
7294 else
7296 parse_error_context
7297 (ctxp->modifier_ctx [i],
7298 "Only `final' is allowed as a local variables modifier");
7299 return;
7303 /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
7304 hold the TYPE value if a new incomplete has to be created (as
7305 opposed to being found already existing and reused). */
7306 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
7308 /* If TYPE is fully resolved and we don't have a reference, make one */
7309 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7311 /* Go through all the declared variables */
7312 for (current = vlist, saved_type = type; current;
7313 current = TREE_CHAIN (current), type = saved_type)
7315 tree other, real_type;
7316 tree wfl = TREE_PURPOSE (current);
7317 tree name = EXPR_WFL_NODE (wfl);
7318 tree init = TREE_VALUE (current);
7320 /* Process NAME, as it may specify extra dimension(s) for it */
7321 type = build_array_from_name (type, type_wfl, name, &name);
7323 /* Variable redefinition check */
7324 if ((other = lookup_name_in_blocks (name)))
7326 variable_redefinition_error (wfl, name, TREE_TYPE (other),
7327 DECL_SOURCE_LINE (other));
7328 continue;
7331 /* Type adjustment. We may have just readjusted TYPE because
7332 the variable specified more dimensions. Make sure we have
7333 a reference if we can and don't have one already. */
7334 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7336 real_type = GET_REAL_TYPE (type);
7337 /* Never layout this decl. This will be done when its scope
7338 will be entered */
7339 decl = build_decl (VAR_DECL, name, real_type);
7340 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
7341 DECL_FINAL (decl) = final_p;
7342 BLOCK_CHAIN_DECL (decl);
7344 /* If doing xreferencing, replace the line number with the WFL
7345 compound value */
7346 if (flag_emit_xref)
7347 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
7349 /* Don't try to use an INIT statement when an error was found */
7350 if (init && java_error_count)
7351 init = NULL_TREE;
7353 /* Add the initialization function to the current function's code */
7354 if (init)
7356 /* Name might have been readjusted */
7357 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
7358 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
7359 java_method_add_stmt (current_function_decl,
7360 build_debugable_stmt (EXPR_WFL_LINECOL (init),
7361 init));
7364 /* Setup dependency the type of the decl */
7365 if (must_chain)
7367 jdep *dep;
7368 register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
7369 dep = CLASSD_LAST (ctxp->classd_list);
7370 JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
7373 SOURCE_FRONTEND_DEBUG (("Defined locals"));
7376 /* Called during parsing. Build decls from argument list. */
7378 static void
7379 source_start_java_method (tree fndecl)
7381 tree tem;
7382 tree parm_decl;
7383 int i;
7385 if (!fndecl)
7386 return;
7388 current_function_decl = fndecl;
7390 /* New scope for the function */
7391 enter_block ();
7392 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
7393 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
7395 tree type = TREE_VALUE (tem);
7396 tree name = TREE_PURPOSE (tem);
7398 /* If type is incomplete. Create an incomplete decl and ask for
7399 the decl to be patched later */
7400 if (INCOMPLETE_TYPE_P (type))
7402 jdep *jdep;
7403 tree real_type = GET_REAL_TYPE (type);
7404 parm_decl = build_decl (PARM_DECL, name, real_type);
7405 type = obtain_incomplete_type (type);
7406 register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
7407 jdep = CLASSD_LAST (ctxp->classd_list);
7408 JDEP_MISC (jdep) = name;
7409 JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
7411 else
7412 parm_decl = build_decl (PARM_DECL, name, type);
7414 /* Remember if a local variable was declared final (via its
7415 TREE_LIST of type/name.) Set DECL_FINAL accordingly. */
7416 if (ARG_FINAL_P (tem))
7418 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl);
7419 DECL_FINAL (parm_decl) = 1;
7422 BLOCK_CHAIN_DECL (parm_decl);
7424 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7425 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
7426 nreverse (tem);
7427 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
7428 DECL_MAX_LOCALS (current_function_decl) = i;
7431 /* Called during parsing. Creates an artificial method declaration. */
7433 static tree
7434 create_artificial_method (tree class, int flags, tree type,
7435 tree name, tree args)
7437 tree mdecl;
7439 java_parser_context_save_global ();
7440 input_line = 0;
7441 mdecl = make_node (FUNCTION_TYPE);
7442 TREE_TYPE (mdecl) = type;
7443 TYPE_ARG_TYPES (mdecl) = args;
7444 mdecl = add_method (class, flags, name, build_java_signature (mdecl));
7445 java_parser_context_restore_global ();
7446 DECL_ARTIFICIAL (mdecl) = 1;
7447 return mdecl;
7450 /* Starts the body if an artificial method. */
7452 static void
7453 start_artificial_method_body (tree mdecl)
7455 DECL_SOURCE_LINE (mdecl) = 1;
7456 DECL_FUNCTION_LAST_LINE (mdecl) = 1;
7457 source_start_java_method (mdecl);
7458 enter_block ();
7461 static void
7462 end_artificial_method_body (tree mdecl)
7464 /* exit_block modifies DECL_FUNCTION_BODY (current_function_decl).
7465 It has to be evaluated first. (if mdecl is current_function_decl,
7466 we have an undefined behavior if no temporary variable is used.) */
7467 tree b = exit_block ();
7468 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = b;
7469 exit_block ();
7472 /* Dump a tree of some kind. This is a convenience wrapper for the
7473 dump_* functions in tree-dump.c. */
7474 static void
7475 dump_java_tree (enum tree_dump_index phase, tree t)
7477 FILE *stream;
7478 int flags;
7480 stream = dump_begin (phase, &flags);
7481 flags |= TDF_SLIM;
7482 if (stream)
7484 dump_node (t, flags, stream);
7485 dump_end (phase, stream);
7489 /* Terminate a function and expand its body. */
7491 static void
7492 source_end_java_method (void)
7494 tree fndecl = current_function_decl;
7496 if (!fndecl)
7497 return;
7499 java_parser_context_save_global ();
7500 input_line = ctxp->last_ccb_indent1;
7502 /* Turn function bodies with only a NOP expr null, so they don't get
7503 generated at all and we won't get warnings when using the -W
7504 -Wall flags. */
7505 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) == empty_stmt_node)
7506 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
7508 /* We've generated all the trees for this function, and it has been
7509 patched. Dump it to a file if the user requested it. */
7510 dump_java_tree (TDI_original, fndecl);
7512 /* Defer expanding the method until cgraph analysis is complete. */
7513 if (DECL_SAVED_TREE (fndecl))
7514 cgraph_finalize_function (fndecl, false);
7516 current_function_decl = NULL_TREE;
7517 java_parser_context_restore_global ();
7520 /* Record EXPR in the current function block. Complements compound
7521 expression second operand if necessary. */
7523 tree
7524 java_method_add_stmt (tree fndecl, tree expr)
7526 if (!GET_CURRENT_BLOCK (fndecl))
7527 return NULL_TREE;
7528 return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
7531 static tree
7532 add_stmt_to_block (tree b, tree type, tree stmt)
7534 tree body = BLOCK_EXPR_BODY (b), c;
7536 if (java_error_count)
7537 return body;
7539 if ((c = add_stmt_to_compound (body, type, stmt)) == body)
7540 return body;
7542 BLOCK_EXPR_BODY (b) = c;
7543 TREE_SIDE_EFFECTS (c) = 1;
7544 return c;
7547 /* Add STMT to EXISTING if possible, otherwise create a new
7548 COMPOUND_EXPR and add STMT to it. */
7550 static tree
7551 add_stmt_to_compound (tree existing, tree type, tree stmt)
7553 if (existing)
7554 return build (COMPOUND_EXPR, type, existing, stmt);
7555 else
7556 return stmt;
7559 void java_layout_seen_class_methods (void)
7561 tree previous_list = all_class_list;
7562 tree end = NULL_TREE;
7563 tree current;
7565 while (1)
7567 for (current = previous_list;
7568 current != end; current = TREE_CHAIN (current))
7569 layout_class_methods (TREE_TYPE (TREE_VALUE (current)));
7571 if (previous_list != all_class_list)
7573 end = previous_list;
7574 previous_list = all_class_list;
7576 else
7577 break;
7581 static GTY(()) tree stop_reordering;
7582 void
7583 java_reorder_fields (void)
7585 tree current;
7587 for (current = gclass_list; current; current = TREE_CHAIN (current))
7589 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7591 if (current_class == stop_reordering)
7592 break;
7594 /* Reverse the fields, but leave the dummy field in front.
7595 Fields are already ordered for Object and Class */
7596 if (TYPE_FIELDS (current_class) && current_class != object_type_node
7597 && current_class != class_type_node)
7599 /* If the dummy field is there, reverse the right fields and
7600 just layout the type for proper fields offset */
7601 if (!DECL_NAME (TYPE_FIELDS (current_class)))
7603 tree fields = TYPE_FIELDS (current_class);
7604 TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
7605 TYPE_SIZE (current_class) = NULL_TREE;
7607 /* We don't have a dummy field, we need to layout the class,
7608 after having reversed the fields */
7609 else
7611 TYPE_FIELDS (current_class) =
7612 nreverse (TYPE_FIELDS (current_class));
7613 TYPE_SIZE (current_class) = NULL_TREE;
7617 /* There are cases were gclass_list will be empty. */
7618 if (gclass_list)
7619 stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list));
7622 /* Layout the methods of all classes loaded in one way or another.
7623 Check methods of source parsed classes. Then reorder the
7624 fields and layout the classes or the type of all source parsed
7625 classes */
7627 void
7628 java_layout_classes (void)
7630 tree current;
7631 int save_error_count = java_error_count;
7633 /* Layout the methods of all classes seen so far */
7634 java_layout_seen_class_methods ();
7635 java_parse_abort_on_error ();
7636 all_class_list = NULL_TREE;
7638 /* Then check the methods of all parsed classes */
7639 for (current = gclass_list; current; current = TREE_CHAIN (current))
7640 if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
7641 java_check_methods (TREE_VALUE (current));
7642 java_parse_abort_on_error ();
7644 for (current = gclass_list; current; current = TREE_CHAIN (current))
7646 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7647 layout_class (current_class);
7649 /* Error reported by the caller */
7650 if (java_error_count)
7651 return;
7654 /* We might have reloaded classes durign the process of laying out
7655 classes for code generation. We must layout the methods of those
7656 late additions, as constructor checks might use them */
7657 java_layout_seen_class_methods ();
7658 java_parse_abort_on_error ();
7661 /* Expand methods in the current set of classes remembered for
7662 generation. */
7664 static void
7665 java_complete_expand_classes (void)
7667 tree current;
7669 do_not_fold = flag_emit_xref;
7671 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
7672 if (!INNER_CLASS_DECL_P (current))
7673 java_complete_expand_class (current);
7676 /* Expand the methods found in OUTER, starting first by OUTER's inner
7677 classes, if any. */
7679 static void
7680 java_complete_expand_class (tree outer)
7682 tree inner_list;
7684 set_nested_class_simple_name_value (outer, 1); /* Set */
7686 /* We need to go after all inner classes and start expanding them,
7687 starting with most nested ones. We have to do that because nested
7688 classes might add functions to outer classes */
7690 for (inner_list = DECL_INNER_CLASS_LIST (outer);
7691 inner_list; inner_list = TREE_CHAIN (inner_list))
7692 java_complete_expand_class (TREE_PURPOSE (inner_list));
7694 java_complete_expand_methods (outer);
7695 set_nested_class_simple_name_value (outer, 0); /* Reset */
7698 /* Expand methods registered in CLASS_DECL. The general idea is that
7699 we expand regular methods first. This allows us get an estimate on
7700 how outer context local alias fields are really used so we can add
7701 to the constructor just enough code to initialize them properly (it
7702 also lets us generate finit$ correctly.) Then we expand the
7703 constructors and then <clinit>. */
7705 static void
7706 java_complete_expand_methods (tree class_decl)
7708 tree clinit, decl, first_decl;
7710 output_class = current_class = TREE_TYPE (class_decl);
7712 /* Pre-expand <clinit> to figure whether we really need it or
7713 not. If we do need it, we pre-expand the static fields so they're
7714 ready to be used somewhere else. <clinit> will be fully expanded
7715 after we processed the constructors. */
7716 first_decl = TYPE_METHODS (current_class);
7717 clinit = maybe_generate_pre_expand_clinit (current_class);
7719 /* Then generate finit$ (if we need to) because constructors will
7720 try to use it.*/
7721 if (TYPE_FINIT_STMT_LIST (current_class))
7722 java_complete_expand_method (generate_finit (current_class));
7724 /* Then generate instinit$ (if we need to) because constructors will
7725 try to use it. */
7726 if (TYPE_II_STMT_LIST (current_class))
7727 java_complete_expand_method (generate_instinit (current_class));
7729 /* Now do the constructors */
7730 for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl))
7732 int no_body;
7734 if (!DECL_CONSTRUCTOR_P (decl))
7735 continue;
7737 no_body = !DECL_FUNCTION_BODY (decl);
7738 /* Don't generate debug info on line zero when expanding a
7739 generated constructor. */
7740 if (no_body)
7741 restore_line_number_status (1);
7743 java_complete_expand_method (decl);
7745 if (no_body)
7746 restore_line_number_status (0);
7749 /* First, do the ordinary methods. */
7750 for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
7752 /* Ctors aren't part of this batch. */
7753 if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
7754 continue;
7756 /* Skip abstract or native methods -- but do handle native
7757 methods when generating JNI stubs. */
7758 if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl)))
7760 DECL_FUNCTION_BODY (decl) = NULL_TREE;
7761 continue;
7764 if (METHOD_NATIVE (decl))
7766 tree body;
7767 current_function_decl = decl;
7768 body = build_jni_stub (decl);
7769 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
7772 java_complete_expand_method (decl);
7775 /* If there is indeed a <clinit>, fully expand it now */
7776 if (clinit)
7778 /* Prevent the use of `this' inside <clinit> */
7779 ctxp->explicit_constructor_p = 1;
7780 java_complete_expand_method (clinit);
7781 ctxp->explicit_constructor_p = 0;
7784 /* We might have generated a class$ that we now want to expand */
7785 if (TYPE_DOT_CLASS (current_class))
7786 java_complete_expand_method (TYPE_DOT_CLASS (current_class));
7788 /* Now verify constructor circularity (stop after the first one we
7789 prove wrong.) */
7790 if (!CLASS_INTERFACE (class_decl))
7791 for (decl = TYPE_METHODS (current_class); decl; decl = TREE_CHAIN (decl))
7792 if (DECL_CONSTRUCTOR_P (decl)
7793 && verify_constructor_circularity (decl, decl))
7794 break;
7797 /* Attempt to create <clinit>. Pre-expand static fields so they can be
7798 safely used in some other methods/constructors. */
7800 static tree
7801 maybe_generate_pre_expand_clinit (tree class_type)
7803 tree current, mdecl;
7805 if (!TYPE_CLINIT_STMT_LIST (class_type))
7806 return NULL_TREE;
7808 /* Go through all static fields and pre expand them */
7809 for (current = TYPE_FIELDS (class_type); current;
7810 current = TREE_CHAIN (current))
7811 if (FIELD_STATIC (current))
7812 build_field_ref (NULL_TREE, class_type, DECL_NAME (current));
7814 /* Then build the <clinit> method */
7815 mdecl = create_artificial_method (class_type, ACC_STATIC, void_type_node,
7816 clinit_identifier_node, end_params_node);
7817 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
7818 mdecl, NULL_TREE);
7819 start_artificial_method_body (mdecl);
7821 /* We process the list of assignment we produced as the result of
7822 the declaration of initialized static field and add them as
7823 statement to the <clinit> method. */
7824 for (current = TYPE_CLINIT_STMT_LIST (class_type); current;
7825 current = TREE_CHAIN (current))
7827 tree stmt = current;
7828 /* We build the assignment expression that will initialize the
7829 field to its value. There are strict rules on static
7830 initializers (8.5). FIXME */
7831 if (TREE_CODE (stmt) != BLOCK && stmt != empty_stmt_node)
7832 stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt);
7833 java_method_add_stmt (mdecl, stmt);
7836 end_artificial_method_body (mdecl);
7838 /* Now we want to place <clinit> as the last method (because we need
7839 it at least for interface so that it doesn't interfere with the
7840 dispatch table based lookup. */
7841 if (TREE_CHAIN (TYPE_METHODS (class_type)))
7843 current = TREE_CHAIN (TYPE_METHODS (class_type));
7844 TYPE_METHODS (class_type) = current;
7846 while (TREE_CHAIN (current))
7847 current = TREE_CHAIN (current);
7849 TREE_CHAIN (current) = mdecl;
7850 TREE_CHAIN (mdecl) = NULL_TREE;
7853 return mdecl;
7856 /* Analyzes a method body and look for something that isn't a
7857 MODIFY_EXPR with a constant value. */
7859 static int
7860 analyze_clinit_body (tree this_class, tree bbody)
7862 while (bbody)
7863 switch (TREE_CODE (bbody))
7865 case BLOCK:
7866 bbody = BLOCK_EXPR_BODY (bbody);
7867 break;
7869 case EXPR_WITH_FILE_LOCATION:
7870 bbody = EXPR_WFL_NODE (bbody);
7871 break;
7873 case COMPOUND_EXPR:
7874 if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0)))
7875 return 1;
7876 bbody = TREE_OPERAND (bbody, 1);
7877 break;
7879 case MODIFY_EXPR:
7880 /* If we're generating to class file and we're dealing with an
7881 array initialization, we return 1 to keep <clinit> */
7882 if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT
7883 && flag_emit_class_files)
7884 return 1;
7886 /* There are a few cases where we're required to keep
7887 <clinit>:
7888 - If this is an assignment whose operand is not constant,
7889 - If this is an assignment to a non-initialized field,
7890 - If this field is not a member of the current class.
7892 return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1))
7893 || ! DECL_INITIAL (TREE_OPERAND (bbody, 0))
7894 || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class);
7896 default:
7897 return 1;
7899 return 0;
7903 /* See whether we could get rid of <clinit>. Criteria are: all static
7904 final fields have constant initial values and the body of <clinit>
7905 is empty. Return 1 if <clinit> was discarded, 0 otherwise. */
7907 static int
7908 maybe_yank_clinit (tree mdecl)
7910 tree type, current;
7911 tree fbody, bbody;
7913 if (!DECL_CLINIT_P (mdecl))
7914 return 0;
7916 /* If the body isn't empty, then we keep <clinit>. Note that if
7917 we're emitting classfiles, this isn't enough not to rule it
7918 out. */
7919 fbody = DECL_FUNCTION_BODY (mdecl);
7920 bbody = BLOCK_EXPR_BODY (fbody);
7921 if (bbody && bbody != error_mark_node)
7922 bbody = BLOCK_EXPR_BODY (bbody);
7923 else
7924 return 0;
7925 if (bbody && ! flag_emit_class_files && bbody != empty_stmt_node)
7926 return 0;
7928 type = DECL_CONTEXT (mdecl);
7929 current = TYPE_FIELDS (type);
7931 for (current = (current ? TREE_CHAIN (current) : current);
7932 current; current = TREE_CHAIN (current))
7934 tree f_init;
7936 /* We're not interested in non-static fields. */
7937 if (!FIELD_STATIC (current))
7938 continue;
7940 /* Nor in fields without initializers. */
7941 f_init = DECL_INITIAL (current);
7942 if (f_init == NULL_TREE)
7943 continue;
7945 /* Anything that isn't String or a basic type is ruled out -- or
7946 if we know how to deal with it (when doing things natively) we
7947 should generated an empty <clinit> so that SUID are computed
7948 correctly. */
7949 if (! JSTRING_TYPE_P (TREE_TYPE (current))
7950 && ! JNUMERIC_TYPE_P (TREE_TYPE (current)))
7951 return 0;
7953 if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init))
7954 return 0;
7957 /* Now we analyze the method body and look for something that
7958 isn't a MODIFY_EXPR */
7959 if (bbody != empty_stmt_node && analyze_clinit_body (type, bbody))
7960 return 0;
7962 /* Get rid of <clinit> in the class' list of methods */
7963 if (TYPE_METHODS (type) == mdecl)
7964 TYPE_METHODS (type) = TREE_CHAIN (mdecl);
7965 else
7966 for (current = TYPE_METHODS (type); current;
7967 current = TREE_CHAIN (current))
7968 if (TREE_CHAIN (current) == mdecl)
7970 TREE_CHAIN (current) = TREE_CHAIN (mdecl);
7971 break;
7974 return 1;
7977 /* Install the argument from MDECL. Suitable to completion and
7978 expansion of mdecl's body. */
7980 void
7981 start_complete_expand_method (tree mdecl)
7983 tree tem;
7985 pushlevel (1); /* Prepare for a parameter push */
7986 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7987 DECL_ARGUMENTS (mdecl) = tem;
7989 for (; tem; tem = TREE_CHAIN (tem))
7991 /* TREE_CHAIN (tem) will change after pushdecl. */
7992 tree next = TREE_CHAIN (tem);
7993 tree type = TREE_TYPE (tem);
7994 if (targetm.calls.promote_prototypes (type)
7995 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
7996 && INTEGRAL_TYPE_P (type))
7997 type = integer_type_node;
7998 DECL_ARG_TYPE (tem) = type;
7999 layout_decl (tem, 0);
8000 pushdecl (tem);
8001 /* Re-install the next so that the list is kept and the loop
8002 advances. */
8003 TREE_CHAIN (tem) = next;
8005 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8006 input_line = DECL_SOURCE_LINE (mdecl);
8007 build_result_decl (mdecl);
8011 /* Complete and expand a method. */
8013 static void
8014 java_complete_expand_method (tree mdecl)
8016 tree fbody, block_body, exception_copy;
8018 current_function_decl = mdecl;
8019 /* Fix constructors before expanding them */
8020 if (DECL_CONSTRUCTOR_P (mdecl))
8021 fix_constructors (mdecl);
8023 /* Expand functions that have a body */
8024 if (!DECL_FUNCTION_BODY (mdecl))
8025 return;
8027 fbody = DECL_FUNCTION_BODY (mdecl);
8028 block_body = BLOCK_EXPR_BODY (fbody);
8029 exception_copy = NULL_TREE;
8031 current_function_decl = mdecl;
8033 if (! quiet_flag)
8034 fprintf (stderr, " [%s.",
8035 lang_printable_name (DECL_CONTEXT (mdecl), 0));
8036 announce_function (mdecl);
8037 if (! quiet_flag)
8038 fprintf (stderr, "]");
8040 /* Prepare the function for tree completion */
8041 start_complete_expand_method (mdecl);
8043 /* Install the current this */
8044 current_this = (!METHOD_STATIC (mdecl) ?
8045 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
8047 /* Purge the `throws' list of unchecked exceptions (we save a copy
8048 of the list and re-install it later.) */
8049 exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl));
8050 purge_unchecked_exceptions (mdecl);
8052 /* Install exceptions thrown with `throws' */
8053 PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
8055 if (block_body != NULL_TREE)
8057 block_body = java_complete_tree (block_body);
8059 /* Before we check initialization, attached all class initialization
8060 variable to the block_body */
8061 htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (mdecl),
8062 attach_init_test_initialization_flags, block_body);
8064 if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
8066 check_for_initialization (block_body, mdecl);
8068 /* Go through all the flags marking the initialization of
8069 static variables and see whether they're definitively
8070 assigned, in which case the type is remembered as
8071 definitively initialized in MDECL. */
8072 if (STATIC_CLASS_INIT_OPT_P ())
8074 /* Always register the context as properly initialized in
8075 MDECL. This used with caution helps removing extra
8076 initialization of self. */
8077 if (METHOD_STATIC (mdecl))
8079 *(htab_find_slot
8080 (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl),
8081 DECL_CONTEXT (mdecl), INSERT)) = DECL_CONTEXT (mdecl);
8085 ctxp->explicit_constructor_p = 0;
8088 BLOCK_EXPR_BODY (fbody) = block_body;
8090 /* If we saw a return but couldn't evaluate it properly, we'll have
8091 an error_mark_node here. */
8092 if (block_body != error_mark_node
8093 && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
8094 && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE
8095 && !flag_emit_xref)
8096 missing_return_error (current_function_decl);
8098 /* See if we can get rid of <clinit> if MDECL happens to be <clinit> */
8099 maybe_yank_clinit (mdecl);
8101 /* Pop the current level, with special measures if we found errors. */
8102 if (java_error_count)
8103 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8104 poplevel (1, 0, 1);
8106 /* Pop the exceptions and sanity check */
8107 POP_EXCEPTIONS();
8108 if (currently_caught_type_list)
8109 abort ();
8111 /* Restore the copy of the list of exceptions if emitting xrefs. */
8112 DECL_FUNCTION_THROWS (mdecl) = exception_copy;
8115 /* For with each class for which there's code to generate. */
8117 static void
8118 java_expand_method_bodies (tree class)
8120 tree decl;
8121 for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl))
8123 tree block;
8124 tree body;
8126 if (! DECL_FUNCTION_BODY (decl))
8127 continue;
8129 current_function_decl = decl;
8131 block = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
8133 if (TREE_CODE (block) != BLOCK)
8134 abort ();
8136 /* Save the function body for inlining. */
8137 DECL_SAVED_TREE (decl) = block;
8139 body = BLOCK_EXPR_BODY (block);
8141 if (TREE_TYPE (body) == NULL_TREE)
8142 abort ();
8144 /* It's time to assign the variable flagging static class
8145 initialization based on which classes invoked static methods
8146 are definitely initializing. This should be flagged. */
8147 if (STATIC_CLASS_INIT_OPT_P ())
8149 tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl);
8150 for (; list != NULL_TREE; list = TREE_CHAIN (list))
8152 /* Executed for each statement calling a static function.
8153 LIST is a TREE_LIST whose PURPOSE is the called function
8154 and VALUE is a compound whose second operand can be patched
8155 with static class initialization flag assignments. */
8157 tree called_method = TREE_PURPOSE (list);
8158 tree compound = TREE_VALUE (list);
8159 tree assignment_compound_list
8160 = build_tree_list (called_method, NULL);
8162 /* For each class definitely initialized in
8163 CALLED_METHOD, fill ASSIGNMENT_COMPOUND with
8164 assignment to the class initialization flag. */
8165 htab_traverse (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method),
8166 emit_test_initialization,
8167 assignment_compound_list);
8169 if (TREE_VALUE (assignment_compound_list))
8170 TREE_OPERAND (compound, 1)
8171 = TREE_VALUE (assignment_compound_list);
8175 /* Prepend class initialization to static methods. */
8176 if (METHOD_STATIC (decl) && ! METHOD_PRIVATE (decl)
8177 && ! flag_emit_class_files
8178 && ! DECL_CLINIT_P (decl)
8179 && ! CLASS_INTERFACE (TYPE_NAME (class)))
8181 tree init = build (CALL_EXPR, void_type_node,
8182 build_address_of (soft_initclass_node),
8183 build_tree_list (NULL_TREE,
8184 build_class_ref (class)),
8185 NULL_TREE);
8186 TREE_SIDE_EFFECTS (init) = 1;
8187 body = build (COMPOUND_EXPR, TREE_TYPE (body), init, body);
8188 BLOCK_EXPR_BODY (block) = body;
8191 /* Wrap synchronized method bodies in a monitorenter
8192 plus monitorexit cleanup. */
8193 if (METHOD_SYNCHRONIZED (decl) && ! flag_emit_class_files)
8195 tree enter, exit, lock;
8196 if (METHOD_STATIC (decl))
8197 lock = build_class_ref (class);
8198 else
8199 lock = DECL_ARGUMENTS (decl);
8200 BUILD_MONITOR_ENTER (enter, lock);
8201 BUILD_MONITOR_EXIT (exit, lock);
8203 body = build (COMPOUND_EXPR, void_type_node,
8204 enter,
8205 build (TRY_FINALLY_EXPR, void_type_node, body, exit));
8206 BLOCK_EXPR_BODY (block) = body;
8209 /* Expand the the function body. */
8210 source_end_java_method ();
8216 /* This section of the code deals with accessing enclosing context
8217 fields either directly by using the relevant access to this$<n> or
8218 by invoking an access method crafted for that purpose. */
8220 /* Build the necessary access from an inner class to an outer
8221 class. This routine could be optimized to cache previous result
8222 (decl, current_class and returned access). When an access method
8223 needs to be generated, it always takes the form of a read. It might
8224 be later turned into a write by calling outer_field_access_fix. */
8226 static tree
8227 build_outer_field_access (tree id, tree decl)
8229 tree access = NULL_TREE;
8230 tree ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
8231 tree decl_ctx = DECL_CONTEXT (decl);
8233 /* If the immediate enclosing context of the current class is the
8234 field decl's class or inherits from it; build the access as
8235 `this$<n>.<field>'. Note that we will break the `private' barrier
8236 if we're not emitting bytecodes. */
8237 if ((ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
8238 && (!FIELD_PRIVATE (decl) || !flag_emit_class_files ))
8240 tree thisn = build_current_thisn (current_class);
8241 access = make_qualified_primary (build_wfl_node (thisn),
8242 id, EXPR_WFL_LINECOL (id));
8244 /* Otherwise, generate access methods to outer this and access the
8245 field (either using an access method or by direct access.) */
8246 else
8248 int lc = EXPR_WFL_LINECOL (id);
8250 /* Now we chain the required number of calls to the access$0 to
8251 get a hold to the enclosing instance we need, and then we
8252 build the field access. */
8253 access = build_access_to_thisn (current_class, decl_ctx, lc);
8255 /* If the field is private and we're generating bytecode, then
8256 we generate an access method */
8257 if (FIELD_PRIVATE (decl) && flag_emit_class_files )
8259 tree name = build_outer_field_access_methods (decl);
8260 access = build_outer_field_access_expr (lc, decl_ctx,
8261 name, access, NULL_TREE);
8263 /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'.
8264 Once again we break the `private' access rule from a foreign
8265 class. */
8266 else
8267 access = make_qualified_primary (access, id, lc);
8269 return resolve_expression_name (access, NULL);
8272 /* Return a nonzero value if NODE describes an outer field inner
8273 access. */
8275 static int
8276 outer_field_access_p (tree type, tree decl)
8278 if (!INNER_CLASS_TYPE_P (type)
8279 || TREE_CODE (decl) != FIELD_DECL
8280 || DECL_CONTEXT (decl) == type)
8281 return 0;
8283 /* If the inner class extends the declaration context of the field
8284 we're trying to access, then this isn't an outer field access */
8285 if (inherits_from_p (type, DECL_CONTEXT (decl)))
8286 return 0;
8288 for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ;
8289 type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))))
8291 if (type == DECL_CONTEXT (decl))
8292 return 1;
8294 if (!DECL_CONTEXT (TYPE_NAME (type)))
8296 /* Before we give up, see whether the field is inherited from
8297 the enclosing context we're considering. */
8298 if (inherits_from_p (type, DECL_CONTEXT (decl)))
8299 return 1;
8300 break;
8304 return 0;
8307 /* Return a nonzero value if NODE represents an outer field inner
8308 access that was been already expanded. As a side effect, it returns
8309 the name of the field being accessed and the argument passed to the
8310 access function, suitable for a regeneration of the access method
8311 call if necessary. */
8313 static int
8314 outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
8315 tree *arg)
8317 int identified = 0;
8319 if (TREE_CODE (node) != CALL_EXPR)
8320 return 0;
8322 /* Well, gcj generates slightly different tree nodes when compiling
8323 to native or bytecodes. It's the case for function calls. */
8325 if (flag_emit_class_files
8326 && TREE_CODE (node) == CALL_EXPR
8327 && OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
8328 identified = 1;
8329 else if (!flag_emit_class_files)
8331 node = TREE_OPERAND (node, 0);
8333 if (node && TREE_OPERAND (node, 0)
8334 && TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)
8336 node = TREE_OPERAND (node, 0);
8337 if (TREE_OPERAND (node, 0)
8338 && TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
8339 && (OUTER_FIELD_ACCESS_IDENTIFIER_P
8340 (DECL_NAME (TREE_OPERAND (node, 0)))))
8341 identified = 1;
8345 if (identified && name && arg_type && arg)
8347 tree argument = TREE_OPERAND (node, 1);
8348 *name = DECL_NAME (TREE_OPERAND (node, 0));
8349 *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
8350 *arg = TREE_VALUE (argument);
8352 return identified;
8355 /* Detect in NODE an outer field read access from an inner class and
8356 transform it into a write with RHS as an argument. This function is
8357 called from the java_complete_lhs when an assignment to a LHS can
8358 be identified. */
8360 static tree
8361 outer_field_access_fix (tree wfl, tree node, tree rhs)
8363 tree name, arg_type, arg;
8365 if (outer_field_expanded_access_p (node, &name, &arg_type, &arg))
8367 node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl),
8368 arg_type, name, arg, rhs);
8369 return java_complete_tree (node);
8371 return NULL_TREE;
8374 /* Construct the expression that calls an access method:
8375 <type>.access$<n>(<arg1> [, <arg2>]);
8377 ARG2 can be NULL and will be omitted in that case. It will denote a
8378 read access. */
8380 static tree
8381 build_outer_field_access_expr (int lc, tree type, tree access_method_name,
8382 tree arg1, tree arg2)
8384 tree args, cn, access;
8386 args = arg1 ? arg1 :
8387 build_wfl_node (build_current_thisn (current_class));
8388 args = build_tree_list (NULL_TREE, args);
8390 if (arg2)
8391 args = tree_cons (NULL_TREE, arg2, args);
8393 access = build_method_invocation (build_wfl_node (access_method_name), args);
8394 cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
8395 return make_qualified_primary (cn, access, lc);
8398 static tree
8399 build_new_access_id (void)
8401 static int access_n_counter = 1;
8402 char buffer [128];
8404 sprintf (buffer, "access$%d", access_n_counter++);
8405 return get_identifier (buffer);
8408 /* Create the static access functions for the outer field DECL. We define a
8409 read:
8410 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
8411 return inst$.field;
8413 and a write access:
8414 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$,
8415 TREE_TYPE (<field>) value$) {
8416 return inst$.field = value$;
8418 We should have a usage flags on the DECL so we can lazily turn the ones
8419 we're using for code generation. FIXME.
8422 static tree
8423 build_outer_field_access_methods (tree decl)
8425 tree id, args, stmt, mdecl;
8427 if (FIELD_INNER_ACCESS_P (decl))
8428 return FIELD_INNER_ACCESS (decl);
8430 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
8432 /* Create the identifier and a function named after it. */
8433 id = build_new_access_id ();
8435 /* The identifier is marked as bearing the name of a generated write
8436 access function for outer field accessed from inner classes. */
8437 OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8439 /* Create the read access */
8440 args = build_tree_list (inst_id, build_pointer_type (DECL_CONTEXT (decl)));
8441 TREE_CHAIN (args) = end_params_node;
8442 stmt = make_qualified_primary (build_wfl_node (inst_id),
8443 build_wfl_node (DECL_NAME (decl)), 0);
8444 stmt = build_return (0, stmt);
8445 mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8446 TREE_TYPE (decl), id, args, stmt);
8447 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8449 /* Create the write access method. No write access for final variable */
8450 if (!FIELD_FINAL (decl))
8452 args = build_tree_list (inst_id,
8453 build_pointer_type (DECL_CONTEXT (decl)));
8454 TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
8455 TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
8456 stmt = make_qualified_primary (build_wfl_node (inst_id),
8457 build_wfl_node (DECL_NAME (decl)), 0);
8458 stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
8459 build_wfl_node (wpv_id)));
8460 mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8461 TREE_TYPE (decl), id,
8462 args, stmt);
8464 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8466 /* Return the access name */
8467 return FIELD_INNER_ACCESS (decl) = id;
8470 /* Build an field access method NAME. */
8472 static tree
8473 build_outer_field_access_method (tree class, tree type, tree name,
8474 tree args, tree body)
8476 tree saved_current_function_decl, mdecl;
8478 /* Create the method */
8479 mdecl = create_artificial_method (class, ACC_STATIC, type, name, args);
8480 fix_method_argument_names (args, mdecl);
8481 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8483 /* Attach the method body. */
8484 saved_current_function_decl = current_function_decl;
8485 start_artificial_method_body (mdecl);
8486 java_method_add_stmt (mdecl, body);
8487 end_artificial_method_body (mdecl);
8488 current_function_decl = saved_current_function_decl;
8490 return mdecl;
8494 /* This section deals with building access function necessary for
8495 certain kinds of method invocation from inner classes. */
8497 static tree
8498 build_outer_method_access_method (tree decl)
8500 tree saved_current_function_decl, mdecl;
8501 tree args = NULL_TREE, call_args = NULL_TREE;
8502 tree carg, id, body, class;
8503 char buffer [80];
8504 int parm_id_count = 0;
8506 /* Test this abort with an access to a private field */
8507 if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "access$"))
8508 abort ();
8510 /* Check the cache first */
8511 if (DECL_FUNCTION_INNER_ACCESS (decl))
8512 return DECL_FUNCTION_INNER_ACCESS (decl);
8514 class = DECL_CONTEXT (decl);
8516 /* Obtain an access identifier and mark it */
8517 id = build_new_access_id ();
8518 OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8520 carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
8521 /* Create the arguments, as much as the original */
8522 for (; carg && carg != end_params_node;
8523 carg = TREE_CHAIN (carg))
8525 sprintf (buffer, "write_parm_value$%d", parm_id_count++);
8526 args = chainon (args, build_tree_list (get_identifier (buffer),
8527 TREE_VALUE (carg)));
8529 args = chainon (args, end_params_node);
8531 /* Create the method */
8532 mdecl = create_artificial_method (class, ACC_STATIC,
8533 TREE_TYPE (TREE_TYPE (decl)), id, args);
8534 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8535 /* There is a potential bug here. We should be able to use
8536 fix_method_argument_names, but then arg names get mixed up and
8537 eventually a constructor will have its this$0 altered and the
8538 outer context won't be assignment properly. The testcase is
8539 stub.java FIXME */
8540 TYPE_ARG_TYPES (TREE_TYPE (mdecl)) = args;
8542 /* Attach the method body. */
8543 saved_current_function_decl = current_function_decl;
8544 start_artificial_method_body (mdecl);
8546 /* The actual method invocation uses the same args. When invoking a
8547 static methods that way, we don't want to skip the first
8548 argument. */
8549 carg = args;
8550 if (!METHOD_STATIC (decl))
8551 carg = TREE_CHAIN (carg);
8552 for (; carg && carg != end_params_node; carg = TREE_CHAIN (carg))
8553 call_args = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (carg)),
8554 call_args);
8556 body = build_method_invocation (build_wfl_node (DECL_NAME (decl)),
8557 call_args);
8558 if (!METHOD_STATIC (decl))
8559 body = make_qualified_primary (build_wfl_node (TREE_PURPOSE (args)),
8560 body, 0);
8561 if (TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
8562 body = build_return (0, body);
8563 java_method_add_stmt (mdecl,body);
8564 end_artificial_method_body (mdecl);
8565 current_function_decl = saved_current_function_decl;
8567 /* Back tag the access function so it know what it accesses */
8568 DECL_FUNCTION_ACCESS_DECL (decl) = mdecl;
8570 /* Tag the current method so it knows it has an access generated */
8571 return DECL_FUNCTION_INNER_ACCESS (decl) = mdecl;
8575 /* This section of the code deals with building expressions to access
8576 the enclosing instance of an inner class. The enclosing instance is
8577 kept in a generated field called this$<n>, with <n> being the
8578 inner class nesting level (starting from 0.) */
8580 /* Build an access to a given this$<n>, always chaining access call to
8581 others. Access methods to this$<n> are build on the fly if
8582 necessary. This CAN'T be used to solely access this$<n-1> from
8583 this$<n> (which alway yield to special cases and optimization, see
8584 for example build_outer_field_access). */
8586 static tree
8587 build_access_to_thisn (tree from, tree to, int lc)
8589 tree access = NULL_TREE;
8591 while (from != to && PURE_INNER_CLASS_TYPE_P (from))
8593 if (!access)
8595 access = build_current_thisn (from);
8596 access = build_wfl_node (access);
8598 else
8600 tree access0_wfl, cn;
8602 maybe_build_thisn_access_method (from);
8603 access0_wfl = build_wfl_node (access0_identifier_node);
8604 cn = build_wfl_node (DECL_NAME (TYPE_NAME (from)));
8605 EXPR_WFL_LINECOL (access0_wfl) = lc;
8606 access = build_tree_list (NULL_TREE, access);
8607 access = build_method_invocation (access0_wfl, access);
8608 access = make_qualified_primary (cn, access, lc);
8611 /* If FROM isn't an inner class, that's fine, we've done enough.
8612 What we're looking for can be accessed from there. */
8613 from = DECL_CONTEXT (TYPE_NAME (from));
8614 if (!from)
8615 break;
8616 from = TREE_TYPE (from);
8618 return access;
8621 /* Build an access function to the this$<n> local to TYPE. NULL_TREE
8622 is returned if nothing needs to be generated. Otherwise, the method
8623 generated and a method decl is returned.
8625 NOTE: These generated methods should be declared in a class file
8626 attribute so that they can't be referred to directly. */
8628 static tree
8629 maybe_build_thisn_access_method (tree type)
8631 tree mdecl, args, stmt, rtype;
8632 tree saved_current_function_decl;
8634 /* If TYPE is a top-level class, no access method is required.
8635 If there already is such an access method, bail out. */
8636 if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type))
8637 return NULL_TREE;
8639 /* We generate the method. The method looks like:
8640 static <outer_of_type> access$0 (<type> inst$) { return inst$.this$<n>; }
8642 args = build_tree_list (inst_id, build_pointer_type (type));
8643 TREE_CHAIN (args) = end_params_node;
8644 rtype = build_pointer_type (TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))));
8645 mdecl = create_artificial_method (type, ACC_STATIC, rtype,
8646 access0_identifier_node, args);
8647 fix_method_argument_names (args, mdecl);
8648 layout_class_method (type, NULL_TREE, mdecl, NULL_TREE);
8649 stmt = build_current_thisn (type);
8650 stmt = make_qualified_primary (build_wfl_node (inst_id),
8651 build_wfl_node (stmt), 0);
8652 stmt = build_return (0, stmt);
8654 saved_current_function_decl = current_function_decl;
8655 start_artificial_method_body (mdecl);
8656 java_method_add_stmt (mdecl, stmt);
8657 end_artificial_method_body (mdecl);
8658 current_function_decl = saved_current_function_decl;
8660 CLASS_ACCESS0_GENERATED_P (type) = 1;
8662 return mdecl;
8665 /* Craft an correctly numbered `this$<n>'string. this$0 is used for
8666 the first level of innerclassing. this$1 for the next one, etc...
8667 This function can be invoked with TYPE to NULL, available and then
8668 has to count the parser context. */
8670 static GTY(()) tree saved_thisn;
8671 static GTY(()) tree saved_type;
8673 static tree
8674 build_current_thisn (tree type)
8676 static int saved_i = -1;
8677 static int saved_type_i = 0;
8678 tree decl;
8679 char buffer [24];
8680 int i = 0;
8682 if (type)
8684 if (type == saved_type)
8685 i = saved_type_i;
8686 else
8688 for (i = -1, decl = DECL_CONTEXT (TYPE_NAME (type));
8689 decl; decl = DECL_CONTEXT (decl), i++)
8692 saved_type = type;
8693 saved_type_i = i;
8696 else
8697 i = list_length (GET_CPC_LIST ())-2;
8699 if (i == saved_i)
8700 return saved_thisn;
8702 sprintf (buffer, "this$%d", i);
8703 saved_i = i;
8704 saved_thisn = get_identifier (buffer);
8705 return saved_thisn;
8708 /* Return the assignment to the hidden enclosing context `this$<n>'
8709 by the second incoming parameter to the innerclass constructor. The
8710 form used is `this.this$<n> = this$<n>;'. */
8712 static tree
8713 build_thisn_assign (void)
8715 if (current_class && PURE_INNER_CLASS_TYPE_P (current_class))
8717 tree thisn = build_current_thisn (current_class);
8718 tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
8719 build_wfl_node (thisn), 0);
8720 tree rhs = build_wfl_node (thisn);
8721 EXPR_WFL_SET_LINECOL (lhs, input_line, 0);
8722 return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
8724 return NULL_TREE;
8728 /* Building the synthetic `class$' used to implement the `.class' 1.1
8729 extension for non primitive types. This method looks like:
8731 static Class class$(String type) throws NoClassDefFoundError
8733 try {return (java.lang.Class.forName (String));}
8734 catch (ClassNotFoundException e) {
8735 throw new NoClassDefFoundError(e.getMessage());}
8736 } */
8738 static GTY(()) tree get_message_wfl;
8739 static GTY(()) tree type_parm_wfl;
8741 static tree
8742 build_dot_class_method (tree class)
8744 #define BWF(S) build_wfl_node (get_identifier ((S)))
8745 #define MQN(X,Y) make_qualified_name ((X), (Y), 0)
8746 tree args, tmp, saved_current_function_decl, mdecl, qual_name;
8747 tree stmt, throw_stmt;
8749 if (!get_message_wfl)
8751 get_message_wfl = build_wfl_node (get_identifier ("getMessage"));
8752 type_parm_wfl = build_wfl_node (get_identifier ("type$"));
8755 /* Build the arguments */
8756 args = build_tree_list (get_identifier ("type$"),
8757 build_pointer_type (string_type_node));
8758 TREE_CHAIN (args) = end_params_node;
8760 /* Build the qualified name java.lang.Class.forName */
8761 tmp = MQN (MQN (MQN (BWF ("java"),
8762 BWF ("lang")), BWF ("Class")), BWF ("forName"));
8764 /* Create the "class$" function */
8765 mdecl = create_artificial_method (class, ACC_STATIC,
8766 build_pointer_type (class_type_node),
8767 classdollar_identifier_node, args);
8768 qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8769 BWF ("NoClassDefFoundError"));
8770 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, qual_name);
8771 register_incomplete_type (JDEP_EXCEPTION, qual_name, NULL_TREE, NULL_TREE);
8772 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
8773 &TREE_VALUE (DECL_FUNCTION_THROWS (mdecl));
8775 /* We start by building the try block. We need to build:
8776 return (java.lang.Class.forName (type)); */
8777 stmt = build_method_invocation (tmp,
8778 build_tree_list (NULL_TREE, type_parm_wfl));
8779 stmt = build_return (0, stmt);
8781 /* Now onto the catch block. We start by building the expression
8782 throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
8783 throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
8784 get_message_wfl, 0);
8785 throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
8787 /* Build new NoClassDefFoundError (_.getMessage) */
8788 throw_stmt = build_new_invocation
8789 (build_wfl_node (get_identifier ("NoClassDefFoundError")),
8790 build_tree_list (build_pointer_type (string_type_node), throw_stmt));
8792 /* Build the throw, (it's too early to use BUILD_THROW) */
8793 throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt);
8795 /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */
8796 qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8797 BWF ("ClassNotFoundException"));
8798 stmt = encapsulate_with_try_catch (0, qual_name, stmt, throw_stmt);
8800 fix_method_argument_names (args, mdecl);
8801 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8802 saved_current_function_decl = current_function_decl;
8803 start_artificial_method_body (mdecl);
8804 java_method_add_stmt (mdecl, stmt);
8805 end_artificial_method_body (mdecl);
8806 current_function_decl = saved_current_function_decl;
8807 TYPE_DOT_CLASS (class) = mdecl;
8809 return mdecl;
8812 static tree
8813 build_dot_class_method_invocation (tree this_class, tree type)
8815 tree dot_class_method = TYPE_DOT_CLASS (this_class);
8816 tree sig_id, s, t;
8818 if (TYPE_ARRAY_P (type))
8819 sig_id = build_java_signature (type);
8820 else
8821 sig_id = DECL_NAME (TYPE_NAME (type));
8823 /* Ensure that the proper name separator is used */
8824 sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id),
8825 IDENTIFIER_LENGTH (sig_id));
8827 s = build_string (IDENTIFIER_LENGTH (sig_id),
8828 IDENTIFIER_POINTER (sig_id));
8829 t = build_method_invocation (build_wfl_node (DECL_NAME (dot_class_method)),
8830 build_tree_list (NULL_TREE, s));
8831 if (DECL_CONTEXT (dot_class_method) != this_class)
8833 tree class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (dot_class_method)));
8834 t = make_qualified_primary (build_wfl_node (class_name), t, 0);
8836 return t;
8839 /* This section of the code deals with constructor. */
8841 /* Craft a body for default constructor. Patch existing constructor
8842 bodies with call to super() and field initialization statements if
8843 necessary. */
8845 static void
8846 fix_constructors (tree mdecl)
8848 tree iii; /* Instance Initializer Invocation */
8849 tree body = DECL_FUNCTION_BODY (mdecl);
8850 tree thisn_assign, compound = NULL_TREE;
8851 tree class_type = DECL_CONTEXT (mdecl);
8853 if (DECL_FIXED_CONSTRUCTOR_P (mdecl))
8854 return;
8855 DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
8857 if (!body)
8859 /* It is an error for the compiler to generate a default
8860 constructor if the superclass doesn't have a constructor that
8861 takes no argument, or the same args for an anonymous class */
8862 if (verify_constructor_super (mdecl))
8864 tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (class_type));
8865 tree save = DECL_NAME (mdecl);
8866 const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
8867 DECL_NAME (mdecl) = DECL_NAME (sclass_decl);
8868 parse_error_context
8869 (lookup_cl (TYPE_NAME (class_type)),
8870 "No constructor matching `%s' found in class `%s'",
8871 lang_printable_name (mdecl, 0), n);
8872 DECL_NAME (mdecl) = save;
8875 /* The constructor body must be crafted by hand. It's the
8876 constructor we defined when we realize we didn't have the
8877 CLASSNAME() constructor */
8878 start_artificial_method_body (mdecl);
8880 /* Insert an assignment to the this$<n> hidden field, if
8881 necessary */
8882 if ((thisn_assign = build_thisn_assign ()))
8883 java_method_add_stmt (mdecl, thisn_assign);
8885 /* We don't generate a super constructor invocation if we're
8886 compiling java.lang.Object. build_super_invocation takes care
8887 of that. */
8888 java_method_add_stmt (mdecl, build_super_invocation (mdecl));
8890 /* FIXME */
8891 if ((iii = build_instinit_invocation (class_type)))
8892 java_method_add_stmt (mdecl, iii);
8894 end_artificial_method_body (mdecl);
8896 /* Search for an explicit constructor invocation */
8897 else
8899 int found = 0;
8900 int invokes_this = 0;
8901 tree found_call = NULL_TREE;
8902 tree main_block = BLOCK_EXPR_BODY (body);
8904 while (body)
8905 switch (TREE_CODE (body))
8907 case CALL_EXPR:
8908 found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
8909 if (CALL_THIS_CONSTRUCTOR_P (body))
8910 invokes_this = 1;
8911 body = NULL_TREE;
8912 break;
8913 case COMPOUND_EXPR:
8914 case EXPR_WITH_FILE_LOCATION:
8915 found_call = body;
8916 body = TREE_OPERAND (body, 0);
8917 break;
8918 case BLOCK:
8919 found_call = body;
8920 body = BLOCK_EXPR_BODY (body);
8921 break;
8922 default:
8923 found = 0;
8924 body = NULL_TREE;
8927 /* Generate the assignment to this$<n>, if necessary */
8928 if ((thisn_assign = build_thisn_assign ()))
8929 compound = add_stmt_to_compound (compound, NULL_TREE, thisn_assign);
8931 /* The constructor is missing an invocation of super() */
8932 if (!found)
8933 compound = add_stmt_to_compound (compound, NULL_TREE,
8934 build_super_invocation (mdecl));
8935 /* Explicit super() invocation should take place before the
8936 instance initializer blocks. */
8937 else
8939 compound = add_stmt_to_compound (compound, NULL_TREE,
8940 TREE_OPERAND (found_call, 0));
8941 TREE_OPERAND (found_call, 0) = empty_stmt_node;
8944 DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
8946 /* Insert the instance initializer block right after. */
8947 if (!invokes_this && (iii = build_instinit_invocation (class_type)))
8948 compound = add_stmt_to_compound (compound, NULL_TREE, iii);
8950 /* Fix the constructor main block if we're adding extra stmts */
8951 if (compound)
8953 compound = add_stmt_to_compound (compound, NULL_TREE,
8954 BLOCK_EXPR_BODY (main_block));
8955 BLOCK_EXPR_BODY (main_block) = compound;
8960 /* Browse constructors in the super class, searching for a constructor
8961 that doesn't take any argument. Return 0 if one is found, 1
8962 otherwise. If the current class is an anonymous inner class, look
8963 for something that has the same signature. */
8965 static int
8966 verify_constructor_super (tree mdecl)
8968 tree class = CLASSTYPE_SUPER (current_class);
8969 int super_inner = PURE_INNER_CLASS_TYPE_P (class);
8970 tree sdecl;
8972 if (!class)
8973 return 0;
8975 if (ANONYMOUS_CLASS_P (current_class))
8977 tree mdecl_arg_type;
8978 SKIP_THIS_AND_ARTIFICIAL_PARMS (mdecl_arg_type, mdecl);
8979 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
8980 if (DECL_CONSTRUCTOR_P (sdecl))
8982 tree m_arg_type;
8983 tree arg_type = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
8984 if (super_inner)
8985 arg_type = TREE_CHAIN (arg_type);
8986 for (m_arg_type = mdecl_arg_type;
8987 (arg_type != end_params_node
8988 && m_arg_type != end_params_node);
8989 arg_type = TREE_CHAIN (arg_type),
8990 m_arg_type = TREE_CHAIN (m_arg_type))
8991 if (!valid_method_invocation_conversion_p
8992 (TREE_VALUE (arg_type),
8993 TREE_VALUE (m_arg_type)))
8994 break;
8996 if (arg_type == end_params_node && m_arg_type == end_params_node)
8997 return 0;
9000 else
9002 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
9004 tree arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
9005 if (super_inner)
9006 arg = TREE_CHAIN (arg);
9007 if (DECL_CONSTRUCTOR_P (sdecl) && arg == end_params_node)
9008 return 0;
9011 return 1;
9014 /* Generate code for all context remembered for code generation. */
9016 static GTY(()) tree reversed_class_list;
9017 void
9018 java_expand_classes (void)
9020 int save_error_count = 0;
9021 static struct parser_ctxt *cur_ctxp = NULL;
9023 java_parse_abort_on_error ();
9024 if (!(ctxp = ctxp_for_generation))
9025 return;
9026 java_layout_classes ();
9027 java_parse_abort_on_error ();
9029 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9031 tree current;
9032 for (current = cur_ctxp->class_list;
9033 current;
9034 current = TREE_CHAIN (current))
9035 gen_indirect_dispatch_tables (TREE_TYPE (current));
9038 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9040 ctxp = cur_ctxp;
9041 input_filename = ctxp->filename;
9042 lang_init_source (2); /* Error msgs have method prototypes */
9043 java_complete_expand_classes (); /* Complete and expand classes */
9044 java_parse_abort_on_error ();
9046 input_filename = main_input_filename;
9048 /* Find anonymous classes and expand their constructor. This extra pass is
9049 necessary because the constructor itself is only generated when the
9050 method in which it is defined is expanded. */
9051 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9053 tree current;
9054 ctxp = cur_ctxp;
9055 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9057 output_class = current_class = TREE_TYPE (current);
9058 if (ANONYMOUS_CLASS_P (current_class))
9060 tree d;
9061 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9063 if (DECL_CONSTRUCTOR_P (d))
9065 restore_line_number_status (1);
9066 java_complete_expand_method (d);
9067 restore_line_number_status (0);
9068 break; /* There is only one constructor. */
9075 /* Expanding the constructors of anonymous classes generates access
9076 methods. Scan all the methods looking for null DECL_RESULTs --
9077 this will be the case if a method hasn't been expanded. */
9078 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9080 tree current;
9081 ctxp = cur_ctxp;
9082 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9084 tree d;
9085 output_class = current_class = TREE_TYPE (current);
9086 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9088 if (DECL_RESULT (d) == NULL_TREE)
9090 restore_line_number_status (1);
9091 java_complete_expand_method (d);
9092 restore_line_number_status (0);
9098 /* ??? Instead of all this we could iterate around the list of
9099 classes until there were no more un-expanded methods. It would
9100 take a little longer -- one pass over the whole list of methods
9101 -- but it would be simpler. Like this: */
9102 #if 0
9104 int something_changed;
9108 something_changed = 0;
9109 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9111 tree current;
9112 ctxp = cur_ctxp;
9113 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9115 tree d;
9116 output_class = current_class = TREE_TYPE (current);
9117 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9119 if (DECL_RESULT (d) == NULL_TREE)
9121 something_changed = 1;
9122 restore_line_number_status (1);
9123 java_complete_expand_method (d);
9124 restore_line_number_status (0);
9130 while (something_changed);
9132 #endif
9134 /* If we've found error at that stage, don't try to generate
9135 anything, unless we're emitting xrefs or checking the syntax only
9136 (but not using -fsyntax-only for the purpose of generating
9137 bytecode. */
9138 if (java_error_count && !flag_emit_xref
9139 && (!flag_syntax_only && !flag_emit_class_files))
9140 return;
9142 /* Now things are stable, go for generation of the class data. */
9144 /* We pessimistically marked all methods and fields external until
9145 we knew what set of classes we were planning to compile. Now mark
9146 those that will be generated locally as not external. */
9147 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9149 tree current;
9150 ctxp = cur_ctxp;
9151 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9152 java_mark_class_local (TREE_TYPE (current));
9155 /* Compile the classes. */
9156 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9158 tree current;
9159 reversed_class_list = NULL;
9161 ctxp = cur_ctxp;
9163 /* We write out the classes in reverse order. This ensures that
9164 inner classes are written before their containing classes,
9165 which is important for parallel builds. Otherwise, the
9166 class file for the outer class may be found, but the class
9167 file for the inner class may not be present. In that
9168 situation, the compiler cannot fall back to the original
9169 source, having already read the outer class, so we must
9170 prevent that situation. */
9171 for (current = ctxp->class_list;
9172 current;
9173 current = TREE_CHAIN (current))
9174 reversed_class_list
9175 = tree_cons (NULL_TREE, current, reversed_class_list);
9177 for (current = reversed_class_list;
9178 current;
9179 current = TREE_CHAIN (current))
9181 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
9182 if (flag_emit_class_files)
9183 write_classfile (current_class);
9184 if (flag_emit_xref)
9185 expand_xref (current_class);
9186 else if (! flag_syntax_only)
9187 java_expand_method_bodies (current_class);
9192 void
9193 java_finish_classes (void)
9195 static struct parser_ctxt *cur_ctxp = NULL;
9196 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9198 tree current;
9199 ctxp = cur_ctxp;
9200 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9202 output_class = current_class = TREE_TYPE (current);
9203 finish_class ();
9208 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
9209 a tree list node containing RIGHT. Fore coming RIGHTs will be
9210 chained to this hook. LOCATION contains the location of the
9211 separating `.' operator. */
9213 static tree
9214 make_qualified_primary (tree primary, tree right, int location)
9216 tree wfl;
9218 if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
9219 wfl = build_wfl_wrap (primary, location);
9220 else
9222 wfl = primary;
9223 /* If wfl wasn't qualified, we build a first anchor */
9224 if (!EXPR_WFL_QUALIFICATION (wfl))
9225 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (wfl, NULL_TREE);
9228 /* And chain them */
9229 EXPR_WFL_LINECOL (right) = location;
9230 chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
9231 PRIMARY_P (wfl) = 1;
9232 return wfl;
9235 /* Simple merge of two name separated by a `.' */
9237 static tree
9238 merge_qualified_name (tree left, tree right)
9240 tree node;
9241 if (!left && !right)
9242 return NULL_TREE;
9244 if (!left)
9245 return right;
9247 if (!right)
9248 return left;
9250 obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
9251 IDENTIFIER_LENGTH (left));
9252 obstack_1grow (&temporary_obstack, '.');
9253 obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
9254 IDENTIFIER_LENGTH (right));
9255 node = get_identifier (obstack_base (&temporary_obstack));
9256 obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
9257 QUALIFIED_P (node) = 1;
9258 return node;
9261 /* Merge the two parts of a qualified name into LEFT. Set the
9262 location information of the resulting node to LOCATION, usually
9263 inherited from the location information of the `.' operator. */
9265 static tree
9266 make_qualified_name (tree left, tree right, int location)
9268 #ifdef USE_COMPONENT_REF
9269 tree node = build (COMPONENT_REF, NULL_TREE, left, right);
9270 EXPR_WFL_LINECOL (node) = location;
9271 return node;
9272 #else
9273 tree left_id = EXPR_WFL_NODE (left);
9274 tree right_id = EXPR_WFL_NODE (right);
9275 tree wfl, merge;
9277 merge = merge_qualified_name (left_id, right_id);
9279 /* Left wasn't qualified and is now qualified */
9280 if (!QUALIFIED_P (left_id))
9282 tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
9283 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
9284 EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
9287 wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
9288 EXPR_WFL_LINECOL (wfl) = location;
9289 chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
9291 EXPR_WFL_NODE (left) = merge;
9292 return left;
9293 #endif
9296 /* Extract the last identifier component of the qualified in WFL. The
9297 last identifier is removed from the linked list */
9299 static tree
9300 cut_identifier_in_qualified (tree wfl)
9302 tree q;
9303 tree previous = NULL_TREE;
9304 for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
9305 if (!TREE_CHAIN (q))
9307 if (!previous)
9308 /* Operating on a non qualified qualified WFL. */
9309 abort ();
9311 TREE_CHAIN (previous) = NULL_TREE;
9312 return TREE_PURPOSE (q);
9316 /* Resolve the expression name NAME. Return its decl. */
9318 static tree
9319 resolve_expression_name (tree id, tree *orig)
9321 tree name = EXPR_WFL_NODE (id);
9322 tree decl;
9324 /* 6.5.5.1: Simple expression names */
9325 if (!PRIMARY_P (id) && !QUALIFIED_P (name))
9327 /* 15.13.1: NAME can appear within the scope of a local variable
9328 declaration */
9329 if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
9330 return decl;
9332 /* 15.13.1: NAME can appear within a class declaration */
9333 else
9335 decl = lookup_field_wrapper (current_class, name);
9336 if (decl)
9338 tree access = NULL_TREE;
9339 int fs = FIELD_STATIC (decl);
9341 /* If we're accessing an outer scope local alias, make
9342 sure we change the name of the field we're going to
9343 build access to. */
9344 if (FIELD_LOCAL_ALIAS_USED (decl))
9345 name = DECL_NAME (decl);
9347 check_deprecation (id, decl);
9349 /* Instance variable (8.3.1.1) can't appear within
9350 static method, static initializer or initializer for
9351 a static variable. */
9352 if (!fs && METHOD_STATIC (current_function_decl))
9354 static_ref_err (id, name, current_class);
9355 return error_mark_node;
9357 /* Instance variables can't appear as an argument of
9358 an explicit constructor invocation */
9359 if (!fs && ctxp->explicit_constructor_p
9360 && !enclosing_context_p (DECL_CONTEXT (decl), current_class))
9362 parse_error_context
9363 (id, "Can't reference `%s' before the superclass constructor has been called", IDENTIFIER_POINTER (name));
9364 return error_mark_node;
9367 /* If we're processing an inner class and we're trying
9368 to access a field belonging to an outer class, build
9369 the access to the field */
9370 if (!fs && outer_field_access_p (current_class, decl))
9372 if (CLASS_STATIC (TYPE_NAME (current_class)))
9374 static_ref_err (id, DECL_NAME (decl), current_class);
9375 return error_mark_node;
9377 access = build_outer_field_access (id, decl);
9378 if (orig)
9379 *orig = access;
9380 return access;
9383 /* Otherwise build what it takes to access the field */
9384 access = build_field_ref ((fs ? NULL_TREE : current_this),
9385 DECL_CONTEXT (decl), name);
9386 if (fs)
9387 access = maybe_build_class_init_for_field (decl, access);
9388 /* We may be asked to save the real field access node */
9389 if (orig)
9390 *orig = access;
9391 /* Last check: can we access the field? */
9392 if (not_accessible_p (current_class, decl, NULL_TREE, 0))
9394 not_accessible_field_error (id, decl);
9395 return error_mark_node;
9397 /* And we return what we got */
9398 return access;
9400 /* Fall down to error report on undefined variable */
9403 /* 6.5.5.2 Qualified Expression Names */
9404 else
9406 if (orig)
9407 *orig = NULL_TREE;
9408 qualify_ambiguous_name (id);
9409 /* 15.10.1 Field Access Using a Primary and/or Expression Name */
9410 /* 15.10.2: Accessing Superclass Members using super */
9411 return resolve_field_access (id, orig, NULL);
9414 /* We've got an error here */
9415 if (INNER_CLASS_TYPE_P (current_class))
9416 parse_error_context (id,
9417 "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final",
9418 IDENTIFIER_POINTER (name),
9419 IDENTIFIER_POINTER (DECL_NAME
9420 (TYPE_NAME (current_class))));
9421 else
9422 parse_error_context (id, "Undefined variable `%s'",
9423 IDENTIFIER_POINTER (name));
9425 return error_mark_node;
9428 static void
9429 static_ref_err (tree wfl, tree field_id, tree class_type)
9431 parse_error_context
9432 (wfl,
9433 "Can't make a static reference to nonstatic variable `%s' in class `%s'",
9434 IDENTIFIER_POINTER (field_id),
9435 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
9438 /* 15.10.1 Field Access Using a Primary and/or Expression Name.
9439 We return something suitable to generate the field access. We also
9440 return the field decl in FIELD_DECL and its type in FIELD_TYPE. If
9441 recipient's address can be null. */
9443 static tree
9444 resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
9446 int is_static = 0;
9447 tree field_ref;
9448 tree decl, where_found, type_found;
9450 if (resolve_qualified_expression_name (qual_wfl, &decl,
9451 &where_found, &type_found))
9452 return error_mark_node;
9454 /* Resolve the LENGTH field of an array here */
9455 if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node
9456 && type_found && TYPE_ARRAY_P (type_found)
9457 && ! flag_emit_class_files && ! flag_emit_xref)
9459 tree length = build_java_array_length_access (where_found);
9460 field_ref = length;
9462 /* In case we're dealing with a static array, we need to
9463 initialize its class before the array length can be fetched.
9464 It's also a good time to create a DECL_RTL for the field if
9465 none already exists, otherwise if the field was declared in a
9466 class found in an external file and hasn't been (and won't
9467 be) accessed for its value, none will be created. */
9468 if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
9470 build_static_field_ref (where_found);
9471 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9474 /* We might have been trying to resolve field.method(). In which
9475 case, the resolution is over and decl is the answer */
9476 else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
9477 field_ref = decl;
9478 else if (JDECL_P (decl))
9480 if (!type_found)
9481 type_found = DECL_CONTEXT (decl);
9482 is_static = FIELD_STATIC (decl);
9483 field_ref = build_field_ref ((is_static && !flag_emit_xref?
9484 NULL_TREE : where_found),
9485 type_found, DECL_NAME (decl));
9486 if (field_ref == error_mark_node)
9487 return error_mark_node;
9488 if (is_static)
9489 field_ref = maybe_build_class_init_for_field (decl, field_ref);
9491 /* If we're looking at a static field, we may need to generate a
9492 class initialization for it. This can happen when the access
9493 looks like `field.ref', where `field' is a static field in an
9494 interface we implement. */
9495 if (!flag_emit_class_files
9496 && !flag_emit_xref
9497 && TREE_CODE (where_found) == VAR_DECL
9498 && FIELD_STATIC (where_found))
9500 build_static_field_ref (where_found);
9501 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9504 else
9505 field_ref = decl;
9507 if (field_decl)
9508 *field_decl = decl;
9509 if (field_type)
9510 *field_type = (QUAL_DECL_TYPE (decl) ?
9511 QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
9512 return field_ref;
9515 /* If NODE is an access to f static field, strip out the class
9516 initialization part and return the field decl, otherwise, return
9517 NODE. */
9519 static tree
9520 strip_out_static_field_access_decl (tree node)
9522 if (TREE_CODE (node) == COMPOUND_EXPR)
9524 tree op1 = TREE_OPERAND (node, 1);
9525 if (TREE_CODE (op1) == COMPOUND_EXPR)
9527 tree call = TREE_OPERAND (op1, 0);
9528 if (TREE_CODE (call) == CALL_EXPR
9529 && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
9530 && TREE_OPERAND (TREE_OPERAND (call, 0), 0)
9531 == soft_initclass_node)
9532 return TREE_OPERAND (op1, 1);
9534 else if (JDECL_P (op1))
9535 return op1;
9537 return node;
9540 /* 6.5.5.2: Qualified Expression Names */
9542 static int
9543 resolve_qualified_expression_name (tree wfl, tree *found_decl,
9544 tree *where_found, tree *type_found)
9546 int from_type = 0; /* Field search initiated from a type */
9547 int from_super = 0, from_cast = 0, from_qualified_this = 0;
9548 int previous_call_static = 0;
9549 int is_static;
9550 tree decl = NULL_TREE, type = NULL_TREE, q;
9551 /* For certain for of inner class instantiation */
9552 tree saved_current, saved_this;
9553 #define RESTORE_THIS_AND_CURRENT_CLASS \
9554 { current_class = saved_current; current_this = saved_this;}
9556 *type_found = *where_found = NULL_TREE;
9558 for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
9560 tree qual_wfl = QUAL_WFL (q);
9561 tree ret_decl; /* for EH checking */
9562 int location; /* for EH checking */
9564 /* 15.10.1 Field Access Using a Primary */
9565 switch (TREE_CODE (qual_wfl))
9567 case CALL_EXPR:
9568 case NEW_CLASS_EXPR:
9569 /* If the access to the function call is a non static field,
9570 build the code to access it. */
9571 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9573 decl = maybe_access_field (decl, *where_found,
9574 DECL_CONTEXT (decl));
9575 if (decl == error_mark_node)
9576 return 1;
9579 /* And code for the function call */
9580 if (complete_function_arguments (qual_wfl))
9581 return 1;
9583 /* We might have to setup a new current class and a new this
9584 for the search of an inner class, relative to the type of
9585 a expression resolved as `decl'. The current values are
9586 saved and restored shortly after */
9587 saved_current = current_class;
9588 saved_this = current_this;
9589 if (decl
9590 && (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9591 || from_qualified_this))
9593 /* If we still have `from_qualified_this', we have the form
9594 <T>.this.f() and we need to build <T>.this */
9595 if (from_qualified_this)
9597 decl = build_access_to_thisn (current_class, type, 0);
9598 decl = java_complete_tree (decl);
9599 type = TREE_TYPE (TREE_TYPE (decl));
9601 current_class = type;
9602 current_this = decl;
9603 from_qualified_this = 0;
9606 if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
9607 CALL_USING_SUPER (qual_wfl) = 1;
9608 location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
9609 EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
9610 *where_found = patch_method_invocation (qual_wfl, decl, type,
9611 from_super,
9612 &is_static, &ret_decl);
9613 from_super = 0;
9614 if (*where_found == error_mark_node)
9616 RESTORE_THIS_AND_CURRENT_CLASS;
9617 return 1;
9619 *type_found = type = QUAL_DECL_TYPE (*where_found);
9621 *where_found = force_evaluation_order (*where_found);
9623 /* If we're creating an inner class instance, check for that
9624 an enclosing instance is in scope */
9625 if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9626 && INNER_ENCLOSING_SCOPE_CHECK (type))
9628 parse_error_context
9629 (qual_wfl, "No enclosing instance for inner class `%s' is in scope%s",
9630 lang_printable_name (type, 0),
9631 (!current_this ? "" :
9632 "; an explicit one must be provided when creating this inner class"));
9633 RESTORE_THIS_AND_CURRENT_CLASS;
9634 return 1;
9637 /* In case we had to change then to resolve a inner class
9638 instantiation using a primary qualified by a `new' */
9639 RESTORE_THIS_AND_CURRENT_CLASS;
9641 if (location)
9643 tree arguments = NULL_TREE;
9644 if (TREE_CODE (qual_wfl) == CALL_EXPR
9645 && TREE_OPERAND (qual_wfl, 1) != NULL_TREE)
9646 arguments = TREE_VALUE (TREE_OPERAND (qual_wfl, 1));
9647 check_thrown_exceptions (location, ret_decl, arguments);
9650 /* If the previous call was static and this one is too,
9651 build a compound expression to hold the two (because in
9652 that case, previous function calls aren't transported as
9653 forcoming function's argument. */
9654 if (previous_call_static && is_static)
9656 decl = build (COMPOUND_EXPR, TREE_TYPE (*where_found),
9657 decl, *where_found);
9658 TREE_SIDE_EFFECTS (decl) = 1;
9660 else
9662 previous_call_static = is_static;
9663 decl = *where_found;
9665 from_type = 0;
9666 continue;
9668 case NEW_ARRAY_EXPR:
9669 case NEW_ANONYMOUS_ARRAY_EXPR:
9670 *where_found = decl = java_complete_tree (qual_wfl);
9671 if (decl == error_mark_node)
9672 return 1;
9673 *type_found = type = QUAL_DECL_TYPE (decl);
9674 continue;
9676 case CONVERT_EXPR:
9677 *where_found = decl = java_complete_tree (qual_wfl);
9678 if (decl == error_mark_node)
9679 return 1;
9680 *type_found = type = QUAL_DECL_TYPE (decl);
9681 from_cast = 1;
9682 continue;
9684 case CONDITIONAL_EXPR:
9685 case STRING_CST:
9686 case MODIFY_EXPR:
9687 *where_found = decl = java_complete_tree (qual_wfl);
9688 if (decl == error_mark_node)
9689 return 1;
9690 *type_found = type = QUAL_DECL_TYPE (decl);
9691 continue;
9693 case ARRAY_REF:
9694 /* If the access to the function call is a non static field,
9695 build the code to access it. */
9696 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9698 decl = maybe_access_field (decl, *where_found, type);
9699 if (decl == error_mark_node)
9700 return 1;
9702 /* And code for the array reference expression */
9703 decl = java_complete_tree (qual_wfl);
9704 if (decl == error_mark_node)
9705 return 1;
9706 type = QUAL_DECL_TYPE (decl);
9707 continue;
9709 case PLUS_EXPR:
9710 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9711 return 1;
9712 if ((type = patch_string (decl)))
9713 decl = type;
9714 *where_found = QUAL_RESOLUTION (q) = decl;
9715 *type_found = type = TREE_TYPE (decl);
9716 break;
9718 case CLASS_LITERAL:
9719 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9720 return 1;
9721 *where_found = QUAL_RESOLUTION (q) = decl;
9722 *type_found = type = TREE_TYPE (decl);
9723 break;
9725 default:
9726 /* Fix for -Wall Just go to the next statement. Don't
9727 continue */
9728 break;
9731 /* If we fall here, we weren't processing a (static) function call. */
9732 previous_call_static = 0;
9734 /* It can be the keyword THIS */
9735 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9736 && EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
9738 if (!current_this)
9740 parse_error_context
9741 (wfl, "Keyword `this' used outside allowed context");
9742 return 1;
9744 if (ctxp->explicit_constructor_p
9745 && type == current_class)
9747 parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
9748 return 1;
9750 /* We have to generate code for intermediate access */
9751 if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type)
9753 *where_found = decl = current_this;
9754 *type_found = type = QUAL_DECL_TYPE (decl);
9756 /* We're trying to access the this from somewhere else. Make sure
9757 it's allowed before doing so. */
9758 else
9760 if (!enclosing_context_p (type, current_class))
9762 char *p = xstrdup (lang_printable_name (type, 0));
9763 parse_error_context (qual_wfl, "Can't use variable `%s.this': type `%s' isn't an outer type of type `%s'",
9764 p, p,
9765 lang_printable_name (current_class, 0));
9766 free (p);
9767 return 1;
9769 from_qualified_this = 1;
9770 /* If there's nothing else after that, we need to
9771 produce something now, otherwise, the section of the
9772 code that needs to produce <T>.this will generate
9773 what is necessary. */
9774 if (!TREE_CHAIN (q))
9776 decl = build_access_to_thisn (current_class, type, 0);
9777 *where_found = decl = java_complete_tree (decl);
9778 *type_found = type = TREE_TYPE (decl);
9782 from_type = 0;
9783 continue;
9786 /* 15.10.2 Accessing Superclass Members using SUPER */
9787 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9788 && EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
9790 tree node;
9791 /* Check on the restricted use of SUPER */
9792 if (METHOD_STATIC (current_function_decl)
9793 || current_class == object_type_node)
9795 parse_error_context
9796 (wfl, "Keyword `super' used outside allowed context");
9797 return 1;
9799 /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
9800 node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
9801 CLASSTYPE_SUPER (current_class),
9802 build_this (EXPR_WFL_LINECOL (qual_wfl)));
9803 *where_found = decl = java_complete_tree (node);
9804 if (decl == error_mark_node)
9805 return 1;
9806 *type_found = type = QUAL_DECL_TYPE (decl);
9807 from_super = from_type = 1;
9808 continue;
9811 /* 15.13.1: Can't search for field name in packages, so we
9812 assume a variable/class name was meant. */
9813 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
9815 tree name;
9816 if ((decl = resolve_package (wfl, &q, &name)))
9818 tree list;
9819 *where_found = decl;
9821 /* We want to be absolutely sure that the class is laid
9822 out. We're going to search something inside it. */
9823 *type_found = type = TREE_TYPE (decl);
9824 layout_class (type);
9825 from_type = 1;
9827 /* Fix them all the way down, if any are left. */
9828 if (q)
9830 list = TREE_CHAIN (q);
9831 while (list)
9833 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (list)) = 0;
9834 list = TREE_CHAIN (list);
9838 else
9840 if (from_super || from_cast)
9841 parse_error_context
9842 ((from_cast ? qual_wfl : wfl),
9843 "No variable `%s' defined in class `%s'",
9844 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9845 lang_printable_name (type, 0));
9846 else
9847 parse_error_context
9848 (qual_wfl, "Undefined variable or class name: `%s'",
9849 IDENTIFIER_POINTER (name));
9850 return 1;
9854 /* We have a type name. It's been already resolved when the
9855 expression was qualified. */
9856 else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q))
9858 decl = QUAL_RESOLUTION (q);
9860 /* Sneak preview. If next we see a `new', we're facing a
9861 qualification with resulted in a type being selected
9862 instead of a field. Report the error */
9863 if(TREE_CHAIN (q)
9864 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR)
9866 parse_error_context (qual_wfl, "Undefined variable `%s'",
9867 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
9868 return 1;
9871 if (not_accessible_p (TREE_TYPE (decl), decl, type, 0))
9873 parse_error_context
9874 (qual_wfl, "Can't access %s class '%s' from '%s'",
9875 java_accstring_lookup (get_access_flags_from_decl (decl)),
9876 IDENTIFIER_POINTER (DECL_NAME (decl)),
9877 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
9878 return 1;
9880 check_deprecation (qual_wfl, decl);
9882 type = TREE_TYPE (decl);
9883 from_type = 1;
9885 /* We resolve an expression name */
9886 else
9888 tree field_decl = NULL_TREE;
9890 /* If there exists an early resolution, use it. That occurs
9891 only once and we know that there are more things to
9892 come. Don't do that when processing something after SUPER
9893 (we need more thing to be put in place below */
9894 if (!from_super && QUAL_RESOLUTION (q))
9896 decl = QUAL_RESOLUTION (q);
9897 if (!type)
9899 if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
9901 if (current_this)
9902 *where_found = current_this;
9903 else
9905 static_ref_err (qual_wfl, DECL_NAME (decl),
9906 current_class);
9907 return 1;
9909 if (outer_field_access_p (current_class, decl))
9910 decl = build_outer_field_access (qual_wfl, decl);
9912 else
9914 *where_found = TREE_TYPE (decl);
9915 if (TREE_CODE (*where_found) == POINTER_TYPE)
9916 *where_found = TREE_TYPE (*where_found);
9921 /* Report and error if we're using a numerical literal as a
9922 qualifier. It can only be an INTEGER_CST. */
9923 else if (TREE_CODE (qual_wfl) == INTEGER_CST)
9925 parse_error_context
9926 (wfl, "Can't use type `%s' as a qualifier",
9927 lang_printable_name (TREE_TYPE (qual_wfl), 0));
9928 return 1;
9931 /* We have to search for a field, knowing the type of its
9932 container. The flag FROM_TYPE indicates that we resolved
9933 the last member of the expression as a type name, which
9934 means that for the resolution of this field, we'll look
9935 for other errors than if it was resolved as a member of
9936 an other field. */
9937 else
9939 int is_static;
9940 tree field_decl_type; /* For layout */
9942 if (!from_type && !JREFERENCE_TYPE_P (type))
9944 parse_error_context
9945 (qual_wfl, "Attempt to reference field `%s' in `%s %s'",
9946 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9947 lang_printable_name (type, 0),
9948 IDENTIFIER_POINTER (DECL_NAME (decl)));
9949 return 1;
9952 field_decl = lookup_field_wrapper (type,
9953 EXPR_WFL_NODE (qual_wfl));
9955 /* Maybe what we're trying to access to is an inner
9956 class, only if decl is a TYPE_DECL. */
9957 if (!field_decl && TREE_CODE (decl) == TYPE_DECL)
9959 tree ptr, inner_decl;
9961 BUILD_PTR_FROM_NAME (ptr, EXPR_WFL_NODE (qual_wfl));
9962 inner_decl = resolve_class (decl, ptr, NULL_TREE, qual_wfl);
9963 if (inner_decl)
9965 check_inner_class_access (inner_decl, decl, qual_wfl);
9966 type = TREE_TYPE (inner_decl);
9967 decl = inner_decl;
9968 from_type = 1;
9969 continue;
9973 if (field_decl == NULL_TREE)
9975 parse_error_context
9976 (qual_wfl, "No variable `%s' defined in type `%s'",
9977 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9978 GET_TYPE_NAME (type));
9979 return 1;
9981 if (field_decl == error_mark_node)
9982 return 1;
9984 /* Layout the type of field_decl, since we may need
9985 it. Don't do primitive types or loaded classes. The
9986 situation of non primitive arrays may not handled
9987 properly here. FIXME */
9988 if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
9989 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
9990 else
9991 field_decl_type = TREE_TYPE (field_decl);
9992 if (!JPRIMITIVE_TYPE_P (field_decl_type)
9993 && !CLASS_LOADED_P (field_decl_type)
9994 && !TYPE_ARRAY_P (field_decl_type))
9995 resolve_and_layout (field_decl_type, NULL_TREE);
9997 /* Check on accessibility here */
9998 if (not_accessible_p (current_class, field_decl,
9999 DECL_CONTEXT (field_decl), from_super))
10000 return not_accessible_field_error (qual_wfl,field_decl);
10001 check_deprecation (qual_wfl, field_decl);
10003 /* There are things to check when fields are accessed
10004 from type. There are no restrictions on a static
10005 declaration of the field when it is accessed from an
10006 interface */
10007 is_static = FIELD_STATIC (field_decl);
10008 if (!from_super && from_type
10009 && !TYPE_INTERFACE_P (type)
10010 && !is_static
10011 && (current_function_decl
10012 && METHOD_STATIC (current_function_decl)))
10014 static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
10015 return 1;
10017 from_cast = from_super = 0;
10019 /* It's an access from a type but it isn't static, we
10020 make it relative to `this'. */
10021 if (!is_static && from_type)
10022 decl = current_this;
10024 /* If we need to generate something to get a proper
10025 handle on what this field is accessed from, do it
10026 now. */
10027 if (!is_static)
10029 decl = maybe_access_field (decl, *where_found, *type_found);
10030 if (decl == error_mark_node)
10031 return 1;
10034 /* We want to keep the location were found it, and the type
10035 we found. */
10036 *where_found = decl;
10037 *type_found = type;
10039 /* Generate the correct expression for field access from
10040 qualified this */
10041 if (from_qualified_this)
10043 field_decl = build_outer_field_access (qual_wfl, field_decl);
10044 from_qualified_this = 0;
10047 /* This is the decl found and eventually the next one to
10048 search from */
10049 decl = field_decl;
10051 from_type = 0;
10052 type = QUAL_DECL_TYPE (decl);
10054 /* Sneak preview. If decl is qualified by a `new', report
10055 the error here to be accurate on the peculiar construct */
10056 if (TREE_CHAIN (q)
10057 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR
10058 && !JREFERENCE_TYPE_P (type))
10060 parse_error_context (qual_wfl, "Attempt to reference field `new' in a `%s'",
10061 lang_printable_name (type, 0));
10062 return 1;
10065 /* `q' might have changed due to a after package resolution
10066 re-qualification */
10067 if (!q)
10068 break;
10070 *found_decl = decl;
10071 return 0;
10074 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
10075 can't be accessed from REFERENCE (a record type). If MEMBER
10076 features a protected access, we then use WHERE which, if non null,
10077 holds the type of MEMBER's access that is checked against
10078 6.6.2.1. This function should be used when decl is a field or a
10079 method. */
10081 static int
10082 not_accessible_p (tree reference, tree member, tree where, int from_super)
10084 int access_flag = get_access_flags_from_decl (member);
10086 /* Inner classes are processed by check_inner_class_access */
10087 if (INNER_CLASS_TYPE_P (reference))
10088 return 0;
10090 /* Access always granted for members declared public */
10091 if (access_flag & ACC_PUBLIC)
10092 return 0;
10094 /* Check access on protected members */
10095 if (access_flag & ACC_PROTECTED)
10097 /* Access granted if it occurs from within the package
10098 containing the class in which the protected member is
10099 declared */
10100 if (class_in_current_package (DECL_CONTEXT (member)))
10101 return 0;
10103 /* If accessed with the form `super.member', then access is granted */
10104 if (from_super)
10105 return 0;
10107 /* If where is active, access was made through a
10108 qualifier. Access is granted if the type of the qualifier is
10109 or is a sublass of the type the access made from (6.6.2.1.) */
10110 if (where && !inherits_from_p (reference, where))
10111 return 1;
10113 /* Otherwise, access is granted if occurring from the class where
10114 member is declared or a subclass of it. Find the right
10115 context to perform the check */
10116 if (PURE_INNER_CLASS_TYPE_P (reference))
10118 while (INNER_CLASS_TYPE_P (reference))
10120 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10121 return 0;
10122 reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10125 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10126 return 0;
10127 return 1;
10130 /* Check access on private members. Access is granted only if it
10131 occurs from within the class in which it is declared -- that does
10132 it for innerclasses too. */
10133 if (access_flag & ACC_PRIVATE)
10135 if (reference == DECL_CONTEXT (member))
10136 return 0;
10137 if (enclosing_context_p (reference, DECL_CONTEXT (member)))
10138 return 0;
10139 return 1;
10142 /* Default access are permitted only when occurring within the
10143 package in which the type (REFERENCE) is declared. In other words,
10144 REFERENCE is defined in the current package */
10145 if (ctxp->package)
10146 return !class_in_current_package (reference);
10148 /* Otherwise, access is granted */
10149 return 0;
10152 /* Test deprecated decl access. */
10153 static void
10154 check_deprecation (tree wfl, tree decl)
10156 const char *file;
10157 tree elt;
10159 if (! flag_deprecated)
10160 return;
10162 /* We want to look at the element type of arrays here, so we strip
10163 all surrounding array types. */
10164 if (TYPE_ARRAY_P (TREE_TYPE (decl)))
10166 elt = TREE_TYPE (decl);
10167 while (TYPE_ARRAY_P (elt))
10168 elt = TYPE_ARRAY_ELEMENT (elt);
10169 /* We'll end up with a pointer type, so we use TREE_TYPE to go
10170 to the record. */
10171 decl = TYPE_NAME (TREE_TYPE (elt));
10173 file = DECL_SOURCE_FILE (decl);
10175 /* Complain if the field is deprecated and the file it was defined
10176 in isn't compiled at the same time the file which contains its
10177 use is */
10178 if (DECL_DEPRECATED (decl)
10179 && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
10181 const char *the;
10182 switch (TREE_CODE (decl))
10184 case FUNCTION_DECL:
10185 the = "method";
10186 break;
10187 case FIELD_DECL:
10188 case VAR_DECL:
10189 the = "field";
10190 break;
10191 case TYPE_DECL:
10192 parse_warning_context (wfl, "The class `%s' has been deprecated",
10193 IDENTIFIER_POINTER (DECL_NAME (decl)));
10194 return;
10195 default:
10196 abort ();
10198 /* Don't issue a message if the context as been deprecated as a
10199 whole. */
10200 if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl))))
10201 parse_warning_context
10202 (wfl, "The %s `%s' in class `%s' has been deprecated",
10203 the, lang_printable_name (decl, 0),
10204 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
10208 /* Returns 1 if class was declared in the current package, 0 otherwise */
10210 static GTY(()) tree cicp_cache;
10211 static int
10212 class_in_current_package (tree class)
10214 int qualified_flag;
10215 tree left;
10217 if (cicp_cache == class)
10218 return 1;
10220 qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
10222 /* If the current package is empty and the name of CLASS is
10223 qualified, class isn't in the current package. If there is a
10224 current package and the name of the CLASS is not qualified, class
10225 isn't in the current package */
10226 if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
10227 return 0;
10229 /* If there is not package and the name of CLASS isn't qualified,
10230 they belong to the same unnamed package */
10231 if (!ctxp->package && !qualified_flag)
10232 return 1;
10234 /* Compare the left part of the name of CLASS with the package name */
10235 breakdown_qualified (&left, NULL, DECL_NAME (TYPE_NAME (class)));
10236 if (ctxp->package == left)
10238 cicp_cache = class;
10239 return 1;
10241 return 0;
10244 /* This function may generate code to access DECL from WHERE. This is
10245 done only if certain conditions meet. */
10247 static tree
10248 maybe_access_field (tree decl, tree where, tree type)
10250 if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
10251 && !FIELD_STATIC (decl))
10252 decl = build_field_ref (where ? where : current_this,
10253 (type ? type : DECL_CONTEXT (decl)),
10254 DECL_NAME (decl));
10255 return decl;
10258 /* Build a method invocation, by patching PATCH. If non NULL
10259 and according to the situation, PRIMARY and WHERE may be
10260 used. IS_STATIC is set to 1 if the invoked function is static. */
10262 static tree
10263 patch_method_invocation (tree patch, tree primary, tree where, int from_super,
10264 int *is_static, tree *ret_decl)
10266 tree wfl = TREE_OPERAND (patch, 0);
10267 tree args = TREE_OPERAND (patch, 1);
10268 tree name = EXPR_WFL_NODE (wfl);
10269 tree list;
10270 int is_static_flag = 0;
10271 int is_super_init = 0;
10272 tree this_arg = NULL_TREE;
10273 int is_array_clone_call = 0;
10275 /* Should be overridden if everything goes well. Otherwise, if
10276 something fails, it should keep this value. It stop the
10277 evaluation of a bogus assignment. See java_complete_tree,
10278 MODIFY_EXPR: for the reasons why we sometimes want to keep on
10279 evaluating an assignment */
10280 TREE_TYPE (patch) = error_mark_node;
10282 /* Since lookup functions are messing with line numbers, save the
10283 context now. */
10284 java_parser_context_save_global ();
10286 /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
10288 /* Resolution of qualified name, excluding constructors */
10289 if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
10291 tree identifier, identifier_wfl, type, resolved;
10292 /* Extract the last IDENTIFIER of the qualified
10293 expression. This is a wfl and we will use it's location
10294 data during error report. */
10295 identifier_wfl = cut_identifier_in_qualified (wfl);
10296 identifier = EXPR_WFL_NODE (identifier_wfl);
10298 /* Given the context, IDENTIFIER is syntactically qualified
10299 as a MethodName. We need to qualify what's before */
10300 qualify_ambiguous_name (wfl);
10301 resolved = resolve_field_access (wfl, NULL, NULL);
10303 if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved)
10304 && FIELD_FINAL (resolved)
10305 && !inherits_from_p (DECL_CONTEXT (resolved), current_class)
10306 && !flag_emit_class_files && !flag_emit_xref)
10307 resolved = build_class_init (DECL_CONTEXT (resolved), resolved);
10309 if (resolved == error_mark_node)
10310 PATCH_METHOD_RETURN_ERROR ();
10312 type = GET_SKIP_TYPE (resolved);
10313 resolve_and_layout (type, NULL_TREE);
10315 if (JPRIMITIVE_TYPE_P (type))
10317 parse_error_context
10318 (identifier_wfl,
10319 "Can't invoke a method on primitive type `%s'",
10320 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10321 PATCH_METHOD_RETURN_ERROR ();
10324 list = lookup_method_invoke (0, identifier_wfl, type, identifier, args);
10325 args = nreverse (args);
10327 /* We're resolving a call from a type */
10328 if (TREE_CODE (resolved) == TYPE_DECL)
10330 if (CLASS_INTERFACE (resolved))
10332 parse_error_context
10333 (identifier_wfl,
10334 "Can't make static reference to method `%s' in interface `%s'",
10335 IDENTIFIER_POINTER (identifier),
10336 IDENTIFIER_POINTER (name));
10337 PATCH_METHOD_RETURN_ERROR ();
10339 if (list && !METHOD_STATIC (list))
10341 char *fct_name = xstrdup (lang_printable_name (list, 0));
10342 parse_error_context
10343 (identifier_wfl,
10344 "Can't make static reference to method `%s %s' in class `%s'",
10345 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
10346 fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10347 free (fct_name);
10348 PATCH_METHOD_RETURN_ERROR ();
10351 else
10352 this_arg = primary = resolved;
10354 if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
10355 is_array_clone_call = 1;
10357 /* IDENTIFIER_WFL will be used to report any problem further */
10358 wfl = identifier_wfl;
10360 /* Resolution of simple names, names generated after a primary: or
10361 constructors */
10362 else
10364 tree class_to_search = NULL_TREE;
10365 int lc; /* Looking for Constructor */
10367 /* We search constructor in their target class */
10368 if (CALL_CONSTRUCTOR_P (patch))
10370 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10371 class_to_search = EXPR_WFL_NODE (wfl);
10372 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10373 this_identifier_node)
10374 class_to_search = NULL_TREE;
10375 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10376 super_identifier_node)
10378 is_super_init = 1;
10379 if (CLASSTYPE_SUPER (current_class))
10380 class_to_search =
10381 DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
10382 else
10384 parse_error_context (wfl, "Can't invoke super constructor on java.lang.Object");
10385 PATCH_METHOD_RETURN_ERROR ();
10389 /* Class to search is NULL if we're searching the current one */
10390 if (class_to_search)
10392 class_to_search = resolve_and_layout (class_to_search, wfl);
10394 if (!class_to_search)
10396 parse_error_context
10397 (wfl, "Class `%s' not found in type declaration",
10398 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10399 PATCH_METHOD_RETURN_ERROR ();
10402 /* Can't instantiate an abstract class, but we can
10403 invoke it's constructor. It's use within the `new'
10404 context is denied here. */
10405 if (CLASS_ABSTRACT (class_to_search)
10406 && TREE_CODE (patch) == NEW_CLASS_EXPR)
10408 parse_error_context
10409 (wfl, "Class `%s' is an abstract class. It can't be instantiated",
10410 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10411 PATCH_METHOD_RETURN_ERROR ();
10414 class_to_search = TREE_TYPE (class_to_search);
10416 else
10417 class_to_search = current_class;
10418 lc = 1;
10420 /* This is a regular search in the local class, unless an
10421 alternate class is specified. */
10422 else
10424 if (where != NULL_TREE)
10425 class_to_search = where;
10426 else if (QUALIFIED_P (name))
10427 class_to_search = current_class;
10428 else
10430 class_to_search = current_class;
10432 for (;;)
10434 if (has_method (class_to_search, name))
10435 break;
10436 if (! INNER_CLASS_TYPE_P (class_to_search))
10438 parse_error_context (wfl,
10439 "No method named `%s' in scope",
10440 IDENTIFIER_POINTER (name));
10441 PATCH_METHOD_RETURN_ERROR ();
10443 class_to_search
10444 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
10447 lc = 0;
10450 /* NAME is a simple identifier or comes from a primary. Search
10451 in the class whose declaration contain the method being
10452 invoked. */
10453 resolve_and_layout (class_to_search, NULL_TREE);
10455 list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
10456 /* Don't continue if no method were found, as the next statement
10457 can't be executed then. */
10458 if (!list)
10459 PATCH_METHOD_RETURN_ERROR ();
10461 if (TYPE_ARRAY_P (class_to_search)
10462 && DECL_NAME (list) == get_identifier ("clone"))
10463 is_array_clone_call = 1;
10465 /* Check for static reference if non static methods */
10466 if (check_for_static_method_reference (wfl, patch, list,
10467 class_to_search, primary))
10468 PATCH_METHOD_RETURN_ERROR ();
10470 /* Check for inner classes creation from illegal contexts */
10471 if (lc && (INNER_CLASS_TYPE_P (class_to_search)
10472 && !CLASS_STATIC (TYPE_NAME (class_to_search)))
10473 && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)
10474 && !DECL_INIT_P (current_function_decl))
10476 parse_error_context
10477 (wfl, "No enclosing instance for inner class `%s' is in scope%s",
10478 lang_printable_name (class_to_search, 0),
10479 (!current_this ? "" :
10480 "; an explicit one must be provided when creating this inner class"));
10481 PATCH_METHOD_RETURN_ERROR ();
10484 /* Non static methods are called with the current object extra
10485 argument. If patch a `new TYPE()', the argument is the value
10486 returned by the object allocator. If method is resolved as a
10487 primary, use the primary otherwise use the current THIS. */
10488 args = nreverse (args);
10489 if (TREE_CODE (patch) != NEW_CLASS_EXPR)
10491 this_arg = primary ? primary : current_this;
10493 /* If we're using an access method, things are different.
10494 There are two family of cases:
10496 1) We're not generating bytecodes:
10498 - LIST is non static. It's invocation is transformed from
10499 x(a1,...,an) into this$<n>.x(a1,....an).
10500 - LIST is static. It's invocation is transformed from
10501 x(a1,...,an) into TYPE_OF(this$<n>).x(a1,....an)
10503 2) We're generating bytecodes:
10505 - LIST is non static. It's invocation is transformed from
10506 x(a1,....,an) into access$<n>(this$<n>,a1,...,an).
10507 - LIST is static. It's invocation is transformed from
10508 x(a1,....,an) into TYPE_OF(this$<n>).x(a1,....an).
10510 Of course, this$<n> can be arbitrarily complex, ranging from
10511 this$0 (the immediate outer context) to
10512 access$0(access$0(...(this$0))).
10514 maybe_use_access_method returns a nonzero value if the
10515 this_arg has to be moved into the (then generated) stub
10516 argument list. In the meantime, the selected function
10517 might have be replaced by a generated stub. */
10518 if (!primary &&
10519 maybe_use_access_method (is_super_init, &list, &this_arg))
10521 args = tree_cons (NULL_TREE, this_arg, args);
10522 this_arg = NULL_TREE; /* So it doesn't get chained twice */
10527 /* Merge point of all resolution schemes. If we have nothing, this
10528 is an error, already signaled */
10529 if (!list)
10530 PATCH_METHOD_RETURN_ERROR ();
10532 /* Check accessibility, position the is_static flag, build and
10533 return the call */
10534 if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
10535 (primary ? TREE_TYPE (TREE_TYPE (primary)) :
10536 NULL_TREE), from_super)
10537 /* Calls to clone() on array types are permitted as a special-case. */
10538 && !is_array_clone_call)
10540 const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list));
10541 const char *const access =
10542 java_accstring_lookup (get_access_flags_from_decl (list));
10543 const char *const klass =
10544 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list))));
10545 const char *const refklass =
10546 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
10547 const char *const what = (DECL_CONSTRUCTOR_P (list)
10548 ? "constructor" : "method");
10549 /* FIXME: WFL yields the wrong message here but I don't know
10550 what else to use. */
10551 parse_error_context (wfl,
10552 "Can't access %s %s `%s.%s' from `%s'",
10553 access, what, klass, fct_name, refklass);
10554 PATCH_METHOD_RETURN_ERROR ();
10557 /* Deprecation check: check whether the method being invoked or the
10558 instance-being-created's type are deprecated. */
10559 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10560 check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list)));
10561 check_deprecation (wfl, list);
10563 /* If invoking a innerclass constructor, there are hidden parameters
10564 to pass */
10565 if (TREE_CODE (patch) == NEW_CLASS_EXPR
10566 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10568 /* And make sure we add the accessed local variables to be saved
10569 in field aliases. */
10570 args = build_alias_initializer_parameter_list
10571 (AIPL_FUNCTION_CTOR_INVOCATION, DECL_CONTEXT (list), args, NULL);
10573 /* Secretly pass the current_this/primary as a second argument */
10574 if (primary || current_this)
10576 tree extra_arg;
10577 tree this_type = (current_this ?
10578 TREE_TYPE (TREE_TYPE (current_this)) : NULL_TREE);
10579 /* Method's (list) enclosing context */
10580 tree mec = DECL_CONTEXT (TYPE_NAME (DECL_CONTEXT (list)));
10581 /* If we have a primary, use it. */
10582 if (primary)
10583 extra_arg = primary;
10584 /* The current `this' is an inner class but isn't a direct
10585 enclosing context for the inner class we're trying to
10586 create. Build an access to the proper enclosing context
10587 and use it. */
10588 else if (current_this && PURE_INNER_CLASS_TYPE_P (this_type)
10589 && this_type != TREE_TYPE (mec))
10592 extra_arg = build_access_to_thisn (current_class,
10593 TREE_TYPE (mec), 0);
10594 extra_arg = java_complete_tree (extra_arg);
10596 /* Otherwise, just use the current `this' as an enclosing
10597 context. */
10598 else
10599 extra_arg = current_this;
10600 args = tree_cons (NULL_TREE, extra_arg, args);
10602 else
10603 args = tree_cons (NULL_TREE, integer_zero_node, args);
10606 /* This handles the situation where a constructor invocation needs
10607 to have an enclosing context passed as a second parameter (the
10608 constructor is one of an inner class). */
10609 if ((is_super_init ||
10610 (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node))
10611 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10613 tree dest = TYPE_NAME (DECL_CONTEXT (list));
10614 tree extra_arg =
10615 build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0);
10616 extra_arg = java_complete_tree (extra_arg);
10617 args = tree_cons (NULL_TREE, extra_arg, args);
10620 is_static_flag = METHOD_STATIC (list);
10621 if (! is_static_flag && this_arg != NULL_TREE)
10622 args = tree_cons (NULL_TREE, this_arg, args);
10624 /* In the context of an explicit constructor invocation, we can't
10625 invoke any method relying on `this'. Exceptions are: we're
10626 invoking a static function, primary exists and is not the current
10627 this, we're creating a new object. */
10628 if (ctxp->explicit_constructor_p
10629 && !is_static_flag
10630 && (!primary || primary == current_this)
10631 && (TREE_CODE (patch) != NEW_CLASS_EXPR))
10633 parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
10634 PATCH_METHOD_RETURN_ERROR ();
10636 java_parser_context_restore_global ();
10637 if (is_static)
10638 *is_static = is_static_flag;
10639 /* Sometimes, we want the decl of the selected method. Such as for
10640 EH checking */
10641 if (ret_decl)
10642 *ret_decl = list;
10643 patch = patch_invoke (patch, list, args);
10645 /* Now is a good time to insert the call to finit$ */
10646 if (is_super_init && CLASS_HAS_FINIT_P (current_class))
10648 tree finit_parms, finit_call;
10650 /* Prepare to pass hidden parameters to finit$, if any. */
10651 finit_parms = build_alias_initializer_parameter_list
10652 (AIPL_FUNCTION_FINIT_INVOCATION, current_class, NULL_TREE, NULL);
10654 finit_call =
10655 build_method_invocation (build_wfl_node (finit_identifier_node),
10656 finit_parms);
10658 /* Generate the code used to initialize fields declared with an
10659 initialization statement and build a compound statement along
10660 with the super constructor invocation. */
10661 CAN_COMPLETE_NORMALLY (patch) = 1;
10662 patch = build (COMPOUND_EXPR, void_type_node, patch,
10663 java_complete_tree (finit_call));
10665 return patch;
10668 /* Check that we're not trying to do a static reference to a method in
10669 non static method. Return 1 if it's the case, 0 otherwise. */
10671 static int
10672 check_for_static_method_reference (tree wfl, tree node, tree method,
10673 tree where, tree primary)
10675 if (METHOD_STATIC (current_function_decl)
10676 && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
10678 char *fct_name = xstrdup (lang_printable_name (method, 0));
10679 parse_error_context
10680 (wfl, "Can't make static reference to method `%s %s' in class `%s'",
10681 lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
10682 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
10683 free (fct_name);
10684 return 1;
10686 return 0;
10689 /* Fix the invocation of *MDECL if necessary in the case of a
10690 invocation from an inner class. *THIS_ARG might be modified
10691 appropriately and an alternative access to *MDECL might be
10692 returned. */
10694 static int
10695 maybe_use_access_method (int is_super_init, tree *mdecl, tree *this_arg)
10697 tree ctx;
10698 tree md = *mdecl, ta = *this_arg;
10699 int to_return = 0;
10700 int non_static_context = !METHOD_STATIC (md);
10702 if (is_super_init
10703 || DECL_CONTEXT (md) == current_class
10704 || !PURE_INNER_CLASS_TYPE_P (current_class)
10705 || DECL_FINIT_P (md)
10706 || DECL_INSTINIT_P (md))
10707 return 0;
10709 /* If we're calling a method found in an enclosing class, generate
10710 what it takes to retrieve the right this. Don't do that if we're
10711 invoking a static method. Note that if MD's type is unrelated to
10712 CURRENT_CLASS, then the current this can be used. */
10714 if (non_static_context && DECL_CONTEXT (md) != object_type_node)
10716 ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
10717 if (inherits_from_p (ctx, DECL_CONTEXT (md)))
10719 ta = build_current_thisn (current_class);
10720 ta = build_wfl_node (ta);
10722 else
10724 tree type = ctx;
10725 while (type)
10727 maybe_build_thisn_access_method (type);
10728 if (inherits_from_p (type, DECL_CONTEXT (md)))
10730 ta = build_access_to_thisn (ctx, type, 0);
10731 break;
10733 type = (DECL_CONTEXT (TYPE_NAME (type)) ?
10734 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))) : NULL_TREE);
10737 ta = java_complete_tree (ta);
10740 /* We might have to use an access method to get to MD. We can
10741 break the method access rule as far as we're not generating
10742 bytecode */
10743 if (METHOD_PRIVATE (md) && flag_emit_class_files)
10745 md = build_outer_method_access_method (md);
10746 to_return = 1;
10749 *mdecl = md;
10750 *this_arg = ta;
10752 /* Returning a nonzero value indicates we were doing a non static
10753 method invocation that is now a static invocation. It will have
10754 callee displace `this' to insert it in the regular argument
10755 list. */
10756 return (non_static_context && to_return);
10759 /* Patch an invoke expression METHOD and ARGS, based on its invocation
10760 mode. */
10762 static tree
10763 patch_invoke (tree patch, tree method, tree args)
10765 tree dtable, func;
10766 tree original_call, t, ta;
10767 tree check = NULL_TREE;
10769 /* Last step for args: convert build-in types. If we're dealing with
10770 a new TYPE() type call, the first argument to the constructor
10771 isn't found in the incoming argument list, but delivered by
10772 `new' */
10773 t = TYPE_ARG_TYPES (TREE_TYPE (method));
10774 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10775 t = TREE_CHAIN (t);
10776 for (ta = args; t != end_params_node && ta;
10777 t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
10778 if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
10779 TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
10780 TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
10782 /* Resolve unresolved returned type issues */
10783 t = TREE_TYPE (TREE_TYPE (method));
10784 if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
10785 resolve_and_layout (TREE_TYPE (t), NULL);
10787 if (flag_emit_class_files || flag_emit_xref)
10788 func = method;
10789 else
10791 switch (invocation_mode (method, CALL_USING_SUPER (patch)))
10793 case INVOKE_VIRTUAL:
10794 dtable = invoke_build_dtable (0, args);
10795 func = build_invokevirtual (dtable, method);
10796 break;
10798 case INVOKE_NONVIRTUAL:
10799 /* If the object for the method call is null, we throw an
10800 exception. We don't do this if the object is the current
10801 method's `this'. In other cases we just rely on an
10802 optimization pass to eliminate redundant checks. */
10803 if (TREE_VALUE (args) != current_this)
10805 /* We use a save_expr here to make sure we only evaluate
10806 the new `self' expression once. */
10807 tree save_arg = save_expr (TREE_VALUE (args));
10808 TREE_VALUE (args) = save_arg;
10809 check = java_check_reference (save_arg, 1);
10811 /* Fall through. */
10813 case INVOKE_SUPER:
10814 case INVOKE_STATIC:
10816 tree signature = build_java_signature (TREE_TYPE (method));
10817 func = build_known_method_ref (method, TREE_TYPE (method),
10818 DECL_CONTEXT (method),
10819 signature, args);
10821 break;
10823 case INVOKE_INTERFACE:
10824 dtable = invoke_build_dtable (1, args);
10825 func = build_invokeinterface (dtable, method);
10826 break;
10828 default:
10829 abort ();
10832 /* Ensure self_type is initialized, (invokestatic). FIXME */
10833 func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
10836 TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
10837 TREE_OPERAND (patch, 0) = func;
10838 TREE_OPERAND (patch, 1) = args;
10839 patch = check_for_builtin (method, patch);
10840 original_call = patch;
10842 /* We're processing a `new TYPE ()' form. New is called and its
10843 returned value is the first argument to the constructor. We build
10844 a COMPOUND_EXPR and use saved expression so that the overall NEW
10845 expression value is a pointer to a newly created and initialized
10846 class. */
10847 if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
10849 tree class = DECL_CONTEXT (method);
10850 tree c1, saved_new, size, new;
10851 tree alloc_node;
10853 if (flag_emit_class_files || flag_emit_xref)
10855 TREE_TYPE (patch) = build_pointer_type (class);
10856 return patch;
10858 if (!TYPE_SIZE (class))
10859 safe_layout_class (class);
10860 size = size_in_bytes (class);
10861 alloc_node =
10862 (class_has_finalize_method (class) ? alloc_object_node
10863 : alloc_no_finalizer_node);
10864 new = build (CALL_EXPR, promote_type (class),
10865 build_address_of (alloc_node),
10866 tree_cons (NULL_TREE, build_class_ref (class),
10867 build_tree_list (NULL_TREE,
10868 size_in_bytes (class))),
10869 NULL_TREE);
10870 saved_new = save_expr (new);
10871 c1 = build_tree_list (NULL_TREE, saved_new);
10872 TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
10873 TREE_OPERAND (original_call, 1) = c1;
10874 TREE_SET_CODE (original_call, CALL_EXPR);
10875 patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
10878 /* If CHECK is set, then we are building a check to see if the object
10879 is NULL. */
10880 if (check != NULL_TREE)
10882 /* We have to call force_evaluation_order now because creating a
10883 COMPOUND_EXPR wraps the arg list in a way that makes it
10884 unrecognizable by force_evaluation_order later. Yuk. */
10885 patch = build (COMPOUND_EXPR, TREE_TYPE (patch), check,
10886 force_evaluation_order (patch));
10887 TREE_SIDE_EFFECTS (patch) = 1;
10890 /* In order to be able to modify PATCH later, we SAVE_EXPR it and
10891 put it as the first expression of a COMPOUND_EXPR. The second
10892 expression being an empty statement to be later patched if
10893 necessary. We remember a TREE_LIST (the PURPOSE is the method,
10894 the VALUE is the compound) in a hashtable and return a
10895 COMPOUND_EXPR built so that the result of the evaluation of the
10896 original PATCH node is returned. */
10897 if (STATIC_CLASS_INIT_OPT_P ()
10898 && current_function_decl && METHOD_STATIC (method))
10900 tree list;
10901 tree fndecl = current_function_decl;
10902 /* We have to call force_evaluation_order now because creating a
10903 COMPOUND_EXPR wraps the arg list in a way that makes it
10904 unrecognizable by force_evaluation_order later. Yuk. */
10905 tree save = save_expr (force_evaluation_order (patch));
10906 tree type = TREE_TYPE (patch);
10908 patch = build (COMPOUND_EXPR, type, save, empty_stmt_node);
10909 list = tree_cons (method, patch,
10910 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl));
10912 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list;
10914 patch = build (COMPOUND_EXPR, type, patch, save);
10917 return patch;
10920 static int
10921 invocation_mode (tree method, int super)
10923 int access = get_access_flags_from_decl (method);
10925 if (super)
10926 return INVOKE_SUPER;
10928 if (access & ACC_STATIC)
10929 return INVOKE_STATIC;
10931 /* We have to look for a constructor before we handle nonvirtual
10932 calls; otherwise the constructor will look nonvirtual. */
10933 if (DECL_CONSTRUCTOR_P (method))
10934 return INVOKE_STATIC;
10936 if (access & ACC_FINAL || access & ACC_PRIVATE)
10937 return INVOKE_NONVIRTUAL;
10939 if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
10940 return INVOKE_NONVIRTUAL;
10942 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
10943 return INVOKE_INTERFACE;
10945 return INVOKE_VIRTUAL;
10948 /* Retrieve a refined list of matching methods. It covers the step
10949 15.11.2 (Compile-Time Step 2) */
10951 static tree
10952 lookup_method_invoke (int lc, tree cl, tree class, tree name, tree arg_list)
10954 tree atl = end_params_node; /* Arg Type List */
10955 tree method, signature, list, node;
10956 const char *candidates; /* Used for error report */
10957 char *dup;
10959 /* Fix the arguments */
10960 for (node = arg_list; node; node = TREE_CHAIN (node))
10962 tree current_arg = TREE_TYPE (TREE_VALUE (node));
10963 /* Non primitive type may have to be resolved */
10964 if (!JPRIMITIVE_TYPE_P (current_arg))
10965 resolve_and_layout (current_arg, NULL_TREE);
10966 /* And promoted */
10967 if (TREE_CODE (current_arg) == RECORD_TYPE)
10968 current_arg = promote_type (current_arg);
10969 atl = tree_cons (NULL_TREE, current_arg, atl);
10972 /* Presto. If we're dealing with an anonymous class and a
10973 constructor call, generate the right constructor now, since we
10974 know the arguments' types. */
10976 if (lc && ANONYMOUS_CLASS_P (class))
10978 tree saved_current_class;
10979 tree mdecl = craft_constructor (TYPE_NAME (class), atl);
10980 saved_current_class = current_class;
10981 current_class = class;
10982 fix_constructors (mdecl);
10983 current_class = saved_current_class;
10986 /* Find all candidates and then refine the list, searching for the
10987 most specific method. */
10988 list = find_applicable_accessible_methods_list (lc, class, name, atl);
10989 list = find_most_specific_methods_list (list);
10990 if (list && !TREE_CHAIN (list))
10991 return TREE_VALUE (list);
10993 /* Issue an error. List candidates if any. Candidates are listed
10994 only if accessible (non accessible methods may end-up here for
10995 the sake of a better error report). */
10996 candidates = NULL;
10997 if (list)
10999 tree current;
11000 obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
11001 for (current = list; current; current = TREE_CHAIN (current))
11003 tree cm = TREE_VALUE (current);
11004 char string [4096];
11005 if (!cm || not_accessible_p (class, cm, NULL_TREE, 0))
11006 continue;
11007 sprintf
11008 (string, " `%s' in `%s'%s",
11009 get_printable_method_name (cm),
11010 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
11011 (TREE_CHAIN (current) ? "\n" : ""));
11012 obstack_grow (&temporary_obstack, string, strlen (string));
11014 obstack_1grow (&temporary_obstack, '\0');
11015 candidates = obstack_finish (&temporary_obstack);
11017 /* Issue the error message */
11018 method = make_node (FUNCTION_TYPE);
11019 TYPE_ARG_TYPES (method) = atl;
11020 signature = build_java_argument_signature (method);
11021 dup = xstrdup (lang_printable_name (class, 0));
11022 parse_error_context (cl, "Can't find %s `%s(%s)' in type `%s'%s",
11023 (lc ? "constructor" : "method"),
11024 (lc ? dup : IDENTIFIER_POINTER (name)),
11025 IDENTIFIER_POINTER (signature), dup,
11026 (candidates ? candidates : ""));
11027 free (dup);
11028 return NULL_TREE;
11031 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
11032 when we're looking for a constructor. */
11034 static tree
11035 find_applicable_accessible_methods_list (int lc, tree class, tree name,
11036 tree arglist)
11038 static htab_t searched_classes;
11039 static int search_not_done = 0;
11040 tree list = NULL_TREE, all_list = NULL_TREE;
11042 /* Check the hash table to determine if this class has been searched
11043 already. */
11044 if (searched_classes)
11046 if (htab_find (searched_classes, class) != NULL)
11047 return NULL;
11049 else
11051 searched_classes = htab_create (10, htab_hash_pointer,
11052 htab_eq_pointer, NULL);
11055 search_not_done++;
11056 *htab_find_slot (searched_classes, class, INSERT) = class;
11058 if (!CLASS_LOADED_P (class) && !CLASS_FROM_SOURCE_P (class))
11060 load_class (class, 1);
11061 safe_layout_class (class);
11064 /* Search interfaces */
11065 if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL
11066 && CLASS_INTERFACE (TYPE_NAME (class)))
11068 int i, n;
11069 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
11070 search_applicable_methods_list (lc, TYPE_METHODS (class),
11071 name, arglist, &list, &all_list);
11072 n = TREE_VEC_LENGTH (basetype_vec);
11073 for (i = 1; i < n; i++)
11075 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11076 tree rlist;
11078 rlist = find_applicable_accessible_methods_list (lc, t, name,
11079 arglist);
11080 list = chainon (rlist, list);
11083 /* Search classes */
11084 else
11086 search_applicable_methods_list (lc, TYPE_METHODS (class),
11087 name, arglist, &list, &all_list);
11089 /* When looking finit$, class$ or instinit$, we turn LC to 1 so
11090 that we only search in class. Note that we should have found
11091 something at this point. */
11092 if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name))
11094 lc = 1;
11095 if (!list)
11096 abort ();
11099 /* We must search all interfaces of this class */
11100 if (!lc)
11102 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
11103 int n = TREE_VEC_LENGTH (basetype_vec), i;
11104 for (i = 1; i < n; i++)
11106 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11107 if (t != object_type_node)
11109 tree rlist
11110 = find_applicable_accessible_methods_list (lc, t,
11111 name, arglist);
11112 list = chainon (rlist, list);
11117 /* Search superclass */
11118 if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
11120 tree rlist;
11121 class = CLASSTYPE_SUPER (class);
11122 rlist = find_applicable_accessible_methods_list (lc, class,
11123 name, arglist);
11124 list = chainon (rlist, list);
11128 search_not_done--;
11130 /* We're done. Reset the searched classes list and finally search
11131 java.lang.Object if it wasn't searched already. */
11132 if (!search_not_done)
11134 if (!lc
11135 && TYPE_METHODS (object_type_node)
11136 && htab_find (searched_classes, object_type_node) == NULL)
11138 search_applicable_methods_list (lc,
11139 TYPE_METHODS (object_type_node),
11140 name, arglist, &list, &all_list);
11142 htab_delete (searched_classes);
11143 searched_classes = NULL;
11146 /* Either return the list obtained or all selected (but
11147 inaccessible) methods for better error report. */
11148 return (!list ? all_list : list);
11151 /* Effectively search for the appropriate method in method */
11153 static void
11154 search_applicable_methods_list (int lc, tree method, tree name, tree arglist,
11155 tree *list, tree *all_list)
11157 for (; method; method = TREE_CHAIN (method))
11159 /* When dealing with constructor, stop here, otherwise search
11160 other classes */
11161 if (lc && !DECL_CONSTRUCTOR_P (method))
11162 continue;
11163 else if (!lc && (DECL_CONSTRUCTOR_P (method)
11164 || (DECL_NAME (method) != name)))
11165 continue;
11167 if (argument_types_convertible (method, arglist))
11169 /* Retain accessible methods only */
11170 if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
11171 method, NULL_TREE, 0))
11172 *list = tree_cons (NULL_TREE, method, *list);
11173 else
11174 /* Also retain all selected method here */
11175 *all_list = tree_cons (NULL_TREE, method, *list);
11180 /* 15.11.2.2 Choose the Most Specific Method */
11182 static tree
11183 find_most_specific_methods_list (tree list)
11185 int max = 0;
11186 int abstract, candidates;
11187 tree current, new_list = NULL_TREE;
11188 for (current = list; current; current = TREE_CHAIN (current))
11190 tree method;
11191 DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
11193 for (method = list; method; method = TREE_CHAIN (method))
11195 tree method_v, current_v;
11196 /* Don't test a method against itself */
11197 if (method == current)
11198 continue;
11200 method_v = TREE_VALUE (method);
11201 current_v = TREE_VALUE (current);
11203 /* Compare arguments and location where methods where declared */
11204 if (argument_types_convertible (method_v, current_v))
11206 if (valid_method_invocation_conversion_p
11207 (DECL_CONTEXT (method_v), DECL_CONTEXT (current_v))
11208 || (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v))
11209 && enclosing_context_p (DECL_CONTEXT (method_v),
11210 DECL_CONTEXT (current_v))))
11212 int v = (DECL_SPECIFIC_COUNT (current_v) +=
11213 (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v)) ? 2 : 1));
11214 max = (v > max ? v : max);
11220 /* Review the list and select the maximally specific methods */
11221 for (current = list, abstract = -1, candidates = -1;
11222 current; current = TREE_CHAIN (current))
11223 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11225 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11226 abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0);
11227 candidates++;
11230 /* If we have several and they're all abstract, just pick the
11231 closest one. */
11232 if (candidates > 0 && candidates == abstract)
11234 /* FIXME: merge the throws clauses. There is no convenient way
11235 to do this in gcj right now, since ideally we'd like to
11236 introduce a new METHOD_DECL here, but that is really not
11237 possible. */
11238 new_list = nreverse (new_list);
11239 TREE_CHAIN (new_list) = NULL_TREE;
11240 return new_list;
11243 /* We have several (we couldn't find a most specific), all but one
11244 are abstract, we pick the only non abstract one. */
11245 if (candidates > 0 && (candidates == abstract+1))
11247 for (current = new_list; current; current = TREE_CHAIN (current))
11248 if (!METHOD_ABSTRACT (TREE_VALUE (current)))
11250 TREE_CHAIN (current) = NULL_TREE;
11251 new_list = current;
11255 /* If we can't find one, lower expectations and try to gather multiple
11256 maximally specific methods */
11257 while (!new_list && max)
11259 while (--max > 0)
11261 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11262 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11266 return new_list;
11269 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
11270 converted by method invocation conversion (5.3) to the type of the
11271 corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
11272 to change less often than M1. */
11274 static GTY(()) tree m2_arg_value;
11275 static GTY(()) tree m2_arg_cache;
11277 static int
11278 argument_types_convertible (tree m1, tree m2_or_arglist)
11280 tree m1_arg, m2_arg;
11282 SKIP_THIS_AND_ARTIFICIAL_PARMS (m1_arg, m1)
11284 if (m2_arg_value == m2_or_arglist)
11285 m2_arg = m2_arg_cache;
11286 else
11288 /* M2_OR_ARGLIST can be a function DECL or a raw list of
11289 argument types */
11290 if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
11292 m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
11293 if (!METHOD_STATIC (m2_or_arglist))
11294 m2_arg = TREE_CHAIN (m2_arg);
11296 else
11297 m2_arg = m2_or_arglist;
11299 m2_arg_value = m2_or_arglist;
11300 m2_arg_cache = m2_arg;
11303 while (m1_arg != end_params_node && m2_arg != end_params_node)
11305 resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
11306 if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
11307 TREE_VALUE (m2_arg)))
11308 break;
11309 m1_arg = TREE_CHAIN (m1_arg);
11310 m2_arg = TREE_CHAIN (m2_arg);
11312 return m1_arg == end_params_node && m2_arg == end_params_node;
11315 /* Qualification routines */
11317 /* Given a name x.y.z, look up x locally. If it's found, save the
11318 decl. If it's not found, mark the name as RESOLVE_PACKAGE_NAME_P,
11319 so that we later try and load the appropriate classes. */
11320 static void
11321 qualify_ambiguous_name (tree id)
11323 tree name, decl;
11325 /* We inspect the first item of the qualification list. As a sanity
11326 check, make sure that it is an identfier node. */
11327 tree qual = EXPR_WFL_QUALIFICATION (id);
11328 tree qual_wfl = QUAL_WFL (qual);
11330 if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
11331 return;
11333 name = EXPR_WFL_NODE (qual_wfl);
11335 /* If we don't have an identifier, or we have a 'this' or 'super',
11336 then field access processing is all we need : there is nothing
11337 for us to do. */
11338 if (!name || TREE_CODE (name) != IDENTIFIER_NODE ||
11339 name == this_identifier_node ||
11340 name == super_identifier_node)
11341 return;
11343 /* If name appears within the scope of a local variable declaration
11344 or parameter declaration, or is a field within an enclosing
11345 class, then it is an expression name. Save the decl and let
11346 resolve_field_access do it's work. */
11347 if ((decl = IDENTIFIER_LOCAL_VALUE (name)) ||
11348 (decl = lookup_field_wrapper (current_class, name)))
11350 QUAL_RESOLUTION (qual) = decl;
11351 return;
11354 /* If name is a known class name (either declared or imported), mark
11355 us as a type name. */
11356 if ((decl = resolve_and_layout (name, NULL_TREE)))
11358 RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
11359 QUAL_RESOLUTION (qual) = decl;
11362 /* Check here that NAME isn't declared by more than one
11363 type-import-on-demand declaration of the compilation unit
11364 containing NAME. FIXME */
11366 /* We couldn't find a declaration for the name. Assume for now that
11367 we have a qualified class name that needs to be loaded from an
11368 external class file. */
11369 else
11370 RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
11372 /* Propagate the qualification across other components of the
11373 qualified name */
11374 for (qual = TREE_CHAIN (qual); qual;
11375 qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
11377 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11378 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
11381 /* Store the global qualification for the ambiguous part of ID back
11382 into ID fields */
11383 if (RESOLVE_TYPE_NAME_P (qual_wfl))
11384 RESOLVE_TYPE_NAME_P (id) = 1;
11385 else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11386 RESOLVE_PACKAGE_NAME_P (id) = 1;
11389 static int
11390 breakdown_qualified (tree *left, tree *right, tree source)
11392 char *p, *base;
11393 int l = IDENTIFIER_LENGTH (source);
11395 base = alloca (l + 1);
11396 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
11398 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
11399 p = base + l - 1;
11400 while (*p != '.' && p != base)
11401 p--;
11403 /* We didn't find a '.'. Return an error. */
11404 if (p == base)
11405 return 1;
11407 *p = '\0';
11408 if (right)
11409 *right = get_identifier (p+1);
11410 *left = get_identifier (base);
11412 return 0;
11415 /* Return TRUE if two classes are from the same package. */
11417 static int
11418 in_same_package (tree name1, tree name2)
11420 tree tmp;
11421 tree pkg1;
11422 tree pkg2;
11424 if (TREE_CODE (name1) == TYPE_DECL)
11425 name1 = DECL_NAME (name1);
11426 if (TREE_CODE (name2) == TYPE_DECL)
11427 name2 = DECL_NAME (name2);
11429 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
11430 /* One in empty package. */
11431 return 0;
11433 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
11434 /* Both in empty package. */
11435 return 1;
11437 breakdown_qualified (&pkg1, &tmp, name1);
11438 breakdown_qualified (&pkg2, &tmp, name2);
11440 return (pkg1 == pkg2);
11443 /* Patch tree nodes in a function body. When a BLOCK is found, push
11444 local variable decls if present.
11445 Same as java_complete_lhs, but does resolve static finals to values. */
11447 static tree
11448 java_complete_tree (tree node)
11450 node = java_complete_lhs (node);
11451 if (JDECL_P (node) && CLASS_FINAL_VARIABLE_P (node)
11452 && DECL_INITIAL (node) != NULL_TREE
11453 && !flag_emit_xref)
11455 tree value = fold_constant_for_init (node, node);
11456 if (value != NULL_TREE)
11457 return value;
11459 return node;
11462 static tree
11463 java_stabilize_reference (tree node)
11465 if (TREE_CODE (node) == COMPOUND_EXPR)
11467 tree op0 = TREE_OPERAND (node, 0);
11468 tree op1 = TREE_OPERAND (node, 1);
11469 TREE_OPERAND (node, 0) = save_expr (op0);
11470 TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
11471 return node;
11473 return stabilize_reference (node);
11476 /* Patch tree nodes in a function body. When a BLOCK is found, push
11477 local variable decls if present.
11478 Same as java_complete_tree, but does not resolve static finals to values. */
11480 static tree
11481 java_complete_lhs (tree node)
11483 tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
11484 int flag;
11486 /* CONVERT_EXPR always has its type set, even though it needs to be
11487 worked out. */
11488 if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
11489 return node;
11491 /* The switch block implements cases processing container nodes
11492 first. Contained nodes are always written back. Leaves come
11493 next and return a value. */
11494 switch (TREE_CODE (node))
11496 case BLOCK:
11498 /* 1- Block section.
11499 Set the local values on decl names so we can identify them
11500 faster when they're referenced. At that stage, identifiers
11501 are legal so we don't check for declaration errors. */
11502 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11504 DECL_CONTEXT (cn) = current_function_decl;
11505 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
11507 if (BLOCK_EXPR_BODY (node) == NULL_TREE)
11508 CAN_COMPLETE_NORMALLY (node) = 1;
11509 else
11511 tree stmt = BLOCK_EXPR_BODY (node);
11512 tree *ptr;
11513 int error_seen = 0;
11514 if (TREE_CODE (stmt) == COMPOUND_EXPR)
11516 /* Re-order from (((A; B); C); ...; Z) to
11517 (A; (B; (C ; (...; Z)))).
11518 This makes it easier to scan the statements left-to-right
11519 without using recursion (which might overflow the stack
11520 if the block has many statements. */
11521 for (;;)
11523 tree left = TREE_OPERAND (stmt, 0);
11524 if (TREE_CODE (left) != COMPOUND_EXPR)
11525 break;
11526 TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
11527 TREE_OPERAND (left, 1) = stmt;
11528 stmt = left;
11530 BLOCK_EXPR_BODY (node) = stmt;
11533 /* Now do the actual complete, without deep recursion for
11534 long blocks. */
11535 ptr = &BLOCK_EXPR_BODY (node);
11536 while (TREE_CODE (*ptr) == COMPOUND_EXPR
11537 && TREE_OPERAND (*ptr, 1) != empty_stmt_node)
11539 tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
11540 tree *next = &TREE_OPERAND (*ptr, 1);
11541 TREE_OPERAND (*ptr, 0) = cur;
11542 if (cur == empty_stmt_node)
11544 /* Optimization; makes it easier to detect empty bodies.
11545 Most useful for <clinit> with all-constant initializer. */
11546 *ptr = *next;
11547 continue;
11549 if (TREE_CODE (cur) == ERROR_MARK)
11550 error_seen++;
11551 else if (! CAN_COMPLETE_NORMALLY (cur))
11553 wfl_op2 = *next;
11554 for (;;)
11556 if (TREE_CODE (wfl_op2) == BLOCK)
11557 wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
11558 else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
11559 wfl_op2 = TREE_OPERAND (wfl_op2, 0);
11560 else
11561 break;
11563 if (TREE_CODE (wfl_op2) != CASE_EXPR
11564 && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
11565 unreachable_stmt_error (*ptr);
11567 if (TREE_TYPE (*ptr) == NULL_TREE)
11568 TREE_TYPE (*ptr) = void_type_node;
11569 ptr = next;
11571 *ptr = java_complete_tree (*ptr);
11573 if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
11574 return error_mark_node;
11575 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
11577 /* Turn local bindings to null */
11578 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11579 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
11581 TREE_TYPE (node) = void_type_node;
11582 break;
11584 /* 2- They are expressions but ultimately deal with statements */
11586 case THROW_EXPR:
11587 wfl_op1 = TREE_OPERAND (node, 0);
11588 COMPLETE_CHECK_OP_0 (node);
11589 /* 14.19 A throw statement cannot complete normally. */
11590 CAN_COMPLETE_NORMALLY (node) = 0;
11591 return patch_throw_statement (node, wfl_op1);
11593 case SYNCHRONIZED_EXPR:
11594 wfl_op1 = TREE_OPERAND (node, 0);
11595 return patch_synchronized_statement (node, wfl_op1);
11597 case TRY_EXPR:
11598 return patch_try_statement (node);
11600 case TRY_FINALLY_EXPR:
11601 COMPLETE_CHECK_OP_0 (node);
11602 COMPLETE_CHECK_OP_1 (node);
11603 /* Reduce try/finally nodes with an empty try block. */
11604 if (TREE_OPERAND (node, 0) == empty_stmt_node
11605 || BLOCK_EMPTY_P (TREE_OPERAND (node, 0)))
11606 return TREE_OPERAND (node, 1);
11607 /* Likewise for an empty finally block. */
11608 if (TREE_OPERAND (node, 1) == empty_stmt_node
11609 || BLOCK_EMPTY_P (TREE_OPERAND (node, 1)))
11610 return TREE_OPERAND (node, 0);
11611 CAN_COMPLETE_NORMALLY (node)
11612 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11613 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11614 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
11615 return node;
11617 case LABELED_BLOCK_EXPR:
11618 PUSH_LABELED_BLOCK (node);
11619 if (LABELED_BLOCK_BODY (node))
11620 COMPLETE_CHECK_OP_1 (node);
11621 TREE_TYPE (node) = void_type_node;
11622 POP_LABELED_BLOCK ();
11624 if (LABELED_BLOCK_BODY (node) == empty_stmt_node)
11626 LABELED_BLOCK_BODY (node) = NULL_TREE;
11627 CAN_COMPLETE_NORMALLY (node) = 1;
11629 else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
11630 CAN_COMPLETE_NORMALLY (node) = 1;
11631 return node;
11633 case EXIT_BLOCK_EXPR:
11634 /* We don't complete operand 1, because it's the return value of
11635 the EXIT_BLOCK_EXPR which doesn't exist it Java */
11636 return patch_bc_statement (node);
11638 case CASE_EXPR:
11639 cn = java_complete_tree (TREE_OPERAND (node, 0));
11640 if (cn == error_mark_node)
11641 return cn;
11643 /* First, the case expression must be constant. Values of final
11644 fields are accepted. */
11645 cn = fold (cn);
11646 if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
11647 && JDECL_P (TREE_OPERAND (cn, 1))
11648 && FIELD_FINAL (TREE_OPERAND (cn, 1))
11649 && DECL_INITIAL (TREE_OPERAND (cn, 1)))
11651 cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
11652 TREE_OPERAND (cn, 1));
11654 /* Accept final locals too. */
11655 else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn))
11656 cn = fold_constant_for_init (DECL_INITIAL (cn), cn);
11658 if (!TREE_CONSTANT (cn) && !flag_emit_xref)
11660 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11661 parse_error_context (node, "Constant expression required");
11662 return error_mark_node;
11665 nn = ctxp->current_loop;
11667 /* It must be assignable to the type of the switch expression. */
11668 if (!try_builtin_assignconv (NULL_TREE,
11669 TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
11671 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11672 parse_error_context
11673 (wfl_operator,
11674 "Incompatible type for case. Can't convert `%s' to `int'",
11675 lang_printable_name (TREE_TYPE (cn), 0));
11676 return error_mark_node;
11679 cn = fold (convert (int_type_node, cn));
11680 TREE_CONSTANT_OVERFLOW (cn) = 0;
11681 CAN_COMPLETE_NORMALLY (cn) = 1;
11683 /* Save the label on a list so that we can later check for
11684 duplicates. */
11685 case_label_list = tree_cons (node, cn, case_label_list);
11687 /* Multiple instance of a case label bearing the same value is
11688 checked later. The case expression is all right so far. */
11689 if (TREE_CODE (cn) == VAR_DECL)
11690 cn = DECL_INITIAL (cn);
11691 TREE_OPERAND (node, 0) = cn;
11692 TREE_TYPE (node) = void_type_node;
11693 CAN_COMPLETE_NORMALLY (node) = 1;
11694 TREE_SIDE_EFFECTS (node) = 1;
11695 break;
11697 case DEFAULT_EXPR:
11698 nn = ctxp->current_loop;
11699 /* Only one default label is allowed per switch statement */
11700 if (SWITCH_HAS_DEFAULT (nn))
11702 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11703 parse_error_context (wfl_operator,
11704 "Duplicate case label: `default'");
11705 return error_mark_node;
11707 else
11708 SWITCH_HAS_DEFAULT (nn) = 1;
11709 TREE_TYPE (node) = void_type_node;
11710 TREE_SIDE_EFFECTS (node) = 1;
11711 CAN_COMPLETE_NORMALLY (node) = 1;
11712 break;
11714 case SWITCH_EXPR:
11715 case LOOP_EXPR:
11716 PUSH_LOOP (node);
11717 /* Check whether the loop was enclosed in a labeled
11718 statement. If not, create one, insert the loop in it and
11719 return the node */
11720 nn = patch_loop_statement (node);
11722 /* Anyways, walk the body of the loop */
11723 if (TREE_CODE (node) == LOOP_EXPR)
11724 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11725 /* Switch statement: walk the switch expression and the cases */
11726 else
11727 node = patch_switch_statement (node);
11729 if (node == error_mark_node || TREE_OPERAND (node, 0) == error_mark_node)
11730 nn = error_mark_node;
11731 else
11733 TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
11734 /* If we returned something different, that's because we
11735 inserted a label. Pop the label too. */
11736 if (nn != node)
11738 if (CAN_COMPLETE_NORMALLY (node))
11739 CAN_COMPLETE_NORMALLY (nn) = 1;
11740 POP_LABELED_BLOCK ();
11743 POP_LOOP ();
11744 return nn;
11746 case EXIT_EXPR:
11747 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11748 return patch_exit_expr (node);
11750 case COND_EXPR:
11751 /* Condition */
11752 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11753 if (TREE_OPERAND (node, 0) == error_mark_node)
11754 return error_mark_node;
11755 /* then-else branches */
11756 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11757 if (TREE_OPERAND (node, 1) == error_mark_node)
11758 return error_mark_node;
11759 TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
11760 if (TREE_OPERAND (node, 2) == error_mark_node)
11761 return error_mark_node;
11762 return patch_if_else_statement (node);
11763 break;
11765 case CONDITIONAL_EXPR:
11766 /* Condition */
11767 wfl_op1 = TREE_OPERAND (node, 0);
11768 COMPLETE_CHECK_OP_0 (node);
11769 wfl_op2 = TREE_OPERAND (node, 1);
11770 COMPLETE_CHECK_OP_1 (node);
11771 wfl_op3 = TREE_OPERAND (node, 2);
11772 COMPLETE_CHECK_OP_2 (node);
11773 return patch_conditional_expr (node, wfl_op1, wfl_op2);
11775 /* 3- Expression section */
11776 case COMPOUND_EXPR:
11777 wfl_op2 = TREE_OPERAND (node, 1);
11778 TREE_OPERAND (node, 0) = nn =
11779 java_complete_tree (TREE_OPERAND (node, 0));
11780 if (wfl_op2 == empty_stmt_node)
11781 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
11782 else
11784 if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
11786 /* An unreachable condition in a do-while statement
11787 is *not* (technically) an unreachable statement. */
11788 nn = wfl_op2;
11789 if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
11790 nn = EXPR_WFL_NODE (nn);
11791 /* NN can be NULL_TREE exactly when UPDATE is, in
11792 finish_for_loop. */
11793 if (nn != NULL_TREE && TREE_CODE (nn) != EXIT_EXPR)
11795 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
11796 if (SUPPRESS_UNREACHABLE_ERROR (nn))
11798 /* Perhaps this warning should have an
11799 associated flag. The code being compiled is
11800 pedantically correct, but useless. */
11801 parse_warning_context (wfl_operator,
11802 "Unreachable statement");
11804 else
11805 parse_error_context (wfl_operator,
11806 "Unreachable statement");
11809 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11810 if (TREE_OPERAND (node, 1) == error_mark_node)
11811 return error_mark_node;
11812 /* Even though we might allow the case where the first
11813 operand doesn't return normally, we still should compute
11814 CAN_COMPLETE_NORMALLY correctly. */
11815 CAN_COMPLETE_NORMALLY (node)
11816 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11817 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11819 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
11820 break;
11822 case RETURN_EXPR:
11823 /* CAN_COMPLETE_NORMALLY (node) = 0; */
11824 return patch_return (node);
11826 case EXPR_WITH_FILE_LOCATION:
11827 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
11828 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
11830 tree wfl = node;
11831 node = resolve_expression_name (node, NULL);
11832 if (node == error_mark_node)
11833 return node;
11834 /* Keep line number information somewhere were it doesn't
11835 disrupt the completion process. */
11836 if (flag_emit_xref && TREE_CODE (node) != CALL_EXPR)
11838 EXPR_WFL_NODE (wfl) = TREE_OPERAND (node, 1);
11839 TREE_OPERAND (node, 1) = wfl;
11841 CAN_COMPLETE_NORMALLY (node) = 1;
11843 else
11845 tree body;
11846 int save_lineno = input_line;
11847 input_line = EXPR_WFL_LINENO (node);
11848 body = java_complete_tree (EXPR_WFL_NODE (node));
11849 input_line = save_lineno;
11850 EXPR_WFL_NODE (node) = body;
11851 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
11852 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
11853 if (body == empty_stmt_node || TREE_CONSTANT (body))
11855 /* Makes it easier to constant fold, detect empty bodies. */
11856 return body;
11858 if (body == error_mark_node)
11860 /* Its important for the evaluation of assignment that
11861 this mark on the TREE_TYPE is propagated. */
11862 TREE_TYPE (node) = error_mark_node;
11863 return error_mark_node;
11865 else
11866 TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
11869 break;
11871 case NEW_ARRAY_EXPR:
11872 /* Patch all the dimensions */
11873 flag = 0;
11874 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
11876 int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
11877 tree dim = convert (int_type_node,
11878 java_complete_tree (TREE_VALUE (cn)));
11879 if (dim == error_mark_node)
11881 flag = 1;
11882 continue;
11884 else
11886 TREE_VALUE (cn) = dim;
11887 /* Setup the location of the current dimension, for
11888 later error report. */
11889 TREE_PURPOSE (cn) =
11890 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
11891 EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
11894 /* They complete the array creation expression, if no errors
11895 were found. */
11896 CAN_COMPLETE_NORMALLY (node) = 1;
11897 return (flag ? error_mark_node
11898 : force_evaluation_order (patch_newarray (node)));
11900 case NEW_ANONYMOUS_ARRAY_EXPR:
11901 /* Create the array type if necessary. */
11902 if (ANONYMOUS_ARRAY_DIMS_SIG (node))
11904 tree type = ANONYMOUS_ARRAY_BASE_TYPE (node);
11905 if (!(type = resolve_type_during_patch (type)))
11906 return error_mark_node;
11907 type = build_array_from_name (type, NULL_TREE,
11908 ANONYMOUS_ARRAY_DIMS_SIG (node), NULL);
11909 ANONYMOUS_ARRAY_BASE_TYPE (node) = build_pointer_type (type);
11911 node = patch_new_array_init (ANONYMOUS_ARRAY_BASE_TYPE (node),
11912 ANONYMOUS_ARRAY_INITIALIZER (node));
11913 if (node == error_mark_node)
11914 return error_mark_node;
11915 CAN_COMPLETE_NORMALLY (node) = 1;
11916 return node;
11918 case NEW_CLASS_EXPR:
11919 case CALL_EXPR:
11920 /* Complete function's argument(s) first */
11921 if (complete_function_arguments (node))
11922 return error_mark_node;
11923 else
11925 tree decl, wfl = TREE_OPERAND (node, 0);
11926 int in_this = CALL_THIS_CONSTRUCTOR_P (node);
11927 int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
11928 super_identifier_node);
11929 tree arguments;
11930 int location = EXPR_WFL_LINECOL (node);
11932 node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
11933 from_super, 0, &decl);
11934 if (node == error_mark_node)
11935 return error_mark_node;
11937 if (TREE_CODE (node) == CALL_EXPR
11938 && TREE_OPERAND (node, 1) != NULL_TREE)
11939 arguments = TREE_VALUE (TREE_OPERAND (node, 1));
11940 else
11941 arguments = NULL_TREE;
11942 check_thrown_exceptions (location, decl, arguments);
11943 /* If we call this(...), register signature and positions */
11944 if (in_this)
11945 DECL_CONSTRUCTOR_CALLS (current_function_decl) =
11946 tree_cons (wfl, decl,
11947 DECL_CONSTRUCTOR_CALLS (current_function_decl));
11948 CAN_COMPLETE_NORMALLY (node) = 1;
11949 return force_evaluation_order (node);
11952 case MODIFY_EXPR:
11953 /* Save potential wfls */
11954 wfl_op1 = TREE_OPERAND (node, 0);
11955 TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
11957 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
11958 && TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
11959 && DECL_INITIAL (nn) != NULL_TREE)
11961 tree value;
11963 value = fold_constant_for_init (nn, nn);
11965 /* When we have a primitype type, or a string and we're not
11966 emitting a class file, we actually don't want to generate
11967 anything for the assignment. */
11968 if (value != NULL_TREE &&
11969 (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) ||
11970 (TREE_TYPE (value) == string_ptr_type_node &&
11971 ! flag_emit_class_files)))
11973 /* Prepare node for patch_assignment */
11974 TREE_OPERAND (node, 1) = value;
11975 /* Call patch assignment to verify the assignment */
11976 if (patch_assignment (node, wfl_op1) == error_mark_node)
11977 return error_mark_node;
11978 /* Set DECL_INITIAL properly (a conversion might have
11979 been decided by patch_assignment) and return the
11980 empty statement. */
11981 else
11983 tree patched = patch_string (TREE_OPERAND (node, 1));
11984 if (patched)
11985 DECL_INITIAL (nn) = patched;
11986 else
11987 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
11988 DECL_FIELD_FINAL_IUD (nn) = 1;
11989 return empty_stmt_node;
11992 if (! flag_emit_class_files)
11993 DECL_INITIAL (nn) = NULL_TREE;
11995 wfl_op2 = TREE_OPERAND (node, 1);
11997 if (TREE_OPERAND (node, 0) == error_mark_node)
11998 return error_mark_node;
12000 flag = COMPOUND_ASSIGN_P (wfl_op2);
12001 if (flag)
12003 /* This might break when accessing outer field from inner
12004 class. TESTME, FIXME */
12005 tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
12007 /* Hand stabilize the lhs on both places */
12008 TREE_OPERAND (node, 0) = lvalue;
12009 TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
12010 (flag_emit_class_files ? lvalue : save_expr (lvalue));
12012 /* 15.25.2.a: Left hand is not an array access. FIXME */
12013 /* Now complete the RHS. We write it back later on. */
12014 nn = java_complete_tree (TREE_OPERAND (node, 1));
12016 if ((cn = patch_string (nn)))
12017 nn = cn;
12019 /* The last part of the rewrite for E1 op= E2 is to have
12020 E1 = (T)(E1 op E2), with T being the type of E1. */
12021 nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
12022 TREE_TYPE (lvalue), nn));
12024 /* If the assignment is compound and has reference type,
12025 then ensure the LHS has type String and nothing else. */
12026 if (JREFERENCE_TYPE_P (TREE_TYPE (lvalue))
12027 && ! JSTRING_TYPE_P (TREE_TYPE (lvalue)))
12028 parse_error_context (wfl_op2,
12029 "Incompatible type for `+='. Can't convert `%s' to `java.lang.String'",
12030 lang_printable_name (TREE_TYPE (lvalue), 0));
12032 /* 15.25.2.b: Left hand is an array access. FIXME */
12035 /* If we're about to patch a NEW_ARRAY_INIT, we call a special
12036 function to complete this RHS. Note that a NEW_ARRAY_INIT
12037 might have been already fully expanded if created as a result
12038 of processing an anonymous array initializer. We avoid doing
12039 the operation twice by testing whether the node already bears
12040 a type. */
12041 else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT && !TREE_TYPE (wfl_op2))
12042 nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
12043 TREE_OPERAND (node, 1));
12044 /* Otherwise we simply complete the RHS */
12045 else
12046 nn = java_complete_tree (TREE_OPERAND (node, 1));
12048 if (nn == error_mark_node)
12049 return error_mark_node;
12051 /* Write back the RHS as we evaluated it. */
12052 TREE_OPERAND (node, 1) = nn;
12054 /* In case we're handling = with a String as a RHS, we need to
12055 produce a String out of the RHS (it might still be a
12056 STRING_CST or a StringBuffer at this stage */
12057 if ((nn = patch_string (TREE_OPERAND (node, 1))))
12058 TREE_OPERAND (node, 1) = nn;
12060 if ((nn = outer_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
12061 TREE_OPERAND (node, 1))))
12063 /* We return error_mark_node if outer_field_access_fix
12064 detects we write into a final. */
12065 if (nn == error_mark_node)
12066 return error_mark_node;
12067 node = nn;
12069 else
12071 node = patch_assignment (node, wfl_op1);
12072 if (node == error_mark_node)
12073 return error_mark_node;
12074 /* Reorganize the tree if necessary. */
12075 if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
12076 || JSTRING_P (TREE_TYPE (node))))
12077 node = java_refold (node);
12080 /* Seek to set DECL_INITIAL to a proper value, since it might have
12081 undergone a conversion in patch_assignment. We do that only when
12082 it's necessary to have DECL_INITIAL properly set. */
12083 nn = TREE_OPERAND (node, 0);
12084 if (TREE_CODE (nn) == VAR_DECL
12085 && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn))
12086 && FIELD_STATIC (nn) && FIELD_FINAL (nn)
12087 && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn))
12088 || TREE_TYPE (nn) == string_ptr_type_node))
12089 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
12091 CAN_COMPLETE_NORMALLY (node) = 1;
12092 return node;
12094 case MULT_EXPR:
12095 case PLUS_EXPR:
12096 case MINUS_EXPR:
12097 case LSHIFT_EXPR:
12098 case RSHIFT_EXPR:
12099 case URSHIFT_EXPR:
12100 case BIT_AND_EXPR:
12101 case BIT_XOR_EXPR:
12102 case BIT_IOR_EXPR:
12103 case TRUNC_MOD_EXPR:
12104 case TRUNC_DIV_EXPR:
12105 case RDIV_EXPR:
12106 case TRUTH_ANDIF_EXPR:
12107 case TRUTH_ORIF_EXPR:
12108 case EQ_EXPR:
12109 case NE_EXPR:
12110 case GT_EXPR:
12111 case GE_EXPR:
12112 case LT_EXPR:
12113 case LE_EXPR:
12114 /* Operands 0 and 1 are WFL in certain cases only. patch_binop
12115 knows how to handle those cases. */
12116 wfl_op1 = TREE_OPERAND (node, 0);
12117 wfl_op2 = TREE_OPERAND (node, 1);
12119 CAN_COMPLETE_NORMALLY (node) = 1;
12120 /* Don't complete string nodes if dealing with the PLUS operand. */
12121 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
12123 nn = java_complete_tree (wfl_op1);
12124 if (nn == error_mark_node)
12125 return error_mark_node;
12127 TREE_OPERAND (node, 0) = nn;
12129 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
12131 nn = java_complete_tree (wfl_op2);
12132 if (nn == error_mark_node)
12133 return error_mark_node;
12135 TREE_OPERAND (node, 1) = nn;
12137 return patch_binop (node, wfl_op1, wfl_op2);
12139 case INSTANCEOF_EXPR:
12140 wfl_op1 = TREE_OPERAND (node, 0);
12141 COMPLETE_CHECK_OP_0 (node);
12142 if (flag_emit_xref)
12144 TREE_TYPE (node) = boolean_type_node;
12145 return node;
12147 return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
12149 case UNARY_PLUS_EXPR:
12150 case NEGATE_EXPR:
12151 case TRUTH_NOT_EXPR:
12152 case BIT_NOT_EXPR:
12153 case PREDECREMENT_EXPR:
12154 case PREINCREMENT_EXPR:
12155 case POSTDECREMENT_EXPR:
12156 case POSTINCREMENT_EXPR:
12157 case CONVERT_EXPR:
12158 /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
12159 how to handle those cases. */
12160 wfl_op1 = TREE_OPERAND (node, 0);
12161 CAN_COMPLETE_NORMALLY (node) = 1;
12162 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12163 if (TREE_OPERAND (node, 0) == error_mark_node)
12164 return error_mark_node;
12165 node = patch_unaryop (node, wfl_op1);
12166 CAN_COMPLETE_NORMALLY (node) = 1;
12167 break;
12169 case ARRAY_REF:
12170 /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
12171 how to handle those cases. */
12172 wfl_op1 = TREE_OPERAND (node, 0);
12173 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12174 if (TREE_OPERAND (node, 0) == error_mark_node)
12175 return error_mark_node;
12176 if (!flag_emit_class_files && !flag_emit_xref)
12177 TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
12178 /* The same applies to wfl_op2 */
12179 wfl_op2 = TREE_OPERAND (node, 1);
12180 TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
12181 if (TREE_OPERAND (node, 1) == error_mark_node)
12182 return error_mark_node;
12183 if (!flag_emit_class_files && !flag_emit_xref)
12184 TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
12185 return patch_array_ref (node);
12187 case RECORD_TYPE:
12188 return node;;
12190 case COMPONENT_REF:
12191 /* The first step in the re-write of qualified name handling. FIXME.
12192 So far, this is only to support PRIMTYPE.class -> PRIMCLASS.TYPE. */
12193 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
12194 if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
12196 tree name = TREE_OPERAND (node, 1);
12197 tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
12198 if (field == NULL_TREE)
12200 error ("missing static field `%s'", IDENTIFIER_POINTER (name));
12201 return error_mark_node;
12203 if (! FIELD_STATIC (field))
12205 error ("not a static field `%s'", IDENTIFIER_POINTER (name));
12206 return error_mark_node;
12208 return field;
12210 else
12211 abort ();
12212 break;
12214 case THIS_EXPR:
12215 /* Can't use THIS in a static environment */
12216 if (!current_this)
12218 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12219 parse_error_context (wfl_operator,
12220 "Keyword `this' used outside allowed context");
12221 TREE_TYPE (node) = error_mark_node;
12222 return error_mark_node;
12224 if (ctxp->explicit_constructor_p)
12226 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12227 parse_error_context
12228 (wfl_operator, "Can't reference `this' or `super' before the superclass constructor has been called");
12229 TREE_TYPE (node) = error_mark_node;
12230 return error_mark_node;
12232 return current_this;
12234 case CLASS_LITERAL:
12235 CAN_COMPLETE_NORMALLY (node) = 1;
12236 node = patch_incomplete_class_ref (node);
12237 if (node == error_mark_node)
12238 return error_mark_node;
12239 break;
12241 default:
12242 CAN_COMPLETE_NORMALLY (node) = 1;
12243 /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
12244 and it's time to turn it into the appropriate String object */
12245 if ((nn = patch_string (node)))
12246 node = nn;
12247 else
12248 internal_error ("No case for %s", tree_code_name [TREE_CODE (node)]);
12250 return node;
12253 /* Complete function call's argument. Return a nonzero value is an
12254 error was found. */
12256 static int
12257 complete_function_arguments (tree node)
12259 int flag = 0;
12260 tree cn;
12262 ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12263 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
12265 tree wfl = TREE_VALUE (cn), parm, temp;
12266 parm = java_complete_tree (wfl);
12268 if (parm == error_mark_node)
12270 flag = 1;
12271 continue;
12273 /* If have a string literal that we haven't transformed yet or a
12274 crafted string buffer, as a result of use of the the String
12275 `+' operator. Build `parm.toString()' and expand it. */
12276 if ((temp = patch_string (parm)))
12277 parm = temp;
12279 TREE_VALUE (cn) = parm;
12281 ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12282 return flag;
12285 /* Sometimes (for loops and variable initialized during their
12286 declaration), we want to wrap a statement around a WFL and turn it
12287 debugable. */
12289 static tree
12290 build_debugable_stmt (int location, tree stmt)
12292 if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
12294 stmt = build_expr_wfl (stmt, input_filename, 0, 0);
12295 EXPR_WFL_LINECOL (stmt) = location;
12297 JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
12298 return stmt;
12301 static tree
12302 build_expr_block (tree body, tree decls)
12305 tree node = make_node (BLOCK);
12306 BLOCK_EXPR_DECLS (node) = decls;
12307 BLOCK_EXPR_BODY (node) = body;
12308 if (body)
12309 TREE_TYPE (node) = TREE_TYPE (body);
12310 TREE_SIDE_EFFECTS (node) = 1;
12311 return node;
12314 /* Create a new function block and link it appropriately to current
12315 function block chain */
12317 static tree
12318 enter_block (void)
12320 tree b = build_expr_block (NULL_TREE, NULL_TREE);
12322 /* Link block B supercontext to the previous block. The current
12323 function DECL is used as supercontext when enter_a_block is called
12324 for the first time for a given function. The current function body
12325 (DECL_FUNCTION_BODY) is set to be block B. */
12327 tree fndecl = current_function_decl;
12329 if (!fndecl) {
12330 BLOCK_SUPERCONTEXT (b) = current_static_block;
12331 current_static_block = b;
12334 else if (!DECL_FUNCTION_BODY (fndecl))
12336 BLOCK_SUPERCONTEXT (b) = fndecl;
12337 DECL_FUNCTION_BODY (fndecl) = b;
12339 else
12341 BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
12342 DECL_FUNCTION_BODY (fndecl) = b;
12344 return b;
12347 /* Exit a block by changing the current function body
12348 (DECL_FUNCTION_BODY) to the current block super context, only if
12349 the block being exited isn't the method's top level one. */
12351 static tree
12352 exit_block (void)
12354 tree b;
12355 if (current_function_decl)
12357 b = DECL_FUNCTION_BODY (current_function_decl);
12358 if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
12359 DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
12361 else
12363 b = current_static_block;
12365 if (BLOCK_SUPERCONTEXT (b))
12366 current_static_block = BLOCK_SUPERCONTEXT (b);
12368 return b;
12371 /* Lookup for NAME in the nested function's blocks, all the way up to
12372 the current toplevel one. It complies with Java's local variable
12373 scoping rules. */
12375 static tree
12376 lookup_name_in_blocks (tree name)
12378 tree b = GET_CURRENT_BLOCK (current_function_decl);
12380 while (b != current_function_decl)
12382 tree current;
12384 /* Paranoid sanity check. To be removed */
12385 if (TREE_CODE (b) != BLOCK)
12386 abort ();
12388 for (current = BLOCK_EXPR_DECLS (b); current;
12389 current = TREE_CHAIN (current))
12390 if (DECL_NAME (current) == name)
12391 return current;
12392 b = BLOCK_SUPERCONTEXT (b);
12394 return NULL_TREE;
12397 static void
12398 maybe_absorb_scoping_blocks (void)
12400 while (BLOCK_IS_IMPLICIT (GET_CURRENT_BLOCK (current_function_decl)))
12402 tree b = exit_block ();
12403 java_method_add_stmt (current_function_decl, b);
12404 SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", input_line));
12409 /* This section of the source is reserved to build_* functions that
12410 are building incomplete tree nodes and the patch_* functions that
12411 are completing them. */
12413 /* Wrap a non WFL node around a WFL. */
12415 static tree
12416 build_wfl_wrap (tree node, int location)
12418 tree wfl, node_to_insert = node;
12420 /* We want to process THIS . xxx symbolically, to keep it consistent
12421 with the way we're processing SUPER. A THIS from a primary as a
12422 different form than a SUPER. Turn THIS into something symbolic */
12423 if (TREE_CODE (node) == THIS_EXPR)
12424 node_to_insert = wfl = build_wfl_node (this_identifier_node);
12425 else
12426 wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
12428 EXPR_WFL_LINECOL (wfl) = location;
12429 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
12430 return wfl;
12433 /* Build a super() constructor invocation. Returns empty_stmt_node if
12434 we're currently dealing with the class java.lang.Object. */
12436 static tree
12437 build_super_invocation (tree mdecl)
12439 if (DECL_CONTEXT (mdecl) == object_type_node)
12440 return empty_stmt_node;
12441 else
12443 tree super_wfl = build_wfl_node (super_identifier_node);
12444 tree a = NULL_TREE, t;
12445 /* If we're dealing with an anonymous class, pass the arguments
12446 of the crafted constructor along. */
12447 if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
12449 SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
12450 for (; t != end_params_node; t = TREE_CHAIN (t))
12451 a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
12453 return build_method_invocation (super_wfl, a);
12457 /* Build a SUPER/THIS qualified method invocation. */
12459 static tree
12460 build_this_super_qualified_invocation (int use_this, tree name, tree args,
12461 int lloc, int rloc)
12463 tree invok;
12464 tree wfl =
12465 build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
12466 EXPR_WFL_LINECOL (wfl) = lloc;
12467 invok = build_method_invocation (name, args);
12468 return make_qualified_primary (wfl, invok, rloc);
12471 /* Build an incomplete CALL_EXPR node. */
12473 static tree
12474 build_method_invocation (tree name, tree args)
12476 tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
12477 TREE_SIDE_EFFECTS (call) = 1;
12478 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12479 return call;
12482 /* Build an incomplete new xxx(...) node. */
12484 static tree
12485 build_new_invocation (tree name, tree args)
12487 tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
12488 TREE_SIDE_EFFECTS (call) = 1;
12489 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12490 return call;
12493 /* Build an incomplete assignment expression. */
12495 static tree
12496 build_assignment (int op, int op_location, tree lhs, tree rhs)
12498 tree assignment;
12499 /* Build the corresponding binop if we deal with a Compound
12500 Assignment operator. Mark the binop sub-tree as part of a
12501 Compound Assignment expression */
12502 if (op != ASSIGN_TK)
12504 rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
12505 COMPOUND_ASSIGN_P (rhs) = 1;
12507 assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
12508 TREE_SIDE_EFFECTS (assignment) = 1;
12509 EXPR_WFL_LINECOL (assignment) = op_location;
12510 return assignment;
12513 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12514 the buffer. This is used only for string conversion. */
12515 static char *
12516 string_convert_int_cst (tree node)
12518 /* Long.MIN_VALUE is -9223372036854775808, 20 characters. */
12519 static char buffer[21];
12521 unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
12522 unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
12523 char *p = buffer + sizeof (buffer);
12524 int neg = 0;
12526 unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
12527 << (HOST_BITS_PER_WIDE_INT - 1));
12529 *--p = '\0';
12531 /* If negative, note the fact and negate the value. */
12532 if ((hi & hibit))
12534 lo = ~lo;
12535 hi = ~hi;
12536 if (++lo == 0)
12537 ++hi;
12538 neg = 1;
12541 /* Divide by 10 until there are no bits left. */
12544 unsigned HOST_WIDE_INT acc = 0;
12545 unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
12546 unsigned int i;
12548 /* Use long division to compute the result and the remainder. */
12549 for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
12551 /* Shift a bit into accumulator. */
12552 acc <<= 1;
12553 if ((hi & hibit))
12554 acc |= 1;
12556 /* Shift the value. */
12557 hi <<= 1;
12558 if ((lo & hibit))
12559 hi |= 1;
12560 lo <<= 1;
12562 /* Shift the correct bit into the result. */
12563 outhi <<= 1;
12564 if ((outlo & hibit))
12565 outhi |= 1;
12566 outlo <<= 1;
12567 if (acc >= 10)
12569 acc -= 10;
12570 outlo |= 1;
12574 /* '0' == 060 in Java, but might not be here (think EBCDIC). */
12575 *--p = '\060' + acc;
12577 hi = outhi;
12578 lo = outlo;
12580 while (hi || lo);
12582 if (neg)
12583 *--p = '\055'; /* '-' == 055 in Java, but might not be here. */
12585 return p;
12588 /* Print an INTEGER_CST node in a static buffer, and return the
12589 buffer. This is used only for error handling. */
12590 char *
12591 print_int_node (tree node)
12593 static char buffer [80];
12594 if (TREE_CONSTANT_OVERFLOW (node))
12595 sprintf (buffer, "<overflow>");
12597 if (TREE_INT_CST_HIGH (node) == 0)
12598 sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
12599 TREE_INT_CST_LOW (node));
12600 else if (TREE_INT_CST_HIGH (node) == -1
12601 && TREE_INT_CST_LOW (node) != 0)
12602 sprintf (buffer, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
12603 -TREE_INT_CST_LOW (node));
12604 else
12605 sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
12606 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
12608 return buffer;
12612 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12613 context. */
12615 /* 15.25 Assignment operators. */
12617 static tree
12618 patch_assignment (tree node, tree wfl_op1)
12620 tree rhs = TREE_OPERAND (node, 1);
12621 tree lvalue = TREE_OPERAND (node, 0), llvalue;
12622 tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
12623 int error_found = 0;
12624 int lvalue_from_array = 0;
12625 int is_return = 0;
12627 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12629 /* Lhs can be a named variable */
12630 if (JDECL_P (lvalue))
12632 lhs_type = TREE_TYPE (lvalue);
12634 /* Or Lhs can be an array access. */
12635 else if (TREE_CODE (lvalue) == ARRAY_REF)
12637 lhs_type = TREE_TYPE (lvalue);
12638 lvalue_from_array = 1;
12640 /* Or a field access */
12641 else if (TREE_CODE (lvalue) == COMPONENT_REF)
12642 lhs_type = TREE_TYPE (lvalue);
12643 /* Or a function return slot */
12644 else if (TREE_CODE (lvalue) == RESULT_DECL)
12646 /* If the return type is an integral type, then we create the
12647 RESULT_DECL with a promoted type, but we need to do these
12648 checks against the unpromoted type to ensure type safety. So
12649 here we look at the real type, not the type of the decl we
12650 are modifying. */
12651 lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
12652 is_return = 1;
12654 /* Otherwise, we might want to try to write into an optimized static
12655 final, this is an of a different nature, reported further on. */
12656 else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
12657 && resolve_expression_name (wfl_op1, &llvalue))
12659 lhs_type = TREE_TYPE (lvalue);
12661 else
12663 parse_error_context (wfl_op1, "Invalid left hand side of assignment");
12664 error_found = 1;
12667 rhs_type = TREE_TYPE (rhs);
12669 /* 5.1 Try the assignment conversion for builtin type. */
12670 new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
12672 /* 5.2 If it failed, try a reference conversion */
12673 if (!new_rhs)
12674 new_rhs = try_reference_assignconv (lhs_type, rhs);
12676 /* 15.25.2 If we have a compound assignment, convert RHS into the
12677 type of the LHS */
12678 else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12679 new_rhs = convert (lhs_type, rhs);
12681 /* Explicit cast required. This is an error */
12682 if (!new_rhs)
12684 char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
12685 char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
12686 tree wfl;
12687 char operation [32]; /* Max size known */
12689 /* If the assignment is part of a declaration, we use the WFL of
12690 the declared variable to point out the error and call it a
12691 declaration problem. If the assignment is a genuine =
12692 operator, we call is a operator `=' problem, otherwise we
12693 call it an assignment problem. In both of these last cases,
12694 we use the WFL of the operator to indicate the error. */
12696 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
12698 wfl = wfl_op1;
12699 strcpy (operation, "declaration");
12701 else
12703 wfl = wfl_operator;
12704 if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12705 strcpy (operation, "assignment");
12706 else if (is_return)
12707 strcpy (operation, "`return'");
12708 else
12709 strcpy (operation, "`='");
12712 if (!valid_cast_to_p (rhs_type, lhs_type))
12713 parse_error_context
12714 (wfl, "Incompatible type for %s. Can't convert `%s' to `%s'",
12715 operation, t1, t2);
12716 else
12717 parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert `%s' to `%s'",
12718 operation, t1, t2);
12719 free (t1); free (t2);
12720 error_found = 1;
12723 if (error_found)
12724 return error_mark_node;
12726 /* If we're processing a `return' statement, promote the actual type
12727 to the promoted type. */
12728 if (is_return)
12729 new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
12731 /* 10.10: Array Store Exception runtime check */
12732 if (!flag_emit_class_files
12733 && !flag_emit_xref
12734 && lvalue_from_array
12735 && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
12737 tree array, store_check, base, index_expr;
12739 /* Save RHS so that it doesn't get re-evaluated by the store check. */
12740 new_rhs = save_expr (new_rhs);
12742 /* Get the INDIRECT_REF. */
12743 array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
12744 /* Get the array pointer expr. */
12745 array = TREE_OPERAND (array, 0);
12746 store_check = build_java_arraystore_check (array, new_rhs);
12748 index_expr = TREE_OPERAND (lvalue, 1);
12750 if (TREE_CODE (index_expr) == COMPOUND_EXPR)
12752 /* A COMPOUND_EXPR here is a bounds check. The bounds check must
12753 happen before the store check, so prepare to insert the store
12754 check within the second operand of the existing COMPOUND_EXPR. */
12755 base = index_expr;
12757 else
12758 base = lvalue;
12760 index_expr = TREE_OPERAND (base, 1);
12761 TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr),
12762 store_check, index_expr);
12765 /* Final locals can be used as case values in switch
12766 statement. Prepare them for this eventuality. */
12767 if (TREE_CODE (lvalue) == VAR_DECL
12768 && DECL_FINAL (lvalue)
12769 && TREE_CONSTANT (new_rhs)
12770 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
12771 && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
12774 TREE_CONSTANT (lvalue) = 1;
12775 DECL_INITIAL (lvalue) = new_rhs;
12778 /* Copy the rhs if it's a reference. */
12779 if (! flag_check_references && ! flag_emit_class_files && optimize > 0)
12781 switch (TREE_CODE (new_rhs))
12783 case ARRAY_REF:
12784 case INDIRECT_REF:
12785 case COMPONENT_REF:
12786 /* Transform a = foo.bar
12787 into a = { int tmp; tmp = foo.bar; tmp; ).
12788 We need to ensure that if a read from memory fails
12789 because of a NullPointerException, a destination variable
12790 will remain unchanged. An explicit temporary does what
12791 we need.
12793 If flag_check_references is set, this is unnecessary
12794 because we'll check each reference before doing any
12795 reads. If optimize is not set the result will never be
12796 written to a stack slot that contains the LHS. */
12798 tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"),
12799 TREE_TYPE (new_rhs));
12800 tree block = make_node (BLOCK);
12801 tree assignment
12802 = build (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
12803 DECL_CONTEXT (tmp) = current_function_decl;
12804 TREE_TYPE (block) = TREE_TYPE (new_rhs);
12805 BLOCK_VARS (block) = tmp;
12806 BLOCK_EXPR_BODY (block)
12807 = build (COMPOUND_EXPR, TREE_TYPE (new_rhs), assignment, tmp);
12808 TREE_SIDE_EFFECTS (block) = 1;
12809 new_rhs = block;
12811 break;
12812 default:
12813 break;
12817 TREE_OPERAND (node, 0) = lvalue;
12818 TREE_OPERAND (node, 1) = new_rhs;
12819 TREE_TYPE (node) = lhs_type;
12820 return node;
12823 /* Check that type SOURCE can be cast into type DEST. If the cast
12824 can't occur at all, return NULL; otherwise, return a possibly
12825 modified rhs. */
12827 static tree
12828 try_reference_assignconv (tree lhs_type, tree rhs)
12830 tree new_rhs = NULL_TREE;
12831 tree rhs_type = TREE_TYPE (rhs);
12833 if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
12835 /* `null' may be assigned to any reference type */
12836 if (rhs == null_pointer_node)
12837 new_rhs = null_pointer_node;
12838 /* Try the reference assignment conversion */
12839 else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
12840 new_rhs = rhs;
12841 /* This is a magic assignment that we process differently */
12842 else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
12843 new_rhs = rhs;
12845 return new_rhs;
12848 /* Check that RHS can be converted into LHS_TYPE by the assignment
12849 conversion (5.2), for the cases of RHS being a builtin type. Return
12850 NULL_TREE if the conversion fails or if because RHS isn't of a
12851 builtin type. Return a converted RHS if the conversion is possible. */
12853 static tree
12854 try_builtin_assignconv (tree wfl_op1, tree lhs_type, tree rhs)
12856 tree new_rhs = NULL_TREE;
12857 tree rhs_type = TREE_TYPE (rhs);
12859 /* Handle boolean specially. */
12860 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12861 || TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12863 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12864 && TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12865 new_rhs = rhs;
12868 /* 5.1.1 Try Identity Conversion,
12869 5.1.2 Try Widening Primitive Conversion */
12870 else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
12871 new_rhs = convert (lhs_type, rhs);
12873 /* Try a narrowing primitive conversion (5.1.3):
12874 - expression is a constant expression of type byte, short, char,
12875 or int, AND
12876 - variable is byte, short or char AND
12877 - The value of the expression is representable in the type of the
12878 variable */
12879 else if ((rhs_type == byte_type_node || rhs_type == short_type_node
12880 || rhs_type == char_type_node || rhs_type == int_type_node)
12881 && TREE_CONSTANT (rhs)
12882 && (lhs_type == byte_type_node || lhs_type == char_type_node
12883 || lhs_type == short_type_node))
12885 if (int_fits_type_p (rhs, lhs_type))
12886 new_rhs = convert (lhs_type, rhs);
12887 else if (wfl_op1) /* Might be called with a NULL */
12888 parse_warning_context
12889 (wfl_op1, "Constant expression `%s' too wide for narrowing primitive conversion to `%s'",
12890 print_int_node (rhs), lang_printable_name (lhs_type, 0));
12891 /* Reported a warning that will turn into an error further
12892 down, so we don't return */
12895 return new_rhs;
12898 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
12899 conversion (5.1.1) or widening primitive conversion (5.1.2). Return
12900 0 is the conversion test fails. This implements parts the method
12901 invocation conversion (5.3). */
12903 static int
12904 valid_builtin_assignconv_identity_widening_p (tree lhs_type, tree rhs_type)
12906 /* 5.1.1: This is the identity conversion part. */
12907 if (lhs_type == rhs_type)
12908 return 1;
12910 /* Reject non primitive types and boolean conversions. */
12911 if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
12912 return 0;
12914 /* 5.1.2: widening primitive conversion. byte, even if it's smaller
12915 than a char can't be converted into a char. Short can't too, but
12916 the < test below takes care of that */
12917 if (lhs_type == char_type_node && rhs_type == byte_type_node)
12918 return 0;
12920 /* Accept all promoted type here. Note, we can't use <= in the test
12921 below, because we still need to bounce out assignments of short
12922 to char and the likes */
12923 if (lhs_type == int_type_node
12924 && (rhs_type == promoted_byte_type_node
12925 || rhs_type == promoted_short_type_node
12926 || rhs_type == promoted_char_type_node
12927 || rhs_type == promoted_boolean_type_node))
12928 return 1;
12930 /* From here, an integral is widened if its precision is smaller
12931 than the precision of the LHS or if the LHS is a floating point
12932 type, or the RHS is a float and the RHS a double. */
12933 if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
12934 && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
12935 || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
12936 || (rhs_type == float_type_node && lhs_type == double_type_node))
12937 return 1;
12939 return 0;
12942 /* Check that something of SOURCE type can be assigned or cast to
12943 something of DEST type at runtime. Return 1 if the operation is
12944 valid, 0 otherwise. If CAST is set to 1, we're treating the case
12945 were SOURCE is cast into DEST, which borrows a lot of the
12946 assignment check. */
12948 static int
12949 valid_ref_assignconv_cast_p (tree source, tree dest, int cast)
12951 /* SOURCE or DEST might be null if not from a declared entity. */
12952 if (!source || !dest)
12953 return 0;
12954 if (JNULLP_TYPE_P (source))
12955 return 1;
12956 if (TREE_CODE (source) == POINTER_TYPE)
12957 source = TREE_TYPE (source);
12958 if (TREE_CODE (dest) == POINTER_TYPE)
12959 dest = TREE_TYPE (dest);
12961 /* If source and dest are being compiled from bytecode, they may need to
12962 be loaded. */
12963 if (CLASS_P (source) && !CLASS_LOADED_P (source))
12965 load_class (source, 1);
12966 safe_layout_class (source);
12968 if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
12970 load_class (dest, 1);
12971 safe_layout_class (dest);
12974 /* Case where SOURCE is a class type */
12975 if (TYPE_CLASS_P (source))
12977 if (TYPE_CLASS_P (dest))
12978 return (source == dest
12979 || inherits_from_p (source, dest)
12980 || (cast && inherits_from_p (dest, source)));
12981 if (TYPE_INTERFACE_P (dest))
12983 /* If doing a cast and SOURCE is final, the operation is
12984 always correct a compile time (because even if SOURCE
12985 does not implement DEST, a subclass of SOURCE might). */
12986 if (cast && !CLASS_FINAL (TYPE_NAME (source)))
12987 return 1;
12988 /* Otherwise, SOURCE must implement DEST */
12989 return interface_of_p (dest, source);
12991 /* DEST is an array, cast permitted if SOURCE is of Object type */
12992 return (cast && source == object_type_node ? 1 : 0);
12994 if (TYPE_INTERFACE_P (source))
12996 if (TYPE_CLASS_P (dest))
12998 /* If not casting, DEST must be the Object type */
12999 if (!cast)
13000 return dest == object_type_node;
13001 /* We're doing a cast. The cast is always valid is class
13002 DEST is not final, otherwise, DEST must implement SOURCE */
13003 else if (!CLASS_FINAL (TYPE_NAME (dest)))
13004 return 1;
13005 else
13006 return interface_of_p (source, dest);
13008 if (TYPE_INTERFACE_P (dest))
13010 /* If doing a cast, then if SOURCE and DEST contain method
13011 with the same signature but different return type, then
13012 this is a (compile time) error */
13013 if (cast)
13015 tree method_source, method_dest;
13016 tree source_type;
13017 tree source_sig;
13018 tree source_name;
13019 for (method_source = TYPE_METHODS (source); method_source;
13020 method_source = TREE_CHAIN (method_source))
13022 source_sig =
13023 build_java_argument_signature (TREE_TYPE (method_source));
13024 source_type = TREE_TYPE (TREE_TYPE (method_source));
13025 source_name = DECL_NAME (method_source);
13026 for (method_dest = TYPE_METHODS (dest);
13027 method_dest; method_dest = TREE_CHAIN (method_dest))
13028 if (source_sig ==
13029 build_java_argument_signature (TREE_TYPE (method_dest))
13030 && source_name == DECL_NAME (method_dest)
13031 && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
13032 return 0;
13034 return 1;
13036 else
13037 return source == dest || interface_of_p (dest, source);
13039 else
13041 /* Array */
13042 return (cast
13043 && (DECL_NAME (TYPE_NAME (source))
13044 == java_lang_cloneable_identifier_node
13045 || (DECL_NAME (TYPE_NAME (source))
13046 == java_io_serializable_identifier_node)));
13049 if (TYPE_ARRAY_P (source))
13051 if (TYPE_CLASS_P (dest))
13052 return dest == object_type_node;
13053 /* Can't cast an array to an interface unless the interface is
13054 java.lang.Cloneable or java.io.Serializable. */
13055 if (TYPE_INTERFACE_P (dest))
13056 return (DECL_NAME (TYPE_NAME (dest))
13057 == java_lang_cloneable_identifier_node
13058 || (DECL_NAME (TYPE_NAME (dest))
13059 == java_io_serializable_identifier_node));
13060 else /* Arrays */
13062 tree source_element_type = TYPE_ARRAY_ELEMENT (source);
13063 tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
13065 /* In case of severe errors, they turn out null */
13066 if (!dest_element_type || !source_element_type)
13067 return 0;
13068 if (source_element_type == dest_element_type)
13069 return 1;
13070 return valid_ref_assignconv_cast_p (source_element_type,
13071 dest_element_type, cast);
13073 return 0;
13075 return 0;
13078 static int
13079 valid_cast_to_p (tree source, tree dest)
13081 if (TREE_CODE (source) == POINTER_TYPE)
13082 source = TREE_TYPE (source);
13083 if (TREE_CODE (dest) == POINTER_TYPE)
13084 dest = TREE_TYPE (dest);
13086 if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
13087 return valid_ref_assignconv_cast_p (source, dest, 1);
13089 else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
13090 return 1;
13092 else if (TREE_CODE (source) == BOOLEAN_TYPE
13093 && TREE_CODE (dest) == BOOLEAN_TYPE)
13094 return 1;
13096 return 0;
13099 static tree
13100 do_unary_numeric_promotion (tree arg)
13102 tree type = TREE_TYPE (arg);
13103 if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
13104 || TREE_CODE (type) == CHAR_TYPE)
13105 arg = convert (int_type_node, arg);
13106 return arg;
13109 /* Return a nonzero value if SOURCE can be converted into DEST using
13110 the method invocation conversion rule (5.3). */
13111 static int
13112 valid_method_invocation_conversion_p (tree dest, tree source)
13114 return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
13115 && valid_builtin_assignconv_identity_widening_p (dest, source))
13116 || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
13117 && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
13118 && valid_ref_assignconv_cast_p (source, dest, 0)));
13121 /* Build an incomplete binop expression. */
13123 static tree
13124 build_binop (enum tree_code op, int op_location, tree op1, tree op2)
13126 tree binop = build (op, NULL_TREE, op1, op2);
13127 TREE_SIDE_EFFECTS (binop) = 1;
13128 /* Store the location of the operator, for better error report. The
13129 string of the operator will be rebuild based on the OP value. */
13130 EXPR_WFL_LINECOL (binop) = op_location;
13131 return binop;
13134 /* Build the string of the operator retained by NODE. If NODE is part
13135 of a compound expression, add an '=' at the end of the string. This
13136 function is called when an error needs to be reported on an
13137 operator. The string is returned as a pointer to a static character
13138 buffer. */
13140 static char *
13141 operator_string (tree node)
13143 #define BUILD_OPERATOR_STRING(S) \
13145 sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
13146 return buffer; \
13149 static char buffer [10];
13150 switch (TREE_CODE (node))
13152 case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
13153 case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
13154 case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
13155 case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13156 case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
13157 case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
13158 case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
13159 case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
13160 case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
13161 case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
13162 case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
13163 case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
13164 case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
13165 case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
13166 case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
13167 case GT_EXPR: BUILD_OPERATOR_STRING (">");
13168 case GE_EXPR: BUILD_OPERATOR_STRING (">=");
13169 case LT_EXPR: BUILD_OPERATOR_STRING ("<");
13170 case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
13171 case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13172 case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
13173 case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
13174 case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
13175 case PREINCREMENT_EXPR: /* Fall through */
13176 case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
13177 case PREDECREMENT_EXPR: /* Fall through */
13178 case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
13179 default:
13180 internal_error ("unregistered operator %s",
13181 tree_code_name [TREE_CODE (node)]);
13183 return NULL;
13184 #undef BUILD_OPERATOR_STRING
13187 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2. */
13189 static int
13190 java_decl_equiv (tree var_acc1, tree var_acc2)
13192 if (JDECL_P (var_acc1))
13193 return (var_acc1 == var_acc2);
13195 return (TREE_CODE (var_acc1) == COMPONENT_REF
13196 && TREE_CODE (var_acc2) == COMPONENT_REF
13197 && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
13198 == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
13199 && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
13202 /* Return a nonzero value if CODE is one of the operators that can be
13203 used in conjunction with the `=' operator in a compound assignment. */
13205 static int
13206 binop_compound_p (enum tree_code code)
13208 int i;
13209 for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
13210 if (binop_lookup [i] == code)
13211 break;
13213 return i < BINOP_COMPOUND_CANDIDATES;
13216 /* Reorganize after a fold to get SAVE_EXPR to generate what we want. */
13218 static tree
13219 java_refold (tree t)
13221 tree c, b, ns, decl;
13223 if (TREE_CODE (t) != MODIFY_EXPR)
13224 return t;
13226 c = TREE_OPERAND (t, 1);
13227 if (! (c && TREE_CODE (c) == COMPOUND_EXPR
13228 && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
13229 && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
13230 return t;
13232 /* Now the left branch of the binary operator. */
13233 b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
13234 if (! (b && TREE_CODE (b) == NOP_EXPR
13235 && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
13236 return t;
13238 ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
13239 if (! (ns && TREE_CODE (ns) == NOP_EXPR
13240 && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
13241 return t;
13243 decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
13244 if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
13245 /* It's got to be the an equivalent decl */
13246 && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
13248 /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13249 TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
13250 /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13251 TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
13252 /* Change the right part of the BINOP_EXPR */
13253 TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
13256 return t;
13259 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13260 errors but we modify NODE so that it contains the type computed
13261 according to the expression, when it's fixed. Otherwise, we write
13262 error_mark_node as the type. It allows us to further the analysis
13263 of remaining nodes and detects more errors in certain cases. */
13265 static tree
13266 patch_binop (tree node, tree wfl_op1, tree wfl_op2)
13268 tree op1 = TREE_OPERAND (node, 0);
13269 tree op2 = TREE_OPERAND (node, 1);
13270 tree op1_type = TREE_TYPE (op1);
13271 tree op2_type = TREE_TYPE (op2);
13272 tree prom_type = NULL_TREE, cn;
13273 enum tree_code code = TREE_CODE (node);
13275 /* If 1, tell the routine that we have to return error_mark_node
13276 after checking for the initialization of the RHS */
13277 int error_found = 0;
13279 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13281 /* If either op<n>_type are NULL, this might be early signs of an
13282 error situation, unless it's too early to tell (in case we're
13283 handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13284 correctly so the error can be later on reported accurately. */
13285 if (! (code == PLUS_EXPR || code == NE_EXPR
13286 || code == EQ_EXPR || code == INSTANCEOF_EXPR))
13288 tree n;
13289 if (! op1_type)
13291 n = java_complete_tree (op1);
13292 op1_type = TREE_TYPE (n);
13294 if (! op2_type)
13296 n = java_complete_tree (op2);
13297 op2_type = TREE_TYPE (n);
13301 switch (code)
13303 /* 15.16 Multiplicative operators */
13304 case MULT_EXPR: /* 15.16.1 Multiplication Operator * */
13305 case RDIV_EXPR: /* 15.16.2 Division Operator / */
13306 case TRUNC_DIV_EXPR: /* 15.16.2 Integral type Division Operator / */
13307 case TRUNC_MOD_EXPR: /* 15.16.3 Remainder operator % */
13308 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13310 if (!JNUMERIC_TYPE_P (op1_type))
13311 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13312 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13313 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13314 TREE_TYPE (node) = error_mark_node;
13315 error_found = 1;
13316 break;
13318 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13320 /* Detect integral division by zero */
13321 if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
13322 && TREE_CODE (prom_type) == INTEGER_TYPE
13323 && (op2 == integer_zero_node || op2 == long_zero_node ||
13324 (TREE_CODE (op2) == INTEGER_CST &&
13325 ! TREE_INT_CST_LOW (op2) && ! TREE_INT_CST_HIGH (op2))))
13327 parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown");
13328 TREE_CONSTANT (node) = 0;
13331 /* Change the division operator if necessary */
13332 if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
13333 TREE_SET_CODE (node, TRUNC_DIV_EXPR);
13335 /* Before divisions as is disappear, try to simplify and bail if
13336 applicable, otherwise we won't perform even simple
13337 simplifications like (1-1)/3. We can't do that with floating
13338 point number, folds can't handle them at this stage. */
13339 if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
13340 && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
13342 TREE_TYPE (node) = prom_type;
13343 node = fold (node);
13344 if (TREE_CODE (node) != code)
13345 return node;
13348 if (TREE_CODE (prom_type) == INTEGER_TYPE
13349 && flag_use_divide_subroutine
13350 && ! flag_emit_class_files
13351 && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
13352 return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
13354 /* This one is more complicated. FLOATs are processed by a
13355 function call to soft_fmod. Duplicate the value of the
13356 COMPOUND_ASSIGN_P flag. */
13357 if (code == TRUNC_MOD_EXPR)
13359 tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
13360 COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
13361 TREE_SIDE_EFFECTS (mod)
13362 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13363 return mod;
13365 break;
13367 /* 15.17 Additive Operators */
13368 case PLUS_EXPR: /* 15.17.1 String Concatenation Operator + */
13370 /* Operation is valid if either one argument is a string
13371 constant, a String object or a StringBuffer crafted for the
13372 purpose of the a previous usage of the String concatenation
13373 operator */
13375 if (TREE_CODE (op1) == STRING_CST
13376 || TREE_CODE (op2) == STRING_CST
13377 || JSTRING_TYPE_P (op1_type)
13378 || JSTRING_TYPE_P (op2_type)
13379 || IS_CRAFTED_STRING_BUFFER_P (op1)
13380 || IS_CRAFTED_STRING_BUFFER_P (op2))
13381 return build_string_concatenation (op1, op2);
13383 case MINUS_EXPR: /* 15.17.2 Additive Operators (+ and -) for
13384 Numeric Types */
13385 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13387 if (!JNUMERIC_TYPE_P (op1_type))
13388 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13389 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13390 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13391 TREE_TYPE (node) = error_mark_node;
13392 error_found = 1;
13393 break;
13395 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13396 break;
13398 /* 15.18 Shift Operators */
13399 case LSHIFT_EXPR:
13400 case RSHIFT_EXPR:
13401 case URSHIFT_EXPR:
13402 if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
13404 if (!JINTEGRAL_TYPE_P (op1_type))
13405 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13406 else
13408 if (JNUMERIC_TYPE_P (op2_type))
13409 parse_error_context (wfl_operator,
13410 "Incompatible type for `%s'. Explicit cast needed to convert shift distance from `%s' to integral",
13411 operator_string (node),
13412 lang_printable_name (op2_type, 0));
13413 else
13414 parse_error_context (wfl_operator,
13415 "Incompatible type for `%s'. Can't convert shift distance from `%s' to integral",
13416 operator_string (node),
13417 lang_printable_name (op2_type, 0));
13419 TREE_TYPE (node) = error_mark_node;
13420 error_found = 1;
13421 break;
13424 /* Unary numeric promotion (5.6.1) is performed on each operand
13425 separately */
13426 op1 = do_unary_numeric_promotion (op1);
13427 op2 = do_unary_numeric_promotion (op2);
13429 /* If the right hand side is of type `long', first cast it to
13430 `int'. */
13431 if (TREE_TYPE (op2) == long_type_node)
13432 op2 = build1 (CONVERT_EXPR, int_type_node, op2);
13434 /* The type of the shift expression is the type of the promoted
13435 type of the left-hand operand */
13436 prom_type = TREE_TYPE (op1);
13438 /* Shift int only up to 0x1f and long up to 0x3f */
13439 if (prom_type == int_type_node)
13440 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13441 build_int_2 (0x1f, 0)));
13442 else
13443 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13444 build_int_2 (0x3f, 0)));
13446 /* The >>> operator is a >> operating on unsigned quantities */
13447 if (code == URSHIFT_EXPR && ! flag_emit_class_files)
13449 tree to_return;
13450 tree utype = java_unsigned_type (prom_type);
13451 op1 = convert (utype, op1);
13452 TREE_SET_CODE (node, RSHIFT_EXPR);
13453 TREE_OPERAND (node, 0) = op1;
13454 TREE_OPERAND (node, 1) = op2;
13455 TREE_TYPE (node) = utype;
13456 to_return = convert (prom_type, node);
13457 /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13458 COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
13459 TREE_SIDE_EFFECTS (to_return)
13460 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13461 return to_return;
13463 break;
13465 /* 15.19.1 Type Comparison Operator instanceof */
13466 case INSTANCEOF_EXPR:
13468 TREE_TYPE (node) = boolean_type_node;
13470 /* OP1_TYPE might be NULL when OP1 is a string constant. */
13471 if ((cn = patch_string (op1)))
13473 op1 = cn;
13474 op1_type = TREE_TYPE (op1);
13476 if (op1_type == NULL_TREE)
13477 abort ();
13479 if (!(op2_type = resolve_type_during_patch (op2)))
13480 return error_mark_node;
13482 /* The first operand must be a reference type or the null type */
13483 if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
13484 error_found = 1; /* Error reported further below */
13486 /* The second operand must be a reference type */
13487 if (!JREFERENCE_TYPE_P (op2_type))
13489 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
13490 parse_error_context
13491 (wfl_operator, "Invalid argument `%s' for `instanceof'",
13492 lang_printable_name (op2_type, 0));
13493 error_found = 1;
13496 if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
13498 /* If the first operand is null, the result is always false */
13499 if (op1 == null_pointer_node)
13500 return boolean_false_node;
13501 else if (flag_emit_class_files)
13503 TREE_OPERAND (node, 1) = op2_type;
13504 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
13505 return node;
13507 /* Otherwise we have to invoke instance of to figure it out */
13508 else
13509 return build_instanceof (op1, op2_type);
13511 /* There is no way the expression operand can be an instance of
13512 the type operand. This is a compile time error. */
13513 else
13515 char *t1 = xstrdup (lang_printable_name (op1_type, 0));
13516 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
13517 parse_error_context
13518 (wfl_operator, "Impossible for `%s' to be instance of `%s'",
13519 t1, lang_printable_name (op2_type, 0));
13520 free (t1);
13521 error_found = 1;
13524 break;
13526 /* 15.21 Bitwise and Logical Operators */
13527 case BIT_AND_EXPR:
13528 case BIT_XOR_EXPR:
13529 case BIT_IOR_EXPR:
13530 if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
13531 /* Binary numeric promotion is performed on both operand and the
13532 expression retain that type */
13533 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13535 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
13536 && TREE_CODE (op1_type) == BOOLEAN_TYPE)
13537 /* The type of the bitwise operator expression is BOOLEAN */
13538 prom_type = boolean_type_node;
13539 else
13541 if (!JINTEGRAL_TYPE_P (op1_type))
13542 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13543 if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
13544 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
13545 TREE_TYPE (node) = error_mark_node;
13546 error_found = 1;
13547 /* Insert a break here if adding thing before the switch's
13548 break for this case */
13550 break;
13552 /* 15.22 Conditional-And Operator */
13553 case TRUTH_ANDIF_EXPR:
13554 /* 15.23 Conditional-Or Operator */
13555 case TRUTH_ORIF_EXPR:
13556 /* Operands must be of BOOLEAN type */
13557 if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
13558 TREE_CODE (op2_type) != BOOLEAN_TYPE)
13560 if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
13561 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
13562 if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
13563 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
13564 TREE_TYPE (node) = boolean_type_node;
13565 error_found = 1;
13566 break;
13568 else if (integer_zerop (op1))
13570 return code == TRUTH_ANDIF_EXPR ? op1 : op2;
13572 else if (integer_onep (op1))
13574 return code == TRUTH_ANDIF_EXPR ? op2 : op1;
13576 /* The type of the conditional operators is BOOLEAN */
13577 prom_type = boolean_type_node;
13578 break;
13580 /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13581 case LT_EXPR:
13582 case GT_EXPR:
13583 case LE_EXPR:
13584 case GE_EXPR:
13585 /* The type of each of the operands must be a primitive numeric
13586 type */
13587 if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
13589 if (!JNUMERIC_TYPE_P (op1_type))
13590 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13591 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13592 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13593 TREE_TYPE (node) = boolean_type_node;
13594 error_found = 1;
13595 break;
13597 /* Binary numeric promotion is performed on the operands */
13598 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13599 /* The type of the relation expression is always BOOLEAN */
13600 prom_type = boolean_type_node;
13601 break;
13603 /* 15.20 Equality Operator */
13604 case EQ_EXPR:
13605 case NE_EXPR:
13606 /* It's time for us to patch the strings. */
13607 if ((cn = patch_string (op1)))
13609 op1 = cn;
13610 op1_type = TREE_TYPE (op1);
13612 if ((cn = patch_string (op2)))
13614 op2 = cn;
13615 op2_type = TREE_TYPE (op2);
13618 /* 15.20.1 Numerical Equality Operators == and != */
13619 /* Binary numeric promotion is performed on the operands */
13620 if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
13621 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13623 /* 15.20.2 Boolean Equality Operators == and != */
13624 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
13625 TREE_CODE (op2_type) == BOOLEAN_TYPE)
13626 ; /* Nothing to do here */
13628 /* 15.20.3 Reference Equality Operators == and != */
13629 /* Types have to be either references or the null type. If
13630 they're references, it must be possible to convert either
13631 type to the other by casting conversion. */
13632 else if (op1 == null_pointer_node || op2 == null_pointer_node
13633 || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
13634 && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
13635 || valid_ref_assignconv_cast_p (op2_type,
13636 op1_type, 1))))
13637 ; /* Nothing to do here */
13639 /* Else we have an error figure what can't be converted into
13640 what and report the error */
13641 else
13643 char *t1;
13644 t1 = xstrdup (lang_printable_name (op1_type, 0));
13645 parse_error_context
13646 (wfl_operator,
13647 "Incompatible type for `%s'. Can't convert `%s' to `%s'",
13648 operator_string (node), t1,
13649 lang_printable_name (op2_type, 0));
13650 free (t1);
13651 TREE_TYPE (node) = boolean_type_node;
13652 error_found = 1;
13653 break;
13655 prom_type = boolean_type_node;
13656 break;
13657 default:
13658 abort ();
13661 if (error_found)
13662 return error_mark_node;
13664 TREE_OPERAND (node, 0) = op1;
13665 TREE_OPERAND (node, 1) = op2;
13666 TREE_TYPE (node) = prom_type;
13667 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13669 if (flag_emit_xref)
13670 return node;
13672 /* fold does not respect side-effect order as required for Java but not C.
13673 * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13674 * bytecode.
13676 if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
13677 : ! TREE_SIDE_EFFECTS (node))
13678 node = fold (node);
13679 return node;
13682 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13683 zero value, the value of CSTE comes after the valude of STRING */
13685 static tree
13686 do_merge_string_cste (tree cste, const char *string, int string_len, int after)
13688 const char *old = TREE_STRING_POINTER (cste);
13689 int old_len = TREE_STRING_LENGTH (cste);
13690 int len = old_len + string_len;
13691 char *new = alloca (len+1);
13693 if (after)
13695 memcpy (new, string, string_len);
13696 memcpy (&new [string_len], old, old_len);
13698 else
13700 memcpy (new, old, old_len);
13701 memcpy (&new [old_len], string, string_len);
13703 new [len] = '\0';
13704 return build_string (len, new);
13707 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13708 new STRING_CST on success, NULL_TREE on failure. */
13710 static tree
13711 merge_string_cste (tree op1, tree op2, int after)
13713 /* Handle two string constants right away. */
13714 if (TREE_CODE (op2) == STRING_CST)
13715 return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
13716 TREE_STRING_LENGTH (op2), after);
13718 /* Reasonable integer constant can be treated right away. */
13719 if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
13721 static const char *const boolean_true = "true";
13722 static const char *const boolean_false = "false";
13723 static const char *const null_pointer = "null";
13724 char ch[4];
13725 const char *string;
13727 if (op2 == boolean_true_node)
13728 string = boolean_true;
13729 else if (op2 == boolean_false_node)
13730 string = boolean_false;
13731 else if (op2 == null_pointer_node
13732 || (integer_zerop (op2)
13733 && TREE_CODE (TREE_TYPE (op2)) == POINTER_TYPE))
13734 /* FIXME: null is not a compile-time constant, so it is only safe to
13735 merge if the overall expression is non-constant. However, this
13736 code always merges without checking the overall expression. */
13737 string = null_pointer;
13738 else if (TREE_TYPE (op2) == char_type_node)
13740 /* Convert the character into UTF-8. */
13741 unsigned int c = (unsigned int) TREE_INT_CST_LOW (op2);
13742 unsigned char *p = (unsigned char *) ch;
13743 if (0x01 <= c && c <= 0x7f)
13744 *p++ = (unsigned char) c;
13745 else if (c < 0x7ff)
13747 *p++ = (unsigned char) (c >> 6 | 0xc0);
13748 *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13750 else
13752 *p++ = (unsigned char) (c >> 12 | 0xe0);
13753 *p++ = (unsigned char) (((c >> 6) & 0x3f) | 0x80);
13754 *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13756 *p = '\0';
13758 string = ch;
13760 else
13761 string = string_convert_int_cst (op2);
13763 return do_merge_string_cste (op1, string, strlen (string), after);
13765 return NULL_TREE;
13768 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
13769 has to be a STRING_CST and the other part must be a STRING_CST or a
13770 INTEGRAL constant. Return a new STRING_CST if the operation
13771 succeed, NULL_TREE otherwise.
13773 If the case we want to optimize for space, we might want to return
13774 NULL_TREE for each invocation of this routine. FIXME */
13776 static tree
13777 string_constant_concatenation (tree op1, tree op2)
13779 if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
13781 tree string, rest;
13782 int invert;
13784 string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
13785 rest = (string == op1 ? op2 : op1);
13786 invert = (string == op1 ? 0 : 1 );
13788 /* Walk REST, only if it looks reasonable */
13789 if (TREE_CODE (rest) != STRING_CST
13790 && !IS_CRAFTED_STRING_BUFFER_P (rest)
13791 && !JSTRING_TYPE_P (TREE_TYPE (rest))
13792 && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
13794 rest = java_complete_tree (rest);
13795 if (rest == error_mark_node)
13796 return error_mark_node;
13797 rest = fold (rest);
13799 return merge_string_cste (string, rest, invert);
13801 return NULL_TREE;
13804 /* Implement the `+' operator. Does static optimization if possible,
13805 otherwise create (if necessary) and append elements to a
13806 StringBuffer. The StringBuffer will be carried around until it is
13807 used for a function call or an assignment. Then toString() will be
13808 called on it to turn it into a String object. */
13810 static tree
13811 build_string_concatenation (tree op1, tree op2)
13813 tree result;
13814 int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13816 if (flag_emit_xref)
13817 return build (PLUS_EXPR, string_type_node, op1, op2);
13819 /* Try to do some static optimization */
13820 if ((result = string_constant_concatenation (op1, op2)))
13821 return result;
13823 /* Discard empty strings on either side of the expression */
13824 if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
13826 op1 = op2;
13827 op2 = NULL_TREE;
13829 else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
13830 op2 = NULL_TREE;
13832 /* If operands are string constant, turn then into object references */
13833 if (TREE_CODE (op1) == STRING_CST)
13834 op1 = patch_string_cst (op1);
13835 if (op2 && TREE_CODE (op2) == STRING_CST)
13836 op2 = patch_string_cst (op2);
13838 /* If either one of the constant is null and the other non null
13839 operand is a String constant, return it. */
13840 if ((TREE_CODE (op1) == STRING_CST) && !op2)
13841 return op1;
13843 /* If OP1 isn't already a StringBuffer, create and
13844 initialize a new one */
13845 if (!IS_CRAFTED_STRING_BUFFER_P (op1))
13847 /* Two solutions here:
13848 1) OP1 is a constant string reference, we call new StringBuffer(OP1)
13849 2) OP1 is something else, we call new StringBuffer().append(OP1). */
13850 if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
13851 op1 = BUILD_STRING_BUFFER (op1);
13852 else
13854 tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
13855 op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
13859 if (op2)
13861 /* OP1 is no longer the last node holding a crafted StringBuffer */
13862 IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
13863 /* Create a node for `{new...,xxx}.append (op2)' */
13864 if (op2)
13865 op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
13868 /* Mark the last node holding a crafted StringBuffer */
13869 IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
13871 TREE_SIDE_EFFECTS (op1) = side_effects;
13872 return op1;
13875 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
13876 StringBuffer. If no string were found to be patched, return
13877 NULL. */
13879 static tree
13880 patch_string (tree node)
13882 if (node == error_mark_node)
13883 return error_mark_node;
13884 if (TREE_CODE (node) == STRING_CST)
13885 return patch_string_cst (node);
13886 else if (IS_CRAFTED_STRING_BUFFER_P (node))
13888 int saved = ctxp->explicit_constructor_p;
13889 tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
13890 tree ret;
13891 /* Temporary disable forbid the use of `this'. */
13892 ctxp->explicit_constructor_p = 0;
13893 ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
13894 /* String concatenation arguments must be evaluated in order too. */
13895 ret = force_evaluation_order (ret);
13896 /* Restore it at its previous value */
13897 ctxp->explicit_constructor_p = saved;
13898 return ret;
13900 return NULL_TREE;
13903 /* Build the internal representation of a string constant. */
13905 static tree
13906 patch_string_cst (tree node)
13908 int location;
13909 if (! flag_emit_class_files)
13911 node = get_identifier (TREE_STRING_POINTER (node));
13912 location = alloc_name_constant (CONSTANT_String, node);
13913 node = build_ref_from_constant_pool (location);
13915 TREE_TYPE (node) = string_ptr_type_node;
13916 TREE_CONSTANT (node) = 1;
13917 return node;
13920 /* Build an incomplete unary operator expression. */
13922 static tree
13923 build_unaryop (int op_token, int op_location, tree op1)
13925 enum tree_code op;
13926 tree unaryop;
13927 switch (op_token)
13929 case PLUS_TK: op = UNARY_PLUS_EXPR; break;
13930 case MINUS_TK: op = NEGATE_EXPR; break;
13931 case NEG_TK: op = TRUTH_NOT_EXPR; break;
13932 case NOT_TK: op = BIT_NOT_EXPR; break;
13933 default: abort ();
13936 unaryop = build1 (op, NULL_TREE, op1);
13937 TREE_SIDE_EFFECTS (unaryop) = 1;
13938 /* Store the location of the operator, for better error report. The
13939 string of the operator will be rebuild based on the OP value. */
13940 EXPR_WFL_LINECOL (unaryop) = op_location;
13941 return unaryop;
13944 /* Special case for the ++/-- operators, since they require an extra
13945 argument to build, which is set to NULL and patched
13946 later. IS_POST_P is 1 if the operator, 0 otherwise. */
13948 static tree
13949 build_incdec (int op_token, int op_location, tree op1, int is_post_p)
13951 static const enum tree_code lookup [2][2] =
13953 { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
13954 { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
13956 tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
13957 NULL_TREE, op1, NULL_TREE);
13958 TREE_SIDE_EFFECTS (node) = 1;
13959 /* Store the location of the operator, for better error report. The
13960 string of the operator will be rebuild based on the OP value. */
13961 EXPR_WFL_LINECOL (node) = op_location;
13962 return node;
13965 /* Build an incomplete cast operator, based on the use of the
13966 CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
13967 set. java_complete_tree is trained to walk a CONVERT_EXPR even
13968 though its type is already set. */
13970 static tree
13971 build_cast (int location, tree type, tree exp)
13973 tree node = build1 (CONVERT_EXPR, type, exp);
13974 EXPR_WFL_LINECOL (node) = location;
13975 return node;
13978 /* Build an incomplete class reference operator. */
13979 static tree
13980 build_incomplete_class_ref (int location, tree class_name)
13982 tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
13983 tree class_decl = GET_CPC ();
13984 tree this_class = TREE_TYPE (class_decl);
13986 /* Generate the synthetic static method `class$'. (Previously we
13987 deferred this, causing different method tables to be emitted
13988 for native code and bytecode.) */
13989 if (!TYPE_DOT_CLASS (this_class)
13990 && !JPRIMITIVE_TYPE_P (class_name)
13991 && !(TREE_CODE (class_name) == VOID_TYPE))
13993 tree target_class;
13995 if (CLASS_INTERFACE (TYPE_NAME (this_class)))
13997 /* For interfaces, adding a static 'class$' method directly
13998 is illegal. So create an inner class to contain the new
13999 method. Empirically this matches the behavior of javac. */
14000 tree t = build_wfl_node (DECL_NAME (TYPE_NAME (object_type_node)));
14001 tree inner = create_anonymous_class (0, t);
14002 target_class = TREE_TYPE (inner);
14003 end_class_declaration (1);
14005 else
14007 /* For inner classes, add a 'class$' method to their outermost
14008 context, creating it if necessary. */
14009 while (INNER_CLASS_DECL_P (class_decl))
14010 class_decl = DECL_CONTEXT (class_decl);
14011 target_class = TREE_TYPE (class_decl);
14014 if (TYPE_DOT_CLASS (target_class) == NULL_TREE)
14015 build_dot_class_method (target_class);
14017 if (this_class != target_class)
14018 TYPE_DOT_CLASS (this_class) = TYPE_DOT_CLASS (target_class);
14021 EXPR_WFL_LINECOL (node) = location;
14022 return node;
14025 /* Complete an incomplete class reference operator. */
14026 static tree
14027 patch_incomplete_class_ref (tree node)
14029 tree type = TREE_OPERAND (node, 0);
14030 tree ref_type;
14032 if (!(ref_type = resolve_type_during_patch (type)))
14033 return error_mark_node;
14035 /* If we're not emitting class files and we know ref_type is a
14036 compiled class, build a direct reference. */
14037 if ((! flag_emit_class_files && is_compiled_class (ref_type))
14038 || JPRIMITIVE_TYPE_P (ref_type)
14039 || TREE_CODE (ref_type) == VOID_TYPE)
14041 tree dot = build_class_ref (ref_type);
14042 /* A class referenced by `foo.class' is initialized. */
14043 if (!flag_emit_class_files)
14044 dot = build_class_init (ref_type, dot);
14045 return java_complete_tree (dot);
14048 /* If we're emitting class files and we have to deal with non
14049 primitive types, we invoke the synthetic static method `class$'. */
14050 ref_type = build_dot_class_method_invocation (current_class, ref_type);
14051 return java_complete_tree (ref_type);
14054 /* 15.14 Unary operators. We return error_mark_node in case of error,
14055 but preserve the type of NODE if the type is fixed. */
14057 static tree
14058 patch_unaryop (tree node, tree wfl_op)
14060 tree op = TREE_OPERAND (node, 0);
14061 tree op_type = TREE_TYPE (op);
14062 tree prom_type = NULL_TREE, value, decl;
14063 int outer_field_flag = 0;
14064 int code = TREE_CODE (node);
14065 int error_found = 0;
14067 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14069 switch (code)
14071 /* 15.13.2 Postfix Increment Operator ++ */
14072 case POSTINCREMENT_EXPR:
14073 /* 15.13.3 Postfix Increment Operator -- */
14074 case POSTDECREMENT_EXPR:
14075 /* 15.14.1 Prefix Increment Operator ++ */
14076 case PREINCREMENT_EXPR:
14077 /* 15.14.2 Prefix Decrement Operator -- */
14078 case PREDECREMENT_EXPR:
14079 op = decl = strip_out_static_field_access_decl (op);
14080 outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
14081 /* We might be trying to change an outer field accessed using
14082 access method. */
14083 if (outer_field_flag)
14085 /* Retrieve the decl of the field we're trying to access. We
14086 do that by first retrieving the function we would call to
14087 access the field. It has been already verified that this
14088 field isn't final */
14089 if (flag_emit_class_files)
14090 decl = TREE_OPERAND (op, 0);
14091 else
14092 decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
14093 decl = DECL_FUNCTION_ACCESS_DECL (decl);
14095 /* We really should have a JAVA_ARRAY_EXPR to avoid this */
14096 else if (!JDECL_P (decl)
14097 && TREE_CODE (decl) != COMPONENT_REF
14098 && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
14099 && TREE_CODE (decl) != INDIRECT_REF
14100 && !(TREE_CODE (decl) == COMPOUND_EXPR
14101 && TREE_OPERAND (decl, 1)
14102 && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
14104 TREE_TYPE (node) = error_mark_node;
14105 error_found = 1;
14108 /* From now on, we know that op if a variable and that it has a
14109 valid wfl. We use wfl_op to locate errors related to the
14110 ++/-- operand. */
14111 if (!JNUMERIC_TYPE_P (op_type))
14113 parse_error_context
14114 (wfl_op, "Invalid argument type `%s' to `%s'",
14115 lang_printable_name (op_type, 0), operator_string (node));
14116 TREE_TYPE (node) = error_mark_node;
14117 error_found = 1;
14119 else
14121 /* Before the addition, binary numeric promotion is performed on
14122 both operands, if really necessary */
14123 if (JINTEGRAL_TYPE_P (op_type))
14125 value = build_int_2 (1, 0);
14126 TREE_TYPE (value) = TREE_TYPE (node) = op_type;
14128 else
14130 value = build_int_2 (1, 0);
14131 TREE_TYPE (node) =
14132 binary_numeric_promotion (op_type,
14133 TREE_TYPE (value), &op, &value);
14136 /* We remember we might be accessing an outer field */
14137 if (outer_field_flag)
14139 /* We re-generate an access to the field */
14140 value = build (PLUS_EXPR, TREE_TYPE (op),
14141 build_outer_field_access (wfl_op, decl), value);
14143 /* And we patch the original access$() into a write
14144 with plus_op as a rhs */
14145 return outer_field_access_fix (node, op, value);
14148 /* And write back into the node. */
14149 TREE_OPERAND (node, 0) = op;
14150 TREE_OPERAND (node, 1) = value;
14151 /* Convert the overall back into its original type, if
14152 necessary, and return */
14153 if (JINTEGRAL_TYPE_P (op_type))
14154 return fold (node);
14155 else
14156 return fold (convert (op_type, node));
14158 break;
14160 /* 15.14.3 Unary Plus Operator + */
14161 case UNARY_PLUS_EXPR:
14162 /* 15.14.4 Unary Minus Operator - */
14163 case NEGATE_EXPR:
14164 if (!JNUMERIC_TYPE_P (op_type))
14166 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
14167 TREE_TYPE (node) = error_mark_node;
14168 error_found = 1;
14170 /* Unary numeric promotion is performed on operand */
14171 else
14173 op = do_unary_numeric_promotion (op);
14174 prom_type = TREE_TYPE (op);
14175 if (code == UNARY_PLUS_EXPR)
14176 return fold (op);
14178 break;
14180 /* 15.14.5 Bitwise Complement Operator ~ */
14181 case BIT_NOT_EXPR:
14182 if (!JINTEGRAL_TYPE_P (op_type))
14184 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
14185 TREE_TYPE (node) = error_mark_node;
14186 error_found = 1;
14188 else
14190 op = do_unary_numeric_promotion (op);
14191 prom_type = TREE_TYPE (op);
14193 break;
14195 /* 15.14.6 Logical Complement Operator ! */
14196 case TRUTH_NOT_EXPR:
14197 if (TREE_CODE (op_type) != BOOLEAN_TYPE)
14199 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
14200 /* But the type is known. We will report an error if further
14201 attempt of a assignment is made with this rhs */
14202 TREE_TYPE (node) = boolean_type_node;
14203 error_found = 1;
14205 else
14206 prom_type = boolean_type_node;
14207 break;
14209 /* 15.15 Cast Expression */
14210 case CONVERT_EXPR:
14211 value = patch_cast (node, wfl_operator);
14212 if (value == error_mark_node)
14214 /* If this cast is part of an assignment, we tell the code
14215 that deals with it not to complain about a mismatch,
14216 because things have been cast, anyways */
14217 TREE_TYPE (node) = error_mark_node;
14218 error_found = 1;
14220 else
14222 value = fold (value);
14223 TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
14224 return value;
14226 break;
14229 if (error_found)
14230 return error_mark_node;
14232 /* There are cases where node has been replaced by something else
14233 and we don't end up returning here: UNARY_PLUS_EXPR,
14234 CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14235 TREE_OPERAND (node, 0) = fold (op);
14236 TREE_TYPE (node) = prom_type;
14237 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
14238 return fold (node);
14241 /* Generic type resolution that sometimes takes place during node
14242 patching. Returned the resolved type or generate an error
14243 message. Return the resolved type or NULL_TREE. */
14245 static tree
14246 resolve_type_during_patch (tree type)
14248 if (unresolved_type_p (type, NULL))
14250 tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
14251 if (!type_decl)
14253 parse_error_context (type,
14254 "Class `%s' not found in type declaration",
14255 IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
14256 return NULL_TREE;
14259 check_deprecation (type, type_decl);
14261 return TREE_TYPE (type_decl);
14263 return type;
14266 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14267 found. Otherwise NODE or something meant to replace it is returned. */
14269 static tree
14270 patch_cast (tree node, tree wfl_op)
14272 tree op = TREE_OPERAND (node, 0);
14273 tree cast_type = TREE_TYPE (node);
14274 tree patched, op_type;
14275 char *t1;
14277 /* Some string patching might be necessary at this stage */
14278 if ((patched = patch_string (op)))
14279 TREE_OPERAND (node, 0) = op = patched;
14280 op_type = TREE_TYPE (op);
14282 /* First resolve OP_TYPE if unresolved */
14283 if (!(cast_type = resolve_type_during_patch (cast_type)))
14284 return error_mark_node;
14286 /* Check on cast that are proven correct at compile time */
14287 if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
14289 /* Same type */
14290 if (cast_type == op_type)
14291 return node;
14293 /* A narrowing conversion from a floating-point number to an
14294 integral type requires special handling (5.1.3). */
14295 if (JFLOAT_TYPE_P (op_type) && JINTEGRAL_TYPE_P (cast_type))
14296 if (cast_type != long_type_node)
14297 op = convert (integer_type_node, op);
14299 /* Try widening/narrowing conversion. Potentially, things need
14300 to be worked out in gcc so we implement the extreme cases
14301 correctly. fold_convert() needs to be fixed. */
14302 return convert (cast_type, op);
14305 /* It's also valid to cast a boolean into a boolean */
14306 if (op_type == boolean_type_node && cast_type == boolean_type_node)
14307 return node;
14309 /* null can be casted to references */
14310 if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
14311 return build_null_of_type (cast_type);
14313 /* The remaining legal casts involve conversion between reference
14314 types. Check for their compile time correctness. */
14315 if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
14316 && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
14318 TREE_TYPE (node) = promote_type (cast_type);
14319 /* Now, the case can be determined correct at compile time if
14320 OP_TYPE can be converted into CAST_TYPE by assignment
14321 conversion (5.2) */
14323 if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
14325 TREE_SET_CODE (node, NOP_EXPR);
14326 return node;
14329 if (flag_emit_class_files)
14331 TREE_SET_CODE (node, CONVERT_EXPR);
14332 return node;
14335 /* The cast requires a run-time check */
14336 return build (CALL_EXPR, promote_type (cast_type),
14337 build_address_of (soft_checkcast_node),
14338 tree_cons (NULL_TREE, build_class_ref (cast_type),
14339 build_tree_list (NULL_TREE, op)),
14340 NULL_TREE);
14343 /* Any other casts are proven incorrect at compile time */
14344 t1 = xstrdup (lang_printable_name (op_type, 0));
14345 parse_error_context (wfl_op, "Invalid cast from `%s' to `%s'",
14346 t1, lang_printable_name (cast_type, 0));
14347 free (t1);
14348 return error_mark_node;
14351 /* Build a null constant and give it the type TYPE. */
14353 static tree
14354 build_null_of_type (tree type)
14356 tree node = build_int_2 (0, 0);
14357 TREE_TYPE (node) = promote_type (type);
14358 return node;
14361 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14362 a list of indices. */
14363 static tree
14364 build_array_ref (int location, tree array, tree index)
14366 tree node = build (ARRAY_REF, NULL_TREE, array, index);
14367 EXPR_WFL_LINECOL (node) = location;
14368 return node;
14371 /* 15.12 Array Access Expression */
14373 static tree
14374 patch_array_ref (tree node)
14376 tree array = TREE_OPERAND (node, 0);
14377 tree array_type = TREE_TYPE (array);
14378 tree index = TREE_OPERAND (node, 1);
14379 tree index_type = TREE_TYPE (index);
14380 int error_found = 0;
14382 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14384 if (TREE_CODE (array_type) == POINTER_TYPE)
14385 array_type = TREE_TYPE (array_type);
14387 /* The array reference must be an array */
14388 if (!TYPE_ARRAY_P (array_type))
14390 parse_error_context
14391 (wfl_operator,
14392 "`[]' can only be applied to arrays. It can't be applied to `%s'",
14393 lang_printable_name (array_type, 0));
14394 TREE_TYPE (node) = error_mark_node;
14395 error_found = 1;
14398 /* The array index undergoes unary numeric promotion. The promoted
14399 type must be int */
14400 index = do_unary_numeric_promotion (index);
14401 if (TREE_TYPE (index) != int_type_node)
14403 if (valid_cast_to_p (index_type, int_type_node))
14404 parse_error_context (wfl_operator,
14405 "Incompatible type for `[]'. Explicit cast needed to convert `%s' to `int'",
14406 lang_printable_name (index_type, 0));
14407 else
14408 parse_error_context (wfl_operator,
14409 "Incompatible type for `[]'. Can't convert `%s' to `int'",
14410 lang_printable_name (index_type, 0));
14411 TREE_TYPE (node) = error_mark_node;
14412 error_found = 1;
14415 if (error_found)
14416 return error_mark_node;
14418 array_type = TYPE_ARRAY_ELEMENT (array_type);
14420 if (flag_emit_class_files || flag_emit_xref)
14422 TREE_OPERAND (node, 0) = array;
14423 TREE_OPERAND (node, 1) = index;
14425 else
14426 node = build_java_arrayaccess (array, array_type, index);
14427 TREE_TYPE (node) = array_type;
14428 return node;
14431 /* 15.9 Array Creation Expressions */
14433 static tree
14434 build_newarray_node (tree type, tree dims, int extra_dims)
14436 tree node =
14437 build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
14438 build_int_2 (extra_dims, 0));
14439 return node;
14442 static tree
14443 patch_newarray (tree node)
14445 tree type = TREE_OPERAND (node, 0);
14446 tree dims = TREE_OPERAND (node, 1);
14447 tree cdim, array_type;
14448 int error_found = 0;
14449 int ndims = 0;
14450 int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
14452 /* Dimension types are verified. It's better for the types to be
14453 verified in order. */
14454 for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
14456 int dim_error = 0;
14457 tree dim = TREE_VALUE (cdim);
14459 /* Dim might have been saved during its evaluation */
14460 dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
14462 /* The type of each specified dimension must be an integral type. */
14463 if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
14464 dim_error = 1;
14466 /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14467 promoted type must be int. */
14468 else
14470 dim = do_unary_numeric_promotion (dim);
14471 if (TREE_TYPE (dim) != int_type_node)
14472 dim_error = 1;
14475 /* Report errors on types here */
14476 if (dim_error)
14478 parse_error_context
14479 (TREE_PURPOSE (cdim),
14480 "Incompatible type for dimension in array creation expression. %s convert `%s' to `int'",
14481 (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
14482 "Explicit cast needed to" : "Can't"),
14483 lang_printable_name (TREE_TYPE (dim), 0));
14484 error_found = 1;
14487 TREE_PURPOSE (cdim) = NULL_TREE;
14490 /* Resolve array base type if unresolved */
14491 if (!(type = resolve_type_during_patch (type)))
14492 error_found = 1;
14494 if (error_found)
14496 /* We don't want further evaluation of this bogus array creation
14497 operation */
14498 TREE_TYPE (node) = error_mark_node;
14499 return error_mark_node;
14502 /* Set array_type to the actual (promoted) array type of the result. */
14503 if (TREE_CODE (type) == RECORD_TYPE)
14504 type = build_pointer_type (type);
14505 while (--xdims >= 0)
14507 type = promote_type (build_java_array_type (type, -1));
14509 dims = nreverse (dims);
14510 array_type = type;
14511 for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
14513 type = array_type;
14514 array_type
14515 = build_java_array_type (type,
14516 TREE_CODE (cdim) == INTEGER_CST
14517 ? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
14518 : -1);
14519 array_type = promote_type (array_type);
14521 dims = nreverse (dims);
14523 /* The node is transformed into a function call. Things are done
14524 differently according to the number of dimensions. If the number
14525 of dimension is equal to 1, then the nature of the base type
14526 (primitive or not) matters. */
14527 if (ndims == 1)
14528 return build_new_array (type, TREE_VALUE (dims));
14530 /* Can't reuse what's already written in expr.c because it uses the
14531 JVM stack representation. Provide a build_multianewarray. FIXME */
14532 return build (CALL_EXPR, array_type,
14533 build_address_of (soft_multianewarray_node),
14534 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
14535 tree_cons (NULL_TREE,
14536 build_int_2 (ndims, 0), dims )),
14537 NULL_TREE);
14540 /* 10.6 Array initializer. */
14542 /* Build a wfl for array element that don't have one, so we can
14543 pin-point errors. */
14545 static tree
14546 maybe_build_array_element_wfl (tree node)
14548 if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
14549 return build_expr_wfl (NULL_TREE, ctxp->filename,
14550 ctxp->elc.line, ctxp->elc.prev_col);
14551 else
14552 return NULL_TREE;
14555 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14556 identification of initialized arrays easier to detect during walk
14557 and expansion. */
14559 static tree
14560 build_new_array_init (int location, tree values)
14562 tree constructor = build_constructor (NULL_TREE, values);
14563 tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
14564 EXPR_WFL_LINECOL (to_return) = location;
14565 return to_return;
14568 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14569 occurred. Otherwise return NODE after having set its type
14570 appropriately. */
14572 static tree
14573 patch_new_array_init (tree type, tree node)
14575 int error_seen = 0;
14576 tree current, element_type;
14577 HOST_WIDE_INT length;
14578 int all_constant = 1;
14579 tree init = TREE_OPERAND (node, 0);
14581 if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
14583 parse_error_context (node,
14584 "Invalid array initializer for non-array type `%s'",
14585 lang_printable_name (type, 1));
14586 return error_mark_node;
14588 type = TREE_TYPE (type);
14589 element_type = TYPE_ARRAY_ELEMENT (type);
14591 CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
14593 for (length = 0, current = CONSTRUCTOR_ELTS (init);
14594 current; length++, current = TREE_CHAIN (current))
14596 tree elt = TREE_VALUE (current);
14597 if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
14599 error_seen |= array_constructor_check_entry (element_type, current);
14600 elt = TREE_VALUE (current);
14601 /* When compiling to native code, STRING_CST is converted to
14602 INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14603 if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
14604 all_constant = 0;
14606 else
14608 TREE_VALUE (current) = patch_new_array_init (element_type, elt);
14609 TREE_PURPOSE (current) = NULL_TREE;
14610 all_constant = 0;
14612 if (elt && TREE_CODE (elt) == TREE_LIST
14613 && TREE_VALUE (elt) == error_mark_node)
14614 error_seen = 1;
14617 if (error_seen)
14618 return error_mark_node;
14620 /* Create a new type. We can't reuse the one we have here by
14621 patching its dimension because it originally is of dimension -1
14622 hence reused by gcc. This would prevent triangular arrays. */
14623 type = build_java_array_type (element_type, length);
14624 TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
14625 TREE_TYPE (node) = promote_type (type);
14626 TREE_CONSTANT (init) = all_constant;
14627 TREE_CONSTANT (node) = all_constant;
14628 return node;
14631 /* Verify that one entry of the initializer element list can be
14632 assigned to the array base type. Report 1 if an error occurred, 0
14633 otherwise. */
14635 static int
14636 array_constructor_check_entry (tree type, tree entry)
14638 char *array_type_string = NULL; /* For error reports */
14639 tree value, type_value, new_value, wfl_value, patched;
14640 int error_seen = 0;
14642 new_value = NULL_TREE;
14643 wfl_value = TREE_VALUE (entry);
14645 value = java_complete_tree (TREE_VALUE (entry));
14646 /* patch_string return error_mark_node if arg is error_mark_node */
14647 if ((patched = patch_string (value)))
14648 value = patched;
14649 if (value == error_mark_node)
14650 return 1;
14652 type_value = TREE_TYPE (value);
14654 /* At anytime, try_builtin_assignconv can report a warning on
14655 constant overflow during narrowing. */
14656 SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
14657 new_value = try_builtin_assignconv (wfl_operator, type, value);
14658 if (!new_value && (new_value = try_reference_assignconv (type, value)))
14659 type_value = promote_type (type);
14661 /* Check and report errors */
14662 if (!new_value)
14664 const char *const msg = (!valid_cast_to_p (type_value, type) ?
14665 "Can't" : "Explicit cast needed to");
14666 if (!array_type_string)
14667 array_type_string = xstrdup (lang_printable_name (type, 1));
14668 parse_error_context
14669 (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
14670 msg, lang_printable_name (type_value, 1), array_type_string);
14671 error_seen = 1;
14674 if (new_value)
14675 TREE_VALUE (entry) = new_value;
14677 if (array_type_string)
14678 free (array_type_string);
14680 TREE_PURPOSE (entry) = NULL_TREE;
14681 return error_seen;
14684 static tree
14685 build_this (int location)
14687 tree node = build_wfl_node (this_identifier_node);
14688 TREE_SET_CODE (node, THIS_EXPR);
14689 EXPR_WFL_LINECOL (node) = location;
14690 return node;
14693 /* 14.15 The return statement. It builds a modify expression that
14694 assigns the returned value to the RESULT_DECL that hold the value
14695 to be returned. */
14697 static tree
14698 build_return (int location, tree op)
14700 tree node = build1 (RETURN_EXPR, NULL_TREE, op);
14701 EXPR_WFL_LINECOL (node) = location;
14702 node = build_debugable_stmt (location, node);
14703 return node;
14706 static tree
14707 patch_return (tree node)
14709 tree return_exp = TREE_OPERAND (node, 0);
14710 tree meth = current_function_decl;
14711 tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
14712 int error_found = 0;
14714 TREE_TYPE (node) = error_mark_node;
14715 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14717 /* It's invalid to have a return value within a function that is
14718 declared with the keyword void or that is a constructor */
14719 if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
14720 error_found = 1;
14722 /* It's invalid to use a return statement in a static block */
14723 if (DECL_CLINIT_P (current_function_decl))
14724 error_found = 1;
14726 /* It's invalid to have a no return value within a function that
14727 isn't declared with the keyword `void' */
14728 if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
14729 error_found = 2;
14731 if (DECL_INSTINIT_P (current_function_decl))
14732 error_found = 1;
14734 if (error_found)
14736 if (DECL_INSTINIT_P (current_function_decl))
14737 parse_error_context (wfl_operator,
14738 "`return' inside instance initializer");
14740 else if (DECL_CLINIT_P (current_function_decl))
14741 parse_error_context (wfl_operator,
14742 "`return' inside static initializer");
14744 else if (!DECL_CONSTRUCTOR_P (meth))
14746 char *t = xstrdup (lang_printable_name (mtype, 0));
14747 parse_error_context (wfl_operator,
14748 "`return' with%s value from `%s %s'",
14749 (error_found == 1 ? "" : "out"),
14750 t, lang_printable_name (meth, 0));
14751 free (t);
14753 else
14754 parse_error_context (wfl_operator,
14755 "`return' with value from constructor `%s'",
14756 lang_printable_name (meth, 0));
14757 return error_mark_node;
14760 /* If we have a return_exp, build a modify expression and expand
14761 it. Note: at that point, the assignment is declared valid, but we
14762 may want to carry some more hacks */
14763 if (return_exp)
14765 tree exp = java_complete_tree (return_exp);
14766 tree modify, patched;
14768 if ((patched = patch_string (exp)))
14769 exp = patched;
14771 modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
14772 EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
14773 modify = java_complete_tree (modify);
14775 if (modify != error_mark_node)
14777 TREE_SIDE_EFFECTS (modify) = 1;
14778 TREE_OPERAND (node, 0) = modify;
14780 else
14781 return error_mark_node;
14783 TREE_TYPE (node) = void_type_node;
14784 TREE_SIDE_EFFECTS (node) = 1;
14785 return node;
14788 /* 14.8 The if Statement */
14790 static tree
14791 build_if_else_statement (int location, tree expression, tree if_body,
14792 tree else_body)
14794 tree node;
14795 if (!else_body)
14796 else_body = empty_stmt_node;
14797 node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
14798 EXPR_WFL_LINECOL (node) = location;
14799 node = build_debugable_stmt (location, node);
14800 return node;
14803 static tree
14804 patch_if_else_statement (tree node)
14806 tree expression = TREE_OPERAND (node, 0);
14807 int can_complete_normally
14808 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
14809 | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
14811 TREE_TYPE (node) = error_mark_node;
14812 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14814 /* The type of expression must be boolean */
14815 if (TREE_TYPE (expression) != boolean_type_node
14816 && TREE_TYPE (expression) != promoted_boolean_type_node)
14818 parse_error_context
14819 (wfl_operator,
14820 "Incompatible type for `if'. Can't convert `%s' to `boolean'",
14821 lang_printable_name (TREE_TYPE (expression), 0));
14822 return error_mark_node;
14825 if (TREE_CODE (expression) == INTEGER_CST)
14827 if (integer_zerop (expression))
14828 node = TREE_OPERAND (node, 2);
14829 else
14830 node = TREE_OPERAND (node, 1);
14831 if (CAN_COMPLETE_NORMALLY (node) != can_complete_normally)
14833 node = build (COMPOUND_EXPR, void_type_node, node, empty_stmt_node);
14834 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14836 return node;
14838 TREE_TYPE (node) = void_type_node;
14839 TREE_SIDE_EFFECTS (node) = 1;
14840 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14841 return node;
14844 /* 14.6 Labeled Statements */
14846 /* Action taken when a labeled statement is parsed. a new
14847 LABELED_BLOCK_EXPR is created. No statement is attached to the
14848 label, yet. LABEL can be NULL_TREE for artificially-generated blocks. */
14850 static tree
14851 build_labeled_block (int location, tree label)
14853 tree label_name ;
14854 tree label_decl, node;
14855 if (label == NULL_TREE || label == continue_identifier_node)
14856 label_name = label;
14857 else
14859 label_name = merge_qualified_name (label_id, label);
14860 /* Issue an error if we try to reuse a label that was previously
14861 declared */
14862 if (IDENTIFIER_LOCAL_VALUE (label_name))
14864 EXPR_WFL_LINECOL (wfl_operator) = location;
14865 parse_error_context (wfl_operator,
14866 "Declaration of `%s' shadows a previous label declaration",
14867 IDENTIFIER_POINTER (label));
14868 EXPR_WFL_LINECOL (wfl_operator) =
14869 EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
14870 parse_error_context (wfl_operator,
14871 "This is the location of the previous declaration of label `%s'",
14872 IDENTIFIER_POINTER (label));
14873 java_error_count--;
14877 label_decl = create_label_decl (label_name);
14878 node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
14879 EXPR_WFL_LINECOL (node) = location;
14880 TREE_SIDE_EFFECTS (node) = 1;
14881 return node;
14884 /* A labeled statement LBE is attached a statement. */
14886 static tree
14887 finish_labeled_statement (tree lbe, /* Labeled block expr */
14888 tree statement)
14890 /* In anyways, tie the loop to its statement */
14891 LABELED_BLOCK_BODY (lbe) = statement;
14892 pop_labeled_block ();
14893 POP_LABELED_BLOCK ();
14894 return lbe;
14897 /* 14.10, 14.11, 14.12 Loop Statements */
14899 /* Create an empty LOOP_EXPR and make it the last in the nested loop
14900 list. */
14902 static tree
14903 build_new_loop (tree loop_body)
14905 tree loop = build (LOOP_EXPR, NULL_TREE, loop_body);
14906 TREE_SIDE_EFFECTS (loop) = 1;
14907 PUSH_LOOP (loop);
14908 return loop;
14911 /* Create a loop body according to the following structure:
14912 COMPOUND_EXPR
14913 COMPOUND_EXPR (loop main body)
14914 EXIT_EXPR (this order is for while/for loops.
14915 LABELED_BLOCK_EXPR the order is reversed for do loops)
14916 LABEL_DECL (a continue occurring here branches at the
14917 BODY end of this labeled block)
14918 INCREMENT (if any)
14920 REVERSED, if nonzero, tells that the loop condition expr comes
14921 after the body, like in the do-while loop.
14923 To obtain a loop, the loop body structure described above is
14924 encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
14926 LABELED_BLOCK_EXPR
14927 LABEL_DECL (use this label to exit the loop)
14928 LOOP_EXPR
14929 <structure described above> */
14931 static tree
14932 build_loop_body (int location, tree condition, int reversed)
14934 tree first, second, body;
14936 condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
14937 EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
14938 condition = build_debugable_stmt (location, condition);
14939 TREE_SIDE_EFFECTS (condition) = 1;
14941 body = build_labeled_block (0, continue_identifier_node);
14942 first = (reversed ? body : condition);
14943 second = (reversed ? condition : body);
14944 return
14945 build (COMPOUND_EXPR, NULL_TREE,
14946 build (COMPOUND_EXPR, NULL_TREE, first, second), empty_stmt_node);
14949 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
14950 their order) on the current loop. Unlink the current loop from the
14951 loop list. */
14953 static tree
14954 finish_loop_body (int location, tree condition, tree body, int reversed)
14956 tree to_return = ctxp->current_loop;
14957 tree loop_body = LOOP_EXPR_BODY (to_return);
14958 if (condition)
14960 tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
14961 /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
14962 The real EXIT_EXPR is one operand further. */
14963 EXPR_WFL_LINECOL (cnode) = location;
14964 /* This one is for accurate error reports */
14965 EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
14966 TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
14968 LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
14969 POP_LOOP ();
14970 return to_return;
14973 /* Tailored version of finish_loop_body for FOR loops, when FOR
14974 loops feature the condition part */
14976 static tree
14977 finish_for_loop (int location, tree condition, tree update, tree body)
14979 /* Put the condition and the loop body in place */
14980 tree loop = finish_loop_body (location, condition, body, 0);
14981 /* LOOP is the current loop which has been now popped of the loop
14982 stack. Mark the update block as reachable and install it. We do
14983 this because the (current interpretation of the) JLS requires
14984 that the update expression be considered reachable even if the
14985 for loop's body doesn't complete normally. */
14986 if (update != NULL_TREE && update != empty_stmt_node)
14988 tree up2 = update;
14989 if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
14990 up2 = EXPR_WFL_NODE (up2);
14991 /* It is possible for the update expression to be an
14992 EXPR_WFL_NODE wrapping nothing. */
14993 if (up2 != NULL_TREE && up2 != empty_stmt_node)
14995 /* Try to detect constraint violations. These would be
14996 programming errors somewhere. */
14997 if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
14998 || TREE_CODE (up2) == LOOP_EXPR)
14999 abort ();
15000 SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
15003 LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
15004 return loop;
15007 /* Try to find the loop a block might be related to. This comprises
15008 the case where the LOOP_EXPR is found as the second operand of a
15009 COMPOUND_EXPR, because the loop happens to have an initialization
15010 part, then expressed as the first operand of the COMPOUND_EXPR. If
15011 the search finds something, 1 is returned. Otherwise, 0 is
15012 returned. The search is assumed to start from a
15013 LABELED_BLOCK_EXPR's block. */
15015 static tree
15016 search_loop (tree statement)
15018 if (TREE_CODE (statement) == LOOP_EXPR)
15019 return statement;
15021 if (TREE_CODE (statement) == BLOCK)
15022 statement = BLOCK_SUBBLOCKS (statement);
15023 else
15024 return NULL_TREE;
15026 if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15027 while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15028 statement = TREE_OPERAND (statement, 1);
15030 return (TREE_CODE (statement) == LOOP_EXPR
15031 && FOR_LOOP_P (statement) ? statement : NULL_TREE);
15034 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
15035 returned otherwise. */
15037 static int
15038 labeled_block_contains_loop_p (tree block, tree loop)
15040 if (!block)
15041 return 0;
15043 if (LABELED_BLOCK_BODY (block) == loop)
15044 return 1;
15046 if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
15047 return 1;
15049 return 0;
15052 /* If the loop isn't surrounded by a labeled statement, create one and
15053 insert LOOP as its body. */
15055 static tree
15056 patch_loop_statement (tree loop)
15058 tree loop_label;
15060 TREE_TYPE (loop) = void_type_node;
15061 if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
15062 return loop;
15064 loop_label = build_labeled_block (0, NULL_TREE);
15065 /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
15066 that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
15067 LABELED_BLOCK_BODY (loop_label) = loop;
15068 PUSH_LABELED_BLOCK (loop_label);
15069 return loop_label;
15072 /* 14.13, 14.14: break and continue Statements */
15074 /* Build a break or a continue statement. a null NAME indicates an
15075 unlabeled break/continue statement. */
15077 static tree
15078 build_bc_statement (int location, int is_break, tree name)
15080 tree break_continue, label_block_expr = NULL_TREE;
15082 if (name)
15084 if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
15085 (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
15086 /* Null means that we don't have a target for this named
15087 break/continue. In this case, we make the target to be the
15088 label name, so that the error can be reported accurately in
15089 patch_bc_statement. */
15090 label_block_expr = EXPR_WFL_NODE (name);
15092 /* Unlabeled break/continue will be handled during the
15093 break/continue patch operation */
15094 break_continue
15095 = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
15097 IS_BREAK_STMT_P (break_continue) = is_break;
15098 TREE_SIDE_EFFECTS (break_continue) = 1;
15099 EXPR_WFL_LINECOL (break_continue) = location;
15100 break_continue = build_debugable_stmt (location, break_continue);
15101 return break_continue;
15104 /* Verification of a break/continue statement. */
15106 static tree
15107 patch_bc_statement (tree node)
15109 tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
15110 tree labeled_block = ctxp->current_labeled_block;
15111 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15113 /* Having an identifier here means that the target is unknown. */
15114 if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
15116 parse_error_context (wfl_operator, "No label definition found for `%s'",
15117 IDENTIFIER_POINTER (bc_label));
15118 return error_mark_node;
15120 if (! IS_BREAK_STMT_P (node))
15122 /* It's a continue statement. */
15123 for (;; labeled_block = TREE_CHAIN (labeled_block))
15125 if (labeled_block == NULL_TREE)
15127 if (bc_label == NULL_TREE)
15128 parse_error_context (wfl_operator,
15129 "`continue' must be in loop");
15130 else
15131 parse_error_context
15132 (wfl_operator, "continue label `%s' does not name a loop",
15133 IDENTIFIER_POINTER (bc_label));
15134 return error_mark_node;
15136 if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
15137 == continue_identifier_node)
15138 && (bc_label == NULL_TREE
15139 || TREE_CHAIN (labeled_block) == bc_label))
15141 bc_label = labeled_block;
15142 break;
15146 else if (!bc_label)
15148 for (;; labeled_block = TREE_CHAIN (labeled_block))
15150 if (labeled_block == NULL_TREE)
15152 parse_error_context (wfl_operator,
15153 "`break' must be in loop or switch");
15154 return error_mark_node;
15156 target_stmt = LABELED_BLOCK_BODY (labeled_block);
15157 if (TREE_CODE (target_stmt) == SWITCH_EXPR
15158 || search_loop (target_stmt))
15160 bc_label = labeled_block;
15161 break;
15166 EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
15167 CAN_COMPLETE_NORMALLY (bc_label) = 1;
15169 /* Our break/continue don't return values. */
15170 TREE_TYPE (node) = void_type_node;
15171 /* Encapsulate the break within a compound statement so that it's
15172 expanded all the times by expand_expr (and not clobbered
15173 sometimes, like after a if statement) */
15174 node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
15175 TREE_SIDE_EFFECTS (node) = 1;
15176 return node;
15179 /* Process the exit expression belonging to a loop. Its type must be
15180 boolean. */
15182 static tree
15183 patch_exit_expr (tree node)
15185 tree expression = TREE_OPERAND (node, 0);
15186 TREE_TYPE (node) = error_mark_node;
15187 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15189 /* The type of expression must be boolean */
15190 if (TREE_TYPE (expression) != boolean_type_node)
15192 parse_error_context
15193 (wfl_operator,
15194 "Incompatible type for loop conditional. Can't convert `%s' to `boolean'",
15195 lang_printable_name (TREE_TYPE (expression), 0));
15196 return error_mark_node;
15198 /* Now we know things are allright, invert the condition, fold and
15199 return */
15200 TREE_OPERAND (node, 0) =
15201 fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
15203 if (! integer_zerop (TREE_OPERAND (node, 0))
15204 && ctxp->current_loop != NULL_TREE
15205 && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
15206 CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
15207 if (! integer_onep (TREE_OPERAND (node, 0)))
15208 CAN_COMPLETE_NORMALLY (node) = 1;
15211 TREE_TYPE (node) = void_type_node;
15212 return node;
15215 /* 14.9 Switch statement */
15217 static tree
15218 patch_switch_statement (tree node)
15220 tree se = TREE_OPERAND (node, 0), se_type;
15221 tree save, iter;
15223 /* Complete the switch expression */
15224 se = TREE_OPERAND (node, 0) = java_complete_tree (se);
15225 se_type = TREE_TYPE (se);
15226 /* The type of the switch expression must be char, byte, short or
15227 int */
15228 if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
15230 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15231 parse_error_context (wfl_operator,
15232 "Incompatible type for `switch'. Can't convert `%s' to `int'",
15233 lang_printable_name (se_type, 0));
15234 /* This is what java_complete_tree will check */
15235 TREE_OPERAND (node, 0) = error_mark_node;
15236 return error_mark_node;
15239 /* Save and restore the outer case label list. */
15240 save = case_label_list;
15241 case_label_list = NULL_TREE;
15243 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
15245 /* See if we've found a duplicate label. We can't leave this until
15246 code generation, because in `--syntax-only' and `-C' modes we
15247 don't do ordinary code generation. */
15248 for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
15250 HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
15251 tree subiter;
15252 for (subiter = TREE_CHAIN (iter);
15253 subiter != NULL_TREE;
15254 subiter = TREE_CHAIN (subiter))
15256 HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
15257 if (val == subval)
15259 EXPR_WFL_LINECOL (wfl_operator)
15260 = EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
15261 /* The case_label_list is in reverse order, so print the
15262 outer label first. */
15263 parse_error_context (wfl_operator, "duplicate case label: `"
15264 HOST_WIDE_INT_PRINT_DEC "'", subval);
15265 EXPR_WFL_LINECOL (wfl_operator)
15266 = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
15267 parse_error_context (wfl_operator, "original label is here");
15269 break;
15274 case_label_list = save;
15276 /* Ready to return */
15277 if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
15279 TREE_TYPE (node) = error_mark_node;
15280 return error_mark_node;
15282 TREE_TYPE (node) = void_type_node;
15283 TREE_SIDE_EFFECTS (node) = 1;
15284 CAN_COMPLETE_NORMALLY (node)
15285 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15286 || ! SWITCH_HAS_DEFAULT (node);
15287 return node;
15290 /* Assertions. */
15292 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15293 might be NULL_TREE. */
15294 static tree
15295 build_assertion (int location, tree condition, tree value)
15297 tree node;
15298 tree klass = GET_CPC ();
15300 if (! CLASS_USES_ASSERTIONS (klass))
15302 tree field, classdollar, id, call;
15303 tree class_type = TREE_TYPE (klass);
15305 field = add_field (class_type,
15306 get_identifier ("$assertionsDisabled"),
15307 boolean_type_node,
15308 ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
15309 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
15310 FIELD_SYNTHETIC (field) = 1;
15312 if (!TYPE_DOT_CLASS (class_type))
15313 build_dot_class_method (class_type);
15314 classdollar = build_dot_class_method_invocation (class_type, class_type);
15316 /* Call CLASS.desiredAssertionStatus(). */
15317 id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
15318 call = build (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
15319 call = make_qualified_primary (classdollar, call, location);
15320 TREE_SIDE_EFFECTS (call) = 1;
15322 /* Invert to obtain !CLASS.desiredAssertionStatus(). This may
15323 seem odd, but we do it to generate code identical to that of
15324 the JDK. */
15325 call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
15326 TREE_SIDE_EFFECTS (call) = 1;
15327 DECL_INITIAL (field) = call;
15329 /* Record the initializer in the initializer statement list. */
15330 call = build (MODIFY_EXPR, NULL_TREE, field, call);
15331 TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
15332 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
15333 MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
15335 CLASS_USES_ASSERTIONS (klass) = 1;
15338 if (value != NULL_TREE)
15339 value = tree_cons (NULL_TREE, value, NULL_TREE);
15341 node = build_wfl_node (get_identifier ("java"));
15342 node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
15343 location);
15344 node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
15345 location);
15347 node = build (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
15348 TREE_SIDE_EFFECTS (node) = 1;
15349 /* It is too early to use BUILD_THROW. */
15350 node = build1 (THROW_EXPR, NULL_TREE, node);
15351 TREE_SIDE_EFFECTS (node) = 1;
15353 /* We invert the condition; if we just put NODE as the `else' part
15354 then we generate weird-looking bytecode. */
15355 condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
15356 /* Check $assertionsDisabled. */
15357 condition
15358 = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15359 build1 (TRUTH_NOT_EXPR, NULL_TREE,
15360 build_wfl_node (get_identifier ("$assertionsDisabled"))),
15361 condition);
15362 node = build_if_else_statement (location, condition, node, NULL_TREE);
15363 return node;
15366 /* 14.18 The try/catch statements */
15368 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15369 catches TYPE and executes CATCH_STMTS. */
15371 static tree
15372 encapsulate_with_try_catch (int location, tree type_or_name, tree try_stmts,
15373 tree catch_stmts)
15375 tree try_block, catch_clause_param, catch_block, catch;
15377 /* First build a try block */
15378 try_block = build_expr_block (try_stmts, NULL_TREE);
15380 /* Build a catch block: we need a catch clause parameter */
15381 if (TREE_CODE (type_or_name) == EXPR_WITH_FILE_LOCATION)
15383 tree catch_type = obtain_incomplete_type (type_or_name);
15384 jdep *dep;
15385 catch_clause_param = build_decl (VAR_DECL, wpv_id, catch_type);
15386 register_incomplete_type (JDEP_VARIABLE, type_or_name,
15387 catch_clause_param, catch_type);
15388 dep = CLASSD_LAST (ctxp->classd_list);
15389 JDEP_GET_PATCH (dep) = &TREE_TYPE (catch_clause_param);
15391 else
15392 catch_clause_param = build_decl (VAR_DECL, wpv_id,
15393 build_pointer_type (type_or_name));
15395 /* And a block */
15396 catch_block = build_expr_block (NULL_TREE, catch_clause_param);
15398 /* Initialize the variable and store in the block */
15399 catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param,
15400 build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
15401 add_stmt_to_block (catch_block, NULL_TREE, catch);
15403 /* Add the catch statements */
15404 add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
15406 /* Now we can build a CATCH_EXPR */
15407 catch_block = build1 (CATCH_EXPR, NULL_TREE, catch_block);
15409 return build_try_statement (location, try_block, catch_block);
15412 static tree
15413 build_try_statement (int location, tree try_block, tree catches)
15415 tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
15416 EXPR_WFL_LINECOL (node) = location;
15417 return node;
15420 static tree
15421 build_try_finally_statement (int location, tree try_block, tree finally)
15423 tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
15424 EXPR_WFL_LINECOL (node) = location;
15425 return node;
15428 static tree
15429 patch_try_statement (tree node)
15431 int error_found = 0;
15432 tree try = TREE_OPERAND (node, 0);
15433 /* Exception handlers are considered in left to right order */
15434 tree catch = nreverse (TREE_OPERAND (node, 1));
15435 tree current, caught_type_list = NULL_TREE;
15437 /* Check catch clauses, if any. Every time we find an error, we try
15438 to process the next catch clause. We process the catch clause before
15439 the try block so that when processing the try block we can check thrown
15440 exceptions againts the caught type list. */
15441 for (current = catch; current; current = TREE_CHAIN (current))
15443 tree carg_decl, carg_type;
15444 tree sub_current, catch_block, catch_clause;
15445 int unreachable;
15447 /* At this point, the structure of the catch clause is
15448 CATCH_EXPR (catch node)
15449 BLOCK (with the decl of the parameter)
15450 COMPOUND_EXPR
15451 MODIFY_EXPR (assignment of the catch parameter)
15452 BLOCK (catch clause block)
15454 catch_clause = TREE_OPERAND (current, 0);
15455 carg_decl = BLOCK_EXPR_DECLS (catch_clause);
15456 carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
15458 /* Catch clauses can't have more than one parameter declared,
15459 but it's already enforced by the grammar. Make sure that the
15460 only parameter of the clause statement in of class Throwable
15461 or a subclass of Throwable, but that was done earlier. The
15462 catch clause parameter type has also been resolved. */
15464 /* Just make sure that the catch clause parameter type inherits
15465 from java.lang.Throwable */
15466 if (!inherits_from_p (carg_type, throwable_type_node))
15468 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15469 parse_error_context (wfl_operator,
15470 "Can't catch class `%s'. Catch clause parameter type must be a subclass of class `java.lang.Throwable'",
15471 lang_printable_name (carg_type, 0));
15472 error_found = 1;
15473 continue;
15476 /* Partial check for unreachable catch statement: The catch
15477 clause is reachable iff is no earlier catch block A in
15478 the try statement such that the type of the catch
15479 clause's parameter is the same as or a subclass of the
15480 type of A's parameter */
15481 unreachable = 0;
15482 for (sub_current = catch;
15483 sub_current != current; sub_current = TREE_CHAIN (sub_current))
15485 tree sub_catch_clause, decl;
15486 sub_catch_clause = TREE_OPERAND (sub_current, 0);
15487 decl = BLOCK_EXPR_DECLS (sub_catch_clause);
15489 if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
15491 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15492 parse_error_context
15493 (wfl_operator,
15494 "`catch' not reached because of the catch clause at line %d",
15495 EXPR_WFL_LINENO (sub_current));
15496 unreachable = error_found = 1;
15497 break;
15500 /* Complete the catch clause block */
15501 catch_block = java_complete_tree (TREE_OPERAND (current, 0));
15502 if (catch_block == error_mark_node)
15504 error_found = 1;
15505 continue;
15507 if (CAN_COMPLETE_NORMALLY (catch_block))
15508 CAN_COMPLETE_NORMALLY (node) = 1;
15509 TREE_OPERAND (current, 0) = catch_block;
15511 if (unreachable)
15512 continue;
15514 /* Things to do here: the exception must be thrown */
15516 /* Link this type to the caught type list */
15517 caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
15520 PUSH_EXCEPTIONS (caught_type_list);
15521 if ((try = java_complete_tree (try)) == error_mark_node)
15522 error_found = 1;
15523 if (CAN_COMPLETE_NORMALLY (try))
15524 CAN_COMPLETE_NORMALLY (node) = 1;
15525 POP_EXCEPTIONS ();
15527 /* Verification ends here */
15528 if (error_found)
15529 return error_mark_node;
15531 TREE_OPERAND (node, 0) = try;
15532 TREE_OPERAND (node, 1) = catch;
15533 TREE_TYPE (node) = void_type_node;
15534 return node;
15537 /* 14.17 The synchronized Statement */
15539 static tree
15540 patch_synchronized_statement (tree node, tree wfl_op1)
15542 tree expr = java_complete_tree (TREE_OPERAND (node, 0));
15543 tree block = TREE_OPERAND (node, 1);
15545 tree tmp, enter, exit, expr_decl, assignment;
15547 if (expr == error_mark_node)
15549 block = java_complete_tree (block);
15550 return expr;
15553 /* We might be trying to synchronize on a STRING_CST */
15554 if ((tmp = patch_string (expr)))
15555 expr = tmp;
15557 /* The TYPE of expr must be a reference type */
15558 if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
15560 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15561 parse_error_context (wfl_operator, "Incompatible type for `synchronized'. Can't convert `%s' to `java.lang.Object'",
15562 lang_printable_name (TREE_TYPE (expr), 0));
15563 return error_mark_node;
15566 if (flag_emit_xref)
15568 TREE_OPERAND (node, 0) = expr;
15569 TREE_OPERAND (node, 1) = java_complete_tree (block);
15570 CAN_COMPLETE_NORMALLY (node) = 1;
15571 return node;
15574 /* Generate a try-finally for the synchronized statement, except
15575 that the handler that catches all throw exception calls
15576 _Jv_MonitorExit and then rethrow the exception.
15577 The synchronized statement is then implemented as:
15580 _Jv_MonitorEnter (expression)
15581 synchronized_block
15582 _Jv_MonitorExit (expression)
15584 CATCH_ALL
15586 e = _Jv_exception_info ();
15587 _Jv_MonitorExit (expression)
15588 Throw (e);
15589 } */
15591 expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
15592 BUILD_MONITOR_ENTER (enter, expr_decl);
15593 BUILD_MONITOR_EXIT (exit, expr_decl);
15594 CAN_COMPLETE_NORMALLY (enter) = 1;
15595 CAN_COMPLETE_NORMALLY (exit) = 1;
15596 assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
15597 TREE_SIDE_EFFECTS (assignment) = 1;
15598 node = build (COMPOUND_EXPR, NULL_TREE,
15599 build (COMPOUND_EXPR, NULL_TREE, assignment, enter),
15600 build (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
15601 node = build_expr_block (node, expr_decl);
15603 return java_complete_tree (node);
15606 /* 14.16 The throw Statement */
15608 static tree
15609 patch_throw_statement (tree node, tree wfl_op1)
15611 tree expr = TREE_OPERAND (node, 0);
15612 tree type = TREE_TYPE (expr);
15613 int unchecked_ok = 0, tryblock_throws_ok = 0;
15615 /* Thrown expression must be assignable to java.lang.Throwable */
15616 if (!try_reference_assignconv (throwable_type_node, expr))
15618 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15619 parse_error_context (wfl_operator,
15620 "Can't throw `%s'; it must be a subclass of class `java.lang.Throwable'",
15621 lang_printable_name (type, 0));
15622 /* If the thrown expression was a reference, we further the
15623 compile-time check. */
15624 if (!JREFERENCE_TYPE_P (type))
15625 return error_mark_node;
15628 /* At least one of the following must be true */
15630 /* The type of the throw expression is a not checked exception,
15631 i.e. is a unchecked expression. */
15632 unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
15634 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15635 /* An instance can't throw a checked exception unless that exception
15636 is explicitly declared in the `throws' clause of each
15637 constructor. This doesn't apply to anonymous classes, since they
15638 don't have declared constructors. */
15639 if (!unchecked_ok
15640 && DECL_INSTINIT_P (current_function_decl)
15641 && !ANONYMOUS_CLASS_P (current_class))
15643 tree current;
15644 for (current = TYPE_METHODS (current_class); current;
15645 current = TREE_CHAIN (current))
15646 if (DECL_CONSTRUCTOR_P (current)
15647 && !check_thrown_exceptions_do (TREE_TYPE (expr)))
15649 parse_error_context (wfl_operator, "Checked exception `%s' can't be thrown in instance initializer (not all declared constructor are declaring it in their `throws' clause)",
15650 lang_printable_name (TREE_TYPE (expr), 0));
15651 return error_mark_node;
15655 /* Throw is contained in a try statement and at least one catch
15656 clause can receive the thrown expression or the current method is
15657 declared to throw such an exception. Or, the throw statement is
15658 contained in a method or constructor declaration and the type of
15659 the Expression is assignable to at least one type listed in the
15660 throws clause the declaration. */
15661 if (!unchecked_ok)
15662 tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
15663 if (!(unchecked_ok || tryblock_throws_ok))
15665 /* If there is a surrounding try block that has no matching
15666 clatch clause, report it first. A surrounding try block exits
15667 only if there is something after the list of checked
15668 exception thrown by the current function (if any). */
15669 if (IN_TRY_BLOCK_P ())
15670 parse_error_context (wfl_operator, "Checked exception `%s' can't be caught by any of the catch clause(s) of the surrounding `try' block",
15671 lang_printable_name (type, 0));
15672 /* If we have no surrounding try statement and the method doesn't have
15673 any throws, report it now. FIXME */
15675 /* We report that the exception can't be throw from a try block
15676 in all circumstances but when the `throw' is inside a static
15677 block. */
15678 else if (!EXCEPTIONS_P (currently_caught_type_list)
15679 && !tryblock_throws_ok)
15681 if (DECL_CLINIT_P (current_function_decl))
15682 parse_error_context (wfl_operator,
15683 "Checked exception `%s' can't be thrown in initializer",
15684 lang_printable_name (type, 0));
15685 else
15686 parse_error_context (wfl_operator,
15687 "Checked exception `%s' isn't thrown from a `try' block",
15688 lang_printable_name (type, 0));
15690 /* Otherwise, the current method doesn't have the appropriate
15691 throws declaration */
15692 else
15693 parse_error_context (wfl_operator, "Checked exception `%s' doesn't match any of current method's `throws' declaration(s)",
15694 lang_printable_name (type, 0));
15695 return error_mark_node;
15698 if (! flag_emit_class_files && ! flag_emit_xref)
15699 BUILD_THROW (node, expr);
15701 /* If doing xrefs, keep the location where the `throw' was seen. */
15702 if (flag_emit_xref)
15703 EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
15704 return node;
15707 /* Check that exception said to be thrown by method DECL can be
15708 effectively caught from where DECL is invoked. THIS_EXPR is the
15709 expression that computes `this' for the method call. */
15710 static void
15711 check_thrown_exceptions (int location, tree decl, tree this_expr)
15713 tree throws;
15714 int is_array_call = 0;
15716 /* Skip check within generated methods, such as access$<n>. */
15717 if (OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
15718 return;
15720 if (this_expr != NULL_TREE
15721 && TREE_CODE (TREE_TYPE (this_expr)) == POINTER_TYPE
15722 && TYPE_ARRAY_P (TREE_TYPE (TREE_TYPE (this_expr))))
15723 is_array_call = 1;
15725 /* For all the unchecked exceptions thrown by DECL. */
15726 for (throws = DECL_FUNCTION_THROWS (decl); throws;
15727 throws = TREE_CHAIN (throws))
15728 if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
15730 /* Suppress errors about cloning arrays. */
15731 if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
15732 continue;
15734 EXPR_WFL_LINECOL (wfl_operator) = location;
15735 if (DECL_FINIT_P (current_function_decl))
15736 parse_error_context
15737 (wfl_operator, "Exception `%s' can't be thrown in initializer",
15738 lang_printable_name (TREE_VALUE (throws), 0));
15739 else
15741 parse_error_context
15742 (wfl_operator, "Exception `%s' must be caught, or it must be declared in the `throws' clause of `%s'",
15743 lang_printable_name (TREE_VALUE (throws), 0),
15744 (DECL_INIT_P (current_function_decl) ?
15745 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
15746 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
15751 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
15752 try-catch blocks, OR is listed in the `throws' clause of the
15753 current method. */
15755 static int
15756 check_thrown_exceptions_do (tree exception)
15758 tree list = currently_caught_type_list;
15759 resolve_and_layout (exception, NULL_TREE);
15760 /* First, all the nested try-catch-finally at that stage. The
15761 last element contains `throws' clause exceptions, if any. */
15762 if (IS_UNCHECKED_EXCEPTION_P (exception))
15763 return 1;
15764 while (list)
15766 tree caught;
15767 for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
15768 if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
15769 return 1;
15770 list = TREE_CHAIN (list);
15772 return 0;
15775 static void
15776 purge_unchecked_exceptions (tree mdecl)
15778 tree throws = DECL_FUNCTION_THROWS (mdecl);
15779 tree new = NULL_TREE;
15781 while (throws)
15783 tree next = TREE_CHAIN (throws);
15784 if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
15786 TREE_CHAIN (throws) = new;
15787 new = throws;
15789 throws = next;
15791 /* List is inverted here, but it doesn't matter */
15792 DECL_FUNCTION_THROWS (mdecl) = new;
15795 /* This function goes over all of CLASS_TYPE ctors and checks whether
15796 each of them features at least one unchecked exception in its
15797 `throws' clause. If it's the case, it returns `true', `false'
15798 otherwise. */
15800 static bool
15801 ctors_unchecked_throws_clause_p (tree class_type)
15803 tree current;
15805 for (current = TYPE_METHODS (class_type); current;
15806 current = TREE_CHAIN (current))
15808 bool ctu = false; /* Ctor Throws Unchecked */
15809 if (DECL_CONSTRUCTOR_P (current))
15811 tree throws;
15812 for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
15813 throws = TREE_CHAIN (throws))
15814 if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
15815 ctu = true;
15817 /* We return false as we found one ctor that is unfit. */
15818 if (!ctu && DECL_CONSTRUCTOR_P (current))
15819 return false;
15821 /* All ctors feature at least one unchecked exception in their
15822 `throws' clause. */
15823 return true;
15826 /* 15.24 Conditional Operator ?: */
15828 static tree
15829 patch_conditional_expr (tree node, tree wfl_cond, tree wfl_op1)
15831 tree cond = TREE_OPERAND (node, 0);
15832 tree op1 = TREE_OPERAND (node, 1);
15833 tree op2 = TREE_OPERAND (node, 2);
15834 tree resulting_type = NULL_TREE;
15835 tree t1, t2, patched;
15836 int error_found = 0;
15838 /* Operands of ?: might be StringBuffers crafted as a result of a
15839 string concatenation. Obtain a descent operand here. */
15840 if ((patched = patch_string (op1)))
15841 TREE_OPERAND (node, 1) = op1 = patched;
15842 if ((patched = patch_string (op2)))
15843 TREE_OPERAND (node, 2) = op2 = patched;
15845 t1 = TREE_TYPE (op1);
15846 t2 = TREE_TYPE (op2);
15848 /* The first expression must be a boolean */
15849 if (TREE_TYPE (cond) != boolean_type_node)
15851 SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
15852 parse_error_context (wfl_operator,
15853 "Incompatible type for `?:'. Can't convert `%s' to `boolean'",
15854 lang_printable_name (TREE_TYPE (cond), 0));
15855 error_found = 1;
15858 /* Second and third can be numeric, boolean (i.e. primitive),
15859 references or null. Anything else results in an error */
15860 if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
15861 || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
15862 && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
15863 || (t1 == boolean_type_node && t2 == boolean_type_node)))
15864 error_found = 1;
15866 /* Determine the type of the conditional expression. Same types are
15867 easy to deal with */
15868 else if (t1 == t2)
15869 resulting_type = t1;
15871 /* There are different rules for numeric types */
15872 else if (JNUMERIC_TYPE_P (t1))
15874 /* if byte/short found, the resulting type is short */
15875 if ((t1 == byte_type_node && t2 == short_type_node)
15876 || (t1 == short_type_node && t2 == byte_type_node))
15877 resulting_type = short_type_node;
15879 /* If t1 is a constant int and t2 is of type byte, short or char
15880 and t1's value fits in t2, then the resulting type is t2 */
15881 else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
15882 && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
15883 resulting_type = t2;
15885 /* If t2 is a constant int and t1 is of type byte, short or char
15886 and t2's value fits in t1, then the resulting type is t1 */
15887 else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
15888 && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
15889 resulting_type = t1;
15891 /* Otherwise, binary numeric promotion is applied and the
15892 resulting type is the promoted type of operand 1 and 2 */
15893 else
15894 resulting_type = binary_numeric_promotion (t1, t2,
15895 &TREE_OPERAND (node, 1),
15896 &TREE_OPERAND (node, 2));
15899 /* Cases of a reference and a null type */
15900 else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
15901 resulting_type = t1;
15903 else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
15904 resulting_type = t2;
15906 /* Last case: different reference types. If a type can be converted
15907 into the other one by assignment conversion, the latter
15908 determines the type of the expression */
15909 else if ((resulting_type = try_reference_assignconv (t1, op2)))
15910 resulting_type = promote_type (t1);
15912 else if ((resulting_type = try_reference_assignconv (t2, op1)))
15913 resulting_type = promote_type (t2);
15915 /* If we don't have any resulting type, we're in trouble */
15916 if (!resulting_type)
15918 char *t = xstrdup (lang_printable_name (t1, 0));
15919 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15920 parse_error_context (wfl_operator,
15921 "Incompatible type for `?:'. Can't convert `%s' to `%s'",
15922 t, lang_printable_name (t2, 0));
15923 free (t);
15924 error_found = 1;
15927 if (error_found)
15929 TREE_TYPE (node) = error_mark_node;
15930 return error_mark_node;
15933 TREE_TYPE (node) = resulting_type;
15934 TREE_SET_CODE (node, COND_EXPR);
15935 CAN_COMPLETE_NORMALLY (node) = 1;
15936 return node;
15939 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
15941 static tree
15942 maybe_build_class_init_for_field (tree decl, tree expr)
15944 tree clas = DECL_CONTEXT (decl);
15945 if (flag_emit_class_files || flag_emit_xref)
15946 return expr;
15948 if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
15949 && FIELD_FINAL (decl))
15951 tree init = DECL_INITIAL (decl);
15952 if (init != NULL_TREE)
15953 init = fold_constant_for_init (init, decl);
15954 if (init != NULL_TREE && CONSTANT_VALUE_P (init))
15955 return expr;
15958 return build_class_init (clas, expr);
15961 /* Try to constant fold NODE.
15962 If NODE is not a constant expression, return NULL_EXPR.
15963 CONTEXT is a static final VAR_DECL whose initializer we are folding. */
15965 static tree
15966 fold_constant_for_init (tree node, tree context)
15968 tree op0, op1, val;
15969 enum tree_code code = TREE_CODE (node);
15971 switch (code)
15973 case INTEGER_CST:
15974 if (node == null_pointer_node)
15975 return NULL_TREE;
15976 case STRING_CST:
15977 case REAL_CST:
15978 return node;
15980 case PLUS_EXPR:
15981 case MINUS_EXPR:
15982 case MULT_EXPR:
15983 case TRUNC_MOD_EXPR:
15984 case RDIV_EXPR:
15985 case LSHIFT_EXPR:
15986 case RSHIFT_EXPR:
15987 case URSHIFT_EXPR:
15988 case BIT_AND_EXPR:
15989 case BIT_XOR_EXPR:
15990 case BIT_IOR_EXPR:
15991 case TRUTH_ANDIF_EXPR:
15992 case TRUTH_ORIF_EXPR:
15993 case EQ_EXPR:
15994 case NE_EXPR:
15995 case GT_EXPR:
15996 case GE_EXPR:
15997 case LT_EXPR:
15998 case LE_EXPR:
15999 op0 = TREE_OPERAND (node, 0);
16000 op1 = TREE_OPERAND (node, 1);
16001 val = fold_constant_for_init (op0, context);
16002 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16003 return NULL_TREE;
16004 TREE_OPERAND (node, 0) = val;
16005 val = fold_constant_for_init (op1, context);
16006 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16007 return NULL_TREE;
16008 TREE_OPERAND (node, 1) = val;
16009 return patch_binop (node, op0, op1);
16011 case UNARY_PLUS_EXPR:
16012 case NEGATE_EXPR:
16013 case TRUTH_NOT_EXPR:
16014 case BIT_NOT_EXPR:
16015 case CONVERT_EXPR:
16016 op0 = TREE_OPERAND (node, 0);
16017 val = fold_constant_for_init (op0, context);
16018 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16019 return NULL_TREE;
16020 TREE_OPERAND (node, 0) = val;
16021 val = patch_unaryop (node, op0);
16022 if (! TREE_CONSTANT (val))
16023 return NULL_TREE;
16024 return val;
16026 break;
16028 case COND_EXPR:
16029 val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
16030 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16031 return NULL_TREE;
16032 TREE_OPERAND (node, 0) = val;
16033 val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
16034 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16035 return NULL_TREE;
16036 TREE_OPERAND (node, 1) = val;
16037 val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
16038 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16039 return NULL_TREE;
16040 TREE_OPERAND (node, 2) = val;
16041 return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
16042 : TREE_OPERAND (node, 2);
16044 case VAR_DECL:
16045 case FIELD_DECL:
16046 if (! FIELD_FINAL (node)
16047 || DECL_INITIAL (node) == NULL_TREE)
16048 return NULL_TREE;
16049 val = DECL_INITIAL (node);
16050 /* Guard against infinite recursion. */
16051 DECL_INITIAL (node) = NULL_TREE;
16052 val = fold_constant_for_init (val, node);
16053 if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
16054 val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
16055 DECL_INITIAL (node) = val;
16056 return val;
16058 case EXPR_WITH_FILE_LOCATION:
16059 /* Compare java_complete_tree and resolve_expression_name. */
16060 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
16061 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
16063 tree name = EXPR_WFL_NODE (node);
16064 tree decl;
16065 if (PRIMARY_P (node))
16066 return NULL_TREE;
16067 else if (! QUALIFIED_P (name))
16069 decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
16070 if (decl == NULL_TREE
16071 || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
16072 return NULL_TREE;
16073 return fold_constant_for_init (decl, decl);
16075 else
16077 /* Install the proper context for the field resolution.
16078 The prior context is restored once the name is
16079 properly qualified. */
16080 tree saved_current_class = current_class;
16081 /* Wait until the USE_COMPONENT_REF re-write. FIXME. */
16082 current_class = DECL_CONTEXT (context);
16083 qualify_ambiguous_name (node);
16084 current_class = saved_current_class;
16085 if (resolve_field_access (node, &decl, NULL)
16086 && decl != NULL_TREE)
16087 return fold_constant_for_init (decl, decl);
16088 return NULL_TREE;
16091 else
16093 op0 = TREE_OPERAND (node, 0);
16094 val = fold_constant_for_init (op0, context);
16095 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16096 return NULL_TREE;
16097 TREE_OPERAND (node, 0) = val;
16098 return val;
16101 #ifdef USE_COMPONENT_REF
16102 case IDENTIFIER:
16103 case COMPONENT_REF:
16105 #endif
16107 default:
16108 return NULL_TREE;
16112 #ifdef USE_COMPONENT_REF
16113 /* Context is 'T' for TypeName, 'P' for PackageName,
16114 'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16116 tree
16117 resolve_simple_name (tree name, int context)
16121 tree
16122 resolve_qualified_name (tree name, int context)
16125 #endif
16127 void
16128 init_src_parse (void)
16130 /* Sanity check; we've been bit by this before. */
16131 if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
16132 abort ();
16137 /* This section deals with the functions that are called when tables
16138 recording class initialization information are traversed. */
16140 /* Attach to PTR (a block) the declaration found in ENTRY. */
16142 static int
16143 attach_init_test_initialization_flags (void **entry, void *ptr)
16145 tree block = (tree)ptr;
16146 struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
16148 if (block != error_mark_node)
16150 TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
16151 BLOCK_EXPR_DECLS (block) = ite->value;
16153 return true;
16156 /* This function is called for each class that is known definitely
16157 initialized when a given static method was called. This function
16158 augments a compound expression (INFO) storing all assignment to
16159 initialized static class flags if a flag already existed, otherwise
16160 a new one is created. */
16162 static int
16163 emit_test_initialization (void **entry_p, void *info)
16165 tree l = (tree) info;
16166 tree decl, init;
16167 tree key = (tree) *entry_p;
16168 tree *ite;
16169 htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
16171 /* If we haven't found a flag and we're dealing with self registered
16172 with current_function_decl, then don't do anything. Self is
16173 always added as definitely initialized but this information is
16174 valid only if used outside the current function. */
16175 if (current_function_decl == TREE_PURPOSE (l)
16176 && java_treetreehash_find (cf_ht, key) == NULL)
16177 return true;
16179 ite = java_treetreehash_new (cf_ht, key);
16181 /* If we don't have a variable, create one and install it. */
16182 if (*ite == NULL)
16184 tree block;
16186 decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
16187 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
16188 LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
16189 DECL_CONTEXT (decl) = current_function_decl;
16190 DECL_INITIAL (decl) = boolean_true_node;
16191 /* Don't emit any symbolic debugging info for this decl. */
16192 DECL_IGNORED_P (decl) = 1;
16194 /* The trick is to find the right context for it. */
16195 block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
16196 TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
16197 BLOCK_EXPR_DECLS (block) = decl;
16198 *ite = decl;
16200 else
16201 decl = *ite;
16203 /* Now simply augment the compound that holds all the assignments
16204 pertaining to this method invocation. */
16205 init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
16206 TREE_SIDE_EFFECTS (init) = 1;
16207 TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
16208 TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
16210 return true;
16213 #include "gt-java-parse.h"
16214 #include "gtype-java.h"