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)
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
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. */
52 #include "coretypes.h"
61 #include "java-tree.h"
73 #include "tree-inline.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, ...)
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,
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,
319 static int outer_field_access_p (tree, tree);
320 static int outer_field_expanded_access_p (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 */
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
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)); \
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
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
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
501 %token BYTE_TK SHORT_TK INT_TK LONG_TK
502 %token CHAR_TK INTEGRAL_TK
504 %token FLOAT_TK DOUBLE_TK FP_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
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
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 */
618 /* 19.4 Productions from 4: Types, Values and Variables */
631 class_or_interface_type
635 class_or_interface_type:
640 class_or_interface_type /* Default rule */
644 class_or_interface_type
650 int osb = pop_current_osb (ctxp);
651 tree t = build_java_array_type (($1), -1);
653 t = build_unresolved_array_type (t);
658 int osb = pop_current_osb (ctxp);
661 t = build_unresolved_array_type (t);
666 /* 19.5 Productions from 6: Names */
668 simple_name /* Default rule */
669 | qualified_name /* Default rule */
673 identifier /* Default rule */
677 name DOT_TK identifier
678 { $$ = make_qualified_name ($1, $3, $2.location); }
685 /* 19.6: Production from 7: Packages */
688 | package_declaration
689 | import_declarations
691 | package_declaration import_declarations
692 | package_declaration type_declarations
693 | import_declarations type_declarations
694 | package_declaration import_declarations type_declarations
702 | import_declarations import_declaration
710 | type_declarations type_declaration
714 PACKAGE_TK name SC_TK
716 ctxp->package = EXPR_WFL_NODE ($2);
717 register_package (ctxp->package);
720 {yyerror ("Missing name"); RECOVER;}
721 | PACKAGE_TK name error
722 {yyerror ("';' expected"); RECOVER;}
726 single_type_import_declaration
727 | type_import_on_demand_declaration
730 single_type_import_declaration:
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))
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)
748 ($2, "Ambiguous class: `%s' and `%s'",
749 IDENTIFIER_POINTER (name),
750 IDENTIFIER_POINTER (err));
752 REGISTER_IMPORT ($2, last_name);
755 REGISTER_IMPORT ($2, last_name);
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);
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)
772 /* Don't import the same thing more than once, just ignore
773 duplicates (7.5.2) */
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;}
790 { end_class_declaration (0); }
791 | interface_declaration
792 { end_class_declaration (0); }
797 yyerror ("Class or interface declaration expected");
801 /* 19.7 Shortened from the original:
802 modifiers: modifier | modifiers modifier
803 modifier: any of public... */
809 | modifiers MODIFIER_TK
814 (ctxp->modifier_ctx [$2], "Modifier `%s' declared twice",
815 java_accstring_lookup (acc));
823 /* 19.8.1 Production from $8.1: Class Declaration */
825 modifiers CLASS_TK identifier super interfaces
826 { create_class ($1, $3, $4, $5); }
829 | CLASS_TK identifier super interfaces
830 { create_class (0, $2, $3, $4); }
833 | modifiers CLASS_TK error
834 { yyerror ("Missing class name"); RECOVER; }
836 { yyerror ("Missing class name"); RECOVER; }
837 | CLASS_TK identifier error
839 if (!ctxp->class_err) yyerror ("'{' expected");
842 | modifiers CLASS_TK identifier error
843 { if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER; }
848 | EXTENDS_TK class_type
850 | EXTENDS_TK class_type error
851 {yyerror ("'{' expected"); ctxp->class_err=1;}
853 {yyerror ("Missing super class name"); ctxp->class_err=1;}
858 | IMPLEMENTS_TK interface_type_list
860 | IMPLEMENTS_TK error
863 yyerror ("Missing interface name");
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;}
885 /* Store the location of the `}' when doing xrefs */
887 DECL_END_SOURCE_LINE (GET_CPC ()) =
888 EXPR_WFL_ADD_COL ($2.location, 1);
891 | OCB_TK class_body_declarations CCB_TK
893 /* Store the location of the `}' when doing xrefs */
895 DECL_END_SOURCE_LINE (GET_CPC ()) =
896 EXPR_WFL_ADD_COL ($3.location, 1);
901 class_body_declarations:
902 class_body_declaration
903 | class_body_declarations class_body_declaration
906 class_body_declaration:
907 class_member_declaration
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:
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); }
930 /* 19.8.2 Productions from 8.3: Field Declarations */
932 type variable_declarators SC_TK
933 { register_fields (0, $1, $2); }
934 | modifiers type variable_declarators SC_TK
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;}
954 variable_declarator_id
955 { $$ = build_tree_list ($1, NULL_TREE); }
956 | variable_declarator_id ASSIGN_TK variable_initializer
958 if (java_error_count)
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);
969 | variable_declarator_id ASSIGN_TK variable_initializer error
971 yyerror ("';' expected");
972 $$ = build_tree_list ($1, NULL_TREE);
977 variable_declarator_id:
979 | variable_declarator_id OSB_TK CSB_TK
980 { $$ = build_unresolved_array_type ($1); }
982 {yyerror ("Invalid declaration"); DRECOVER(vdi);}
983 | variable_declarator_id OSB_TK error
985 yyerror ("']' expected");
988 | variable_declarator_id CSB_TK error
989 {yyerror ("Unbalanced ']'"); DRECOVER(vdi);}
992 variable_initializer:
997 /* 19.8.3 Productions from 8.4: Method Declarations */
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);
1006 current_function_decl = NULL_TREE;
1009 { finish_method_declaration ($3); }
1010 | method_header error
1011 {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;}
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); }
1025 yyerror ("Invalid method declaration, method name required");
1028 | modifiers type error
1030 yyerror ("Identifier expected");
1035 yyerror ("Identifier expected");
1038 | modifiers VOID_TK error
1040 yyerror ("Identifier expected");
1045 yyerror ("Invalid method declaration, return type required");
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;
1062 build_unresolved_array_type (TREE_PURPOSE ($1));
1063 parse_warning_context
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:
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; }
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;
1099 yyerror ("Missing identifier"); RECOVER;
1104 yyerror ("Missing identifier"); RECOVER;
1112 check_modifiers ("Illegal modifier `%s'. Only `final' was expected here",
1114 if ($1 != ACC_FINAL)
1115 MODIFIER_WFL (FINAL_TK) = build_wfl_node (NULL_TREE);
1121 | THROWS_TK class_type_list
1124 {yyerror ("Missing class type term"); RECOVER;}
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;}
1138 | SC_TK { $$ = NULL_TREE; }
1141 /* 19.8.4 Productions from 8.5: Static Initializers */
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 */
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 ()))
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:
1170 current_function_decl = $1;
1171 source_start_java_method (current_function_decl);
1174 { finish_method_declaration ($3); }
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); }
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;
1203 | block_begin explicit_constructor_invocation constructor_block_end
1205 | block_begin block_statements constructor_block_end
1207 | block_begin explicit_constructor_invocation block_statements constructor_block_end
1211 constructor_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 */
1240 tree wfl = build_wfl_node (this_identifier_node);
1241 EXPR_WFL_LINECOL (wfl) = $1.location;
1246 tree wfl = build_wfl_node (super_identifier_node);
1247 EXPR_WFL_LINECOL (wfl) = $1.location;
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); }
1259 | modifiers INTERFACE_TK identifier
1260 { create_interface ($1, $3, NULL_TREE); }
1263 | INTERFACE_TK identifier extends_interfaces
1264 { create_interface (0, $2, $3); }
1267 | modifiers INTERFACE_TK identifier extends_interfaces
1268 { create_interface ($1, $3, $4); }
1271 | INTERFACE_TK identifier error
1272 { yyerror ("'{' expected"); RECOVER; }
1273 | modifiers INTERFACE_TK identifier error
1274 { yyerror ("'{' expected"); RECOVER; }
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));
1289 {yyerror ("Invalid interface type"); RECOVER;}
1290 | extends_interfaces C_TK error
1291 {yyerror ("Missing term"); RECOVER;}
1297 | OCB_TK interface_member_declarations CCB_TK
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:
1319 abstract_method_declaration:
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 */
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),
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 */
1357 block_begin block_end
1359 | block_begin block_statements block_end
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);
1377 if (!BLOCK_SUBBLOCKS ($$))
1378 BLOCK_SUBBLOCKS ($$) = empty_stmt_node;
1384 | block_statements block_statement
1388 local_variable_declaration_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); }
1410 statement_without_trailing_substatement
1413 | if_then_else_statement
1416 { $$ = exit_block (); }
1420 statement_without_trailing_substatement
1421 | labeled_statement_nsi
1422 | if_then_else_statement_nsi
1423 | while_statement_nsi
1425 { $$ = exit_block (); }
1428 statement_without_trailing_substatement:
1431 | expression_statement
1435 | continue_statement
1437 | synchronized_statement
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;
1462 identifier REL_CL_TK
1464 $$ = build_labeled_block (EXPR_WFL_LINECOL ($1),
1465 EXPR_WFL_NODE ($1));
1467 push_labeled_block ($$);
1468 PUSH_LABELED_BLOCK ($$);
1473 label_decl statement
1474 { $$ = finish_labeled_statement ($1, $2); }
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
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 ($$);
1498 YYNOT_TWICE yyerror ("Invalid expression statement");
1499 DRECOVER (expr_stmt);
1503 YYNOT_TWICE yyerror ("Invalid expression statement");
1504 DRECOVER (expr_stmt);
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 ();
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 ();
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:
1539 | pre_increment_expression
1540 | pre_decrement_expression
1541 | post_increment_expression
1542 | post_decrement_expression
1544 | class_instance_creation_expression
1548 IF_TK OP_TK expression CP_TK statement
1550 $$ = build_if_else_statement ($2.location, $3,
1554 {yyerror ("'(' expected"); RECOVER;}
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); }
1578 /* Make into "proper list" of COMPOUND_EXPRs.
1579 I.e. make the last statement also have its own
1581 maybe_absorb_scoping_blocks ();
1582 TREE_OPERAND ($1, 1) = exit_block ();
1583 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $1);
1588 SWITCH_TK OP_TK expression CP_TK
1590 $$ = build (SWITCH_EXPR, NULL_TREE, $3, NULL_TREE);
1591 EXPR_WFL_LINECOL ($$) = $2.location;
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
1607 | OCB_TK switch_labels CCB_TK
1609 | OCB_TK switch_block_statement_groups CCB_TK
1611 | OCB_TK switch_block_statement_groups switch_labels CCB_TK
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
1626 | switch_labels 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 = make_node (DEFAULT_EXPR);
1639 EXPR_WFL_LINECOL (lab) = $1.location;
1640 java_method_add_stmt (current_function_decl, lab);
1643 {yyerror ("Missing or invalid constant expression"); RECOVER;}
1644 | CASE_TK constant_expression error
1645 {yyerror ("':' expected"); RECOVER;}
1647 {yyerror ("':' expected"); RECOVER;}
1651 WHILE_TK OP_TK expression CP_TK
1653 tree body = build_loop_body ($2.location, $3, 0);
1654 $$ = build_new_loop (body);
1659 while_expression statement
1660 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
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); }
1677 tree body = build_loop_body (0, NULL_TREE, 1);
1678 $$ = build_new_loop (body);
1680 /* Need error handing here. FIXME */
1684 do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1685 { $$ = finish_loop_body ($4.location, $5, $2, 1); }
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) =
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;}
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) =
1725 /* This scope defined for local variable that may be
1726 defined within the scope of the for loop */
1730 {yyerror ("'(' expected"); DRECOVER(for_1);}
1731 | FOR_TK OP_TK error
1732 {yyerror ("Invalid init statement"); RECOVER;}
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 */
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;}
1783 { $$ = build_bc_statement ($1.location, 1, NULL_TREE); }
1784 | BREAK_TK identifier SC_TK
1785 { $$ = build_bc_statement ($1.location, 1, $2); }
1787 {yyerror ("Missing term"); RECOVER;}
1788 | BREAK_TK identifier error
1789 {yyerror ("';' expected"); RECOVER;}
1794 { $$ = build_bc_statement ($1.location, 0, NULL_TREE); }
1795 | CONTINUE_TK identifier SC_TK
1796 { $$ = build_bc_statement ($1.location, 0, $2); }
1798 {yyerror ("Missing term"); RECOVER;}
1799 | CONTINUE_TK identifier error
1800 {yyerror ("';' expected"); RECOVER;}
1805 { $$ = build_return ($1.location, NULL_TREE); }
1806 | RETURN_TK expression SC_TK
1807 { $$ = build_return ($1.location, $2); }
1809 {yyerror ("Missing term"); RECOVER;}
1810 | RETURN_TK expression error
1811 {yyerror ("';' expected"); RECOVER;}
1815 THROW_TK expression SC_TK
1817 $$ = build1 (THROW_EXPR, NULL_TREE, $2);
1818 EXPR_WFL_LINECOL ($$) = $1.location;
1821 {yyerror ("Missing term"); RECOVER;}
1822 | THROW_TK expression error
1823 {yyerror ("';' expected"); RECOVER;}
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);
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;}
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);
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,
1881 {yyerror ("'{' expected"); DRECOVER (try_statement);}
1886 | catches catch_clause
1888 TREE_CHAIN ($2) = $1;
1894 catch_clause_parameter block
1896 java_method_add_stmt (current_function_decl, $2);
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
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),
1919 (TREE_PURPOSE ($3), init));
1920 $$ = build1 (CATCH_EXPR, NULL_TREE, ccpb);
1921 EXPR_WFL_LINECOL ($$) = $1.location;
1925 $$ = error_mark_node;
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;}
1943 {yyerror ("'{' expected"); RECOVER; }
1946 /* 19.12 Production from 15: Expressions */
1948 primary_no_new_array
1949 | array_creation_expression
1952 primary_no_new_array:
1955 { $$ = build_this ($1.location); }
1956 | OP_TK expression CP_TK
1958 | class_instance_creation_expression
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;}
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;}
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,
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
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); }
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
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
2071 | NEW_TK class_type OP_TK CP_TK
2072 { create_anonymous_class ($1.location, $2); }
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. */
2091 | primary DOT_TK NEW_TK
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
2121 | NEW_TK class_or_interface_type dims array_initializer
2124 int osb = pop_current_osb (ctxp);
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);
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;}
2149 { $$ = build_tree_list (NULL_TREE, $1); }
2150 | dim_exprs dim_expr
2151 { $$ = tree_cons (NULL_TREE, $2, $$); }
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;
2165 | OSB_TK expression error
2166 {yyerror ("']' expected"); RECOVER;}
2169 yyerror ("Missing term");
2170 yyerror ("']' expected");
2179 /* If not initialized, allocate memory for the osb
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;
2192 allocate *= sizeof (int);
2193 if (ctxp->osb_number)
2194 ctxp->osb_number = xrealloc (ctxp->osb_number,
2197 ctxp->osb_number = xmalloc (allocate);
2200 CURRENT_OSB (ctxp) = 1;
2202 | dims OSB_TK CSB_TK
2203 { CURRENT_OSB (ctxp)++; }
2205 { yyerror ("']' expected"); RECOVER;}
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);
2220 {yyerror ("Field expected"); DRECOVER (super_field_acces);}
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);
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);
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
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); }
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); }
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);
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
2321 {yyerror ("Missing term"); RECOVER}
2325 trap_overflow_corner_case
2327 error_if_numeric_overflow ($1);
2330 | MINUS_TK trap_overflow_corner_case
2331 {$$ = build_unaryop ($1.token, $1.location, $2); }
2333 {yyerror ("Missing term"); RECOVER}
2336 pre_increment_expression:
2337 INCR_TK unary_expression
2338 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2340 {yyerror ("Missing term"); RECOVER}
2343 pre_decrement_expression:
2344 DECR_TK unary_expression
2345 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2347 {yyerror ("Missing term"); RECOVER}
2350 unary_expression_not_plus_minus:
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); }
2358 {yyerror ("Missing term"); RECOVER}
2360 {yyerror ("Missing term"); RECOVER}
2363 cast_expression: /* Error handling here is potentially weak */
2364 OP_TK primitive_type dims CP_TK unary_expression
2367 int osb = pop_current_osb (ctxp);
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
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)));
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");}
2394 YYNOT_TWICE yyerror ("Invalid type expression"); 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:
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,
2417 | multiplicative_expression REM_TK unary_expression
2419 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
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,
2437 | additive_expression MINUS_TK multiplicative_expression
2439 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2442 | additive_expression PLUS_TK error
2443 {yyerror ("Missing term"); RECOVER;}
2444 | additive_expression MINUS_TK error
2445 {yyerror ("Missing term"); RECOVER;}
2450 | shift_expression LS_TK additive_expression
2452 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2455 | shift_expression SRS_TK additive_expression
2457 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2460 | shift_expression ZRS_TK additive_expression
2462 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
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:
2475 | relational_expression LT_TK shift_expression
2477 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2480 | relational_expression GT_TK shift_expression
2482 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2485 | relational_expression LTE_TK shift_expression
2487 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2490 | relational_expression GTE_TK shift_expression
2492 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
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,
2516 | equality_expression NEQ_TK relational_expression
2518 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2521 | equality_expression EQ_TK error
2522 {yyerror ("Missing term"); RECOVER;}
2523 | equality_expression NEQ_TK error
2524 {yyerror ("Missing term"); RECOVER;}
2529 | and_expression AND_TK equality_expression
2531 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2534 | and_expression AND_TK error
2535 {yyerror ("Missing term"); RECOVER;}
2538 exclusive_or_expression:
2540 | exclusive_or_expression XOR_TK and_expression
2542 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
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,
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,
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,
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
2592 yyerror ("Missing term");
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
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");
2622 assignment_operator:
2628 assignment_expression
2631 constant_expression:
2637 /* Helper function to retrieve an OSB count. Should be used when the
2638 `dims:' rule is being used. */
2641 pop_current_osb (struct parser_ctxt *ctxp)
2645 if (ctxp->osb_depth < 0)
2648 to_return = CURRENT_OSB (ctxp);
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. */
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;
2678 memset (new, 0, sizeof (struct parser_ctxt));
2684 /* Create a new parser context and make it the current one. */
2687 java_push_parser_context (void)
2689 create_new_parser_context (0);
2693 java_pop_parser_context (int generate)
2696 struct parser_ctxt *toFree, *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. */
2728 toFree->next = ctxp_for_generation;
2729 ctxp_for_generation = toFree;
2733 /* Create a parser context for the use of saving some global
2737 java_parser_context_save_global (void)
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. */
2764 java_parser_context_restore_global (void)
2766 input_line = ctxp->lineno;
2767 current_class = ctxp->class_type;
2768 input_filename = ctxp->filename;
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. */
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
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. */
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 */
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
2839 java_parser_context_push_initialized_field (void)
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. */
2861 java_parser_context_pop_initialized_field (void)
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);
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))
2907 /* No static initialized, the list is fine as is */
2909 list = TREE_CHAIN (marker);
2911 /* No marker? reverse the whole list */
2913 list = nreverse (list);
2915 /* Otherwise, reverse what's after the marker and the new reordered
2916 sublist will replace the marker. */
2919 TREE_CHAIN (previous) = NULL_TREE;
2920 list = nreverse (list);
2921 list = chainon (TREE_CHAIN (marker), 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);}
2932 java_debug_context_do (int tab)
2934 struct parser_ctxt *copy = ctxp;
2938 fprintf (stderr, "ctxt: 0x%0lX\n", (unsigned long)copy);
2940 fprintf (stderr, "filename: %s\n", copy->filename);
2942 fprintf (stderr, "lineno: %d\n", copy->lineno);
2944 fprintf (stderr, "package: %s\n",
2946 IDENTIFIER_POINTER (copy->package) : "<none>"));
2948 fprintf (stderr, "context for saving: %d\n", copy->saved_data_ctx);
2950 fprintf (stderr, "saved data: %d\n", copy->saved_data);
2956 /* Dump the stacked up parser contexts. Intended to be called from a
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
2971 static int force_error = 0;
2973 /* Reporting an constructor invocation error. */
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");
2980 yyerror ("Only constructors can invoke constructors");
2983 /* Reporting JDK1.1 features not implemented. */
2986 parse_jdk1_1_error (const char *msg)
2988 sorry (": `%s' JDK1.1(TM) feature", msg);
2990 return empty_stmt_node;
2993 static int do_warning = 0;
2996 yyerror (const char *msg)
2999 static int prev_lineno;
3000 static const char *prev_msg;
3003 char *remainder, *code_from_source;
3005 if (!force_error && prev_lineno == input_line)
3008 /* Save current error location but report latter, when the context is
3010 if (ctxp->java_error_flag == 0)
3012 ctxp->java_error_flag = 1;
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)"));
3022 /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
3023 if (!force_error && msg == prev_msg && prev_lineno == elc.line)
3026 ctxp->java_error_flag = 0;
3028 java_warning_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;
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);
3047 warning ("%s.\n%s", msg, remainder);
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;
3060 issue_warning_error_from_context (tree cl, const char *msg, va_list ap)
3062 const char *saved, *saved_input_filename;
3064 vsprintf (buffer, msg, ap);
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;
3078 java_error (buffer);
3079 ctxp->filename = saved;
3080 input_filename = saved_input_filename;
3084 /* Issue an error message at a current source line CL */
3087 parse_error_context (tree cl, const char *msg, ...)
3091 issue_warning_error_from_context (cl, msg, ap);
3095 /* Issue a warning at a current source line CL */
3098 parse_warning_context (tree cl, const char *msg, ...)
3103 force_error = do_warning = 1;
3104 issue_warning_error_from_context (cl, msg, ap);
3105 do_warning = force_error = 0;
3110 find_expr_with_wfl (tree node)
3117 switch (TREE_CODE (node))
3120 node = BLOCK_EXPR_BODY (node);
3124 to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
3127 node = TREE_OPERAND (node, 1);
3131 node = TREE_OPERAND (node, 0);
3134 case LABELED_BLOCK_EXPR:
3135 node = TREE_OPERAND (node, 1);
3139 code = TREE_CODE_CLASS (TREE_CODE (node));
3140 if (((code == '1') || (code == '2') || (code == 'e'))
3141 && EXPR_WFL_LINECOL (node))
3149 /* Issue a missing return statement error. Uses METHOD to figure the
3150 last line of the method the error occurs in. */
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. */
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));
3169 node = find_expr_with_wfl (node);
3173 EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
3174 parse_error_context (wfl_operator, "Unreachable statement");
3181 not_accessible_field_error (tree wfl, tree decl)
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))));
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;
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
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");
3231 /* Issuing error messages upon redefinition of classes, interfaces or
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 */
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));
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. */
3266 build_type_name_from_array_name (tree aname, tree *trimmed)
3268 const char *name = IDENTIFIER_POINTER (aname);
3269 int len = IDENTIFIER_LENGTH (aname);
3272 STRING_STRIP_BRACKETS (name, len, array_dims);
3274 if (array_dims && trimmed)
3275 *trimmed = get_identifier_with_length (name, len);
3281 build_array_from_name (tree type, tree type_wfl, tree name, tree *ret_name)
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 */
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
3299 if (JPRIMITIVE_TYPE_P (type))
3301 type = build_java_array_type (type, -1);
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) */
3310 more_dims += build_type_name_from_array_name (TYPE_NAME (save),
3314 /* Add all the dimensions */
3316 type = build_unresolved_array_type (type);
3318 /* The type may have been incomplete in the first place */
3320 type = obtain_incomplete_type (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
3333 build_unresolved_array_type (tree type_or_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);
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. */
3370 check_class_interface_creation (int is_interface, int flags, tree raw_name,
3371 tree qualified_name, tree decl, tree cl)
3374 int sca = 0; /* Static class allowed */
3375 int icaf = 0; /* Inner class allowed flags */
3376 int uaaf = CLASS_MODIFIERS; /* Usually allowed access flags */
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))
3392 (cl, "%s name `%s' clashes with imported type `%s'",
3393 (is_interface ? "Interface" : "Class"),
3394 IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
3397 if (decl && CLASS_COMPLETE_P (decl))
3399 classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
3400 qualified_name, decl, cl);
3404 if (check_inner_class_redefinition (raw_name, cl))
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 ))
3413 for (f = &input_filename [strlen (input_filename)];
3414 f != input_filename && ! IS_DIR_SEPARATOR (f[0]);
3417 if (IS_DIR_SEPARATOR (f[0]))
3419 if (strncmp (IDENTIFIER_POINTER (raw_name),
3420 f , IDENTIFIER_LENGTH (raw_name)) ||
3421 f [IDENTIFIER_LENGTH (raw_name)] != '.')
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));
3442 /* Else, in the context of a top-level class declaration, let
3443 `check_modifiers' do its job, otherwise, give it a go */
3445 sca = (GET_CPC_LIST () ? ACC_STATIC : 0);
3448 /* Inner classes can be declared private or protected
3449 within their enclosing classes. */
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
3455 if (current_function_decl)
3456 icaf = sca = uaaf = ACC_FINAL;
3459 check_modifiers_consistency (flags);
3460 icaf = ACC_PROTECTED;
3461 if (! CLASS_INTERFACE (GET_CPC ()))
3462 icaf |= ACC_PRIVATE;
3469 uaaf = INTERFACE_INNER_MODIFIERS;
3471 uaaf = INTERFACE_MODIFIERS;
3473 check_modifiers ("Illegal modifier `%s' for interface declaration",
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);
3484 /* Construct a nested class name. If the final component starts with
3485 a digit, return true. Otherwise return false. */
3487 make_nested_class_name (tree cpc_list)
3494 make_nested_class_name (TREE_CHAIN (cpc_list));
3496 /* Pick the qualified name when dealing with the first upmost
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. */
3510 check_inner_class_redefinition (tree raw_name, tree cl)
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))
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));
3526 /* Tries to find a decl for CLASS_TYPE within ENCLOSING. If we fail,
3527 we remember ENCLOSING and SUPER. */
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) =
3543 if ((decl = find_as_inner_class (local_enclosing, class_type, cl)))
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)))
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;
3565 local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing));
3566 if (!local_super || local_super == object_type_node)
3569 if (TREE_CODE (local_super) == POINTER_TYPE)
3570 local_super = do_resolve_class (NULL, local_super, NULL, NULL);
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)
3579 cl = lookup_cl (local_enclosing);
3582 (cl, "Cyclic inheritance involving %s",
3583 IDENTIFIER_POINTER (DECL_NAME (local_enclosing)));
3584 local_enclosing = NULL_TREE;
3587 local_enclosing = local_super;
3590 /* We failed. Return LOCAL_SUPER and LOCAL_ENCLOSING. */
3591 *super = local_super;
3592 *enclosing = local_enclosing;
3597 /* Within ENCLOSING, find a decl for NAME and return it. NAME can be
3601 find_as_inner_class (tree enclosing, tree name, tree cl)
3603 tree qual, to_return;
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);
3613 qual = build_tree_list (cl, NULL_TREE);
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)))
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 */
3641 qual = EXPR_WFL_QUALIFICATION (cl);
3643 /* Otherwise, create a qual for the other part of the resolution. */
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
3654 find_as_inner_class_do (tree qual, tree enclosing)
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;
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);
3674 enclosing = next_enclosing;
3677 return (!qual && enclosing ? enclosing : NULL_TREE);
3680 /* Reach all inner classes and tie their unqualified name to a
3684 set_nested_class_simple_name_value (tree outer, int set)
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);
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));
3706 maybe_make_nested_class_name (tree name)
3708 tree id = NULL_TREE;
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]))
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));
3731 QUALIFIED_P (id) = 1;
3736 /* If DECL is NULL, create and push a new DECL, record the current
3737 line CL and do other maintenance things. */
3740 maybe_create_class_interface_decl (tree decl, tree raw_name,
3741 tree qualified_name, tree cl)
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 */
3750 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
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)));
3778 add_superinterfaces (tree decl, tree interface_list)
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
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);
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. */
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
3815 if (ctxp->class_err && id == super)
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))
3827 /* Suspend the current parsing context if we're parsing an inner
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);
3865 /* Patch anonymous class CLASS, by either extending or implementing
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))
3881 if (parser_check_super_interface (type_decl, class_decl, wfl))
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 */
3894 if (parser_check_super (type_decl, class_decl, wfl))
3896 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (binfo), 0)) = type;
3901 create_anonymous_class (int location, tree type_name)
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);
3929 class = create_class (ACC_FINAL, id, super, itf);
3931 /* We didn't know anything about the stuff. We register a dependence. */
3933 register_incomplete_type (JDEP_ANONYMOUS, type_name, class, NULL_TREE);
3935 ANONYMOUS_CLASS_P (TREE_TYPE (class)) = 1;
3939 /* Create a class in pass1 and return its decl. Return class
3940 interface's decl in pass 2. */
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
3951 if (ctxp->class_err && id == super)
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))
3965 /* Suspend the current parsing context if we're parsing an inner
3966 class or an anonymous class. */
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))
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 */
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'");
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 */
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;
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. */
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 ();
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;
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))),
4080 FIELD_THISN (f) = 1;
4085 for (block = GET_CURRENT_BLOCK (fct_decl);
4086 block && TREE_CODE (block) == BLOCK; block = BLOCK_SUPERCONTEXT (block))
4089 for (decl = BLOCK_EXPR_DECLS (block); decl; decl = TREE_CHAIN (decl))
4092 tree wfl, init, list;
4094 /* Avoid non final arguments. */
4095 if (!LOCAL_FINAL_P (decl))
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
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),
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))
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 */
4160 find_field (tree class, tree name)
4163 for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
4165 if (DECL_NAME (decl) == name)
4171 /* Wrap around lookup_field that doesn't potentially upset the value
4175 lookup_field_wrapper (tree class, tree name)
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)
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)
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
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);
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
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)));
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));
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 () */
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;
4255 tree wfl = NULL_TREE;
4258 class_type = TREE_TYPE (GET_CPC ());
4260 if (!class_type || class_type == error_mark_node)
4263 /* If we're adding fields to interfaces, those fields are public,
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)
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))
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, ¤t_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);
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))
4320 /* Set lineno to the line the field was found and create a
4321 declaration for it. Eventually sets the @deprecated tag flag. */
4323 input_line = EXPR_WFL_LINECOL (cl);
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
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. */
4353 register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
4355 /* If we have an initialization value tied to the field */
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
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>. */
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);
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
4396 generate_finit (tree class_type)
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,
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),
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),
4418 end_artificial_method_body (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. */
4430 generate_instinit (tree class_type)
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,
4438 instinit_identifier_node, parms);
4440 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
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);
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));
4481 build_method_invocation (build_wfl_node (instinit_identifier_node),
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. */
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;
4509 int constructor_ok = 0, must_chain;
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);
4520 this_class = TREE_TYPE (GET_CPC ());
4522 if (!this_class || this_class == error_mark_node)
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)))
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 */
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 ())
4563 (id, "Invalid method declaration, return type required");
4564 /* 8.6.3: Constructor modifiers */
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
4577 if (ec == java_error_count)
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))
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) */
4615 type = void_type_node;
4617 meth_name = init_identifier_node;
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);
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);
4632 patch_stage = JDEP_METHOD_RETURN;
4633 register_incomplete_type (patch_stage, type_wfl, id, type);
4634 TREE_TYPE (meth) = GET_REAL_TYPE (type);
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
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 */
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
4661 register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
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
4672 fix_method_argument_names (orig_arg, meth);
4674 /* Register the parameter number and re-install the current line
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
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 */
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))
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. */
4718 DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
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. */
4743 finish_method_declaration (tree method_body)
4747 if (!current_function_decl)
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);
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 */
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. */
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));
4810 /* Verify a circular call to METH. Return 1 if an error is found, 0
4813 static GTY(()) tree vcc_list;
4815 verify_constructor_circularity (tree meth, tree current)
4819 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4821 if (TREE_VALUE (c) == meth)
4827 vcc_list = nreverse (vcc_list);
4828 for (liste = vcc_list; liste; liste = TREE_CHAIN (liste))
4831 (TREE_PURPOSE (TREE_PURPOSE (liste)), "%s",
4832 constructor_circularity_msg
4833 (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
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);
4842 vcc_list = NULL_TREE;
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)))
4851 vcc_list = TREE_CHAIN (vcc_list);
4856 /* Check modifiers that can be declared but exclusively */
4859 check_modifiers_consistency (int flags)
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);
4869 (cl, "Inconsistent member declaration. At most one of `public', `private', or `protected' may be specified");
4873 THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK, acc_count, cl);
4874 THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK, acc_count, cl);
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 */
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. */
4904 method_declarator (tree id, tree list)
4906 tree arg_types = NULL_TREE, current, node;
4907 tree meth = make_node (FUNCTION_TYPE);
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 */
4925 build_alias_initializer_parameter_list (AIPL_FUNCTION_DECLARATION,
4926 TREE_TYPE (GET_CPC ()),
4928 list = chainon (nreverse (aliases_list), list);
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),
4937 for (current = list; current; current = TREE_CHAIN (current))
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;
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)
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)));
4973 /* If we've an incomplete argument type, we know there is a location
4974 to patch when the type get resolved, later. */
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);
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);
5001 unresolved_type_p (tree wfl, tree *returned)
5004 if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
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 ());
5014 *returned = NULL_TREE;
5023 /* From NAME, build a qualified identifier node using the
5024 qualification from the current package definition. */
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;
5035 return merge_qualified_name (ctxp->package, name);
5040 /* Called once the type a interface extends is resolved. Returns 0 if
5041 everything is OK. */
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))
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)));
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))
5068 SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
5069 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5070 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5074 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
5075 0 if everything is OK. */
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)))
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)));
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)));
5100 /* Check top-level class scope. Inner classes are subject to member access
5102 if (! INNER_CLASS_P (super_type)
5103 && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true)))
5106 SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
5107 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5108 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5112 /* Create a new dependency list and link it (in a LIFO manner) to the
5113 CTXP list of type dependency list. */
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;
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;
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. */
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);
5153 /* Workaround from build_pointer_type for incomplete types. */
5154 BUILD_PTR_FROM_NAME (ptr, name);
5155 TYPE_MODE (ptr) = ptr_mode;
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
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);
5189 JDEP_ENCLOSING (new) = GET_CPC ();
5190 JDEP_GET_PATCH (new) = (tree *)NULL;
5192 JDEP_INSERT (ctxp->classd_list, new);
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
5206 check_inner_circular_reference (tree source, tree target)
5208 tree basetype_vec = TYPE_BINFO_BASETYPES (source);
5215 for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
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)
5224 su = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
5225 if (INCOMPLETE_TYPE_P (su))
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)))
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. */
5252 check_circular_reference (tree type)
5254 tree basetype_vec = TYPE_BINFO_BASETYPES (type);
5260 if (! CLASS_INTERFACE (TYPE_NAME (type)))
5262 if (inherits_from_p (CLASSTYPE_SUPER (type), type))
5263 return lookup_cl (TYPE_NAME (type));
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)));
5278 java_check_circular_reference (void)
5281 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5283 tree type = TREE_TYPE (current);
5286 cl = check_circular_reference (type);
5288 cl = check_inner_circular_reference (type, type);
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
5304 build_alias_initializer_parameter_list (int mode, tree class_type, tree parm,
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;
5319 case AIPL_FUNCTION_DECLARATION:
5320 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
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)));
5326 value = TREE_TYPE (field);
5329 case AIPL_FUNCTION_CREATION:
5330 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (purpose,
5332 value = TREE_TYPE (field);
5335 case AIPL_FUNCTION_FINIT_INVOCATION:
5336 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
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);
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)
5358 name = get_identifier (&buffer[4]);
5359 value = IDENTIFIER_LOCAL_VALUE (name);
5363 additional_parms = tree_cons (purpose, value, additional_parms);
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);
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. */
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 ?
5389 int i = 0, artificial = 0;
5390 tree decl, ctor_name;
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
5396 if (ANONYMOUS_CLASS_P (class_type))
5397 ctor_name = DECL_NAME (class_decl);
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,
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,
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;
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. */
5442 java_fix_constructors (void)
5446 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5448 tree class_type = TREE_TYPE (current);
5452 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
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);
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. */
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;
5488 jdep_resolve_class (jdep *dep)
5492 if (JDEP_RESOLVED_P (dep))
5493 decl = JDEP_RESOLVED_DECL (dep);
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
5501 if (decl && JDEP_WFL (dep) != NULL_TREE)
5502 check_deprecation (JDEP_WFL (dep), 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));
5521 /* Complete unsatisfied class declaration and their dependencies */
5524 java_complete_class (void)
5531 /* 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;
5540 cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
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))
5553 if (!(decl = jdep_resolve_class (dep)))
5556 /* Now it's time to patch */
5557 switch (JDEP_KIND (dep))
5560 /* Simply patch super */
5561 if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
5563 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO
5564 (TREE_TYPE (JDEP_DECL (dep)))), 0)) = TREE_TYPE (decl);
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))));
5584 case JDEP_METHOD: /* We start patching a method */
5585 case JDEP_METHOD_RETURN:
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))));
5605 dep = JDEP_CHAIN (dep);
5606 if (JDEP_KIND (dep) == JDEP_METHOD_END)
5609 decl = jdep_resolve_class (dep);
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);
5627 case JDEP_INTERFACE:
5628 if (parser_check_super_interface (decl, JDEP_DECL (dep),
5631 parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
5636 type = TREE_TYPE(decl);
5637 if (TREE_CODE (type) == RECORD_TYPE)
5638 type = promote_type (type);
5639 JDEP_APPLY_PATCH (dep, 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))]));
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)))));
5656 case JDEP_ANONYMOUS:
5657 patch_anonymous_class (decl, JDEP_DECL (dep), JDEP_WFL (dep));
5668 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
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);
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),
5689 return resolved_type_decl;
5692 /* 1- Check to see if we have an array. If true, find what we really
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,
5702 resolved_type = TREE_TYPE (resolved_type_decl);
5704 /* 3- If we have an array, reconstruct the array down to its nesting */
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. */
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;
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);
5743 saved_enclosing_type = TREE_TYPE (q);
5744 BUILD_PTR_FROM_NAME (class_type, right);
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,
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. */
5764 new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing,
5765 &super, class_type);
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);
5775 enclosing = NULL_TREE;
5778 htab_delete (circularity_hash);
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))
5811 /* If found in find_in_imports_on_demand, the type has already been
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)))
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);
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
5843 if (check_pkg_class_access (TYPE_NAME (class_type), cl, true))
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)))
5856 tree name = TYPE_NAME (class_type);
5857 char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1);
5859 strcpy (namebuffer, IDENTIFIER_POINTER (name));
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, '.')))
5868 name = get_identifier (namebuffer);
5869 decl_result = IDENTIFIER_CLASS_VALUE (name);
5871 } while (!decl_result && separator);
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);
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. */
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)
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)
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)))
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)))
5944 /* Resolve and layout if necessary */
5945 decl_type = TREE_TYPE (decl);
5946 layout_class_methods (decl_type);
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);
5957 /* Resolve a class, returns its decl but doesn't perform any
5958 layout. The current parsing context is saved and restored */
5961 resolve_no_layout (tree name, tree cl)
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 ();
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. */
5977 purify_type_name (const char *name)
5979 int len = strlen (name);
5982 STRING_STRIP_BRACKETS (name, len, bracket_found);
5985 char *stripped_name = xmemdup (name, len, len+1);
5986 stripped_name [len] = '\0';
5987 return stripped_name;
5992 /* The type CURRENT refers to can't be found. We print error messages. */
5995 complete_class_report_errors (jdep *dep)
5999 if (!JDEP_WFL (dep))
6002 name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
6003 switch (JDEP_KIND (dep))
6007 (JDEP_WFL (dep), "Superclass `%s' of class `%s' not found",
6008 purify_type_name (name),
6009 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
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))));
6017 case JDEP_METHOD: /* Covers arguments */
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))));
6024 case JDEP_METHOD_RETURN: /* Covers return type */
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))));
6030 case JDEP_INTERFACE:
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))));
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))));
6044 case JDEP_EXCEPTION: /* As specified by `throws' */
6046 (JDEP_WFL (dep), "Class `%s' not found in `throws'",
6047 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
6050 /* Fix for -Wall. Just break doing nothing. The error will be
6056 /* Return a static string containing the DECL prototype string. If
6057 DECL is a constructor, use the class name instead of the form
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;
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.) */
6084 check_method_redefinition (tree class, tree method)
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))
6093 sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
6094 for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
6096 if (redef == method)
6098 if (DECL_NAME (redef) == DECL_NAME (method)
6099 && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))
6100 && !DECL_ARTIFICIAL (method))
6103 (DECL_FUNCTION_WFL (method), "Duplicate %s declaration `%s'",
6104 (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
6105 get_printable_method_name (redef));
6112 /* Return 1 if check went ok, 0 otherwise. */
6114 check_abstract_method_definitions (int do_interface, tree class_decl,
6117 tree class = TREE_TYPE (class_decl);
6118 tree method, end_type;
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;
6126 int end_type_reached = 0;
6128 if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
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;
6142 if (other_super == end_type)
6143 end_type_reached = 1;
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
6158 && !METHOD_ABSTRACT (other_method))
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. */
6171 char *t = xstrdup (lang_printable_name
6172 (TREE_TYPE (TREE_TYPE (method)), 0));
6173 tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
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)));
6190 if (ok && do_interface)
6192 /* Check for implemented interfaces. */
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);
6205 /* Check that CLASS_DECL somehow implements all inherited abstract
6209 java_check_abstract_method_definitions (tree class_decl)
6211 tree class = TREE_TYPE (class_decl);
6215 if (CLASS_ABSTRACT (class_decl))
6218 /* Check for inherited types */
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. */
6239 check_method_types_complete (tree decl)
6241 tree type = TREE_TYPE (decl);
6244 if (!INCOMPLETE_TYPE_P (TREE_TYPE (type)))
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)))
6257 /* Visible interface to check methods contained in CLASS_DECL */
6260 java_check_methods (tree class_decl)
6262 if (CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)))
6265 if (CLASS_INTERFACE (class_decl))
6266 java_check_abstract_methods (class_decl);
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
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))
6284 if ((flags & ACC_PROTECTED))
6286 if (inherits_from_p (from_where, DECL_CONTEXT (member)))
6290 if ((flags & ACC_PRIVATE))
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
6303 java_check_regular_methods (tree class_decl)
6305 int saw_constructor = ANONYMOUS_CLASS_P (TREE_TYPE (class_decl));
6307 tree class = TREE_TYPE (class_decl);
6308 tree found = NULL_TREE;
6311 /* It is not necessary to check methods defined in java.lang.Object */
6312 if (class == object_type_node)
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))
6322 tree method_wfl = DECL_FUNCTION_WFL (method);
6325 /* Check for redefinitions */
6326 if (check_method_redefinition (class, method))
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))
6336 (TREE_PURPOSE (mthrows), "Class `%s' in `throws' clause must be a subclass of class `java.lang.Throwable'",
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;
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));
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);
6364 /* Nothing overrides or it's a private method. */
6367 if (METHOD_PRIVATE (found))
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
6388 if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
6391 (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6394 "Method `%s' was defined with return type `%s' in class `%s'",
6395 lang_printable_name (found, 0), t,
6397 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
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))
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"),
6416 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6420 /* Static method can't override instance method. */
6421 if (METHOD_STATIC (method))
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),
6428 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
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
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))))
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)))));
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
6475 java_check_abstract_method_definitions (class_decl);
6477 if (!saw_constructor)
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. */
6485 check_interface_throws_clauses (tree check_class_decl, tree class_decl)
6487 for (; class_decl != NULL_TREE; class_decl = CLASSTYPE_SUPER (class_decl))
6493 if (! CLASS_LOADED_P (class_decl))
6495 if (CLASS_FROM_SOURCE_P (class_decl))
6496 safe_layout_class (class_decl);
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));
6508 for (iface_method = TYPE_METHODS (interface);
6509 iface_method != NULL_TREE;
6510 iface_method = TREE_CHAIN (iface_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
6518 sig = build_java_argument_signature (TREE_TYPE (iface_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
6528 if (method != NULL_TREE && !METHOD_ABSTRACT (method)
6529 && !METHOD_INVISIBLE (iface_method))
6531 tree method_wfl = DECL_FUNCTION_WFL (method);
6532 check_throws_clauses (method, method_wfl, iface_method);
6536 /* Now check superinterfaces. */
6537 check_interface_throws_clauses (check_class_decl, interface);
6542 /* Check throws clauses of a method against the clauses of all the
6543 methods it overrides. We do this by searching up the class
6544 hierarchy, examining all matching accessible methods. */
6546 check_concrete_throws_clauses (tree class, tree self_method,
6547 tree name, tree signature)
6549 tree method = lookup_argument_method_generic (class, name, signature,
6550 SEARCH_SUPER | SEARCH_VISIBLE);
6551 while (method != NULL_TREE)
6553 if (! METHOD_INVISIBLE (method) && hack_is_accessible_p (method, class))
6554 check_throws_clauses (self_method, DECL_FUNCTION_WFL (self_method),
6557 method = lookup_argument_method_generic (DECL_CONTEXT (method),
6559 SEARCH_SUPER | SEARCH_VISIBLE);
6563 /* Generate an error if the `throws' clause of METHOD (if any) is
6564 incompatible with the `throws' clause of FOUND (if any). */
6566 check_throws_clauses (tree method, tree method_wfl, tree found)
6570 /* Can't check these things with class loaded from bytecode. FIXME */
6571 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
6574 for (mthrows = DECL_FUNCTION_THROWS (method);
6575 mthrows; mthrows = TREE_CHAIN (mthrows))
6579 /* We don't verify unchecked expressions */
6580 if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
6582 /* Checked expression must be compatible */
6583 for (fthrows = DECL_FUNCTION_THROWS (found);
6584 fthrows; fthrows = TREE_CHAIN (fthrows))
6586 if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
6592 (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'",
6593 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
6594 lang_printable_name (found, 0),
6596 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6601 /* Check abstract method of interface INTERFACE */
6603 java_check_abstract_methods (tree interface_decl)
6606 tree method, basetype_vec, found;
6607 tree interface = TREE_TYPE (interface_decl);
6609 for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
6611 /* 2- Check for double definition inside the defining interface */
6612 if (check_method_redefinition (interface, method))
6615 /* 3- Overriding is OK as far as we preserve the return type. */
6616 found = lookup_java_interface_method2 (interface, method);
6620 t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6622 (DECL_FUNCTION_WFL (found),
6623 "Method `%s' was defined with return type `%s' in class `%s'",
6624 lang_printable_name (found, 0), t,
6626 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6632 /* 4- Inherited methods can't differ by their returned types */
6633 if (!(basetype_vec = TYPE_BINFO_BASETYPES (interface)))
6635 n = TREE_VEC_LENGTH (basetype_vec);
6636 for (i = 0; i < n; i++)
6638 tree sub_interface_method, sub_interface;
6639 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
6642 sub_interface = BINFO_TYPE (vec_elt);
6643 for (sub_interface_method = TYPE_METHODS (sub_interface);
6644 sub_interface_method;
6645 sub_interface_method = TREE_CHAIN (sub_interface_method))
6647 found = lookup_java_interface_method2 (interface,
6648 sub_interface_method);
6649 if (found && (found != sub_interface_method))
6652 (lookup_cl (sub_interface_method),
6653 "Interface `%s' inherits method `%s' from interface `%s'. This method is redefined with a different return type in interface `%s'",
6654 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
6655 lang_printable_name (found, 0),
6657 (DECL_NAME (TYPE_NAME
6658 (DECL_CONTEXT (sub_interface_method)))),
6660 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6666 /* Lookup methods in interfaces using their name and partial
6667 signature. Return a matching method only if their types differ. */
6670 lookup_java_interface_method2 (tree class, tree method_decl)
6673 tree basetype_vec = TYPE_BINFO_BASETYPES (class), to_return;
6678 n = TREE_VEC_LENGTH (basetype_vec);
6679 for (i = 0; i < n; i++)
6681 tree vec_elt = TREE_VEC_ELT (basetype_vec, i), to_return;
6682 if ((BINFO_TYPE (vec_elt) != object_type_node)
6684 lookup_java_method2 (BINFO_TYPE (vec_elt), method_decl, 1)))
6687 for (i = 0; i < n; i++)
6689 to_return = lookup_java_interface_method2
6690 (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)), method_decl);
6698 /* Lookup method using their name and partial signature. Return a
6699 matching method only if their types differ. */
6702 lookup_java_method2 (tree clas, tree method_decl, int do_interface)
6704 tree method, method_signature, method_name, method_type, name;
6706 method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
6707 name = DECL_NAME (method_decl);
6708 method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6709 EXPR_WFL_NODE (name) : name);
6710 method_type = TREE_TYPE (TREE_TYPE (method_decl));
6712 while (clas != NULL_TREE)
6714 for (method = TYPE_METHODS (clas);
6715 method != NULL_TREE; method = TREE_CHAIN (method))
6717 tree method_sig = build_java_argument_signature (TREE_TYPE (method));
6718 tree name = DECL_NAME (method);
6719 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6720 EXPR_WFL_NODE (name) : name) == method_name
6721 && method_sig == method_signature
6722 && TREE_TYPE (TREE_TYPE (method)) != method_type)
6725 clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
6730 /* Return the line that matches DECL line number, and try its best to
6731 position the column number. Used during error reports. */
6733 static GTY(()) tree cl_v;
6735 lookup_cl (tree decl)
6742 if (cl_v == NULL_TREE)
6744 cl_v = build_expr_wfl (NULL_TREE, NULL, 0, 0);
6747 EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
6748 EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE (decl), -1);
6750 line = java_get_line_col (EXPR_WFL_FILENAME (cl_v),
6751 EXPR_WFL_LINENO (cl_v), EXPR_WFL_COLNO (cl_v));
6753 found = strstr ((const char *)line,
6754 (const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
6756 EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
6761 /* Look for a simple name in the single-type import list */
6764 find_name_in_single_imports (tree name)
6768 for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
6769 if (TREE_VALUE (node) == name)
6770 return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
6775 /* Process all single-type import. */
6778 process_imports (void)
6783 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
6785 tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
6786 char *original_name;
6788 original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
6789 IDENTIFIER_LENGTH (to_be_found),
6790 IDENTIFIER_LENGTH (to_be_found) + 1);
6792 /* Don't load twice something already defined. */
6793 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6800 QUALIFIED_P (to_be_found) = 1;
6801 load_class (to_be_found, 0);
6803 check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true);
6805 /* We found it, we can bail out */
6806 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6808 check_deprecation (TREE_PURPOSE (import),
6809 IDENTIFIER_CLASS_VALUE (to_be_found));
6813 /* We haven't found it. Maybe we're trying to access an
6814 inner class. The only way for us to know is to try again
6815 after having dropped a qualifier. If we can't break it further,
6816 we have an error. */
6817 if (breakdown_qualified (&left, NULL, to_be_found))
6822 if (!IDENTIFIER_CLASS_VALUE (to_be_found))
6824 parse_error_context (TREE_PURPOSE (import),
6825 "Class or interface `%s' not found in import",
6830 free (original_name);
6837 /* Possibly find and mark a class imported by a single-type import
6841 find_in_imports (tree enclosing_type, tree class_type)
6843 tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) :
6847 if (TREE_VALUE (import) == TYPE_NAME (class_type))
6849 TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
6850 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
6853 import = TREE_CHAIN (import);
6858 note_possible_classname (const char *name, int len)
6861 if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
6863 else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
6867 node = ident_subst (name, len, "", '/', '.', "");
6868 IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
6869 QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
6873 /* Read a import directory, gathering potential match for further type
6874 references. Indifferently reads a filesystem or a ZIP archive
6878 read_import_dir (tree wfl)
6880 tree package_id = EXPR_WFL_NODE (wfl);
6881 const char *package_name = IDENTIFIER_POINTER (package_id);
6882 int package_length = IDENTIFIER_LENGTH (package_id);
6884 JCF *saved_jcf = current_jcf;
6889 struct buffer filename[1];
6891 if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
6893 IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
6895 BUFFER_INIT (filename);
6896 buffer_grow (filename, package_length + 100);
6898 for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
6900 const char *entry_name = jcf_path_name (entry);
6901 int entry_length = strlen (entry_name);
6902 if (jcf_path_is_zipfile (entry))
6905 buffer_grow (filename, entry_length);
6906 memcpy (filename->data, entry_name, entry_length - 1);
6907 filename->data[entry_length-1] = '\0';
6908 zipf = opendir_in_zip (filename->data, jcf_path_is_system (entry));
6910 error ("malformed .zip archive in CLASSPATH: %s", entry_name);
6913 ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
6914 BUFFER_RESET (filename);
6915 for (k = 0; k < package_length; k++)
6917 char ch = package_name[k];
6918 *filename->ptr++ = ch == '.' ? '/' : ch;
6920 *filename->ptr++ = '/';
6922 for (k = 0; k < zipf->count; k++, zipd = ZIPDIR_NEXT (zipd))
6924 const char *current_entry = ZIPDIR_FILENAME (zipd);
6925 int current_entry_len = zipd->filename_length;
6927 if (current_entry_len >= BUFFER_LENGTH (filename)
6928 && strncmp (filename->data, current_entry,
6929 BUFFER_LENGTH (filename)) != 0)
6931 found |= note_possible_classname (current_entry,
6938 BUFFER_RESET (filename);
6939 buffer_grow (filename, entry_length + package_length + 4);
6940 strcpy (filename->data, entry_name);
6941 filename->ptr = filename->data + entry_length;
6942 for (k = 0; k < package_length; k++)
6944 char ch = package_name[k];
6945 *filename->ptr++ = ch == '.' ? '/' : ch;
6947 *filename->ptr = '\0';
6949 dirp = opendir (filename->data);
6952 *filename->ptr++ = '/';
6957 struct dirent *direntp = readdir (dirp);
6960 d_name = direntp->d_name;
6961 len = strlen (direntp->d_name);
6962 buffer_grow (filename, len+1);
6963 strcpy (filename->ptr, d_name);
6964 found |= note_possible_classname (filename->data + entry_length,
6965 package_length+len+1);
6972 free (filename->data);
6974 /* Here we should have a unified way of retrieving an entry, to be
6978 static int first = 1;
6981 error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives", package_name);
6986 parse_error_context (wfl, "Package `%s' not found in import",
6988 current_jcf = saved_jcf;
6991 current_jcf = saved_jcf;
6994 /* Possibly find a type in the import on demands specified
6995 types. Returns 1 if an error occurred, 0 otherwise. Run through the
6996 entire list, to detected potential double definitions. */
6999 find_in_imports_on_demand (tree enclosing_type, tree class_type)
7001 tree class_type_name = TYPE_NAME (class_type);
7002 tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) :
7003 ctxp->import_demand_list);
7004 tree cl = NULL_TREE;
7005 int seen_once = -1; /* -1 when not set, 1 if seen once, >1 otherwise. */
7006 int to_return = -1; /* -1 when not set, 0 or 1 otherwise */
7009 for (; import; import = TREE_CHAIN (import))
7011 int saved_lineno = input_line;
7013 const char *id_name;
7014 tree decl, type_name_copy;
7016 obstack_grow (&temporary_obstack,
7017 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
7018 IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
7019 obstack_1grow (&temporary_obstack, '.');
7020 obstack_grow0 (&temporary_obstack,
7021 IDENTIFIER_POINTER (class_type_name),
7022 IDENTIFIER_LENGTH (class_type_name));
7023 id_name = obstack_finish (&temporary_obstack);
7025 if (! (node = maybe_get_identifier (id_name)))
7028 /* Setup lineno so that it refers to the line of the import (in
7029 case we parse a class file and encounter errors */
7030 input_line = EXPR_WFL_LINENO (TREE_PURPOSE (import));
7032 type_name_copy = TYPE_NAME (class_type);
7033 TYPE_NAME (class_type) = node;
7034 QUALIFIED_P (node) = 1;
7035 decl = IDENTIFIER_CLASS_VALUE (node);
7037 /* If there is no DECL set for the class or if the class isn't
7038 loaded and not seen in source yet, then load */
7039 if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl))
7040 && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl))))
7042 load_class (node, 0);
7043 decl = IDENTIFIER_CLASS_VALUE (node);
7045 if (decl && ! INNER_CLASS_P (TREE_TYPE (decl)))
7046 access_check = check_pkg_class_access (node, TREE_PURPOSE (import),
7049 /* 6.6.1: Inner classes are subject to member access rules. */
7052 input_line = saved_lineno;
7054 /* If the loaded class is not accessible or couldn't be loaded,
7055 we restore the original TYPE_NAME and process the next
7057 if (access_check || !decl)
7059 TYPE_NAME (class_type) = type_name_copy;
7063 /* If the loaded class is accessible, we keep a tab on it to
7064 detect and report multiple inclusions. */
7065 if (IS_A_CLASSFILE_NAME (node))
7069 cl = TREE_PURPOSE (import);
7072 else if (seen_once >= 0)
7074 tree location = (cl ? cl : TREE_PURPOSE (import));
7075 tree package = (cl ? EXPR_WFL_NODE (cl) :
7076 EXPR_WFL_NODE (TREE_PURPOSE (import)));
7080 "Type `%s' also potentially defined in package `%s'",
7081 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
7082 IDENTIFIER_POINTER (package));
7085 to_return = access_check;
7091 return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
7094 /* Add package NAME to the list of packages encountered so far. To
7095 speed up class lookup in do_resolve_class, we make sure a
7096 particular package is added only once. */
7099 register_package (tree name)
7105 pht = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
7107 e = htab_find_slot (pht, name, INSERT);
7110 package_list = chainon (package_list, build_tree_list (name, NULL));
7116 resolve_package (tree pkg, tree *next, tree *type_name)
7119 tree decl = NULL_TREE;
7120 *type_name = NULL_TREE;
7122 /* The trick is to determine when the package name stops and were
7123 the name of something contained in the package starts. Then we
7124 return a fully qualified name of what we want to get. */
7126 *next = EXPR_WFL_QUALIFICATION (pkg);
7128 /* Try to progressively construct a type name */
7129 if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION)
7130 for (current = EXPR_WFL_QUALIFICATION (pkg);
7131 current; current = TREE_CHAIN (current))
7133 /* If we don't have what we're expecting, exit now. TYPE_NAME
7134 will be null and the error caught later. */
7135 if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION)
7138 merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current)));
7139 if ((decl = resolve_no_layout (*type_name, NULL_TREE)))
7141 /* resolve_package should be used in a loop, hence we
7142 point at this one to naturally process the next one at
7143 the next iteration. */
7152 /* Check accessibility of inner classes according to member access rules.
7153 DECL is the inner class, ENCLOSING_DECL is the class from which the
7154 access is being attempted. */
7157 check_inner_class_access (tree decl, tree enclosing_decl, tree cl)
7160 tree enclosing_decl_type;
7162 /* We don't issue an error message when CL is null. CL can be null
7163 as a result of processing a JDEP crafted by source_start_java_method
7164 for the purpose of patching its parm decl. But the error would
7165 have been already trapped when fixing the method's signature.
7166 DECL can also be NULL in case of earlier errors. */
7170 enclosing_decl_type = TREE_TYPE (enclosing_decl);
7172 if (CLASS_PRIVATE (decl))
7174 /* Access is permitted only within the body of the top-level
7175 class in which DECL is declared. */
7176 tree top_level = decl;
7177 while (DECL_CONTEXT (top_level))
7178 top_level = DECL_CONTEXT (top_level);
7179 while (DECL_CONTEXT (enclosing_decl))
7180 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7181 if (top_level == enclosing_decl)
7185 else if (CLASS_PROTECTED (decl))
7188 /* Access is permitted from within the same package... */
7189 if (in_same_package (decl, enclosing_decl))
7192 /* ... or from within the body of a subtype of the context in which
7193 DECL is declared. */
7194 decl_context = DECL_CONTEXT (decl);
7195 while (enclosing_decl)
7197 if (CLASS_INTERFACE (decl))
7199 if (interface_of_p (TREE_TYPE (decl_context),
7200 enclosing_decl_type))
7205 /* Eww. The order of the arguments is different!! */
7206 if (inherits_from_p (enclosing_decl_type,
7207 TREE_TYPE (decl_context)))
7210 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7212 access = "protected";
7214 else if (! CLASS_PUBLIC (decl))
7216 /* Access is permitted only from within the same package as DECL. */
7217 if (in_same_package (decl, enclosing_decl))
7219 access = "non-public";
7222 /* Class is public. */
7225 parse_error_context (cl, "Nested %s %s is %s; cannot be accessed from here",
7226 (CLASS_INTERFACE (decl) ? "interface" : "class"),
7227 lang_printable_name (decl, 0), access);
7230 /* Accessibility check for top-level classes. If CLASS_NAME is in a
7231 foreign package, it must be PUBLIC. Return 0 if no access
7232 violations were found, 1 otherwise. If VERBOSE is true and an error
7233 was found, it is reported and accounted for. */
7236 check_pkg_class_access (tree class_name, tree cl, bool verbose)
7240 if (!IDENTIFIER_CLASS_VALUE (class_name))
7243 if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
7246 if (!CLASS_PUBLIC (TYPE_NAME (type)))
7248 /* Access to a private class within the same package is
7251 breakdown_qualified (&l, &r, class_name);
7252 if (!QUALIFIED_P (class_name) && !ctxp->package)
7253 /* Both in the empty package. */
7255 if (l == ctxp->package)
7256 /* Both in the same package. */
7261 (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed",
7262 (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
7263 IDENTIFIER_POINTER (class_name));
7269 /* Local variable declaration. */
7272 declare_local_variables (int modifier, tree type, tree vlist)
7274 tree decl, current, saved_type;
7275 tree type_wfl = NULL_TREE;
7279 /* Push a new block if statements were seen between the last time we
7280 pushed a block and now. Keep a count of blocks to close */
7281 if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
7283 tree b = enter_block ();
7284 BLOCK_IS_IMPLICIT (b) = 1;
7290 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)
7291 if (1 << i & modifier)
7293 if (modifier == ACC_FINAL)
7298 (ctxp->modifier_ctx [i],
7299 "Only `final' is allowed as a local variables modifier");
7304 /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
7305 hold the TYPE value if a new incomplete has to be created (as
7306 opposed to being found already existing and reused). */
7307 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
7309 /* If TYPE is fully resolved and we don't have a reference, make one */
7310 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7312 /* Go through all the declared variables */
7313 for (current = vlist, saved_type = type; current;
7314 current = TREE_CHAIN (current), type = saved_type)
7316 tree other, real_type;
7317 tree wfl = TREE_PURPOSE (current);
7318 tree name = EXPR_WFL_NODE (wfl);
7319 tree init = TREE_VALUE (current);
7321 /* Process NAME, as it may specify extra dimension(s) for it */
7322 type = build_array_from_name (type, type_wfl, name, &name);
7324 /* Variable redefinition check */
7325 if ((other = lookup_name_in_blocks (name)))
7327 variable_redefinition_error (wfl, name, TREE_TYPE (other),
7328 DECL_SOURCE_LINE (other));
7332 /* Type adjustment. We may have just readjusted TYPE because
7333 the variable specified more dimensions. Make sure we have
7334 a reference if we can and don't have one already. */
7335 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7337 real_type = GET_REAL_TYPE (type);
7338 /* Never layout this decl. This will be done when its scope
7340 decl = build_decl (VAR_DECL, name, real_type);
7341 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
7342 DECL_FINAL (decl) = final_p;
7343 BLOCK_CHAIN_DECL (decl);
7345 /* If doing xreferencing, replace the line number with the WFL
7348 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
7350 /* Don't try to use an INIT statement when an error was found */
7351 if (init && java_error_count)
7354 /* Add the initialization function to the current function's code */
7357 /* Name might have been readjusted */
7358 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
7359 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
7360 java_method_add_stmt (current_function_decl,
7361 build_debugable_stmt (EXPR_WFL_LINECOL (init),
7365 /* Setup dependency the type of the decl */
7369 register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
7370 dep = CLASSD_LAST (ctxp->classd_list);
7371 JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
7374 SOURCE_FRONTEND_DEBUG (("Defined locals"));
7377 /* Called during parsing. Build decls from argument list. */
7380 source_start_java_method (tree fndecl)
7389 current_function_decl = fndecl;
7391 /* New scope for the function */
7393 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
7394 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
7396 tree type = TREE_VALUE (tem);
7397 tree name = TREE_PURPOSE (tem);
7399 /* If type is incomplete. Create an incomplete decl and ask for
7400 the decl to be patched later */
7401 if (INCOMPLETE_TYPE_P (type))
7404 tree real_type = GET_REAL_TYPE (type);
7405 parm_decl = build_decl (PARM_DECL, name, real_type);
7406 type = obtain_incomplete_type (type);
7407 register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
7408 jdep = CLASSD_LAST (ctxp->classd_list);
7409 JDEP_MISC (jdep) = name;
7410 JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
7413 parm_decl = build_decl (PARM_DECL, name, type);
7415 /* Remember if a local variable was declared final (via its
7416 TREE_LIST of type/name.) Set DECL_FINAL accordingly. */
7417 if (ARG_FINAL_P (tem))
7419 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl);
7420 DECL_FINAL (parm_decl) = 1;
7423 BLOCK_CHAIN_DECL (parm_decl);
7425 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7426 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
7428 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
7429 DECL_MAX_LOCALS (current_function_decl) = i;
7432 /* Called during parsing. Creates an artificial method declaration. */
7435 create_artificial_method (tree class, int flags, tree type,
7436 tree name, tree args)
7440 java_parser_context_save_global ();
7442 mdecl = make_node (FUNCTION_TYPE);
7443 TREE_TYPE (mdecl) = type;
7444 TYPE_ARG_TYPES (mdecl) = args;
7445 mdecl = add_method (class, flags, name, build_java_signature (mdecl));
7446 java_parser_context_restore_global ();
7447 DECL_ARTIFICIAL (mdecl) = 1;
7451 /* Starts the body if an artificial method. */
7454 start_artificial_method_body (tree mdecl)
7456 DECL_SOURCE_LINE (mdecl) = 1;
7457 DECL_FUNCTION_LAST_LINE (mdecl) = 1;
7458 source_start_java_method (mdecl);
7463 end_artificial_method_body (tree mdecl)
7465 /* exit_block modifies DECL_FUNCTION_BODY (current_function_decl).
7466 It has to be evaluated first. (if mdecl is current_function_decl,
7467 we have an undefined behavior if no temporary variable is used.) */
7468 tree b = exit_block ();
7469 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = b;
7473 /* Dump a tree of some kind. This is a convenience wrapper for the
7474 dump_* functions in tree-dump.c. */
7476 dump_java_tree (enum tree_dump_index phase, tree t)
7481 stream = dump_begin (phase, &flags);
7485 dump_node (t, flags, stream);
7486 dump_end (phase, stream);
7490 /* Terminate a function and expand its body. */
7493 source_end_java_method (void)
7495 tree fndecl = current_function_decl;
7500 java_parser_context_save_global ();
7501 input_line = ctxp->last_ccb_indent1;
7503 /* Turn function bodies with only a NOP expr null, so they don't get
7504 generated at all and we won't get warnings when using the -W
7506 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) == empty_stmt_node)
7507 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
7509 /* We've generated all the trees for this function, and it has been
7510 patched. Dump it to a file if the user requested it. */
7511 dump_java_tree (TDI_original, fndecl);
7513 /* Defer expanding the method until cgraph analysis is complete. */
7514 if (DECL_SAVED_TREE (fndecl))
7515 cgraph_finalize_function (fndecl, false);
7517 current_function_decl = NULL_TREE;
7518 java_parser_context_restore_global ();
7521 /* Record EXPR in the current function block. Complements compound
7522 expression second operand if necessary. */
7525 java_method_add_stmt (tree fndecl, tree expr)
7527 if (!GET_CURRENT_BLOCK (fndecl))
7529 return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
7533 add_stmt_to_block (tree b, tree type, tree stmt)
7535 tree body = BLOCK_EXPR_BODY (b), c;
7537 if (java_error_count)
7540 if ((c = add_stmt_to_compound (body, type, stmt)) == body)
7543 BLOCK_EXPR_BODY (b) = c;
7544 TREE_SIDE_EFFECTS (c) = 1;
7548 /* Add STMT to EXISTING if possible, otherwise create a new
7549 COMPOUND_EXPR and add STMT to it. */
7552 add_stmt_to_compound (tree existing, tree type, tree stmt)
7555 return build (COMPOUND_EXPR, type, existing, stmt);
7560 void java_layout_seen_class_methods (void)
7562 tree previous_list = all_class_list;
7563 tree end = NULL_TREE;
7568 for (current = previous_list;
7569 current != end; current = TREE_CHAIN (current))
7570 layout_class_methods (TREE_TYPE (TREE_VALUE (current)));
7572 if (previous_list != all_class_list)
7574 end = previous_list;
7575 previous_list = all_class_list;
7582 static GTY(()) tree stop_reordering;
7584 java_reorder_fields (void)
7588 for (current = gclass_list; current; current = TREE_CHAIN (current))
7590 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7592 if (current_class == stop_reordering)
7595 /* Reverse the fields, but leave the dummy field in front.
7596 Fields are already ordered for Object and Class */
7597 if (TYPE_FIELDS (current_class) && current_class != object_type_node
7598 && current_class != class_type_node)
7600 /* If the dummy field is there, reverse the right fields and
7601 just layout the type for proper fields offset */
7602 if (!DECL_NAME (TYPE_FIELDS (current_class)))
7604 tree fields = TYPE_FIELDS (current_class);
7605 TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
7606 TYPE_SIZE (current_class) = NULL_TREE;
7608 /* We don't have a dummy field, we need to layout the class,
7609 after having reversed the fields */
7612 TYPE_FIELDS (current_class) =
7613 nreverse (TYPE_FIELDS (current_class));
7614 TYPE_SIZE (current_class) = NULL_TREE;
7618 /* There are cases were gclass_list will be empty. */
7620 stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list));
7623 /* Layout the methods of all classes loaded in one way or another.
7624 Check methods of source parsed classes. Then reorder the
7625 fields and layout the classes or the type of all source parsed
7629 java_layout_classes (void)
7632 int save_error_count = java_error_count;
7634 /* Layout the methods of all classes seen so far */
7635 java_layout_seen_class_methods ();
7636 java_parse_abort_on_error ();
7637 all_class_list = NULL_TREE;
7639 /* Then check the methods of all parsed classes */
7640 for (current = gclass_list; current; current = TREE_CHAIN (current))
7641 if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
7642 java_check_methods (TREE_VALUE (current));
7643 java_parse_abort_on_error ();
7645 for (current = gclass_list; current; current = TREE_CHAIN (current))
7647 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7648 layout_class (current_class);
7650 /* Error reported by the caller */
7651 if (java_error_count)
7655 /* We might have reloaded classes durign the process of laying out
7656 classes for code generation. We must layout the methods of those
7657 late additions, as constructor checks might use them */
7658 java_layout_seen_class_methods ();
7659 java_parse_abort_on_error ();
7662 /* Expand methods in the current set of classes remembered for
7666 java_complete_expand_classes (void)
7670 do_not_fold = flag_emit_xref;
7672 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
7673 if (!INNER_CLASS_DECL_P (current))
7674 java_complete_expand_class (current);
7677 /* Expand the methods found in OUTER, starting first by OUTER's inner
7681 java_complete_expand_class (tree outer)
7685 set_nested_class_simple_name_value (outer, 1); /* Set */
7687 /* We need to go after all inner classes and start expanding them,
7688 starting with most nested ones. We have to do that because nested
7689 classes might add functions to outer classes */
7691 for (inner_list = DECL_INNER_CLASS_LIST (outer);
7692 inner_list; inner_list = TREE_CHAIN (inner_list))
7693 java_complete_expand_class (TREE_PURPOSE (inner_list));
7695 java_complete_expand_methods (outer);
7696 set_nested_class_simple_name_value (outer, 0); /* Reset */
7699 /* Expand methods registered in CLASS_DECL. The general idea is that
7700 we expand regular methods first. This allows us get an estimate on
7701 how outer context local alias fields are really used so we can add
7702 to the constructor just enough code to initialize them properly (it
7703 also lets us generate finit$ correctly.) Then we expand the
7704 constructors and then <clinit>. */
7707 java_complete_expand_methods (tree class_decl)
7709 tree clinit, decl, first_decl;
7711 output_class = current_class = TREE_TYPE (class_decl);
7713 /* Pre-expand <clinit> to figure whether we really need it or
7714 not. If we do need it, we pre-expand the static fields so they're
7715 ready to be used somewhere else. <clinit> will be fully expanded
7716 after we processed the constructors. */
7717 first_decl = TYPE_METHODS (current_class);
7718 clinit = maybe_generate_pre_expand_clinit (current_class);
7720 /* Then generate finit$ (if we need to) because constructors will
7722 if (TYPE_FINIT_STMT_LIST (current_class))
7723 java_complete_expand_method (generate_finit (current_class));
7725 /* Then generate instinit$ (if we need to) because constructors will
7727 if (TYPE_II_STMT_LIST (current_class))
7728 java_complete_expand_method (generate_instinit (current_class));
7730 /* Now do the constructors */
7731 for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl))
7735 if (!DECL_CONSTRUCTOR_P (decl))
7738 no_body = !DECL_FUNCTION_BODY (decl);
7739 /* Don't generate debug info on line zero when expanding a
7740 generated constructor. */
7742 restore_line_number_status (1);
7744 java_complete_expand_method (decl);
7747 restore_line_number_status (0);
7750 /* First, do the ordinary methods. */
7751 for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
7753 /* Ctors aren't part of this batch. */
7754 if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
7757 /* Skip abstract or native methods -- but do handle native
7758 methods when generating JNI stubs. */
7759 if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl)))
7761 DECL_FUNCTION_BODY (decl) = NULL_TREE;
7765 if (METHOD_NATIVE (decl))
7768 current_function_decl = decl;
7769 body = build_jni_stub (decl);
7770 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
7773 java_complete_expand_method (decl);
7776 /* If there is indeed a <clinit>, fully expand it now */
7779 /* Prevent the use of `this' inside <clinit> */
7780 ctxp->explicit_constructor_p = 1;
7781 java_complete_expand_method (clinit);
7782 ctxp->explicit_constructor_p = 0;
7785 /* We might have generated a class$ that we now want to expand */
7786 if (TYPE_DOT_CLASS (current_class))
7787 java_complete_expand_method (TYPE_DOT_CLASS (current_class));
7789 /* Now verify constructor circularity (stop after the first one we
7791 if (!CLASS_INTERFACE (class_decl))
7792 for (decl = TYPE_METHODS (current_class); decl; decl = TREE_CHAIN (decl))
7793 if (DECL_CONSTRUCTOR_P (decl)
7794 && verify_constructor_circularity (decl, decl))
7798 /* Attempt to create <clinit>. Pre-expand static fields so they can be
7799 safely used in some other methods/constructors. */
7802 maybe_generate_pre_expand_clinit (tree class_type)
7804 tree current, mdecl;
7806 if (!TYPE_CLINIT_STMT_LIST (class_type))
7809 /* Go through all static fields and pre expand them */
7810 for (current = TYPE_FIELDS (class_type); current;
7811 current = TREE_CHAIN (current))
7812 if (FIELD_STATIC (current))
7813 build_field_ref (NULL_TREE, class_type, DECL_NAME (current));
7815 /* Then build the <clinit> method */
7816 mdecl = create_artificial_method (class_type, ACC_STATIC, void_type_node,
7817 clinit_identifier_node, end_params_node);
7818 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
7820 start_artificial_method_body (mdecl);
7822 /* We process the list of assignment we produced as the result of
7823 the declaration of initialized static field and add them as
7824 statement to the <clinit> method. */
7825 for (current = TYPE_CLINIT_STMT_LIST (class_type); current;
7826 current = TREE_CHAIN (current))
7828 tree stmt = current;
7829 /* We build the assignment expression that will initialize the
7830 field to its value. There are strict rules on static
7831 initializers (8.5). FIXME */
7832 if (TREE_CODE (stmt) != BLOCK && stmt != empty_stmt_node)
7833 stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt);
7834 java_method_add_stmt (mdecl, stmt);
7837 end_artificial_method_body (mdecl);
7839 /* Now we want to place <clinit> as the last method (because we need
7840 it at least for interface so that it doesn't interfere with the
7841 dispatch table based lookup. */
7842 if (TREE_CHAIN (TYPE_METHODS (class_type)))
7844 current = TREE_CHAIN (TYPE_METHODS (class_type));
7845 TYPE_METHODS (class_type) = current;
7847 while (TREE_CHAIN (current))
7848 current = TREE_CHAIN (current);
7850 TREE_CHAIN (current) = mdecl;
7851 TREE_CHAIN (mdecl) = NULL_TREE;
7857 /* Analyzes a method body and look for something that isn't a
7858 MODIFY_EXPR with a constant value. */
7861 analyze_clinit_body (tree this_class, tree bbody)
7864 switch (TREE_CODE (bbody))
7867 bbody = BLOCK_EXPR_BODY (bbody);
7870 case EXPR_WITH_FILE_LOCATION:
7871 bbody = EXPR_WFL_NODE (bbody);
7875 if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0)))
7877 bbody = TREE_OPERAND (bbody, 1);
7881 /* If we're generating to class file and we're dealing with an
7882 array initialization, we return 1 to keep <clinit> */
7883 if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT
7884 && flag_emit_class_files)
7887 /* There are a few cases where we're required to keep
7889 - If this is an assignment whose operand is not constant,
7890 - If this is an assignment to a non-initialized field,
7891 - If this field is not a member of the current class.
7893 return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1))
7894 || ! DECL_INITIAL (TREE_OPERAND (bbody, 0))
7895 || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class);
7904 /* See whether we could get rid of <clinit>. Criteria are: all static
7905 final fields have constant initial values and the body of <clinit>
7906 is empty. Return 1 if <clinit> was discarded, 0 otherwise. */
7909 maybe_yank_clinit (tree mdecl)
7914 if (!DECL_CLINIT_P (mdecl))
7917 /* If the body isn't empty, then we keep <clinit>. Note that if
7918 we're emitting classfiles, this isn't enough not to rule it
7920 fbody = DECL_FUNCTION_BODY (mdecl);
7921 bbody = BLOCK_EXPR_BODY (fbody);
7922 if (bbody && bbody != error_mark_node)
7923 bbody = BLOCK_EXPR_BODY (bbody);
7926 if (bbody && ! flag_emit_class_files && bbody != empty_stmt_node)
7929 type = DECL_CONTEXT (mdecl);
7930 current = TYPE_FIELDS (type);
7932 for (current = (current ? TREE_CHAIN (current) : current);
7933 current; current = TREE_CHAIN (current))
7937 /* We're not interested in non-static fields. */
7938 if (!FIELD_STATIC (current))
7941 /* Nor in fields without initializers. */
7942 f_init = DECL_INITIAL (current);
7943 if (f_init == NULL_TREE)
7946 /* Anything that isn't String or a basic type is ruled out -- or
7947 if we know how to deal with it (when doing things natively) we
7948 should generated an empty <clinit> so that SUID are computed
7950 if (! JSTRING_TYPE_P (TREE_TYPE (current))
7951 && ! JNUMERIC_TYPE_P (TREE_TYPE (current)))
7954 if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init))
7958 /* Now we analyze the method body and look for something that
7959 isn't a MODIFY_EXPR */
7960 if (bbody != empty_stmt_node && analyze_clinit_body (type, bbody))
7963 /* Get rid of <clinit> in the class' list of methods */
7964 if (TYPE_METHODS (type) == mdecl)
7965 TYPE_METHODS (type) = TREE_CHAIN (mdecl);
7967 for (current = TYPE_METHODS (type); current;
7968 current = TREE_CHAIN (current))
7969 if (TREE_CHAIN (current) == mdecl)
7971 TREE_CHAIN (current) = TREE_CHAIN (mdecl);
7978 /* Install the argument from MDECL. Suitable to completion and
7979 expansion of mdecl's body. */
7982 start_complete_expand_method (tree mdecl)
7986 pushlevel (1); /* Prepare for a parameter push */
7987 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7988 DECL_ARGUMENTS (mdecl) = tem;
7990 for (; tem; tem = TREE_CHAIN (tem))
7992 /* TREE_CHAIN (tem) will change after pushdecl. */
7993 tree next = TREE_CHAIN (tem);
7994 tree type = TREE_TYPE (tem);
7995 if (targetm.calls.promote_prototypes (type)
7996 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
7997 && INTEGRAL_TYPE_P (type))
7998 type = integer_type_node;
7999 DECL_ARG_TYPE (tem) = type;
8000 layout_decl (tem, 0);
8002 /* Re-install the next so that the list is kept and the loop
8004 TREE_CHAIN (tem) = next;
8006 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8007 input_line = DECL_SOURCE_LINE (mdecl);
8008 build_result_decl (mdecl);
8012 /* Complete and expand a method. */
8015 java_complete_expand_method (tree mdecl)
8017 tree fbody, block_body, exception_copy;
8019 current_function_decl = mdecl;
8020 /* Fix constructors before expanding them */
8021 if (DECL_CONSTRUCTOR_P (mdecl))
8022 fix_constructors (mdecl);
8024 /* Expand functions that have a body */
8025 if (!DECL_FUNCTION_BODY (mdecl))
8028 fbody = DECL_FUNCTION_BODY (mdecl);
8029 block_body = BLOCK_EXPR_BODY (fbody);
8030 exception_copy = NULL_TREE;
8032 current_function_decl = mdecl;
8035 fprintf (stderr, " [%s.",
8036 lang_printable_name (DECL_CONTEXT (mdecl), 0));
8037 announce_function (mdecl);
8039 fprintf (stderr, "]");
8041 /* Prepare the function for tree completion */
8042 start_complete_expand_method (mdecl);
8044 /* Install the current this */
8045 current_this = (!METHOD_STATIC (mdecl) ?
8046 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
8048 /* Purge the `throws' list of unchecked exceptions (we save a copy
8049 of the list and re-install it later.) */
8050 exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl));
8051 purge_unchecked_exceptions (mdecl);
8053 /* Install exceptions thrown with `throws' */
8054 PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
8056 if (block_body != NULL_TREE)
8058 block_body = java_complete_tree (block_body);
8060 /* Before we check initialization, attached all class initialization
8061 variable to the block_body */
8062 htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (mdecl),
8063 attach_init_test_initialization_flags, block_body);
8065 if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
8067 check_for_initialization (block_body, mdecl);
8069 /* Go through all the flags marking the initialization of
8070 static variables and see whether they're definitively
8071 assigned, in which case the type is remembered as
8072 definitively initialized in MDECL. */
8073 if (STATIC_CLASS_INIT_OPT_P ())
8075 /* Always register the context as properly initialized in
8076 MDECL. This used with caution helps removing extra
8077 initialization of self. */
8078 if (METHOD_STATIC (mdecl))
8081 (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl),
8082 DECL_CONTEXT (mdecl), INSERT)) = DECL_CONTEXT (mdecl);
8086 ctxp->explicit_constructor_p = 0;
8089 BLOCK_EXPR_BODY (fbody) = block_body;
8091 /* If we saw a return but couldn't evaluate it properly, we'll have
8092 an error_mark_node here. */
8093 if (block_body != error_mark_node
8094 && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
8095 && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE
8097 missing_return_error (current_function_decl);
8099 /* See if we can get rid of <clinit> if MDECL happens to be <clinit> */
8100 maybe_yank_clinit (mdecl);
8102 /* Pop the current level, with special measures if we found errors. */
8103 if (java_error_count)
8104 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8107 /* Pop the exceptions and sanity check */
8109 if (currently_caught_type_list)
8112 /* Restore the copy of the list of exceptions if emitting xrefs. */
8113 DECL_FUNCTION_THROWS (mdecl) = exception_copy;
8116 /* For with each class for which there's code to generate. */
8119 java_expand_method_bodies (tree class)
8122 for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl))
8127 if (! DECL_FUNCTION_BODY (decl))
8130 current_function_decl = decl;
8132 block = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
8134 if (TREE_CODE (block) != BLOCK)
8137 /* Save the function body for inlining. */
8138 DECL_SAVED_TREE (decl) = block;
8140 body = BLOCK_EXPR_BODY (block);
8142 if (TREE_TYPE (body) == NULL_TREE)
8145 /* It's time to assign the variable flagging static class
8146 initialization based on which classes invoked static methods
8147 are definitely initializing. This should be flagged. */
8148 if (STATIC_CLASS_INIT_OPT_P ())
8150 tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl);
8151 for (; list != NULL_TREE; list = TREE_CHAIN (list))
8153 /* Executed for each statement calling a static function.
8154 LIST is a TREE_LIST whose PURPOSE is the called function
8155 and VALUE is a compound whose second operand can be patched
8156 with static class initialization flag assignments. */
8158 tree called_method = TREE_PURPOSE (list);
8159 tree compound = TREE_VALUE (list);
8160 tree assignment_compound_list
8161 = build_tree_list (called_method, NULL);
8163 /* For each class definitely initialized in
8164 CALLED_METHOD, fill ASSIGNMENT_COMPOUND with
8165 assignment to the class initialization flag. */
8166 htab_traverse (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method),
8167 emit_test_initialization,
8168 assignment_compound_list);
8170 if (TREE_VALUE (assignment_compound_list))
8171 TREE_OPERAND (compound, 1)
8172 = TREE_VALUE (assignment_compound_list);
8176 /* Prepend class initialization to static methods. */
8177 if (METHOD_STATIC (decl) && ! METHOD_PRIVATE (decl)
8178 && ! flag_emit_class_files
8179 && ! DECL_CLINIT_P (decl)
8180 && ! CLASS_INTERFACE (TYPE_NAME (class)))
8182 tree init = build (CALL_EXPR, void_type_node,
8183 build_address_of (soft_initclass_node),
8184 build_tree_list (NULL_TREE,
8185 build_class_ref (class)),
8187 TREE_SIDE_EFFECTS (init) = 1;
8188 body = build (COMPOUND_EXPR, TREE_TYPE (body), init, body);
8189 BLOCK_EXPR_BODY (block) = body;
8192 /* Wrap synchronized method bodies in a monitorenter
8193 plus monitorexit cleanup. */
8194 if (METHOD_SYNCHRONIZED (decl) && ! flag_emit_class_files)
8196 tree enter, exit, lock;
8197 if (METHOD_STATIC (decl))
8198 lock = build_class_ref (class);
8200 lock = DECL_ARGUMENTS (decl);
8201 BUILD_MONITOR_ENTER (enter, lock);
8202 BUILD_MONITOR_EXIT (exit, lock);
8204 body = build (COMPOUND_EXPR, void_type_node,
8206 build (TRY_FINALLY_EXPR, void_type_node, body, exit));
8207 BLOCK_EXPR_BODY (block) = body;
8210 /* Expand the the function body. */
8211 source_end_java_method ();
8217 /* This section of the code deals with accessing enclosing context
8218 fields either directly by using the relevant access to this$<n> or
8219 by invoking an access method crafted for that purpose. */
8221 /* Build the necessary access from an inner class to an outer
8222 class. This routine could be optimized to cache previous result
8223 (decl, current_class and returned access). When an access method
8224 needs to be generated, it always takes the form of a read. It might
8225 be later turned into a write by calling outer_field_access_fix. */
8228 build_outer_field_access (tree id, tree decl)
8230 tree access = NULL_TREE;
8231 tree ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
8232 tree decl_ctx = DECL_CONTEXT (decl);
8234 /* If the immediate enclosing context of the current class is the
8235 field decl's class or inherits from it; build the access as
8236 `this$<n>.<field>'. Note that we will break the `private' barrier
8237 if we're not emitting bytecodes. */
8238 if ((ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
8239 && (!FIELD_PRIVATE (decl) || !flag_emit_class_files ))
8241 tree thisn = build_current_thisn (current_class);
8242 access = make_qualified_primary (build_wfl_node (thisn),
8243 id, EXPR_WFL_LINECOL (id));
8245 /* Otherwise, generate access methods to outer this and access the
8246 field (either using an access method or by direct access.) */
8249 int lc = EXPR_WFL_LINECOL (id);
8251 /* Now we chain the required number of calls to the access$0 to
8252 get a hold to the enclosing instance we need, and then we
8253 build the field access. */
8254 access = build_access_to_thisn (current_class, decl_ctx, lc);
8256 /* If the field is private and we're generating bytecode, then
8257 we generate an access method */
8258 if (FIELD_PRIVATE (decl) && flag_emit_class_files )
8260 tree name = build_outer_field_access_methods (decl);
8261 access = build_outer_field_access_expr (lc, decl_ctx,
8262 name, access, NULL_TREE);
8264 /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'.
8265 Once again we break the `private' access rule from a foreign
8268 access = make_qualified_primary (access, id, lc);
8270 return resolve_expression_name (access, NULL);
8273 /* Return a nonzero value if NODE describes an outer field inner
8277 outer_field_access_p (tree type, tree decl)
8279 if (!INNER_CLASS_TYPE_P (type)
8280 || TREE_CODE (decl) != FIELD_DECL
8281 || DECL_CONTEXT (decl) == type)
8284 /* If the inner class extends the declaration context of the field
8285 we're trying to access, then this isn't an outer field access */
8286 if (inherits_from_p (type, DECL_CONTEXT (decl)))
8289 for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ;
8290 type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))))
8292 if (type == DECL_CONTEXT (decl))
8295 if (!DECL_CONTEXT (TYPE_NAME (type)))
8297 /* Before we give up, see whether the field is inherited from
8298 the enclosing context we're considering. */
8299 if (inherits_from_p (type, DECL_CONTEXT (decl)))
8308 /* Return a nonzero value if NODE represents an outer field inner
8309 access that was been already expanded. As a side effect, it returns
8310 the name of the field being accessed and the argument passed to the
8311 access function, suitable for a regeneration of the access method
8312 call if necessary. */
8315 outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
8320 if (TREE_CODE (node) != CALL_EXPR)
8323 /* Well, gcj generates slightly different tree nodes when compiling
8324 to native or bytecodes. It's the case for function calls. */
8326 if (flag_emit_class_files
8327 && TREE_CODE (node) == CALL_EXPR
8328 && OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
8330 else if (!flag_emit_class_files)
8332 node = TREE_OPERAND (node, 0);
8334 if (node && TREE_OPERAND (node, 0)
8335 && TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)
8337 node = TREE_OPERAND (node, 0);
8338 if (TREE_OPERAND (node, 0)
8339 && TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
8340 && (OUTER_FIELD_ACCESS_IDENTIFIER_P
8341 (DECL_NAME (TREE_OPERAND (node, 0)))))
8346 if (identified && name && arg_type && arg)
8348 tree argument = TREE_OPERAND (node, 1);
8349 *name = DECL_NAME (TREE_OPERAND (node, 0));
8350 *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
8351 *arg = TREE_VALUE (argument);
8356 /* Detect in NODE an outer field read access from an inner class and
8357 transform it into a write with RHS as an argument. This function is
8358 called from the java_complete_lhs when an assignment to a LHS can
8362 outer_field_access_fix (tree wfl, tree node, tree rhs)
8364 tree name, arg_type, arg;
8366 if (outer_field_expanded_access_p (node, &name, &arg_type, &arg))
8368 node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl),
8369 arg_type, name, arg, rhs);
8370 return java_complete_tree (node);
8375 /* Construct the expression that calls an access method:
8376 <type>.access$<n>(<arg1> [, <arg2>]);
8378 ARG2 can be NULL and will be omitted in that case. It will denote a
8382 build_outer_field_access_expr (int lc, tree type, tree access_method_name,
8383 tree arg1, tree arg2)
8385 tree args, cn, access;
8387 args = arg1 ? arg1 :
8388 build_wfl_node (build_current_thisn (current_class));
8389 args = build_tree_list (NULL_TREE, args);
8392 args = tree_cons (NULL_TREE, arg2, args);
8394 access = build_method_invocation (build_wfl_node (access_method_name), args);
8395 cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
8396 return make_qualified_primary (cn, access, lc);
8400 build_new_access_id (void)
8402 static int access_n_counter = 1;
8405 sprintf (buffer, "access$%d", access_n_counter++);
8406 return get_identifier (buffer);
8409 /* Create the static access functions for the outer field DECL. We define a
8411 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
8415 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$,
8416 TREE_TYPE (<field>) value$) {
8417 return inst$.field = value$;
8419 We should have a usage flags on the DECL so we can lazily turn the ones
8420 we're using for code generation. FIXME.
8424 build_outer_field_access_methods (tree decl)
8426 tree id, args, stmt, mdecl;
8428 if (FIELD_INNER_ACCESS_P (decl))
8429 return FIELD_INNER_ACCESS (decl);
8431 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
8433 /* Create the identifier and a function named after it. */
8434 id = build_new_access_id ();
8436 /* The identifier is marked as bearing the name of a generated write
8437 access function for outer field accessed from inner classes. */
8438 OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8440 /* Create the read access */
8441 args = build_tree_list (inst_id, build_pointer_type (DECL_CONTEXT (decl)));
8442 TREE_CHAIN (args) = end_params_node;
8443 stmt = make_qualified_primary (build_wfl_node (inst_id),
8444 build_wfl_node (DECL_NAME (decl)), 0);
8445 stmt = build_return (0, stmt);
8446 mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8447 TREE_TYPE (decl), id, args, stmt);
8448 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8450 /* Create the write access method. No write access for final variable */
8451 if (!FIELD_FINAL (decl))
8453 args = build_tree_list (inst_id,
8454 build_pointer_type (DECL_CONTEXT (decl)));
8455 TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
8456 TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
8457 stmt = make_qualified_primary (build_wfl_node (inst_id),
8458 build_wfl_node (DECL_NAME (decl)), 0);
8459 stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
8460 build_wfl_node (wpv_id)));
8461 mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8462 TREE_TYPE (decl), id,
8465 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8467 /* Return the access name */
8468 return FIELD_INNER_ACCESS (decl) = id;
8471 /* Build an field access method NAME. */
8474 build_outer_field_access_method (tree class, tree type, tree name,
8475 tree args, tree body)
8477 tree saved_current_function_decl, mdecl;
8479 /* Create the method */
8480 mdecl = create_artificial_method (class, ACC_STATIC, type, name, args);
8481 fix_method_argument_names (args, mdecl);
8482 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8484 /* Attach the method body. */
8485 saved_current_function_decl = current_function_decl;
8486 start_artificial_method_body (mdecl);
8487 java_method_add_stmt (mdecl, body);
8488 end_artificial_method_body (mdecl);
8489 current_function_decl = saved_current_function_decl;
8495 /* This section deals with building access function necessary for
8496 certain kinds of method invocation from inner classes. */
8499 build_outer_method_access_method (tree decl)
8501 tree saved_current_function_decl, mdecl;
8502 tree args = NULL_TREE, call_args = NULL_TREE;
8503 tree carg, id, body, class;
8505 int parm_id_count = 0;
8507 /* Test this abort with an access to a private field */
8508 if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "access$"))
8511 /* Check the cache first */
8512 if (DECL_FUNCTION_INNER_ACCESS (decl))
8513 return DECL_FUNCTION_INNER_ACCESS (decl);
8515 class = DECL_CONTEXT (decl);
8517 /* Obtain an access identifier and mark it */
8518 id = build_new_access_id ();
8519 OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8521 carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
8522 /* Create the arguments, as much as the original */
8523 for (; carg && carg != end_params_node;
8524 carg = TREE_CHAIN (carg))
8526 sprintf (buffer, "write_parm_value$%d", parm_id_count++);
8527 args = chainon (args, build_tree_list (get_identifier (buffer),
8528 TREE_VALUE (carg)));
8530 args = chainon (args, end_params_node);
8532 /* Create the method */
8533 mdecl = create_artificial_method (class, ACC_STATIC,
8534 TREE_TYPE (TREE_TYPE (decl)), id, args);
8535 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8536 /* There is a potential bug here. We should be able to use
8537 fix_method_argument_names, but then arg names get mixed up and
8538 eventually a constructor will have its this$0 altered and the
8539 outer context won't be assignment properly. The testcase is
8541 TYPE_ARG_TYPES (TREE_TYPE (mdecl)) = args;
8543 /* Attach the method body. */
8544 saved_current_function_decl = current_function_decl;
8545 start_artificial_method_body (mdecl);
8547 /* The actual method invocation uses the same args. When invoking a
8548 static methods that way, we don't want to skip the first
8551 if (!METHOD_STATIC (decl))
8552 carg = TREE_CHAIN (carg);
8553 for (; carg && carg != end_params_node; carg = TREE_CHAIN (carg))
8554 call_args = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (carg)),
8557 body = build_method_invocation (build_wfl_node (DECL_NAME (decl)),
8559 if (!METHOD_STATIC (decl))
8560 body = make_qualified_primary (build_wfl_node (TREE_PURPOSE (args)),
8562 if (TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
8563 body = build_return (0, body);
8564 java_method_add_stmt (mdecl,body);
8565 end_artificial_method_body (mdecl);
8566 current_function_decl = saved_current_function_decl;
8568 /* Back tag the access function so it know what it accesses */
8569 DECL_FUNCTION_ACCESS_DECL (decl) = mdecl;
8571 /* Tag the current method so it knows it has an access generated */
8572 return DECL_FUNCTION_INNER_ACCESS (decl) = mdecl;
8576 /* This section of the code deals with building expressions to access
8577 the enclosing instance of an inner class. The enclosing instance is
8578 kept in a generated field called this$<n>, with <n> being the
8579 inner class nesting level (starting from 0.) */
8581 /* Build an access to a given this$<n>, always chaining access call to
8582 others. Access methods to this$<n> are build on the fly if
8583 necessary. This CAN'T be used to solely access this$<n-1> from
8584 this$<n> (which alway yield to special cases and optimization, see
8585 for example build_outer_field_access). */
8588 build_access_to_thisn (tree from, tree to, int lc)
8590 tree access = NULL_TREE;
8592 while (from != to && PURE_INNER_CLASS_TYPE_P (from))
8596 access = build_current_thisn (from);
8597 access = build_wfl_node (access);
8601 tree access0_wfl, cn;
8603 maybe_build_thisn_access_method (from);
8604 access0_wfl = build_wfl_node (access0_identifier_node);
8605 cn = build_wfl_node (DECL_NAME (TYPE_NAME (from)));
8606 EXPR_WFL_LINECOL (access0_wfl) = lc;
8607 access = build_tree_list (NULL_TREE, access);
8608 access = build_method_invocation (access0_wfl, access);
8609 access = make_qualified_primary (cn, access, lc);
8612 /* If FROM isn't an inner class, that's fine, we've done enough.
8613 What we're looking for can be accessed from there. */
8614 from = DECL_CONTEXT (TYPE_NAME (from));
8617 from = TREE_TYPE (from);
8622 /* Build an access function to the this$<n> local to TYPE. NULL_TREE
8623 is returned if nothing needs to be generated. Otherwise, the method
8624 generated and a method decl is returned.
8626 NOTE: These generated methods should be declared in a class file
8627 attribute so that they can't be referred to directly. */
8630 maybe_build_thisn_access_method (tree type)
8632 tree mdecl, args, stmt, rtype;
8633 tree saved_current_function_decl;
8635 /* If TYPE is a top-level class, no access method is required.
8636 If there already is such an access method, bail out. */
8637 if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type))
8640 /* We generate the method. The method looks like:
8641 static <outer_of_type> access$0 (<type> inst$) { return inst$.this$<n>; }
8643 args = build_tree_list (inst_id, build_pointer_type (type));
8644 TREE_CHAIN (args) = end_params_node;
8645 rtype = build_pointer_type (TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))));
8646 mdecl = create_artificial_method (type, ACC_STATIC, rtype,
8647 access0_identifier_node, args);
8648 fix_method_argument_names (args, mdecl);
8649 layout_class_method (type, NULL_TREE, mdecl, NULL_TREE);
8650 stmt = build_current_thisn (type);
8651 stmt = make_qualified_primary (build_wfl_node (inst_id),
8652 build_wfl_node (stmt), 0);
8653 stmt = build_return (0, stmt);
8655 saved_current_function_decl = current_function_decl;
8656 start_artificial_method_body (mdecl);
8657 java_method_add_stmt (mdecl, stmt);
8658 end_artificial_method_body (mdecl);
8659 current_function_decl = saved_current_function_decl;
8661 CLASS_ACCESS0_GENERATED_P (type) = 1;
8666 /* Craft an correctly numbered `this$<n>'string. this$0 is used for
8667 the first level of innerclassing. this$1 for the next one, etc...
8668 This function can be invoked with TYPE to NULL, available and then
8669 has to count the parser context. */
8671 static GTY(()) tree saved_thisn;
8672 static GTY(()) tree saved_type;
8675 build_current_thisn (tree type)
8677 static int saved_i = -1;
8678 static int saved_type_i = 0;
8685 if (type == saved_type)
8689 for (i = -1, decl = DECL_CONTEXT (TYPE_NAME (type));
8690 decl; decl = DECL_CONTEXT (decl), i++)
8698 i = list_length (GET_CPC_LIST ())-2;
8703 sprintf (buffer, "this$%d", i);
8705 saved_thisn = get_identifier (buffer);
8709 /* Return the assignment to the hidden enclosing context `this$<n>'
8710 by the second incoming parameter to the innerclass constructor. The
8711 form used is `this.this$<n> = this$<n>;'. */
8714 build_thisn_assign (void)
8716 if (current_class && PURE_INNER_CLASS_TYPE_P (current_class))
8718 tree thisn = build_current_thisn (current_class);
8719 tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
8720 build_wfl_node (thisn), 0);
8721 tree rhs = build_wfl_node (thisn);
8722 EXPR_WFL_SET_LINECOL (lhs, input_line, 0);
8723 return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
8729 /* Building the synthetic `class$' used to implement the `.class' 1.1
8730 extension for non primitive types. This method looks like:
8732 static Class class$(String type) throws NoClassDefFoundError
8734 try {return (java.lang.Class.forName (String));}
8735 catch (ClassNotFoundException e) {
8736 throw new NoClassDefFoundError(e.getMessage());}
8739 static GTY(()) tree get_message_wfl;
8740 static GTY(()) tree type_parm_wfl;
8743 build_dot_class_method (tree class)
8745 #define BWF(S) build_wfl_node (get_identifier ((S)))
8746 #define MQN(X,Y) make_qualified_name ((X), (Y), 0)
8747 tree args, tmp, saved_current_function_decl, mdecl, qual_name;
8748 tree stmt, throw_stmt;
8750 if (!get_message_wfl)
8752 get_message_wfl = build_wfl_node (get_identifier ("getMessage"));
8753 type_parm_wfl = build_wfl_node (get_identifier ("type$"));
8756 /* Build the arguments */
8757 args = build_tree_list (get_identifier ("type$"),
8758 build_pointer_type (string_type_node));
8759 TREE_CHAIN (args) = end_params_node;
8761 /* Build the qualified name java.lang.Class.forName */
8762 tmp = MQN (MQN (MQN (BWF ("java"),
8763 BWF ("lang")), BWF ("Class")), BWF ("forName"));
8765 /* Create the "class$" function */
8766 mdecl = create_artificial_method (class, ACC_STATIC,
8767 build_pointer_type (class_type_node),
8768 classdollar_identifier_node, args);
8769 qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8770 BWF ("NoClassDefFoundError"));
8771 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, qual_name);
8772 register_incomplete_type (JDEP_EXCEPTION, qual_name, NULL_TREE, NULL_TREE);
8773 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
8774 &TREE_VALUE (DECL_FUNCTION_THROWS (mdecl));
8776 /* We start by building the try block. We need to build:
8777 return (java.lang.Class.forName (type)); */
8778 stmt = build_method_invocation (tmp,
8779 build_tree_list (NULL_TREE, type_parm_wfl));
8780 stmt = build_return (0, stmt);
8782 /* Now onto the catch block. We start by building the expression
8783 throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
8784 throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
8785 get_message_wfl, 0);
8786 throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
8788 /* Build new NoClassDefFoundError (_.getMessage) */
8789 throw_stmt = build_new_invocation
8790 (build_wfl_node (get_identifier ("NoClassDefFoundError")),
8791 build_tree_list (build_pointer_type (string_type_node), throw_stmt));
8793 /* Build the throw, (it's too early to use BUILD_THROW) */
8794 throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt);
8796 /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */
8797 qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8798 BWF ("ClassNotFoundException"));
8799 stmt = encapsulate_with_try_catch (0, qual_name, stmt, throw_stmt);
8801 fix_method_argument_names (args, mdecl);
8802 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8803 saved_current_function_decl = current_function_decl;
8804 start_artificial_method_body (mdecl);
8805 java_method_add_stmt (mdecl, stmt);
8806 end_artificial_method_body (mdecl);
8807 current_function_decl = saved_current_function_decl;
8808 TYPE_DOT_CLASS (class) = mdecl;
8814 build_dot_class_method_invocation (tree this_class, tree type)
8816 tree dot_class_method = TYPE_DOT_CLASS (this_class);
8819 if (TYPE_ARRAY_P (type))
8820 sig_id = build_java_signature (type);
8822 sig_id = DECL_NAME (TYPE_NAME (type));
8824 /* Ensure that the proper name separator is used */
8825 sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id),
8826 IDENTIFIER_LENGTH (sig_id));
8828 s = build_string (IDENTIFIER_LENGTH (sig_id),
8829 IDENTIFIER_POINTER (sig_id));
8830 t = build_method_invocation (build_wfl_node (DECL_NAME (dot_class_method)),
8831 build_tree_list (NULL_TREE, s));
8832 if (DECL_CONTEXT (dot_class_method) != this_class)
8834 tree class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (dot_class_method)));
8835 t = make_qualified_primary (build_wfl_node (class_name), t, 0);
8840 /* This section of the code deals with constructor. */
8842 /* Craft a body for default constructor. Patch existing constructor
8843 bodies with call to super() and field initialization statements if
8847 fix_constructors (tree mdecl)
8849 tree iii; /* Instance Initializer Invocation */
8850 tree body = DECL_FUNCTION_BODY (mdecl);
8851 tree thisn_assign, compound = NULL_TREE;
8852 tree class_type = DECL_CONTEXT (mdecl);
8854 if (DECL_FIXED_CONSTRUCTOR_P (mdecl))
8856 DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
8860 /* It is an error for the compiler to generate a default
8861 constructor if the superclass doesn't have a constructor that
8862 takes no argument, or the same args for an anonymous class */
8863 if (verify_constructor_super (mdecl))
8865 tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (class_type));
8866 tree save = DECL_NAME (mdecl);
8867 const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
8868 DECL_NAME (mdecl) = DECL_NAME (sclass_decl);
8870 (lookup_cl (TYPE_NAME (class_type)),
8871 "No constructor matching `%s' found in class `%s'",
8872 lang_printable_name (mdecl, 0), n);
8873 DECL_NAME (mdecl) = save;
8876 /* The constructor body must be crafted by hand. It's the
8877 constructor we defined when we realize we didn't have the
8878 CLASSNAME() constructor */
8879 start_artificial_method_body (mdecl);
8881 /* Insert an assignment to the this$<n> hidden field, if
8883 if ((thisn_assign = build_thisn_assign ()))
8884 java_method_add_stmt (mdecl, thisn_assign);
8886 /* We don't generate a super constructor invocation if we're
8887 compiling java.lang.Object. build_super_invocation takes care
8889 java_method_add_stmt (mdecl, build_super_invocation (mdecl));
8892 if ((iii = build_instinit_invocation (class_type)))
8893 java_method_add_stmt (mdecl, iii);
8895 end_artificial_method_body (mdecl);
8897 /* Search for an explicit constructor invocation */
8901 int invokes_this = 0;
8902 tree found_call = NULL_TREE;
8903 tree main_block = BLOCK_EXPR_BODY (body);
8906 switch (TREE_CODE (body))
8909 found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
8910 if (CALL_THIS_CONSTRUCTOR_P (body))
8915 case EXPR_WITH_FILE_LOCATION:
8917 body = TREE_OPERAND (body, 0);
8921 body = BLOCK_EXPR_BODY (body);
8928 /* Generate the assignment to this$<n>, if necessary */
8929 if ((thisn_assign = build_thisn_assign ()))
8930 compound = add_stmt_to_compound (compound, NULL_TREE, thisn_assign);
8932 /* The constructor is missing an invocation of super() */
8934 compound = add_stmt_to_compound (compound, NULL_TREE,
8935 build_super_invocation (mdecl));
8936 /* Explicit super() invocation should take place before the
8937 instance initializer blocks. */
8940 compound = add_stmt_to_compound (compound, NULL_TREE,
8941 TREE_OPERAND (found_call, 0));
8942 TREE_OPERAND (found_call, 0) = empty_stmt_node;
8945 DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
8947 /* Insert the instance initializer block right after. */
8948 if (!invokes_this && (iii = build_instinit_invocation (class_type)))
8949 compound = add_stmt_to_compound (compound, NULL_TREE, iii);
8951 /* Fix the constructor main block if we're adding extra stmts */
8954 compound = add_stmt_to_compound (compound, NULL_TREE,
8955 BLOCK_EXPR_BODY (main_block));
8956 BLOCK_EXPR_BODY (main_block) = compound;
8961 /* Browse constructors in the super class, searching for a constructor
8962 that doesn't take any argument. Return 0 if one is found, 1
8963 otherwise. If the current class is an anonymous inner class, look
8964 for something that has the same signature. */
8967 verify_constructor_super (tree mdecl)
8969 tree class = CLASSTYPE_SUPER (current_class);
8970 int super_inner = PURE_INNER_CLASS_TYPE_P (class);
8976 if (ANONYMOUS_CLASS_P (current_class))
8978 tree mdecl_arg_type;
8979 SKIP_THIS_AND_ARTIFICIAL_PARMS (mdecl_arg_type, mdecl);
8980 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
8981 if (DECL_CONSTRUCTOR_P (sdecl))
8984 tree arg_type = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
8986 arg_type = TREE_CHAIN (arg_type);
8987 for (m_arg_type = mdecl_arg_type;
8988 (arg_type != end_params_node
8989 && m_arg_type != end_params_node);
8990 arg_type = TREE_CHAIN (arg_type),
8991 m_arg_type = TREE_CHAIN (m_arg_type))
8992 if (!valid_method_invocation_conversion_p
8993 (TREE_VALUE (arg_type),
8994 TREE_VALUE (m_arg_type)))
8997 if (arg_type == end_params_node && m_arg_type == end_params_node)
9003 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
9005 tree arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
9007 arg = TREE_CHAIN (arg);
9008 if (DECL_CONSTRUCTOR_P (sdecl) && arg == end_params_node)
9015 /* Generate code for all context remembered for code generation. */
9017 static GTY(()) tree reversed_class_list;
9019 java_expand_classes (void)
9021 int save_error_count = 0;
9022 static struct parser_ctxt *cur_ctxp = NULL;
9024 java_parse_abort_on_error ();
9025 if (!(ctxp = ctxp_for_generation))
9027 java_layout_classes ();
9028 java_parse_abort_on_error ();
9030 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9033 for (current = cur_ctxp->class_list;
9035 current = TREE_CHAIN (current))
9036 gen_indirect_dispatch_tables (TREE_TYPE (current));
9039 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9042 input_filename = ctxp->filename;
9043 lang_init_source (2); /* Error msgs have method prototypes */
9044 java_complete_expand_classes (); /* Complete and expand classes */
9045 java_parse_abort_on_error ();
9047 input_filename = main_input_filename;
9049 /* Find anonymous classes and expand their constructor. This extra pass is
9050 necessary because the constructor itself is only generated when the
9051 method in which it is defined is expanded. */
9052 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9056 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9058 output_class = current_class = TREE_TYPE (current);
9059 if (ANONYMOUS_CLASS_P (current_class))
9062 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9064 if (DECL_CONSTRUCTOR_P (d))
9066 restore_line_number_status (1);
9067 java_complete_expand_method (d);
9068 restore_line_number_status (0);
9069 break; /* There is only one constructor. */
9076 /* Expanding the constructors of anonymous classes generates access
9077 methods. Scan all the methods looking for null DECL_RESULTs --
9078 this will be the case if a method hasn't been expanded. */
9079 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9083 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9086 output_class = current_class = TREE_TYPE (current);
9087 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9089 if (DECL_RESULT (d) == NULL_TREE)
9091 restore_line_number_status (1);
9092 java_complete_expand_method (d);
9093 restore_line_number_status (0);
9099 /* ??? Instead of all this we could iterate around the list of
9100 classes until there were no more un-expanded methods. It would
9101 take a little longer -- one pass over the whole list of methods
9102 -- but it would be simpler. Like this: */
9105 int something_changed;
9109 something_changed = 0;
9110 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9114 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9117 output_class = current_class = TREE_TYPE (current);
9118 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9120 if (DECL_RESULT (d) == NULL_TREE)
9122 something_changed = 1;
9123 restore_line_number_status (1);
9124 java_complete_expand_method (d);
9125 restore_line_number_status (0);
9131 while (something_changed);
9135 /* If we've found error at that stage, don't try to generate
9136 anything, unless we're emitting xrefs or checking the syntax only
9137 (but not using -fsyntax-only for the purpose of generating
9139 if (java_error_count && !flag_emit_xref
9140 && (!flag_syntax_only && !flag_emit_class_files))
9143 /* Now things are stable, go for generation of the class data. */
9145 /* We pessimistically marked all methods and fields external until
9146 we knew what set of classes we were planning to compile. Now mark
9147 those that will be generated locally as not external. */
9148 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9152 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9153 java_mark_class_local (TREE_TYPE (current));
9156 /* Compile the classes. */
9157 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9160 reversed_class_list = NULL;
9164 /* We write out the classes in reverse order. This ensures that
9165 inner classes are written before their containing classes,
9166 which is important for parallel builds. Otherwise, the
9167 class file for the outer class may be found, but the class
9168 file for the inner class may not be present. In that
9169 situation, the compiler cannot fall back to the original
9170 source, having already read the outer class, so we must
9171 prevent that situation. */
9172 for (current = ctxp->class_list;
9174 current = TREE_CHAIN (current))
9176 = tree_cons (NULL_TREE, current, reversed_class_list);
9178 for (current = reversed_class_list;
9180 current = TREE_CHAIN (current))
9182 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
9183 if (flag_emit_class_files)
9184 write_classfile (current_class);
9186 expand_xref (current_class);
9187 else if (! flag_syntax_only)
9188 java_expand_method_bodies (current_class);
9194 java_finish_classes (void)
9196 static struct parser_ctxt *cur_ctxp = NULL;
9197 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9201 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9203 output_class = current_class = TREE_TYPE (current);
9209 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
9210 a tree list node containing RIGHT. Fore coming RIGHTs will be
9211 chained to this hook. LOCATION contains the location of the
9212 separating `.' operator. */
9215 make_qualified_primary (tree primary, tree right, int location)
9219 if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
9220 wfl = build_wfl_wrap (primary, location);
9224 /* If wfl wasn't qualified, we build a first anchor */
9225 if (!EXPR_WFL_QUALIFICATION (wfl))
9226 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (wfl, NULL_TREE);
9229 /* And chain them */
9230 EXPR_WFL_LINECOL (right) = location;
9231 chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
9232 PRIMARY_P (wfl) = 1;
9236 /* Simple merge of two name separated by a `.' */
9239 merge_qualified_name (tree left, tree right)
9242 if (!left && !right)
9251 obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
9252 IDENTIFIER_LENGTH (left));
9253 obstack_1grow (&temporary_obstack, '.');
9254 obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
9255 IDENTIFIER_LENGTH (right));
9256 node = get_identifier (obstack_base (&temporary_obstack));
9257 obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
9258 QUALIFIED_P (node) = 1;
9262 /* Merge the two parts of a qualified name into LEFT. Set the
9263 location information of the resulting node to LOCATION, usually
9264 inherited from the location information of the `.' operator. */
9267 make_qualified_name (tree left, tree right, int location)
9269 #ifdef USE_COMPONENT_REF
9270 tree node = build (COMPONENT_REF, NULL_TREE, left, right);
9271 EXPR_WFL_LINECOL (node) = location;
9274 tree left_id = EXPR_WFL_NODE (left);
9275 tree right_id = EXPR_WFL_NODE (right);
9278 merge = merge_qualified_name (left_id, right_id);
9280 /* Left wasn't qualified and is now qualified */
9281 if (!QUALIFIED_P (left_id))
9283 tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
9284 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
9285 EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
9288 wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
9289 EXPR_WFL_LINECOL (wfl) = location;
9290 chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
9292 EXPR_WFL_NODE (left) = merge;
9297 /* Extract the last identifier component of the qualified in WFL. The
9298 last identifier is removed from the linked list */
9301 cut_identifier_in_qualified (tree wfl)
9304 tree previous = NULL_TREE;
9305 for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
9306 if (!TREE_CHAIN (q))
9309 /* Operating on a non qualified qualified WFL. */
9312 TREE_CHAIN (previous) = NULL_TREE;
9313 return TREE_PURPOSE (q);
9317 /* Resolve the expression name NAME. Return its decl. */
9320 resolve_expression_name (tree id, tree *orig)
9322 tree name = EXPR_WFL_NODE (id);
9325 /* 6.5.5.1: Simple expression names */
9326 if (!PRIMARY_P (id) && !QUALIFIED_P (name))
9328 /* 15.13.1: NAME can appear within the scope of a local variable
9330 if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
9333 /* 15.13.1: NAME can appear within a class declaration */
9336 decl = lookup_field_wrapper (current_class, name);
9339 tree access = NULL_TREE;
9340 int fs = FIELD_STATIC (decl);
9342 /* If we're accessing an outer scope local alias, make
9343 sure we change the name of the field we're going to
9345 if (FIELD_LOCAL_ALIAS_USED (decl))
9346 name = DECL_NAME (decl);
9348 check_deprecation (id, decl);
9350 /* Instance variable (8.3.1.1) can't appear within
9351 static method, static initializer or initializer for
9352 a static variable. */
9353 if (!fs && METHOD_STATIC (current_function_decl))
9355 static_ref_err (id, name, current_class);
9356 return error_mark_node;
9358 /* Instance variables can't appear as an argument of
9359 an explicit constructor invocation */
9360 if (!fs && ctxp->explicit_constructor_p
9361 && !enclosing_context_p (DECL_CONTEXT (decl), current_class))
9364 (id, "Can't reference `%s' before the superclass constructor has been called", IDENTIFIER_POINTER (name));
9365 return error_mark_node;
9368 /* If we're processing an inner class and we're trying
9369 to access a field belonging to an outer class, build
9370 the access to the field */
9371 if (!fs && outer_field_access_p (current_class, decl))
9373 if (CLASS_STATIC (TYPE_NAME (current_class)))
9375 static_ref_err (id, DECL_NAME (decl), current_class);
9376 return error_mark_node;
9378 access = build_outer_field_access (id, decl);
9384 /* Otherwise build what it takes to access the field */
9385 access = build_field_ref ((fs ? NULL_TREE : current_this),
9386 DECL_CONTEXT (decl), name);
9388 access = maybe_build_class_init_for_field (decl, access);
9389 /* We may be asked to save the real field access node */
9392 /* Last check: can we access the field? */
9393 if (not_accessible_p (current_class, decl, NULL_TREE, 0))
9395 not_accessible_field_error (id, decl);
9396 return error_mark_node;
9398 /* And we return what we got */
9401 /* Fall down to error report on undefined variable */
9404 /* 6.5.5.2 Qualified Expression Names */
9409 qualify_ambiguous_name (id);
9410 /* 15.10.1 Field Access Using a Primary and/or Expression Name */
9411 /* 15.10.2: Accessing Superclass Members using super */
9412 return resolve_field_access (id, orig, NULL);
9415 /* We've got an error here */
9416 if (INNER_CLASS_TYPE_P (current_class))
9417 parse_error_context (id,
9418 "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final",
9419 IDENTIFIER_POINTER (name),
9420 IDENTIFIER_POINTER (DECL_NAME
9421 (TYPE_NAME (current_class))));
9423 parse_error_context (id, "Undefined variable `%s'",
9424 IDENTIFIER_POINTER (name));
9426 return error_mark_node;
9430 static_ref_err (tree wfl, tree field_id, tree class_type)
9434 "Can't make a static reference to nonstatic variable `%s' in class `%s'",
9435 IDENTIFIER_POINTER (field_id),
9436 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
9439 /* 15.10.1 Field Access Using a Primary and/or Expression Name.
9440 We return something suitable to generate the field access. We also
9441 return the field decl in FIELD_DECL and its type in FIELD_TYPE. If
9442 recipient's address can be null. */
9445 resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
9449 tree decl, where_found, type_found;
9451 if (resolve_qualified_expression_name (qual_wfl, &decl,
9452 &where_found, &type_found))
9453 return error_mark_node;
9455 /* Resolve the LENGTH field of an array here */
9456 if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node
9457 && type_found && TYPE_ARRAY_P (type_found)
9458 && ! flag_emit_class_files && ! flag_emit_xref)
9460 tree length = build_java_array_length_access (where_found);
9463 /* In case we're dealing with a static array, we need to
9464 initialize its class before the array length can be fetched.
9465 It's also a good time to create a DECL_RTL for the field if
9466 none already exists, otherwise if the field was declared in a
9467 class found in an external file and hasn't been (and won't
9468 be) accessed for its value, none will be created. */
9469 if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
9471 build_static_field_ref (where_found);
9472 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9475 /* We might have been trying to resolve field.method(). In which
9476 case, the resolution is over and decl is the answer */
9477 else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
9479 else if (JDECL_P (decl))
9482 type_found = DECL_CONTEXT (decl);
9483 is_static = FIELD_STATIC (decl);
9484 field_ref = build_field_ref ((is_static && !flag_emit_xref?
9485 NULL_TREE : where_found),
9486 type_found, DECL_NAME (decl));
9487 if (field_ref == error_mark_node)
9488 return error_mark_node;
9490 field_ref = maybe_build_class_init_for_field (decl, field_ref);
9492 /* If we're looking at a static field, we may need to generate a
9493 class initialization for it. This can happen when the access
9494 looks like `field.ref', where `field' is a static field in an
9495 interface we implement. */
9496 if (!flag_emit_class_files
9498 && TREE_CODE (where_found) == VAR_DECL
9499 && FIELD_STATIC (where_found))
9501 build_static_field_ref (where_found);
9502 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9511 *field_type = (QUAL_DECL_TYPE (decl) ?
9512 QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
9516 /* If NODE is an access to f static field, strip out the class
9517 initialization part and return the field decl, otherwise, return
9521 strip_out_static_field_access_decl (tree node)
9523 if (TREE_CODE (node) == COMPOUND_EXPR)
9525 tree op1 = TREE_OPERAND (node, 1);
9526 if (TREE_CODE (op1) == COMPOUND_EXPR)
9528 tree call = TREE_OPERAND (op1, 0);
9529 if (TREE_CODE (call) == CALL_EXPR
9530 && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
9531 && TREE_OPERAND (TREE_OPERAND (call, 0), 0)
9532 == soft_initclass_node)
9533 return TREE_OPERAND (op1, 1);
9535 else if (JDECL_P (op1))
9541 /* 6.5.5.2: Qualified Expression Names */
9544 resolve_qualified_expression_name (tree wfl, tree *found_decl,
9545 tree *where_found, tree *type_found)
9547 int from_type = 0; /* Field search initiated from a type */
9548 int from_super = 0, from_cast = 0, from_qualified_this = 0;
9549 int previous_call_static = 0;
9551 tree decl = NULL_TREE, type = NULL_TREE, q;
9552 /* For certain for of inner class instantiation */
9553 tree saved_current, saved_this;
9554 #define RESTORE_THIS_AND_CURRENT_CLASS \
9555 { current_class = saved_current; current_this = saved_this;}
9557 *type_found = *where_found = NULL_TREE;
9559 for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
9561 tree qual_wfl = QUAL_WFL (q);
9562 tree ret_decl; /* for EH checking */
9563 int location; /* for EH checking */
9565 /* 15.10.1 Field Access Using a Primary */
9566 switch (TREE_CODE (qual_wfl))
9569 case NEW_CLASS_EXPR:
9570 /* If the access to the function call is a non static field,
9571 build the code to access it. */
9572 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9574 decl = maybe_access_field (decl, *where_found,
9575 DECL_CONTEXT (decl));
9576 if (decl == error_mark_node)
9580 /* And code for the function call */
9581 if (complete_function_arguments (qual_wfl))
9584 /* We might have to setup a new current class and a new this
9585 for the search of an inner class, relative to the type of
9586 a expression resolved as `decl'. The current values are
9587 saved and restored shortly after */
9588 saved_current = current_class;
9589 saved_this = current_this;
9591 && (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9592 || from_qualified_this))
9594 /* If we still have `from_qualified_this', we have the form
9595 <T>.this.f() and we need to build <T>.this */
9596 if (from_qualified_this)
9598 decl = build_access_to_thisn (current_class, type, 0);
9599 decl = java_complete_tree (decl);
9600 type = TREE_TYPE (TREE_TYPE (decl));
9602 current_class = type;
9603 current_this = decl;
9604 from_qualified_this = 0;
9607 if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
9608 CALL_USING_SUPER (qual_wfl) = 1;
9609 location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
9610 EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
9611 *where_found = patch_method_invocation (qual_wfl, decl, type,
9613 &is_static, &ret_decl);
9615 if (*where_found == error_mark_node)
9617 RESTORE_THIS_AND_CURRENT_CLASS;
9620 *type_found = type = QUAL_DECL_TYPE (*where_found);
9622 *where_found = force_evaluation_order (*where_found);
9624 /* If we're creating an inner class instance, check for that
9625 an enclosing instance is in scope */
9626 if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9627 && INNER_ENCLOSING_SCOPE_CHECK (type))
9630 (qual_wfl, "No enclosing instance for inner class `%s' is in scope%s",
9631 lang_printable_name (type, 0),
9632 (!current_this ? "" :
9633 "; an explicit one must be provided when creating this inner class"));
9634 RESTORE_THIS_AND_CURRENT_CLASS;
9638 /* In case we had to change then to resolve a inner class
9639 instantiation using a primary qualified by a `new' */
9640 RESTORE_THIS_AND_CURRENT_CLASS;
9644 tree arguments = NULL_TREE;
9645 if (TREE_CODE (qual_wfl) == CALL_EXPR
9646 && TREE_OPERAND (qual_wfl, 1) != NULL_TREE)
9647 arguments = TREE_VALUE (TREE_OPERAND (qual_wfl, 1));
9648 check_thrown_exceptions (location, ret_decl, arguments);
9651 /* If the previous call was static and this one is too,
9652 build a compound expression to hold the two (because in
9653 that case, previous function calls aren't transported as
9654 forcoming function's argument. */
9655 if (previous_call_static && is_static)
9657 decl = build (COMPOUND_EXPR, TREE_TYPE (*where_found),
9658 decl, *where_found);
9659 TREE_SIDE_EFFECTS (decl) = 1;
9663 previous_call_static = is_static;
9664 decl = *where_found;
9669 case NEW_ARRAY_EXPR:
9670 case NEW_ANONYMOUS_ARRAY_EXPR:
9671 *where_found = decl = java_complete_tree (qual_wfl);
9672 if (decl == error_mark_node)
9674 *type_found = type = QUAL_DECL_TYPE (decl);
9678 *where_found = decl = java_complete_tree (qual_wfl);
9679 if (decl == error_mark_node)
9681 *type_found = type = QUAL_DECL_TYPE (decl);
9685 case CONDITIONAL_EXPR:
9688 *where_found = decl = java_complete_tree (qual_wfl);
9689 if (decl == error_mark_node)
9691 *type_found = type = QUAL_DECL_TYPE (decl);
9695 /* If the access to the function call is a non static field,
9696 build the code to access it. */
9697 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9699 decl = maybe_access_field (decl, *where_found, type);
9700 if (decl == error_mark_node)
9703 /* And code for the array reference expression */
9704 decl = java_complete_tree (qual_wfl);
9705 if (decl == error_mark_node)
9707 type = QUAL_DECL_TYPE (decl);
9711 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9713 if ((type = patch_string (decl)))
9715 *where_found = QUAL_RESOLUTION (q) = decl;
9716 *type_found = type = TREE_TYPE (decl);
9720 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9722 *where_found = QUAL_RESOLUTION (q) = decl;
9723 *type_found = type = TREE_TYPE (decl);
9727 /* Fix for -Wall Just go to the next statement. Don't
9732 /* If we fall here, we weren't processing a (static) function call. */
9733 previous_call_static = 0;
9735 /* It can be the keyword THIS */
9736 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9737 && EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
9742 (wfl, "Keyword `this' used outside allowed context");
9745 if (ctxp->explicit_constructor_p
9746 && type == current_class)
9748 parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
9751 /* We have to generate code for intermediate access */
9752 if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type)
9754 *where_found = decl = current_this;
9755 *type_found = type = QUAL_DECL_TYPE (decl);
9757 /* We're trying to access the this from somewhere else. Make sure
9758 it's allowed before doing so. */
9761 if (!enclosing_context_p (type, current_class))
9763 char *p = xstrdup (lang_printable_name (type, 0));
9764 parse_error_context (qual_wfl, "Can't use variable `%s.this': type `%s' isn't an outer type of type `%s'",
9766 lang_printable_name (current_class, 0));
9770 from_qualified_this = 1;
9771 /* If there's nothing else after that, we need to
9772 produce something now, otherwise, the section of the
9773 code that needs to produce <T>.this will generate
9774 what is necessary. */
9775 if (!TREE_CHAIN (q))
9777 decl = build_access_to_thisn (current_class, type, 0);
9778 *where_found = decl = java_complete_tree (decl);
9779 *type_found = type = TREE_TYPE (decl);
9787 /* 15.10.2 Accessing Superclass Members using SUPER */
9788 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9789 && EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
9792 /* Check on the restricted use of SUPER */
9793 if (METHOD_STATIC (current_function_decl)
9794 || current_class == object_type_node)
9797 (wfl, "Keyword `super' used outside allowed context");
9800 /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
9801 node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
9802 CLASSTYPE_SUPER (current_class),
9803 build_this (EXPR_WFL_LINECOL (qual_wfl)));
9804 *where_found = decl = java_complete_tree (node);
9805 if (decl == error_mark_node)
9807 *type_found = type = QUAL_DECL_TYPE (decl);
9808 from_super = from_type = 1;
9812 /* 15.13.1: Can't search for field name in packages, so we
9813 assume a variable/class name was meant. */
9814 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
9817 if ((decl = resolve_package (wfl, &q, &name)))
9820 *where_found = decl;
9822 /* We want to be absolutely sure that the class is laid
9823 out. We're going to search something inside it. */
9824 *type_found = type = TREE_TYPE (decl);
9825 layout_class (type);
9828 /* Fix them all the way down, if any are left. */
9831 list = TREE_CHAIN (q);
9834 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (list)) = 0;
9835 list = TREE_CHAIN (list);
9841 if (from_super || from_cast)
9843 ((from_cast ? qual_wfl : wfl),
9844 "No variable `%s' defined in class `%s'",
9845 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9846 lang_printable_name (type, 0));
9849 (qual_wfl, "Undefined variable or class name: `%s'",
9850 IDENTIFIER_POINTER (name));
9855 /* We have a type name. It's been already resolved when the
9856 expression was qualified. */
9857 else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q))
9859 decl = QUAL_RESOLUTION (q);
9861 /* Sneak preview. If next we see a `new', we're facing a
9862 qualification with resulted in a type being selected
9863 instead of a field. Report the error */
9865 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR)
9867 parse_error_context (qual_wfl, "Undefined variable `%s'",
9868 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
9872 if (not_accessible_p (TREE_TYPE (decl), decl, type, 0))
9875 (qual_wfl, "Can't access %s class '%s' from '%s'",
9876 java_accstring_lookup (get_access_flags_from_decl (decl)),
9877 IDENTIFIER_POINTER (DECL_NAME (decl)),
9878 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
9881 check_deprecation (qual_wfl, decl);
9883 type = TREE_TYPE (decl);
9886 /* We resolve an expression name */
9889 tree field_decl = NULL_TREE;
9891 /* If there exists an early resolution, use it. That occurs
9892 only once and we know that there are more things to
9893 come. Don't do that when processing something after SUPER
9894 (we need more thing to be put in place below */
9895 if (!from_super && QUAL_RESOLUTION (q))
9897 decl = QUAL_RESOLUTION (q);
9900 if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
9903 *where_found = current_this;
9906 static_ref_err (qual_wfl, DECL_NAME (decl),
9910 if (outer_field_access_p (current_class, decl))
9911 decl = build_outer_field_access (qual_wfl, decl);
9915 *where_found = TREE_TYPE (decl);
9916 if (TREE_CODE (*where_found) == POINTER_TYPE)
9917 *where_found = TREE_TYPE (*where_found);
9922 /* Report and error if we're using a numerical literal as a
9923 qualifier. It can only be an INTEGER_CST. */
9924 else if (TREE_CODE (qual_wfl) == INTEGER_CST)
9927 (wfl, "Can't use type `%s' as a qualifier",
9928 lang_printable_name (TREE_TYPE (qual_wfl), 0));
9932 /* We have to search for a field, knowing the type of its
9933 container. The flag FROM_TYPE indicates that we resolved
9934 the last member of the expression as a type name, which
9935 means that for the resolution of this field, we'll look
9936 for other errors than if it was resolved as a member of
9941 tree field_decl_type; /* For layout */
9943 if (!from_type && !JREFERENCE_TYPE_P (type))
9946 (qual_wfl, "Attempt to reference field `%s' in `%s %s'",
9947 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9948 lang_printable_name (type, 0),
9949 IDENTIFIER_POINTER (DECL_NAME (decl)));
9953 field_decl = lookup_field_wrapper (type,
9954 EXPR_WFL_NODE (qual_wfl));
9956 /* Maybe what we're trying to access to is an inner
9957 class, only if decl is a TYPE_DECL. */
9958 if (!field_decl && TREE_CODE (decl) == TYPE_DECL)
9960 tree ptr, inner_decl;
9962 BUILD_PTR_FROM_NAME (ptr, EXPR_WFL_NODE (qual_wfl));
9963 inner_decl = resolve_class (decl, ptr, NULL_TREE, qual_wfl);
9966 check_inner_class_access (inner_decl, decl, qual_wfl);
9967 type = TREE_TYPE (inner_decl);
9974 if (field_decl == NULL_TREE)
9977 (qual_wfl, "No variable `%s' defined in type `%s'",
9978 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9979 GET_TYPE_NAME (type));
9982 if (field_decl == error_mark_node)
9985 /* Layout the type of field_decl, since we may need
9986 it. Don't do primitive types or loaded classes. The
9987 situation of non primitive arrays may not handled
9988 properly here. FIXME */
9989 if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
9990 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
9992 field_decl_type = TREE_TYPE (field_decl);
9993 if (!JPRIMITIVE_TYPE_P (field_decl_type)
9994 && !CLASS_LOADED_P (field_decl_type)
9995 && !TYPE_ARRAY_P (field_decl_type))
9996 resolve_and_layout (field_decl_type, NULL_TREE);
9998 /* Check on accessibility here */
9999 if (not_accessible_p (current_class, field_decl,
10000 DECL_CONTEXT (field_decl), from_super))
10001 return not_accessible_field_error (qual_wfl,field_decl);
10002 check_deprecation (qual_wfl, field_decl);
10004 /* There are things to check when fields are accessed
10005 from type. There are no restrictions on a static
10006 declaration of the field when it is accessed from an
10008 is_static = FIELD_STATIC (field_decl);
10009 if (!from_super && from_type
10010 && !TYPE_INTERFACE_P (type)
10012 && (current_function_decl
10013 && METHOD_STATIC (current_function_decl)))
10015 static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
10018 from_cast = from_super = 0;
10020 /* It's an access from a type but it isn't static, we
10021 make it relative to `this'. */
10022 if (!is_static && from_type)
10023 decl = current_this;
10025 /* If we need to generate something to get a proper
10026 handle on what this field is accessed from, do it
10030 decl = maybe_access_field (decl, *where_found, *type_found);
10031 if (decl == error_mark_node)
10035 /* We want to keep the location were found it, and the type
10037 *where_found = decl;
10038 *type_found = type;
10040 /* Generate the correct expression for field access from
10042 if (from_qualified_this)
10044 field_decl = build_outer_field_access (qual_wfl, field_decl);
10045 from_qualified_this = 0;
10048 /* This is the decl found and eventually the next one to
10053 type = QUAL_DECL_TYPE (decl);
10055 /* Sneak preview. If decl is qualified by a `new', report
10056 the error here to be accurate on the peculiar construct */
10058 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR
10059 && !JREFERENCE_TYPE_P (type))
10061 parse_error_context (qual_wfl, "Attempt to reference field `new' in a `%s'",
10062 lang_printable_name (type, 0));
10066 /* `q' might have changed due to a after package resolution
10067 re-qualification */
10071 *found_decl = decl;
10075 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
10076 can't be accessed from REFERENCE (a record type). If MEMBER
10077 features a protected access, we then use WHERE which, if non null,
10078 holds the type of MEMBER's access that is checked against
10079 6.6.2.1. This function should be used when decl is a field or a
10083 not_accessible_p (tree reference, tree member, tree where, int from_super)
10085 int access_flag = get_access_flags_from_decl (member);
10087 /* Inner classes are processed by check_inner_class_access */
10088 if (INNER_CLASS_TYPE_P (reference))
10091 /* Access always granted for members declared public */
10092 if (access_flag & ACC_PUBLIC)
10095 /* Check access on protected members */
10096 if (access_flag & ACC_PROTECTED)
10098 /* Access granted if it occurs from within the package
10099 containing the class in which the protected member is
10101 if (class_in_current_package (DECL_CONTEXT (member)))
10104 /* If accessed with the form `super.member', then access is granted */
10108 /* If where is active, access was made through a
10109 qualifier. Access is granted if the type of the qualifier is
10110 or is a sublass of the type the access made from (6.6.2.1.) */
10111 if (where && !inherits_from_p (reference, where))
10114 /* Otherwise, access is granted if occurring from the class where
10115 member is declared or a subclass of it. Find the right
10116 context to perform the check */
10117 if (PURE_INNER_CLASS_TYPE_P (reference))
10119 while (INNER_CLASS_TYPE_P (reference))
10121 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10123 reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10126 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10131 /* Check access on private members. Access is granted only if it
10132 occurs from within the class in which it is declared -- that does
10133 it for innerclasses too. */
10134 if (access_flag & ACC_PRIVATE)
10136 if (reference == DECL_CONTEXT (member))
10138 if (enclosing_context_p (reference, DECL_CONTEXT (member)))
10143 /* Default access are permitted only when occurring within the
10144 package in which the type (REFERENCE) is declared. In other words,
10145 REFERENCE is defined in the current package */
10147 return !class_in_current_package (reference);
10149 /* Otherwise, access is granted */
10153 /* Test deprecated decl access. */
10155 check_deprecation (tree wfl, tree decl)
10160 if (! flag_deprecated)
10163 /* We want to look at the element type of arrays here, so we strip
10164 all surrounding array types. */
10165 if (TYPE_ARRAY_P (TREE_TYPE (decl)))
10167 elt = TREE_TYPE (decl);
10168 while (TYPE_ARRAY_P (elt))
10169 elt = TYPE_ARRAY_ELEMENT (elt);
10170 /* We'll end up with a pointer type, so we use TREE_TYPE to go
10172 decl = TYPE_NAME (TREE_TYPE (elt));
10174 file = DECL_SOURCE_FILE (decl);
10176 /* Complain if the field is deprecated and the file it was defined
10177 in isn't compiled at the same time the file which contains its
10179 if (DECL_DEPRECATED (decl)
10180 && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
10183 switch (TREE_CODE (decl))
10185 case FUNCTION_DECL:
10193 parse_warning_context (wfl, "The class `%s' has been deprecated",
10194 IDENTIFIER_POINTER (DECL_NAME (decl)));
10199 /* Don't issue a message if the context as been deprecated as a
10201 if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl))))
10202 parse_warning_context
10203 (wfl, "The %s `%s' in class `%s' has been deprecated",
10204 the, lang_printable_name (decl, 0),
10205 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
10209 /* Returns 1 if class was declared in the current package, 0 otherwise */
10211 static GTY(()) tree cicp_cache;
10213 class_in_current_package (tree class)
10215 int qualified_flag;
10218 if (cicp_cache == class)
10221 qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
10223 /* If the current package is empty and the name of CLASS is
10224 qualified, class isn't in the current package. If there is a
10225 current package and the name of the CLASS is not qualified, class
10226 isn't in the current package */
10227 if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
10230 /* If there is not package and the name of CLASS isn't qualified,
10231 they belong to the same unnamed package */
10232 if (!ctxp->package && !qualified_flag)
10235 /* Compare the left part of the name of CLASS with the package name */
10236 breakdown_qualified (&left, NULL, DECL_NAME (TYPE_NAME (class)));
10237 if (ctxp->package == left)
10239 cicp_cache = class;
10245 /* This function may generate code to access DECL from WHERE. This is
10246 done only if certain conditions meet. */
10249 maybe_access_field (tree decl, tree where, tree type)
10251 if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
10252 && !FIELD_STATIC (decl))
10253 decl = build_field_ref (where ? where : current_this,
10254 (type ? type : DECL_CONTEXT (decl)),
10259 /* Build a method invocation, by patching PATCH. If non NULL
10260 and according to the situation, PRIMARY and WHERE may be
10261 used. IS_STATIC is set to 1 if the invoked function is static. */
10264 patch_method_invocation (tree patch, tree primary, tree where, int from_super,
10265 int *is_static, tree *ret_decl)
10267 tree wfl = TREE_OPERAND (patch, 0);
10268 tree args = TREE_OPERAND (patch, 1);
10269 tree name = EXPR_WFL_NODE (wfl);
10271 int is_static_flag = 0;
10272 int is_super_init = 0;
10273 tree this_arg = NULL_TREE;
10274 int is_array_clone_call = 0;
10276 /* Should be overridden if everything goes well. Otherwise, if
10277 something fails, it should keep this value. It stop the
10278 evaluation of a bogus assignment. See java_complete_tree,
10279 MODIFY_EXPR: for the reasons why we sometimes want to keep on
10280 evaluating an assignment */
10281 TREE_TYPE (patch) = error_mark_node;
10283 /* Since lookup functions are messing with line numbers, save the
10285 java_parser_context_save_global ();
10287 /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
10289 /* Resolution of qualified name, excluding constructors */
10290 if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
10292 tree identifier, identifier_wfl, type, resolved;
10293 /* Extract the last IDENTIFIER of the qualified
10294 expression. This is a wfl and we will use it's location
10295 data during error report. */
10296 identifier_wfl = cut_identifier_in_qualified (wfl);
10297 identifier = EXPR_WFL_NODE (identifier_wfl);
10299 /* Given the context, IDENTIFIER is syntactically qualified
10300 as a MethodName. We need to qualify what's before */
10301 qualify_ambiguous_name (wfl);
10302 resolved = resolve_field_access (wfl, NULL, NULL);
10304 if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved)
10305 && FIELD_FINAL (resolved)
10306 && !inherits_from_p (DECL_CONTEXT (resolved), current_class)
10307 && !flag_emit_class_files && !flag_emit_xref)
10308 resolved = build_class_init (DECL_CONTEXT (resolved), resolved);
10310 if (resolved == error_mark_node)
10311 PATCH_METHOD_RETURN_ERROR ();
10313 type = GET_SKIP_TYPE (resolved);
10314 resolve_and_layout (type, NULL_TREE);
10316 if (JPRIMITIVE_TYPE_P (type))
10318 parse_error_context
10320 "Can't invoke a method on primitive type `%s'",
10321 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10322 PATCH_METHOD_RETURN_ERROR ();
10325 list = lookup_method_invoke (0, identifier_wfl, type, identifier, args);
10326 args = nreverse (args);
10328 /* We're resolving a call from a type */
10329 if (TREE_CODE (resolved) == TYPE_DECL)
10331 if (CLASS_INTERFACE (resolved))
10333 parse_error_context
10335 "Can't make static reference to method `%s' in interface `%s'",
10336 IDENTIFIER_POINTER (identifier),
10337 IDENTIFIER_POINTER (name));
10338 PATCH_METHOD_RETURN_ERROR ();
10340 if (list && !METHOD_STATIC (list))
10342 char *fct_name = xstrdup (lang_printable_name (list, 0));
10343 parse_error_context
10345 "Can't make static reference to method `%s %s' in class `%s'",
10346 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
10347 fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10349 PATCH_METHOD_RETURN_ERROR ();
10353 this_arg = primary = resolved;
10355 if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
10356 is_array_clone_call = 1;
10358 /* IDENTIFIER_WFL will be used to report any problem further */
10359 wfl = identifier_wfl;
10361 /* Resolution of simple names, names generated after a primary: or
10365 tree class_to_search = NULL_TREE;
10366 int lc; /* Looking for Constructor */
10368 /* We search constructor in their target class */
10369 if (CALL_CONSTRUCTOR_P (patch))
10371 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10372 class_to_search = EXPR_WFL_NODE (wfl);
10373 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10374 this_identifier_node)
10375 class_to_search = NULL_TREE;
10376 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10377 super_identifier_node)
10380 if (CLASSTYPE_SUPER (current_class))
10382 DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
10385 parse_error_context (wfl, "Can't invoke super constructor on java.lang.Object");
10386 PATCH_METHOD_RETURN_ERROR ();
10390 /* Class to search is NULL if we're searching the current one */
10391 if (class_to_search)
10393 class_to_search = resolve_and_layout (class_to_search, wfl);
10395 if (!class_to_search)
10397 parse_error_context
10398 (wfl, "Class `%s' not found in type declaration",
10399 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10400 PATCH_METHOD_RETURN_ERROR ();
10403 /* Can't instantiate an abstract class, but we can
10404 invoke it's constructor. It's use within the `new'
10405 context is denied here. */
10406 if (CLASS_ABSTRACT (class_to_search)
10407 && TREE_CODE (patch) == NEW_CLASS_EXPR)
10409 parse_error_context
10410 (wfl, "Class `%s' is an abstract class. It can't be instantiated",
10411 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10412 PATCH_METHOD_RETURN_ERROR ();
10415 class_to_search = TREE_TYPE (class_to_search);
10418 class_to_search = current_class;
10421 /* This is a regular search in the local class, unless an
10422 alternate class is specified. */
10425 if (where != NULL_TREE)
10426 class_to_search = where;
10427 else if (QUALIFIED_P (name))
10428 class_to_search = current_class;
10431 class_to_search = current_class;
10435 if (has_method (class_to_search, name))
10437 if (! INNER_CLASS_TYPE_P (class_to_search))
10439 parse_error_context (wfl,
10440 "No method named `%s' in scope",
10441 IDENTIFIER_POINTER (name));
10442 PATCH_METHOD_RETURN_ERROR ();
10445 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
10451 /* NAME is a simple identifier or comes from a primary. Search
10452 in the class whose declaration contain the method being
10454 resolve_and_layout (class_to_search, NULL_TREE);
10456 list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
10457 /* Don't continue if no method were found, as the next statement
10458 can't be executed then. */
10460 PATCH_METHOD_RETURN_ERROR ();
10462 if (TYPE_ARRAY_P (class_to_search)
10463 && DECL_NAME (list) == get_identifier ("clone"))
10464 is_array_clone_call = 1;
10466 /* Check for static reference if non static methods */
10467 if (check_for_static_method_reference (wfl, patch, list,
10468 class_to_search, primary))
10469 PATCH_METHOD_RETURN_ERROR ();
10471 /* Check for inner classes creation from illegal contexts */
10472 if (lc && (INNER_CLASS_TYPE_P (class_to_search)
10473 && !CLASS_STATIC (TYPE_NAME (class_to_search)))
10474 && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)
10475 && !DECL_INIT_P (current_function_decl))
10477 parse_error_context
10478 (wfl, "No enclosing instance for inner class `%s' is in scope%s",
10479 lang_printable_name (class_to_search, 0),
10480 (!current_this ? "" :
10481 "; an explicit one must be provided when creating this inner class"));
10482 PATCH_METHOD_RETURN_ERROR ();
10485 /* Non static methods are called with the current object extra
10486 argument. If patch a `new TYPE()', the argument is the value
10487 returned by the object allocator. If method is resolved as a
10488 primary, use the primary otherwise use the current THIS. */
10489 args = nreverse (args);
10490 if (TREE_CODE (patch) != NEW_CLASS_EXPR)
10492 this_arg = primary ? primary : current_this;
10494 /* If we're using an access method, things are different.
10495 There are two family of cases:
10497 1) We're not generating bytecodes:
10499 - LIST is non static. It's invocation is transformed from
10500 x(a1,...,an) into this$<n>.x(a1,....an).
10501 - LIST is static. It's invocation is transformed from
10502 x(a1,...,an) into TYPE_OF(this$<n>).x(a1,....an)
10504 2) We're generating bytecodes:
10506 - LIST is non static. It's invocation is transformed from
10507 x(a1,....,an) into access$<n>(this$<n>,a1,...,an).
10508 - LIST is static. It's invocation is transformed from
10509 x(a1,....,an) into TYPE_OF(this$<n>).x(a1,....an).
10511 Of course, this$<n> can be arbitrarily complex, ranging from
10512 this$0 (the immediate outer context) to
10513 access$0(access$0(...(this$0))).
10515 maybe_use_access_method returns a nonzero value if the
10516 this_arg has to be moved into the (then generated) stub
10517 argument list. In the meantime, the selected function
10518 might have be replaced by a generated stub. */
10520 maybe_use_access_method (is_super_init, &list, &this_arg))
10522 args = tree_cons (NULL_TREE, this_arg, args);
10523 this_arg = NULL_TREE; /* So it doesn't get chained twice */
10528 /* Merge point of all resolution schemes. If we have nothing, this
10529 is an error, already signaled */
10531 PATCH_METHOD_RETURN_ERROR ();
10533 /* Check accessibility, position the is_static flag, build and
10535 if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
10536 (primary ? TREE_TYPE (TREE_TYPE (primary)) :
10537 NULL_TREE), from_super)
10538 /* Calls to clone() on array types are permitted as a special-case. */
10539 && !is_array_clone_call)
10541 const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list));
10542 const char *const access =
10543 java_accstring_lookup (get_access_flags_from_decl (list));
10544 const char *const klass =
10545 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list))));
10546 const char *const refklass =
10547 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
10548 const char *const what = (DECL_CONSTRUCTOR_P (list)
10549 ? "constructor" : "method");
10550 /* FIXME: WFL yields the wrong message here but I don't know
10551 what else to use. */
10552 parse_error_context (wfl,
10553 "Can't access %s %s `%s.%s' from `%s'",
10554 access, what, klass, fct_name, refklass);
10555 PATCH_METHOD_RETURN_ERROR ();
10558 /* Deprecation check: check whether the method being invoked or the
10559 instance-being-created's type are deprecated. */
10560 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10561 check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list)));
10562 check_deprecation (wfl, list);
10564 /* If invoking a innerclass constructor, there are hidden parameters
10566 if (TREE_CODE (patch) == NEW_CLASS_EXPR
10567 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10569 /* And make sure we add the accessed local variables to be saved
10570 in field aliases. */
10571 args = build_alias_initializer_parameter_list
10572 (AIPL_FUNCTION_CTOR_INVOCATION, DECL_CONTEXT (list), args, NULL);
10574 /* Secretly pass the current_this/primary as a second argument */
10575 if (primary || current_this)
10578 tree this_type = (current_this ?
10579 TREE_TYPE (TREE_TYPE (current_this)) : NULL_TREE);
10580 /* Method's (list) enclosing context */
10581 tree mec = DECL_CONTEXT (TYPE_NAME (DECL_CONTEXT (list)));
10582 /* If we have a primary, use it. */
10584 extra_arg = primary;
10585 /* The current `this' is an inner class but isn't a direct
10586 enclosing context for the inner class we're trying to
10587 create. Build an access to the proper enclosing context
10589 else if (current_this && PURE_INNER_CLASS_TYPE_P (this_type)
10590 && this_type != TREE_TYPE (mec))
10593 extra_arg = build_access_to_thisn (current_class,
10594 TREE_TYPE (mec), 0);
10595 extra_arg = java_complete_tree (extra_arg);
10597 /* Otherwise, just use the current `this' as an enclosing
10600 extra_arg = current_this;
10601 args = tree_cons (NULL_TREE, extra_arg, args);
10604 args = tree_cons (NULL_TREE, integer_zero_node, args);
10607 /* This handles the situation where a constructor invocation needs
10608 to have an enclosing context passed as a second parameter (the
10609 constructor is one of an inner class). */
10610 if ((is_super_init ||
10611 (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node))
10612 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10614 tree dest = TYPE_NAME (DECL_CONTEXT (list));
10616 build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0);
10617 extra_arg = java_complete_tree (extra_arg);
10618 args = tree_cons (NULL_TREE, extra_arg, args);
10621 is_static_flag = METHOD_STATIC (list);
10622 if (! is_static_flag && this_arg != NULL_TREE)
10623 args = tree_cons (NULL_TREE, this_arg, args);
10625 /* In the context of an explicit constructor invocation, we can't
10626 invoke any method relying on `this'. Exceptions are: we're
10627 invoking a static function, primary exists and is not the current
10628 this, we're creating a new object. */
10629 if (ctxp->explicit_constructor_p
10631 && (!primary || primary == current_this)
10632 && (TREE_CODE (patch) != NEW_CLASS_EXPR))
10634 parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
10635 PATCH_METHOD_RETURN_ERROR ();
10637 java_parser_context_restore_global ();
10639 *is_static = is_static_flag;
10640 /* Sometimes, we want the decl of the selected method. Such as for
10644 patch = patch_invoke (patch, list, args);
10646 /* Now is a good time to insert the call to finit$ */
10647 if (is_super_init && CLASS_HAS_FINIT_P (current_class))
10649 tree finit_parms, finit_call;
10651 /* Prepare to pass hidden parameters to finit$, if any. */
10652 finit_parms = build_alias_initializer_parameter_list
10653 (AIPL_FUNCTION_FINIT_INVOCATION, current_class, NULL_TREE, NULL);
10656 build_method_invocation (build_wfl_node (finit_identifier_node),
10659 /* Generate the code used to initialize fields declared with an
10660 initialization statement and build a compound statement along
10661 with the super constructor invocation. */
10662 CAN_COMPLETE_NORMALLY (patch) = 1;
10663 patch = build (COMPOUND_EXPR, void_type_node, patch,
10664 java_complete_tree (finit_call));
10669 /* Check that we're not trying to do a static reference to a method in
10670 non static method. Return 1 if it's the case, 0 otherwise. */
10673 check_for_static_method_reference (tree wfl, tree node, tree method,
10674 tree where, tree primary)
10676 if (METHOD_STATIC (current_function_decl)
10677 && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
10679 char *fct_name = xstrdup (lang_printable_name (method, 0));
10680 parse_error_context
10681 (wfl, "Can't make static reference to method `%s %s' in class `%s'",
10682 lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
10683 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
10690 /* Fix the invocation of *MDECL if necessary in the case of a
10691 invocation from an inner class. *THIS_ARG might be modified
10692 appropriately and an alternative access to *MDECL might be
10696 maybe_use_access_method (int is_super_init, tree *mdecl, tree *this_arg)
10699 tree md = *mdecl, ta = *this_arg;
10701 int non_static_context = !METHOD_STATIC (md);
10704 || DECL_CONTEXT (md) == current_class
10705 || !PURE_INNER_CLASS_TYPE_P (current_class)
10706 || DECL_FINIT_P (md)
10707 || DECL_INSTINIT_P (md))
10710 /* If we're calling a method found in an enclosing class, generate
10711 what it takes to retrieve the right this. Don't do that if we're
10712 invoking a static method. Note that if MD's type is unrelated to
10713 CURRENT_CLASS, then the current this can be used. */
10715 if (non_static_context && DECL_CONTEXT (md) != object_type_node)
10717 ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
10718 if (inherits_from_p (ctx, DECL_CONTEXT (md)))
10720 ta = build_current_thisn (current_class);
10721 ta = build_wfl_node (ta);
10728 maybe_build_thisn_access_method (type);
10729 if (inherits_from_p (type, DECL_CONTEXT (md)))
10731 ta = build_access_to_thisn (ctx, type, 0);
10734 type = (DECL_CONTEXT (TYPE_NAME (type)) ?
10735 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))) : NULL_TREE);
10738 ta = java_complete_tree (ta);
10741 /* We might have to use an access method to get to MD. We can
10742 break the method access rule as far as we're not generating
10744 if (METHOD_PRIVATE (md) && flag_emit_class_files)
10746 md = build_outer_method_access_method (md);
10753 /* Returning a nonzero value indicates we were doing a non static
10754 method invocation that is now a static invocation. It will have
10755 callee displace `this' to insert it in the regular argument
10757 return (non_static_context && to_return);
10760 /* Patch an invoke expression METHOD and ARGS, based on its invocation
10764 patch_invoke (tree patch, tree method, tree args)
10767 tree original_call, t, ta;
10768 tree check = NULL_TREE;
10770 /* Last step for args: convert build-in types. If we're dealing with
10771 a new TYPE() type call, the first argument to the constructor
10772 isn't found in the incoming argument list, but delivered by
10774 t = TYPE_ARG_TYPES (TREE_TYPE (method));
10775 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10776 t = TREE_CHAIN (t);
10777 for (ta = args; t != end_params_node && ta;
10778 t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
10779 if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
10780 TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
10781 TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
10783 /* Resolve unresolved returned type issues */
10784 t = TREE_TYPE (TREE_TYPE (method));
10785 if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
10786 resolve_and_layout (TREE_TYPE (t), NULL);
10788 if (flag_emit_class_files || flag_emit_xref)
10792 switch (invocation_mode (method, CALL_USING_SUPER (patch)))
10794 case INVOKE_VIRTUAL:
10795 dtable = invoke_build_dtable (0, args);
10796 func = build_invokevirtual (dtable, method);
10799 case INVOKE_NONVIRTUAL:
10800 /* If the object for the method call is null, we throw an
10801 exception. We don't do this if the object is the current
10802 method's `this'. In other cases we just rely on an
10803 optimization pass to eliminate redundant checks. */
10804 if (TREE_VALUE (args) != current_this)
10806 /* We use a save_expr here to make sure we only evaluate
10807 the new `self' expression once. */
10808 tree save_arg = save_expr (TREE_VALUE (args));
10809 TREE_VALUE (args) = save_arg;
10810 check = java_check_reference (save_arg, 1);
10812 /* Fall through. */
10815 case INVOKE_STATIC:
10817 tree signature = build_java_signature (TREE_TYPE (method));
10818 func = build_known_method_ref (method, TREE_TYPE (method),
10819 DECL_CONTEXT (method),
10824 case INVOKE_INTERFACE:
10825 dtable = invoke_build_dtable (1, args);
10826 func = build_invokeinterface (dtable, method);
10833 /* Ensure self_type is initialized, (invokestatic). FIXME */
10834 func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
10837 TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
10838 TREE_OPERAND (patch, 0) = func;
10839 TREE_OPERAND (patch, 1) = args;
10840 patch = check_for_builtin (method, patch);
10841 original_call = patch;
10843 /* We're processing a `new TYPE ()' form. New is called and its
10844 returned value is the first argument to the constructor. We build
10845 a COMPOUND_EXPR and use saved expression so that the overall NEW
10846 expression value is a pointer to a newly created and initialized
10848 if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
10850 tree class = DECL_CONTEXT (method);
10851 tree c1, saved_new, size, new;
10854 if (flag_emit_class_files || flag_emit_xref)
10856 TREE_TYPE (patch) = build_pointer_type (class);
10859 if (!TYPE_SIZE (class))
10860 safe_layout_class (class);
10861 size = size_in_bytes (class);
10863 (class_has_finalize_method (class) ? alloc_object_node
10864 : alloc_no_finalizer_node);
10865 new = build (CALL_EXPR, promote_type (class),
10866 build_address_of (alloc_node),
10867 tree_cons (NULL_TREE, build_class_ref (class),
10868 build_tree_list (NULL_TREE,
10869 size_in_bytes (class))),
10871 saved_new = save_expr (new);
10872 c1 = build_tree_list (NULL_TREE, saved_new);
10873 TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
10874 TREE_OPERAND (original_call, 1) = c1;
10875 TREE_SET_CODE (original_call, CALL_EXPR);
10876 patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
10879 /* If CHECK is set, then we are building a check to see if the object
10881 if (check != NULL_TREE)
10883 /* We have to call force_evaluation_order now because creating a
10884 COMPOUND_EXPR wraps the arg list in a way that makes it
10885 unrecognizable by force_evaluation_order later. Yuk. */
10886 patch = build (COMPOUND_EXPR, TREE_TYPE (patch), check,
10887 force_evaluation_order (patch));
10888 TREE_SIDE_EFFECTS (patch) = 1;
10891 /* In order to be able to modify PATCH later, we SAVE_EXPR it and
10892 put it as the first expression of a COMPOUND_EXPR. The second
10893 expression being an empty statement to be later patched if
10894 necessary. We remember a TREE_LIST (the PURPOSE is the method,
10895 the VALUE is the compound) in a hashtable and return a
10896 COMPOUND_EXPR built so that the result of the evaluation of the
10897 original PATCH node is returned. */
10898 if (STATIC_CLASS_INIT_OPT_P ()
10899 && current_function_decl && METHOD_STATIC (method))
10902 tree fndecl = current_function_decl;
10903 /* We have to call force_evaluation_order now because creating a
10904 COMPOUND_EXPR wraps the arg list in a way that makes it
10905 unrecognizable by force_evaluation_order later. Yuk. */
10906 tree save = save_expr (force_evaluation_order (patch));
10907 tree type = TREE_TYPE (patch);
10909 patch = build (COMPOUND_EXPR, type, save, empty_stmt_node);
10910 list = tree_cons (method, patch,
10911 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl));
10913 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list;
10915 patch = build (COMPOUND_EXPR, type, patch, save);
10922 invocation_mode (tree method, int super)
10924 int access = get_access_flags_from_decl (method);
10927 return INVOKE_SUPER;
10929 if (access & ACC_STATIC)
10930 return INVOKE_STATIC;
10932 /* We have to look for a constructor before we handle nonvirtual
10933 calls; otherwise the constructor will look nonvirtual. */
10934 if (DECL_CONSTRUCTOR_P (method))
10935 return INVOKE_STATIC;
10937 if (access & ACC_FINAL || access & ACC_PRIVATE)
10938 return INVOKE_NONVIRTUAL;
10940 if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
10941 return INVOKE_NONVIRTUAL;
10943 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
10944 return INVOKE_INTERFACE;
10946 return INVOKE_VIRTUAL;
10949 /* Retrieve a refined list of matching methods. It covers the step
10950 15.11.2 (Compile-Time Step 2) */
10953 lookup_method_invoke (int lc, tree cl, tree class, tree name, tree arg_list)
10955 tree atl = end_params_node; /* Arg Type List */
10956 tree method, signature, list, node;
10957 const char *candidates; /* Used for error report */
10960 /* Fix the arguments */
10961 for (node = arg_list; node; node = TREE_CHAIN (node))
10963 tree current_arg = TREE_TYPE (TREE_VALUE (node));
10964 /* Non primitive type may have to be resolved */
10965 if (!JPRIMITIVE_TYPE_P (current_arg))
10966 resolve_and_layout (current_arg, NULL_TREE);
10968 if (TREE_CODE (current_arg) == RECORD_TYPE)
10969 current_arg = promote_type (current_arg);
10970 atl = tree_cons (NULL_TREE, current_arg, atl);
10973 /* Presto. If we're dealing with an anonymous class and a
10974 constructor call, generate the right constructor now, since we
10975 know the arguments' types. */
10977 if (lc && ANONYMOUS_CLASS_P (class))
10979 tree saved_current_class;
10980 tree mdecl = craft_constructor (TYPE_NAME (class), atl);
10981 saved_current_class = current_class;
10982 current_class = class;
10983 fix_constructors (mdecl);
10984 current_class = saved_current_class;
10987 /* Find all candidates and then refine the list, searching for the
10988 most specific method. */
10989 list = find_applicable_accessible_methods_list (lc, class, name, atl);
10990 list = find_most_specific_methods_list (list);
10991 if (list && !TREE_CHAIN (list))
10992 return TREE_VALUE (list);
10994 /* Issue an error. List candidates if any. Candidates are listed
10995 only if accessible (non accessible methods may end-up here for
10996 the sake of a better error report). */
11001 obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
11002 for (current = list; current; current = TREE_CHAIN (current))
11004 tree cm = TREE_VALUE (current);
11005 char string [4096];
11006 if (!cm || not_accessible_p (class, cm, NULL_TREE, 0))
11009 (string, " `%s' in `%s'%s",
11010 get_printable_method_name (cm),
11011 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
11012 (TREE_CHAIN (current) ? "\n" : ""));
11013 obstack_grow (&temporary_obstack, string, strlen (string));
11015 obstack_1grow (&temporary_obstack, '\0');
11016 candidates = obstack_finish (&temporary_obstack);
11018 /* Issue the error message */
11019 method = make_node (FUNCTION_TYPE);
11020 TYPE_ARG_TYPES (method) = atl;
11021 signature = build_java_argument_signature (method);
11022 dup = xstrdup (lang_printable_name (class, 0));
11023 parse_error_context (cl, "Can't find %s `%s(%s)' in type `%s'%s",
11024 (lc ? "constructor" : "method"),
11025 (lc ? dup : IDENTIFIER_POINTER (name)),
11026 IDENTIFIER_POINTER (signature), dup,
11027 (candidates ? candidates : ""));
11032 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
11033 when we're looking for a constructor. */
11036 find_applicable_accessible_methods_list (int lc, tree class, tree name,
11039 static htab_t searched_classes;
11040 static int search_not_done = 0;
11041 tree list = NULL_TREE, all_list = NULL_TREE;
11043 /* Check the hash table to determine if this class has been searched
11045 if (searched_classes)
11047 if (htab_find (searched_classes, class) != NULL)
11052 searched_classes = htab_create (10, htab_hash_pointer,
11053 htab_eq_pointer, NULL);
11057 *htab_find_slot (searched_classes, class, INSERT) = class;
11059 if (!CLASS_LOADED_P (class) && !CLASS_FROM_SOURCE_P (class))
11061 load_class (class, 1);
11062 safe_layout_class (class);
11065 /* Search interfaces */
11066 if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL
11067 && CLASS_INTERFACE (TYPE_NAME (class)))
11070 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
11071 search_applicable_methods_list (lc, TYPE_METHODS (class),
11072 name, arglist, &list, &all_list);
11073 n = TREE_VEC_LENGTH (basetype_vec);
11074 for (i = 1; i < n; i++)
11076 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11079 rlist = find_applicable_accessible_methods_list (lc, t, name,
11081 list = chainon (rlist, list);
11084 /* Search classes */
11087 search_applicable_methods_list (lc, TYPE_METHODS (class),
11088 name, arglist, &list, &all_list);
11090 /* When looking finit$, class$ or instinit$, we turn LC to 1 so
11091 that we only search in class. Note that we should have found
11092 something at this point. */
11093 if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name))
11100 /* We must search all interfaces of this class */
11103 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
11104 int n = TREE_VEC_LENGTH (basetype_vec), i;
11105 for (i = 1; i < n; i++)
11107 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11108 if (t != object_type_node)
11111 = find_applicable_accessible_methods_list (lc, t,
11113 list = chainon (rlist, list);
11118 /* Search superclass */
11119 if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
11122 class = CLASSTYPE_SUPER (class);
11123 rlist = find_applicable_accessible_methods_list (lc, class,
11125 list = chainon (rlist, list);
11131 /* We're done. Reset the searched classes list and finally search
11132 java.lang.Object if it wasn't searched already. */
11133 if (!search_not_done)
11136 && TYPE_METHODS (object_type_node)
11137 && htab_find (searched_classes, object_type_node) == NULL)
11139 search_applicable_methods_list (lc,
11140 TYPE_METHODS (object_type_node),
11141 name, arglist, &list, &all_list);
11143 htab_delete (searched_classes);
11144 searched_classes = NULL;
11147 /* Either return the list obtained or all selected (but
11148 inaccessible) methods for better error report. */
11149 return (!list ? all_list : list);
11152 /* Effectively search for the appropriate method in method */
11155 search_applicable_methods_list (int lc, tree method, tree name, tree arglist,
11156 tree *list, tree *all_list)
11158 for (; method; method = TREE_CHAIN (method))
11160 /* When dealing with constructor, stop here, otherwise search
11162 if (lc && !DECL_CONSTRUCTOR_P (method))
11164 else if (!lc && (DECL_CONSTRUCTOR_P (method)
11165 || (DECL_NAME (method) != name)))
11168 if (argument_types_convertible (method, arglist))
11170 /* Retain accessible methods only */
11171 if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
11172 method, NULL_TREE, 0))
11173 *list = tree_cons (NULL_TREE, method, *list);
11175 /* Also retain all selected method here */
11176 *all_list = tree_cons (NULL_TREE, method, *list);
11181 /* 15.11.2.2 Choose the Most Specific Method */
11184 find_most_specific_methods_list (tree list)
11187 int abstract, candidates;
11188 tree current, new_list = NULL_TREE;
11189 for (current = list; current; current = TREE_CHAIN (current))
11192 DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
11194 for (method = list; method; method = TREE_CHAIN (method))
11196 tree method_v, current_v;
11197 /* Don't test a method against itself */
11198 if (method == current)
11201 method_v = TREE_VALUE (method);
11202 current_v = TREE_VALUE (current);
11204 /* Compare arguments and location where methods where declared */
11205 if (argument_types_convertible (method_v, current_v))
11207 if (valid_method_invocation_conversion_p
11208 (DECL_CONTEXT (method_v), DECL_CONTEXT (current_v))
11209 || (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v))
11210 && enclosing_context_p (DECL_CONTEXT (method_v),
11211 DECL_CONTEXT (current_v))))
11213 int v = (DECL_SPECIFIC_COUNT (current_v) +=
11214 (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v)) ? 2 : 1));
11215 max = (v > max ? v : max);
11221 /* Review the list and select the maximally specific methods */
11222 for (current = list, abstract = -1, candidates = -1;
11223 current; current = TREE_CHAIN (current))
11224 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11226 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11227 abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0);
11231 /* If we have several and they're all abstract, just pick the
11233 if (candidates > 0 && candidates == abstract)
11235 /* FIXME: merge the throws clauses. There is no convenient way
11236 to do this in gcj right now, since ideally we'd like to
11237 introduce a new METHOD_DECL here, but that is really not
11239 new_list = nreverse (new_list);
11240 TREE_CHAIN (new_list) = NULL_TREE;
11244 /* We have several (we couldn't find a most specific), all but one
11245 are abstract, we pick the only non abstract one. */
11246 if (candidates > 0 && (candidates == abstract+1))
11248 for (current = new_list; current; current = TREE_CHAIN (current))
11249 if (!METHOD_ABSTRACT (TREE_VALUE (current)))
11251 TREE_CHAIN (current) = NULL_TREE;
11252 new_list = current;
11256 /* If we can't find one, lower expectations and try to gather multiple
11257 maximally specific methods */
11258 while (!new_list && max)
11262 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11263 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11270 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
11271 converted by method invocation conversion (5.3) to the type of the
11272 corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
11273 to change less often than M1. */
11275 static GTY(()) tree m2_arg_value;
11276 static GTY(()) tree m2_arg_cache;
11279 argument_types_convertible (tree m1, tree m2_or_arglist)
11281 tree m1_arg, m2_arg;
11283 SKIP_THIS_AND_ARTIFICIAL_PARMS (m1_arg, m1)
11285 if (m2_arg_value == m2_or_arglist)
11286 m2_arg = m2_arg_cache;
11289 /* M2_OR_ARGLIST can be a function DECL or a raw list of
11291 if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
11293 m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
11294 if (!METHOD_STATIC (m2_or_arglist))
11295 m2_arg = TREE_CHAIN (m2_arg);
11298 m2_arg = m2_or_arglist;
11300 m2_arg_value = m2_or_arglist;
11301 m2_arg_cache = m2_arg;
11304 while (m1_arg != end_params_node && m2_arg != end_params_node)
11306 resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
11307 if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
11308 TREE_VALUE (m2_arg)))
11310 m1_arg = TREE_CHAIN (m1_arg);
11311 m2_arg = TREE_CHAIN (m2_arg);
11313 return m1_arg == end_params_node && m2_arg == end_params_node;
11316 /* Qualification routines */
11318 /* Given a name x.y.z, look up x locally. If it's found, save the
11319 decl. If it's not found, mark the name as RESOLVE_PACKAGE_NAME_P,
11320 so that we later try and load the appropriate classes. */
11322 qualify_ambiguous_name (tree id)
11326 /* We inspect the first item of the qualification list. As a sanity
11327 check, make sure that it is an identfier node. */
11328 tree qual = EXPR_WFL_QUALIFICATION (id);
11329 tree qual_wfl = QUAL_WFL (qual);
11331 if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
11334 name = EXPR_WFL_NODE (qual_wfl);
11336 /* If we don't have an identifier, or we have a 'this' or 'super',
11337 then field access processing is all we need : there is nothing
11339 if (!name || TREE_CODE (name) != IDENTIFIER_NODE ||
11340 name == this_identifier_node ||
11341 name == super_identifier_node)
11344 /* If name appears within the scope of a local variable declaration
11345 or parameter declaration, or is a field within an enclosing
11346 class, then it is an expression name. Save the decl and let
11347 resolve_field_access do it's work. */
11348 if ((decl = IDENTIFIER_LOCAL_VALUE (name)) ||
11349 (decl = lookup_field_wrapper (current_class, name)))
11351 QUAL_RESOLUTION (qual) = decl;
11355 /* If name is a known class name (either declared or imported), mark
11356 us as a type name. */
11357 if ((decl = resolve_and_layout (name, NULL_TREE)))
11359 RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
11360 QUAL_RESOLUTION (qual) = decl;
11363 /* Check here that NAME isn't declared by more than one
11364 type-import-on-demand declaration of the compilation unit
11365 containing NAME. FIXME */
11367 /* We couldn't find a declaration for the name. Assume for now that
11368 we have a qualified class name that needs to be loaded from an
11369 external class file. */
11371 RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
11373 /* Propagate the qualification across other components of the
11375 for (qual = TREE_CHAIN (qual); qual;
11376 qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
11378 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11379 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
11382 /* Store the global qualification for the ambiguous part of ID back
11384 if (RESOLVE_TYPE_NAME_P (qual_wfl))
11385 RESOLVE_TYPE_NAME_P (id) = 1;
11386 else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11387 RESOLVE_PACKAGE_NAME_P (id) = 1;
11391 breakdown_qualified (tree *left, tree *right, tree source)
11394 int l = IDENTIFIER_LENGTH (source);
11396 base = alloca (l + 1);
11397 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
11399 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
11401 while (*p != '.' && p != base)
11404 /* We didn't find a '.'. Return an error. */
11410 *right = get_identifier (p+1);
11411 *left = get_identifier (base);
11416 /* Return TRUE if two classes are from the same package. */
11419 in_same_package (tree name1, tree name2)
11425 if (TREE_CODE (name1) == TYPE_DECL)
11426 name1 = DECL_NAME (name1);
11427 if (TREE_CODE (name2) == TYPE_DECL)
11428 name2 = DECL_NAME (name2);
11430 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
11431 /* One in empty package. */
11434 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
11435 /* Both in empty package. */
11438 breakdown_qualified (&pkg1, &tmp, name1);
11439 breakdown_qualified (&pkg2, &tmp, name2);
11441 return (pkg1 == pkg2);
11444 /* Patch tree nodes in a function body. When a BLOCK is found, push
11445 local variable decls if present.
11446 Same as java_complete_lhs, but does resolve static finals to values. */
11449 java_complete_tree (tree node)
11451 node = java_complete_lhs (node);
11452 if (JDECL_P (node) && CLASS_FINAL_VARIABLE_P (node)
11453 && DECL_INITIAL (node) != NULL_TREE
11454 && !flag_emit_xref)
11456 tree value = fold_constant_for_init (node, node);
11457 if (value != NULL_TREE)
11464 java_stabilize_reference (tree node)
11466 if (TREE_CODE (node) == COMPOUND_EXPR)
11468 tree op0 = TREE_OPERAND (node, 0);
11469 tree op1 = TREE_OPERAND (node, 1);
11470 TREE_OPERAND (node, 0) = save_expr (op0);
11471 TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
11474 return stabilize_reference (node);
11477 /* Patch tree nodes in a function body. When a BLOCK is found, push
11478 local variable decls if present.
11479 Same as java_complete_tree, but does not resolve static finals to values. */
11482 java_complete_lhs (tree node)
11484 tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
11487 /* CONVERT_EXPR always has its type set, even though it needs to be
11489 if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
11492 /* The switch block implements cases processing container nodes
11493 first. Contained nodes are always written back. Leaves come
11494 next and return a value. */
11495 switch (TREE_CODE (node))
11499 /* 1- Block section.
11500 Set the local values on decl names so we can identify them
11501 faster when they're referenced. At that stage, identifiers
11502 are legal so we don't check for declaration errors. */
11503 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11505 DECL_CONTEXT (cn) = current_function_decl;
11506 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
11508 if (BLOCK_EXPR_BODY (node) == NULL_TREE)
11509 CAN_COMPLETE_NORMALLY (node) = 1;
11512 tree stmt = BLOCK_EXPR_BODY (node);
11514 int error_seen = 0;
11515 if (TREE_CODE (stmt) == COMPOUND_EXPR)
11517 /* Re-order from (((A; B); C); ...; Z) to
11518 (A; (B; (C ; (...; Z)))).
11519 This makes it easier to scan the statements left-to-right
11520 without using recursion (which might overflow the stack
11521 if the block has many statements. */
11524 tree left = TREE_OPERAND (stmt, 0);
11525 if (TREE_CODE (left) != COMPOUND_EXPR)
11527 TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
11528 TREE_OPERAND (left, 1) = stmt;
11531 BLOCK_EXPR_BODY (node) = stmt;
11534 /* Now do the actual complete, without deep recursion for
11536 ptr = &BLOCK_EXPR_BODY (node);
11537 while (TREE_CODE (*ptr) == COMPOUND_EXPR
11538 && TREE_OPERAND (*ptr, 1) != empty_stmt_node)
11540 tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
11541 tree *next = &TREE_OPERAND (*ptr, 1);
11542 TREE_OPERAND (*ptr, 0) = cur;
11543 if (cur == empty_stmt_node)
11545 /* Optimization; makes it easier to detect empty bodies.
11546 Most useful for <clinit> with all-constant initializer. */
11550 if (TREE_CODE (cur) == ERROR_MARK)
11552 else if (! CAN_COMPLETE_NORMALLY (cur))
11557 if (TREE_CODE (wfl_op2) == BLOCK)
11558 wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
11559 else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
11560 wfl_op2 = TREE_OPERAND (wfl_op2, 0);
11564 if (TREE_CODE (wfl_op2) != CASE_EXPR
11565 && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
11566 unreachable_stmt_error (*ptr);
11568 if (TREE_TYPE (*ptr) == NULL_TREE)
11569 TREE_TYPE (*ptr) = void_type_node;
11572 *ptr = java_complete_tree (*ptr);
11574 if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
11575 return error_mark_node;
11576 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
11578 /* Turn local bindings to null */
11579 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11580 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
11582 TREE_TYPE (node) = void_type_node;
11585 /* 2- They are expressions but ultimately deal with statements */
11588 wfl_op1 = TREE_OPERAND (node, 0);
11589 COMPLETE_CHECK_OP_0 (node);
11590 /* 14.19 A throw statement cannot complete normally. */
11591 CAN_COMPLETE_NORMALLY (node) = 0;
11592 return patch_throw_statement (node, wfl_op1);
11594 case SYNCHRONIZED_EXPR:
11595 wfl_op1 = TREE_OPERAND (node, 0);
11596 return patch_synchronized_statement (node, wfl_op1);
11599 return patch_try_statement (node);
11601 case TRY_FINALLY_EXPR:
11602 COMPLETE_CHECK_OP_0 (node);
11603 COMPLETE_CHECK_OP_1 (node);
11604 /* Reduce try/finally nodes with an empty try block. */
11605 if (TREE_OPERAND (node, 0) == empty_stmt_node
11606 || BLOCK_EMPTY_P (TREE_OPERAND (node, 0)))
11607 return TREE_OPERAND (node, 1);
11608 /* Likewise for an empty finally block. */
11609 if (TREE_OPERAND (node, 1) == empty_stmt_node
11610 || BLOCK_EMPTY_P (TREE_OPERAND (node, 1)))
11611 return TREE_OPERAND (node, 0);
11612 CAN_COMPLETE_NORMALLY (node)
11613 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11614 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11615 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
11618 case LABELED_BLOCK_EXPR:
11619 PUSH_LABELED_BLOCK (node);
11620 if (LABELED_BLOCK_BODY (node))
11621 COMPLETE_CHECK_OP_1 (node);
11622 TREE_TYPE (node) = void_type_node;
11623 POP_LABELED_BLOCK ();
11625 if (LABELED_BLOCK_BODY (node) == empty_stmt_node)
11627 LABELED_BLOCK_BODY (node) = NULL_TREE;
11628 CAN_COMPLETE_NORMALLY (node) = 1;
11630 else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
11631 CAN_COMPLETE_NORMALLY (node) = 1;
11634 case EXIT_BLOCK_EXPR:
11635 /* We don't complete operand 1, because it's the return value of
11636 the EXIT_BLOCK_EXPR which doesn't exist it Java */
11637 return patch_bc_statement (node);
11640 cn = java_complete_tree (TREE_OPERAND (node, 0));
11641 if (cn == error_mark_node)
11644 /* First, the case expression must be constant. Values of final
11645 fields are accepted. */
11647 if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
11648 && JDECL_P (TREE_OPERAND (cn, 1))
11649 && FIELD_FINAL (TREE_OPERAND (cn, 1))
11650 && DECL_INITIAL (TREE_OPERAND (cn, 1)))
11652 cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
11653 TREE_OPERAND (cn, 1));
11655 /* Accept final locals too. */
11656 else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn))
11657 cn = fold_constant_for_init (DECL_INITIAL (cn), cn);
11659 if (!TREE_CONSTANT (cn) && !flag_emit_xref)
11661 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11662 parse_error_context (node, "Constant expression required");
11663 return error_mark_node;
11666 nn = ctxp->current_loop;
11668 /* It must be assignable to the type of the switch expression. */
11669 if (!try_builtin_assignconv (NULL_TREE,
11670 TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
11672 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11673 parse_error_context
11675 "Incompatible type for case. Can't convert `%s' to `int'",
11676 lang_printable_name (TREE_TYPE (cn), 0));
11677 return error_mark_node;
11680 cn = fold (convert (int_type_node, cn));
11681 TREE_CONSTANT_OVERFLOW (cn) = 0;
11682 CAN_COMPLETE_NORMALLY (cn) = 1;
11684 /* Save the label on a list so that we can later check for
11686 case_label_list = tree_cons (node, cn, case_label_list);
11688 /* Multiple instance of a case label bearing the same value is
11689 checked later. The case expression is all right so far. */
11690 if (TREE_CODE (cn) == VAR_DECL)
11691 cn = DECL_INITIAL (cn);
11692 TREE_OPERAND (node, 0) = cn;
11693 TREE_TYPE (node) = void_type_node;
11694 CAN_COMPLETE_NORMALLY (node) = 1;
11695 TREE_SIDE_EFFECTS (node) = 1;
11699 nn = ctxp->current_loop;
11700 /* Only one default label is allowed per switch statement */
11701 if (SWITCH_HAS_DEFAULT (nn))
11703 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11704 parse_error_context (wfl_operator,
11705 "Duplicate case label: `default'");
11706 return error_mark_node;
11709 SWITCH_HAS_DEFAULT (nn) = 1;
11710 TREE_TYPE (node) = void_type_node;
11711 TREE_SIDE_EFFECTS (node) = 1;
11712 CAN_COMPLETE_NORMALLY (node) = 1;
11718 /* Check whether the loop was enclosed in a labeled
11719 statement. If not, create one, insert the loop in it and
11721 nn = patch_loop_statement (node);
11723 /* Anyways, walk the body of the loop */
11724 if (TREE_CODE (node) == LOOP_EXPR)
11725 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11726 /* Switch statement: walk the switch expression and the cases */
11728 node = patch_switch_statement (node);
11730 if (node == error_mark_node || TREE_OPERAND (node, 0) == error_mark_node)
11731 nn = error_mark_node;
11734 TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
11735 /* If we returned something different, that's because we
11736 inserted a label. Pop the label too. */
11739 if (CAN_COMPLETE_NORMALLY (node))
11740 CAN_COMPLETE_NORMALLY (nn) = 1;
11741 POP_LABELED_BLOCK ();
11748 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11749 return patch_exit_expr (node);
11753 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11754 if (TREE_OPERAND (node, 0) == error_mark_node)
11755 return error_mark_node;
11756 /* then-else branches */
11757 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11758 if (TREE_OPERAND (node, 1) == error_mark_node)
11759 return error_mark_node;
11760 TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
11761 if (TREE_OPERAND (node, 2) == error_mark_node)
11762 return error_mark_node;
11763 return patch_if_else_statement (node);
11766 case CONDITIONAL_EXPR:
11768 wfl_op1 = TREE_OPERAND (node, 0);
11769 COMPLETE_CHECK_OP_0 (node);
11770 wfl_op2 = TREE_OPERAND (node, 1);
11771 COMPLETE_CHECK_OP_1 (node);
11772 wfl_op3 = TREE_OPERAND (node, 2);
11773 COMPLETE_CHECK_OP_2 (node);
11774 return patch_conditional_expr (node, wfl_op1, wfl_op2);
11776 /* 3- Expression section */
11777 case COMPOUND_EXPR:
11778 wfl_op2 = TREE_OPERAND (node, 1);
11779 TREE_OPERAND (node, 0) = nn =
11780 java_complete_tree (TREE_OPERAND (node, 0));
11781 if (wfl_op2 == empty_stmt_node)
11782 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
11785 if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
11787 /* An unreachable condition in a do-while statement
11788 is *not* (technically) an unreachable statement. */
11790 if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
11791 nn = EXPR_WFL_NODE (nn);
11792 /* NN can be NULL_TREE exactly when UPDATE is, in
11793 finish_for_loop. */
11794 if (nn != NULL_TREE && TREE_CODE (nn) != EXIT_EXPR)
11796 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
11797 if (SUPPRESS_UNREACHABLE_ERROR (nn))
11799 /* Perhaps this warning should have an
11800 associated flag. The code being compiled is
11801 pedantically correct, but useless. */
11802 parse_warning_context (wfl_operator,
11803 "Unreachable statement");
11806 parse_error_context (wfl_operator,
11807 "Unreachable statement");
11810 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11811 if (TREE_OPERAND (node, 1) == error_mark_node)
11812 return error_mark_node;
11813 /* Even though we might allow the case where the first
11814 operand doesn't return normally, we still should compute
11815 CAN_COMPLETE_NORMALLY correctly. */
11816 CAN_COMPLETE_NORMALLY (node)
11817 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11818 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11820 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
11824 /* CAN_COMPLETE_NORMALLY (node) = 0; */
11825 return patch_return (node);
11827 case EXPR_WITH_FILE_LOCATION:
11828 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
11829 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
11832 node = resolve_expression_name (node, NULL);
11833 if (node == error_mark_node)
11835 /* Keep line number information somewhere were it doesn't
11836 disrupt the completion process. */
11837 if (flag_emit_xref && TREE_CODE (node) != CALL_EXPR)
11839 EXPR_WFL_NODE (wfl) = TREE_OPERAND (node, 1);
11840 TREE_OPERAND (node, 1) = wfl;
11842 CAN_COMPLETE_NORMALLY (node) = 1;
11847 int save_lineno = input_line;
11848 input_line = EXPR_WFL_LINENO (node);
11849 body = java_complete_tree (EXPR_WFL_NODE (node));
11850 input_line = save_lineno;
11851 EXPR_WFL_NODE (node) = body;
11852 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
11853 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
11854 if (body == empty_stmt_node || TREE_CONSTANT (body))
11856 /* Makes it easier to constant fold, detect empty bodies. */
11859 if (body == error_mark_node)
11861 /* Its important for the evaluation of assignment that
11862 this mark on the TREE_TYPE is propagated. */
11863 TREE_TYPE (node) = error_mark_node;
11864 return error_mark_node;
11867 TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
11872 case NEW_ARRAY_EXPR:
11873 /* Patch all the dimensions */
11875 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
11877 int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
11878 tree dim = convert (int_type_node,
11879 java_complete_tree (TREE_VALUE (cn)));
11880 if (dim == error_mark_node)
11887 TREE_VALUE (cn) = dim;
11888 /* Setup the location of the current dimension, for
11889 later error report. */
11890 TREE_PURPOSE (cn) =
11891 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
11892 EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
11895 /* They complete the array creation expression, if no errors
11897 CAN_COMPLETE_NORMALLY (node) = 1;
11898 return (flag ? error_mark_node
11899 : force_evaluation_order (patch_newarray (node)));
11901 case NEW_ANONYMOUS_ARRAY_EXPR:
11902 /* Create the array type if necessary. */
11903 if (ANONYMOUS_ARRAY_DIMS_SIG (node))
11905 tree type = ANONYMOUS_ARRAY_BASE_TYPE (node);
11906 if (!(type = resolve_type_during_patch (type)))
11907 return error_mark_node;
11908 type = build_array_from_name (type, NULL_TREE,
11909 ANONYMOUS_ARRAY_DIMS_SIG (node), NULL);
11910 ANONYMOUS_ARRAY_BASE_TYPE (node) = build_pointer_type (type);
11912 node = patch_new_array_init (ANONYMOUS_ARRAY_BASE_TYPE (node),
11913 ANONYMOUS_ARRAY_INITIALIZER (node));
11914 if (node == error_mark_node)
11915 return error_mark_node;
11916 CAN_COMPLETE_NORMALLY (node) = 1;
11919 case NEW_CLASS_EXPR:
11921 /* Complete function's argument(s) first */
11922 if (complete_function_arguments (node))
11923 return error_mark_node;
11926 tree decl, wfl = TREE_OPERAND (node, 0);
11927 int in_this = CALL_THIS_CONSTRUCTOR_P (node);
11928 int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
11929 super_identifier_node);
11931 int location = EXPR_WFL_LINECOL (node);
11933 node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
11934 from_super, 0, &decl);
11935 if (node == error_mark_node)
11936 return error_mark_node;
11938 if (TREE_CODE (node) == CALL_EXPR
11939 && TREE_OPERAND (node, 1) != NULL_TREE)
11940 arguments = TREE_VALUE (TREE_OPERAND (node, 1));
11942 arguments = NULL_TREE;
11943 check_thrown_exceptions (location, decl, arguments);
11944 /* If we call this(...), register signature and positions */
11946 DECL_CONSTRUCTOR_CALLS (current_function_decl) =
11947 tree_cons (wfl, decl,
11948 DECL_CONSTRUCTOR_CALLS (current_function_decl));
11949 CAN_COMPLETE_NORMALLY (node) = 1;
11950 return force_evaluation_order (node);
11954 /* Save potential wfls */
11955 wfl_op1 = TREE_OPERAND (node, 0);
11956 TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
11958 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
11959 && TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
11960 && DECL_INITIAL (nn) != NULL_TREE)
11964 value = fold_constant_for_init (nn, nn);
11966 /* When we have a primitype type, or a string and we're not
11967 emitting a class file, we actually don't want to generate
11968 anything for the assignment. */
11969 if (value != NULL_TREE &&
11970 (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) ||
11971 (TREE_TYPE (value) == string_ptr_type_node &&
11972 ! flag_emit_class_files)))
11974 /* Prepare node for patch_assignment */
11975 TREE_OPERAND (node, 1) = value;
11976 /* Call patch assignment to verify the assignment */
11977 if (patch_assignment (node, wfl_op1) == error_mark_node)
11978 return error_mark_node;
11979 /* Set DECL_INITIAL properly (a conversion might have
11980 been decided by patch_assignment) and return the
11981 empty statement. */
11984 tree patched = patch_string (TREE_OPERAND (node, 1));
11986 DECL_INITIAL (nn) = patched;
11988 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
11989 DECL_FIELD_FINAL_IUD (nn) = 1;
11990 return empty_stmt_node;
11993 if (! flag_emit_class_files)
11994 DECL_INITIAL (nn) = NULL_TREE;
11996 wfl_op2 = TREE_OPERAND (node, 1);
11998 if (TREE_OPERAND (node, 0) == error_mark_node)
11999 return error_mark_node;
12001 flag = COMPOUND_ASSIGN_P (wfl_op2);
12004 /* This might break when accessing outer field from inner
12005 class. TESTME, FIXME */
12006 tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
12008 /* Hand stabilize the lhs on both places */
12009 TREE_OPERAND (node, 0) = lvalue;
12010 TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
12011 (flag_emit_class_files ? lvalue : save_expr (lvalue));
12013 /* 15.25.2.a: Left hand is not an array access. FIXME */
12014 /* Now complete the RHS. We write it back later on. */
12015 nn = java_complete_tree (TREE_OPERAND (node, 1));
12017 if ((cn = patch_string (nn)))
12020 /* The last part of the rewrite for E1 op= E2 is to have
12021 E1 = (T)(E1 op E2), with T being the type of E1. */
12022 nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
12023 TREE_TYPE (lvalue), nn));
12025 /* If the assignment is compound and has reference type,
12026 then ensure the LHS has type String and nothing else. */
12027 if (JREFERENCE_TYPE_P (TREE_TYPE (lvalue))
12028 && ! JSTRING_TYPE_P (TREE_TYPE (lvalue)))
12029 parse_error_context (wfl_op2,
12030 "Incompatible type for `+='. Can't convert `%s' to `java.lang.String'",
12031 lang_printable_name (TREE_TYPE (lvalue), 0));
12033 /* 15.25.2.b: Left hand is an array access. FIXME */
12036 /* If we're about to patch a NEW_ARRAY_INIT, we call a special
12037 function to complete this RHS. Note that a NEW_ARRAY_INIT
12038 might have been already fully expanded if created as a result
12039 of processing an anonymous array initializer. We avoid doing
12040 the operation twice by testing whether the node already bears
12042 else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT && !TREE_TYPE (wfl_op2))
12043 nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
12044 TREE_OPERAND (node, 1));
12045 /* Otherwise we simply complete the RHS */
12047 nn = java_complete_tree (TREE_OPERAND (node, 1));
12049 if (nn == error_mark_node)
12050 return error_mark_node;
12052 /* Write back the RHS as we evaluated it. */
12053 TREE_OPERAND (node, 1) = nn;
12055 /* In case we're handling = with a String as a RHS, we need to
12056 produce a String out of the RHS (it might still be a
12057 STRING_CST or a StringBuffer at this stage */
12058 if ((nn = patch_string (TREE_OPERAND (node, 1))))
12059 TREE_OPERAND (node, 1) = nn;
12061 if ((nn = outer_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
12062 TREE_OPERAND (node, 1))))
12064 /* We return error_mark_node if outer_field_access_fix
12065 detects we write into a final. */
12066 if (nn == error_mark_node)
12067 return error_mark_node;
12072 node = patch_assignment (node, wfl_op1);
12073 if (node == error_mark_node)
12074 return error_mark_node;
12075 /* Reorganize the tree if necessary. */
12076 if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
12077 || JSTRING_P (TREE_TYPE (node))))
12078 node = java_refold (node);
12081 /* Seek to set DECL_INITIAL to a proper value, since it might have
12082 undergone a conversion in patch_assignment. We do that only when
12083 it's necessary to have DECL_INITIAL properly set. */
12084 nn = TREE_OPERAND (node, 0);
12085 if (TREE_CODE (nn) == VAR_DECL
12086 && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn))
12087 && FIELD_STATIC (nn) && FIELD_FINAL (nn)
12088 && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn))
12089 || TREE_TYPE (nn) == string_ptr_type_node))
12090 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
12092 CAN_COMPLETE_NORMALLY (node) = 1;
12104 case TRUNC_MOD_EXPR:
12105 case TRUNC_DIV_EXPR:
12107 case TRUTH_ANDIF_EXPR:
12108 case TRUTH_ORIF_EXPR:
12115 /* Operands 0 and 1 are WFL in certain cases only. patch_binop
12116 knows how to handle those cases. */
12117 wfl_op1 = TREE_OPERAND (node, 0);
12118 wfl_op2 = TREE_OPERAND (node, 1);
12120 CAN_COMPLETE_NORMALLY (node) = 1;
12121 /* Don't complete string nodes if dealing with the PLUS operand. */
12122 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
12124 nn = java_complete_tree (wfl_op1);
12125 if (nn == error_mark_node)
12126 return error_mark_node;
12128 TREE_OPERAND (node, 0) = nn;
12130 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
12132 nn = java_complete_tree (wfl_op2);
12133 if (nn == error_mark_node)
12134 return error_mark_node;
12136 TREE_OPERAND (node, 1) = nn;
12138 return patch_binop (node, wfl_op1, wfl_op2);
12140 case INSTANCEOF_EXPR:
12141 wfl_op1 = TREE_OPERAND (node, 0);
12142 COMPLETE_CHECK_OP_0 (node);
12143 if (flag_emit_xref)
12145 TREE_TYPE (node) = boolean_type_node;
12148 return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
12150 case UNARY_PLUS_EXPR:
12152 case TRUTH_NOT_EXPR:
12154 case PREDECREMENT_EXPR:
12155 case PREINCREMENT_EXPR:
12156 case POSTDECREMENT_EXPR:
12157 case POSTINCREMENT_EXPR:
12159 /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
12160 how to handle those cases. */
12161 wfl_op1 = TREE_OPERAND (node, 0);
12162 CAN_COMPLETE_NORMALLY (node) = 1;
12163 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12164 if (TREE_OPERAND (node, 0) == error_mark_node)
12165 return error_mark_node;
12166 node = patch_unaryop (node, wfl_op1);
12167 CAN_COMPLETE_NORMALLY (node) = 1;
12171 /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
12172 how to handle those cases. */
12173 wfl_op1 = TREE_OPERAND (node, 0);
12174 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12175 if (TREE_OPERAND (node, 0) == error_mark_node)
12176 return error_mark_node;
12177 if (!flag_emit_class_files && !flag_emit_xref)
12178 TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
12179 /* The same applies to wfl_op2 */
12180 wfl_op2 = TREE_OPERAND (node, 1);
12181 TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
12182 if (TREE_OPERAND (node, 1) == error_mark_node)
12183 return error_mark_node;
12184 if (!flag_emit_class_files && !flag_emit_xref)
12185 TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
12186 return patch_array_ref (node);
12191 case COMPONENT_REF:
12192 /* The first step in the re-write of qualified name handling. FIXME.
12193 So far, this is only to support PRIMTYPE.class -> PRIMCLASS.TYPE. */
12194 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
12195 if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
12197 tree name = TREE_OPERAND (node, 1);
12198 tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
12199 if (field == NULL_TREE)
12201 error ("missing static field `%s'", IDENTIFIER_POINTER (name));
12202 return error_mark_node;
12204 if (! FIELD_STATIC (field))
12206 error ("not a static field `%s'", IDENTIFIER_POINTER (name));
12207 return error_mark_node;
12216 /* Can't use THIS in a static environment */
12219 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12220 parse_error_context (wfl_operator,
12221 "Keyword `this' used outside allowed context");
12222 TREE_TYPE (node) = error_mark_node;
12223 return error_mark_node;
12225 if (ctxp->explicit_constructor_p)
12227 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12228 parse_error_context
12229 (wfl_operator, "Can't reference `this' or `super' before the superclass constructor has been called");
12230 TREE_TYPE (node) = error_mark_node;
12231 return error_mark_node;
12233 return current_this;
12235 case CLASS_LITERAL:
12236 CAN_COMPLETE_NORMALLY (node) = 1;
12237 node = patch_incomplete_class_ref (node);
12238 if (node == error_mark_node)
12239 return error_mark_node;
12243 CAN_COMPLETE_NORMALLY (node) = 1;
12244 /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
12245 and it's time to turn it into the appropriate String object */
12246 if ((nn = patch_string (node)))
12249 internal_error ("No case for %s", tree_code_name [TREE_CODE (node)]);
12254 /* Complete function call's argument. Return a nonzero value is an
12255 error was found. */
12258 complete_function_arguments (tree node)
12263 ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12264 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
12266 tree wfl = TREE_VALUE (cn), parm, temp;
12267 parm = java_complete_tree (wfl);
12269 if (parm == error_mark_node)
12274 /* If have a string literal that we haven't transformed yet or a
12275 crafted string buffer, as a result of use of the the String
12276 `+' operator. Build `parm.toString()' and expand it. */
12277 if ((temp = patch_string (parm)))
12280 TREE_VALUE (cn) = parm;
12282 ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12286 /* Sometimes (for loops and variable initialized during their
12287 declaration), we want to wrap a statement around a WFL and turn it
12291 build_debugable_stmt (int location, tree stmt)
12293 if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
12295 stmt = build_expr_wfl (stmt, input_filename, 0, 0);
12296 EXPR_WFL_LINECOL (stmt) = location;
12298 JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
12303 build_expr_block (tree body, tree decls)
12306 tree node = make_node (BLOCK);
12307 BLOCK_EXPR_DECLS (node) = decls;
12308 BLOCK_EXPR_BODY (node) = body;
12310 TREE_TYPE (node) = TREE_TYPE (body);
12311 TREE_SIDE_EFFECTS (node) = 1;
12315 /* Create a new function block and link it appropriately to current
12316 function block chain */
12321 tree b = build_expr_block (NULL_TREE, NULL_TREE);
12323 /* Link block B supercontext to the previous block. The current
12324 function DECL is used as supercontext when enter_a_block is called
12325 for the first time for a given function. The current function body
12326 (DECL_FUNCTION_BODY) is set to be block B. */
12328 tree fndecl = current_function_decl;
12331 BLOCK_SUPERCONTEXT (b) = current_static_block;
12332 current_static_block = b;
12335 else if (!DECL_FUNCTION_BODY (fndecl))
12337 BLOCK_SUPERCONTEXT (b) = fndecl;
12338 DECL_FUNCTION_BODY (fndecl) = b;
12342 BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
12343 DECL_FUNCTION_BODY (fndecl) = b;
12348 /* Exit a block by changing the current function body
12349 (DECL_FUNCTION_BODY) to the current block super context, only if
12350 the block being exited isn't the method's top level one. */
12356 if (current_function_decl)
12358 b = DECL_FUNCTION_BODY (current_function_decl);
12359 if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
12360 DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
12364 b = current_static_block;
12366 if (BLOCK_SUPERCONTEXT (b))
12367 current_static_block = BLOCK_SUPERCONTEXT (b);
12372 /* Lookup for NAME in the nested function's blocks, all the way up to
12373 the current toplevel one. It complies with Java's local variable
12377 lookup_name_in_blocks (tree name)
12379 tree b = GET_CURRENT_BLOCK (current_function_decl);
12381 while (b != current_function_decl)
12385 /* Paranoid sanity check. To be removed */
12386 if (TREE_CODE (b) != BLOCK)
12389 for (current = BLOCK_EXPR_DECLS (b); current;
12390 current = TREE_CHAIN (current))
12391 if (DECL_NAME (current) == name)
12393 b = BLOCK_SUPERCONTEXT (b);
12399 maybe_absorb_scoping_blocks (void)
12401 while (BLOCK_IS_IMPLICIT (GET_CURRENT_BLOCK (current_function_decl)))
12403 tree b = exit_block ();
12404 java_method_add_stmt (current_function_decl, b);
12405 SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", input_line));
12410 /* This section of the source is reserved to build_* functions that
12411 are building incomplete tree nodes and the patch_* functions that
12412 are completing them. */
12414 /* Wrap a non WFL node around a WFL. */
12417 build_wfl_wrap (tree node, int location)
12419 tree wfl, node_to_insert = node;
12421 /* We want to process THIS . xxx symbolically, to keep it consistent
12422 with the way we're processing SUPER. A THIS from a primary as a
12423 different form than a SUPER. Turn THIS into something symbolic */
12424 if (TREE_CODE (node) == THIS_EXPR)
12425 node_to_insert = wfl = build_wfl_node (this_identifier_node);
12427 wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
12429 EXPR_WFL_LINECOL (wfl) = location;
12430 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
12434 /* Build a super() constructor invocation. Returns empty_stmt_node if
12435 we're currently dealing with the class java.lang.Object. */
12438 build_super_invocation (tree mdecl)
12440 if (DECL_CONTEXT (mdecl) == object_type_node)
12441 return empty_stmt_node;
12444 tree super_wfl = build_wfl_node (super_identifier_node);
12445 tree a = NULL_TREE, t;
12446 /* If we're dealing with an anonymous class, pass the arguments
12447 of the crafted constructor along. */
12448 if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
12450 SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
12451 for (; t != end_params_node; t = TREE_CHAIN (t))
12452 a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
12454 return build_method_invocation (super_wfl, a);
12458 /* Build a SUPER/THIS qualified method invocation. */
12461 build_this_super_qualified_invocation (int use_this, tree name, tree args,
12462 int lloc, int rloc)
12466 build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
12467 EXPR_WFL_LINECOL (wfl) = lloc;
12468 invok = build_method_invocation (name, args);
12469 return make_qualified_primary (wfl, invok, rloc);
12472 /* Build an incomplete CALL_EXPR node. */
12475 build_method_invocation (tree name, tree args)
12477 tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
12478 TREE_SIDE_EFFECTS (call) = 1;
12479 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12483 /* Build an incomplete new xxx(...) node. */
12486 build_new_invocation (tree name, tree args)
12488 tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
12489 TREE_SIDE_EFFECTS (call) = 1;
12490 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12494 /* Build an incomplete assignment expression. */
12497 build_assignment (int op, int op_location, tree lhs, tree rhs)
12500 /* Build the corresponding binop if we deal with a Compound
12501 Assignment operator. Mark the binop sub-tree as part of a
12502 Compound Assignment expression */
12503 if (op != ASSIGN_TK)
12505 rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
12506 COMPOUND_ASSIGN_P (rhs) = 1;
12508 assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
12509 TREE_SIDE_EFFECTS (assignment) = 1;
12510 EXPR_WFL_LINECOL (assignment) = op_location;
12514 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12515 the buffer. This is used only for string conversion. */
12517 string_convert_int_cst (tree node)
12519 /* Long.MIN_VALUE is -9223372036854775808, 20 characters. */
12520 static char buffer[21];
12522 unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
12523 unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
12524 char *p = buffer + sizeof (buffer);
12527 unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
12528 << (HOST_BITS_PER_WIDE_INT - 1));
12532 /* If negative, note the fact and negate the value. */
12542 /* Divide by 10 until there are no bits left. */
12545 unsigned HOST_WIDE_INT acc = 0;
12546 unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
12549 /* Use long division to compute the result and the remainder. */
12550 for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
12552 /* Shift a bit into accumulator. */
12557 /* Shift the value. */
12563 /* Shift the correct bit into the result. */
12565 if ((outlo & hibit))
12575 /* '0' == 060 in Java, but might not be here (think EBCDIC). */
12576 *--p = '\060' + acc;
12584 *--p = '\055'; /* '-' == 055 in Java, but might not be here. */
12589 /* Print an INTEGER_CST node in a static buffer, and return the
12590 buffer. This is used only for error handling. */
12592 print_int_node (tree node)
12594 static char buffer [80];
12595 if (TREE_CONSTANT_OVERFLOW (node))
12596 sprintf (buffer, "<overflow>");
12598 if (TREE_INT_CST_HIGH (node) == 0)
12599 sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
12600 TREE_INT_CST_LOW (node));
12601 else if (TREE_INT_CST_HIGH (node) == -1
12602 && TREE_INT_CST_LOW (node) != 0)
12603 sprintf (buffer, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
12604 -TREE_INT_CST_LOW (node));
12606 sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
12607 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
12613 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12616 /* 15.25 Assignment operators. */
12619 patch_assignment (tree node, tree wfl_op1)
12621 tree rhs = TREE_OPERAND (node, 1);
12622 tree lvalue = TREE_OPERAND (node, 0), llvalue;
12623 tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
12624 int error_found = 0;
12625 int lvalue_from_array = 0;
12628 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12630 /* Lhs can be a named variable */
12631 if (JDECL_P (lvalue))
12633 lhs_type = TREE_TYPE (lvalue);
12635 /* Or Lhs can be an array access. */
12636 else if (TREE_CODE (lvalue) == ARRAY_REF)
12638 lhs_type = TREE_TYPE (lvalue);
12639 lvalue_from_array = 1;
12641 /* Or a field access */
12642 else if (TREE_CODE (lvalue) == COMPONENT_REF)
12643 lhs_type = TREE_TYPE (lvalue);
12644 /* Or a function return slot */
12645 else if (TREE_CODE (lvalue) == RESULT_DECL)
12647 /* If the return type is an integral type, then we create the
12648 RESULT_DECL with a promoted type, but we need to do these
12649 checks against the unpromoted type to ensure type safety. So
12650 here we look at the real type, not the type of the decl we
12652 lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
12655 /* Otherwise, we might want to try to write into an optimized static
12656 final, this is an of a different nature, reported further on. */
12657 else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
12658 && resolve_expression_name (wfl_op1, &llvalue))
12660 lhs_type = TREE_TYPE (lvalue);
12664 parse_error_context (wfl_op1, "Invalid left hand side of assignment");
12668 rhs_type = TREE_TYPE (rhs);
12670 /* 5.1 Try the assignment conversion for builtin type. */
12671 new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
12673 /* 5.2 If it failed, try a reference conversion */
12675 new_rhs = try_reference_assignconv (lhs_type, rhs);
12677 /* 15.25.2 If we have a compound assignment, convert RHS into the
12679 else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12680 new_rhs = convert (lhs_type, rhs);
12682 /* Explicit cast required. This is an error */
12685 char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
12686 char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
12688 char operation [32]; /* Max size known */
12690 /* If the assignment is part of a declaration, we use the WFL of
12691 the declared variable to point out the error and call it a
12692 declaration problem. If the assignment is a genuine =
12693 operator, we call is a operator `=' problem, otherwise we
12694 call it an assignment problem. In both of these last cases,
12695 we use the WFL of the operator to indicate the error. */
12697 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
12700 strcpy (operation, "declaration");
12704 wfl = wfl_operator;
12705 if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12706 strcpy (operation, "assignment");
12707 else if (is_return)
12708 strcpy (operation, "`return'");
12710 strcpy (operation, "`='");
12713 if (!valid_cast_to_p (rhs_type, lhs_type))
12714 parse_error_context
12715 (wfl, "Incompatible type for %s. Can't convert `%s' to `%s'",
12716 operation, t1, t2);
12718 parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert `%s' to `%s'",
12719 operation, t1, t2);
12720 free (t1); free (t2);
12725 return error_mark_node;
12727 /* If we're processing a `return' statement, promote the actual type
12728 to the promoted type. */
12730 new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
12732 /* 10.10: Array Store Exception runtime check */
12733 if (!flag_emit_class_files
12735 && lvalue_from_array
12736 && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
12738 tree array, store_check, base, index_expr;
12740 /* Save RHS so that it doesn't get re-evaluated by the store check. */
12741 new_rhs = save_expr (new_rhs);
12743 /* Get the INDIRECT_REF. */
12744 array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
12745 /* Get the array pointer expr. */
12746 array = TREE_OPERAND (array, 0);
12747 store_check = build_java_arraystore_check (array, new_rhs);
12749 index_expr = TREE_OPERAND (lvalue, 1);
12751 if (TREE_CODE (index_expr) == COMPOUND_EXPR)
12753 /* A COMPOUND_EXPR here is a bounds check. The bounds check must
12754 happen before the store check, so prepare to insert the store
12755 check within the second operand of the existing COMPOUND_EXPR. */
12761 index_expr = TREE_OPERAND (base, 1);
12762 TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr),
12763 store_check, index_expr);
12766 /* Final locals can be used as case values in switch
12767 statement. Prepare them for this eventuality. */
12768 if (TREE_CODE (lvalue) == VAR_DECL
12769 && DECL_FINAL (lvalue)
12770 && TREE_CONSTANT (new_rhs)
12771 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
12772 && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
12775 TREE_CONSTANT (lvalue) = 1;
12776 DECL_INITIAL (lvalue) = new_rhs;
12779 /* Copy the rhs if it's a reference. */
12780 if (! flag_check_references && ! flag_emit_class_files && optimize > 0)
12782 switch (TREE_CODE (new_rhs))
12786 case COMPONENT_REF:
12787 /* Transform a = foo.bar
12788 into a = { int tmp; tmp = foo.bar; tmp; ).
12789 We need to ensure that if a read from memory fails
12790 because of a NullPointerException, a destination variable
12791 will remain unchanged. An explicit temporary does what
12794 If flag_check_references is set, this is unnecessary
12795 because we'll check each reference before doing any
12796 reads. If optimize is not set the result will never be
12797 written to a stack slot that contains the LHS. */
12799 tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"),
12800 TREE_TYPE (new_rhs));
12801 tree block = make_node (BLOCK);
12803 = build (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
12804 DECL_CONTEXT (tmp) = current_function_decl;
12805 TREE_TYPE (block) = TREE_TYPE (new_rhs);
12806 BLOCK_VARS (block) = tmp;
12807 BLOCK_EXPR_BODY (block)
12808 = build (COMPOUND_EXPR, TREE_TYPE (new_rhs), assignment, tmp);
12809 TREE_SIDE_EFFECTS (block) = 1;
12818 TREE_OPERAND (node, 0) = lvalue;
12819 TREE_OPERAND (node, 1) = new_rhs;
12820 TREE_TYPE (node) = lhs_type;
12824 /* Check that type SOURCE can be cast into type DEST. If the cast
12825 can't occur at all, return NULL; otherwise, return a possibly
12829 try_reference_assignconv (tree lhs_type, tree rhs)
12831 tree new_rhs = NULL_TREE;
12832 tree rhs_type = TREE_TYPE (rhs);
12834 if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
12836 /* `null' may be assigned to any reference type */
12837 if (rhs == null_pointer_node)
12838 new_rhs = null_pointer_node;
12839 /* Try the reference assignment conversion */
12840 else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
12842 /* This is a magic assignment that we process differently */
12843 else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
12849 /* Check that RHS can be converted into LHS_TYPE by the assignment
12850 conversion (5.2), for the cases of RHS being a builtin type. Return
12851 NULL_TREE if the conversion fails or if because RHS isn't of a
12852 builtin type. Return a converted RHS if the conversion is possible. */
12855 try_builtin_assignconv (tree wfl_op1, tree lhs_type, tree rhs)
12857 tree new_rhs = NULL_TREE;
12858 tree rhs_type = TREE_TYPE (rhs);
12860 /* Handle boolean specially. */
12861 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12862 || TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12864 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12865 && TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12869 /* 5.1.1 Try Identity Conversion,
12870 5.1.2 Try Widening Primitive Conversion */
12871 else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
12872 new_rhs = convert (lhs_type, rhs);
12874 /* Try a narrowing primitive conversion (5.1.3):
12875 - expression is a constant expression of type byte, short, char,
12877 - variable is byte, short or char AND
12878 - The value of the expression is representable in the type of the
12880 else if ((rhs_type == byte_type_node || rhs_type == short_type_node
12881 || rhs_type == char_type_node || rhs_type == int_type_node)
12882 && TREE_CONSTANT (rhs)
12883 && (lhs_type == byte_type_node || lhs_type == char_type_node
12884 || lhs_type == short_type_node))
12886 if (int_fits_type_p (rhs, lhs_type))
12887 new_rhs = convert (lhs_type, rhs);
12888 else if (wfl_op1) /* Might be called with a NULL */
12889 parse_warning_context
12890 (wfl_op1, "Constant expression `%s' too wide for narrowing primitive conversion to `%s'",
12891 print_int_node (rhs), lang_printable_name (lhs_type, 0));
12892 /* Reported a warning that will turn into an error further
12893 down, so we don't return */
12899 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
12900 conversion (5.1.1) or widening primitive conversion (5.1.2). Return
12901 0 is the conversion test fails. This implements parts the method
12902 invocation conversion (5.3). */
12905 valid_builtin_assignconv_identity_widening_p (tree lhs_type, tree rhs_type)
12907 /* 5.1.1: This is the identity conversion part. */
12908 if (lhs_type == rhs_type)
12911 /* Reject non primitive types and boolean conversions. */
12912 if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
12915 /* 5.1.2: widening primitive conversion. byte, even if it's smaller
12916 than a char can't be converted into a char. Short can't too, but
12917 the < test below takes care of that */
12918 if (lhs_type == char_type_node && rhs_type == byte_type_node)
12921 /* Accept all promoted type here. Note, we can't use <= in the test
12922 below, because we still need to bounce out assignments of short
12923 to char and the likes */
12924 if (lhs_type == int_type_node
12925 && (rhs_type == promoted_byte_type_node
12926 || rhs_type == promoted_short_type_node
12927 || rhs_type == promoted_char_type_node
12928 || rhs_type == promoted_boolean_type_node))
12931 /* From here, an integral is widened if its precision is smaller
12932 than the precision of the LHS or if the LHS is a floating point
12933 type, or the RHS is a float and the RHS a double. */
12934 if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
12935 && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
12936 || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
12937 || (rhs_type == float_type_node && lhs_type == double_type_node))
12943 /* Check that something of SOURCE type can be assigned or cast to
12944 something of DEST type at runtime. Return 1 if the operation is
12945 valid, 0 otherwise. If CAST is set to 1, we're treating the case
12946 were SOURCE is cast into DEST, which borrows a lot of the
12947 assignment check. */
12950 valid_ref_assignconv_cast_p (tree source, tree dest, int cast)
12952 /* SOURCE or DEST might be null if not from a declared entity. */
12953 if (!source || !dest)
12955 if (JNULLP_TYPE_P (source))
12957 if (TREE_CODE (source) == POINTER_TYPE)
12958 source = TREE_TYPE (source);
12959 if (TREE_CODE (dest) == POINTER_TYPE)
12960 dest = TREE_TYPE (dest);
12962 /* If source and dest are being compiled from bytecode, they may need to
12964 if (CLASS_P (source) && !CLASS_LOADED_P (source))
12966 load_class (source, 1);
12967 safe_layout_class (source);
12969 if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
12971 load_class (dest, 1);
12972 safe_layout_class (dest);
12975 /* Case where SOURCE is a class type */
12976 if (TYPE_CLASS_P (source))
12978 if (TYPE_CLASS_P (dest))
12979 return (source == dest
12980 || inherits_from_p (source, dest)
12981 || (cast && inherits_from_p (dest, source)));
12982 if (TYPE_INTERFACE_P (dest))
12984 /* If doing a cast and SOURCE is final, the operation is
12985 always correct a compile time (because even if SOURCE
12986 does not implement DEST, a subclass of SOURCE might). */
12987 if (cast && !CLASS_FINAL (TYPE_NAME (source)))
12989 /* Otherwise, SOURCE must implement DEST */
12990 return interface_of_p (dest, source);
12992 /* DEST is an array, cast permitted if SOURCE is of Object type */
12993 return (cast && source == object_type_node ? 1 : 0);
12995 if (TYPE_INTERFACE_P (source))
12997 if (TYPE_CLASS_P (dest))
12999 /* If not casting, DEST must be the Object type */
13001 return dest == object_type_node;
13002 /* We're doing a cast. The cast is always valid is class
13003 DEST is not final, otherwise, DEST must implement SOURCE */
13004 else if (!CLASS_FINAL (TYPE_NAME (dest)))
13007 return interface_of_p (source, dest);
13009 if (TYPE_INTERFACE_P (dest))
13011 /* If doing a cast, then if SOURCE and DEST contain method
13012 with the same signature but different return type, then
13013 this is a (compile time) error */
13016 tree method_source, method_dest;
13020 for (method_source = TYPE_METHODS (source); method_source;
13021 method_source = TREE_CHAIN (method_source))
13024 build_java_argument_signature (TREE_TYPE (method_source));
13025 source_type = TREE_TYPE (TREE_TYPE (method_source));
13026 source_name = DECL_NAME (method_source);
13027 for (method_dest = TYPE_METHODS (dest);
13028 method_dest; method_dest = TREE_CHAIN (method_dest))
13030 build_java_argument_signature (TREE_TYPE (method_dest))
13031 && source_name == DECL_NAME (method_dest)
13032 && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
13038 return source == dest || interface_of_p (dest, source);
13044 && (DECL_NAME (TYPE_NAME (source))
13045 == java_lang_cloneable_identifier_node
13046 || (DECL_NAME (TYPE_NAME (source))
13047 == java_io_serializable_identifier_node)));
13050 if (TYPE_ARRAY_P (source))
13052 if (TYPE_CLASS_P (dest))
13053 return dest == object_type_node;
13054 /* Can't cast an array to an interface unless the interface is
13055 java.lang.Cloneable or java.io.Serializable. */
13056 if (TYPE_INTERFACE_P (dest))
13057 return (DECL_NAME (TYPE_NAME (dest))
13058 == java_lang_cloneable_identifier_node
13059 || (DECL_NAME (TYPE_NAME (dest))
13060 == java_io_serializable_identifier_node));
13063 tree source_element_type = TYPE_ARRAY_ELEMENT (source);
13064 tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
13066 /* In case of severe errors, they turn out null */
13067 if (!dest_element_type || !source_element_type)
13069 if (source_element_type == dest_element_type)
13071 return valid_ref_assignconv_cast_p (source_element_type,
13072 dest_element_type, cast);
13080 valid_cast_to_p (tree source, tree dest)
13082 if (TREE_CODE (source) == POINTER_TYPE)
13083 source = TREE_TYPE (source);
13084 if (TREE_CODE (dest) == POINTER_TYPE)
13085 dest = TREE_TYPE (dest);
13087 if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
13088 return valid_ref_assignconv_cast_p (source, dest, 1);
13090 else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
13093 else if (TREE_CODE (source) == BOOLEAN_TYPE
13094 && TREE_CODE (dest) == BOOLEAN_TYPE)
13101 do_unary_numeric_promotion (tree arg)
13103 tree type = TREE_TYPE (arg);
13104 if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
13105 || TREE_CODE (type) == CHAR_TYPE)
13106 arg = convert (int_type_node, arg);
13110 /* Return a nonzero value if SOURCE can be converted into DEST using
13111 the method invocation conversion rule (5.3). */
13113 valid_method_invocation_conversion_p (tree dest, tree source)
13115 return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
13116 && valid_builtin_assignconv_identity_widening_p (dest, source))
13117 || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
13118 && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
13119 && valid_ref_assignconv_cast_p (source, dest, 0)));
13122 /* Build an incomplete binop expression. */
13125 build_binop (enum tree_code op, int op_location, tree op1, tree op2)
13127 tree binop = build (op, NULL_TREE, op1, op2);
13128 TREE_SIDE_EFFECTS (binop) = 1;
13129 /* Store the location of the operator, for better error report. The
13130 string of the operator will be rebuild based on the OP value. */
13131 EXPR_WFL_LINECOL (binop) = op_location;
13135 /* Build the string of the operator retained by NODE. If NODE is part
13136 of a compound expression, add an '=' at the end of the string. This
13137 function is called when an error needs to be reported on an
13138 operator. The string is returned as a pointer to a static character
13142 operator_string (tree node)
13144 #define BUILD_OPERATOR_STRING(S) \
13146 sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
13150 static char buffer [10];
13151 switch (TREE_CODE (node))
13153 case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
13154 case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
13155 case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
13156 case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13157 case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
13158 case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
13159 case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
13160 case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
13161 case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
13162 case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
13163 case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
13164 case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
13165 case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
13166 case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
13167 case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
13168 case GT_EXPR: BUILD_OPERATOR_STRING (">");
13169 case GE_EXPR: BUILD_OPERATOR_STRING (">=");
13170 case LT_EXPR: BUILD_OPERATOR_STRING ("<");
13171 case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
13172 case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13173 case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
13174 case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
13175 case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
13176 case PREINCREMENT_EXPR: /* Fall through */
13177 case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
13178 case PREDECREMENT_EXPR: /* Fall through */
13179 case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
13181 internal_error ("unregistered operator %s",
13182 tree_code_name [TREE_CODE (node)]);
13185 #undef BUILD_OPERATOR_STRING
13188 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2. */
13191 java_decl_equiv (tree var_acc1, tree var_acc2)
13193 if (JDECL_P (var_acc1))
13194 return (var_acc1 == var_acc2);
13196 return (TREE_CODE (var_acc1) == COMPONENT_REF
13197 && TREE_CODE (var_acc2) == COMPONENT_REF
13198 && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
13199 == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
13200 && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
13203 /* Return a nonzero value if CODE is one of the operators that can be
13204 used in conjunction with the `=' operator in a compound assignment. */
13207 binop_compound_p (enum tree_code code)
13210 for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
13211 if (binop_lookup [i] == code)
13214 return i < BINOP_COMPOUND_CANDIDATES;
13217 /* Reorganize after a fold to get SAVE_EXPR to generate what we want. */
13220 java_refold (tree t)
13222 tree c, b, ns, decl;
13224 if (TREE_CODE (t) != MODIFY_EXPR)
13227 c = TREE_OPERAND (t, 1);
13228 if (! (c && TREE_CODE (c) == COMPOUND_EXPR
13229 && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
13230 && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
13233 /* Now the left branch of the binary operator. */
13234 b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
13235 if (! (b && TREE_CODE (b) == NOP_EXPR
13236 && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
13239 ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
13240 if (! (ns && TREE_CODE (ns) == NOP_EXPR
13241 && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
13244 decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
13245 if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
13246 /* It's got to be the an equivalent decl */
13247 && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
13249 /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13250 TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
13251 /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13252 TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
13253 /* Change the right part of the BINOP_EXPR */
13254 TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
13260 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13261 errors but we modify NODE so that it contains the type computed
13262 according to the expression, when it's fixed. Otherwise, we write
13263 error_mark_node as the type. It allows us to further the analysis
13264 of remaining nodes and detects more errors in certain cases. */
13267 patch_binop (tree node, tree wfl_op1, tree wfl_op2)
13269 tree op1 = TREE_OPERAND (node, 0);
13270 tree op2 = TREE_OPERAND (node, 1);
13271 tree op1_type = TREE_TYPE (op1);
13272 tree op2_type = TREE_TYPE (op2);
13273 tree prom_type = NULL_TREE, cn;
13274 enum tree_code code = TREE_CODE (node);
13276 /* If 1, tell the routine that we have to return error_mark_node
13277 after checking for the initialization of the RHS */
13278 int error_found = 0;
13280 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13282 /* If either op<n>_type are NULL, this might be early signs of an
13283 error situation, unless it's too early to tell (in case we're
13284 handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13285 correctly so the error can be later on reported accurately. */
13286 if (! (code == PLUS_EXPR || code == NE_EXPR
13287 || code == EQ_EXPR || code == INSTANCEOF_EXPR))
13292 n = java_complete_tree (op1);
13293 op1_type = TREE_TYPE (n);
13297 n = java_complete_tree (op2);
13298 op2_type = TREE_TYPE (n);
13304 /* 15.16 Multiplicative operators */
13305 case MULT_EXPR: /* 15.16.1 Multiplication Operator * */
13306 case RDIV_EXPR: /* 15.16.2 Division Operator / */
13307 case TRUNC_DIV_EXPR: /* 15.16.2 Integral type Division Operator / */
13308 case TRUNC_MOD_EXPR: /* 15.16.3 Remainder operator % */
13309 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13311 if (!JNUMERIC_TYPE_P (op1_type))
13312 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13313 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13314 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13315 TREE_TYPE (node) = error_mark_node;
13319 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13321 /* Detect integral division by zero */
13322 if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
13323 && TREE_CODE (prom_type) == INTEGER_TYPE
13324 && (op2 == integer_zero_node || op2 == long_zero_node ||
13325 (TREE_CODE (op2) == INTEGER_CST &&
13326 ! TREE_INT_CST_LOW (op2) && ! TREE_INT_CST_HIGH (op2))))
13328 parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown");
13329 TREE_CONSTANT (node) = 0;
13332 /* Change the division operator if necessary */
13333 if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
13334 TREE_SET_CODE (node, TRUNC_DIV_EXPR);
13336 /* Before divisions as is disappear, try to simplify and bail if
13337 applicable, otherwise we won't perform even simple
13338 simplifications like (1-1)/3. We can't do that with floating
13339 point number, folds can't handle them at this stage. */
13340 if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
13341 && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
13343 TREE_TYPE (node) = prom_type;
13344 node = fold (node);
13345 if (TREE_CODE (node) != code)
13349 if (TREE_CODE (prom_type) == INTEGER_TYPE
13350 && flag_use_divide_subroutine
13351 && ! flag_emit_class_files
13352 && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
13353 return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
13355 /* This one is more complicated. FLOATs are processed by a
13356 function call to soft_fmod. Duplicate the value of the
13357 COMPOUND_ASSIGN_P flag. */
13358 if (code == TRUNC_MOD_EXPR)
13360 tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
13361 COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
13362 TREE_SIDE_EFFECTS (mod)
13363 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13368 /* 15.17 Additive Operators */
13369 case PLUS_EXPR: /* 15.17.1 String Concatenation Operator + */
13371 /* Operation is valid if either one argument is a string
13372 constant, a String object or a StringBuffer crafted for the
13373 purpose of the a previous usage of the String concatenation
13376 if (TREE_CODE (op1) == STRING_CST
13377 || TREE_CODE (op2) == STRING_CST
13378 || JSTRING_TYPE_P (op1_type)
13379 || JSTRING_TYPE_P (op2_type)
13380 || IS_CRAFTED_STRING_BUFFER_P (op1)
13381 || IS_CRAFTED_STRING_BUFFER_P (op2))
13382 return build_string_concatenation (op1, op2);
13384 case MINUS_EXPR: /* 15.17.2 Additive Operators (+ and -) for
13386 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13388 if (!JNUMERIC_TYPE_P (op1_type))
13389 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13390 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13391 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13392 TREE_TYPE (node) = error_mark_node;
13396 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13399 /* 15.18 Shift Operators */
13403 if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
13405 if (!JINTEGRAL_TYPE_P (op1_type))
13406 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13409 if (JNUMERIC_TYPE_P (op2_type))
13410 parse_error_context (wfl_operator,
13411 "Incompatible type for `%s'. Explicit cast needed to convert shift distance from `%s' to integral",
13412 operator_string (node),
13413 lang_printable_name (op2_type, 0));
13415 parse_error_context (wfl_operator,
13416 "Incompatible type for `%s'. Can't convert shift distance from `%s' to integral",
13417 operator_string (node),
13418 lang_printable_name (op2_type, 0));
13420 TREE_TYPE (node) = error_mark_node;
13425 /* Unary numeric promotion (5.6.1) is performed on each operand
13427 op1 = do_unary_numeric_promotion (op1);
13428 op2 = do_unary_numeric_promotion (op2);
13430 /* If the right hand side is of type `long', first cast it to
13432 if (TREE_TYPE (op2) == long_type_node)
13433 op2 = build1 (CONVERT_EXPR, int_type_node, op2);
13435 /* The type of the shift expression is the type of the promoted
13436 type of the left-hand operand */
13437 prom_type = TREE_TYPE (op1);
13439 /* Shift int only up to 0x1f and long up to 0x3f */
13440 if (prom_type == int_type_node)
13441 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13442 build_int_2 (0x1f, 0)));
13444 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13445 build_int_2 (0x3f, 0)));
13447 /* The >>> operator is a >> operating on unsigned quantities */
13448 if (code == URSHIFT_EXPR && ! flag_emit_class_files)
13451 tree utype = java_unsigned_type (prom_type);
13452 op1 = convert (utype, op1);
13453 TREE_SET_CODE (node, RSHIFT_EXPR);
13454 TREE_OPERAND (node, 0) = op1;
13455 TREE_OPERAND (node, 1) = op2;
13456 TREE_TYPE (node) = utype;
13457 to_return = convert (prom_type, node);
13458 /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13459 COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
13460 TREE_SIDE_EFFECTS (to_return)
13461 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13466 /* 15.19.1 Type Comparison Operator instanceof */
13467 case INSTANCEOF_EXPR:
13469 TREE_TYPE (node) = boolean_type_node;
13471 /* OP1_TYPE might be NULL when OP1 is a string constant. */
13472 if ((cn = patch_string (op1)))
13475 op1_type = TREE_TYPE (op1);
13477 if (op1_type == NULL_TREE)
13480 if (!(op2_type = resolve_type_during_patch (op2)))
13481 return error_mark_node;
13483 /* The first operand must be a reference type or the null type */
13484 if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
13485 error_found = 1; /* Error reported further below */
13487 /* The second operand must be a reference type */
13488 if (!JREFERENCE_TYPE_P (op2_type))
13490 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
13491 parse_error_context
13492 (wfl_operator, "Invalid argument `%s' for `instanceof'",
13493 lang_printable_name (op2_type, 0));
13497 if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
13499 /* If the first operand is null, the result is always false */
13500 if (op1 == null_pointer_node)
13501 return boolean_false_node;
13502 else if (flag_emit_class_files)
13504 TREE_OPERAND (node, 1) = op2_type;
13505 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
13508 /* Otherwise we have to invoke instance of to figure it out */
13510 return build_instanceof (op1, op2_type);
13512 /* There is no way the expression operand can be an instance of
13513 the type operand. This is a compile time error. */
13516 char *t1 = xstrdup (lang_printable_name (op1_type, 0));
13517 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
13518 parse_error_context
13519 (wfl_operator, "Impossible for `%s' to be instance of `%s'",
13520 t1, lang_printable_name (op2_type, 0));
13527 /* 15.21 Bitwise and Logical Operators */
13531 if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
13532 /* Binary numeric promotion is performed on both operand and the
13533 expression retain that type */
13534 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13536 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
13537 && TREE_CODE (op1_type) == BOOLEAN_TYPE)
13538 /* The type of the bitwise operator expression is BOOLEAN */
13539 prom_type = boolean_type_node;
13542 if (!JINTEGRAL_TYPE_P (op1_type))
13543 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13544 if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
13545 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
13546 TREE_TYPE (node) = error_mark_node;
13548 /* Insert a break here if adding thing before the switch's
13549 break for this case */
13553 /* 15.22 Conditional-And Operator */
13554 case TRUTH_ANDIF_EXPR:
13555 /* 15.23 Conditional-Or Operator */
13556 case TRUTH_ORIF_EXPR:
13557 /* Operands must be of BOOLEAN type */
13558 if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
13559 TREE_CODE (op2_type) != BOOLEAN_TYPE)
13561 if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
13562 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
13563 if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
13564 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
13565 TREE_TYPE (node) = boolean_type_node;
13569 else if (integer_zerop (op1))
13571 return code == TRUTH_ANDIF_EXPR ? op1 : op2;
13573 else if (integer_onep (op1))
13575 return code == TRUTH_ANDIF_EXPR ? op2 : op1;
13577 /* The type of the conditional operators is BOOLEAN */
13578 prom_type = boolean_type_node;
13581 /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13586 /* The type of each of the operands must be a primitive numeric
13588 if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
13590 if (!JNUMERIC_TYPE_P (op1_type))
13591 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13592 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13593 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13594 TREE_TYPE (node) = boolean_type_node;
13598 /* Binary numeric promotion is performed on the operands */
13599 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13600 /* The type of the relation expression is always BOOLEAN */
13601 prom_type = boolean_type_node;
13604 /* 15.20 Equality Operator */
13607 /* It's time for us to patch the strings. */
13608 if ((cn = patch_string (op1)))
13611 op1_type = TREE_TYPE (op1);
13613 if ((cn = patch_string (op2)))
13616 op2_type = TREE_TYPE (op2);
13619 /* 15.20.1 Numerical Equality Operators == and != */
13620 /* Binary numeric promotion is performed on the operands */
13621 if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
13622 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13624 /* 15.20.2 Boolean Equality Operators == and != */
13625 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
13626 TREE_CODE (op2_type) == BOOLEAN_TYPE)
13627 ; /* Nothing to do here */
13629 /* 15.20.3 Reference Equality Operators == and != */
13630 /* Types have to be either references or the null type. If
13631 they're references, it must be possible to convert either
13632 type to the other by casting conversion. */
13633 else if (op1 == null_pointer_node || op2 == null_pointer_node
13634 || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
13635 && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
13636 || valid_ref_assignconv_cast_p (op2_type,
13638 ; /* Nothing to do here */
13640 /* Else we have an error figure what can't be converted into
13641 what and report the error */
13645 t1 = xstrdup (lang_printable_name (op1_type, 0));
13646 parse_error_context
13648 "Incompatible type for `%s'. Can't convert `%s' to `%s'",
13649 operator_string (node), t1,
13650 lang_printable_name (op2_type, 0));
13652 TREE_TYPE (node) = boolean_type_node;
13656 prom_type = boolean_type_node;
13663 return error_mark_node;
13665 TREE_OPERAND (node, 0) = op1;
13666 TREE_OPERAND (node, 1) = op2;
13667 TREE_TYPE (node) = prom_type;
13668 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13670 if (flag_emit_xref)
13673 /* fold does not respect side-effect order as required for Java but not C.
13674 * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13677 if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
13678 : ! TREE_SIDE_EFFECTS (node))
13679 node = fold (node);
13683 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13684 zero value, the value of CSTE comes after the valude of STRING */
13687 do_merge_string_cste (tree cste, const char *string, int string_len, int after)
13689 const char *old = TREE_STRING_POINTER (cste);
13690 int old_len = TREE_STRING_LENGTH (cste);
13691 int len = old_len + string_len;
13692 char *new = alloca (len+1);
13696 memcpy (new, string, string_len);
13697 memcpy (&new [string_len], old, old_len);
13701 memcpy (new, old, old_len);
13702 memcpy (&new [old_len], string, string_len);
13705 return build_string (len, new);
13708 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13709 new STRING_CST on success, NULL_TREE on failure. */
13712 merge_string_cste (tree op1, tree op2, int after)
13714 /* Handle two string constants right away. */
13715 if (TREE_CODE (op2) == STRING_CST)
13716 return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
13717 TREE_STRING_LENGTH (op2), after);
13719 /* Reasonable integer constant can be treated right away. */
13720 if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
13722 static const char *const boolean_true = "true";
13723 static const char *const boolean_false = "false";
13724 static const char *const null_pointer = "null";
13726 const char *string;
13728 if (op2 == boolean_true_node)
13729 string = boolean_true;
13730 else if (op2 == boolean_false_node)
13731 string = boolean_false;
13732 else if (op2 == null_pointer_node
13733 || (integer_zerop (op2)
13734 && TREE_CODE (TREE_TYPE (op2)) == POINTER_TYPE))
13735 /* FIXME: null is not a compile-time constant, so it is only safe to
13736 merge if the overall expression is non-constant. However, this
13737 code always merges without checking the overall expression. */
13738 string = null_pointer;
13739 else if (TREE_TYPE (op2) == char_type_node)
13741 /* Convert the character into UTF-8. */
13742 unsigned int c = (unsigned int) TREE_INT_CST_LOW (op2);
13743 unsigned char *p = (unsigned char *) ch;
13744 if (0x01 <= c && c <= 0x7f)
13745 *p++ = (unsigned char) c;
13746 else if (c < 0x7ff)
13748 *p++ = (unsigned char) (c >> 6 | 0xc0);
13749 *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13753 *p++ = (unsigned char) (c >> 12 | 0xe0);
13754 *p++ = (unsigned char) (((c >> 6) & 0x3f) | 0x80);
13755 *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13762 string = string_convert_int_cst (op2);
13764 return do_merge_string_cste (op1, string, strlen (string), after);
13769 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
13770 has to be a STRING_CST and the other part must be a STRING_CST or a
13771 INTEGRAL constant. Return a new STRING_CST if the operation
13772 succeed, NULL_TREE otherwise.
13774 If the case we want to optimize for space, we might want to return
13775 NULL_TREE for each invocation of this routine. FIXME */
13778 string_constant_concatenation (tree op1, tree op2)
13780 if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
13785 string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
13786 rest = (string == op1 ? op2 : op1);
13787 invert = (string == op1 ? 0 : 1 );
13789 /* Walk REST, only if it looks reasonable */
13790 if (TREE_CODE (rest) != STRING_CST
13791 && !IS_CRAFTED_STRING_BUFFER_P (rest)
13792 && !JSTRING_TYPE_P (TREE_TYPE (rest))
13793 && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
13795 rest = java_complete_tree (rest);
13796 if (rest == error_mark_node)
13797 return error_mark_node;
13798 rest = fold (rest);
13800 return merge_string_cste (string, rest, invert);
13805 /* Implement the `+' operator. Does static optimization if possible,
13806 otherwise create (if necessary) and append elements to a
13807 StringBuffer. The StringBuffer will be carried around until it is
13808 used for a function call or an assignment. Then toString() will be
13809 called on it to turn it into a String object. */
13812 build_string_concatenation (tree op1, tree op2)
13815 int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13817 if (flag_emit_xref)
13818 return build (PLUS_EXPR, string_type_node, op1, op2);
13820 /* Try to do some static optimization */
13821 if ((result = string_constant_concatenation (op1, op2)))
13824 /* Discard empty strings on either side of the expression */
13825 if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
13830 else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
13833 /* If operands are string constant, turn then into object references */
13834 if (TREE_CODE (op1) == STRING_CST)
13835 op1 = patch_string_cst (op1);
13836 if (op2 && TREE_CODE (op2) == STRING_CST)
13837 op2 = patch_string_cst (op2);
13839 /* If either one of the constant is null and the other non null
13840 operand is a String constant, return it. */
13841 if ((TREE_CODE (op1) == STRING_CST) && !op2)
13844 /* If OP1 isn't already a StringBuffer, create and
13845 initialize a new one */
13846 if (!IS_CRAFTED_STRING_BUFFER_P (op1))
13848 /* Two solutions here:
13849 1) OP1 is a constant string reference, we call new StringBuffer(OP1)
13850 2) OP1 is something else, we call new StringBuffer().append(OP1). */
13851 if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
13852 op1 = BUILD_STRING_BUFFER (op1);
13855 tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
13856 op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
13862 /* OP1 is no longer the last node holding a crafted StringBuffer */
13863 IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
13864 /* Create a node for `{new...,xxx}.append (op2)' */
13866 op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
13869 /* Mark the last node holding a crafted StringBuffer */
13870 IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
13872 TREE_SIDE_EFFECTS (op1) = side_effects;
13876 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
13877 StringBuffer. If no string were found to be patched, return
13881 patch_string (tree node)
13883 if (node == error_mark_node)
13884 return error_mark_node;
13885 if (TREE_CODE (node) == STRING_CST)
13886 return patch_string_cst (node);
13887 else if (IS_CRAFTED_STRING_BUFFER_P (node))
13889 int saved = ctxp->explicit_constructor_p;
13890 tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
13892 /* Temporary disable forbid the use of `this'. */
13893 ctxp->explicit_constructor_p = 0;
13894 ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
13895 /* String concatenation arguments must be evaluated in order too. */
13896 ret = force_evaluation_order (ret);
13897 /* Restore it at its previous value */
13898 ctxp->explicit_constructor_p = saved;
13904 /* Build the internal representation of a string constant. */
13907 patch_string_cst (tree node)
13910 if (! flag_emit_class_files)
13912 node = get_identifier (TREE_STRING_POINTER (node));
13913 location = alloc_name_constant (CONSTANT_String, node);
13914 node = build_ref_from_constant_pool (location);
13916 TREE_TYPE (node) = string_ptr_type_node;
13917 TREE_CONSTANT (node) = 1;
13921 /* Build an incomplete unary operator expression. */
13924 build_unaryop (int op_token, int op_location, tree op1)
13930 case PLUS_TK: op = UNARY_PLUS_EXPR; break;
13931 case MINUS_TK: op = NEGATE_EXPR; break;
13932 case NEG_TK: op = TRUTH_NOT_EXPR; break;
13933 case NOT_TK: op = BIT_NOT_EXPR; break;
13937 unaryop = build1 (op, NULL_TREE, op1);
13938 TREE_SIDE_EFFECTS (unaryop) = 1;
13939 /* Store the location of the operator, for better error report. The
13940 string of the operator will be rebuild based on the OP value. */
13941 EXPR_WFL_LINECOL (unaryop) = op_location;
13945 /* Special case for the ++/-- operators, since they require an extra
13946 argument to build, which is set to NULL and patched
13947 later. IS_POST_P is 1 if the operator, 0 otherwise. */
13950 build_incdec (int op_token, int op_location, tree op1, int is_post_p)
13952 static const enum tree_code lookup [2][2] =
13954 { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
13955 { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
13957 tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
13958 NULL_TREE, op1, NULL_TREE);
13959 TREE_SIDE_EFFECTS (node) = 1;
13960 /* Store the location of the operator, for better error report. The
13961 string of the operator will be rebuild based on the OP value. */
13962 EXPR_WFL_LINECOL (node) = op_location;
13966 /* Build an incomplete cast operator, based on the use of the
13967 CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
13968 set. java_complete_tree is trained to walk a CONVERT_EXPR even
13969 though its type is already set. */
13972 build_cast (int location, tree type, tree exp)
13974 tree node = build1 (CONVERT_EXPR, type, exp);
13975 EXPR_WFL_LINECOL (node) = location;
13979 /* Build an incomplete class reference operator. */
13981 build_incomplete_class_ref (int location, tree class_name)
13983 tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
13984 tree class_decl = GET_CPC ();
13985 tree this_class = TREE_TYPE (class_decl);
13987 /* Generate the synthetic static method `class$'. (Previously we
13988 deferred this, causing different method tables to be emitted
13989 for native code and bytecode.) */
13990 if (!TYPE_DOT_CLASS (this_class)
13991 && !JPRIMITIVE_TYPE_P (class_name)
13992 && !(TREE_CODE (class_name) == VOID_TYPE))
13996 if (CLASS_INTERFACE (TYPE_NAME (this_class)))
13998 /* For interfaces, adding a static 'class$' method directly
13999 is illegal. So create an inner class to contain the new
14000 method. Empirically this matches the behavior of javac. */
14001 tree t = build_wfl_node (DECL_NAME (TYPE_NAME (object_type_node)));
14002 tree inner = create_anonymous_class (0, t);
14003 target_class = TREE_TYPE (inner);
14004 end_class_declaration (1);
14008 /* For inner classes, add a 'class$' method to their outermost
14009 context, creating it if necessary. */
14010 while (INNER_CLASS_DECL_P (class_decl))
14011 class_decl = DECL_CONTEXT (class_decl);
14012 target_class = TREE_TYPE (class_decl);
14015 if (TYPE_DOT_CLASS (target_class) == NULL_TREE)
14016 build_dot_class_method (target_class);
14018 if (this_class != target_class)
14019 TYPE_DOT_CLASS (this_class) = TYPE_DOT_CLASS (target_class);
14022 EXPR_WFL_LINECOL (node) = location;
14026 /* Complete an incomplete class reference operator. */
14028 patch_incomplete_class_ref (tree node)
14030 tree type = TREE_OPERAND (node, 0);
14033 if (!(ref_type = resolve_type_during_patch (type)))
14034 return error_mark_node;
14036 /* If we're not emitting class files and we know ref_type is a
14037 compiled class, build a direct reference. */
14038 if ((! flag_emit_class_files && is_compiled_class (ref_type))
14039 || JPRIMITIVE_TYPE_P (ref_type)
14040 || TREE_CODE (ref_type) == VOID_TYPE)
14042 tree dot = build_class_ref (ref_type);
14043 /* A class referenced by `foo.class' is initialized. */
14044 if (!flag_emit_class_files)
14045 dot = build_class_init (ref_type, dot);
14046 return java_complete_tree (dot);
14049 /* If we're emitting class files and we have to deal with non
14050 primitive types, we invoke the synthetic static method `class$'. */
14051 ref_type = build_dot_class_method_invocation (current_class, ref_type);
14052 return java_complete_tree (ref_type);
14055 /* 15.14 Unary operators. We return error_mark_node in case of error,
14056 but preserve the type of NODE if the type is fixed. */
14059 patch_unaryop (tree node, tree wfl_op)
14061 tree op = TREE_OPERAND (node, 0);
14062 tree op_type = TREE_TYPE (op);
14063 tree prom_type = NULL_TREE, value, decl;
14064 int outer_field_flag = 0;
14065 int code = TREE_CODE (node);
14066 int error_found = 0;
14068 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14072 /* 15.13.2 Postfix Increment Operator ++ */
14073 case POSTINCREMENT_EXPR:
14074 /* 15.13.3 Postfix Increment Operator -- */
14075 case POSTDECREMENT_EXPR:
14076 /* 15.14.1 Prefix Increment Operator ++ */
14077 case PREINCREMENT_EXPR:
14078 /* 15.14.2 Prefix Decrement Operator -- */
14079 case PREDECREMENT_EXPR:
14080 op = decl = strip_out_static_field_access_decl (op);
14081 outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
14082 /* We might be trying to change an outer field accessed using
14084 if (outer_field_flag)
14086 /* Retrieve the decl of the field we're trying to access. We
14087 do that by first retrieving the function we would call to
14088 access the field. It has been already verified that this
14089 field isn't final */
14090 if (flag_emit_class_files)
14091 decl = TREE_OPERAND (op, 0);
14093 decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
14094 decl = DECL_FUNCTION_ACCESS_DECL (decl);
14096 /* We really should have a JAVA_ARRAY_EXPR to avoid this */
14097 else if (!JDECL_P (decl)
14098 && TREE_CODE (decl) != COMPONENT_REF
14099 && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
14100 && TREE_CODE (decl) != INDIRECT_REF
14101 && !(TREE_CODE (decl) == COMPOUND_EXPR
14102 && TREE_OPERAND (decl, 1)
14103 && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
14105 TREE_TYPE (node) = error_mark_node;
14109 /* From now on, we know that op if a variable and that it has a
14110 valid wfl. We use wfl_op to locate errors related to the
14112 if (!JNUMERIC_TYPE_P (op_type))
14114 parse_error_context
14115 (wfl_op, "Invalid argument type `%s' to `%s'",
14116 lang_printable_name (op_type, 0), operator_string (node));
14117 TREE_TYPE (node) = error_mark_node;
14122 /* Before the addition, binary numeric promotion is performed on
14123 both operands, if really necessary */
14124 if (JINTEGRAL_TYPE_P (op_type))
14126 value = build_int_2 (1, 0);
14127 TREE_TYPE (value) = TREE_TYPE (node) = op_type;
14131 value = build_int_2 (1, 0);
14133 binary_numeric_promotion (op_type,
14134 TREE_TYPE (value), &op, &value);
14137 /* We remember we might be accessing an outer field */
14138 if (outer_field_flag)
14140 /* We re-generate an access to the field */
14141 value = build (PLUS_EXPR, TREE_TYPE (op),
14142 build_outer_field_access (wfl_op, decl), value);
14144 /* And we patch the original access$() into a write
14145 with plus_op as a rhs */
14146 return outer_field_access_fix (node, op, value);
14149 /* And write back into the node. */
14150 TREE_OPERAND (node, 0) = op;
14151 TREE_OPERAND (node, 1) = value;
14152 /* Convert the overall back into its original type, if
14153 necessary, and return */
14154 if (JINTEGRAL_TYPE_P (op_type))
14155 return fold (node);
14157 return fold (convert (op_type, node));
14161 /* 15.14.3 Unary Plus Operator + */
14162 case UNARY_PLUS_EXPR:
14163 /* 15.14.4 Unary Minus Operator - */
14165 if (!JNUMERIC_TYPE_P (op_type))
14167 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
14168 TREE_TYPE (node) = error_mark_node;
14171 /* Unary numeric promotion is performed on operand */
14174 op = do_unary_numeric_promotion (op);
14175 prom_type = TREE_TYPE (op);
14176 if (code == UNARY_PLUS_EXPR)
14181 /* 15.14.5 Bitwise Complement Operator ~ */
14183 if (!JINTEGRAL_TYPE_P (op_type))
14185 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
14186 TREE_TYPE (node) = error_mark_node;
14191 op = do_unary_numeric_promotion (op);
14192 prom_type = TREE_TYPE (op);
14196 /* 15.14.6 Logical Complement Operator ! */
14197 case TRUTH_NOT_EXPR:
14198 if (TREE_CODE (op_type) != BOOLEAN_TYPE)
14200 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
14201 /* But the type is known. We will report an error if further
14202 attempt of a assignment is made with this rhs */
14203 TREE_TYPE (node) = boolean_type_node;
14207 prom_type = boolean_type_node;
14210 /* 15.15 Cast Expression */
14212 value = patch_cast (node, wfl_operator);
14213 if (value == error_mark_node)
14215 /* If this cast is part of an assignment, we tell the code
14216 that deals with it not to complain about a mismatch,
14217 because things have been cast, anyways */
14218 TREE_TYPE (node) = error_mark_node;
14223 value = fold (value);
14224 TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
14231 return error_mark_node;
14233 /* There are cases where node has been replaced by something else
14234 and we don't end up returning here: UNARY_PLUS_EXPR,
14235 CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14236 TREE_OPERAND (node, 0) = fold (op);
14237 TREE_TYPE (node) = prom_type;
14238 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
14239 return fold (node);
14242 /* Generic type resolution that sometimes takes place during node
14243 patching. Returned the resolved type or generate an error
14244 message. Return the resolved type or NULL_TREE. */
14247 resolve_type_during_patch (tree type)
14249 if (unresolved_type_p (type, NULL))
14251 tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
14254 parse_error_context (type,
14255 "Class `%s' not found in type declaration",
14256 IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
14260 check_deprecation (type, type_decl);
14262 return TREE_TYPE (type_decl);
14267 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14268 found. Otherwise NODE or something meant to replace it is returned. */
14271 patch_cast (tree node, tree wfl_op)
14273 tree op = TREE_OPERAND (node, 0);
14274 tree cast_type = TREE_TYPE (node);
14275 tree patched, op_type;
14278 /* Some string patching might be necessary at this stage */
14279 if ((patched = patch_string (op)))
14280 TREE_OPERAND (node, 0) = op = patched;
14281 op_type = TREE_TYPE (op);
14283 /* First resolve OP_TYPE if unresolved */
14284 if (!(cast_type = resolve_type_during_patch (cast_type)))
14285 return error_mark_node;
14287 /* Check on cast that are proven correct at compile time */
14288 if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
14291 if (cast_type == op_type)
14294 /* A narrowing conversion from a floating-point number to an
14295 integral type requires special handling (5.1.3). */
14296 if (JFLOAT_TYPE_P (op_type) && JINTEGRAL_TYPE_P (cast_type))
14297 if (cast_type != long_type_node)
14298 op = convert (integer_type_node, op);
14300 /* Try widening/narrowing conversion. Potentially, things need
14301 to be worked out in gcc so we implement the extreme cases
14302 correctly. fold_convert() needs to be fixed. */
14303 return convert (cast_type, op);
14306 /* It's also valid to cast a boolean into a boolean */
14307 if (op_type == boolean_type_node && cast_type == boolean_type_node)
14310 /* null can be casted to references */
14311 if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
14312 return build_null_of_type (cast_type);
14314 /* The remaining legal casts involve conversion between reference
14315 types. Check for their compile time correctness. */
14316 if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
14317 && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
14319 TREE_TYPE (node) = promote_type (cast_type);
14320 /* Now, the case can be determined correct at compile time if
14321 OP_TYPE can be converted into CAST_TYPE by assignment
14322 conversion (5.2) */
14324 if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
14326 TREE_SET_CODE (node, NOP_EXPR);
14330 if (flag_emit_class_files)
14332 TREE_SET_CODE (node, CONVERT_EXPR);
14336 /* The cast requires a run-time check */
14337 return build (CALL_EXPR, promote_type (cast_type),
14338 build_address_of (soft_checkcast_node),
14339 tree_cons (NULL_TREE, build_class_ref (cast_type),
14340 build_tree_list (NULL_TREE, op)),
14344 /* Any other casts are proven incorrect at compile time */
14345 t1 = xstrdup (lang_printable_name (op_type, 0));
14346 parse_error_context (wfl_op, "Invalid cast from `%s' to `%s'",
14347 t1, lang_printable_name (cast_type, 0));
14349 return error_mark_node;
14352 /* Build a null constant and give it the type TYPE. */
14355 build_null_of_type (tree type)
14357 tree node = build_int_2 (0, 0);
14358 TREE_TYPE (node) = promote_type (type);
14362 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14363 a list of indices. */
14365 build_array_ref (int location, tree array, tree index)
14367 tree node = build (ARRAY_REF, NULL_TREE, array, index);
14368 EXPR_WFL_LINECOL (node) = location;
14372 /* 15.12 Array Access Expression */
14375 patch_array_ref (tree node)
14377 tree array = TREE_OPERAND (node, 0);
14378 tree array_type = TREE_TYPE (array);
14379 tree index = TREE_OPERAND (node, 1);
14380 tree index_type = TREE_TYPE (index);
14381 int error_found = 0;
14383 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14385 if (TREE_CODE (array_type) == POINTER_TYPE)
14386 array_type = TREE_TYPE (array_type);
14388 /* The array reference must be an array */
14389 if (!TYPE_ARRAY_P (array_type))
14391 parse_error_context
14393 "`[]' can only be applied to arrays. It can't be applied to `%s'",
14394 lang_printable_name (array_type, 0));
14395 TREE_TYPE (node) = error_mark_node;
14399 /* The array index undergoes unary numeric promotion. The promoted
14400 type must be int */
14401 index = do_unary_numeric_promotion (index);
14402 if (TREE_TYPE (index) != int_type_node)
14404 if (valid_cast_to_p (index_type, int_type_node))
14405 parse_error_context (wfl_operator,
14406 "Incompatible type for `[]'. Explicit cast needed to convert `%s' to `int'",
14407 lang_printable_name (index_type, 0));
14409 parse_error_context (wfl_operator,
14410 "Incompatible type for `[]'. Can't convert `%s' to `int'",
14411 lang_printable_name (index_type, 0));
14412 TREE_TYPE (node) = error_mark_node;
14417 return error_mark_node;
14419 array_type = TYPE_ARRAY_ELEMENT (array_type);
14421 if (flag_emit_class_files || flag_emit_xref)
14423 TREE_OPERAND (node, 0) = array;
14424 TREE_OPERAND (node, 1) = index;
14427 node = build_java_arrayaccess (array, array_type, index);
14428 TREE_TYPE (node) = array_type;
14432 /* 15.9 Array Creation Expressions */
14435 build_newarray_node (tree type, tree dims, int extra_dims)
14438 build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
14439 build_int_2 (extra_dims, 0));
14444 patch_newarray (tree node)
14446 tree type = TREE_OPERAND (node, 0);
14447 tree dims = TREE_OPERAND (node, 1);
14448 tree cdim, array_type;
14449 int error_found = 0;
14451 int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
14453 /* Dimension types are verified. It's better for the types to be
14454 verified in order. */
14455 for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
14458 tree dim = TREE_VALUE (cdim);
14460 /* Dim might have been saved during its evaluation */
14461 dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
14463 /* The type of each specified dimension must be an integral type. */
14464 if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
14467 /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14468 promoted type must be int. */
14471 dim = do_unary_numeric_promotion (dim);
14472 if (TREE_TYPE (dim) != int_type_node)
14476 /* Report errors on types here */
14479 parse_error_context
14480 (TREE_PURPOSE (cdim),
14481 "Incompatible type for dimension in array creation expression. %s convert `%s' to `int'",
14482 (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
14483 "Explicit cast needed to" : "Can't"),
14484 lang_printable_name (TREE_TYPE (dim), 0));
14488 TREE_PURPOSE (cdim) = NULL_TREE;
14491 /* Resolve array base type if unresolved */
14492 if (!(type = resolve_type_during_patch (type)))
14497 /* We don't want further evaluation of this bogus array creation
14499 TREE_TYPE (node) = error_mark_node;
14500 return error_mark_node;
14503 /* Set array_type to the actual (promoted) array type of the result. */
14504 if (TREE_CODE (type) == RECORD_TYPE)
14505 type = build_pointer_type (type);
14506 while (--xdims >= 0)
14508 type = promote_type (build_java_array_type (type, -1));
14510 dims = nreverse (dims);
14512 for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
14516 = build_java_array_type (type,
14517 TREE_CODE (cdim) == INTEGER_CST
14518 ? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
14520 array_type = promote_type (array_type);
14522 dims = nreverse (dims);
14524 /* The node is transformed into a function call. Things are done
14525 differently according to the number of dimensions. If the number
14526 of dimension is equal to 1, then the nature of the base type
14527 (primitive or not) matters. */
14529 return build_new_array (type, TREE_VALUE (dims));
14531 /* Can't reuse what's already written in expr.c because it uses the
14532 JVM stack representation. Provide a build_multianewarray. FIXME */
14533 return build (CALL_EXPR, array_type,
14534 build_address_of (soft_multianewarray_node),
14535 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
14536 tree_cons (NULL_TREE,
14537 build_int_2 (ndims, 0), dims )),
14541 /* 10.6 Array initializer. */
14543 /* Build a wfl for array element that don't have one, so we can
14544 pin-point errors. */
14547 maybe_build_array_element_wfl (tree node)
14549 if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
14550 return build_expr_wfl (NULL_TREE, ctxp->filename,
14551 ctxp->elc.line, ctxp->elc.prev_col);
14556 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14557 identification of initialized arrays easier to detect during walk
14561 build_new_array_init (int location, tree values)
14563 tree constructor = build_constructor (NULL_TREE, values);
14564 tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
14565 EXPR_WFL_LINECOL (to_return) = location;
14569 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14570 occurred. Otherwise return NODE after having set its type
14574 patch_new_array_init (tree type, tree node)
14576 int error_seen = 0;
14577 tree current, element_type;
14578 HOST_WIDE_INT length;
14579 int all_constant = 1;
14580 tree init = TREE_OPERAND (node, 0);
14582 if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
14584 parse_error_context (node,
14585 "Invalid array initializer for non-array type `%s'",
14586 lang_printable_name (type, 1));
14587 return error_mark_node;
14589 type = TREE_TYPE (type);
14590 element_type = TYPE_ARRAY_ELEMENT (type);
14592 CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
14594 for (length = 0, current = CONSTRUCTOR_ELTS (init);
14595 current; length++, current = TREE_CHAIN (current))
14597 tree elt = TREE_VALUE (current);
14598 if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
14600 error_seen |= array_constructor_check_entry (element_type, current);
14601 elt = TREE_VALUE (current);
14602 /* When compiling to native code, STRING_CST is converted to
14603 INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14604 if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
14609 TREE_VALUE (current) = patch_new_array_init (element_type, elt);
14610 TREE_PURPOSE (current) = NULL_TREE;
14613 if (elt && TREE_CODE (elt) == TREE_LIST
14614 && TREE_VALUE (elt) == error_mark_node)
14619 return error_mark_node;
14621 /* Create a new type. We can't reuse the one we have here by
14622 patching its dimension because it originally is of dimension -1
14623 hence reused by gcc. This would prevent triangular arrays. */
14624 type = build_java_array_type (element_type, length);
14625 TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
14626 TREE_TYPE (node) = promote_type (type);
14627 TREE_CONSTANT (init) = all_constant;
14628 TREE_CONSTANT (node) = all_constant;
14632 /* Verify that one entry of the initializer element list can be
14633 assigned to the array base type. Report 1 if an error occurred, 0
14637 array_constructor_check_entry (tree type, tree entry)
14639 char *array_type_string = NULL; /* For error reports */
14640 tree value, type_value, new_value, wfl_value, patched;
14641 int error_seen = 0;
14643 new_value = NULL_TREE;
14644 wfl_value = TREE_VALUE (entry);
14646 value = java_complete_tree (TREE_VALUE (entry));
14647 /* patch_string return error_mark_node if arg is error_mark_node */
14648 if ((patched = patch_string (value)))
14650 if (value == error_mark_node)
14653 type_value = TREE_TYPE (value);
14655 /* At anytime, try_builtin_assignconv can report a warning on
14656 constant overflow during narrowing. */
14657 SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
14658 new_value = try_builtin_assignconv (wfl_operator, type, value);
14659 if (!new_value && (new_value = try_reference_assignconv (type, value)))
14660 type_value = promote_type (type);
14662 /* Check and report errors */
14665 const char *const msg = (!valid_cast_to_p (type_value, type) ?
14666 "Can't" : "Explicit cast needed to");
14667 if (!array_type_string)
14668 array_type_string = xstrdup (lang_printable_name (type, 1));
14669 parse_error_context
14670 (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
14671 msg, lang_printable_name (type_value, 1), array_type_string);
14676 TREE_VALUE (entry) = new_value;
14678 if (array_type_string)
14679 free (array_type_string);
14681 TREE_PURPOSE (entry) = NULL_TREE;
14686 build_this (int location)
14688 tree node = build_wfl_node (this_identifier_node);
14689 TREE_SET_CODE (node, THIS_EXPR);
14690 EXPR_WFL_LINECOL (node) = location;
14694 /* 14.15 The return statement. It builds a modify expression that
14695 assigns the returned value to the RESULT_DECL that hold the value
14699 build_return (int location, tree op)
14701 tree node = build1 (RETURN_EXPR, NULL_TREE, op);
14702 EXPR_WFL_LINECOL (node) = location;
14703 node = build_debugable_stmt (location, node);
14708 patch_return (tree node)
14710 tree return_exp = TREE_OPERAND (node, 0);
14711 tree meth = current_function_decl;
14712 tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
14713 int error_found = 0;
14715 TREE_TYPE (node) = error_mark_node;
14716 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14718 /* It's invalid to have a return value within a function that is
14719 declared with the keyword void or that is a constructor */
14720 if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
14723 /* It's invalid to use a return statement in a static block */
14724 if (DECL_CLINIT_P (current_function_decl))
14727 /* It's invalid to have a no return value within a function that
14728 isn't declared with the keyword `void' */
14729 if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
14732 if (DECL_INSTINIT_P (current_function_decl))
14737 if (DECL_INSTINIT_P (current_function_decl))
14738 parse_error_context (wfl_operator,
14739 "`return' inside instance initializer");
14741 else if (DECL_CLINIT_P (current_function_decl))
14742 parse_error_context (wfl_operator,
14743 "`return' inside static initializer");
14745 else if (!DECL_CONSTRUCTOR_P (meth))
14747 char *t = xstrdup (lang_printable_name (mtype, 0));
14748 parse_error_context (wfl_operator,
14749 "`return' with%s value from `%s %s'",
14750 (error_found == 1 ? "" : "out"),
14751 t, lang_printable_name (meth, 0));
14755 parse_error_context (wfl_operator,
14756 "`return' with value from constructor `%s'",
14757 lang_printable_name (meth, 0));
14758 return error_mark_node;
14761 /* If we have a return_exp, build a modify expression and expand
14762 it. Note: at that point, the assignment is declared valid, but we
14763 may want to carry some more hacks */
14766 tree exp = java_complete_tree (return_exp);
14767 tree modify, patched;
14769 if ((patched = patch_string (exp)))
14772 modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
14773 EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
14774 modify = java_complete_tree (modify);
14776 if (modify != error_mark_node)
14778 TREE_SIDE_EFFECTS (modify) = 1;
14779 TREE_OPERAND (node, 0) = modify;
14782 return error_mark_node;
14784 TREE_TYPE (node) = void_type_node;
14785 TREE_SIDE_EFFECTS (node) = 1;
14789 /* 14.8 The if Statement */
14792 build_if_else_statement (int location, tree expression, tree if_body,
14797 else_body = empty_stmt_node;
14798 node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
14799 EXPR_WFL_LINECOL (node) = location;
14800 node = build_debugable_stmt (location, node);
14805 patch_if_else_statement (tree node)
14807 tree expression = TREE_OPERAND (node, 0);
14808 int can_complete_normally
14809 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
14810 | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
14812 TREE_TYPE (node) = error_mark_node;
14813 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14815 /* The type of expression must be boolean */
14816 if (TREE_TYPE (expression) != boolean_type_node
14817 && TREE_TYPE (expression) != promoted_boolean_type_node)
14819 parse_error_context
14821 "Incompatible type for `if'. Can't convert `%s' to `boolean'",
14822 lang_printable_name (TREE_TYPE (expression), 0));
14823 return error_mark_node;
14826 if (TREE_CODE (expression) == INTEGER_CST)
14828 if (integer_zerop (expression))
14829 node = TREE_OPERAND (node, 2);
14831 node = TREE_OPERAND (node, 1);
14832 if (CAN_COMPLETE_NORMALLY (node) != can_complete_normally)
14834 node = build (COMPOUND_EXPR, void_type_node, node, empty_stmt_node);
14835 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14839 TREE_TYPE (node) = void_type_node;
14840 TREE_SIDE_EFFECTS (node) = 1;
14841 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14845 /* 14.6 Labeled Statements */
14847 /* Action taken when a labeled statement is parsed. a new
14848 LABELED_BLOCK_EXPR is created. No statement is attached to the
14849 label, yet. LABEL can be NULL_TREE for artificially-generated blocks. */
14852 build_labeled_block (int location, tree label)
14855 tree label_decl, node;
14856 if (label == NULL_TREE || label == continue_identifier_node)
14857 label_name = label;
14860 label_name = merge_qualified_name (label_id, label);
14861 /* Issue an error if we try to reuse a label that was previously
14863 if (IDENTIFIER_LOCAL_VALUE (label_name))
14865 EXPR_WFL_LINECOL (wfl_operator) = location;
14866 parse_error_context (wfl_operator,
14867 "Declaration of `%s' shadows a previous label declaration",
14868 IDENTIFIER_POINTER (label));
14869 EXPR_WFL_LINECOL (wfl_operator) =
14870 EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
14871 parse_error_context (wfl_operator,
14872 "This is the location of the previous declaration of label `%s'",
14873 IDENTIFIER_POINTER (label));
14874 java_error_count--;
14878 label_decl = create_label_decl (label_name);
14879 node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
14880 EXPR_WFL_LINECOL (node) = location;
14881 TREE_SIDE_EFFECTS (node) = 1;
14885 /* A labeled statement LBE is attached a statement. */
14888 finish_labeled_statement (tree lbe, /* Labeled block expr */
14891 /* In anyways, tie the loop to its statement */
14892 LABELED_BLOCK_BODY (lbe) = statement;
14893 pop_labeled_block ();
14894 POP_LABELED_BLOCK ();
14898 /* 14.10, 14.11, 14.12 Loop Statements */
14900 /* Create an empty LOOP_EXPR and make it the last in the nested loop
14904 build_new_loop (tree loop_body)
14906 tree loop = build (LOOP_EXPR, NULL_TREE, loop_body);
14907 TREE_SIDE_EFFECTS (loop) = 1;
14912 /* Create a loop body according to the following structure:
14914 COMPOUND_EXPR (loop main body)
14915 EXIT_EXPR (this order is for while/for loops.
14916 LABELED_BLOCK_EXPR the order is reversed for do loops)
14917 LABEL_DECL (a continue occurring here branches at the
14918 BODY end of this labeled block)
14921 REVERSED, if nonzero, tells that the loop condition expr comes
14922 after the body, like in the do-while loop.
14924 To obtain a loop, the loop body structure described above is
14925 encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
14928 LABEL_DECL (use this label to exit the loop)
14930 <structure described above> */
14933 build_loop_body (int location, tree condition, int reversed)
14935 tree first, second, body;
14937 condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
14938 EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
14939 condition = build_debugable_stmt (location, condition);
14940 TREE_SIDE_EFFECTS (condition) = 1;
14942 body = build_labeled_block (0, continue_identifier_node);
14943 first = (reversed ? body : condition);
14944 second = (reversed ? condition : body);
14946 build (COMPOUND_EXPR, NULL_TREE,
14947 build (COMPOUND_EXPR, NULL_TREE, first, second), empty_stmt_node);
14950 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
14951 their order) on the current loop. Unlink the current loop from the
14955 finish_loop_body (int location, tree condition, tree body, int reversed)
14957 tree to_return = ctxp->current_loop;
14958 tree loop_body = LOOP_EXPR_BODY (to_return);
14961 tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
14962 /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
14963 The real EXIT_EXPR is one operand further. */
14964 EXPR_WFL_LINECOL (cnode) = location;
14965 /* This one is for accurate error reports */
14966 EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
14967 TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
14969 LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
14974 /* Tailored version of finish_loop_body for FOR loops, when FOR
14975 loops feature the condition part */
14978 finish_for_loop (int location, tree condition, tree update, tree body)
14980 /* Put the condition and the loop body in place */
14981 tree loop = finish_loop_body (location, condition, body, 0);
14982 /* LOOP is the current loop which has been now popped of the loop
14983 stack. Mark the update block as reachable and install it. We do
14984 this because the (current interpretation of the) JLS requires
14985 that the update expression be considered reachable even if the
14986 for loop's body doesn't complete normally. */
14987 if (update != NULL_TREE && update != empty_stmt_node)
14990 if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
14991 up2 = EXPR_WFL_NODE (up2);
14992 /* It is possible for the update expression to be an
14993 EXPR_WFL_NODE wrapping nothing. */
14994 if (up2 != NULL_TREE && up2 != empty_stmt_node)
14996 /* Try to detect constraint violations. These would be
14997 programming errors somewhere. */
14998 if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
14999 || TREE_CODE (up2) == LOOP_EXPR)
15001 SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
15004 LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
15008 /* Try to find the loop a block might be related to. This comprises
15009 the case where the LOOP_EXPR is found as the second operand of a
15010 COMPOUND_EXPR, because the loop happens to have an initialization
15011 part, then expressed as the first operand of the COMPOUND_EXPR. If
15012 the search finds something, 1 is returned. Otherwise, 0 is
15013 returned. The search is assumed to start from a
15014 LABELED_BLOCK_EXPR's block. */
15017 search_loop (tree statement)
15019 if (TREE_CODE (statement) == LOOP_EXPR)
15022 if (TREE_CODE (statement) == BLOCK)
15023 statement = BLOCK_SUBBLOCKS (statement);
15027 if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15028 while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15029 statement = TREE_OPERAND (statement, 1);
15031 return (TREE_CODE (statement) == LOOP_EXPR
15032 && FOR_LOOP_P (statement) ? statement : NULL_TREE);
15035 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
15036 returned otherwise. */
15039 labeled_block_contains_loop_p (tree block, tree loop)
15044 if (LABELED_BLOCK_BODY (block) == loop)
15047 if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
15053 /* If the loop isn't surrounded by a labeled statement, create one and
15054 insert LOOP as its body. */
15057 patch_loop_statement (tree loop)
15061 TREE_TYPE (loop) = void_type_node;
15062 if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
15065 loop_label = build_labeled_block (0, NULL_TREE);
15066 /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
15067 that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
15068 LABELED_BLOCK_BODY (loop_label) = loop;
15069 PUSH_LABELED_BLOCK (loop_label);
15073 /* 14.13, 14.14: break and continue Statements */
15075 /* Build a break or a continue statement. a null NAME indicates an
15076 unlabeled break/continue statement. */
15079 build_bc_statement (int location, int is_break, tree name)
15081 tree break_continue, label_block_expr = NULL_TREE;
15085 if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
15086 (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
15087 /* Null means that we don't have a target for this named
15088 break/continue. In this case, we make the target to be the
15089 label name, so that the error can be reported accurately in
15090 patch_bc_statement. */
15091 label_block_expr = EXPR_WFL_NODE (name);
15093 /* Unlabeled break/continue will be handled during the
15094 break/continue patch operation */
15096 = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
15098 IS_BREAK_STMT_P (break_continue) = is_break;
15099 TREE_SIDE_EFFECTS (break_continue) = 1;
15100 EXPR_WFL_LINECOL (break_continue) = location;
15101 break_continue = build_debugable_stmt (location, break_continue);
15102 return break_continue;
15105 /* Verification of a break/continue statement. */
15108 patch_bc_statement (tree node)
15110 tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
15111 tree labeled_block = ctxp->current_labeled_block;
15112 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15114 /* Having an identifier here means that the target is unknown. */
15115 if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
15117 parse_error_context (wfl_operator, "No label definition found for `%s'",
15118 IDENTIFIER_POINTER (bc_label));
15119 return error_mark_node;
15121 if (! IS_BREAK_STMT_P (node))
15123 /* It's a continue statement. */
15124 for (;; labeled_block = TREE_CHAIN (labeled_block))
15126 if (labeled_block == NULL_TREE)
15128 if (bc_label == NULL_TREE)
15129 parse_error_context (wfl_operator,
15130 "`continue' must be in loop");
15132 parse_error_context
15133 (wfl_operator, "continue label `%s' does not name a loop",
15134 IDENTIFIER_POINTER (bc_label));
15135 return error_mark_node;
15137 if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
15138 == continue_identifier_node)
15139 && (bc_label == NULL_TREE
15140 || TREE_CHAIN (labeled_block) == bc_label))
15142 bc_label = labeled_block;
15147 else if (!bc_label)
15149 for (;; labeled_block = TREE_CHAIN (labeled_block))
15151 if (labeled_block == NULL_TREE)
15153 parse_error_context (wfl_operator,
15154 "`break' must be in loop or switch");
15155 return error_mark_node;
15157 target_stmt = LABELED_BLOCK_BODY (labeled_block);
15158 if (TREE_CODE (target_stmt) == SWITCH_EXPR
15159 || search_loop (target_stmt))
15161 bc_label = labeled_block;
15167 EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
15168 CAN_COMPLETE_NORMALLY (bc_label) = 1;
15170 /* Our break/continue don't return values. */
15171 TREE_TYPE (node) = void_type_node;
15172 /* Encapsulate the break within a compound statement so that it's
15173 expanded all the times by expand_expr (and not clobbered
15174 sometimes, like after a if statement) */
15175 node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
15176 TREE_SIDE_EFFECTS (node) = 1;
15180 /* Process the exit expression belonging to a loop. Its type must be
15184 patch_exit_expr (tree node)
15186 tree expression = TREE_OPERAND (node, 0);
15187 TREE_TYPE (node) = error_mark_node;
15188 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15190 /* The type of expression must be boolean */
15191 if (TREE_TYPE (expression) != boolean_type_node)
15193 parse_error_context
15195 "Incompatible type for loop conditional. Can't convert `%s' to `boolean'",
15196 lang_printable_name (TREE_TYPE (expression), 0));
15197 return error_mark_node;
15199 /* Now we know things are allright, invert the condition, fold and
15201 TREE_OPERAND (node, 0) =
15202 fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
15204 if (! integer_zerop (TREE_OPERAND (node, 0))
15205 && ctxp->current_loop != NULL_TREE
15206 && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
15207 CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
15208 if (! integer_onep (TREE_OPERAND (node, 0)))
15209 CAN_COMPLETE_NORMALLY (node) = 1;
15212 TREE_TYPE (node) = void_type_node;
15216 /* 14.9 Switch statement */
15219 patch_switch_statement (tree node)
15221 tree se = TREE_OPERAND (node, 0), se_type;
15224 /* Complete the switch expression */
15225 se = TREE_OPERAND (node, 0) = java_complete_tree (se);
15226 se_type = TREE_TYPE (se);
15227 /* The type of the switch expression must be char, byte, short or
15229 if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
15231 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15232 parse_error_context (wfl_operator,
15233 "Incompatible type for `switch'. Can't convert `%s' to `int'",
15234 lang_printable_name (se_type, 0));
15235 /* This is what java_complete_tree will check */
15236 TREE_OPERAND (node, 0) = error_mark_node;
15237 return error_mark_node;
15240 /* Save and restore the outer case label list. */
15241 save = case_label_list;
15242 case_label_list = NULL_TREE;
15244 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
15246 /* See if we've found a duplicate label. We can't leave this until
15247 code generation, because in `--syntax-only' and `-C' modes we
15248 don't do ordinary code generation. */
15249 for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
15251 HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
15253 for (subiter = TREE_CHAIN (iter);
15254 subiter != NULL_TREE;
15255 subiter = TREE_CHAIN (subiter))
15257 HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
15260 EXPR_WFL_LINECOL (wfl_operator)
15261 = EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
15262 /* The case_label_list is in reverse order, so print the
15263 outer label first. */
15264 parse_error_context (wfl_operator, "duplicate case label: `"
15265 HOST_WIDE_INT_PRINT_DEC "'", subval);
15266 EXPR_WFL_LINECOL (wfl_operator)
15267 = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
15268 parse_error_context (wfl_operator, "original label is here");
15275 case_label_list = save;
15277 /* Ready to return */
15278 if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
15280 TREE_TYPE (node) = error_mark_node;
15281 return error_mark_node;
15283 TREE_TYPE (node) = void_type_node;
15284 TREE_SIDE_EFFECTS (node) = 1;
15285 CAN_COMPLETE_NORMALLY (node)
15286 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15287 || ! SWITCH_HAS_DEFAULT (node);
15293 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15294 might be NULL_TREE. */
15296 build_assertion (int location, tree condition, tree value)
15299 tree klass = GET_CPC ();
15301 if (! CLASS_USES_ASSERTIONS (klass))
15303 tree field, classdollar, id, call;
15304 tree class_type = TREE_TYPE (klass);
15306 field = add_field (class_type,
15307 get_identifier ("$assertionsDisabled"),
15309 ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
15310 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
15311 FIELD_SYNTHETIC (field) = 1;
15313 classdollar = build_incomplete_class_ref (location, class_type);
15315 /* Call CLASS.desiredAssertionStatus(). */
15316 id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
15317 call = build (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
15318 call = make_qualified_primary (classdollar, call, location);
15319 TREE_SIDE_EFFECTS (call) = 1;
15321 /* Invert to obtain !CLASS.desiredAssertionStatus(). This may
15322 seem odd, but we do it to generate code identical to that of
15324 call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
15325 TREE_SIDE_EFFECTS (call) = 1;
15326 DECL_INITIAL (field) = call;
15328 /* Record the initializer in the initializer statement list. */
15329 call = build (MODIFY_EXPR, NULL_TREE, field, call);
15330 TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
15331 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
15332 MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
15334 CLASS_USES_ASSERTIONS (klass) = 1;
15337 if (value != NULL_TREE)
15338 value = tree_cons (NULL_TREE, value, NULL_TREE);
15340 node = build_wfl_node (get_identifier ("java"));
15341 node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
15343 node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
15346 node = build (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
15347 TREE_SIDE_EFFECTS (node) = 1;
15348 /* It is too early to use BUILD_THROW. */
15349 node = build1 (THROW_EXPR, NULL_TREE, node);
15350 TREE_SIDE_EFFECTS (node) = 1;
15352 /* We invert the condition; if we just put NODE as the `else' part
15353 then we generate weird-looking bytecode. */
15354 condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
15355 /* Check $assertionsDisabled. */
15357 = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15358 build1 (TRUTH_NOT_EXPR, NULL_TREE,
15359 build_wfl_node (get_identifier ("$assertionsDisabled"))),
15361 node = build_if_else_statement (location, condition, node, NULL_TREE);
15365 /* 14.18 The try/catch statements */
15367 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15368 catches TYPE and executes CATCH_STMTS. */
15371 encapsulate_with_try_catch (int location, tree type_or_name, tree try_stmts,
15374 tree try_block, catch_clause_param, catch_block, catch;
15376 /* First build a try block */
15377 try_block = build_expr_block (try_stmts, NULL_TREE);
15379 /* Build a catch block: we need a catch clause parameter */
15380 if (TREE_CODE (type_or_name) == EXPR_WITH_FILE_LOCATION)
15382 tree catch_type = obtain_incomplete_type (type_or_name);
15384 catch_clause_param = build_decl (VAR_DECL, wpv_id, catch_type);
15385 register_incomplete_type (JDEP_VARIABLE, type_or_name,
15386 catch_clause_param, catch_type);
15387 dep = CLASSD_LAST (ctxp->classd_list);
15388 JDEP_GET_PATCH (dep) = &TREE_TYPE (catch_clause_param);
15391 catch_clause_param = build_decl (VAR_DECL, wpv_id,
15392 build_pointer_type (type_or_name));
15395 catch_block = build_expr_block (NULL_TREE, catch_clause_param);
15397 /* Initialize the variable and store in the block */
15398 catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param,
15399 build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
15400 add_stmt_to_block (catch_block, NULL_TREE, catch);
15402 /* Add the catch statements */
15403 add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
15405 /* Now we can build a CATCH_EXPR */
15406 catch_block = build1 (CATCH_EXPR, NULL_TREE, catch_block);
15408 return build_try_statement (location, try_block, catch_block);
15412 build_try_statement (int location, tree try_block, tree catches)
15414 tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
15415 EXPR_WFL_LINECOL (node) = location;
15420 build_try_finally_statement (int location, tree try_block, tree finally)
15422 tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
15423 EXPR_WFL_LINECOL (node) = location;
15428 patch_try_statement (tree node)
15430 int error_found = 0;
15431 tree try = TREE_OPERAND (node, 0);
15432 /* Exception handlers are considered in left to right order */
15433 tree catch = nreverse (TREE_OPERAND (node, 1));
15434 tree current, caught_type_list = NULL_TREE;
15436 /* Check catch clauses, if any. Every time we find an error, we try
15437 to process the next catch clause. We process the catch clause before
15438 the try block so that when processing the try block we can check thrown
15439 exceptions againts the caught type list. */
15440 for (current = catch; current; current = TREE_CHAIN (current))
15442 tree carg_decl, carg_type;
15443 tree sub_current, catch_block, catch_clause;
15446 /* At this point, the structure of the catch clause is
15447 CATCH_EXPR (catch node)
15448 BLOCK (with the decl of the parameter)
15450 MODIFY_EXPR (assignment of the catch parameter)
15451 BLOCK (catch clause block)
15453 catch_clause = TREE_OPERAND (current, 0);
15454 carg_decl = BLOCK_EXPR_DECLS (catch_clause);
15455 carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
15457 /* Catch clauses can't have more than one parameter declared,
15458 but it's already enforced by the grammar. Make sure that the
15459 only parameter of the clause statement in of class Throwable
15460 or a subclass of Throwable, but that was done earlier. The
15461 catch clause parameter type has also been resolved. */
15463 /* Just make sure that the catch clause parameter type inherits
15464 from java.lang.Throwable */
15465 if (!inherits_from_p (carg_type, throwable_type_node))
15467 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15468 parse_error_context (wfl_operator,
15469 "Can't catch class `%s'. Catch clause parameter type must be a subclass of class `java.lang.Throwable'",
15470 lang_printable_name (carg_type, 0));
15475 /* Partial check for unreachable catch statement: The catch
15476 clause is reachable iff is no earlier catch block A in
15477 the try statement such that the type of the catch
15478 clause's parameter is the same as or a subclass of the
15479 type of A's parameter */
15481 for (sub_current = catch;
15482 sub_current != current; sub_current = TREE_CHAIN (sub_current))
15484 tree sub_catch_clause, decl;
15485 sub_catch_clause = TREE_OPERAND (sub_current, 0);
15486 decl = BLOCK_EXPR_DECLS (sub_catch_clause);
15488 if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
15490 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15491 parse_error_context
15493 "`catch' not reached because of the catch clause at line %d",
15494 EXPR_WFL_LINENO (sub_current));
15495 unreachable = error_found = 1;
15499 /* Complete the catch clause block */
15500 catch_block = java_complete_tree (TREE_OPERAND (current, 0));
15501 if (catch_block == error_mark_node)
15506 if (CAN_COMPLETE_NORMALLY (catch_block))
15507 CAN_COMPLETE_NORMALLY (node) = 1;
15508 TREE_OPERAND (current, 0) = catch_block;
15513 /* Things to do here: the exception must be thrown */
15515 /* Link this type to the caught type list */
15516 caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
15519 PUSH_EXCEPTIONS (caught_type_list);
15520 if ((try = java_complete_tree (try)) == error_mark_node)
15522 if (CAN_COMPLETE_NORMALLY (try))
15523 CAN_COMPLETE_NORMALLY (node) = 1;
15526 /* Verification ends here */
15528 return error_mark_node;
15530 TREE_OPERAND (node, 0) = try;
15531 TREE_OPERAND (node, 1) = catch;
15532 TREE_TYPE (node) = void_type_node;
15536 /* 14.17 The synchronized Statement */
15539 patch_synchronized_statement (tree node, tree wfl_op1)
15541 tree expr = java_complete_tree (TREE_OPERAND (node, 0));
15542 tree block = TREE_OPERAND (node, 1);
15544 tree tmp, enter, exit, expr_decl, assignment;
15546 if (expr == error_mark_node)
15548 block = java_complete_tree (block);
15552 /* We might be trying to synchronize on a STRING_CST */
15553 if ((tmp = patch_string (expr)))
15556 /* The TYPE of expr must be a reference type */
15557 if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
15559 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15560 parse_error_context (wfl_operator, "Incompatible type for `synchronized'. Can't convert `%s' to `java.lang.Object'",
15561 lang_printable_name (TREE_TYPE (expr), 0));
15562 return error_mark_node;
15565 if (flag_emit_xref)
15567 TREE_OPERAND (node, 0) = expr;
15568 TREE_OPERAND (node, 1) = java_complete_tree (block);
15569 CAN_COMPLETE_NORMALLY (node) = 1;
15573 /* Generate a try-finally for the synchronized statement, except
15574 that the handler that catches all throw exception calls
15575 _Jv_MonitorExit and then rethrow the exception.
15576 The synchronized statement is then implemented as:
15579 _Jv_MonitorEnter (expression)
15581 _Jv_MonitorExit (expression)
15585 e = _Jv_exception_info ();
15586 _Jv_MonitorExit (expression)
15590 expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
15591 BUILD_MONITOR_ENTER (enter, expr_decl);
15592 BUILD_MONITOR_EXIT (exit, expr_decl);
15593 CAN_COMPLETE_NORMALLY (enter) = 1;
15594 CAN_COMPLETE_NORMALLY (exit) = 1;
15595 assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
15596 TREE_SIDE_EFFECTS (assignment) = 1;
15597 node = build (COMPOUND_EXPR, NULL_TREE,
15598 build (COMPOUND_EXPR, NULL_TREE, assignment, enter),
15599 build (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
15600 node = build_expr_block (node, expr_decl);
15602 return java_complete_tree (node);
15605 /* 14.16 The throw Statement */
15608 patch_throw_statement (tree node, tree wfl_op1)
15610 tree expr = TREE_OPERAND (node, 0);
15611 tree type = TREE_TYPE (expr);
15612 int unchecked_ok = 0, tryblock_throws_ok = 0;
15614 /* Thrown expression must be assignable to java.lang.Throwable */
15615 if (!try_reference_assignconv (throwable_type_node, expr))
15617 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15618 parse_error_context (wfl_operator,
15619 "Can't throw `%s'; it must be a subclass of class `java.lang.Throwable'",
15620 lang_printable_name (type, 0));
15621 /* If the thrown expression was a reference, we further the
15622 compile-time check. */
15623 if (!JREFERENCE_TYPE_P (type))
15624 return error_mark_node;
15627 /* At least one of the following must be true */
15629 /* The type of the throw expression is a not checked exception,
15630 i.e. is a unchecked expression. */
15631 unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
15633 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15634 /* An instance can't throw a checked exception unless that exception
15635 is explicitly declared in the `throws' clause of each
15636 constructor. This doesn't apply to anonymous classes, since they
15637 don't have declared constructors. */
15639 && DECL_INSTINIT_P (current_function_decl)
15640 && !ANONYMOUS_CLASS_P (current_class))
15643 for (current = TYPE_METHODS (current_class); current;
15644 current = TREE_CHAIN (current))
15645 if (DECL_CONSTRUCTOR_P (current)
15646 && !check_thrown_exceptions_do (TREE_TYPE (expr)))
15648 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)",
15649 lang_printable_name (TREE_TYPE (expr), 0));
15650 return error_mark_node;
15654 /* Throw is contained in a try statement and at least one catch
15655 clause can receive the thrown expression or the current method is
15656 declared to throw such an exception. Or, the throw statement is
15657 contained in a method or constructor declaration and the type of
15658 the Expression is assignable to at least one type listed in the
15659 throws clause the declaration. */
15661 tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
15662 if (!(unchecked_ok || tryblock_throws_ok))
15664 /* If there is a surrounding try block that has no matching
15665 clatch clause, report it first. A surrounding try block exits
15666 only if there is something after the list of checked
15667 exception thrown by the current function (if any). */
15668 if (IN_TRY_BLOCK_P ())
15669 parse_error_context (wfl_operator, "Checked exception `%s' can't be caught by any of the catch clause(s) of the surrounding `try' block",
15670 lang_printable_name (type, 0));
15671 /* If we have no surrounding try statement and the method doesn't have
15672 any throws, report it now. FIXME */
15674 /* We report that the exception can't be throw from a try block
15675 in all circumstances but when the `throw' is inside a static
15677 else if (!EXCEPTIONS_P (currently_caught_type_list)
15678 && !tryblock_throws_ok)
15680 if (DECL_CLINIT_P (current_function_decl))
15681 parse_error_context (wfl_operator,
15682 "Checked exception `%s' can't be thrown in initializer",
15683 lang_printable_name (type, 0));
15685 parse_error_context (wfl_operator,
15686 "Checked exception `%s' isn't thrown from a `try' block",
15687 lang_printable_name (type, 0));
15689 /* Otherwise, the current method doesn't have the appropriate
15690 throws declaration */
15692 parse_error_context (wfl_operator, "Checked exception `%s' doesn't match any of current method's `throws' declaration(s)",
15693 lang_printable_name (type, 0));
15694 return error_mark_node;
15697 if (! flag_emit_class_files && ! flag_emit_xref)
15698 BUILD_THROW (node, expr);
15700 /* If doing xrefs, keep the location where the `throw' was seen. */
15701 if (flag_emit_xref)
15702 EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
15706 /* Check that exception said to be thrown by method DECL can be
15707 effectively caught from where DECL is invoked. THIS_EXPR is the
15708 expression that computes `this' for the method call. */
15710 check_thrown_exceptions (int location, tree decl, tree this_expr)
15713 int is_array_call = 0;
15715 /* Skip check within generated methods, such as access$<n>. */
15716 if (OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
15719 if (this_expr != NULL_TREE
15720 && TREE_CODE (TREE_TYPE (this_expr)) == POINTER_TYPE
15721 && TYPE_ARRAY_P (TREE_TYPE (TREE_TYPE (this_expr))))
15724 /* For all the unchecked exceptions thrown by DECL. */
15725 for (throws = DECL_FUNCTION_THROWS (decl); throws;
15726 throws = TREE_CHAIN (throws))
15727 if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
15729 /* Suppress errors about cloning arrays. */
15730 if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
15733 EXPR_WFL_LINECOL (wfl_operator) = location;
15734 if (DECL_FINIT_P (current_function_decl))
15735 parse_error_context
15736 (wfl_operator, "Exception `%s' can't be thrown in initializer",
15737 lang_printable_name (TREE_VALUE (throws), 0));
15740 parse_error_context
15741 (wfl_operator, "Exception `%s' must be caught, or it must be declared in the `throws' clause of `%s'",
15742 lang_printable_name (TREE_VALUE (throws), 0),
15743 (DECL_INIT_P (current_function_decl) ?
15744 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
15745 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
15750 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
15751 try-catch blocks, OR is listed in the `throws' clause of the
15755 check_thrown_exceptions_do (tree exception)
15757 tree list = currently_caught_type_list;
15758 resolve_and_layout (exception, NULL_TREE);
15759 /* First, all the nested try-catch-finally at that stage. The
15760 last element contains `throws' clause exceptions, if any. */
15761 if (IS_UNCHECKED_EXCEPTION_P (exception))
15766 for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
15767 if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
15769 list = TREE_CHAIN (list);
15775 purge_unchecked_exceptions (tree mdecl)
15777 tree throws = DECL_FUNCTION_THROWS (mdecl);
15778 tree new = NULL_TREE;
15782 tree next = TREE_CHAIN (throws);
15783 if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
15785 TREE_CHAIN (throws) = new;
15790 /* List is inverted here, but it doesn't matter */
15791 DECL_FUNCTION_THROWS (mdecl) = new;
15794 /* This function goes over all of CLASS_TYPE ctors and checks whether
15795 each of them features at least one unchecked exception in its
15796 `throws' clause. If it's the case, it returns `true', `false'
15800 ctors_unchecked_throws_clause_p (tree class_type)
15804 for (current = TYPE_METHODS (class_type); current;
15805 current = TREE_CHAIN (current))
15807 bool ctu = false; /* Ctor Throws Unchecked */
15808 if (DECL_CONSTRUCTOR_P (current))
15811 for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
15812 throws = TREE_CHAIN (throws))
15813 if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
15816 /* We return false as we found one ctor that is unfit. */
15817 if (!ctu && DECL_CONSTRUCTOR_P (current))
15820 /* All ctors feature at least one unchecked exception in their
15821 `throws' clause. */
15825 /* 15.24 Conditional Operator ?: */
15828 patch_conditional_expr (tree node, tree wfl_cond, tree wfl_op1)
15830 tree cond = TREE_OPERAND (node, 0);
15831 tree op1 = TREE_OPERAND (node, 1);
15832 tree op2 = TREE_OPERAND (node, 2);
15833 tree resulting_type = NULL_TREE;
15834 tree t1, t2, patched;
15835 int error_found = 0;
15837 /* Operands of ?: might be StringBuffers crafted as a result of a
15838 string concatenation. Obtain a descent operand here. */
15839 if ((patched = patch_string (op1)))
15840 TREE_OPERAND (node, 1) = op1 = patched;
15841 if ((patched = patch_string (op2)))
15842 TREE_OPERAND (node, 2) = op2 = patched;
15844 t1 = TREE_TYPE (op1);
15845 t2 = TREE_TYPE (op2);
15847 /* The first expression must be a boolean */
15848 if (TREE_TYPE (cond) != boolean_type_node)
15850 SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
15851 parse_error_context (wfl_operator,
15852 "Incompatible type for `?:'. Can't convert `%s' to `boolean'",
15853 lang_printable_name (TREE_TYPE (cond), 0));
15857 /* Second and third can be numeric, boolean (i.e. primitive),
15858 references or null. Anything else results in an error */
15859 if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
15860 || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
15861 && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
15862 || (t1 == boolean_type_node && t2 == boolean_type_node)))
15865 /* Determine the type of the conditional expression. Same types are
15866 easy to deal with */
15868 resulting_type = t1;
15870 /* There are different rules for numeric types */
15871 else if (JNUMERIC_TYPE_P (t1))
15873 /* if byte/short found, the resulting type is short */
15874 if ((t1 == byte_type_node && t2 == short_type_node)
15875 || (t1 == short_type_node && t2 == byte_type_node))
15876 resulting_type = short_type_node;
15878 /* If t1 is a constant int and t2 is of type byte, short or char
15879 and t1's value fits in t2, then the resulting type is t2 */
15880 else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
15881 && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
15882 resulting_type = t2;
15884 /* If t2 is a constant int and t1 is of type byte, short or char
15885 and t2's value fits in t1, then the resulting type is t1 */
15886 else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
15887 && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
15888 resulting_type = t1;
15890 /* Otherwise, binary numeric promotion is applied and the
15891 resulting type is the promoted type of operand 1 and 2 */
15893 resulting_type = binary_numeric_promotion (t1, t2,
15894 &TREE_OPERAND (node, 1),
15895 &TREE_OPERAND (node, 2));
15898 /* Cases of a reference and a null type */
15899 else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
15900 resulting_type = t1;
15902 else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
15903 resulting_type = t2;
15905 /* Last case: different reference types. If a type can be converted
15906 into the other one by assignment conversion, the latter
15907 determines the type of the expression */
15908 else if ((resulting_type = try_reference_assignconv (t1, op2)))
15909 resulting_type = promote_type (t1);
15911 else if ((resulting_type = try_reference_assignconv (t2, op1)))
15912 resulting_type = promote_type (t2);
15914 /* If we don't have any resulting type, we're in trouble */
15915 if (!resulting_type)
15917 char *t = xstrdup (lang_printable_name (t1, 0));
15918 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15919 parse_error_context (wfl_operator,
15920 "Incompatible type for `?:'. Can't convert `%s' to `%s'",
15921 t, lang_printable_name (t2, 0));
15928 TREE_TYPE (node) = error_mark_node;
15929 return error_mark_node;
15932 TREE_TYPE (node) = resulting_type;
15933 TREE_SET_CODE (node, COND_EXPR);
15934 CAN_COMPLETE_NORMALLY (node) = 1;
15938 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
15941 maybe_build_class_init_for_field (tree decl, tree expr)
15943 tree clas = DECL_CONTEXT (decl);
15944 if (flag_emit_class_files || flag_emit_xref)
15947 if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
15948 && FIELD_FINAL (decl))
15950 tree init = DECL_INITIAL (decl);
15951 if (init != NULL_TREE)
15952 init = fold_constant_for_init (init, decl);
15953 if (init != NULL_TREE && CONSTANT_VALUE_P (init))
15957 return build_class_init (clas, expr);
15960 /* Try to constant fold NODE.
15961 If NODE is not a constant expression, return NULL_EXPR.
15962 CONTEXT is a static final VAR_DECL whose initializer we are folding. */
15965 fold_constant_for_init (tree node, tree context)
15967 tree op0, op1, val;
15968 enum tree_code code = TREE_CODE (node);
15973 if (node == null_pointer_node)
15982 case TRUNC_MOD_EXPR:
15990 case TRUTH_ANDIF_EXPR:
15991 case TRUTH_ORIF_EXPR:
15998 op0 = TREE_OPERAND (node, 0);
15999 op1 = TREE_OPERAND (node, 1);
16000 val = fold_constant_for_init (op0, context);
16001 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16003 TREE_OPERAND (node, 0) = val;
16004 val = fold_constant_for_init (op1, context);
16005 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16007 TREE_OPERAND (node, 1) = val;
16008 return patch_binop (node, op0, op1);
16010 case UNARY_PLUS_EXPR:
16012 case TRUTH_NOT_EXPR:
16015 op0 = TREE_OPERAND (node, 0);
16016 val = fold_constant_for_init (op0, context);
16017 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16019 TREE_OPERAND (node, 0) = val;
16020 val = patch_unaryop (node, op0);
16021 if (! TREE_CONSTANT (val))
16028 val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
16029 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16031 TREE_OPERAND (node, 0) = val;
16032 val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
16033 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16035 TREE_OPERAND (node, 1) = val;
16036 val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
16037 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16039 TREE_OPERAND (node, 2) = val;
16040 return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
16041 : TREE_OPERAND (node, 2);
16045 if (! FIELD_FINAL (node)
16046 || DECL_INITIAL (node) == NULL_TREE)
16048 val = DECL_INITIAL (node);
16049 /* Guard against infinite recursion. */
16050 DECL_INITIAL (node) = NULL_TREE;
16051 val = fold_constant_for_init (val, node);
16052 if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
16053 val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
16054 DECL_INITIAL (node) = val;
16057 case EXPR_WITH_FILE_LOCATION:
16058 /* Compare java_complete_tree and resolve_expression_name. */
16059 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
16060 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
16062 tree name = EXPR_WFL_NODE (node);
16064 if (PRIMARY_P (node))
16066 else if (! QUALIFIED_P (name))
16068 decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
16069 if (decl == NULL_TREE
16070 || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
16072 return fold_constant_for_init (decl, decl);
16076 /* Install the proper context for the field resolution.
16077 The prior context is restored once the name is
16078 properly qualified. */
16079 tree saved_current_class = current_class;
16080 /* Wait until the USE_COMPONENT_REF re-write. FIXME. */
16081 current_class = DECL_CONTEXT (context);
16082 qualify_ambiguous_name (node);
16083 current_class = saved_current_class;
16084 if (resolve_field_access (node, &decl, NULL)
16085 && decl != NULL_TREE)
16086 return fold_constant_for_init (decl, decl);
16092 op0 = TREE_OPERAND (node, 0);
16093 val = fold_constant_for_init (op0, context);
16094 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16096 TREE_OPERAND (node, 0) = val;
16100 #ifdef USE_COMPONENT_REF
16102 case COMPONENT_REF:
16111 #ifdef USE_COMPONENT_REF
16112 /* Context is 'T' for TypeName, 'P' for PackageName,
16113 'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16116 resolve_simple_name (tree name, int context)
16121 resolve_qualified_name (tree name, int context)
16127 init_src_parse (void)
16129 /* Sanity check; we've been bit by this before. */
16130 if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
16136 /* This section deals with the functions that are called when tables
16137 recording class initialization information are traversed. */
16139 /* Attach to PTR (a block) the declaration found in ENTRY. */
16142 attach_init_test_initialization_flags (void **entry, void *ptr)
16144 tree block = (tree)ptr;
16145 struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
16147 if (block != error_mark_node)
16149 TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
16150 BLOCK_EXPR_DECLS (block) = ite->value;
16155 /* This function is called for each class that is known definitely
16156 initialized when a given static method was called. This function
16157 augments a compound expression (INFO) storing all assignment to
16158 initialized static class flags if a flag already existed, otherwise
16159 a new one is created. */
16162 emit_test_initialization (void **entry_p, void *info)
16164 tree l = (tree) info;
16166 tree key = (tree) *entry_p;
16168 htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
16170 /* If we haven't found a flag and we're dealing with self registered
16171 with current_function_decl, then don't do anything. Self is
16172 always added as definitely initialized but this information is
16173 valid only if used outside the current function. */
16174 if (current_function_decl == TREE_PURPOSE (l)
16175 && java_treetreehash_find (cf_ht, key) == NULL)
16178 ite = java_treetreehash_new (cf_ht, key);
16180 /* If we don't have a variable, create one and install it. */
16185 decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
16186 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
16187 LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
16188 DECL_CONTEXT (decl) = current_function_decl;
16189 DECL_INITIAL (decl) = boolean_true_node;
16190 /* Don't emit any symbolic debugging info for this decl. */
16191 DECL_IGNORED_P (decl) = 1;
16193 /* The trick is to find the right context for it. */
16194 block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
16195 TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
16196 BLOCK_EXPR_DECLS (block) = decl;
16202 /* Now simply augment the compound that holds all the assignments
16203 pertaining to this method invocation. */
16204 init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
16205 TREE_SIDE_EFFECTS (init) = 1;
16206 TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
16207 TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
16212 #include "gt-java-parse.h"
16213 #include "gtype-java.h"