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 Free Software Foundation, Inc.
4 Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.
23 Java and all Java-based marks are trademarks or registered trademarks
24 of Sun Microsystems, Inc. in the United States and other countries.
25 The Free Software Foundation is independent of Sun Microsystems, Inc. */
27 /* This file parses java source code and issues a tree node image
28 suitable for code generation (byte code and targeted CPU assembly
31 The grammar conforms to the Java grammar described in "The Java(TM)
32 Language Specification. J. Gosling, B. Joy, G. Steele. Addison Wesley
33 1996, ISBN 0-201-63451-1"
35 The following modifications were brought to the original grammar:
37 method_body: added the rule '| block SC_TK'
38 static_initializer: added the rule 'static block SC_TK'.
40 Note: All the extra rules described above should go away when the
41 empty_statement rule will work.
43 statement_nsi: 'nsi' should be read no_short_if.
45 Some rules have been modified to support JDK1.1 inner classes
46 definitions and other extensions. */
58 #include "java-tree.h"
70 #include "tree-inline.h"
73 #define DIR_SEPARATOR '/'
76 /* Local function prototypes */
77 static char *java_accstring_lookup PARAMS ((int));
78 static void classitf_redefinition_error PARAMS ((const char *,tree, tree, tree));
79 static void variable_redefinition_error PARAMS ((tree, tree, tree, int));
80 static tree create_class PARAMS ((int, tree, tree, tree));
81 static tree create_interface PARAMS ((int, tree, tree));
82 static void end_class_declaration PARAMS ((int));
83 static tree find_field PARAMS ((tree, tree));
84 static tree lookup_field_wrapper PARAMS ((tree, tree));
85 static int duplicate_declaration_error_p PARAMS ((tree, tree, tree));
86 static void register_fields PARAMS ((int, tree, tree));
87 static tree parser_qualified_classname PARAMS ((tree));
88 static int parser_check_super PARAMS ((tree, tree, tree));
89 static int parser_check_super_interface PARAMS ((tree, tree, tree));
90 static void check_modifiers_consistency PARAMS ((int));
91 static tree lookup_cl PARAMS ((tree));
92 static tree lookup_java_method2 PARAMS ((tree, tree, int));
93 static tree method_header PARAMS ((int, tree, tree, tree));
94 static void fix_method_argument_names PARAMS ((tree ,tree));
95 static tree method_declarator PARAMS ((tree, tree));
96 static void parse_warning_context PARAMS ((tree cl, const char *msg, ...))
98 static void issue_warning_error_from_context PARAMS ((tree, const char *msg, va_list))
99 ATTRIBUTE_PRINTF (2, 0);
100 static void parse_ctor_invocation_error PARAMS ((void));
101 static tree parse_jdk1_1_error PARAMS ((const char *));
102 static void complete_class_report_errors PARAMS ((jdep *));
103 static int process_imports PARAMS ((void));
104 static void read_import_dir PARAMS ((tree));
105 static int find_in_imports_on_demand PARAMS ((tree, tree));
106 static void find_in_imports PARAMS ((tree, tree));
107 static void check_inner_class_access PARAMS ((tree, tree, tree));
108 static int check_pkg_class_access PARAMS ((tree, tree, bool));
109 static void register_package PARAMS ((tree));
110 static tree resolve_package PARAMS ((tree, tree *, tree *));
111 static tree resolve_class PARAMS ((tree, tree, tree, tree));
112 static void declare_local_variables PARAMS ((int, tree, tree));
113 static void dump_java_tree PARAMS ((enum tree_dump_index, tree));
114 static void source_start_java_method PARAMS ((tree));
115 static void source_end_java_method PARAMS ((void));
116 static tree find_name_in_single_imports PARAMS ((tree));
117 static void check_abstract_method_header PARAMS ((tree));
118 static tree lookup_java_interface_method2 PARAMS ((tree, tree));
119 static tree resolve_expression_name PARAMS ((tree, tree *));
120 static tree maybe_create_class_interface_decl PARAMS ((tree, tree, tree, tree));
121 static int check_class_interface_creation PARAMS ((int, int, tree,
123 static tree patch_method_invocation PARAMS ((tree, tree, tree, int,
125 static int breakdown_qualified PARAMS ((tree *, tree *, tree));
126 static int in_same_package PARAMS ((tree, tree));
127 static tree resolve_and_layout PARAMS ((tree, tree));
128 static tree qualify_and_find PARAMS ((tree, tree, tree));
129 static tree resolve_no_layout PARAMS ((tree, tree));
130 static int invocation_mode PARAMS ((tree, int));
131 static tree find_applicable_accessible_methods_list PARAMS ((int, tree,
133 static void search_applicable_methods_list PARAMS ((int, tree, tree, tree,
135 static tree find_most_specific_methods_list PARAMS ((tree));
136 static int argument_types_convertible PARAMS ((tree, tree));
137 static tree patch_invoke PARAMS ((tree, tree, tree));
138 static int maybe_use_access_method PARAMS ((int, tree *, tree *));
139 static tree lookup_method_invoke PARAMS ((int, tree, tree, tree, tree));
140 static tree register_incomplete_type PARAMS ((int, tree, tree, tree));
141 static tree check_inner_circular_reference PARAMS ((tree, tree));
142 static tree check_circular_reference PARAMS ((tree));
143 static tree obtain_incomplete_type PARAMS ((tree));
144 static tree java_complete_lhs PARAMS ((tree));
145 static tree java_complete_tree PARAMS ((tree));
146 static tree maybe_generate_pre_expand_clinit PARAMS ((tree));
147 static int analyze_clinit_body PARAMS ((tree, tree));
148 static int maybe_yank_clinit PARAMS ((tree));
149 static void start_complete_expand_method PARAMS ((tree));
150 static void java_complete_expand_method PARAMS ((tree));
151 static void java_expand_method_bodies PARAMS ((tree));
152 static int unresolved_type_p PARAMS ((tree, tree *));
153 static void create_jdep_list PARAMS ((struct parser_ctxt *));
154 static tree build_expr_block PARAMS ((tree, tree));
155 static tree enter_block PARAMS ((void));
156 static tree exit_block PARAMS ((void));
157 static tree lookup_name_in_blocks PARAMS ((tree));
158 static void maybe_absorb_scoping_blocks PARAMS ((void));
159 static tree build_method_invocation PARAMS ((tree, tree));
160 static tree build_new_invocation PARAMS ((tree, tree));
161 static tree build_assignment PARAMS ((int, int, tree, tree));
162 static tree build_binop PARAMS ((enum tree_code, int, tree, tree));
163 static tree patch_assignment PARAMS ((tree, tree));
164 static tree patch_binop PARAMS ((tree, tree, tree));
165 static tree build_unaryop PARAMS ((int, int, tree));
166 static tree build_incdec PARAMS ((int, int, tree, int));
167 static tree patch_unaryop PARAMS ((tree, tree));
168 static tree build_cast PARAMS ((int, tree, tree));
169 static tree build_null_of_type PARAMS ((tree));
170 static tree patch_cast PARAMS ((tree, tree));
171 static int valid_ref_assignconv_cast_p PARAMS ((tree, tree, int));
172 static int valid_builtin_assignconv_identity_widening_p PARAMS ((tree, tree));
173 static int valid_cast_to_p PARAMS ((tree, tree));
174 static int valid_method_invocation_conversion_p PARAMS ((tree, tree));
175 static tree try_builtin_assignconv PARAMS ((tree, tree, tree));
176 static tree try_reference_assignconv PARAMS ((tree, tree));
177 static tree build_unresolved_array_type PARAMS ((tree));
178 static int build_type_name_from_array_name PARAMS ((tree, tree *));
179 static tree build_array_from_name PARAMS ((tree, tree, tree, tree *));
180 static tree build_array_ref PARAMS ((int, tree, tree));
181 static tree patch_array_ref PARAMS ((tree));
182 static tree make_qualified_name PARAMS ((tree, tree, int));
183 static tree merge_qualified_name PARAMS ((tree, tree));
184 static tree make_qualified_primary PARAMS ((tree, tree, int));
185 static int resolve_qualified_expression_name PARAMS ((tree, tree *,
187 static void qualify_ambiguous_name PARAMS ((tree));
188 static tree resolve_field_access PARAMS ((tree, tree *, tree *));
189 static tree build_newarray_node PARAMS ((tree, tree, int));
190 static tree patch_newarray PARAMS ((tree));
191 static tree resolve_type_during_patch PARAMS ((tree));
192 static tree build_this PARAMS ((int));
193 static tree build_wfl_wrap PARAMS ((tree, int));
194 static tree build_return PARAMS ((int, tree));
195 static tree patch_return PARAMS ((tree));
196 static tree maybe_access_field PARAMS ((tree, tree, tree));
197 static int complete_function_arguments PARAMS ((tree));
198 static int check_for_static_method_reference PARAMS ((tree, tree, tree,
200 static int not_accessible_p PARAMS ((tree, tree, tree, int));
201 static void check_deprecation PARAMS ((tree, tree));
202 static int class_in_current_package PARAMS ((tree));
203 static tree build_if_else_statement PARAMS ((int, tree, tree, tree));
204 static tree patch_if_else_statement PARAMS ((tree));
205 static tree add_stmt_to_compound PARAMS ((tree, tree, tree));
206 static tree add_stmt_to_block PARAMS ((tree, tree, tree));
207 static tree patch_exit_expr PARAMS ((tree));
208 static tree build_labeled_block PARAMS ((int, tree));
209 static tree finish_labeled_statement PARAMS ((tree, tree));
210 static tree build_bc_statement PARAMS ((int, int, tree));
211 static tree patch_bc_statement PARAMS ((tree));
212 static tree patch_loop_statement PARAMS ((tree));
213 static tree build_new_loop PARAMS ((tree));
214 static tree build_loop_body PARAMS ((int, tree, int));
215 static tree finish_loop_body PARAMS ((int, tree, tree, int));
216 static tree build_debugable_stmt PARAMS ((int, tree));
217 static tree finish_for_loop PARAMS ((int, tree, tree, tree));
218 static tree patch_switch_statement PARAMS ((tree));
219 static tree string_constant_concatenation PARAMS ((tree, tree));
220 static tree build_string_concatenation PARAMS ((tree, tree));
221 static tree patch_string_cst PARAMS ((tree));
222 static tree patch_string PARAMS ((tree));
223 static tree encapsulate_with_try_catch PARAMS ((int, tree, tree, tree));
224 static tree build_assertion PARAMS ((int, tree, tree));
225 static tree build_try_statement PARAMS ((int, tree, tree));
226 static tree build_try_finally_statement PARAMS ((int, tree, tree));
227 static tree patch_try_statement PARAMS ((tree));
228 static tree patch_synchronized_statement PARAMS ((tree, tree));
229 static tree patch_throw_statement PARAMS ((tree, tree));
230 static void check_thrown_exceptions PARAMS ((int, tree));
231 static int check_thrown_exceptions_do PARAMS ((tree));
232 static void purge_unchecked_exceptions PARAMS ((tree));
233 static bool ctors_unchecked_throws_clause_p PARAMS ((tree));
234 static void check_throws_clauses PARAMS ((tree, tree, tree));
235 static void finish_method_declaration PARAMS ((tree));
236 static tree build_super_invocation PARAMS ((tree));
237 static int verify_constructor_circularity PARAMS ((tree, tree));
238 static char *constructor_circularity_msg PARAMS ((tree, tree));
239 static tree build_this_super_qualified_invocation PARAMS ((int, tree, tree,
241 static const char *get_printable_method_name PARAMS ((tree));
242 static tree patch_conditional_expr PARAMS ((tree, tree, tree));
243 static tree generate_finit PARAMS ((tree));
244 static tree generate_instinit PARAMS ((tree));
245 static tree build_instinit_invocation PARAMS ((tree));
246 static void fix_constructors PARAMS ((tree));
247 static tree build_alias_initializer_parameter_list PARAMS ((int, tree,
249 static tree craft_constructor PARAMS ((tree, tree));
250 static int verify_constructor_super PARAMS ((tree));
251 static tree create_artificial_method PARAMS ((tree, int, tree, tree, tree));
252 static void start_artificial_method_body PARAMS ((tree));
253 static void end_artificial_method_body PARAMS ((tree));
254 static int check_method_redefinition PARAMS ((tree, tree));
255 static int check_method_types_complete PARAMS ((tree));
256 static void java_check_regular_methods PARAMS ((tree));
257 static void java_check_abstract_methods PARAMS ((tree));
258 static void unreachable_stmt_error PARAMS ((tree));
259 static tree find_expr_with_wfl PARAMS ((tree));
260 static void missing_return_error PARAMS ((tree));
261 static tree build_new_array_init PARAMS ((int, tree));
262 static tree patch_new_array_init PARAMS ((tree, tree));
263 static tree maybe_build_array_element_wfl PARAMS ((tree));
264 static int array_constructor_check_entry PARAMS ((tree, tree));
265 static const char *purify_type_name PARAMS ((const char *));
266 static tree fold_constant_for_init PARAMS ((tree, tree));
267 static tree strip_out_static_field_access_decl PARAMS ((tree));
268 static jdeplist *reverse_jdep_list PARAMS ((struct parser_ctxt *));
269 static void static_ref_err PARAMS ((tree, tree, tree));
270 static void parser_add_interface PARAMS ((tree, tree, tree));
271 static void add_superinterfaces PARAMS ((tree, tree));
272 static tree jdep_resolve_class PARAMS ((jdep *));
273 static int note_possible_classname PARAMS ((const char *, int));
274 static void java_complete_expand_classes PARAMS ((void));
275 static void java_complete_expand_class PARAMS ((tree));
276 static void java_complete_expand_methods PARAMS ((tree));
277 static tree cut_identifier_in_qualified PARAMS ((tree));
278 static tree java_stabilize_reference PARAMS ((tree));
279 static tree do_unary_numeric_promotion PARAMS ((tree));
280 static char * operator_string PARAMS ((tree));
281 static tree do_merge_string_cste PARAMS ((tree, const char *, int, int));
282 static tree merge_string_cste PARAMS ((tree, tree, int));
283 static tree java_refold PARAMS ((tree));
284 static int java_decl_equiv PARAMS ((tree, tree));
285 static int binop_compound_p PARAMS ((enum tree_code));
286 static tree search_loop PARAMS ((tree));
287 static int labeled_block_contains_loop_p PARAMS ((tree, tree));
288 static int check_abstract_method_definitions PARAMS ((int, tree, tree));
289 static void java_check_abstract_method_definitions PARAMS ((tree));
290 static void java_debug_context_do PARAMS ((int));
291 static void java_parser_context_push_initialized_field PARAMS ((void));
292 static void java_parser_context_pop_initialized_field PARAMS ((void));
293 static tree reorder_static_initialized PARAMS ((tree));
294 static void java_parser_context_suspend PARAMS ((void));
295 static void java_parser_context_resume PARAMS ((void));
296 static int pop_current_osb PARAMS ((struct parser_ctxt *));
298 /* JDK 1.1 work. FIXME */
300 static tree maybe_make_nested_class_name PARAMS ((tree));
301 static int make_nested_class_name PARAMS ((tree));
302 static void set_nested_class_simple_name_value PARAMS ((tree, int));
303 static void link_nested_class_to_enclosing PARAMS ((void));
304 static tree resolve_inner_class PARAMS ((htab_t, tree, tree *, tree *, tree));
305 static tree find_as_inner_class PARAMS ((tree, tree, tree));
306 static tree find_as_inner_class_do PARAMS ((tree, tree));
307 static int check_inner_class_redefinition PARAMS ((tree, tree));
309 static tree build_thisn_assign PARAMS ((void));
310 static tree build_current_thisn PARAMS ((tree));
311 static tree build_access_to_thisn PARAMS ((tree, tree, int));
312 static tree maybe_build_thisn_access_method PARAMS ((tree));
314 static tree build_outer_field_access PARAMS ((tree, tree));
315 static tree build_outer_field_access_methods PARAMS ((tree));
316 static tree build_outer_field_access_expr PARAMS ((int, tree, tree,
318 static tree build_outer_method_access_method PARAMS ((tree));
319 static tree build_new_access_id PARAMS ((void));
320 static tree build_outer_field_access_method PARAMS ((tree, tree, tree,
323 static int outer_field_access_p PARAMS ((tree, tree));
324 static int outer_field_expanded_access_p PARAMS ((tree, tree *,
326 static tree outer_field_access_fix PARAMS ((tree, tree, tree));
327 static tree build_incomplete_class_ref PARAMS ((int, tree));
328 static tree patch_incomplete_class_ref PARAMS ((tree));
329 static tree create_anonymous_class PARAMS ((int, tree));
330 static void patch_anonymous_class PARAMS ((tree, tree, tree));
331 static void add_inner_class_fields PARAMS ((tree, tree));
333 static tree build_dot_class_method PARAMS ((tree));
334 static tree build_dot_class_method_invocation PARAMS ((tree));
335 static void create_new_parser_context PARAMS ((int));
336 static void mark_parser_ctxt PARAMS ((void *));
337 static tree maybe_build_class_init_for_field PARAMS ((tree, tree));
339 static int attach_init_test_initialization_flags PARAMS ((PTR *, PTR));
340 static int emit_test_initialization PARAMS ((PTR *, PTR));
342 static char *string_convert_int_cst PARAMS ((tree));
344 /* Number of error found so far. */
345 int java_error_count;
346 /* Number of warning found so far. */
347 int java_warning_count;
348 /* Tell when not to fold, when doing xrefs */
350 /* Cyclic inheritance report, as it can be set by layout_class */
351 const char *cyclic_inheritance_report;
353 /* The current parser context */
354 struct parser_ctxt *ctxp;
356 /* List of things that were analyzed for which code will be generated */
357 struct parser_ctxt *ctxp_for_generation = NULL;
359 /* binop_lookup maps token to tree_code. It is used where binary
360 operations are involved and required by the parser. RDIV_EXPR
361 covers both integral/floating point division. The code is changed
362 once the type of both operator is worked out. */
364 static const enum tree_code binop_lookup[19] =
366 PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR,
367 LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR,
368 BIT_AND_EXPR, BIT_XOR_EXPR, BIT_IOR_EXPR,
369 TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR,
370 EQ_EXPR, NE_EXPR, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR,
372 #define BINOP_LOOKUP(VALUE) \
373 binop_lookup [((VALUE) - PLUS_TK) % ARRAY_SIZE (binop_lookup)]
375 /* This is the end index for binary operators that can also be used
376 in compound assignements. */
377 #define BINOP_COMPOUND_CANDIDATES 11
379 /* The "$L" identifier we use to create labels. */
380 static GTY(()) tree label_id;
382 /* The "StringBuffer" identifier used for the String `+' operator. */
383 static GTY(()) tree wfl_string_buffer;
385 /* The "append" identifier used for String `+' operator. */
386 static GTY(()) tree wfl_append;
388 /* The "toString" identifier used for String `+' operator. */
389 static GTY(()) tree wfl_to_string;
391 /* The "java.lang" import qualified name. */
392 static GTY(()) tree java_lang_id;
394 /* The generated `inst$' identifier used for generated enclosing
395 instance/field access functions. */
396 static GTY(()) tree inst_id;
398 /* The "java.lang.Cloneable" qualified name. */
399 static GTY(()) tree java_lang_cloneable;
401 /* The "java.io.Serializable" qualified name. */
402 static GTY(()) tree java_io_serializable;
404 /* Context and flag for static blocks */
405 static GTY(()) tree current_static_block;
407 /* The generated `write_parm_value$' identifier. */
408 static GTY(()) tree wpv_id;
410 /* The list of all packages we've seen so far */
411 static GTY(()) tree package_list;
413 /* Hold THIS for the scope of the current method decl. */
414 static GTY(()) tree current_this;
416 /* Hold a list of catch clauses list. The first element of this list is
417 the list of the catch clauses of the currently analysed try block. */
418 static GTY(()) tree currently_caught_type_list;
420 /* This holds a linked list of all the case labels for the current
421 switch statement. It is only used when checking to see if there
422 are duplicate labels. FIXME: probably this should just be attached
423 to the switch itself; then it could be referenced via
424 `ctxp->current_loop'. */
425 static GTY(()) tree case_label_list;
427 /* Anonymous class counter. Will be reset to 1 every time a non
428 anonymous class gets created. */
429 static int anonymous_class_counter = 1;
431 static GTY(()) tree src_parse_roots[1];
433 /* All classes seen from source code */
434 #define gclass_list src_parse_roots[0]
436 /* Check modifiers. If one doesn't fit, retrieve it in its declaration
437 line and point it out. */
438 /* Should point out the one that don't fit. ASCII/unicode, going
441 #define check_modifiers(__message, __value, __mask) do { \
442 if ((__value) & ~(__mask)) \
444 size_t i, remainder = (__value) & ~(__mask); \
445 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++) \
446 if ((1 << i) & remainder) \
447 parse_error_context (ctxp->modifier_ctx [i], (__message), \
448 java_accstring_lookup (1 << i)); \
470 /* Things defined here have to match the order of what's in the
471 binop_lookup table. */
473 %token PLUS_TK MINUS_TK MULT_TK DIV_TK REM_TK
474 %token LS_TK SRS_TK ZRS_TK
475 %token AND_TK XOR_TK OR_TK
476 %token BOOL_AND_TK BOOL_OR_TK
477 %token EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
479 /* This maps to the same binop_lookup entry than the token above */
481 %token PLUS_ASSIGN_TK MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
483 %token LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
484 %token AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
487 /* Modifier TOKEN have to be kept in this order. Don't scramble it */
489 %token PUBLIC_TK PRIVATE_TK PROTECTED_TK
490 %token STATIC_TK FINAL_TK SYNCHRONIZED_TK
491 %token VOLATILE_TK TRANSIENT_TK NATIVE_TK
492 %token PAD_TK ABSTRACT_TK STRICT_TK
495 /* Keep those two in order, too */
496 %token DECR_TK INCR_TK
498 /* From now one, things can be in any order */
500 %token DEFAULT_TK IF_TK THROW_TK
501 %token BOOLEAN_TK DO_TK IMPLEMENTS_TK
502 %token THROWS_TK BREAK_TK IMPORT_TK
503 %token ELSE_TK INSTANCEOF_TK RETURN_TK
504 %token VOID_TK CATCH_TK INTERFACE_TK
505 %token CASE_TK EXTENDS_TK FINALLY_TK
506 %token SUPER_TK WHILE_TK CLASS_TK
507 %token SWITCH_TK CONST_TK TRY_TK
508 %token FOR_TK NEW_TK CONTINUE_TK
509 %token GOTO_TK PACKAGE_TK THIS_TK
512 %token BYTE_TK SHORT_TK INT_TK LONG_TK
513 %token CHAR_TK INTEGRAL_TK
515 %token FLOAT_TK DOUBLE_TK FP_TK
519 %token REL_QM_TK REL_CL_TK NOT_TK NEG_TK
521 %token ASSIGN_ANY_TK ASSIGN_TK
522 %token OP_TK CP_TK OCB_TK CCB_TK OSB_TK CSB_TK SC_TK C_TK DOT_TK
524 %token STRING_LIT_TK CHAR_LIT_TK INT_LIT_TK FP_LIT_TK
525 %token TRUE_TK FALSE_TK BOOL_LIT_TK NULL_TK
527 %type <value> modifiers MODIFIER_TK final synchronized
529 %type <node> super ID_TK identifier
530 %type <node> name simple_name qualified_name
531 %type <node> type_declaration compilation_unit
532 field_declaration method_declaration extends_interfaces
533 interfaces interface_type_list
534 import_declarations package_declaration
535 type_declarations interface_body
536 interface_member_declaration constant_declaration
537 interface_member_declarations interface_type
538 abstract_method_declaration
539 %type <node> class_body_declaration class_member_declaration
540 static_initializer constructor_declaration block
541 %type <node> class_body_declarations constructor_header
542 %type <node> class_or_interface_type class_type class_type_list
543 constructor_declarator explicit_constructor_invocation
544 %type <node> dim_expr dim_exprs this_or_super throws
546 %type <node> variable_declarator_id variable_declarator
547 variable_declarators variable_initializer
548 variable_initializers constructor_body
551 %type <node> class_body block_end constructor_block_end
552 %type <node> statement statement_without_trailing_substatement
553 labeled_statement if_then_statement label_decl
554 if_then_else_statement while_statement for_statement
555 statement_nsi labeled_statement_nsi do_statement
556 if_then_else_statement_nsi while_statement_nsi
557 for_statement_nsi statement_expression_list for_init
558 for_update statement_expression expression_statement
559 primary_no_new_array expression primary
560 array_creation_expression array_type
561 class_instance_creation_expression field_access
562 method_invocation array_access something_dot_new
563 argument_list postfix_expression while_expression
564 post_increment_expression post_decrement_expression
565 unary_expression_not_plus_minus unary_expression
566 pre_increment_expression pre_decrement_expression
568 multiplicative_expression additive_expression
569 shift_expression relational_expression
570 equality_expression and_expression
571 exclusive_or_expression inclusive_or_expression
572 conditional_and_expression conditional_or_expression
573 conditional_expression assignment_expression
574 left_hand_side assignment for_header for_begin
575 constant_expression do_statement_begin empty_statement
576 switch_statement synchronized_statement throw_statement
577 try_statement assert_statement
578 switch_expression switch_block
579 catches catch_clause catch_clause_parameter finally
580 anonymous_class_creation trap_overflow_corner_case
581 %type <node> return_statement break_statement continue_statement
583 %type <operator> ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
584 %type <operator> REM_ASSIGN_TK PLUS_ASSIGN_TK MINUS_ASSIGN_TK
585 %type <operator> LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
586 %type <operator> AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
587 %type <operator> ASSIGN_ANY_TK assignment_operator
588 %token <operator> EQ_TK GTE_TK ZRS_TK SRS_TK GT_TK LTE_TK LS_TK
589 %token <operator> BOOL_AND_TK AND_TK BOOL_OR_TK OR_TK INCR_TK PLUS_TK
590 %token <operator> DECR_TK MINUS_TK MULT_TK DIV_TK XOR_TK REM_TK NEQ_TK
591 %token <operator> NEG_TK REL_QM_TK REL_CL_TK NOT_TK LT_TK OCB_TK CCB_TK
592 %token <operator> OP_TK OSB_TK DOT_TK THROW_TK INSTANCEOF_TK
593 %type <operator> THIS_TK SUPER_TK RETURN_TK BREAK_TK CONTINUE_TK
594 %type <operator> CASE_TK DEFAULT_TK TRY_TK CATCH_TK SYNCHRONIZED_TK
595 %type <operator> NEW_TK ASSERT_TK
597 %type <node> method_body
599 %type <node> literal INT_LIT_TK FP_LIT_TK BOOL_LIT_TK CHAR_LIT_TK
600 STRING_LIT_TK NULL_TK VOID_TK
602 %type <node> IF_TK WHILE_TK FOR_TK
604 %type <node> formal_parameter_list formal_parameter
605 method_declarator method_header
607 %type <node> primitive_type reference_type type
608 BOOLEAN_TK INTEGRAL_TK FP_TK
610 /* Added or modified JDK 1.1 rule types */
611 %type <node> type_literals
614 /* 19.2 Production from 2.3: The Syntactic Grammar */
617 /* Register static variables with the garbage
619 ggc_add_root (&ctxp, 1,
620 sizeof (struct parser_ctxt *),
622 ggc_add_root (&ctxp_for_generation, 1,
623 sizeof (struct parser_ctxt *),
630 /* 19.3 Productions from 3: Lexical structure */
640 /* 19.4 Productions from 4: Types, Values and Variables */
653 class_or_interface_type
657 class_or_interface_type:
662 class_or_interface_type /* Default rule */
666 class_or_interface_type
672 int osb = pop_current_osb (ctxp);
673 tree t = build_java_array_type (($1), -1);
675 t = build_unresolved_array_type (t);
680 int osb = pop_current_osb (ctxp);
683 t = build_unresolved_array_type (t);
688 /* 19.5 Productions from 6: Names */
690 simple_name /* Default rule */
691 | qualified_name /* Default rule */
695 identifier /* Default rule */
699 name DOT_TK identifier
700 { $$ = make_qualified_name ($1, $3, $2.location); }
707 /* 19.6: Production from 7: Packages */
710 | package_declaration
711 | import_declarations
713 | package_declaration import_declarations
714 | package_declaration type_declarations
715 | import_declarations type_declarations
716 | package_declaration import_declarations type_declarations
724 | import_declarations import_declaration
732 | type_declarations type_declaration
736 PACKAGE_TK name SC_TK
738 ctxp->package = EXPR_WFL_NODE ($2);
739 register_package (ctxp->package);
742 {yyerror ("Missing name"); RECOVER;}
743 | PACKAGE_TK name error
744 {yyerror ("';' expected"); RECOVER;}
748 single_type_import_declaration
749 | type_import_on_demand_declaration
752 single_type_import_declaration:
755 tree name = EXPR_WFL_NODE ($2), last_name;
756 int i = IDENTIFIER_LENGTH (name)-1;
757 const char *last = &IDENTIFIER_POINTER (name)[i];
758 while (last != IDENTIFIER_POINTER (name))
764 last_name = get_identifier (++last);
765 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (last_name))
767 tree err = find_name_in_single_imports (last_name);
768 if (err && err != name)
770 ($2, "Ambiguous class: `%s' and `%s'",
771 IDENTIFIER_POINTER (name),
772 IDENTIFIER_POINTER (err));
774 REGISTER_IMPORT ($2, last_name);
777 REGISTER_IMPORT ($2, last_name);
780 {yyerror ("Missing name"); RECOVER;}
781 | IMPORT_TK name error
782 {yyerror ("';' expected"); RECOVER;}
785 type_import_on_demand_declaration:
786 IMPORT_TK name DOT_TK MULT_TK SC_TK
788 tree name = EXPR_WFL_NODE ($2);
790 /* Search for duplicates. */
791 for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it))
792 if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name)
794 /* Don't import the same thing more than once, just ignore
795 duplicates (7.5.2) */
798 read_import_dir ($2);
799 ctxp->import_demand_list =
800 chainon (ctxp->import_demand_list,
801 build_tree_list ($2, NULL_TREE));
804 | IMPORT_TK name DOT_TK error
805 {yyerror ("'*' expected"); RECOVER;}
806 | IMPORT_TK name DOT_TK MULT_TK error
807 {yyerror ("';' expected"); RECOVER;}
812 { end_class_declaration (0); }
813 | interface_declaration
814 { end_class_declaration (0); }
819 yyerror ("Class or interface declaration expected");
823 /* 19.7 Shortened from the original:
824 modifiers: modifier | modifiers modifier
825 modifier: any of public... */
831 | modifiers MODIFIER_TK
836 (ctxp->modifier_ctx [$2], "Modifier `%s' declared twice",
837 java_accstring_lookup (acc));
845 /* 19.8.1 Production from $8.1: Class Declaration */
847 modifiers CLASS_TK identifier super interfaces
848 { create_class ($1, $3, $4, $5); }
851 | CLASS_TK identifier super interfaces
852 { create_class (0, $2, $3, $4); }
855 | modifiers CLASS_TK error
856 { yyerror ("Missing class name"); RECOVER; }
858 { yyerror ("Missing class name"); RECOVER; }
859 | CLASS_TK identifier error
861 if (!ctxp->class_err) yyerror ("'{' expected");
864 | modifiers CLASS_TK identifier error
865 { if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER; }
870 | EXTENDS_TK class_type
872 | EXTENDS_TK class_type error
873 {yyerror ("'{' expected"); ctxp->class_err=1;}
875 {yyerror ("Missing super class name"); ctxp->class_err=1;}
880 | IMPLEMENTS_TK interface_type_list
882 | IMPLEMENTS_TK error
885 yyerror ("Missing interface name");
892 ctxp->interface_number = 1;
893 $$ = build_tree_list ($1, NULL_TREE);
895 | interface_type_list C_TK interface_type
897 ctxp->interface_number++;
898 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
900 | interface_type_list C_TK error
901 {yyerror ("Missing interface name"); RECOVER;}
907 /* Store the location of the `}' when doing xrefs */
909 DECL_END_SOURCE_LINE (GET_CPC ()) =
910 EXPR_WFL_ADD_COL ($2.location, 1);
913 | OCB_TK class_body_declarations CCB_TK
915 /* Store the location of the `}' when doing xrefs */
917 DECL_END_SOURCE_LINE (GET_CPC ()) =
918 EXPR_WFL_ADD_COL ($3.location, 1);
923 class_body_declarations:
924 class_body_declaration
925 | class_body_declarations class_body_declaration
928 class_body_declaration:
929 class_member_declaration
931 | constructor_declaration
932 | block /* Added, JDK1.1, instance initializer */
934 if ($1 != empty_stmt_node)
936 TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
937 SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
942 class_member_declaration:
945 | class_declaration /* Added, JDK1.1 inner classes */
946 { end_class_declaration (1); }
947 | interface_declaration /* Added, JDK1.1 inner interfaces */
948 { end_class_declaration (1); }
952 /* 19.8.2 Productions from 8.3: Field Declarations */
954 type variable_declarators SC_TK
955 { register_fields (0, $1, $2); }
956 | modifiers type variable_declarators SC_TK
959 ("Illegal modifier `%s' for field declaration",
960 $1, FIELD_MODIFIERS);
961 check_modifiers_consistency ($1);
962 register_fields ($1, $2, $3);
966 variable_declarators:
967 /* Should we use build_decl_list () instead ? FIXME */
968 variable_declarator /* Default rule */
969 | variable_declarators C_TK variable_declarator
970 { $$ = chainon ($1, $3); }
971 | variable_declarators C_TK error
972 {yyerror ("Missing term"); RECOVER;}
976 variable_declarator_id
977 { $$ = build_tree_list ($1, NULL_TREE); }
978 | variable_declarator_id ASSIGN_TK variable_initializer
980 if (java_error_count)
983 ($1, build_assignment ($2.token, $2.location, $1, $3));
985 | variable_declarator_id ASSIGN_TK error
987 yyerror ("Missing variable initializer");
988 $$ = build_tree_list ($1, NULL_TREE);
991 | variable_declarator_id ASSIGN_TK variable_initializer error
993 yyerror ("';' expected");
994 $$ = build_tree_list ($1, NULL_TREE);
999 variable_declarator_id:
1001 | variable_declarator_id OSB_TK CSB_TK
1002 { $$ = build_unresolved_array_type ($1); }
1004 {yyerror ("Invalid declaration"); DRECOVER(vdi);}
1005 | variable_declarator_id OSB_TK error
1007 tree node = java_lval.node;
1008 if (node && (TREE_CODE (node) == INTEGER_CST
1009 || TREE_CODE (node) == EXPR_WITH_FILE_LOCATION))
1010 yyerror ("Can't specify array dimension in a declaration");
1012 yyerror ("']' expected");
1015 | variable_declarator_id CSB_TK error
1016 {yyerror ("Unbalanced ']'"); DRECOVER(vdi);}
1019 variable_initializer:
1024 /* 19.8.3 Productions from 8.4: Method Declarations */
1028 current_function_decl = $1;
1029 if (current_function_decl
1030 && TREE_CODE (current_function_decl) == FUNCTION_DECL)
1031 source_start_java_method (current_function_decl);
1033 current_function_decl = NULL_TREE;
1036 { finish_method_declaration ($3); }
1037 | method_header error
1038 {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;}
1042 type method_declarator throws
1043 { $$ = method_header (0, $1, $2, $3); }
1044 | VOID_TK method_declarator throws
1045 { $$ = method_header (0, void_type_node, $2, $3); }
1046 | modifiers type method_declarator throws
1047 { $$ = method_header ($1, $2, $3, $4); }
1048 | modifiers VOID_TK method_declarator throws
1049 { $$ = method_header ($1, void_type_node, $3, $4); }
1052 yyerror ("Invalid method declaration, method name required");
1055 | modifiers type error
1057 yyerror ("Identifier expected");
1062 yyerror ("Identifier expected");
1065 | modifiers VOID_TK error
1067 yyerror ("Identifier expected");
1072 yyerror ("Invalid method declaration, return type required");
1078 identifier OP_TK CP_TK
1080 ctxp->formal_parameter_number = 0;
1081 $$ = method_declarator ($1, NULL_TREE);
1083 | identifier OP_TK formal_parameter_list CP_TK
1084 { $$ = method_declarator ($1, $3); }
1085 | method_declarator OSB_TK CSB_TK
1087 EXPR_WFL_LINECOL (wfl_operator) = $2.location;
1089 build_unresolved_array_type (TREE_PURPOSE ($1));
1090 parse_warning_context
1092 "Discouraged form of returned type specification");
1094 | identifier OP_TK error
1095 {yyerror ("')' expected"); DRECOVER(method_declarator);}
1096 | method_declarator OSB_TK error
1097 {yyerror ("']' expected"); RECOVER;}
1100 formal_parameter_list:
1103 ctxp->formal_parameter_number = 1;
1105 | formal_parameter_list C_TK formal_parameter
1107 ctxp->formal_parameter_number += 1;
1108 $$ = chainon ($1, $3);
1110 | formal_parameter_list C_TK error
1111 { yyerror ("Missing formal parameter term"); RECOVER; }
1115 type variable_declarator_id
1117 $$ = build_tree_list ($2, $1);
1119 | final type variable_declarator_id /* Added, JDK1.1 final parms */
1121 $$ = build_tree_list ($3, $2);
1122 ARG_FINAL_P ($$) = 1;
1126 yyerror ("Missing identifier"); RECOVER;
1131 yyerror ("Missing identifier"); RECOVER;
1139 check_modifiers ("Illegal modifier `%s'. Only `final' was expected here",
1141 if ($1 != ACC_FINAL)
1142 MODIFIER_WFL (FINAL_TK) = build_wfl_node (NULL_TREE);
1148 | THROWS_TK class_type_list
1151 {yyerror ("Missing class type term"); RECOVER;}
1156 { $$ = build_tree_list ($1, $1); }
1157 | class_type_list C_TK class_type
1158 { $$ = tree_cons ($3, $3, $1); }
1159 | class_type_list C_TK error
1160 {yyerror ("Missing class type term"); RECOVER;}
1165 | SC_TK { $$ = NULL_TREE; }
1168 /* 19.8.4 Productions from 8.5: Static Initializers */
1172 TREE_CHAIN ($2) = CPC_STATIC_INITIALIZER_STMT (ctxp);
1173 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, $2);
1174 current_static_block = NULL_TREE;
1178 static: /* Test lval.sub_token here */
1181 check_modifiers ("Illegal modifier `%s' for static initializer", $1, ACC_STATIC);
1182 /* Can't have a static initializer in an innerclass */
1183 if ($1 | ACC_STATIC &&
1184 GET_CPC_LIST () && !TOPLEVEL_CLASS_DECL_P (GET_CPC ()))
1186 (MODIFIER_WFL (STATIC_TK),
1187 "Can't define static initializer in class `%s'. Static initializer can only be defined in top-level classes",
1188 IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())));
1189 SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
1193 /* 19.8.5 Productions from 8.6: Constructor Declarations */
1194 constructor_declaration:
1197 current_function_decl = $1;
1198 source_start_java_method (current_function_decl);
1201 { finish_method_declaration ($3); }
1205 constructor_declarator throws
1206 { $$ = method_header (0, NULL_TREE, $1, $2); }
1207 | modifiers constructor_declarator throws
1208 { $$ = method_header ($1, NULL_TREE, $2, $3); }
1211 constructor_declarator:
1212 simple_name OP_TK CP_TK
1214 ctxp->formal_parameter_number = 0;
1215 $$ = method_declarator ($1, NULL_TREE);
1217 | simple_name OP_TK formal_parameter_list CP_TK
1218 { $$ = method_declarator ($1, $3); }
1222 /* Unlike regular method, we always need a complete (empty)
1223 body so we can safely perform all the required code
1224 addition (super invocation and field initialization) */
1225 block_begin constructor_block_end
1227 BLOCK_EXPR_BODY ($2) = empty_stmt_node;
1230 | block_begin explicit_constructor_invocation constructor_block_end
1232 | block_begin block_statements constructor_block_end
1234 | block_begin explicit_constructor_invocation block_statements constructor_block_end
1238 constructor_block_end:
1242 /* Error recovery for that rule moved down expression_statement: rule. */
1243 explicit_constructor_invocation:
1244 this_or_super OP_TK CP_TK SC_TK
1246 $$ = build_method_invocation ($1, NULL_TREE);
1247 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1248 $$ = java_method_add_stmt (current_function_decl, $$);
1250 | this_or_super OP_TK argument_list CP_TK SC_TK
1252 $$ = build_method_invocation ($1, $3);
1253 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1254 $$ = java_method_add_stmt (current_function_decl, $$);
1256 /* Added, JDK1.1 inner classes. Modified because the rule
1257 'primary' couldn't work. */
1258 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
1259 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1260 | name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
1261 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1264 this_or_super: /* Added, simplifies error diagnostics */
1267 tree wfl = build_wfl_node (this_identifier_node);
1268 EXPR_WFL_LINECOL (wfl) = $1.location;
1273 tree wfl = build_wfl_node (super_identifier_node);
1274 EXPR_WFL_LINECOL (wfl) = $1.location;
1279 /* 19.9 Productions from 9: Interfaces */
1280 /* 19.9.1 Productions from 9.1: Interfaces Declarations */
1281 interface_declaration:
1282 INTERFACE_TK identifier
1283 { create_interface (0, $2, NULL_TREE); }
1286 | modifiers INTERFACE_TK identifier
1287 { create_interface ($1, $3, NULL_TREE); }
1290 | INTERFACE_TK identifier extends_interfaces
1291 { create_interface (0, $2, $3); }
1294 | modifiers INTERFACE_TK identifier extends_interfaces
1295 { create_interface ($1, $3, $4); }
1298 | INTERFACE_TK identifier error
1299 { yyerror ("'{' expected"); RECOVER; }
1300 | modifiers INTERFACE_TK identifier error
1301 { yyerror ("'{' expected"); RECOVER; }
1305 EXTENDS_TK interface_type
1307 ctxp->interface_number = 1;
1308 $$ = build_tree_list ($2, NULL_TREE);
1310 | extends_interfaces C_TK interface_type
1312 ctxp->interface_number++;
1313 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
1316 {yyerror ("Invalid interface type"); RECOVER;}
1317 | extends_interfaces C_TK error
1318 {yyerror ("Missing term"); RECOVER;}
1324 | OCB_TK interface_member_declarations CCB_TK
1328 interface_member_declarations:
1329 interface_member_declaration
1330 | interface_member_declarations interface_member_declaration
1333 interface_member_declaration:
1334 constant_declaration
1335 | abstract_method_declaration
1336 | class_declaration /* Added, JDK1.1 inner classes */
1337 { end_class_declaration (1); }
1338 | interface_declaration /* Added, JDK1.1 inner interfaces */
1339 { end_class_declaration (1); }
1342 constant_declaration:
1346 abstract_method_declaration:
1349 check_abstract_method_header ($1);
1350 current_function_decl = NULL_TREE; /* FIXME ? */
1352 | method_header error
1353 {yyerror ("';' expected"); RECOVER;}
1356 /* 19.10 Productions from 10: Arrays */
1359 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1360 | OCB_TK C_TK CCB_TK
1361 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1362 | OCB_TK variable_initializers CCB_TK
1363 { $$ = build_new_array_init ($1.location, $2); }
1364 | OCB_TK variable_initializers C_TK CCB_TK
1365 { $$ = build_new_array_init ($1.location, $2); }
1368 variable_initializers:
1369 variable_initializer
1371 $$ = tree_cons (maybe_build_array_element_wfl ($1),
1374 | variable_initializers C_TK variable_initializer
1376 $$ = tree_cons (maybe_build_array_element_wfl ($3), $3, $1);
1378 | variable_initializers C_TK error
1379 {yyerror ("Missing term"); RECOVER;}
1382 /* 19.11 Production from 14: Blocks and Statements */
1386 /* Store the location of the `}' when doing xrefs */
1387 if (current_function_decl && flag_emit_xref)
1388 DECL_END_SOURCE_LINE (current_function_decl) =
1389 EXPR_WFL_ADD_COL ($2.location, 1);
1390 $$ = empty_stmt_node;
1392 | block_begin block_statements block_end
1404 maybe_absorb_scoping_blocks ();
1405 /* Store the location of the `}' when doing xrefs */
1406 if (current_function_decl && flag_emit_xref)
1407 DECL_END_SOURCE_LINE (current_function_decl) =
1408 EXPR_WFL_ADD_COL ($1.location, 1);
1410 if (!BLOCK_SUBBLOCKS ($$))
1411 BLOCK_SUBBLOCKS ($$) = empty_stmt_node;
1417 | block_statements block_statement
1421 local_variable_declaration_statement
1423 { java_method_add_stmt (current_function_decl, $1); }
1424 | class_declaration /* Added, JDK1.1 local classes */
1426 LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1;
1427 end_class_declaration (1);
1431 local_variable_declaration_statement:
1432 local_variable_declaration SC_TK /* Can't catch missing ';' here */
1435 local_variable_declaration:
1436 type variable_declarators
1437 { declare_local_variables (0, $1, $2); }
1438 | final type variable_declarators /* Added, JDK1.1 final locals */
1439 { declare_local_variables ($1, $2, $3); }
1443 statement_without_trailing_substatement
1446 | if_then_else_statement
1449 { $$ = exit_block (); }
1453 statement_without_trailing_substatement
1454 | labeled_statement_nsi
1455 | if_then_else_statement_nsi
1456 | while_statement_nsi
1458 { $$ = exit_block (); }
1461 statement_without_trailing_substatement:
1464 | expression_statement
1468 | continue_statement
1470 | synchronized_statement
1479 if (flag_extraneous_semicolon
1480 && ! current_static_block
1481 && (! current_function_decl ||
1482 /* Verify we're not in a inner class declaration */
1483 (GET_CPC () != TYPE_NAME
1484 (DECL_CONTEXT (current_function_decl)))))
1487 EXPR_WFL_SET_LINECOL (wfl_operator, lineno, -1);
1488 parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used");
1490 $$ = empty_stmt_node;
1495 identifier REL_CL_TK
1497 $$ = build_labeled_block (EXPR_WFL_LINECOL ($1),
1498 EXPR_WFL_NODE ($1));
1500 push_labeled_block ($$);
1501 PUSH_LABELED_BLOCK ($$);
1506 label_decl statement
1507 { $$ = finish_labeled_statement ($1, $2); }
1509 {yyerror ("':' expected"); RECOVER;}
1512 labeled_statement_nsi:
1513 label_decl statement_nsi
1514 { $$ = finish_labeled_statement ($1, $2); }
1517 /* We concentrate here a bunch of error handling rules that we couldn't write
1518 earlier, because expression_statement catches a missing ';'. */
1519 expression_statement:
1520 statement_expression SC_TK
1522 /* We have a statement. Generate a WFL around it so
1524 $$ = build_expr_wfl ($1, input_filename, lineno, 0);
1525 /* We know we have a statement, so set the debug
1526 info to be eventually generate here. */
1527 $$ = JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
1531 YYNOT_TWICE yyerror ("Invalid expression statement");
1532 DRECOVER (expr_stmt);
1536 YYNOT_TWICE yyerror ("Invalid expression statement");
1537 DRECOVER (expr_stmt);
1541 YYNOT_TWICE yyerror ("Invalid expression statement");
1542 DRECOVER (expr_stmt);
1544 | this_or_super OP_TK error
1545 {yyerror ("')' expected"); RECOVER;}
1546 | this_or_super OP_TK CP_TK error
1548 parse_ctor_invocation_error ();
1551 | this_or_super OP_TK argument_list error
1552 {yyerror ("')' expected"); RECOVER;}
1553 | this_or_super OP_TK argument_list CP_TK error
1555 parse_ctor_invocation_error ();
1558 | name DOT_TK SUPER_TK error
1559 {yyerror ("'(' expected"); RECOVER;}
1560 | name DOT_TK SUPER_TK OP_TK error
1561 {yyerror ("')' expected"); RECOVER;}
1562 | name DOT_TK SUPER_TK OP_TK argument_list error
1563 {yyerror ("')' expected"); RECOVER;}
1564 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK error
1565 {yyerror ("';' expected"); RECOVER;}
1566 | name DOT_TK SUPER_TK OP_TK CP_TK error
1567 {yyerror ("';' expected"); RECOVER;}
1570 statement_expression:
1572 | pre_increment_expression
1573 | pre_decrement_expression
1574 | post_increment_expression
1575 | post_decrement_expression
1577 | class_instance_creation_expression
1581 IF_TK OP_TK expression CP_TK statement
1583 $$ = build_if_else_statement ($2.location, $3,
1587 {yyerror ("'(' expected"); RECOVER;}
1589 {yyerror ("Missing term"); RECOVER;}
1590 | IF_TK OP_TK expression error
1591 {yyerror ("')' expected"); RECOVER;}
1594 if_then_else_statement:
1595 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
1596 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1599 if_then_else_statement_nsi:
1600 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
1601 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1611 /* Make into "proper list" of COMPOUND_EXPRs.
1612 I.e. make the last statement also have its own
1614 maybe_absorb_scoping_blocks ();
1615 TREE_OPERAND ($1, 1) = exit_block ();
1616 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $1);
1621 SWITCH_TK OP_TK expression CP_TK
1623 $$ = build (SWITCH_EXPR, NULL_TREE, $3, NULL_TREE);
1624 EXPR_WFL_LINECOL ($$) = $2.location;
1627 {yyerror ("'(' expected"); RECOVER;}
1628 | SWITCH_TK OP_TK error
1629 {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);}
1630 | SWITCH_TK OP_TK expression CP_TK error
1631 {yyerror ("'{' expected"); RECOVER;}
1634 /* Default assignment is there to avoid type node on switch_block
1640 | OCB_TK switch_labels CCB_TK
1642 | OCB_TK switch_block_statement_groups CCB_TK
1644 | OCB_TK switch_block_statement_groups switch_labels CCB_TK
1648 switch_block_statement_groups:
1649 switch_block_statement_group
1650 | switch_block_statement_groups switch_block_statement_group
1653 switch_block_statement_group:
1654 switch_labels block_statements
1659 | switch_labels switch_label
1663 CASE_TK constant_expression REL_CL_TK
1665 tree lab = build1 (CASE_EXPR, NULL_TREE, $2);
1666 EXPR_WFL_LINECOL (lab) = $1.location;
1667 java_method_add_stmt (current_function_decl, lab);
1669 | DEFAULT_TK REL_CL_TK
1671 tree lab = build (DEFAULT_EXPR, NULL_TREE, NULL_TREE);
1672 EXPR_WFL_LINECOL (lab) = $1.location;
1673 java_method_add_stmt (current_function_decl, lab);
1676 {yyerror ("Missing or invalid constant expression"); RECOVER;}
1677 | CASE_TK constant_expression error
1678 {yyerror ("':' expected"); RECOVER;}
1680 {yyerror ("':' expected"); RECOVER;}
1684 WHILE_TK OP_TK expression CP_TK
1686 tree body = build_loop_body ($2.location, $3, 0);
1687 $$ = build_new_loop (body);
1692 while_expression statement
1693 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1695 {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;}
1696 | WHILE_TK OP_TK error
1697 {yyerror ("Missing term and ')' expected"); RECOVER;}
1698 | WHILE_TK OP_TK expression error
1699 {yyerror ("')' expected"); RECOVER;}
1702 while_statement_nsi:
1703 while_expression statement_nsi
1704 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1710 tree body = build_loop_body (0, NULL_TREE, 1);
1711 $$ = build_new_loop (body);
1713 /* Need error handing here. FIXME */
1717 do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1718 { $$ = finish_loop_body ($4.location, $5, $2, 1); }
1722 for_begin SC_TK expression SC_TK for_update CP_TK statement
1724 if (TREE_CODE_CLASS (TREE_CODE ($3)) == 'c')
1725 $3 = build_wfl_node ($3);
1726 $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);
1728 | for_begin SC_TK SC_TK for_update CP_TK statement
1730 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1731 /* We have not condition, so we get rid of the EXIT_EXPR */
1732 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1735 | for_begin SC_TK error
1736 {yyerror ("Invalid control expression"); RECOVER;}
1737 | for_begin SC_TK expression SC_TK error
1738 {yyerror ("Invalid update expression"); RECOVER;}
1739 | for_begin SC_TK SC_TK error
1740 {yyerror ("Invalid update expression"); RECOVER;}
1744 for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
1745 { $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);}
1746 | for_begin SC_TK SC_TK for_update CP_TK statement_nsi
1748 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1749 /* We have not condition, so we get rid of the EXIT_EXPR */
1750 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1758 /* This scope defined for local variable that may be
1759 defined within the scope of the for loop */
1763 {yyerror ("'(' expected"); DRECOVER(for_1);}
1764 | FOR_TK OP_TK error
1765 {yyerror ("Invalid init statement"); RECOVER;}
1771 /* We now declare the loop body. The loop is
1772 declared as a for loop. */
1773 tree body = build_loop_body (0, NULL_TREE, 0);
1774 $$ = build_new_loop (body);
1775 FOR_LOOP_P ($$) = 1;
1776 /* The loop is added to the current block the for
1777 statement is defined within */
1778 java_method_add_stmt (current_function_decl, $$);
1781 for_init: /* Can be empty */
1782 { $$ = empty_stmt_node; }
1783 | statement_expression_list
1785 /* Init statement recorded within the previously
1786 defined block scope */
1787 $$ = java_method_add_stmt (current_function_decl, $1);
1789 | local_variable_declaration
1791 /* Local variable are recorded within the previously
1792 defined block scope */
1795 | statement_expression_list error
1796 {yyerror ("';' expected"); DRECOVER(for_init_1);}
1799 for_update: /* Can be empty */
1800 {$$ = empty_stmt_node;}
1801 | statement_expression_list
1802 { $$ = build_debugable_stmt (BUILD_LOCATION (), $1); }
1805 statement_expression_list:
1806 statement_expression
1807 { $$ = add_stmt_to_compound (NULL_TREE, NULL_TREE, $1); }
1808 | statement_expression_list C_TK statement_expression
1809 { $$ = add_stmt_to_compound ($1, NULL_TREE, $3); }
1810 | statement_expression_list C_TK error
1811 {yyerror ("Missing term"); RECOVER;}
1816 { $$ = build_bc_statement ($1.location, 1, NULL_TREE); }
1817 | BREAK_TK identifier SC_TK
1818 { $$ = build_bc_statement ($1.location, 1, $2); }
1820 {yyerror ("Missing term"); RECOVER;}
1821 | BREAK_TK identifier error
1822 {yyerror ("';' expected"); RECOVER;}
1827 { $$ = build_bc_statement ($1.location, 0, NULL_TREE); }
1828 | CONTINUE_TK identifier SC_TK
1829 { $$ = build_bc_statement ($1.location, 0, $2); }
1831 {yyerror ("Missing term"); RECOVER;}
1832 | CONTINUE_TK identifier error
1833 {yyerror ("';' expected"); RECOVER;}
1838 { $$ = build_return ($1.location, NULL_TREE); }
1839 | RETURN_TK expression SC_TK
1840 { $$ = build_return ($1.location, $2); }
1842 {yyerror ("Missing term"); RECOVER;}
1843 | RETURN_TK expression error
1844 {yyerror ("';' expected"); RECOVER;}
1848 THROW_TK expression SC_TK
1850 $$ = build1 (THROW_EXPR, NULL_TREE, $2);
1851 EXPR_WFL_LINECOL ($$) = $1.location;
1854 {yyerror ("Missing term"); RECOVER;}
1855 | THROW_TK expression error
1856 {yyerror ("';' expected"); RECOVER;}
1860 ASSERT_TK expression REL_CL_TK expression SC_TK
1862 $$ = build_assertion ($1.location, $2, $4);
1864 | ASSERT_TK expression SC_TK
1866 $$ = build_assertion ($1.location, $2, NULL_TREE);
1869 {yyerror ("Missing term"); RECOVER;}
1870 | ASSERT_TK expression error
1871 {yyerror ("';' expected"); RECOVER;}
1874 synchronized_statement:
1875 synchronized OP_TK expression CP_TK block
1877 $$ = build (SYNCHRONIZED_EXPR, NULL_TREE, $3, $5);
1878 EXPR_WFL_LINECOL ($$) =
1879 EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK));
1881 | synchronized OP_TK expression CP_TK error
1882 {yyerror ("'{' expected"); RECOVER;}
1883 | synchronized error
1884 {yyerror ("'(' expected"); RECOVER;}
1885 | synchronized OP_TK error CP_TK
1886 {yyerror ("Missing term"); RECOVER;}
1887 | synchronized OP_TK error
1888 {yyerror ("Missing term"); RECOVER;}
1895 "Illegal modifier `%s'. Only `synchronized' was expected here",
1896 $1, ACC_SYNCHRONIZED);
1897 if ($1 != ACC_SYNCHRONIZED)
1898 MODIFIER_WFL (SYNCHRONIZED_TK) =
1899 build_wfl_node (NULL_TREE);
1904 TRY_TK block catches
1905 { $$ = build_try_statement ($1.location, $2, $3); }
1906 | TRY_TK block finally
1907 { $$ = build_try_finally_statement ($1.location, $2, $3); }
1908 | TRY_TK block catches finally
1909 { $$ = build_try_finally_statement
1910 ($1.location, build_try_statement ($1.location,
1914 {yyerror ("'{' expected"); DRECOVER (try_statement);}
1919 | catches catch_clause
1921 TREE_CHAIN ($2) = $1;
1927 catch_clause_parameter block
1929 java_method_add_stmt (current_function_decl, $2);
1935 catch_clause_parameter:
1936 CATCH_TK OP_TK formal_parameter CP_TK
1938 /* We add a block to define a scope for
1939 formal_parameter (CCBP). The formal parameter is
1940 declared initialized by the appropriate function
1942 tree ccpb = enter_block ();
1943 tree init = build_assignment
1944 (ASSIGN_TK, $2.location, TREE_PURPOSE ($3),
1945 build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
1946 declare_local_variables (0, TREE_VALUE ($3),
1947 build_tree_list (TREE_PURPOSE ($3),
1949 $$ = build1 (CATCH_EXPR, NULL_TREE, ccpb);
1950 EXPR_WFL_LINECOL ($$) = $1.location;
1953 {yyerror ("'(' expected"); RECOVER; $$ = NULL_TREE;}
1954 | CATCH_TK OP_TK error
1956 yyerror ("Missing term or ')' expected");
1957 RECOVER; $$ = NULL_TREE;
1959 | CATCH_TK OP_TK error CP_TK /* That's for () */
1960 {yyerror ("Missing term"); RECOVER; $$ = NULL_TREE;}
1967 {yyerror ("'{' expected"); RECOVER; }
1970 /* 19.12 Production from 15: Expressions */
1972 primary_no_new_array
1973 | array_creation_expression
1976 primary_no_new_array:
1979 { $$ = build_this ($1.location); }
1980 | OP_TK expression CP_TK
1982 | class_instance_creation_expression
1987 /* Added, JDK1.1 inner classes. Documentation is wrong
1988 refering to a 'ClassName' (class_name) rule that doesn't
1989 exist. Used name: instead. */
1990 | name DOT_TK THIS_TK
1992 tree wfl = build_wfl_node (this_identifier_node);
1993 $$ = make_qualified_primary ($1, wfl, EXPR_WFL_LINECOL ($1));
1995 | OP_TK expression error
1996 {yyerror ("')' expected"); RECOVER;}
1998 {yyerror ("'class' or 'this' expected" ); RECOVER;}
1999 | primitive_type DOT_TK error
2000 {yyerror ("'class' expected" ); RECOVER;}
2001 | VOID_TK DOT_TK error
2002 {yyerror ("'class' expected" ); RECOVER;}
2006 name DOT_TK CLASS_TK
2007 { $$ = build_incomplete_class_ref ($2.location, $1); }
2008 | array_type DOT_TK CLASS_TK
2009 { $$ = build_incomplete_class_ref ($2.location, $1); }
2010 | primitive_type DOT_TK CLASS_TK
2011 { $$ = build_incomplete_class_ref ($2.location, $1); }
2012 | VOID_TK DOT_TK CLASS_TK
2014 $$ = build_incomplete_class_ref ($2.location,
2019 class_instance_creation_expression:
2020 NEW_TK class_type OP_TK argument_list CP_TK
2021 { $$ = build_new_invocation ($2, $4); }
2022 | NEW_TK class_type OP_TK CP_TK
2023 { $$ = build_new_invocation ($2, NULL_TREE); }
2024 | anonymous_class_creation
2025 /* Added, JDK1.1 inner classes, modified to use name or
2026 primary instead of primary solely which couldn't work in
2028 | something_dot_new identifier OP_TK CP_TK
2030 tree ctor = build_new_invocation ($2, NULL_TREE);
2031 $$ = make_qualified_primary ($1, ctor,
2032 EXPR_WFL_LINECOL ($1));
2034 | something_dot_new identifier OP_TK CP_TK class_body
2035 | something_dot_new identifier OP_TK argument_list CP_TK
2037 tree ctor = build_new_invocation ($2, $4);
2038 $$ = make_qualified_primary ($1, ctor,
2039 EXPR_WFL_LINECOL ($1));
2041 | something_dot_new identifier OP_TK argument_list CP_TK class_body
2042 | NEW_TK error SC_TK
2043 {yyerror ("'(' expected"); DRECOVER(new_1);}
2044 | NEW_TK class_type error
2045 {yyerror ("'(' expected"); RECOVER;}
2046 | NEW_TK class_type OP_TK error
2047 {yyerror ("')' or term expected"); RECOVER;}
2048 | NEW_TK class_type OP_TK argument_list error
2049 {yyerror ("')' expected"); RECOVER;}
2050 | something_dot_new error
2051 {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;}
2052 | something_dot_new identifier error
2053 {yyerror ("'(' expected"); RECOVER;}
2056 /* Created after JDK1.1 rules originally added to
2057 class_instance_creation_expression, but modified to use
2058 'class_type' instead of 'TypeName' (type_name) which is mentionned
2059 in the documentation but doesn't exist. */
2061 anonymous_class_creation:
2062 NEW_TK class_type OP_TK argument_list CP_TK
2063 { create_anonymous_class ($1.location, $2); }
2066 tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2067 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2069 end_class_declaration (1);
2071 /* Now we can craft the new expression */
2072 $$ = build_new_invocation (id, $4);
2074 /* Note that we can't possibly be here if
2075 `class_type' is an interface (in which case the
2076 anonymous class extends Object and implements
2077 `class_type', hence its constructor can't have
2080 /* Otherwise, the innerclass must feature a
2081 constructor matching `argument_list'. Anonymous
2082 classes are a bit special: it's impossible to
2083 define constructor for them, hence constructors
2084 must be generated following the hints provided by
2085 the `new' expression. Whether a super constructor
2086 of that nature exists or not is to be verified
2087 later on in verify_constructor_super.
2089 It's during the expansion of a `new' statement
2090 refering to an anonymous class that a ctor will
2091 be generated for the anonymous class, with the
2095 | NEW_TK class_type OP_TK CP_TK
2096 { create_anonymous_class ($1.location, $2); }
2099 tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2100 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2102 end_class_declaration (1);
2104 /* Now we can craft the new expression. The
2105 statement doesn't need to be remember so that a
2106 constructor can be generated, since its signature
2107 is already known. */
2108 $$ = build_new_invocation (id, NULL_TREE);
2112 something_dot_new: /* Added, not part of the specs. */
2115 | primary DOT_TK NEW_TK
2122 $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
2123 ctxp->formal_parameter_number = 1;
2125 | argument_list C_TK expression
2127 ctxp->formal_parameter_number += 1;
2128 $$ = tree_cons (NULL_TREE, $3, $1);
2130 | argument_list C_TK error
2131 {yyerror ("Missing term"); RECOVER;}
2134 array_creation_expression:
2135 NEW_TK primitive_type dim_exprs
2136 { $$ = build_newarray_node ($2, $3, 0); }
2137 | NEW_TK class_or_interface_type dim_exprs
2138 { $$ = build_newarray_node ($2, $3, 0); }
2139 | NEW_TK primitive_type dim_exprs dims
2140 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2141 | NEW_TK class_or_interface_type dim_exprs dims
2142 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2143 /* Added, JDK1.1 anonymous array. Initial documentation rule
2145 | NEW_TK class_or_interface_type dims array_initializer
2148 int osb = pop_current_osb (ctxp);
2150 obstack_grow (&temporary_obstack, "[]", 2);
2151 obstack_1grow (&temporary_obstack, '\0');
2152 sig = obstack_finish (&temporary_obstack);
2153 $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2154 $2, get_identifier (sig), $4);
2156 | NEW_TK primitive_type dims array_initializer
2158 int osb = pop_current_osb (ctxp);
2161 type = build_java_array_type (type, -1);
2162 $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2163 build_pointer_type (type), NULL_TREE, $4);
2165 | NEW_TK error CSB_TK
2166 {yyerror ("'[' expected"); DRECOVER ("]");}
2167 | NEW_TK error OSB_TK
2168 {yyerror ("']' expected"); RECOVER;}
2173 { $$ = build_tree_list (NULL_TREE, $1); }
2174 | dim_exprs dim_expr
2175 { $$ = tree_cons (NULL_TREE, $2, $$); }
2179 OSB_TK expression CSB_TK
2181 if (JNUMERIC_TYPE_P (TREE_TYPE ($2)))
2183 $2 = build_wfl_node ($2);
2184 TREE_TYPE ($2) = NULL_TREE;
2186 EXPR_WFL_LINECOL ($2) = $1.location;
2189 | OSB_TK expression error
2190 {yyerror ("']' expected"); RECOVER;}
2193 yyerror ("Missing term");
2194 yyerror ("']' expected");
2203 /* If not initialized, allocate memory for the osb
2205 if (!ctxp->osb_limit)
2207 allocate = ctxp->osb_limit = 32;
2208 ctxp->osb_depth = -1;
2210 /* If capacity overflown, reallocate a bigger chunk */
2211 else if (ctxp->osb_depth+1 == ctxp->osb_limit)
2212 allocate = ctxp->osb_limit << 1;
2216 allocate *= sizeof (int);
2217 if (ctxp->osb_number)
2218 ctxp->osb_number = (int *)xrealloc (ctxp->osb_number,
2221 ctxp->osb_number = (int *)xmalloc (allocate);
2224 CURRENT_OSB (ctxp) = 1;
2226 | dims OSB_TK CSB_TK
2227 { CURRENT_OSB (ctxp)++; }
2229 { yyerror ("']' expected"); RECOVER;}
2233 primary DOT_TK identifier
2234 { $$ = make_qualified_primary ($1, $3, $2.location); }
2235 /* FIXME - REWRITE TO:
2236 { $$ = build_binop (COMPONENT_REF, $2.location, $1, $3); } */
2237 | SUPER_TK DOT_TK identifier
2239 tree super_wfl = build_wfl_node (super_identifier_node);
2240 EXPR_WFL_LINECOL (super_wfl) = $1.location;
2241 $$ = make_qualified_name (super_wfl, $3, $2.location);
2244 {yyerror ("Field expected"); DRECOVER (super_field_acces);}
2249 { $$ = build_method_invocation ($1, NULL_TREE); }
2250 | name OP_TK argument_list CP_TK
2251 { $$ = build_method_invocation ($1, $3); }
2252 | primary DOT_TK identifier OP_TK CP_TK
2254 if (TREE_CODE ($1) == THIS_EXPR)
2255 $$ = build_this_super_qualified_invocation
2256 (1, $3, NULL_TREE, 0, $2.location);
2259 tree invok = build_method_invocation ($3, NULL_TREE);
2260 $$ = make_qualified_primary ($1, invok, $2.location);
2263 | primary DOT_TK identifier OP_TK argument_list CP_TK
2265 if (TREE_CODE ($1) == THIS_EXPR)
2266 $$ = build_this_super_qualified_invocation
2267 (1, $3, $5, 0, $2.location);
2270 tree invok = build_method_invocation ($3, $5);
2271 $$ = make_qualified_primary ($1, invok, $2.location);
2274 | SUPER_TK DOT_TK identifier OP_TK CP_TK
2276 $$ = build_this_super_qualified_invocation
2277 (0, $3, NULL_TREE, $1.location, $2.location);
2279 | SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
2281 $$ = build_this_super_qualified_invocation
2282 (0, $3, $5, $1.location, $2.location);
2284 /* Screws up thing. I let it here until I'm convinced it can
2286 | primary DOT_TK error
2287 {yyerror ("'(' expected"); DRECOVER(bad);} */
2288 | SUPER_TK DOT_TK error CP_TK
2289 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2290 | SUPER_TK DOT_TK error DOT_TK
2291 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2295 name OSB_TK expression CSB_TK
2296 { $$ = build_array_ref ($2.location, $1, $3); }
2297 | primary_no_new_array OSB_TK expression CSB_TK
2298 { $$ = build_array_ref ($2.location, $1, $3); }
2301 yyerror ("Missing term and ']' expected");
2302 DRECOVER(array_access);
2304 | name OSB_TK expression error
2306 yyerror ("']' expected");
2307 DRECOVER(array_access);
2309 | primary_no_new_array OSB_TK error
2311 yyerror ("Missing term and ']' expected");
2312 DRECOVER(array_access);
2314 | primary_no_new_array OSB_TK expression error
2316 yyerror ("']' expected");
2317 DRECOVER(array_access);
2324 | post_increment_expression
2325 | post_decrement_expression
2328 post_increment_expression:
2329 postfix_expression INCR_TK
2330 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2333 post_decrement_expression:
2334 postfix_expression DECR_TK
2335 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2338 trap_overflow_corner_case:
2339 pre_increment_expression
2340 | pre_decrement_expression
2341 | PLUS_TK unary_expression
2342 {$$ = build_unaryop ($1.token, $1.location, $2); }
2343 | unary_expression_not_plus_minus
2345 {yyerror ("Missing term"); RECOVER}
2349 trap_overflow_corner_case
2351 error_if_numeric_overflow ($1);
2354 | MINUS_TK trap_overflow_corner_case
2355 {$$ = build_unaryop ($1.token, $1.location, $2); }
2357 {yyerror ("Missing term"); RECOVER}
2360 pre_increment_expression:
2361 INCR_TK unary_expression
2362 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2364 {yyerror ("Missing term"); RECOVER}
2367 pre_decrement_expression:
2368 DECR_TK unary_expression
2369 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2371 {yyerror ("Missing term"); RECOVER}
2374 unary_expression_not_plus_minus:
2376 | NOT_TK unary_expression
2377 {$$ = build_unaryop ($1.token, $1.location, $2); }
2378 | NEG_TK unary_expression
2379 {$$ = build_unaryop ($1.token, $1.location, $2); }
2382 {yyerror ("Missing term"); RECOVER}
2384 {yyerror ("Missing term"); RECOVER}
2387 cast_expression: /* Error handling here is potentially weak */
2388 OP_TK primitive_type dims CP_TK unary_expression
2391 int osb = pop_current_osb (ctxp);
2393 type = build_java_array_type (type, -1);
2394 $$ = build_cast ($1.location, type, $5);
2396 | OP_TK primitive_type CP_TK unary_expression
2397 { $$ = build_cast ($1.location, $2, $4); }
2398 | OP_TK expression CP_TK unary_expression_not_plus_minus
2399 { $$ = build_cast ($1.location, $2, $4); }
2400 | OP_TK name dims CP_TK unary_expression_not_plus_minus
2403 int osb = pop_current_osb (ctxp);
2404 obstack_grow (&temporary_obstack,
2405 IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)),
2406 IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2)));
2408 obstack_grow (&temporary_obstack, "[]", 2);
2409 obstack_1grow (&temporary_obstack, '\0');
2410 ptr = obstack_finish (&temporary_obstack);
2411 EXPR_WFL_NODE ($2) = get_identifier (ptr);
2412 $$ = build_cast ($1.location, $2, $5);
2414 | OP_TK primitive_type OSB_TK error
2415 {yyerror ("']' expected, invalid type expression");}
2418 YYNOT_TWICE yyerror ("Invalid type expression"); RECOVER;
2421 | OP_TK primitive_type dims CP_TK error
2422 {yyerror ("Missing term"); RECOVER;}
2423 | OP_TK primitive_type CP_TK error
2424 {yyerror ("Missing term"); RECOVER;}
2425 | OP_TK name dims CP_TK error
2426 {yyerror ("Missing term"); RECOVER;}
2429 multiplicative_expression:
2431 | multiplicative_expression MULT_TK unary_expression
2433 $$ = build_binop (BINOP_LOOKUP ($2.token),
2434 $2.location, $1, $3);
2436 | multiplicative_expression DIV_TK unary_expression
2438 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2441 | multiplicative_expression REM_TK unary_expression
2443 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2446 | multiplicative_expression MULT_TK error
2447 {yyerror ("Missing term"); RECOVER;}
2448 | multiplicative_expression DIV_TK error
2449 {yyerror ("Missing term"); RECOVER;}
2450 | multiplicative_expression REM_TK error
2451 {yyerror ("Missing term"); RECOVER;}
2454 additive_expression:
2455 multiplicative_expression
2456 | additive_expression PLUS_TK multiplicative_expression
2458 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2461 | additive_expression MINUS_TK multiplicative_expression
2463 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2466 | additive_expression PLUS_TK error
2467 {yyerror ("Missing term"); RECOVER;}
2468 | additive_expression MINUS_TK error
2469 {yyerror ("Missing term"); RECOVER;}
2474 | shift_expression LS_TK additive_expression
2476 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2479 | shift_expression SRS_TK additive_expression
2481 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2484 | shift_expression ZRS_TK additive_expression
2486 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2489 | shift_expression LS_TK error
2490 {yyerror ("Missing term"); RECOVER;}
2491 | shift_expression SRS_TK error
2492 {yyerror ("Missing term"); RECOVER;}
2493 | shift_expression ZRS_TK error
2494 {yyerror ("Missing term"); RECOVER;}
2497 relational_expression:
2499 | relational_expression LT_TK shift_expression
2501 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2504 | relational_expression GT_TK shift_expression
2506 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2509 | relational_expression LTE_TK shift_expression
2511 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2514 | relational_expression GTE_TK shift_expression
2516 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2519 | relational_expression INSTANCEOF_TK reference_type
2520 { $$ = build_binop (INSTANCEOF_EXPR, $2.location, $1, $3); }
2521 | relational_expression LT_TK error
2522 {yyerror ("Missing term"); RECOVER;}
2523 | relational_expression GT_TK error
2524 {yyerror ("Missing term"); RECOVER;}
2525 | relational_expression LTE_TK error
2526 {yyerror ("Missing term"); RECOVER;}
2527 | relational_expression GTE_TK error
2528 {yyerror ("Missing term"); RECOVER;}
2529 | relational_expression INSTANCEOF_TK error
2530 {yyerror ("Invalid reference type"); RECOVER;}
2533 equality_expression:
2534 relational_expression
2535 | equality_expression EQ_TK relational_expression
2537 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2540 | equality_expression NEQ_TK relational_expression
2542 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2545 | equality_expression EQ_TK error
2546 {yyerror ("Missing term"); RECOVER;}
2547 | equality_expression NEQ_TK error
2548 {yyerror ("Missing term"); RECOVER;}
2553 | and_expression AND_TK equality_expression
2555 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2558 | and_expression AND_TK error
2559 {yyerror ("Missing term"); RECOVER;}
2562 exclusive_or_expression:
2564 | exclusive_or_expression XOR_TK and_expression
2566 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2569 | exclusive_or_expression XOR_TK error
2570 {yyerror ("Missing term"); RECOVER;}
2573 inclusive_or_expression:
2574 exclusive_or_expression
2575 | inclusive_or_expression OR_TK exclusive_or_expression
2577 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2580 | inclusive_or_expression OR_TK error
2581 {yyerror ("Missing term"); RECOVER;}
2584 conditional_and_expression:
2585 inclusive_or_expression
2586 | conditional_and_expression BOOL_AND_TK inclusive_or_expression
2588 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2591 | conditional_and_expression BOOL_AND_TK error
2592 {yyerror ("Missing term"); RECOVER;}
2595 conditional_or_expression:
2596 conditional_and_expression
2597 | conditional_or_expression BOOL_OR_TK conditional_and_expression
2599 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2602 | conditional_or_expression BOOL_OR_TK error
2603 {yyerror ("Missing term"); RECOVER;}
2606 conditional_expression: /* Error handling here is weak */
2607 conditional_or_expression
2608 | conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
2610 $$ = build (CONDITIONAL_EXPR, NULL_TREE, $1, $3, $5);
2611 EXPR_WFL_LINECOL ($$) = $2.location;
2613 | conditional_or_expression REL_QM_TK REL_CL_TK error
2616 yyerror ("Missing term");
2619 | conditional_or_expression REL_QM_TK error
2620 {yyerror ("Missing term"); DRECOVER (2);}
2621 | conditional_or_expression REL_QM_TK expression REL_CL_TK error
2622 {yyerror ("Missing term"); DRECOVER (3);}
2625 assignment_expression:
2626 conditional_expression
2631 left_hand_side assignment_operator assignment_expression
2632 { $$ = build_assignment ($2.token, $2.location, $1, $3); }
2633 | left_hand_side assignment_operator error
2635 YYNOT_TWICE yyerror ("Missing term");
2646 assignment_operator:
2652 assignment_expression
2655 constant_expression:
2661 /* Helper function to retrieve an OSB count. Should be used when the
2662 `dims:' rule is being used. */
2665 pop_current_osb (ctxp)
2666 struct parser_ctxt *ctxp;
2670 if (ctxp->osb_depth < 0)
2673 to_return = CURRENT_OSB (ctxp);
2681 /* This section of the code deal with save/restoring parser contexts.
2682 Add mode documentation here. FIXME */
2684 /* Helper function. Create a new parser context. With
2685 COPY_FROM_PREVIOUS set to a non zero value, content of the previous
2686 context is copied, otherwise, the new context is zeroed. The newly
2687 created context becomes the current one. */
2690 create_new_parser_context (copy_from_previous)
2691 int copy_from_previous;
2693 struct parser_ctxt *new;
2695 new = (struct parser_ctxt *)xmalloc(sizeof (struct parser_ctxt));
2696 if (copy_from_previous)
2698 memcpy ((PTR)new, (PTR)ctxp, sizeof (struct parser_ctxt));
2699 new->saved_data_ctx = 1;
2702 memset ((PTR) new, 0, sizeof (struct parser_ctxt));
2708 /* Create a new parser context and make it the current one. */
2711 java_push_parser_context ()
2713 create_new_parser_context (0);
2717 java_pop_parser_context (generate)
2721 struct parser_ctxt *toFree, *next;
2730 lineno = ctxp->lineno;
2731 current_class = ctxp->class_type;
2734 /* If the old and new lexers differ, then free the old one. */
2735 if (ctxp->lexer && next && ctxp->lexer != next->lexer)
2736 java_destroy_lexer (ctxp->lexer);
2738 /* Set the single import class file flag to 0 for the current list
2739 of imported things */
2740 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2741 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 0;
2743 /* And restore those of the previous context */
2744 if ((ctxp = next)) /* Assignment is really meant here */
2745 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2746 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 1;
2748 /* If we pushed a context to parse a class intended to be generated,
2749 we keep it so we can remember the class. What we could actually
2750 do is to just update a list of class names. */
2753 toFree->next = ctxp_for_generation;
2754 ctxp_for_generation = toFree;
2760 /* Create a parser context for the use of saving some global
2764 java_parser_context_save_global ()
2768 java_push_parser_context ();
2769 ctxp->saved_data_ctx = 1;
2772 /* If this context already stores data, create a new one suitable
2773 for data storage. */
2774 else if (ctxp->saved_data)
2775 create_new_parser_context (1);
2777 ctxp->lineno = lineno;
2778 ctxp->class_type = current_class;
2779 ctxp->filename = input_filename;
2780 ctxp->function_decl = current_function_decl;
2781 ctxp->saved_data = 1;
2784 /* Restore some global variables from the previous context. Make the
2785 previous context the current one. */
2788 java_parser_context_restore_global ()
2790 lineno = ctxp->lineno;
2791 current_class = ctxp->class_type;
2792 input_filename = ctxp->filename;
2796 BUILD_FILENAME_IDENTIFIER_NODE (s, input_filename);
2797 EXPR_WFL_FILENAME_NODE (wfl_operator) = s;
2799 current_function_decl = ctxp->function_decl;
2800 ctxp->saved_data = 0;
2801 if (ctxp->saved_data_ctx)
2802 java_pop_parser_context (0);
2805 /* Suspend 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. */
2810 java_parser_context_suspend ()
2812 /* This makes debugging through java_debug_context easier */
2813 static const char *const name = "<inner buffer context>";
2815 /* Duplicate the previous context, use it to save the globals we're
2817 create_new_parser_context (1);
2818 ctxp->function_decl = current_function_decl;
2819 ctxp->class_type = current_class;
2821 /* Then create a new context which inherits all data from the
2822 previous one. This will be the new current context */
2823 create_new_parser_context (1);
2825 /* Help debugging */
2826 ctxp->next->filename = name;
2829 /* Resume vital data for the current class/function being parsed so
2830 that an other class can be parsed. Used to let local/anonymous
2831 classes be parsed. The trick is the data storing file position
2832 informations must be restored to their current value, so parsing
2833 can resume as if no context was ever saved. */
2836 java_parser_context_resume ()
2838 struct parser_ctxt *old = ctxp; /* This one is to be discarded */
2839 struct parser_ctxt *saver = old->next; /* This one contain saved info */
2840 struct parser_ctxt *restored = saver->next; /* This one is the old current */
2842 /* We need to inherit the list of classes to complete/generate */
2843 restored->classd_list = old->classd_list;
2844 restored->class_list = old->class_list;
2846 /* Restore the current class and function from the saver */
2847 current_class = saver->class_type;
2848 current_function_decl = saver->function_decl;
2850 /* Retrive the restored context */
2853 /* Re-installed the data for the parsing to carry on */
2854 memcpy (&ctxp->marker_begining, &old->marker_begining,
2855 (size_t)(&ctxp->marker_end - &ctxp->marker_begining));
2857 /* Buffer context can now be discarded */
2862 /* Add a new anchor node to which all statement(s) initializing static
2863 and non static initialized upon declaration field(s) will be
2867 java_parser_context_push_initialized_field ()
2871 node = build_tree_list (NULL_TREE, NULL_TREE);
2872 TREE_CHAIN (node) = CPC_STATIC_INITIALIZER_LIST (ctxp);
2873 CPC_STATIC_INITIALIZER_LIST (ctxp) = node;
2875 node = build_tree_list (NULL_TREE, NULL_TREE);
2876 TREE_CHAIN (node) = CPC_INITIALIZER_LIST (ctxp);
2877 CPC_INITIALIZER_LIST (ctxp) = node;
2879 node = build_tree_list (NULL_TREE, NULL_TREE);
2880 TREE_CHAIN (node) = CPC_INSTANCE_INITIALIZER_LIST (ctxp);
2881 CPC_INSTANCE_INITIALIZER_LIST (ctxp) = node;
2884 /* Pop the lists of initialized field. If this lists aren't empty,
2885 remember them so we can use it to create and populate the finit$
2886 or <clinit> functions. */
2889 java_parser_context_pop_initialized_field ()
2892 tree class_type = TREE_TYPE (GET_CPC ());
2894 if (CPC_INITIALIZER_LIST (ctxp))
2896 stmts = CPC_INITIALIZER_STMT (ctxp);
2897 CPC_INITIALIZER_LIST (ctxp) = TREE_CHAIN (CPC_INITIALIZER_LIST (ctxp));
2898 if (stmts && !java_error_count)
2899 TYPE_FINIT_STMT_LIST (class_type) = reorder_static_initialized (stmts);
2902 if (CPC_STATIC_INITIALIZER_LIST (ctxp))
2904 stmts = CPC_STATIC_INITIALIZER_STMT (ctxp);
2905 CPC_STATIC_INITIALIZER_LIST (ctxp) =
2906 TREE_CHAIN (CPC_STATIC_INITIALIZER_LIST (ctxp));
2907 /* Keep initialization in order to enforce 8.5 */
2908 if (stmts && !java_error_count)
2909 TYPE_CLINIT_STMT_LIST (class_type) = nreverse (stmts);
2912 /* JDK 1.1 instance initializers */
2913 if (CPC_INSTANCE_INITIALIZER_LIST (ctxp))
2915 stmts = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
2916 CPC_INSTANCE_INITIALIZER_LIST (ctxp) =
2917 TREE_CHAIN (CPC_INSTANCE_INITIALIZER_LIST (ctxp));
2918 if (stmts && !java_error_count)
2919 TYPE_II_STMT_LIST (class_type) = nreverse (stmts);
2924 reorder_static_initialized (list)
2927 /* We have to keep things in order. The alias initializer have to
2928 come first, then the initialized regular field, in reverse to
2929 keep them in lexical order. */
2930 tree marker, previous = NULL_TREE;
2931 for (marker = list; marker; previous = marker, marker = TREE_CHAIN (marker))
2932 if (TREE_CODE (marker) == TREE_LIST
2933 && !TREE_VALUE (marker) && !TREE_PURPOSE (marker))
2936 /* No static initialized, the list is fine as is */
2938 list = TREE_CHAIN (marker);
2940 /* No marker? reverse the whole list */
2942 list = nreverse (list);
2944 /* Otherwise, reverse what's after the marker and the new reordered
2945 sublist will replace the marker. */
2948 TREE_CHAIN (previous) = NULL_TREE;
2949 list = nreverse (list);
2950 list = chainon (TREE_CHAIN (marker), list);
2955 /* Helper functions to dump the parser context stack. */
2957 #define TAB_CONTEXT(C) \
2958 {int i; for (i = 0; i < (C); i++) fputc (' ', stderr);}
2961 java_debug_context_do (tab)
2964 struct parser_ctxt *copy = ctxp;
2968 fprintf (stderr, "ctxt: 0x%0lX\n", (unsigned long)copy);
2970 fprintf (stderr, "filename: %s\n", copy->filename);
2972 fprintf (stderr, "lineno: %d\n", copy->lineno);
2974 fprintf (stderr, "package: %s\n",
2976 IDENTIFIER_POINTER (copy->package) : "<none>"));
2978 fprintf (stderr, "context for saving: %d\n", copy->saved_data_ctx);
2980 fprintf (stderr, "saved data: %d\n", copy->saved_data);
2986 /* Dump the stacked up parser contexts. Intended to be called from a
2990 java_debug_context ()
2992 java_debug_context_do (0);
2997 /* Flag for the error report routine to issue the error the first time
2998 it's called (overriding the default behavior which is to drop the
2999 first invocation and honor the second one, taking advantage of a
3001 static int force_error = 0;
3003 /* Reporting an constructor invocation error. */
3005 parse_ctor_invocation_error ()
3007 if (DECL_CONSTRUCTOR_P (current_function_decl))
3008 yyerror ("Constructor invocation must be first thing in a constructor");
3010 yyerror ("Only constructors can invoke constructors");
3013 /* Reporting JDK1.1 features not implemented. */
3016 parse_jdk1_1_error (msg)
3019 sorry (": `%s' JDK1.1(TM) feature", msg);
3021 return empty_stmt_node;
3024 static int do_warning = 0;
3031 static int prev_lineno;
3032 static const char *prev_msg;
3035 char *remainder, *code_from_source;
3037 if (!force_error && prev_lineno == lineno)
3040 /* Save current error location but report latter, when the context is
3042 if (ctxp->java_error_flag == 0)
3044 ctxp->java_error_flag = 1;
3046 /* Do something to use the previous line if we're reaching the
3047 end of the file... */
3048 #ifdef VERBOSE_SKELETON
3049 printf ("* Error detected (%s)\n", (msg ? msg : "(null)"));
3054 /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
3055 if (!force_error && msg == prev_msg && prev_lineno == elc.line)
3058 ctxp->java_error_flag = 0;
3060 java_warning_count++;
3064 if (elc.col == 0 && msg && msg[1] == ';')
3066 elc.col = ctxp->p_line->char_col-1;
3067 elc.line = ctxp->p_line->lineno;
3070 save_lineno = lineno;
3071 prev_lineno = lineno = elc.line;
3074 code_from_source = java_get_line_col (ctxp->filename, elc.line, elc.col);
3075 obstack_grow0 (&temporary_obstack,
3076 code_from_source, strlen (code_from_source));
3077 remainder = obstack_finish (&temporary_obstack);
3079 warning ("%s.\n%s", msg, remainder);
3081 error ("%s.\n%s", msg, remainder);
3083 /* This allow us to cheaply avoid an extra 'Invalid expression
3084 statement' error report when errors have been already reported on
3085 the same line. This occurs when we report an error but don't have
3086 a synchronization point other than ';', which
3087 expression_statement is the only one to take care of. */
3088 ctxp->prevent_ese = lineno = save_lineno;
3092 issue_warning_error_from_context (cl, msg, ap)
3097 const char *saved, *saved_input_filename;
3099 vsprintf (buffer, msg, ap);
3102 ctxp->elc.line = EXPR_WFL_LINENO (cl);
3103 ctxp->elc.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1 :
3104 (EXPR_WFL_COLNO (cl) == 0xffe ? -2 : EXPR_WFL_COLNO (cl)));
3106 /* We have a CL, that's a good reason for using it if it contains data */
3107 saved = ctxp->filename;
3108 if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
3109 ctxp->filename = EXPR_WFL_FILENAME (cl);
3110 saved_input_filename = input_filename;
3111 input_filename = ctxp->filename;
3113 java_error (buffer);
3114 ctxp->filename = saved;
3115 input_filename = saved_input_filename;
3119 /* Issue an error message at a current source line CL */
3122 parse_error_context VPARAMS ((tree cl, const char *msg, ...))
3125 VA_FIXEDARG (ap, tree, cl);
3126 VA_FIXEDARG (ap, const char *, msg);
3127 issue_warning_error_from_context (cl, msg, ap);
3131 /* Issue a warning at a current source line CL */
3134 parse_warning_context VPARAMS ((tree cl, const char *msg, ...))
3137 VA_FIXEDARG (ap, tree, cl);
3138 VA_FIXEDARG (ap, const char *, msg);
3140 force_error = do_warning = 1;
3141 issue_warning_error_from_context (cl, msg, ap);
3142 do_warning = force_error = 0;
3147 find_expr_with_wfl (node)
3155 switch (TREE_CODE (node))
3158 node = BLOCK_EXPR_BODY (node);
3162 to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
3165 node = TREE_OPERAND (node, 1);
3169 node = TREE_OPERAND (node, 0);
3172 case LABELED_BLOCK_EXPR:
3173 node = TREE_OPERAND (node, 1);
3177 code = TREE_CODE_CLASS (TREE_CODE (node));
3178 if (((code == '1') || (code == '2') || (code == 'e'))
3179 && EXPR_WFL_LINECOL (node))
3187 /* Issue a missing return statement error. Uses METHOD to figure the
3188 last line of the method the error occurs in. */
3191 missing_return_error (method)
3194 EXPR_WFL_SET_LINECOL (wfl_operator, DECL_SOURCE_LINE_LAST (method), -2);
3195 parse_error_context (wfl_operator, "Missing return statement");
3198 /* Issue an unreachable statement error. From NODE, find the next
3199 statement to report appropriately. */
3201 unreachable_stmt_error (node)
3204 /* Browse node to find the next expression node that has a WFL. Use
3205 the location to report the error */
3206 if (TREE_CODE (node) == COMPOUND_EXPR)
3207 node = find_expr_with_wfl (TREE_OPERAND (node, 1));
3209 node = find_expr_with_wfl (node);
3213 EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
3214 parse_error_context (wfl_operator, "Unreachable statement");
3221 java_report_errors ()
3223 if (java_error_count)
3224 fprintf (stderr, "%d error%s",
3225 java_error_count, (java_error_count == 1 ? "" : "s"));
3226 if (java_warning_count)
3227 fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
3228 java_warning_count, (java_warning_count == 1 ? "" : "s"));
3229 if (java_error_count || java_warning_count)
3230 putc ('\n', stderr);
3231 return java_error_count;
3235 java_accstring_lookup (flags)
3238 static char buffer [80];
3239 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
3241 /* Access modifier looked-up first for easier report on forbidden
3243 if (flags & ACC_PUBLIC) COPY_RETURN ("public");
3244 if (flags & ACC_PRIVATE) COPY_RETURN ("private");
3245 if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
3246 if (flags & ACC_STATIC) COPY_RETURN ("static");
3247 if (flags & ACC_FINAL) COPY_RETURN ("final");
3248 if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
3249 if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
3250 if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
3251 if (flags & ACC_NATIVE) COPY_RETURN ("native");
3252 if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
3253 if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
3260 /* Issuing error messages upon redefinition of classes, interfaces or
3264 classitf_redefinition_error (context, id, decl, cl)
3265 const char *context;
3268 parse_error_context (cl, "%s `%s' already defined in %s:%d",
3269 context, IDENTIFIER_POINTER (id),
3270 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3271 /* Here we should point out where its redefined. It's a unicode. FIXME */
3275 variable_redefinition_error (context, name, type, line)
3276 tree context, name, type;
3279 const char *type_name;
3281 /* Figure a proper name for type. We might haven't resolved it */
3282 if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
3283 type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
3285 type_name = lang_printable_name (type, 0);
3287 parse_error_context (context,
3288 "Variable `%s' is already defined in this method and was declared `%s %s' at line %d",
3289 IDENTIFIER_POINTER (name),
3290 type_name, IDENTIFIER_POINTER (name), line);
3293 /* If ANAME is terminated with `[]', it indicates an array. This
3294 function returns the number of `[]' found and if this number is
3295 greater than zero, it extracts the array type name and places it in
3296 the node pointed to by TRIMMED unless TRIMMED is null. */
3299 build_type_name_from_array_name (aname, trimmed)
3303 const char *name = IDENTIFIER_POINTER (aname);
3304 int len = IDENTIFIER_LENGTH (aname);
3307 STRING_STRIP_BRACKETS (name, len, array_dims);
3309 if (array_dims && trimmed)
3310 *trimmed = get_identifier_with_length (name, len);
3316 build_array_from_name (type, type_wfl, name, ret_name)
3317 tree type, type_wfl, name, *ret_name;
3321 /* Eventually get more dims */
3322 more_dims = build_type_name_from_array_name (name, &name);
3324 /* If we have, then craft a new type for this variable */
3329 /* If we have a pointer, use its type */
3330 if (TREE_CODE (type) == POINTER_TYPE)
3331 type = TREE_TYPE (type);
3333 /* Building the first dimension of a primitive type uses this
3335 if (JPRIMITIVE_TYPE_P (type))
3337 type = build_java_array_type (type, -1);
3340 /* Otherwise, if we have a WFL for this type, use it (the type
3341 is already an array on an unresolved type, and we just keep
3342 on adding dimensions) */
3346 more_dims += build_type_name_from_array_name (TYPE_NAME (save),
3350 /* Add all the dimensions */
3352 type = build_unresolved_array_type (type);
3354 /* The type may have been incomplete in the first place */
3356 type = obtain_incomplete_type (type);
3364 /* Build something that the type identifier resolver will identify as
3365 being an array to an unresolved type. TYPE_WFL is a WFL on a
3369 build_unresolved_array_type (type_or_wfl)
3375 /* TYPE_OR_WFL might be an array on a resolved type. In this case,
3376 just create a array type */
3377 if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
3378 return build_java_array_type (type_or_wfl, -1);
3380 obstack_grow (&temporary_obstack,
3381 IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
3382 IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
3383 obstack_grow0 (&temporary_obstack, "[]", 2);
3384 ptr = obstack_finish (&temporary_obstack);
3385 wfl = build_expr_wfl (get_identifier (ptr),
3386 EXPR_WFL_FILENAME (type_or_wfl),
3387 EXPR_WFL_LINENO (type_or_wfl),
3388 EXPR_WFL_COLNO (type_or_wfl));
3389 /* Re-install the existing qualifications so that the type can be
3390 resolved properly. */
3391 EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl);
3396 parser_add_interface (class_decl, interface_decl, wfl)
3397 tree class_decl, interface_decl, wfl;
3399 if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
3400 parse_error_context (wfl, "Interface `%s' repeated",
3401 IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
3404 /* Bulk of common class/interface checks. Return 1 if an error was
3405 encountered. TAG is 0 for a class, 1 for an interface. */
3408 check_class_interface_creation (is_interface, flags, raw_name, qualified_name, decl, cl)
3409 int is_interface, flags;
3410 tree raw_name, qualified_name, decl, cl;
3413 int sca = 0; /* Static class allowed */
3414 int icaf = 0; /* Inner class allowed flags */
3415 int uaaf = CLASS_MODIFIERS; /* Usually allowed access flags */
3418 fprintf (stderr, " %s%s %s",
3419 (CPC_INNER_P () ? "inner" : ""),
3420 (is_interface ? "interface" : "class"),
3421 IDENTIFIER_POINTER (qualified_name));
3423 /* Scope of an interface/class type name:
3424 - Can't be imported by a single type import
3425 - Can't already exists in the package */
3426 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
3427 && (node = find_name_in_single_imports (raw_name))
3431 (cl, "%s name `%s' clashes with imported type `%s'",
3432 (is_interface ? "Interface" : "Class"),
3433 IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
3436 if (decl && CLASS_COMPLETE_P (decl))
3438 classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
3439 qualified_name, decl, cl);
3443 if (check_inner_class_redefinition (raw_name, cl))
3446 /* If public, file name should match class/interface name, except
3447 when dealing with an inner class */
3448 if (!CPC_INNER_P () && (flags & ACC_PUBLIC ))
3452 /* Contains OS dependent assumption on path separator. FIXME */
3453 for (f = &input_filename [strlen (input_filename)];
3454 f != input_filename && f[0] != '/' && f[0] != DIR_SEPARATOR;
3457 if (f[0] == '/' || f[0] == DIR_SEPARATOR)
3459 if (strncmp (IDENTIFIER_POINTER (raw_name),
3460 f , IDENTIFIER_LENGTH (raw_name)) ||
3461 f [IDENTIFIER_LENGTH (raw_name)] != '.')
3463 (cl, "Public %s `%s' must be defined in a file called `%s.java'",
3464 (is_interface ? "interface" : "class"),
3465 IDENTIFIER_POINTER (qualified_name),
3466 IDENTIFIER_POINTER (raw_name));
3469 /* Static classes can be declared only in top level classes. Note:
3470 once static, a inner class is a top level class. */
3471 if (flags & ACC_STATIC)
3473 /* Catch the specific error of declaring an class inner class
3474 with no toplevel enclosing class. Prevent check_modifiers from
3475 complaining a second time */
3476 if (CPC_INNER_P () && !TOPLEVEL_CLASS_DECL_P (GET_CPC()))
3478 parse_error_context (cl, "Inner class `%s' can't be static. Static classes can only occur in interfaces and top-level classes",
3479 IDENTIFIER_POINTER (qualified_name));
3482 /* Else, in the context of a top-level class declaration, let
3483 `check_modifiers' do its job, otherwise, give it a go */
3485 sca = (GET_CPC_LIST () ? ACC_STATIC : 0);
3488 /* Inner classes can be declared private or protected
3489 within their enclosing classes. */
3492 /* A class which is local to a block can't be public, private,
3493 protected or static. But it is created final, so allow this
3495 if (current_function_decl)
3496 icaf = sca = uaaf = ACC_FINAL;
3499 check_modifiers_consistency (flags);
3500 icaf = ACC_PROTECTED;
3501 if (! CLASS_INTERFACE (GET_CPC ()))
3502 icaf |= ACC_PRIVATE;
3509 uaaf = INTERFACE_INNER_MODIFIERS;
3511 uaaf = INTERFACE_MODIFIERS;
3513 check_modifiers ("Illegal modifier `%s' for interface declaration",
3517 check_modifiers ((current_function_decl ?
3518 "Illegal modifier `%s' for local class declaration" :
3519 "Illegal modifier `%s' for class declaration"),
3520 flags, uaaf|sca|icaf);
3524 /* Construct a nested class name. If the final component starts with
3525 a digit, return true. Otherwise return false. */
3527 make_nested_class_name (cpc_list)
3535 make_nested_class_name (TREE_CHAIN (cpc_list));
3537 /* Pick the qualified name when dealing with the first upmost
3539 name = (TREE_CHAIN (cpc_list)
3540 ? TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list)));
3541 obstack_grow (&temporary_obstack,
3542 IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name));
3543 obstack_1grow (&temporary_obstack, '$');
3545 return ISDIGIT (IDENTIFIER_POINTER (name)[0]);
3548 /* Can't redefine a class already defined in an earlier scope. */
3551 check_inner_class_redefinition (raw_name, cl)
3556 for (scope_list = GET_CPC_LIST (); scope_list;
3557 scope_list = GET_NEXT_ENCLOSING_CPC (scope_list))
3558 if (raw_name == GET_CPC_UN_NODE (scope_list))
3561 (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",
3562 IDENTIFIER_POINTER (raw_name));
3568 /* Tries to find a decl for CLASS_TYPE within ENCLOSING. If we fail,
3569 we remember ENCLOSING and SUPER. */
3572 resolve_inner_class (circularity_hash, cl, enclosing, super, class_type)
3573 htab_t circularity_hash;
3574 tree cl, *enclosing, *super, class_type;
3576 tree local_enclosing = *enclosing;
3577 tree local_super = NULL_TREE;
3579 while (local_enclosing)
3581 tree intermediate, decl;
3583 *htab_find_slot (circularity_hash, local_enclosing, INSERT) =
3586 if ((decl = find_as_inner_class (local_enclosing, class_type, cl)))
3589 intermediate = local_enclosing;
3590 /* Explore enclosing contexts. */
3591 while (INNER_CLASS_DECL_P (intermediate))
3593 intermediate = DECL_CONTEXT (intermediate);
3594 if ((decl = find_as_inner_class (intermediate, class_type, cl)))
3598 /* Now go to the upper classes, bail out if necessary. We will
3599 analyze the returned SUPER and act accordingly (see
3600 do_resolve_class.) */
3601 local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing));
3602 if (!local_super || local_super == object_type_node)
3605 if (TREE_CODE (local_super) == POINTER_TYPE)
3606 local_super = do_resolve_class (NULL, local_super, NULL, NULL);
3608 local_super = TYPE_NAME (local_super);
3610 /* We may not have checked for circular inheritance yet, so do so
3611 here to prevent an infinite loop. */
3612 if (htab_find (circularity_hash, local_super) != NULL)
3615 cl = lookup_cl (local_enclosing);
3618 (cl, "Cyclic inheritance involving %s",
3619 IDENTIFIER_POINTER (DECL_NAME (local_enclosing)));
3620 local_enclosing = NULL_TREE;
3623 local_enclosing = local_super;
3626 /* We failed. Return LOCAL_SUPER and LOCAL_ENCLOSING. */
3627 *super = local_super;
3628 *enclosing = local_enclosing;
3633 /* Within ENCLOSING, find a decl for NAME and return it. NAME can be
3637 find_as_inner_class (enclosing, name, cl)
3638 tree enclosing, name, cl;
3640 tree qual, to_return;
3644 name = TYPE_NAME (name);
3646 /* First search: within the scope of `enclosing', search for name */
3647 if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3648 qual = EXPR_WFL_QUALIFICATION (cl);
3650 qual = build_tree_list (cl, NULL_TREE);
3652 qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3654 if ((to_return = find_as_inner_class_do (qual, enclosing)))
3657 /* We're dealing with a qualified name. Try to resolve thing until
3658 we get something that is an enclosing class. */
3659 if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3661 tree acc = NULL_TREE, decl = NULL_TREE, ptr;
3663 for (qual = EXPR_WFL_QUALIFICATION (cl); qual && !decl;
3664 qual = TREE_CHAIN (qual))
3666 acc = merge_qualified_name (acc,
3667 EXPR_WFL_NODE (TREE_PURPOSE (qual)));
3668 BUILD_PTR_FROM_NAME (ptr, acc);
3669 decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl);
3672 /* A NULL qual and a decl means that the search ended
3673 successfully?!? We have to do something then. FIXME */
3678 qual = EXPR_WFL_QUALIFICATION (cl);
3680 /* Otherwise, create a qual for the other part of the resolution. */
3682 qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3684 return find_as_inner_class_do (qual, enclosing);
3687 /* We go inside the list of sub classes and try to find a way
3691 find_as_inner_class_do (qual, enclosing)
3692 tree qual, enclosing;
3697 for (; qual && enclosing; qual = TREE_CHAIN (qual))
3699 tree name_to_match = EXPR_WFL_NODE (TREE_PURPOSE (qual));
3700 tree next_enclosing = NULL_TREE;
3703 for (inner_list = DECL_INNER_CLASS_LIST (enclosing);
3704 inner_list; inner_list = TREE_CHAIN (inner_list))
3706 if (TREE_VALUE (inner_list) == name_to_match)
3708 next_enclosing = TREE_PURPOSE (inner_list);
3712 enclosing = next_enclosing;
3715 return (!qual && enclosing ? enclosing : NULL_TREE);
3718 /* Reach all inner classes and tie their unqualified name to a
3722 set_nested_class_simple_name_value (outer, set)
3728 for (l = DECL_INNER_CLASS_LIST (outer); l; l = TREE_CHAIN (l))
3729 IDENTIFIER_GLOBAL_VALUE (TREE_VALUE (l)) = (set ?
3730 TREE_PURPOSE (l) : NULL_TREE);
3734 link_nested_class_to_enclosing ()
3736 if (GET_ENCLOSING_CPC ())
3738 tree enclosing = GET_ENCLOSING_CPC_CONTEXT ();
3739 DECL_INNER_CLASS_LIST (enclosing) =
3740 tree_cons (GET_CPC (), GET_CPC_UN (),
3741 DECL_INNER_CLASS_LIST (enclosing));
3746 maybe_make_nested_class_name (name)
3749 tree id = NULL_TREE;
3753 /* If we're in a function, we must append a number to create the
3754 nested class name. However, we don't do this if the class we
3755 are constructing is anonymous, because in that case we'll
3756 already have a number as the class name. */
3757 if (! make_nested_class_name (GET_CPC_LIST ())
3758 && current_function_decl != NULL_TREE
3759 && ! ISDIGIT (IDENTIFIER_POINTER (name)[0]))
3762 sprintf (buf, "%d", anonymous_class_counter);
3763 ++anonymous_class_counter;
3764 obstack_grow (&temporary_obstack, buf, strlen (buf));
3765 obstack_1grow (&temporary_obstack, '$');
3767 obstack_grow0 (&temporary_obstack,
3768 IDENTIFIER_POINTER (name),
3769 IDENTIFIER_LENGTH (name));
3770 id = get_identifier (obstack_finish (&temporary_obstack));
3772 QUALIFIED_P (id) = 1;
3777 /* If DECL is NULL, create and push a new DECL, record the current
3778 line CL and do other maintenance things. */
3781 maybe_create_class_interface_decl (decl, raw_name, qualified_name, cl)
3782 tree decl, raw_name, qualified_name, cl;
3785 decl = push_class (make_class (), qualified_name);
3787 /* Take care of the file and line business */
3788 DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
3789 /* If we're emiting xrefs, store the line/col number information */
3791 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
3793 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
3794 CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
3795 CLASS_PARSED_P (TREE_TYPE (decl)) = 1;
3796 CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
3797 IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
3799 PUSH_CPC (decl, raw_name);
3800 DECL_CONTEXT (decl) = GET_ENCLOSING_CPC_CONTEXT ();
3802 /* Link the declaration to the already seen ones */
3803 TREE_CHAIN (decl) = ctxp->class_list;
3804 ctxp->class_list = decl;
3806 /* Create a new nodes in the global lists */
3807 gclass_list = tree_cons (NULL_TREE, decl, gclass_list);
3808 all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
3810 /* Install a new dependency list element */
3811 create_jdep_list (ctxp);
3813 SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
3814 IDENTIFIER_POINTER (qualified_name)));
3819 add_superinterfaces (decl, interface_list)
3820 tree decl, interface_list;
3823 /* Superinterface(s): if present and defined, parser_check_super_interface ()
3824 takes care of ensuring that:
3825 - This is an accessible interface type,
3826 - Circularity detection.
3827 parser_add_interface is then called. If present but not defined,
3828 the check operation is delayed until the super interface gets
3830 for (node = interface_list; node; node = TREE_CHAIN (node))
3832 tree current = TREE_PURPOSE (node);
3833 tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
3834 if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
3836 if (!parser_check_super_interface (idecl, decl, current))
3837 parser_add_interface (decl, idecl, current);
3840 register_incomplete_type (JDEP_INTERFACE,
3841 current, decl, NULL_TREE);
3845 /* Create an interface in pass1 and return its decl. Return the
3846 interface's decl in pass 2. */
3849 create_interface (flags, id, super)
3853 tree raw_name = EXPR_WFL_NODE (id);
3854 tree q_name = parser_qualified_classname (raw_name);
3855 tree decl = IDENTIFIER_CLASS_VALUE (q_name);
3857 /* Certain syntax errors are making SUPER be like ID. Avoid this
3859 if (ctxp->class_err && id == super)
3862 EXPR_WFL_NODE (id) = q_name; /* Keep source location, even if refined. */
3864 /* Basic checks: scope, redefinition, modifiers */
3865 if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
3871 /* Suspend the current parsing context if we're parsing an inner
3875 java_parser_context_suspend ();
3876 /* Interface members are public. */
3877 if (CLASS_INTERFACE (GET_CPC ()))
3878 flags |= ACC_PUBLIC;
3881 /* Push a new context for (static) initialized upon declaration fields */
3882 java_parser_context_push_initialized_field ();
3884 /* Interface modifiers check
3885 - public/abstract allowed (already done at that point)
3886 - abstract is obsolete (comes first, it's a warning, or should be)
3887 - Can't use twice the same (checked in the modifier rule) */
3888 if ((flags & ACC_ABSTRACT) && flag_redundant)
3889 parse_warning_context
3890 (MODIFIER_WFL (ABSTRACT_TK),
3891 "Redundant use of `abstract' modifier. Interface `%s' is implicitly abstract", IDENTIFIER_POINTER (raw_name));
3893 /* Create a new decl if DECL is NULL, otherwise fix it */
3894 decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id);
3896 /* Set super info and mark the class a complete */
3897 set_super_info (ACC_INTERFACE | flags, TREE_TYPE (decl),
3898 object_type_node, ctxp->interface_number);
3899 ctxp->interface_number = 0;
3900 CLASS_COMPLETE_P (decl) = 1;
3901 add_superinterfaces (decl, super);
3906 /* Patch anonymous class CLASS, by either extending or implementing
3910 patch_anonymous_class (type_decl, class_decl, wfl)
3911 tree type_decl, class_decl, wfl;
3913 tree class = TREE_TYPE (class_decl);
3914 tree type = TREE_TYPE (type_decl);
3915 tree binfo = TYPE_BINFO (class);
3917 /* If it's an interface, implement it */
3918 if (CLASS_INTERFACE (type_decl))
3923 if (parser_check_super_interface (type_decl, class_decl, wfl))
3926 s_binfo = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (class)), 0);
3927 length = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (class))+1;
3928 TYPE_BINFO_BASETYPES (class) = make_tree_vec (length);
3929 TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (class)), 0) = s_binfo;
3930 /* And add the interface */
3931 parser_add_interface (class_decl, type_decl, wfl);
3933 /* Otherwise, it's a type we want to extend */
3936 if (parser_check_super (type_decl, class_decl, wfl))
3938 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (binfo), 0)) = type;
3943 create_anonymous_class (location, type_name)
3948 tree super = NULL_TREE, itf = NULL_TREE;
3949 tree id, type_decl, class;
3951 /* The unqualified name of the anonymous class. It's just a number. */
3952 sprintf (buffer, "%d", anonymous_class_counter++);
3953 id = build_wfl_node (get_identifier (buffer));
3954 EXPR_WFL_LINECOL (id) = location;
3956 /* We know about the type to extend/implement. We go ahead */
3957 if ((type_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (type_name))))
3959 /* Create a class which either implements on extends the designated
3960 class. The class bears an innacessible name. */
3961 if (CLASS_INTERFACE (type_decl))
3963 /* It's OK to modify it here. It's been already used and
3964 shouldn't be reused */
3965 ctxp->interface_number = 1;
3966 /* Interfaces should presented as a list of WFLs */
3967 itf = build_tree_list (type_name, NULL_TREE);
3973 class = create_class (ACC_FINAL, id, super, itf);
3975 /* We didn't know anything about the stuff. We register a dependence. */
3977 register_incomplete_type (JDEP_ANONYMOUS, type_name, class, NULL_TREE);
3979 ANONYMOUS_CLASS_P (TREE_TYPE (class)) = 1;
3983 /* Create a class in pass1 and return its decl. Return class
3984 interface's decl in pass 2. */
3987 create_class (flags, id, super, interfaces)
3989 tree id, super, interfaces;
3991 tree raw_name = EXPR_WFL_NODE (id);
3992 tree class_id, decl;
3993 tree super_decl_type;
3995 /* Certain syntax errors are making SUPER be like ID. Avoid this
3997 if (ctxp->class_err && id == super)
4000 class_id = parser_qualified_classname (raw_name);
4001 decl = IDENTIFIER_CLASS_VALUE (class_id);
4002 EXPR_WFL_NODE (id) = class_id;
4004 /* Basic check: scope, redefinition, modifiers */
4005 if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
4011 /* Suspend the current parsing context if we're parsing an inner
4012 class or an anonymous class. */
4015 java_parser_context_suspend ();
4016 /* Interface members are public. */
4017 if (CLASS_INTERFACE (GET_CPC ()))
4018 flags |= ACC_PUBLIC;
4021 /* Push a new context for (static) initialized upon declaration fields */
4022 java_parser_context_push_initialized_field ();
4024 /* Class modifier check:
4025 - Allowed modifier (already done at that point)
4026 - abstract AND final forbidden
4027 - Public classes defined in the correct file */
4028 if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
4030 (id, "Class `%s' can't be declared both abstract and final",
4031 IDENTIFIER_POINTER (raw_name));
4033 /* Create a new decl if DECL is NULL, otherwise fix it */
4034 decl = maybe_create_class_interface_decl (decl, raw_name, class_id, id);
4036 /* If SUPER exists, use it, otherwise use Object */
4039 /* Can't extend java.lang.Object */
4040 if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
4042 parse_error_context (id, "Can't extend `java.lang.Object'");
4047 register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
4049 else if (TREE_TYPE (decl) != object_type_node)
4050 super_decl_type = object_type_node;
4051 /* We're defining java.lang.Object */
4053 super_decl_type = NULL_TREE;
4055 /* A class nested in an interface is implicitly static. */
4056 if (INNER_CLASS_DECL_P (decl)
4057 && CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (DECL_CONTEXT (decl)))))
4059 flags |= ACC_STATIC;
4062 /* Set super info and mark the class as complete. */
4063 set_super_info (flags, TREE_TYPE (decl), super_decl_type,
4064 ctxp->interface_number);
4065 ctxp->interface_number = 0;
4066 CLASS_COMPLETE_P (decl) = 1;
4067 add_superinterfaces (decl, interfaces);
4069 /* Add the private this$<n> field, Replicate final locals still in
4070 scope as private final fields mangled like val$<local_name>.
4071 This doesn't not occur for top level (static) inner classes. */
4072 if (PURE_INNER_CLASS_DECL_P (decl))
4073 add_inner_class_fields (decl, current_function_decl);
4075 /* If doing xref, store the location at which the inherited class
4076 (if any) was seen. */
4077 if (flag_emit_xref && super)
4078 DECL_INHERITED_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (super);
4080 /* Eventually sets the @deprecated tag flag */
4081 CHECK_DEPRECATED (decl);
4083 /* Reset the anonymous class counter when declaring non inner classes */
4084 if (!INNER_CLASS_DECL_P (decl))
4085 anonymous_class_counter = 1;
4090 /* End a class declaration: register the statements used to create
4091 finit$ and <clinit>, pop the current class and resume the prior
4092 parser context if necessary. */
4095 end_class_declaration (resume)
4098 /* If an error occurred, context weren't pushed and won't need to be
4099 popped by a resume. */
4100 int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node;
4102 if (GET_CPC () != error_mark_node)
4103 dump_java_tree (TDI_class, GET_CPC ());
4105 java_parser_context_pop_initialized_field ();
4107 if (resume && no_error_occurred)
4108 java_parser_context_resume ();
4110 /* We're ending a class declaration, this is a good time to reset
4111 the interface cout. Note that might have been already done in
4112 create_interface, but if at that time an inner class was being
4113 dealt with, the interface count was reset in a context created
4114 for the sake of handling inner classes declaration. */
4115 ctxp->interface_number = 0;
4119 add_inner_class_fields (class_decl, fct_decl)
4123 tree block, marker, f;
4125 f = add_field (TREE_TYPE (class_decl),
4126 build_current_thisn (TREE_TYPE (class_decl)),
4127 build_pointer_type (TREE_TYPE (DECL_CONTEXT (class_decl))),
4129 FIELD_THISN (f) = 1;
4134 for (block = GET_CURRENT_BLOCK (fct_decl);
4135 block && TREE_CODE (block) == BLOCK; block = BLOCK_SUPERCONTEXT (block))
4138 for (decl = BLOCK_EXPR_DECLS (block); decl; decl = TREE_CHAIN (decl))
4141 tree wfl, init, list;
4143 /* Avoid non final arguments. */
4144 if (!LOCAL_FINAL_P (decl))
4147 MANGLE_OUTER_LOCAL_VARIABLE_NAME (name, DECL_NAME (decl));
4148 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID (pname, DECL_NAME (decl));
4149 wfl = build_wfl_node (name);
4150 init = build_wfl_node (pname);
4151 /* Build an initialization for the field: it will be
4152 initialized by a parameter added to finit$, bearing a
4153 mangled name of the field itself (param$<n>.) The
4154 parameter is provided to finit$ by the constructor
4155 invoking it (hence the constructor will also feature a
4156 hidden parameter, set to the value of the outer context
4157 local at the time the inner class is created.)
4159 Note: we take into account all possible locals that can
4160 be accessed by the inner class. It's actually not trivial
4161 to minimize these aliases down to the ones really
4162 used. One way to do that would be to expand all regular
4163 methods first, then finit$ to get a picture of what's
4164 used. It works with the exception that we would have to
4165 go back on all constructor invoked in regular methods to
4166 have their invokation reworked (to include the right amount
4167 of alias initializer parameters.)
4169 The only real way around, I think, is a first pass to
4170 identify locals really used in the inner class. We leave
4171 the flag FIELD_LOCAL_ALIAS_USED around for that future
4174 On the other hand, it only affect local inner classes,
4175 whose constructors (and finit$ call) will be featuring
4176 unecessary arguments. It's easy for a developper to keep
4177 this number of parameter down by using the `final'
4178 keyword only when necessary. For the time being, we can
4179 issue a warning on unecessary finals. FIXME */
4180 init = build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (wfl),
4183 /* Register the field. The TREE_LIST holding the part
4184 initialized/initializer will be marked ARG_FINAL_P so
4185 that the created field can be marked
4186 FIELD_LOCAL_ALIAS. */
4187 list = build_tree_list (wfl, init);
4188 ARG_FINAL_P (list) = 1;
4189 register_fields (ACC_PRIVATE | ACC_FINAL, TREE_TYPE (decl), list);
4193 if (!CPC_INITIALIZER_STMT (ctxp))
4196 /* If we ever registered an alias field, insert and marker to
4197 remeber where the list ends. The second part of the list (the one
4198 featuring initialized fields) so it can be later reversed to
4199 enforce 8.5. The marker will be removed during that operation. */
4200 marker = build_tree_list (NULL_TREE, NULL_TREE);
4201 TREE_CHAIN (marker) = CPC_INITIALIZER_STMT (ctxp);
4202 SET_CPC_INITIALIZER_STMT (ctxp, marker);
4205 /* Can't use lookup_field () since we don't want to load the class and
4206 can't set the CLASS_LOADED_P flag */
4209 find_field (class, name)
4214 for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
4216 if (DECL_NAME (decl) == name)
4222 /* Wrap around lookup_field that doesn't potentially upset the value
4226 lookup_field_wrapper (class, name)
4230 tree decl = NULL_TREE;
4231 java_parser_context_save_global ();
4233 /* Last chance: if we're within the context of an inner class, we
4234 might be trying to access a local variable defined in an outer
4235 context. We try to look for it now. */
4236 if (INNER_CLASS_TYPE_P (class) && TREE_CODE (name) == IDENTIFIER_NODE)
4239 MANGLE_OUTER_LOCAL_VARIABLE_NAME (new_name, name);
4240 decl = lookup_field (&type, new_name);
4241 if (decl && decl != error_mark_node)
4242 FIELD_LOCAL_ALIAS_USED (decl) = 1;
4244 if (!decl || decl == error_mark_node)
4247 decl = lookup_field (&type, name);
4250 /* If the field still hasn't been found, try the next enclosing context. */
4251 if (!decl && INNER_CLASS_TYPE_P (class))
4253 tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class)));
4254 decl = lookup_field_wrapper (outer_type, name);
4257 java_parser_context_restore_global ();
4258 return decl == error_mark_node ? NULL : decl;
4261 /* Find duplicate field within the same class declarations and report
4262 the error. Returns 1 if a duplicated field was found, 0
4266 duplicate_declaration_error_p (new_field_name, new_type, cl)
4267 tree new_field_name, new_type, cl;
4269 /* This might be modified to work with method decl as well */
4270 tree decl = find_field (TREE_TYPE (GET_CPC ()), new_field_name);
4273 char *t1 = xstrdup (purify_type_name
4274 ((TREE_CODE (new_type) == POINTER_TYPE
4275 && TREE_TYPE (new_type) == NULL_TREE) ?
4276 IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
4277 lang_printable_name (new_type, 1)));
4278 /* The type may not have been completed by the time we report
4280 char *t2 = xstrdup (purify_type_name
4281 ((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
4282 && TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
4283 IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
4284 lang_printable_name (TREE_TYPE (decl), 1)));
4286 (cl , "Duplicate variable declaration: `%s %s' was `%s %s' (%s:%d)",
4287 t1, IDENTIFIER_POINTER (new_field_name),
4288 t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
4289 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4297 /* Field registration routine. If TYPE doesn't exist, field
4298 declarations are linked to the undefined TYPE dependency list, to
4299 be later resolved in java_complete_class () */
4302 register_fields (flags, type, variable_list)
4304 tree type, variable_list;
4306 tree current, saved_type;
4307 tree class_type = NULL_TREE;
4308 int saved_lineno = lineno;
4310 tree wfl = NULL_TREE;
4313 class_type = TREE_TYPE (GET_CPC ());
4315 if (!class_type || class_type == error_mark_node)
4318 /* If we're adding fields to interfaces, those fields are public,
4320 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
4322 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
4323 flags, ACC_PUBLIC, "interface field(s)");
4324 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
4325 flags, ACC_STATIC, "interface field(s)");
4326 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
4327 flags, ACC_FINAL, "interface field(s)");
4328 check_modifiers ("Illegal interface member modifier `%s'", flags,
4329 INTERFACE_FIELD_MODIFIERS);
4330 flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
4333 /* Obtain a suitable type for resolution, if necessary */
4334 SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
4336 /* If TYPE is fully resolved and we don't have a reference, make one */
4337 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4339 for (current = variable_list, saved_type = type; current;
4340 current = TREE_CHAIN (current), type = saved_type)
4344 tree cl = TREE_PURPOSE (current);
4345 tree init = TREE_VALUE (current);
4346 tree current_name = EXPR_WFL_NODE (cl);
4348 /* Can't declare non-final static fields in inner classes */
4349 if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (class_type)
4350 && !(flags & ACC_FINAL))
4352 (cl, "Field `%s' can't be static in inner class `%s' unless it is final",
4353 IDENTIFIER_POINTER (EXPR_WFL_NODE (cl)),
4354 lang_printable_name (class_type, 0));
4356 /* Process NAME, as it may specify extra dimension(s) for it */
4357 type = build_array_from_name (type, wfl, current_name, ¤t_name);
4359 /* Type adjustment. We may have just readjusted TYPE because
4360 the variable specified more dimensions. Make sure we have
4361 a reference if we can and don't have one already. Also
4362 change the name if we have an init. */
4363 if (type != saved_type)
4365 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4367 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
4370 real_type = GET_REAL_TYPE (type);
4371 /* Check for redeclarations */
4372 if (duplicate_declaration_error_p (current_name, real_type, cl))
4375 /* Set lineno to the line the field was found and create a
4376 declaration for it. Eventually sets the @deprecated tag flag. */
4378 lineno = EXPR_WFL_LINECOL (cl);
4380 lineno = EXPR_WFL_LINENO (cl);
4381 field_decl = add_field (class_type, current_name, real_type, flags);
4382 CHECK_DEPRECATED (field_decl);
4384 /* If the field denotes a final instance variable, then we
4385 allocate a LANG_DECL_SPECIFIC part to keep track of its
4386 initialization. We also mark whether the field was
4387 initialized upon its declaration. We don't do that if the
4388 created field is an alias to a final local. */
4389 if (!ARG_FINAL_P (current) && (flags & ACC_FINAL))
4391 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl);
4392 DECL_FIELD_FINAL_WFL (field_decl) = cl;
4395 /* If the couple initializer/initialized is marked ARG_FINAL_P,
4396 we mark the created field FIELD_LOCAL_ALIAS, so that we can
4397 hide parameters to this inner class finit$ and
4398 constructors. It also means that the field isn't final per
4400 if (ARG_FINAL_P (current))
4402 FIELD_LOCAL_ALIAS (field_decl) = 1;
4403 FIELD_FINAL (field_decl) = 0;
4406 /* Check if we must chain. */
4408 register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
4410 /* If we have an initialization value tied to the field */
4413 /* The field is declared static */
4414 if (flags & ACC_STATIC)
4416 /* We include the field and its initialization part into
4417 a list used to generate <clinit>. After <clinit> is
4418 walked, field initializations will be processed and
4419 fields initialized with known constants will be taken
4420 out of <clinit> and have their DECL_INITIAL set
4422 TREE_CHAIN (init) = CPC_STATIC_INITIALIZER_STMT (ctxp);
4423 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, init);
4424 if (TREE_OPERAND (init, 1)
4425 && TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
4426 TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
4428 /* A non-static field declared with an immediate initialization is
4429 to be initialized in <init>, if any. This field is remembered
4430 to be processed at the time of the generation of <init>. */
4433 TREE_CHAIN (init) = CPC_INITIALIZER_STMT (ctxp);
4434 SET_CPC_INITIALIZER_STMT (ctxp, init);
4436 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
4437 DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
4440 lineno = saved_lineno;
4443 /* Generate finit$, using the list of initialized fields to populate
4444 its body. finit$'s parameter(s) list is adjusted to include the
4445 one(s) used to initialized the field(s) caching outer context
4449 generate_finit (class_type)
4453 tree list = TYPE_FINIT_STMT_LIST (class_type);
4454 tree mdecl, current, parms;
4456 parms = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
4457 class_type, NULL_TREE,
4459 CRAFTED_PARAM_LIST_FIXUP (parms);
4460 mdecl = create_artificial_method (class_type, ACC_PRIVATE, void_type_node,
4461 finit_identifier_node, parms);
4462 fix_method_argument_names (parms, mdecl);
4463 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4465 DECL_FUNCTION_NAP (mdecl) = count;
4466 start_artificial_method_body (mdecl);
4468 for (current = list; current; current = TREE_CHAIN (current))
4469 java_method_add_stmt (mdecl,
4470 build_debugable_stmt (EXPR_WFL_LINECOL (current),
4472 end_artificial_method_body (mdecl);
4476 /* Generate a function to run the instance initialization code. The
4477 private method is called `instinit$'. Unless we're dealing with an
4478 anonymous class, we determine whether all ctors of CLASS_TYPE
4479 declare a checked exception in their `throws' clause in order to
4480 see whether it's necessary to encapsulate the instance initializer
4481 statements in a try/catch/rethrow sequence. */
4484 generate_instinit (class_type)
4488 tree compound = NULL_TREE;
4489 tree parms = tree_cons (this_identifier_node,
4490 build_pointer_type (class_type), end_params_node);
4491 tree mdecl = create_artificial_method (class_type, ACC_PRIVATE,
4493 instinit_identifier_node, parms);
4495 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4498 /* Gather all the statements in a compound */
4499 for (current = TYPE_II_STMT_LIST (class_type);
4500 current; current = TREE_CHAIN (current))
4501 compound = add_stmt_to_compound (compound, NULL_TREE, current);
4503 /* We need to encapsulate COMPOUND by a try/catch statement to
4504 rethrow exceptions that might occur in the instance initializer.
4505 We do that only if all ctors of CLASS_TYPE are set to catch a
4506 checked exception. This doesn't apply to anonymous classes (since
4507 they don't have declared ctors.) */
4508 if (!ANONYMOUS_CLASS_P (class_type) &&
4509 ctors_unchecked_throws_clause_p (class_type))
4511 compound = encapsulate_with_try_catch (0, exception_type_node, compound,
4512 build1 (THROW_EXPR, NULL_TREE,
4513 build_wfl_node (wpv_id)));
4514 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE,
4515 exception_type_node);
4518 start_artificial_method_body (mdecl);
4519 java_method_add_stmt (mdecl, compound);
4520 end_artificial_method_body (mdecl);
4527 build_instinit_invocation (class_type)
4530 tree to_return = NULL_TREE;
4532 if (TYPE_II_STMT_LIST (class_type))
4534 tree parm = build_tree_list (NULL_TREE,
4535 build_wfl_node (this_identifier_node));
4537 build_method_invocation (build_wfl_node (instinit_identifier_node),
4543 /* Shared accros method_declarator and method_header to remember the
4544 patch stage that was reached during the declaration of the method.
4545 A method DECL is built differently is there is no patch
4546 (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
4547 pending on the currently defined method. */
4549 static int patch_stage;
4551 /* Check the method declaration and add the method to its current
4552 class. If the argument list is known to contain incomplete types,
4553 the method is partially added and the registration will be resume
4554 once the method arguments resolved. If TYPE is NULL, we're dealing
4555 with a constructor. */
4558 method_header (flags, type, mdecl, throws)
4560 tree type, mdecl, throws;
4562 tree type_wfl = NULL_TREE;
4563 tree meth_name = NULL_TREE;
4564 tree current, orig_arg, this_class = NULL;
4567 int constructor_ok = 0, must_chain;
4570 if (mdecl == error_mark_node)
4571 return error_mark_node;
4572 meth = TREE_VALUE (mdecl);
4573 id = TREE_PURPOSE (mdecl);
4575 check_modifiers_consistency (flags);
4578 this_class = TREE_TYPE (GET_CPC ());
4580 if (!this_class || this_class == error_mark_node)
4583 /* There are some forbidden modifiers for an abstract method and its
4584 class must be abstract as well. */
4585 if (type && (flags & ACC_ABSTRACT))
4587 ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
4588 ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
4589 ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
4590 ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
4591 ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized");
4592 ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp");
4593 if (!CLASS_ABSTRACT (TYPE_NAME (this_class))
4594 && !CLASS_INTERFACE (TYPE_NAME (this_class)))
4596 (id, "Class `%s' must be declared abstract to define abstract method `%s'",
4597 IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())),
4598 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4601 /* Things to be checked when declaring a constructor */
4604 int ec = java_error_count;
4605 /* 8.6: Constructor declarations: we might be trying to define a
4606 method without specifying a return type. */
4607 if (EXPR_WFL_NODE (id) != GET_CPC_UN ())
4609 (id, "Invalid method declaration, return type required");
4610 /* 8.6.3: Constructor modifiers */
4613 JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
4614 JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
4615 JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
4616 JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
4617 JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
4618 JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp");
4620 /* If we found error here, we don't consider it's OK to tread
4621 the method definition as a constructor, for the rest of this
4623 if (ec == java_error_count)
4627 /* Method declared within the scope of an interface are implicitly
4628 abstract and public. Conflicts with other erroneously provided
4629 modifiers are checked right after. */
4631 if (CLASS_INTERFACE (TYPE_NAME (this_class)))
4633 /* If FLAGS isn't set because of a modifier, turn the
4634 corresponding modifier WFL to NULL so we issue a warning on
4635 the obsolete use of the modifier */
4636 if (!(flags & ACC_PUBLIC))
4637 MODIFIER_WFL (PUBLIC_TK) = NULL;
4638 if (!(flags & ACC_ABSTRACT))
4639 MODIFIER_WFL (ABSTRACT_TK) = NULL;
4640 flags |= ACC_PUBLIC;
4641 flags |= ACC_ABSTRACT;
4644 /* Inner class can't declare static methods */
4645 if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (this_class))
4648 (id, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
4649 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)),
4650 lang_printable_name (this_class, 0));
4653 /* Modifiers context reset moved up, so abstract method declaration
4654 modifiers can be later checked. */
4656 /* Set constructor returned type to void and method name to <init>,
4657 unless we found an error identifier the constructor (in which
4658 case we retain the original name) */
4661 type = void_type_node;
4663 meth_name = init_identifier_node;
4666 meth_name = EXPR_WFL_NODE (id);
4668 /* Do the returned type resolution and registration if necessary */
4669 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4672 type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
4673 EXPR_WFL_NODE (id) = meth_name;
4674 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4678 patch_stage = JDEP_METHOD_RETURN;
4679 register_incomplete_type (patch_stage, type_wfl, id, type);
4680 TREE_TYPE (meth) = GET_REAL_TYPE (type);
4683 TREE_TYPE (meth) = type;
4685 saved_lineno = lineno;
4686 /* When defining an abstract or interface method, the curly
4687 bracket at level 1 doesn't exist because there is no function
4689 lineno = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
4690 EXPR_WFL_LINENO (id));
4692 /* Remember the original argument list */
4693 orig_arg = TYPE_ARG_TYPES (meth);
4695 if (patch_stage) /* includes ret type and/or all args */
4698 meth = add_method_1 (this_class, flags, meth_name, meth);
4699 /* Patch for the return type */
4700 if (patch_stage == JDEP_METHOD_RETURN)
4702 jdep = CLASSD_LAST (ctxp->classd_list);
4703 JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
4705 /* This is the stop JDEP. METH allows the function's signature
4707 register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
4710 meth = add_method (this_class, flags, meth_name,
4711 build_java_signature (meth));
4713 /* Remember final parameters */
4714 MARK_FINAL_PARMS (meth, orig_arg);
4716 /* Fix the method argument list so we have the argument name
4718 fix_method_argument_names (orig_arg, meth);
4720 /* Register the parameter number and re-install the current line
4722 DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
4723 lineno = saved_lineno;
4725 /* Register exception specified by the `throws' keyword for
4726 resolution and set the method decl appropriate field to the list.
4727 Note: the grammar ensures that what we get here are class
4731 throws = nreverse (throws);
4732 for (current = throws; current; current = TREE_CHAIN (current))
4734 register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
4735 NULL_TREE, NULL_TREE);
4736 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
4737 &TREE_VALUE (current);
4739 DECL_FUNCTION_THROWS (meth) = throws;
4742 if (TREE_TYPE (GET_CPC ()) != object_type_node)
4743 DECL_FUNCTION_WFL (meth) = id;
4745 /* Set the flag if we correctly processed a constructor */
4748 DECL_CONSTRUCTOR_P (meth) = 1;
4749 /* Compute and store the number of artificial parameters declared
4750 for this constructor */
4751 for (count = 0, current = TYPE_FIELDS (this_class); current;
4752 current = TREE_CHAIN (current))
4753 if (FIELD_LOCAL_ALIAS (current))
4755 DECL_FUNCTION_NAP (meth) = count;
4758 /* Eventually set the @deprecated tag flag */
4759 CHECK_DEPRECATED (meth);
4761 /* If doing xref, store column and line number information instead
4762 of the line number only. */
4764 DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
4770 fix_method_argument_names (orig_arg, meth)
4771 tree orig_arg, meth;
4773 tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
4774 if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
4776 TREE_PURPOSE (arg) = this_identifier_node;
4777 arg = TREE_CHAIN (arg);
4779 while (orig_arg != end_params_node)
4781 TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
4782 orig_arg = TREE_CHAIN (orig_arg);
4783 arg = TREE_CHAIN (arg);
4787 /* Complete the method declaration with METHOD_BODY. */
4790 finish_method_declaration (method_body)
4795 if (!current_function_decl)
4798 flags = get_access_flags_from_decl (current_function_decl);
4800 /* 8.4.5 Method Body */
4801 if ((flags & ACC_ABSTRACT || flags & ACC_NATIVE) && method_body)
4803 tree name = DECL_NAME (current_function_decl);
4804 parse_error_context (DECL_FUNCTION_WFL (current_function_decl),
4805 "%s method `%s' can't have a body defined",
4806 (METHOD_NATIVE (current_function_decl) ?
4807 "Native" : "Abstract"),
4808 IDENTIFIER_POINTER (name));
4809 method_body = NULL_TREE;
4811 else if (!(flags & ACC_ABSTRACT) && !(flags & ACC_NATIVE) && !method_body)
4813 tree name = DECL_NAME (current_function_decl);
4815 (DECL_FUNCTION_WFL (current_function_decl),
4816 "Non native and non abstract method `%s' must have a body defined",
4817 IDENTIFIER_POINTER (name));
4818 method_body = NULL_TREE;
4821 if (flag_emit_class_files && method_body
4822 && TREE_CODE (method_body) == NOP_EXPR
4823 && TREE_TYPE (current_function_decl)
4824 && TREE_TYPE (TREE_TYPE (current_function_decl)) == void_type_node)
4825 method_body = build1 (RETURN_EXPR, void_type_node, NULL);
4827 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
4828 maybe_absorb_scoping_blocks ();
4829 /* Exit function's body */
4831 /* Merge last line of the function with first line, directly in the
4832 function decl. It will be used to emit correct debug info. */
4833 if (!flag_emit_xref)
4834 DECL_SOURCE_LINE_MERGE (current_function_decl, ctxp->last_ccb_indent1);
4836 /* Since function's argument's list are shared, reset the
4837 ARG_FINAL_P parameter that might have been set on some of this
4838 function parameters. */
4839 UNMARK_FINAL_PARMS (current_function_decl);
4841 /* So we don't have an irrelevant function declaration context for
4842 the next static block we'll see. */
4843 current_function_decl = NULL_TREE;
4846 /* Build a an error message for constructor circularity errors. */
4849 constructor_circularity_msg (from, to)
4852 static char string [4096];
4853 char *t = xstrdup (lang_printable_name (from, 0));
4854 sprintf (string, "`%s' invokes `%s'", t, lang_printable_name (to, 0));
4859 /* Verify a circular call to METH. Return 1 if an error is found, 0
4862 static GTY(()) tree vcc_list;
4864 verify_constructor_circularity (meth, current)
4869 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4871 if (TREE_VALUE (c) == meth)
4877 vcc_list = nreverse (vcc_list);
4878 for (liste = vcc_list; liste; liste = TREE_CHAIN (liste))
4881 (TREE_PURPOSE (TREE_PURPOSE (liste)), "%s",
4882 constructor_circularity_msg
4883 (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
4887 t = xstrdup (lang_printable_name (meth, 0));
4888 parse_error_context (TREE_PURPOSE (c),
4889 "%s: recursive invocation of constructor `%s'",
4890 constructor_circularity_msg (current, meth), t);
4892 vcc_list = NULL_TREE;
4896 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4898 vcc_list = tree_cons (c, current, vcc_list);
4899 if (verify_constructor_circularity (meth, TREE_VALUE (c)))
4901 vcc_list = TREE_CHAIN (vcc_list);
4906 /* Check modifiers that can be declared but exclusively */
4909 check_modifiers_consistency (flags)
4913 tree cl = NULL_TREE;
4915 THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, PUBLIC_TK, acc_count, cl);
4916 THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, PRIVATE_TK, acc_count, cl);
4917 THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, PROTECTED_TK, acc_count, cl);
4920 (cl, "Inconsistent member declaration. At most one of `public', `private', or `protected' may be specified");
4924 THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK, acc_count, cl);
4925 THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK, acc_count, cl);
4927 parse_error_context (cl,
4928 "Inconsistent member declaration. At most one of `final' or `volatile' may be specified");
4931 /* Check the methode header METH for abstract specifics features */
4934 check_abstract_method_header (meth)
4937 int flags = get_access_flags_from_decl (meth);
4939 OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (ABSTRACT_TK), flags,
4940 ACC_ABSTRACT, "abstract method",
4941 IDENTIFIER_POINTER (DECL_NAME (meth)));
4942 OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (PUBLIC_TK), flags,
4943 ACC_PUBLIC, "abstract method",
4944 IDENTIFIER_POINTER (DECL_NAME (meth)));
4946 check_modifiers ("Illegal modifier `%s' for interface method",
4947 flags, INTERFACE_METHOD_MODIFIERS);
4950 /* Create a FUNCTION_TYPE node and start augmenting it with the
4951 declared function arguments. Arguments type that can't be resolved
4952 are left as they are, but the returned node is marked as containing
4953 incomplete types. */
4956 method_declarator (id, list)
4959 tree arg_types = NULL_TREE, current, node;
4960 tree meth = make_node (FUNCTION_TYPE);
4963 patch_stage = JDEP_NO_PATCH;
4965 if (GET_CPC () == error_mark_node)
4966 return error_mark_node;
4968 /* If we're dealing with an inner class constructor, we hide the
4969 this$<n> decl in the name field of its parameter declaration. We
4970 also might have to hide the outer context local alias
4971 initializers. Not done when the class is a toplevel class. */
4972 if (PURE_INNER_CLASS_DECL_P (GET_CPC ())
4973 && EXPR_WFL_NODE (id) == GET_CPC_UN ())
4975 tree aliases_list, type, thisn;
4976 /* First the aliases, linked to the regular parameters */
4978 build_alias_initializer_parameter_list (AIPL_FUNCTION_DECLARATION,
4979 TREE_TYPE (GET_CPC ()),
4981 list = chainon (nreverse (aliases_list), list);
4984 type = TREE_TYPE (DECL_CONTEXT (GET_CPC ()));
4985 thisn = build_current_thisn (TREE_TYPE (GET_CPC ()));
4986 list = tree_cons (build_wfl_node (thisn), build_pointer_type (type),
4990 for (current = list; current; current = TREE_CHAIN (current))
4993 tree wfl_name = TREE_PURPOSE (current);
4994 tree type = TREE_VALUE (current);
4995 tree name = EXPR_WFL_NODE (wfl_name);
4996 tree already, arg_node;
4997 tree type_wfl = NULL_TREE;
5000 /* Obtain a suitable type for resolution, if necessary */
5001 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
5003 /* Process NAME, as it may specify extra dimension(s) for it */
5004 type = build_array_from_name (type, type_wfl, name, &name);
5005 EXPR_WFL_NODE (wfl_name) = name;
5007 real_type = GET_REAL_TYPE (type);
5008 if (TREE_CODE (real_type) == RECORD_TYPE)
5010 real_type = promote_type (real_type);
5011 if (TREE_CODE (type) == TREE_LIST)
5012 TREE_PURPOSE (type) = real_type;
5015 /* Check redefinition */
5016 for (already = arg_types; already; already = TREE_CHAIN (already))
5017 if (TREE_PURPOSE (already) == name)
5020 (wfl_name, "Variable `%s' is used more than once in the argument list of method `%s'",
5021 IDENTIFIER_POINTER (name),
5022 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
5026 /* If we've an incomplete argument type, we know there is a location
5027 to patch when the type get resolved, later. */
5031 patch_stage = JDEP_METHOD;
5032 type = register_incomplete_type (patch_stage,
5033 type_wfl, wfl_name, type);
5034 jdep = CLASSD_LAST (ctxp->classd_list);
5035 JDEP_MISC (jdep) = id;
5038 /* The argument node: a name and a (possibly) incomplete type. */
5039 arg_node = build_tree_list (name, real_type);
5040 /* Remeber arguments declared final. */
5041 ARG_FINAL_P (arg_node) = ARG_FINAL_P (current);
5044 JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
5045 TREE_CHAIN (arg_node) = arg_types;
5046 arg_types = arg_node;
5048 TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
5049 node = build_tree_list (id, meth);
5054 unresolved_type_p (wfl, returned)
5059 if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
5063 tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
5064 if (decl && current_class && (decl == TYPE_NAME (current_class)))
5065 *returned = TREE_TYPE (decl);
5066 else if (GET_CPC_UN () == EXPR_WFL_NODE (wfl))
5067 *returned = TREE_TYPE (GET_CPC ());
5069 *returned = NULL_TREE;
5078 /* From NAME, build a qualified identifier node using the
5079 qualification from the current package definition. */
5082 parser_qualified_classname (name)
5085 tree nested_class_name;
5087 if ((nested_class_name = maybe_make_nested_class_name (name)))
5088 return nested_class_name;
5091 return merge_qualified_name (ctxp->package, name);
5096 /* Called once the type a interface extends is resolved. Returns 0 if
5097 everything is OK. */
5100 parser_check_super_interface (super_decl, this_decl, this_wfl)
5101 tree super_decl, this_decl, this_wfl;
5103 tree super_type = TREE_TYPE (super_decl);
5105 /* Has to be an interface */
5106 if (!CLASS_INTERFACE (super_decl))
5109 (this_wfl, "%s `%s' can't implement/extend %s `%s'",
5110 (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
5111 "Interface" : "Class"),
5112 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5113 (TYPE_ARRAY_P (super_type) ? "array" : "class"),
5114 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5118 /* Check top-level interface access. Inner classes are subject to member
5119 access rules (6.6.1). */
5120 if (! INNER_CLASS_P (super_type)
5121 && check_pkg_class_access (DECL_NAME (super_decl),
5122 lookup_cl (this_decl), true))
5125 SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
5126 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5127 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5131 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
5132 0 if everthing is OK. */
5135 parser_check_super (super_decl, this_decl, wfl)
5136 tree super_decl, this_decl, wfl;
5138 tree super_type = TREE_TYPE (super_decl);
5140 /* SUPER should be a CLASS (neither an array nor an interface) */
5141 if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
5144 (wfl, "Class `%s' can't subclass %s `%s'",
5145 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5146 (CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
5147 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5151 if (CLASS_FINAL (TYPE_NAME (super_type)))
5153 parse_error_context (wfl, "Can't subclass final classes: %s",
5154 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5158 /* Check top-level class scope. Inner classes are subject to member access
5160 if (! INNER_CLASS_P (super_type)
5161 && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true)))
5164 SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
5165 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5166 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5170 /* Create a new dependency list and link it (in a LIFO manner) to the
5171 CTXP list of type dependency list. */
5174 create_jdep_list (ctxp)
5175 struct parser_ctxt *ctxp;
5177 jdeplist *new = (jdeplist *)xmalloc (sizeof (jdeplist));
5178 new->first = new->last = NULL;
5179 new->next = ctxp->classd_list;
5180 ctxp->classd_list = new;
5184 reverse_jdep_list (ctxp)
5185 struct parser_ctxt *ctxp;
5187 register jdeplist *prev = NULL, *current, *next;
5188 for (current = ctxp->classd_list; current; current = next)
5190 next = current->next;
5191 current->next = prev;
5197 /* Create a fake pointer based on the ID stored in
5198 TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
5199 registered again. */
5202 obtain_incomplete_type (type_name)
5205 tree ptr = NULL_TREE, name;
5207 if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
5208 name = EXPR_WFL_NODE (type_name);
5209 else if (INCOMPLETE_TYPE_P (type_name))
5210 name = TYPE_NAME (type_name);
5214 BUILD_PTR_FROM_NAME (ptr, name);
5220 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
5221 non NULL instead of computing a new fake type based on WFL. The new
5222 dependency is inserted in the current type dependency list, in FIFO
5226 register_incomplete_type (kind, wfl, decl, ptr)
5228 tree wfl, decl, ptr;
5230 jdep *new = (jdep *)xmalloc (sizeof (jdep));
5232 if (!ptr && kind != JDEP_METHOD_END) /* JDEP_METHOD_END is a mere marker */
5233 ptr = obtain_incomplete_type (wfl);
5235 JDEP_KIND (new) = kind;
5236 JDEP_DECL (new) = decl;
5237 JDEP_TO_RESOLVE (new) = ptr;
5238 JDEP_WFL (new) = wfl;
5239 JDEP_CHAIN (new) = NULL;
5240 JDEP_MISC (new) = NULL_TREE;
5241 /* For some dependencies, set the enclosing class of the current
5242 class to be the enclosing context */
5243 if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS)
5244 && GET_ENCLOSING_CPC ())
5245 JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ());
5246 else if (kind == JDEP_SUPER)
5247 JDEP_ENCLOSING (new) = (GET_ENCLOSING_CPC () ?
5248 TREE_VALUE (GET_ENCLOSING_CPC ()) : NULL_TREE);
5250 JDEP_ENCLOSING (new) = GET_CPC ();
5251 JDEP_GET_PATCH (new) = (tree *)NULL;
5253 JDEP_INSERT (ctxp->classd_list, new);
5258 /* This checks for circular references with innerclasses. We start
5259 from SOURCE and should never reach TARGET. Extended/implemented
5260 types in SOURCE have their enclosing context checked not to reach
5261 TARGET. When the last enclosing context of SOURCE is reached, its
5262 extended/implemented types are also checked not to reach TARGET.
5263 In case of error, WFL of the offending type is returned; NULL_TREE
5267 check_inner_circular_reference (source, target)
5271 tree basetype_vec = TYPE_BINFO_BASETYPES (source);
5278 for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
5282 /* We can end up with a NULL_TREE or an incomplete type here if
5283 we encountered previous type resolution errors. It's safe to
5284 simply ignore these cases. */
5285 if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE)
5287 su = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
5288 if (INCOMPLETE_TYPE_P (su))
5291 if (inherits_from_p (su, target))
5292 return lookup_cl (TYPE_NAME (su));
5294 for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx))
5296 /* An enclosing context shouldn't be TARGET */
5297 if (ctx == TYPE_NAME (target))
5298 return lookup_cl (TYPE_NAME (su));
5300 /* When we reach the enclosing last context, start a check
5301 on it, with the same target */
5302 if (! DECL_CONTEXT (ctx) &&
5303 (cl = check_inner_circular_reference (TREE_TYPE (ctx), target)))
5310 /* Explore TYPE's `extends' clause member(s) and return the WFL of the
5311 offending type if a circularity is detected. NULL_TREE is returned
5312 otherwise. TYPE can be an interface or a class. */
5315 check_circular_reference (type)
5318 tree basetype_vec = TYPE_BINFO_BASETYPES (type);
5324 if (! CLASS_INTERFACE (TYPE_NAME (type)))
5326 if (inherits_from_p (CLASSTYPE_SUPER (type), type))
5327 return lookup_cl (TYPE_NAME (type));
5331 for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
5333 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
5334 if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node
5335 && interface_of_p (type, BINFO_TYPE (vec_elt)))
5336 return lookup_cl (TYPE_NAME (BINFO_TYPE (vec_elt)));
5342 java_check_circular_reference ()
5345 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5347 tree type = TREE_TYPE (current);
5350 cl = check_circular_reference (type);
5352 cl = check_inner_circular_reference (type, type);
5354 parse_error_context (cl, "Cyclic class inheritance%s",
5355 (cyclic_inheritance_report ?
5356 cyclic_inheritance_report : ""));
5360 /* Augment the parameter list PARM with parameters crafted to
5361 initialize outer context locals aliases. Through ARTIFICIAL, a
5362 count is kept of the number of crafted parameters. MODE governs
5363 what eventually gets created: something suitable for a function
5364 creation or a function invocation, either the constructor or
5368 build_alias_initializer_parameter_list (mode, class_type, parm, artificial)
5370 tree class_type, parm;
5374 tree additional_parms = NULL_TREE;
5376 for (field = TYPE_FIELDS (class_type); field; field = TREE_CHAIN (field))
5377 if (FIELD_LOCAL_ALIAS (field))
5379 const char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
5380 tree purpose = NULL_TREE, value = NULL_TREE, name = NULL_TREE;
5385 case AIPL_FUNCTION_DECLARATION:
5386 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5388 purpose = build_wfl_node (mangled_id);
5389 if (TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE)
5390 value = build_wfl_node (TYPE_NAME (TREE_TYPE (field)));
5392 value = TREE_TYPE (field);
5395 case AIPL_FUNCTION_CREATION:
5396 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (purpose,
5398 value = TREE_TYPE (field);
5401 case AIPL_FUNCTION_FINIT_INVOCATION:
5402 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5404 /* Now, this is wrong. purpose should always be the NAME
5405 of something and value its matching value (decl, type,
5406 etc...) FIXME -- but there is a lot to fix. */
5408 /* When invoked for this kind of operation, we already
5409 know whether a field is used or not. */
5410 purpose = TREE_TYPE (field);
5411 value = build_wfl_node (mangled_id);
5414 case AIPL_FUNCTION_CTOR_INVOCATION:
5415 /* There are two case: the constructor invokation happends
5416 outside the local inner, in which case, locales from the outer
5417 context are directly used.
5419 Otherwise, we fold to using the alias directly. */
5420 if (class_type == current_class)
5424 name = get_identifier (&buffer[4]);
5425 value = IDENTIFIER_LOCAL_VALUE (name);
5429 additional_parms = tree_cons (purpose, value, additional_parms);
5433 if (additional_parms)
5435 if (ANONYMOUS_CLASS_P (class_type)
5436 && mode == AIPL_FUNCTION_CTOR_INVOCATION)
5437 additional_parms = nreverse (additional_parms);
5438 parm = chainon (additional_parms, parm);
5444 /* Craft a constructor for CLASS_DECL -- what we should do when none
5445 where found. ARGS is non NULL when a special signature must be
5446 enforced. This is the case for anonymous classes. */
5449 craft_constructor (class_decl, args)
5450 tree class_decl, args;
5452 tree class_type = TREE_TYPE (class_decl);
5453 tree parm = NULL_TREE;
5454 int flags = (get_access_flags_from_decl (class_decl) & ACC_PUBLIC ?
5456 int i = 0, artificial = 0;
5457 tree decl, ctor_name;
5460 /* The constructor name is <init> unless we're dealing with an
5461 anonymous class, in which case the name will be fixed after having
5463 if (ANONYMOUS_CLASS_P (class_type))
5464 ctor_name = DECL_NAME (class_decl);
5466 ctor_name = init_identifier_node;
5468 /* If we're dealing with an inner class constructor, we hide the
5469 this$<n> decl in the name field of its parameter declaration. */
5470 if (PURE_INNER_CLASS_TYPE_P (class_type))
5472 tree type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_type)));
5473 parm = tree_cons (build_current_thisn (class_type),
5474 build_pointer_type (type), parm);
5476 /* Some more arguments to be hidden here. The values of the local
5477 variables of the outer context that the inner class needs to see. */
5478 parm = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
5483 /* Then if there are any args to be enforced, enforce them now */
5484 for (; args && args != end_params_node; args = TREE_CHAIN (args))
5486 sprintf (buffer, "parm%d", i++);
5487 parm = tree_cons (get_identifier (buffer), TREE_VALUE (args), parm);
5490 CRAFTED_PARAM_LIST_FIXUP (parm);
5491 decl = create_artificial_method (class_type, flags, void_type_node,
5493 fix_method_argument_names (parm, decl);
5494 /* Now, mark the artificial parameters. */
5495 DECL_FUNCTION_NAP (decl) = artificial;
5496 DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1;
5501 /* Fix the constructors. This will be called right after circular
5502 references have been checked. It is necessary to fix constructors
5503 early even if no code generation will take place for that class:
5504 some generated constructor might be required by the class whose
5505 compilation triggered this one to be simply loaded. */
5508 java_fix_constructors ()
5512 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5514 tree class_type = TREE_TYPE (current);
5518 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
5521 current_class = class_type;
5522 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
5524 if (DECL_CONSTRUCTOR_P (decl))
5526 fix_constructors (decl);
5531 /* Anonymous class constructor can't be generated that early. */
5532 if (!saw_ctor && !ANONYMOUS_CLASS_P (class_type))
5533 craft_constructor (current, NULL_TREE);
5537 /* safe_layout_class just makes sure that we can load a class without
5538 disrupting the current_class, input_file, lineno, etc, information
5539 about the class processed currently. */
5542 safe_layout_class (class)
5545 tree save_current_class = current_class;
5546 const char *save_input_filename = input_filename;
5547 int save_lineno = lineno;
5549 layout_class (class);
5551 current_class = save_current_class;
5552 input_filename = save_input_filename;
5553 lineno = save_lineno;
5557 jdep_resolve_class (dep)
5562 if (JDEP_RESOLVED_P (dep))
5563 decl = JDEP_RESOLVED_DECL (dep);
5566 decl = resolve_class (JDEP_ENCLOSING (dep), JDEP_TO_RESOLVE (dep),
5567 JDEP_DECL (dep), JDEP_WFL (dep));
5568 JDEP_RESOLVED (dep, decl);
5572 complete_class_report_errors (dep);
5573 else if (PURE_INNER_CLASS_DECL_P (decl))
5575 tree inner = TREE_TYPE (decl);
5576 if (! CLASS_LOADED_P (inner))
5578 safe_layout_class (inner);
5579 if (TYPE_SIZE (inner) == error_mark_node)
5580 TYPE_SIZE (inner) = NULL_TREE;
5582 check_inner_class_access (decl, JDEP_ENCLOSING (dep), JDEP_WFL (dep));
5587 /* Complete unsatisfied class declaration and their dependencies */
5590 java_complete_class ()
5597 /* Process imports */
5600 /* Rever things so we have the right order */
5601 ctxp->class_list = nreverse (ctxp->class_list);
5602 ctxp->classd_list = reverse_jdep_list (ctxp);
5604 for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
5606 cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
5610 /* We keep the compilation unit imports in the class so that
5611 they can be used later to resolve type dependencies that
5612 aren't necessary to solve now. */
5613 TYPE_IMPORT_LIST (TREE_TYPE (cclass)) = ctxp->import_list;
5614 TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (cclass)) = ctxp->import_demand_list;
5616 for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
5619 if (!(decl = jdep_resolve_class (dep)))
5622 /* Now it's time to patch */
5623 switch (JDEP_KIND (dep))
5626 /* Simply patch super */
5627 if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
5629 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO
5630 (TREE_TYPE (JDEP_DECL (dep)))), 0)) = TREE_TYPE (decl);
5635 /* We do part of the job done in add_field */
5636 tree field_decl = JDEP_DECL (dep);
5637 tree field_type = TREE_TYPE (decl);
5638 if (TREE_CODE (field_type) == RECORD_TYPE)
5639 field_type = promote_type (field_type);
5640 TREE_TYPE (field_decl) = field_type;
5641 DECL_ALIGN (field_decl) = 0;
5642 DECL_USER_ALIGN (field_decl) = 0;
5643 layout_decl (field_decl, 0);
5644 SOURCE_FRONTEND_DEBUG
5645 (("Completed field/var decl `%s' with `%s'",
5646 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
5647 IDENTIFIER_POINTER (DECL_NAME (decl))));
5650 case JDEP_METHOD: /* We start patching a method */
5651 case JDEP_METHOD_RETURN:
5657 type = TREE_TYPE(decl);
5658 if (TREE_CODE (type) == RECORD_TYPE)
5659 type = promote_type (type);
5660 JDEP_APPLY_PATCH (dep, type);
5661 SOURCE_FRONTEND_DEBUG
5662 (((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
5663 "Completing fct `%s' with ret type `%s'":
5664 "Completing arg `%s' with type `%s'"),
5665 IDENTIFIER_POINTER (EXPR_WFL_NODE
5666 (JDEP_DECL_WFL (dep))),
5667 IDENTIFIER_POINTER (DECL_NAME (decl))));
5671 dep = JDEP_CHAIN (dep);
5672 if (JDEP_KIND (dep) == JDEP_METHOD_END)
5675 decl = jdep_resolve_class (dep);
5679 tree mdecl = JDEP_DECL (dep), signature;
5680 /* Recompute and reset the signature, check first that
5681 all types are now defined. If they're not,
5682 don't build the signature. */
5683 if (check_method_types_complete (mdecl))
5685 signature = build_java_signature (TREE_TYPE (mdecl));
5686 set_java_signature (TREE_TYPE (mdecl), signature);
5693 case JDEP_INTERFACE:
5694 if (parser_check_super_interface (decl, JDEP_DECL (dep),
5697 parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
5702 type = TREE_TYPE(decl);
5703 if (TREE_CODE (type) == RECORD_TYPE)
5704 type = promote_type (type);
5705 JDEP_APPLY_PATCH (dep, type);
5709 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5710 SOURCE_FRONTEND_DEBUG
5711 (("Completing a random type dependency on a '%s' node",
5712 tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
5715 case JDEP_EXCEPTION:
5716 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5717 SOURCE_FRONTEND_DEBUG
5718 (("Completing `%s' `throws' argument node",
5719 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
5722 case JDEP_ANONYMOUS:
5723 patch_anonymous_class (decl, JDEP_DECL (dep), JDEP_WFL (dep));
5734 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
5738 resolve_class (enclosing, class_type, decl, cl)
5739 tree enclosing, class_type, decl, cl;
5741 tree tname = TYPE_NAME (class_type);
5742 tree resolved_type = TREE_TYPE (class_type);
5744 tree resolved_type_decl;
5746 if (resolved_type != NULL_TREE)
5748 tree resolved_type_decl = TYPE_NAME (resolved_type);
5749 if (resolved_type_decl == NULL_TREE
5750 || TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
5752 resolved_type_decl = build_decl (TYPE_DECL,
5753 TYPE_NAME (class_type),
5756 return resolved_type_decl;
5759 /* 1- Check to see if we have an array. If true, find what we really
5761 if ((array_dims = build_type_name_from_array_name (tname,
5762 &TYPE_NAME (class_type))))
5763 WFL_STRIP_BRACKET (cl, cl);
5765 /* 2- Resolve the bare type */
5766 if (!(resolved_type_decl = do_resolve_class (enclosing, class_type,
5769 resolved_type = TREE_TYPE (resolved_type_decl);
5771 /* 3- If we have and array, reconstruct the array down to its nesting */
5774 for (; array_dims; array_dims--)
5775 resolved_type = build_java_array_type (resolved_type, -1);
5776 resolved_type_decl = TYPE_NAME (resolved_type);
5778 TREE_TYPE (class_type) = resolved_type;
5779 return resolved_type_decl;
5782 /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL
5783 are used to report error messages. Do not try to replace TYPE_NAME
5784 (class_type) by a variable, since it is changed by
5785 find_in_imports{_on_demand} and (but it doesn't really matter)
5786 qualify_and_find. */
5789 do_resolve_class (enclosing, class_type, decl, cl)
5790 tree enclosing, class_type, decl, cl;
5792 tree new_class_decl = NULL_TREE, super = NULL_TREE;
5793 tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
5795 htab_t circularity_hash;
5797 /* This hash table is used to register the classes we're going
5798 through when searching the current class as an inner class, in
5799 order to detect circular references. Remember to free it before
5800 returning the section 0- of this function. */
5801 circularity_hash = htab_create (20, htab_hash_pointer, htab_eq_pointer,
5804 /* 0- Search in the current class as an inner class.
5805 Maybe some code here should be added to load the class or
5806 something, at least if the class isn't an inner class and ended
5807 being loaded from class file. FIXME. */
5810 new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing,
5811 &super, class_type);
5815 /* If we haven't found anything because SUPER reached Object and
5816 ENCLOSING happens to be an innerclass, try the enclosing context. */
5817 if ((!super || super == object_type_node) &&
5818 enclosing && INNER_CLASS_DECL_P (enclosing))
5819 enclosing = DECL_CONTEXT (enclosing);
5821 enclosing = NULL_TREE;
5824 htab_delete (circularity_hash);
5827 return new_class_decl;
5829 /* 1- Check for the type in single imports. This will change
5830 TYPE_NAME() if something relevant is found */
5831 find_in_imports (saved_enclosing_type, class_type);
5833 /* 2- And check for the type in the current compilation unit */
5834 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5836 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
5837 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
5838 load_class (TYPE_NAME (class_type), 0);
5839 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5842 /* 3- Search according to the current package definition */
5843 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5845 if ((new_class_decl = qualify_and_find (class_type, ctxp->package,
5846 TYPE_NAME (class_type))))
5847 return new_class_decl;
5850 /* 4- Check the import on demands. Don't allow bar.baz to be
5851 imported from foo.* */
5852 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5853 if (find_in_imports_on_demand (saved_enclosing_type, class_type))
5856 /* If found in find_in_imports_on_demant, the type has already been
5858 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5859 return new_class_decl;
5861 /* 5- Try with a name qualified with the package name we've seen so far */
5862 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5866 /* If there is a current package (ctxp->package), it's the first
5867 element of package_list and we can skip it. */
5868 for (package = (ctxp->package ?
5869 TREE_CHAIN (package_list) : package_list);
5870 package; package = TREE_CHAIN (package))
5871 if ((new_class_decl = qualify_and_find (class_type,
5872 TREE_PURPOSE (package),
5873 TYPE_NAME (class_type))))
5874 return new_class_decl;
5877 /* 5- Check an other compilation unit that bears the name of type */
5878 load_class (TYPE_NAME (class_type), 0);
5881 cl = lookup_cl (decl);
5883 /* If we don't have a value for CL, then we're being called recursively.
5884 We can't check package access just yet, but it will be taken care of
5888 if (check_pkg_class_access (TYPE_NAME (class_type), cl, true))
5892 /* 6- Last call for a resolution */
5893 decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5895 /* The final lookup might have registered a.b.c into a.b$c If we
5896 failed at the first lookup, progressively change the name if
5897 applicable and use the matching DECL instead. */
5898 if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
5901 tree name = TYPE_NAME (class_type);
5902 char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1);
5904 strcpy (namebuffer, IDENTIFIER_POINTER (name));
5908 /* Reach the last '.', and if applicable, replace it by a `$' and
5909 see if this exists as a type. */
5910 if ((separator = strrchr (namebuffer, '.')))
5913 name = get_identifier (namebuffer);
5914 decl_result = IDENTIFIER_CLASS_VALUE (name);
5916 } while (!decl_result && separator);
5922 qualify_and_find (class_type, package, name)
5923 tree class_type, package, name;
5925 tree new_qualified = merge_qualified_name (package, name);
5926 tree new_class_decl;
5928 if (!IDENTIFIER_CLASS_VALUE (new_qualified))
5929 load_class (new_qualified, 0);
5930 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_qualified)))
5932 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
5933 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
5934 load_class (new_qualified, 0);
5935 TYPE_NAME (class_type) = new_qualified;
5936 return IDENTIFIER_CLASS_VALUE (new_qualified);
5941 /* Resolve NAME and lay it out (if not done and if not the current
5942 parsed class). Return a decl node. This function is meant to be
5943 called when type resolution is necessary during the walk pass. */
5946 resolve_and_layout (something, cl)
5950 tree decl, decl_type;
5952 /* Don't do that on the current class */
5953 if (something == current_class)
5954 return TYPE_NAME (current_class);
5956 /* Don't do anything for void and other primitive types */
5957 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5960 /* Pointer types can be reall pointer types or fake pointers. When
5961 finding a real pointer, recheck for primitive types */
5962 if (TREE_CODE (something) == POINTER_TYPE)
5964 if (TREE_TYPE (something))
5966 something = TREE_TYPE (something);
5967 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5971 something = TYPE_NAME (something);
5974 /* Don't do anything for arrays of primitive types */
5975 if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
5976 && JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
5979 /* Something might be a WFL */
5980 if (TREE_CODE (something) == EXPR_WITH_FILE_LOCATION)
5981 something = EXPR_WFL_NODE (something);
5983 /* Otherwise, if something is not and IDENTIFIER_NODE, it can be a a
5984 TYPE_DECL or a real TYPE */
5985 else if (TREE_CODE (something) != IDENTIFIER_NODE)
5986 something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
5987 DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
5989 if (!(decl = resolve_no_layout (something, cl)))
5992 /* Resolve and layout if necessary */
5993 decl_type = TREE_TYPE (decl);
5994 layout_class_methods (decl_type);
5996 if (CLASS_FROM_SOURCE_P (decl_type))
5997 java_check_methods (decl);
5998 /* Layout the type if necessary */
5999 if (decl_type != current_class && !CLASS_LOADED_P (decl_type))
6000 safe_layout_class (decl_type);
6005 /* Resolve a class, returns its decl but doesn't perform any
6006 layout. The current parsing context is saved and restored */
6009 resolve_no_layout (name, cl)
6013 BUILD_PTR_FROM_NAME (ptr, name);
6014 java_parser_context_save_global ();
6015 decl = resolve_class (TYPE_NAME (current_class), ptr, NULL_TREE, cl);
6016 java_parser_context_restore_global ();
6021 /* Called when reporting errors. Skip the '[]'s in a complex array
6022 type description that failed to be resolved. purify_type_name can't
6023 use an identifier tree. */
6026 purify_type_name (name)
6029 int len = strlen (name);
6032 STRING_STRIP_BRACKETS (name, len, bracket_found);
6035 char *stripped_name = xmemdup (name, len, len+1);
6036 stripped_name [len] = '\0';
6037 return stripped_name;
6042 /* The type CURRENT refers to can't be found. We print error messages. */
6045 complete_class_report_errors (dep)
6050 if (!JDEP_WFL (dep))
6053 name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
6054 switch (JDEP_KIND (dep))
6058 (JDEP_WFL (dep), "Superclass `%s' of class `%s' not found",
6059 purify_type_name (name),
6060 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6064 (JDEP_WFL (dep), "Type `%s' not found in declaration of field `%s'",
6065 purify_type_name (name),
6066 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6068 case JDEP_METHOD: /* Covers arguments */
6070 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the argument `%s' of method `%s'",
6071 purify_type_name (name),
6072 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
6073 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
6075 case JDEP_METHOD_RETURN: /* Covers return type */
6077 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the return type of method `%s'",
6078 purify_type_name (name),
6079 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
6081 case JDEP_INTERFACE:
6083 (JDEP_WFL (dep), "Superinterface `%s' of %s `%s' not found",
6084 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
6085 (CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
6086 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6090 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the local variable `%s'",
6091 purify_type_name (IDENTIFIER_POINTER
6092 (EXPR_WFL_NODE (JDEP_WFL (dep)))),
6093 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6095 case JDEP_EXCEPTION: /* As specified by `throws' */
6097 (JDEP_WFL (dep), "Class `%s' not found in `throws'",
6098 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
6101 /* Fix for -Wall. Just break doing nothing. The error will be
6107 /* Return a static string containing the DECL prototype string. If
6108 DECL is a constructor, use the class name instead of the form
6112 get_printable_method_name (decl)
6115 const char *to_return;
6116 tree name = NULL_TREE;
6118 if (DECL_CONSTRUCTOR_P (decl))
6120 name = DECL_NAME (decl);
6121 DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
6124 to_return = lang_printable_name (decl, 0);
6125 if (DECL_CONSTRUCTOR_P (decl))
6126 DECL_NAME (decl) = name;
6131 /* Track method being redefined inside the same class. As a side
6132 effect, set DECL_NAME to an IDENTIFIER (prior entering this
6133 function it's a FWL, so we can track errors more accurately.) */
6136 check_method_redefinition (class, method)
6141 /* There's no need to verify <clinit> and finit$ and instinit$ */
6142 if (DECL_CLINIT_P (method)
6143 || DECL_FINIT_P (method) || DECL_INSTINIT_P (method))
6146 sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
6147 for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
6149 if (redef == method)
6151 if (DECL_NAME (redef) == DECL_NAME (method)
6152 && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))
6153 && !DECL_ARTIFICIAL (method))
6156 (DECL_FUNCTION_WFL (method), "Duplicate %s declaration `%s'",
6157 (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
6158 get_printable_method_name (redef));
6165 /* Return 1 if check went ok, 0 otherwise. */
6167 check_abstract_method_definitions (do_interface, class_decl, type)
6169 tree class_decl, type;
6171 tree class = TREE_TYPE (class_decl);
6172 tree method, end_type;
6175 end_type = (do_interface ? object_type_node : type);
6176 for (method = TYPE_METHODS (type); method; method = TREE_CHAIN (method))
6178 tree other_super, other_method, method_sig, method_name;
6180 int end_type_reached = 0;
6182 if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
6185 /* Now verify that somewhere in between TYPE and CLASS,
6186 abstract method METHOD gets a non abstract definition
6187 that is inherited by CLASS. */
6189 method_sig = build_java_signature (TREE_TYPE (method));
6190 method_name = DECL_NAME (method);
6191 if (TREE_CODE (method_name) == EXPR_WITH_FILE_LOCATION)
6192 method_name = EXPR_WFL_NODE (method_name);
6194 other_super = class;
6196 if (other_super == end_type)
6197 end_type_reached = 1;
6200 for (other_method = TYPE_METHODS (other_super); other_method;
6201 other_method = TREE_CHAIN (other_method))
6203 tree s = build_java_signature (TREE_TYPE (other_method));
6204 tree other_name = DECL_NAME (other_method);
6206 if (TREE_CODE (other_name) == EXPR_WITH_FILE_LOCATION)
6207 other_name = EXPR_WFL_NODE (other_name);
6208 if (!DECL_CLINIT_P (other_method)
6209 && !DECL_CONSTRUCTOR_P (other_method)
6210 && method_name == other_name
6212 && !METHOD_ABSTRACT (other_method))
6218 other_super = CLASSTYPE_SUPER (other_super);
6219 } while (!end_type_reached);
6221 /* Report that abstract METHOD didn't find an implementation
6222 that CLASS can use. */
6225 char *t = xstrdup (lang_printable_name
6226 (TREE_TYPE (TREE_TYPE (method)), 0));
6227 tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
6230 (lookup_cl (class_decl),
6231 "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",
6232 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6233 t, lang_printable_name (method, 0),
6234 (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))) ?
6235 "interface" : "class"),
6236 IDENTIFIER_POINTER (ccn),
6237 (CLASS_INTERFACE (class_decl) ? "interface" : "class"),
6238 IDENTIFIER_POINTER (DECL_NAME (class_decl)));
6244 if (ok && do_interface)
6246 /* Check for implemented interfaces. */
6248 tree vector = TYPE_BINFO_BASETYPES (type);
6249 for (i = 1; ok && vector && i < TREE_VEC_LENGTH (vector); i++)
6251 tree super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
6252 ok = check_abstract_method_definitions (1, class_decl, super);
6259 /* Check that CLASS_DECL somehow implements all inherited abstract
6263 java_check_abstract_method_definitions (class_decl)
6266 tree class = TREE_TYPE (class_decl);
6270 if (CLASS_ABSTRACT (class_decl))
6273 /* Check for inherited types */
6276 super = CLASSTYPE_SUPER (super);
6277 check_abstract_method_definitions (0, class_decl, super);
6278 } while (super != object_type_node);
6280 /* Check for implemented interfaces. */
6281 vector = TYPE_BINFO_BASETYPES (class);
6282 for (i = 1; i < TREE_VEC_LENGTH (vector); i++)
6284 super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
6285 check_abstract_method_definitions (1, class_decl, super);
6289 /* Check all the types method DECL uses and return 1 if all of them
6290 are now complete, 0 otherwise. This is used to check whether its
6291 safe to build a method signature or not. */
6294 check_method_types_complete (decl)
6297 tree type = TREE_TYPE (decl);
6300 if (!INCOMPLETE_TYPE_P (TREE_TYPE (type)))
6303 args = TYPE_ARG_TYPES (type);
6304 if (TREE_CODE (type) == METHOD_TYPE)
6305 args = TREE_CHAIN (args);
6306 for (; args != end_params_node; args = TREE_CHAIN (args))
6307 if (INCOMPLETE_TYPE_P (TREE_VALUE (args)))
6313 /* Visible interface to check methods contained in CLASS_DECL */
6316 java_check_methods (class_decl)
6319 if (CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)))
6322 if (CLASS_INTERFACE (class_decl))
6323 java_check_abstract_methods (class_decl);
6325 java_check_regular_methods (class_decl);
6327 CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)) = 1;
6330 /* Check all the methods of CLASS_DECL. Methods are first completed
6331 then checked according to regular method existence rules. If no
6332 constructor for CLASS_DECL were encountered, then build its
6336 java_check_regular_methods (class_decl)
6339 int saw_constructor = ANONYMOUS_CLASS_P (TREE_TYPE (class_decl));
6341 tree class = TREE_TYPE (class_decl);
6342 tree found = NULL_TREE;
6345 /* It is not necessary to check methods defined in java.lang.Object */
6346 if (class == object_type_node)
6349 if (!TYPE_NVIRTUALS (class))
6350 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6352 /* Should take interfaces into account. FIXME */
6353 for (method = TYPE_METHODS (class); method; method = TREE_CHAIN (method))
6356 tree method_wfl = DECL_FUNCTION_WFL (method);
6359 /* Check for redefinitions */
6360 if (check_method_redefinition (class, method))
6363 /* If we see one constructor a mark so we don't generate the
6364 default one. Also skip other verifications: constructors
6365 can't be inherited hence hiden or overriden */
6366 if (DECL_CONSTRUCTOR_P (method))
6368 saw_constructor = 1;
6372 /* We verify things thrown by the method. They must inherits from
6373 java.lang.Throwable */
6374 for (mthrows = DECL_FUNCTION_THROWS (method);
6375 mthrows; mthrows = TREE_CHAIN (mthrows))
6377 if (!inherits_from_p (TREE_VALUE (mthrows), throwable_type_node))
6379 (TREE_PURPOSE (mthrows), "Class `%s' in `throws' clause must be a subclass of class `java.lang.Throwable'",
6381 (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))));
6384 sig = build_java_argument_signature (TREE_TYPE (method));
6385 found = lookup_argument_method2 (class, DECL_NAME (method), sig);
6387 /* Inner class can't declare static methods */
6388 if (METHOD_STATIC (method) && !TOPLEVEL_CLASS_DECL_P (class_decl))
6390 char *t = xstrdup (lang_printable_name (class, 0));
6392 (method_wfl, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
6393 lang_printable_name (method, 0), t);
6397 /* Nothing overrides or it's a private method. */
6400 if (METHOD_PRIVATE (found))
6406 /* If `found' is declared in an interface, make sure the
6407 modifier matches. */
6408 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6409 && clinit_identifier_node != DECL_NAME (found)
6410 && !METHOD_PUBLIC (method))
6412 tree found_decl = TYPE_NAME (DECL_CONTEXT (found));
6413 parse_error_context (method_wfl, "Class `%s' must override `%s' with a public method in order to implement interface `%s'",
6414 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6415 lang_printable_name (method, 0),
6416 IDENTIFIER_POINTER (DECL_NAME (found_decl)));
6419 /* Can't override a method with the same name and different return
6421 if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
6424 (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6427 "Method `%s' was defined with return type `%s' in class `%s'",
6428 lang_printable_name (found, 0), t,
6430 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6434 aflags = get_access_flags_from_decl (found);
6436 /* Can't override final. Can't override static. */
6437 if (METHOD_FINAL (found) || METHOD_STATIC (found))
6439 /* Static *can* override static */
6440 if (METHOD_STATIC (found) && METHOD_STATIC (method))
6444 "%s methods can't be overriden. Method `%s' is %s in class `%s'",
6445 (METHOD_FINAL (found) ? "Final" : "Static"),
6446 lang_printable_name (found, 0),
6447 (METHOD_FINAL (found) ? "final" : "static"),
6449 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6453 /* Static method can't override instance method. */
6454 if (METHOD_STATIC (method))
6458 "Instance methods can't be overriden by a static method. Method `%s' is an instance method in class `%s'",
6459 lang_printable_name (found, 0),
6461 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6465 /* - Overriding/hiding public must be public
6466 - Overriding/hiding protected must be protected or public
6467 - If the overriden or hidden method has default (package)
6468 access, then the overriding or hiding method must not be
6469 private; otherwise, a compile-time error occurs. If
6470 `found' belongs to an interface, things have been already
6472 if (!CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6473 && ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
6474 || (METHOD_PROTECTED (found)
6475 && !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
6476 || (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
6477 && METHOD_PRIVATE (method))))
6481 "Methods can't be overridden to be more private. Method `%s' is not %s in class `%s'", lang_printable_name (method, 0),
6482 (METHOD_PUBLIC (method) ? "public" :
6483 (METHOD_PRIVATE (method) ? "private" : "protected")),
6484 IDENTIFIER_POINTER (DECL_NAME
6485 (TYPE_NAME (DECL_CONTEXT (found)))));
6489 /* Overriding methods must have compatible `throws' clauses on checked
6490 exceptions, if any */
6491 check_throws_clauses (method, method_wfl, found);
6493 /* Inheriting multiple methods with the same signature. FIXME */
6496 if (!TYPE_NVIRTUALS (class))
6497 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6499 /* Search for inherited abstract method not yet implemented in this
6501 java_check_abstract_method_definitions (class_decl);
6503 if (!saw_constructor)
6507 /* Return a non zero value if the `throws' clause of METHOD (if any)
6508 is incompatible with the `throws' clause of FOUND (if any). */
6511 check_throws_clauses (method, method_wfl, found)
6512 tree method, method_wfl, found;
6514 tree mthrows, fthrows;
6516 /* Can't check these things with class loaded from bytecode. FIXME */
6517 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
6520 for (mthrows = DECL_FUNCTION_THROWS (method);
6521 mthrows; mthrows = TREE_CHAIN (mthrows))
6523 /* We don't verify unchecked expressions */
6524 if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
6526 /* Checked expression must be compatible */
6527 for (fthrows = DECL_FUNCTION_THROWS (found);
6528 fthrows; fthrows = TREE_CHAIN (fthrows))
6529 if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
6534 (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'",
6535 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
6536 lang_printable_name (found, 0),
6538 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6543 /* Check abstract method of interface INTERFACE */
6546 java_check_abstract_methods (interface_decl)
6547 tree interface_decl;
6550 tree method, basetype_vec, found;
6551 tree interface = TREE_TYPE (interface_decl);
6553 for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
6555 /* 2- Check for double definition inside the defining interface */
6556 if (check_method_redefinition (interface, method))
6559 /* 3- Overriding is OK as far as we preserve the return type and
6560 the thrown exceptions (FIXME) */
6561 found = lookup_java_interface_method2 (interface, method);
6565 t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6567 (DECL_FUNCTION_WFL (found),
6568 "Method `%s' was defined with return type `%s' in class `%s'",
6569 lang_printable_name (found, 0), t,
6571 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6577 /* 4- Inherited methods can't differ by their returned types */
6578 if (!(basetype_vec = TYPE_BINFO_BASETYPES (interface)))
6580 n = TREE_VEC_LENGTH (basetype_vec);
6581 for (i = 0; i < n; i++)
6583 tree sub_interface_method, sub_interface;
6584 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
6587 sub_interface = BINFO_TYPE (vec_elt);
6588 for (sub_interface_method = TYPE_METHODS (sub_interface);
6589 sub_interface_method;
6590 sub_interface_method = TREE_CHAIN (sub_interface_method))
6592 found = lookup_java_interface_method2 (interface,
6593 sub_interface_method);
6594 if (found && (found != sub_interface_method))
6597 (lookup_cl (sub_interface_method),
6598 "Interface `%s' inherits method `%s' from interface `%s'. This method is redefined with a different return type in interface `%s'",
6599 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
6600 lang_printable_name (found, 0),
6602 (DECL_NAME (TYPE_NAME
6603 (DECL_CONTEXT (sub_interface_method)))),
6605 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6611 /* Lookup methods in interfaces using their name and partial
6612 signature. Return a matching method only if their types differ. */
6615 lookup_java_interface_method2 (class, method_decl)
6616 tree class, method_decl;
6619 tree basetype_vec = TYPE_BINFO_BASETYPES (class), to_return;
6624 n = TREE_VEC_LENGTH (basetype_vec);
6625 for (i = 0; i < n; i++)
6627 tree vec_elt = TREE_VEC_ELT (basetype_vec, i), to_return;
6628 if ((BINFO_TYPE (vec_elt) != object_type_node)
6630 lookup_java_method2 (BINFO_TYPE (vec_elt), method_decl, 1)))
6633 for (i = 0; i < n; i++)
6635 to_return = lookup_java_interface_method2
6636 (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)), method_decl);
6644 /* Lookup method using their name and partial signature. Return a
6645 matching method only if their types differ. */
6648 lookup_java_method2 (clas, method_decl, do_interface)
6649 tree clas, method_decl;
6652 tree method, method_signature, method_name, method_type, name;
6654 method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
6655 name = DECL_NAME (method_decl);
6656 method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6657 EXPR_WFL_NODE (name) : name);
6658 method_type = TREE_TYPE (TREE_TYPE (method_decl));
6660 while (clas != NULL_TREE)
6662 for (method = TYPE_METHODS (clas);
6663 method != NULL_TREE; method = TREE_CHAIN (method))
6665 tree method_sig = build_java_argument_signature (TREE_TYPE (method));
6666 tree name = DECL_NAME (method);
6667 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6668 EXPR_WFL_NODE (name) : name) == method_name
6669 && method_sig == method_signature
6670 && TREE_TYPE (TREE_TYPE (method)) != method_type)
6673 clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
6678 /* Return the line that matches DECL line number, and try its best to
6679 position the column number. Used during error reports. */
6681 static GTY(()) tree cl_v;
6691 if (cl_v == NULL_TREE)
6693 cl_v = build_expr_wfl (NULL_TREE, NULL, 0, 0);
6696 EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
6697 EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE_FIRST (decl), -1);
6699 line = java_get_line_col (EXPR_WFL_FILENAME (cl_v),
6700 EXPR_WFL_LINENO (cl_v), EXPR_WFL_COLNO (cl_v));
6702 found = strstr ((const char *)line,
6703 (const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
6705 EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
6710 /* Look for a simple name in the single-type import list */
6713 find_name_in_single_imports (name)
6718 for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
6719 if (TREE_VALUE (node) == name)
6720 return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
6725 /* Process all single-type import. */
6733 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
6735 tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
6736 char *original_name;
6738 obstack_grow0 (&temporary_obstack,
6739 IDENTIFIER_POINTER (to_be_found),
6740 IDENTIFIER_LENGTH (to_be_found));
6741 original_name = obstack_finish (&temporary_obstack);
6743 /* Don't load twice something already defined. */
6744 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6751 QUALIFIED_P (to_be_found) = 1;
6752 load_class (to_be_found, 0);
6754 check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true);
6756 /* We found it, we can bail out */
6757 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6760 /* We haven't found it. Maybe we're trying to access an
6761 inner class. The only way for us to know is to try again
6762 after having dropped a qualifier. If we can't break it further,
6763 we have an error. */
6764 if (breakdown_qualified (&left, NULL, to_be_found))
6769 if (!IDENTIFIER_CLASS_VALUE (to_be_found))
6771 parse_error_context (TREE_PURPOSE (import),
6772 "Class or interface `%s' not found in import",
6777 obstack_free (&temporary_obstack, original_name);
6784 /* Possibly find and mark a class imported by a single-type import
6788 find_in_imports (enclosing_type, class_type)
6789 tree enclosing_type;
6792 tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) :
6796 if (TREE_VALUE (import) == TYPE_NAME (class_type))
6798 TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
6799 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
6802 import = TREE_CHAIN (import);
6807 note_possible_classname (name, len)
6812 if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
6814 else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
6818 node = ident_subst (name, len, "", '/', '.', "");
6819 IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
6820 QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
6824 /* Read a import directory, gathering potential match for further type
6825 references. Indifferently reads a filesystem or a ZIP archive
6829 read_import_dir (wfl)
6832 tree package_id = EXPR_WFL_NODE (wfl);
6833 const char *package_name = IDENTIFIER_POINTER (package_id);
6834 int package_length = IDENTIFIER_LENGTH (package_id);
6836 JCF *saved_jcf = current_jcf;
6841 struct buffer filename[1];
6843 if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
6845 IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
6847 BUFFER_INIT (filename);
6848 buffer_grow (filename, package_length + 100);
6850 for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
6852 const char *entry_name = jcf_path_name (entry);
6853 int entry_length = strlen (entry_name);
6854 if (jcf_path_is_zipfile (entry))
6857 buffer_grow (filename, entry_length);
6858 memcpy (filename->data, entry_name, entry_length - 1);
6859 filename->data[entry_length-1] = '\0';
6860 zipf = opendir_in_zip (filename->data, jcf_path_is_system (entry));
6862 error ("malformed .zip archive in CLASSPATH: %s", entry_name);
6865 ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
6866 BUFFER_RESET (filename);
6867 for (k = 0; k < package_length; k++)
6869 char ch = package_name[k];
6870 *filename->ptr++ = ch == '.' ? '/' : ch;
6872 *filename->ptr++ = '/';
6874 for (k = 0; k < zipf->count; k++, zipd = ZIPDIR_NEXT (zipd))
6876 const char *current_entry = ZIPDIR_FILENAME (zipd);
6877 int current_entry_len = zipd->filename_length;
6879 if (current_entry_len >= BUFFER_LENGTH (filename)
6880 && strncmp (filename->data, current_entry,
6881 BUFFER_LENGTH (filename)) != 0)
6883 found |= note_possible_classname (current_entry,
6890 BUFFER_RESET (filename);
6891 buffer_grow (filename, entry_length + package_length + 4);
6892 strcpy (filename->data, entry_name);
6893 filename->ptr = filename->data + entry_length;
6894 for (k = 0; k < package_length; k++)
6896 char ch = package_name[k];
6897 *filename->ptr++ = ch == '.' ? '/' : ch;
6899 *filename->ptr = '\0';
6901 dirp = opendir (filename->data);
6904 *filename->ptr++ = '/';
6909 struct dirent *direntp = readdir (dirp);
6912 d_name = direntp->d_name;
6913 len = strlen (direntp->d_name);
6914 buffer_grow (filename, len+1);
6915 strcpy (filename->ptr, d_name);
6916 found |= note_possible_classname (filename->data + entry_length,
6917 package_length+len+1);
6924 free (filename->data);
6926 /* Here we should have a unified way of retrieving an entry, to be
6930 static int first = 1;
6933 error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives", package_name);
6938 parse_error_context (wfl, "Package `%s' not found in import",
6940 current_jcf = saved_jcf;
6943 current_jcf = saved_jcf;
6946 /* Possibly find a type in the import on demands specified
6947 types. Returns 1 if an error occurred, 0 otherwise. Run through the
6948 entire list, to detected potential double definitions. */
6951 find_in_imports_on_demand (enclosing_type, class_type)
6952 tree enclosing_type;
6955 tree class_type_name = TYPE_NAME (class_type);
6956 tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) :
6957 ctxp->import_demand_list);
6958 tree cl = NULL_TREE;
6959 int seen_once = -1; /* -1 when not set, 1 if seen once, >1 otherwise. */
6960 int to_return = -1; /* -1 when not set, 0 or 1 otherwise */
6963 for (; import; import = TREE_CHAIN (import))
6965 int saved_lineno = lineno;
6967 const char *id_name;
6968 tree decl, type_name_copy;
6970 obstack_grow (&temporary_obstack,
6971 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
6972 IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
6973 obstack_1grow (&temporary_obstack, '.');
6974 obstack_grow0 (&temporary_obstack,
6975 IDENTIFIER_POINTER (class_type_name),
6976 IDENTIFIER_LENGTH (class_type_name));
6977 id_name = obstack_finish (&temporary_obstack);
6979 if (! (node = maybe_get_identifier (id_name)))
6982 /* Setup lineno so that it refers to the line of the import (in
6983 case we parse a class file and encounter errors */
6984 lineno = EXPR_WFL_LINENO (TREE_PURPOSE (import));
6986 type_name_copy = TYPE_NAME (class_type);
6987 TYPE_NAME (class_type) = node;
6988 QUALIFIED_P (node) = 1;
6989 decl = IDENTIFIER_CLASS_VALUE (node);
6991 /* If there is no DECL set for the class or if the class isn't
6992 loaded and not seen in source yet, then load */
6993 if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl))
6994 && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl))))
6996 load_class (node, 0);
6997 decl = IDENTIFIER_CLASS_VALUE (node);
6999 if (decl && ! INNER_CLASS_P (TREE_TYPE (decl)))
7000 access_check = check_pkg_class_access (node, TREE_PURPOSE (import),
7003 /* 6.6.1: Inner classes are subject to member access rules. */
7006 lineno = saved_lineno;
7008 /* If the loaded class is not accessible or couldn't be loaded,
7009 we restore the original TYPE_NAME and process the next
7011 if (access_check || !decl)
7013 TYPE_NAME (class_type) = type_name_copy;
7017 /* If the loaded class is accessible, we keep a tab on it to
7018 detect and report multiple inclusions. */
7019 if (IS_A_CLASSFILE_NAME (node))
7023 cl = TREE_PURPOSE (import);
7026 else if (seen_once >= 0)
7028 tree location = (cl ? cl : TREE_PURPOSE (import));
7029 tree package = (cl ? EXPR_WFL_NODE (cl) :
7030 EXPR_WFL_NODE (TREE_PURPOSE (import)));
7034 "Type `%s' also potentially defined in package `%s'",
7035 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
7036 IDENTIFIER_POINTER (package));
7039 to_return = access_check;
7045 return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
7048 /* Add package NAME to the list of package encountered so far. To
7049 speed up class lookup in do_resolve_class, we make sure a
7050 particular package is added only once. */
7053 register_package (name)
7060 pht = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
7062 e = htab_find_slot (pht, name, INSERT);
7065 package_list = chainon (package_list, build_tree_list (name, NULL));
7071 resolve_package (pkg, next, type_name)
7072 tree pkg, *next, *type_name;
7075 tree decl = NULL_TREE;
7076 *type_name = NULL_TREE;
7078 /* The trick is to determine when the package name stops and were
7079 the name of something contained in the package starts. Then we
7080 return a fully qualified name of what we want to get. */
7082 *next = EXPR_WFL_QUALIFICATION (pkg);
7084 /* Try to progressively construct a type name */
7085 if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION)
7086 for (current = EXPR_WFL_QUALIFICATION (pkg);
7087 current; current = TREE_CHAIN (current))
7089 /* If we don't have what we're expecting, exit now. TYPE_NAME
7090 will be null and the error caught later. */
7091 if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION)
7094 merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current)));
7095 if ((decl = resolve_no_layout (*type_name, NULL_TREE)))
7097 /* resolve_package should be used in a loop, hence we
7098 point at this one to naturally process the next one at
7099 the next iteration. */
7108 /* Check accessibility of inner classes according to member access rules.
7109 DECL is the inner class, ENCLOSING_DECL is the class from which the
7110 access is being attempted. */
7113 check_inner_class_access (decl, enclosing_decl, cl)
7114 tree decl, enclosing_decl, cl;
7117 tree enclosing_decl_type;
7119 /* We don't issue an error message when CL is null. CL can be null
7120 as a result of processing a JDEP crafted by source_start_java_method
7121 for the purpose of patching its parm decl. But the error would
7122 have been already trapped when fixing the method's signature.
7123 DECL can also be NULL in case of earlier errors. */
7127 enclosing_decl_type = TREE_TYPE (enclosing_decl);
7129 if (CLASS_PRIVATE (decl))
7131 /* Access is permitted only within the body of the top-level
7132 class in which DECL is declared. */
7133 tree top_level = decl;
7134 while (DECL_CONTEXT (top_level))
7135 top_level = DECL_CONTEXT (top_level);
7136 while (DECL_CONTEXT (enclosing_decl))
7137 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7138 if (top_level == enclosing_decl)
7142 else if (CLASS_PROTECTED (decl))
7145 /* Access is permitted from within the same package... */
7146 if (in_same_package (decl, enclosing_decl))
7149 /* ... or from within the body of a subtype of the context in which
7150 DECL is declared. */
7151 decl_context = DECL_CONTEXT (decl);
7152 while (enclosing_decl)
7154 if (CLASS_INTERFACE (decl))
7156 if (interface_of_p (TREE_TYPE (decl_context),
7157 enclosing_decl_type))
7162 /* Eww. The order of the arguments is different!! */
7163 if (inherits_from_p (enclosing_decl_type,
7164 TREE_TYPE (decl_context)))
7167 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7169 access = "protected";
7171 else if (! CLASS_PUBLIC (decl))
7173 /* Access is permitted only from within the same package as DECL. */
7174 if (in_same_package (decl, enclosing_decl))
7176 access = "non-public";
7179 /* Class is public. */
7182 parse_error_context (cl, "Nested %s %s is %s; cannot be accessed from here",
7183 (CLASS_INTERFACE (decl) ? "interface" : "class"),
7184 lang_printable_name (decl, 0), access);
7187 /* Accessibility check for top-level classes. If CLASS_NAME is in a
7188 foreign package, it must be PUBLIC. Return 0 if no access
7189 violations were found, 1 otherwise. If VERBOSE is true and an error
7190 was found, it is reported and accounted for. */
7193 check_pkg_class_access (class_name, cl, verbose)
7200 if (!IDENTIFIER_CLASS_VALUE (class_name))
7203 if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
7206 if (!CLASS_PUBLIC (TYPE_NAME (type)))
7208 /* Access to a private class within the same package is
7211 breakdown_qualified (&l, &r, class_name);
7212 if (!QUALIFIED_P (class_name) && !ctxp->package)
7213 /* Both in the empty package. */
7215 if (l == ctxp->package)
7216 /* Both in the same package. */
7221 (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed",
7222 (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
7223 IDENTIFIER_POINTER (class_name));
7229 /* Local variable declaration. */
7232 declare_local_variables (modifier, type, vlist)
7237 tree decl, current, saved_type;
7238 tree type_wfl = NULL_TREE;
7242 /* Push a new block if statements were seen between the last time we
7243 pushed a block and now. Keep a count of blocks to close */
7244 if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
7246 tree b = enter_block ();
7247 BLOCK_IS_IMPLICIT (b) = 1;
7253 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)
7254 if (1 << i & modifier)
7256 if (modifier == ACC_FINAL)
7261 (ctxp->modifier_ctx [i],
7262 "Only `final' is allowed as a local variables modifier");
7267 /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
7268 hold the TYPE value if a new incomplete has to be created (as
7269 opposed to being found already existing and reused). */
7270 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
7272 /* If TYPE is fully resolved and we don't have a reference, make one */
7273 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7275 /* Go through all the declared variables */
7276 for (current = vlist, saved_type = type; current;
7277 current = TREE_CHAIN (current), type = saved_type)
7279 tree other, real_type;
7280 tree wfl = TREE_PURPOSE (current);
7281 tree name = EXPR_WFL_NODE (wfl);
7282 tree init = TREE_VALUE (current);
7284 /* Process NAME, as it may specify extra dimension(s) for it */
7285 type = build_array_from_name (type, type_wfl, name, &name);
7287 /* Variable redefinition check */
7288 if ((other = lookup_name_in_blocks (name)))
7290 variable_redefinition_error (wfl, name, TREE_TYPE (other),
7291 DECL_SOURCE_LINE (other));
7295 /* Type adjustment. We may have just readjusted TYPE because
7296 the variable specified more dimensions. Make sure we have
7297 a reference if we can and don't have one already. */
7298 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7300 real_type = GET_REAL_TYPE (type);
7301 /* Never layout this decl. This will be done when its scope
7303 decl = build_decl (VAR_DECL, name, real_type);
7304 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
7305 DECL_FINAL (decl) = final_p;
7306 BLOCK_CHAIN_DECL (decl);
7308 /* If doing xreferencing, replace the line number with the WFL
7311 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
7313 /* Don't try to use an INIT statement when an error was found */
7314 if (init && java_error_count)
7317 /* Add the initialization function to the current function's code */
7320 /* Name might have been readjusted */
7321 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
7322 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
7323 java_method_add_stmt (current_function_decl,
7324 build_debugable_stmt (EXPR_WFL_LINECOL (init),
7328 /* Setup dependency the type of the decl */
7332 register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
7333 dep = CLASSD_LAST (ctxp->classd_list);
7334 JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
7337 SOURCE_FRONTEND_DEBUG (("Defined locals"));
7340 /* Called during parsing. Build decls from argument list. */
7343 source_start_java_method (fndecl)
7353 current_function_decl = fndecl;
7355 /* New scope for the function */
7357 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
7358 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
7360 tree type = TREE_VALUE (tem);
7361 tree name = TREE_PURPOSE (tem);
7363 /* If type is incomplete. Create an incomplete decl and ask for
7364 the decl to be patched later */
7365 if (INCOMPLETE_TYPE_P (type))
7368 tree real_type = GET_REAL_TYPE (type);
7369 parm_decl = build_decl (PARM_DECL, name, real_type);
7370 type = obtain_incomplete_type (type);
7371 register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
7372 jdep = CLASSD_LAST (ctxp->classd_list);
7373 JDEP_MISC (jdep) = name;
7374 JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
7377 parm_decl = build_decl (PARM_DECL, name, type);
7379 /* Remember if a local variable was declared final (via its
7380 TREE_LIST of type/name.) Set DECL_FINAL accordingly. */
7381 if (ARG_FINAL_P (tem))
7383 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl);
7384 DECL_FINAL (parm_decl) = 1;
7387 BLOCK_CHAIN_DECL (parm_decl);
7389 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7390 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
7392 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
7393 DECL_MAX_LOCALS (current_function_decl) = i;
7396 /* Called during parsing. Creates an artificial method declaration. */
7399 create_artificial_method (class, flags, type, name, args)
7402 tree type, name, args;
7406 java_parser_context_save_global ();
7408 mdecl = make_node (FUNCTION_TYPE);
7409 TREE_TYPE (mdecl) = type;
7410 TYPE_ARG_TYPES (mdecl) = args;
7411 mdecl = add_method (class, flags, name, build_java_signature (mdecl));
7412 java_parser_context_restore_global ();
7413 DECL_ARTIFICIAL (mdecl) = 1;
7417 /* Starts the body if an artificial method. */
7420 start_artificial_method_body (mdecl)
7423 DECL_SOURCE_LINE (mdecl) = 1;
7424 DECL_SOURCE_LINE_MERGE (mdecl, 1);
7425 source_start_java_method (mdecl);
7430 end_artificial_method_body (mdecl)
7433 /* exit_block modifies DECL_FUNCTION_BODY (current_function_decl).
7434 It has to be evaluated first. (if mdecl is current_function_decl,
7435 we have an undefined behavior if no temporary variable is used.) */
7436 tree b = exit_block ();
7437 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = b;
7441 /* Dump a tree of some kind. This is a convenience wrapper for the
7442 dump_* functions in tree-dump.c. */
7444 dump_java_tree (phase, t)
7445 enum tree_dump_index phase;
7451 stream = dump_begin (phase, &flags);
7454 dump_node (t, flags, stream);
7455 dump_end (phase, stream);
7459 /* Terminate a function and expand its body. */
7462 source_end_java_method ()
7464 tree fndecl = current_function_decl;
7469 java_parser_context_save_global ();
7470 lineno = ctxp->last_ccb_indent1;
7472 /* Turn function bodies with only a NOP expr null, so they don't get
7473 generated at all and we won't get warnings when using the -W
7475 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) == empty_stmt_node)
7476 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
7478 /* We've generated all the trees for this function, and it has been
7479 patched. Dump it to a file if the user requested it. */
7480 dump_java_tree (TDI_original, fndecl);
7482 java_optimize_inline (fndecl);
7484 /* Generate function's code */
7485 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))
7486 && ! flag_emit_class_files
7487 && ! flag_emit_xref)
7488 expand_expr_stmt (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)));
7490 /* pop out of its parameters */
7491 pushdecl_force_head (DECL_ARGUMENTS (fndecl));
7493 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
7495 /* Generate rtl for function exit. */
7496 if (! flag_emit_class_files && ! flag_emit_xref)
7498 lineno = DECL_SOURCE_LINE_LAST (fndecl);
7499 expand_function_end (input_filename, lineno, 0);
7501 /* Run the optimizers and output assembler code for this function. */
7502 rest_of_compilation (fndecl);
7505 current_function_decl = NULL_TREE;
7506 java_parser_context_restore_global ();
7509 /* Record EXPR in the current function block. Complements compound
7510 expression second operand if necessary. */
7513 java_method_add_stmt (fndecl, expr)
7516 if (!GET_CURRENT_BLOCK (fndecl))
7518 return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
7522 add_stmt_to_block (b, type, stmt)
7525 tree body = BLOCK_EXPR_BODY (b), c;
7527 if (java_error_count)
7530 if ((c = add_stmt_to_compound (body, type, stmt)) == body)
7533 BLOCK_EXPR_BODY (b) = c;
7534 TREE_SIDE_EFFECTS (c) = 1;
7538 /* Add STMT to EXISTING if possible, otherwise create a new
7539 COMPOUND_EXPR and add STMT to it. */
7542 add_stmt_to_compound (existing, type, stmt)
7543 tree existing, type, stmt;
7545 /* Keep track of this for inlining. */
7546 if (current_function_decl)
7547 ++DECL_NUM_STMTS (current_function_decl);
7550 return build (COMPOUND_EXPR, type, existing, stmt);
7555 void java_layout_seen_class_methods ()
7557 tree previous_list = all_class_list;
7558 tree end = NULL_TREE;
7563 for (current = previous_list;
7564 current != end; current = TREE_CHAIN (current))
7565 layout_class_methods (TREE_TYPE (TREE_VALUE (current)));
7567 if (previous_list != all_class_list)
7569 end = previous_list;
7570 previous_list = all_class_list;
7577 static GTY(()) tree stop_reordering;
7579 java_reorder_fields ()
7583 for (current = gclass_list; current; current = TREE_CHAIN (current))
7585 current_class = TREE_TYPE (TREE_VALUE (current));
7587 if (current_class == stop_reordering)
7590 /* Reverse the fields, but leave the dummy field in front.
7591 Fields are already ordered for Object and Class */
7592 if (TYPE_FIELDS (current_class) && current_class != object_type_node
7593 && current_class != class_type_node)
7595 /* If the dummy field is there, reverse the right fields and
7596 just layout the type for proper fields offset */
7597 if (!DECL_NAME (TYPE_FIELDS (current_class)))
7599 tree fields = TYPE_FIELDS (current_class);
7600 TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
7601 TYPE_SIZE (current_class) = NULL_TREE;
7603 /* We don't have a dummy field, we need to layout the class,
7604 after having reversed the fields */
7607 TYPE_FIELDS (current_class) =
7608 nreverse (TYPE_FIELDS (current_class));
7609 TYPE_SIZE (current_class) = NULL_TREE;
7613 /* There are cases were gclass_list will be empty. */
7615 stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list));
7618 /* Layout the methods of all classes loaded in one way or another.
7619 Check methods of source parsed classes. Then reorder the
7620 fields and layout the classes or the type of all source parsed
7624 java_layout_classes ()
7627 int save_error_count = java_error_count;
7629 /* Layout the methods of all classes seen so far */
7630 java_layout_seen_class_methods ();
7631 java_parse_abort_on_error ();
7632 all_class_list = NULL_TREE;
7634 /* Then check the methods of all parsed classes */
7635 for (current = gclass_list; current; current = TREE_CHAIN (current))
7636 if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
7637 java_check_methods (TREE_VALUE (current));
7638 java_parse_abort_on_error ();
7640 for (current = gclass_list; current; current = TREE_CHAIN (current))
7642 current_class = TREE_TYPE (TREE_VALUE (current));
7643 layout_class (current_class);
7645 /* Error reported by the caller */
7646 if (java_error_count)
7650 /* We might have reloaded classes durign the process of laying out
7651 classes for code generation. We must layout the methods of those
7652 late additions, as constructor checks might use them */
7653 java_layout_seen_class_methods ();
7654 java_parse_abort_on_error ();
7657 /* Expand methods in the current set of classes rememebered for
7661 java_complete_expand_classes ()
7665 do_not_fold = flag_emit_xref;
7667 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
7668 if (!INNER_CLASS_DECL_P (current))
7669 java_complete_expand_class (current);
7672 /* Expand the methods found in OUTER, starting first by OUTER's inner
7676 java_complete_expand_class (outer)
7681 set_nested_class_simple_name_value (outer, 1); /* Set */
7683 /* We need to go after all inner classes and start expanding them,
7684 starting with most nested ones. We have to do that because nested
7685 classes might add functions to outer classes */
7687 for (inner_list = DECL_INNER_CLASS_LIST (outer);
7688 inner_list; inner_list = TREE_CHAIN (inner_list))
7689 java_complete_expand_class (TREE_PURPOSE (inner_list));
7691 java_complete_expand_methods (outer);
7692 set_nested_class_simple_name_value (outer, 0); /* Reset */
7695 /* Expand methods registered in CLASS_DECL. The general idea is that
7696 we expand regular methods first. This allows us get an estimate on
7697 how outer context local alias fields are really used so we can add
7698 to the constructor just enough code to initialize them properly (it
7699 also lets us generate finit$ correctly.) Then we expand the
7700 constructors and then <clinit>. */
7703 java_complete_expand_methods (class_decl)
7706 tree clinit, decl, first_decl;
7708 current_class = TREE_TYPE (class_decl);
7710 /* Initialize a new constant pool */
7711 init_outgoing_cpool ();
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))
7797 /* Save the constant pool. We'll need to restore it later. */
7798 TYPE_CPOOL (current_class) = outgoing_cpool;
7801 /* Attempt to create <clinit>. Pre-expand static fields so they can be
7802 safely used in some other methods/constructors. */
7805 maybe_generate_pre_expand_clinit (class_type)
7808 tree current, mdecl;
7810 if (!TYPE_CLINIT_STMT_LIST (class_type))
7813 /* Go through all static fields and pre expand them */
7814 for (current = TYPE_FIELDS (class_type); current;
7815 current = TREE_CHAIN (current))
7816 if (FIELD_STATIC (current))
7817 build_field_ref (NULL_TREE, class_type, DECL_NAME (current));
7819 /* Then build the <clinit> method */
7820 mdecl = create_artificial_method (class_type, ACC_STATIC, void_type_node,
7821 clinit_identifier_node, end_params_node);
7822 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
7824 start_artificial_method_body (mdecl);
7826 /* We process the list of assignment we produced as the result of
7827 the declaration of initialized static field and add them as
7828 statement to the <clinit> method. */
7829 for (current = TYPE_CLINIT_STMT_LIST (class_type); current;
7830 current = TREE_CHAIN (current))
7832 tree stmt = current;
7833 /* We build the assignment expression that will initialize the
7834 field to its value. There are strict rules on static
7835 initializers (8.5). FIXME */
7836 if (TREE_CODE (stmt) != BLOCK && stmt != empty_stmt_node)
7837 stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt);
7838 java_method_add_stmt (mdecl, stmt);
7841 end_artificial_method_body (mdecl);
7843 /* Now we want to place <clinit> as the last method (because we need
7844 it at least for interface so that it doesn't interfere with the
7845 dispatch table based lookup. */
7846 if (TREE_CHAIN (TYPE_METHODS (class_type)))
7848 current = TREE_CHAIN (TYPE_METHODS (class_type));
7849 TYPE_METHODS (class_type) = current;
7851 while (TREE_CHAIN (current))
7852 current = TREE_CHAIN (current);
7854 TREE_CHAIN (current) = mdecl;
7855 TREE_CHAIN (mdecl) = NULL_TREE;
7861 /* Analyzes a method body and look for something that isn't a
7862 MODIFY_EXPR with a constant value. */
7865 analyze_clinit_body (this_class, bbody)
7866 tree this_class, bbody;
7869 switch (TREE_CODE (bbody))
7872 bbody = BLOCK_EXPR_BODY (bbody);
7875 case EXPR_WITH_FILE_LOCATION:
7876 bbody = EXPR_WFL_NODE (bbody);
7880 if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0)))
7882 bbody = TREE_OPERAND (bbody, 1);
7886 /* If we're generating to class file and we're dealing with an
7887 array initialization, we return 1 to keep <clinit> */
7888 if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT
7889 && flag_emit_class_files)
7892 /* There are a few cases where we're required to keep
7894 - If this is an assignment whose operand is not constant,
7895 - If this is an assignment to a non-initialized field,
7896 - If this field is not a member of the current class.
7898 return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1))
7899 || ! DECL_INITIAL (TREE_OPERAND (bbody, 0))
7900 || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class);
7909 /* See whether we could get rid of <clinit>. Criteria are: all static
7910 final fields have constant initial values and the body of <clinit>
7911 is empty. Return 1 if <clinit> was discarded, 0 otherwise. */
7914 maybe_yank_clinit (mdecl)
7920 if (!DECL_CLINIT_P (mdecl))
7923 /* If the body isn't empty, then we keep <clinit>. Note that if
7924 we're emitting classfiles, this isn't enough not to rule it
7926 fbody = DECL_FUNCTION_BODY (mdecl);
7927 bbody = BLOCK_EXPR_BODY (fbody);
7928 if (bbody && bbody != error_mark_node)
7929 bbody = BLOCK_EXPR_BODY (bbody);
7932 if (bbody && ! flag_emit_class_files && bbody != empty_stmt_node)
7935 type = DECL_CONTEXT (mdecl);
7936 current = TYPE_FIELDS (type);
7938 for (current = (current ? TREE_CHAIN (current) : current);
7939 current; current = TREE_CHAIN (current))
7943 /* We're not interested in non-static fields. */
7944 if (!FIELD_STATIC (current))
7947 /* Nor in fields without initializers. */
7948 f_init = DECL_INITIAL (current);
7949 if (f_init == NULL_TREE)
7952 /* Anything that isn't String or a basic type is ruled out -- or
7953 if we know how to deal with it (when doing things natively) we
7954 should generated an empty <clinit> so that SUID are computed
7956 if (! JSTRING_TYPE_P (TREE_TYPE (current))
7957 && ! JNUMERIC_TYPE_P (TREE_TYPE (current)))
7960 if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init))
7964 /* Now we analyze the method body and look for something that
7965 isn't a MODIFY_EXPR */
7966 if (bbody != empty_stmt_node && analyze_clinit_body (type, bbody))
7969 /* Get rid of <clinit> in the class' list of methods */
7970 if (TYPE_METHODS (type) == mdecl)
7971 TYPE_METHODS (type) = TREE_CHAIN (mdecl);
7973 for (current = TYPE_METHODS (type); current;
7974 current = TREE_CHAIN (current))
7975 if (TREE_CHAIN (current) == mdecl)
7977 TREE_CHAIN (current) = TREE_CHAIN (mdecl);
7984 /* Install the argument from MDECL. Suitable to completion and
7985 expansion of mdecl's body. */
7988 start_complete_expand_method (mdecl)
7993 pushlevel (1); /* Prepare for a parameter push */
7994 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7995 DECL_ARGUMENTS (mdecl) = tem;
7997 for (; tem; tem = TREE_CHAIN (tem))
7999 /* TREE_CHAIN (tem) will change after pushdecl. */
8000 tree next = TREE_CHAIN (tem);
8001 tree type = TREE_TYPE (tem);
8002 if (PROMOTE_PROTOTYPES
8003 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
8004 && INTEGRAL_TYPE_P (type))
8005 type = integer_type_node;
8006 DECL_ARG_TYPE (tem) = type;
8007 layout_decl (tem, 0);
8009 /* Re-install the next so that the list is kept and the loop
8011 TREE_CHAIN (tem) = next;
8013 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8014 lineno = DECL_SOURCE_LINE_FIRST (mdecl);
8015 build_result_decl (mdecl);
8019 /* Complete and expand a method. */
8022 java_complete_expand_method (mdecl)
8025 tree fbody, block_body, exception_copy;
8027 current_function_decl = mdecl;
8028 /* Fix constructors before expanding them */
8029 if (DECL_CONSTRUCTOR_P (mdecl))
8030 fix_constructors (mdecl);
8032 /* Expand functions that have a body */
8033 if (!DECL_FUNCTION_BODY (mdecl))
8036 fbody = DECL_FUNCTION_BODY (mdecl);
8037 block_body = BLOCK_EXPR_BODY (fbody);
8038 exception_copy = NULL_TREE;
8040 current_function_decl = mdecl;
8043 fprintf (stderr, " [%s.",
8044 lang_printable_name (DECL_CONTEXT (mdecl), 0));
8045 announce_function (mdecl);
8047 fprintf (stderr, "]");
8049 /* Prepare the function for tree completion */
8050 start_complete_expand_method (mdecl);
8052 /* Install the current this */
8053 current_this = (!METHOD_STATIC (mdecl) ?
8054 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
8056 /* Purge the `throws' list of unchecked exceptions (we save a copy
8057 of the list and re-install it later.) */
8058 exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl));
8059 purge_unchecked_exceptions (mdecl);
8061 /* Install exceptions thrown with `throws' */
8062 PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
8064 if (block_body != NULL_TREE)
8066 block_body = java_complete_tree (block_body);
8068 /* Before we check initialization, attached all class initialization
8069 variable to the block_body */
8070 htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (mdecl),
8071 attach_init_test_initialization_flags, block_body);
8073 if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
8075 check_for_initialization (block_body, mdecl);
8077 /* Go through all the flags marking the initialization of
8078 static variables and see whether they're definitively
8079 assigned, in which case the type is remembered as
8080 definitively initialized in MDECL. */
8081 if (STATIC_CLASS_INIT_OPT_P ())
8083 /* Always register the context as properly initialized in
8084 MDECL. This used with caution helps removing extra
8085 initialization of self. */
8086 if (METHOD_STATIC (mdecl))
8089 (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl),
8090 DECL_CONTEXT (mdecl), INSERT)) = DECL_CONTEXT (mdecl);
8094 ctxp->explicit_constructor_p = 0;
8097 BLOCK_EXPR_BODY (fbody) = block_body;
8099 /* If we saw a return but couldn't evaluate it properly, we'll have
8100 an error_mark_node here. */
8101 if (block_body != error_mark_node
8102 && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
8103 && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE
8105 missing_return_error (current_function_decl);
8107 /* See if we can get rid of <clinit> if MDECL happens to be <clinit> */
8108 maybe_yank_clinit (mdecl);
8110 /* Pop the current level, with special measures if we found errors. */
8111 if (java_error_count)
8112 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8115 /* Pop the exceptions and sanity check */
8117 if (currently_caught_type_list)
8120 /* Restore the copy of the list of exceptions if emitting xrefs. */
8121 DECL_FUNCTION_THROWS (mdecl) = exception_copy;
8124 /* For with each class for which there's code to generate. */
8127 java_expand_method_bodies (class)
8131 for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl))
8133 if (!DECL_FUNCTION_BODY (decl))
8136 current_function_decl = decl;
8138 /* Save the function for inlining. */
8139 if (flag_inline_trees)
8140 DECL_SAVED_TREE (decl) =
8141 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
8143 /* It's time to assign the variable flagging static class
8144 initialization based on which classes invoked static methods
8145 are definitely initializing. This should be flagged. */
8146 if (STATIC_CLASS_INIT_OPT_P ())
8148 tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl);
8149 for (; list != NULL_TREE; list = TREE_CHAIN (list))
8151 /* Executed for each statement calling a static function.
8152 LIST is a TREE_LIST whose PURPOSE is the called function
8153 and VALUE is a compound whose second operand can be patched
8154 with static class initialization flag assignments. */
8156 tree called_method = TREE_PURPOSE (list);
8157 tree compound = TREE_VALUE (list);
8158 tree assignment_compound_list
8159 = build_tree_list (called_method, NULL);
8161 /* For each class definitely initialized in
8162 CALLED_METHOD, fill ASSIGNMENT_COMPOUND with
8163 assignment to the class initialization flag. */
8164 htab_traverse (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method),
8165 emit_test_initialization,
8166 assignment_compound_list);
8168 if (TREE_VALUE (assignment_compound_list))
8169 TREE_OPERAND (compound, 1)
8170 = TREE_VALUE (assignment_compound_list);
8174 /* Prepare the function for RTL expansion */
8175 start_complete_expand_method (decl);
8177 /* Expand function start, generate initialization flag
8178 assignment, and handle synchronized methods. */
8179 complete_start_java_method (decl);
8181 /* Expand the rest of the function body and terminate
8183 source_end_java_method ();
8189 /* This section of the code deals with accessing enclosing context
8190 fields either directly by using the relevant access to this$<n> or
8191 by invoking an access method crafted for that purpose. */
8193 /* Build the necessary access from an inner class to an outer
8194 class. This routine could be optimized to cache previous result
8195 (decl, current_class and returned access). When an access method
8196 needs to be generated, it always takes the form of a read. It might
8197 be later turned into a write by calling outer_field_access_fix. */
8200 build_outer_field_access (id, decl)
8203 tree access = NULL_TREE;
8204 tree ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
8205 tree decl_ctx = DECL_CONTEXT (decl);
8207 /* If the immediate enclosing context of the current class is the
8208 field decl's class or inherits from it; build the access as
8209 `this$<n>.<field>'. Note that we will break the `private' barrier
8210 if we're not emitting bytecodes. */
8211 if ((ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
8212 && (!FIELD_PRIVATE (decl) || !flag_emit_class_files ))
8214 tree thisn = build_current_thisn (current_class);
8215 access = make_qualified_primary (build_wfl_node (thisn),
8216 id, EXPR_WFL_LINECOL (id));
8218 /* Otherwise, generate access methods to outer this and access the
8219 field (either using an access method or by direct access.) */
8222 int lc = EXPR_WFL_LINECOL (id);
8224 /* Now we chain the required number of calls to the access$0 to
8225 get a hold to the enclosing instance we need, and then we
8226 build the field access. */
8227 access = build_access_to_thisn (current_class, decl_ctx, lc);
8229 /* If the field is private and we're generating bytecode, then
8230 we generate an access method */
8231 if (FIELD_PRIVATE (decl) && flag_emit_class_files )
8233 tree name = build_outer_field_access_methods (decl);
8234 access = build_outer_field_access_expr (lc, decl_ctx,
8235 name, access, NULL_TREE);
8237 /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'.
8238 Once again we break the `private' access rule from a foreign
8241 access = make_qualified_primary (access, id, lc);
8243 return resolve_expression_name (access, NULL);
8246 /* Return a non zero value if NODE describes an outer field inner
8250 outer_field_access_p (type, decl)
8253 if (!INNER_CLASS_TYPE_P (type)
8254 || TREE_CODE (decl) != FIELD_DECL
8255 || DECL_CONTEXT (decl) == type)
8258 /* If the inner class extends the declaration context of the field
8259 we're try to acces, then this isn't an outer field access */
8260 if (inherits_from_p (type, DECL_CONTEXT (decl)))
8263 for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ;
8264 type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))))
8266 if (type == DECL_CONTEXT (decl))
8269 if (!DECL_CONTEXT (TYPE_NAME (type)))
8271 /* Before we give up, see whether the field is inherited from
8272 the enclosing context we're considering. */
8273 if (inherits_from_p (type, DECL_CONTEXT (decl)))
8282 /* Return a non zero value if NODE represents an outer field inner
8283 access that was been already expanded. As a side effect, it returns
8284 the name of the field being accessed and the argument passed to the
8285 access function, suitable for a regeneration of the access method
8286 call if necessary. */
8289 outer_field_expanded_access_p (node, name, arg_type, arg)
8290 tree node, *name, *arg_type, *arg;
8294 if (TREE_CODE (node) != CALL_EXPR)
8297 /* Well, gcj generates slightly different tree nodes when compiling
8298 to native or bytecodes. It's the case for function calls. */
8300 if (flag_emit_class_files
8301 && TREE_CODE (node) == CALL_EXPR
8302 && OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
8304 else if (!flag_emit_class_files)
8306 node = TREE_OPERAND (node, 0);
8308 if (node && TREE_OPERAND (node, 0)
8309 && TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)
8311 node = TREE_OPERAND (node, 0);
8312 if (TREE_OPERAND (node, 0)
8313 && TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
8314 && (OUTER_FIELD_ACCESS_IDENTIFIER_P
8315 (DECL_NAME (TREE_OPERAND (node, 0)))))
8320 if (identified && name && arg_type && arg)
8322 tree argument = TREE_OPERAND (node, 1);
8323 *name = DECL_NAME (TREE_OPERAND (node, 0));
8324 *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
8325 *arg = TREE_VALUE (argument);
8330 /* Detect in NODE an outer field read access from an inner class and
8331 transform it into a write with RHS as an argument. This function is
8332 called from the java_complete_lhs when an assignment to a LHS can
8336 outer_field_access_fix (wfl, node, rhs)
8337 tree wfl, node, rhs;
8339 tree name, arg_type, arg;
8341 if (outer_field_expanded_access_p (node, &name, &arg_type, &arg))
8343 node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl),
8344 arg_type, name, arg, rhs);
8345 return java_complete_tree (node);
8350 /* Construct the expression that calls an access method:
8351 <type>.access$<n>(<arg1> [, <arg2>]);
8353 ARG2 can be NULL and will be omitted in that case. It will denote a
8357 build_outer_field_access_expr (lc, type, access_method_name, arg1, arg2)
8359 tree type, access_method_name, arg1, arg2;
8361 tree args, cn, access;
8363 args = arg1 ? arg1 :
8364 build_wfl_node (build_current_thisn (current_class));
8365 args = build_tree_list (NULL_TREE, args);
8368 args = tree_cons (NULL_TREE, arg2, args);
8370 access = build_method_invocation (build_wfl_node (access_method_name), args);
8371 cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
8372 return make_qualified_primary (cn, access, lc);
8376 build_new_access_id ()
8378 static int access_n_counter = 1;
8381 sprintf (buffer, "access$%d", access_n_counter++);
8382 return get_identifier (buffer);
8385 /* Create the static access functions for the outer field DECL. We define a
8387 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
8391 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$,
8392 TREE_TYPE (<field>) value$) {
8393 return inst$.field = value$;
8395 We should have a usage flags on the DECL so we can lazily turn the ones
8396 we're using for code generation. FIXME.
8400 build_outer_field_access_methods (decl)
8403 tree id, args, stmt, mdecl;
8405 if (FIELD_INNER_ACCESS_P (decl))
8406 return FIELD_INNER_ACCESS (decl);
8408 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
8410 /* Create the identifier and a function named after it. */
8411 id = build_new_access_id ();
8413 /* The identifier is marked as bearing the name of a generated write
8414 access function for outer field accessed from inner classes. */
8415 OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8417 /* Create the read access */
8418 args = build_tree_list (inst_id, build_pointer_type (DECL_CONTEXT (decl)));
8419 TREE_CHAIN (args) = end_params_node;
8420 stmt = make_qualified_primary (build_wfl_node (inst_id),
8421 build_wfl_node (DECL_NAME (decl)), 0);
8422 stmt = build_return (0, stmt);
8423 mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8424 TREE_TYPE (decl), id, args, stmt);
8425 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8427 /* Create the write access method. No write access for final variable */
8428 if (!FIELD_FINAL (decl))
8430 args = build_tree_list (inst_id,
8431 build_pointer_type (DECL_CONTEXT (decl)));
8432 TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
8433 TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
8434 stmt = make_qualified_primary (build_wfl_node (inst_id),
8435 build_wfl_node (DECL_NAME (decl)), 0);
8436 stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
8437 build_wfl_node (wpv_id)));
8438 mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8439 TREE_TYPE (decl), id,
8442 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8444 /* Return the access name */
8445 return FIELD_INNER_ACCESS (decl) = id;
8448 /* Build an field access method NAME. */
8451 build_outer_field_access_method (class, type, name, args, body)
8452 tree class, type, name, args, body;
8454 tree saved_current_function_decl, mdecl;
8456 /* Create the method */
8457 mdecl = create_artificial_method (class, ACC_STATIC, type, name, args);
8458 fix_method_argument_names (args, mdecl);
8459 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8461 /* Attach the method body. */
8462 saved_current_function_decl = current_function_decl;
8463 start_artificial_method_body (mdecl);
8464 java_method_add_stmt (mdecl, body);
8465 end_artificial_method_body (mdecl);
8466 current_function_decl = saved_current_function_decl;
8472 /* This section deals with building access function necessary for
8473 certain kinds of method invocation from inner classes. */
8476 build_outer_method_access_method (decl)
8479 tree saved_current_function_decl, mdecl;
8480 tree args = NULL_TREE, call_args = NULL_TREE;
8481 tree carg, id, body, class;
8483 int parm_id_count = 0;
8485 /* Test this abort with an access to a private field */
8486 if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "access$"))
8489 /* Check the cache first */
8490 if (DECL_FUNCTION_INNER_ACCESS (decl))
8491 return DECL_FUNCTION_INNER_ACCESS (decl);
8493 class = DECL_CONTEXT (decl);
8495 /* Obtain an access identifier and mark it */
8496 id = build_new_access_id ();
8497 OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8499 carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
8500 /* Create the arguments, as much as the original */
8501 for (; carg && carg != end_params_node;
8502 carg = TREE_CHAIN (carg))
8504 sprintf (buffer, "write_parm_value$%d", parm_id_count++);
8505 args = chainon (args, build_tree_list (get_identifier (buffer),
8506 TREE_VALUE (carg)));
8508 args = chainon (args, end_params_node);
8510 /* Create the method */
8511 mdecl = create_artificial_method (class, ACC_STATIC,
8512 TREE_TYPE (TREE_TYPE (decl)), id, args);
8513 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8514 /* There is a potential bug here. We should be able to use
8515 fix_method_argument_names, but then arg names get mixed up and
8516 eventually a constructor will have its this$0 altered and the
8517 outer context won't be assignment properly. The test case is
8519 TYPE_ARG_TYPES (TREE_TYPE (mdecl)) = args;
8521 /* Attach the method body. */
8522 saved_current_function_decl = current_function_decl;
8523 start_artificial_method_body (mdecl);
8525 /* The actual method invocation uses the same args. When invoking a
8526 static methods that way, we don't want to skip the first
8529 if (!METHOD_STATIC (decl))
8530 carg = TREE_CHAIN (carg);
8531 for (; carg && carg != end_params_node; carg = TREE_CHAIN (carg))
8532 call_args = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (carg)),
8535 body = build_method_invocation (build_wfl_node (DECL_NAME (decl)),
8537 if (!METHOD_STATIC (decl))
8538 body = make_qualified_primary (build_wfl_node (TREE_PURPOSE (args)),
8540 if (TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
8541 body = build_return (0, body);
8542 java_method_add_stmt (mdecl,body);
8543 end_artificial_method_body (mdecl);
8544 current_function_decl = saved_current_function_decl;
8546 /* Back tag the access function so it know what it accesses */
8547 DECL_FUNCTION_ACCESS_DECL (decl) = mdecl;
8549 /* Tag the current method so it knows it has an access generated */
8550 return DECL_FUNCTION_INNER_ACCESS (decl) = mdecl;
8554 /* This section of the code deals with building expressions to access
8555 the enclosing instance of an inner class. The enclosing instance is
8556 kept in a generated field called this$<n>, with <n> being the
8557 inner class nesting level (starting from 0.) */
8559 /* Build an access to a given this$<n>, always chaining access call to
8560 others. Access methods to this$<n> are build on the fly if
8561 necessary. This CAN'T be used to solely access this$<n-1> from
8562 this$<n> (which alway yield to special cases and optimization, see
8563 for example build_outer_field_access). */
8566 build_access_to_thisn (from, to, lc)
8570 tree access = NULL_TREE;
8572 while (from != to && PURE_INNER_CLASS_TYPE_P (from))
8576 access = build_current_thisn (from);
8577 access = build_wfl_node (access);
8581 tree access0_wfl, cn;
8583 maybe_build_thisn_access_method (from);
8584 access0_wfl = build_wfl_node (access0_identifier_node);
8585 cn = build_wfl_node (DECL_NAME (TYPE_NAME (from)));
8586 EXPR_WFL_LINECOL (access0_wfl) = lc;
8587 access = build_tree_list (NULL_TREE, access);
8588 access = build_method_invocation (access0_wfl, access);
8589 access = make_qualified_primary (cn, access, lc);
8592 /* If FROM isn't an inner class, that's fine, we've done enough.
8593 What we're looking for can be accessed from there. */
8594 from = DECL_CONTEXT (TYPE_NAME (from));
8597 from = TREE_TYPE (from);
8602 /* Build an access function to the this$<n> local to TYPE. NULL_TREE
8603 is returned if nothing needs to be generated. Otherwise, the method
8604 generated and a method decl is returned.
8606 NOTE: These generated methods should be declared in a class file
8607 attribute so that they can't be referred to directly. */
8610 maybe_build_thisn_access_method (type)
8613 tree mdecl, args, stmt, rtype;
8614 tree saved_current_function_decl;
8616 /* If TYPE is a top-level class, no access method is required.
8617 If there already is such an access method, bail out. */
8618 if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type))
8621 /* We generate the method. The method looks like:
8622 static <outer_of_type> access$0 (<type> inst$) { return inst$.this$<n>; }
8624 args = build_tree_list (inst_id, build_pointer_type (type));
8625 TREE_CHAIN (args) = end_params_node;
8626 rtype = build_pointer_type (TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))));
8627 mdecl = create_artificial_method (type, ACC_STATIC, rtype,
8628 access0_identifier_node, args);
8629 fix_method_argument_names (args, mdecl);
8630 layout_class_method (type, NULL_TREE, mdecl, NULL_TREE);
8631 stmt = build_current_thisn (type);
8632 stmt = make_qualified_primary (build_wfl_node (inst_id),
8633 build_wfl_node (stmt), 0);
8634 stmt = build_return (0, stmt);
8636 saved_current_function_decl = current_function_decl;
8637 start_artificial_method_body (mdecl);
8638 java_method_add_stmt (mdecl, stmt);
8639 end_artificial_method_body (mdecl);
8640 current_function_decl = saved_current_function_decl;
8642 CLASS_ACCESS0_GENERATED_P (type) = 1;
8647 /* Craft an correctly numbered `this$<n>'string. this$0 is used for
8648 the first level of innerclassing. this$1 for the next one, etc...
8649 This function can be invoked with TYPE to NULL, available and then
8650 has to count the parser context. */
8652 static GTY(()) tree saved_thisn;
8653 static GTY(()) tree saved_type;
8656 build_current_thisn (type)
8659 static int saved_i = -1;
8660 static int saved_type_i = 0;
8667 if (type == saved_type)
8671 for (i = -1, decl = DECL_CONTEXT (TYPE_NAME (type));
8672 decl; decl = DECL_CONTEXT (decl), i++)
8680 i = list_length (GET_CPC_LIST ())-2;
8685 sprintf (buffer, "this$%d", i);
8687 saved_thisn = get_identifier (buffer);
8691 /* Return the assignement to the hidden enclosing context `this$<n>'
8692 by the second incoming parameter to the innerclass constructor. The
8693 form used is `this.this$<n> = this$<n>;'. */
8696 build_thisn_assign ()
8698 if (current_class && PURE_INNER_CLASS_TYPE_P (current_class))
8700 tree thisn = build_current_thisn (current_class);
8701 tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
8702 build_wfl_node (thisn), 0);
8703 tree rhs = build_wfl_node (thisn);
8704 EXPR_WFL_SET_LINECOL (lhs, lineno, 0);
8705 return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
8711 /* Building the synthetic `class$' used to implement the `.class' 1.1
8712 extension for non primitive types. This method looks like:
8714 static Class class$(String type) throws NoClassDefFoundError
8716 try {return (java.lang.Class.forName (String));}
8717 catch (ClassNotFoundException e) {
8718 throw new NoClassDefFoundError(e.getMessage());}
8721 static GTY(()) tree get_message_wfl;
8722 static GTY(()) tree type_parm_wfl;
8725 build_dot_class_method (class)
8728 #define BWF(S) build_wfl_node (get_identifier ((S)))
8729 #define MQN(X,Y) make_qualified_name ((X), (Y), 0)
8730 tree args, tmp, saved_current_function_decl, mdecl;
8731 tree stmt, throw_stmt;
8733 if (!get_message_wfl)
8735 get_message_wfl = build_wfl_node (get_identifier ("getMessage"));
8736 type_parm_wfl = build_wfl_node (get_identifier ("type$"));
8739 /* Build the arguments */
8740 args = build_tree_list (get_identifier ("type$"),
8741 build_pointer_type (string_type_node));
8742 TREE_CHAIN (args) = end_params_node;
8744 /* Build the qualified name java.lang.Class.forName */
8745 tmp = MQN (MQN (MQN (BWF ("java"),
8746 BWF ("lang")), BWF ("Class")), BWF ("forName"));
8747 load_class (class_not_found_type_node, 1);
8748 load_class (no_class_def_found_type_node, 1);
8750 /* Create the "class$" function */
8751 mdecl = create_artificial_method (class, ACC_STATIC,
8752 build_pointer_type (class_type_node),
8753 classdollar_identifier_node, args);
8754 DECL_FUNCTION_THROWS (mdecl) =
8755 build_tree_list (NULL_TREE, no_class_def_found_type_node);
8757 /* We start by building the try block. We need to build:
8758 return (java.lang.Class.forName (type)); */
8759 stmt = build_method_invocation (tmp,
8760 build_tree_list (NULL_TREE, type_parm_wfl));
8761 stmt = build_return (0, stmt);
8763 /* Now onto the catch block. We start by building the expression
8764 throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
8765 throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
8766 get_message_wfl, 0);
8767 throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
8769 /* Build new NoClassDefFoundError (_.getMessage) */
8770 throw_stmt = build_new_invocation
8771 (build_wfl_node (get_identifier ("NoClassDefFoundError")),
8772 build_tree_list (build_pointer_type (string_type_node), throw_stmt));
8774 /* Build the throw, (it's too early to use BUILD_THROW) */
8775 throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt);
8777 /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */
8778 stmt = encapsulate_with_try_catch (0, class_not_found_type_node,
8781 fix_method_argument_names (args, mdecl);
8782 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8783 saved_current_function_decl = current_function_decl;
8784 start_artificial_method_body (mdecl);
8785 java_method_add_stmt (mdecl, stmt);
8786 end_artificial_method_body (mdecl);
8787 current_function_decl = saved_current_function_decl;
8788 TYPE_DOT_CLASS (class) = mdecl;
8794 build_dot_class_method_invocation (type)
8799 if (TYPE_ARRAY_P (type))
8800 sig_id = build_java_signature (type);
8802 sig_id = DECL_NAME (TYPE_NAME (type));
8804 /* Ensure that the proper name separator is used */
8805 sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id),
8806 IDENTIFIER_LENGTH (sig_id));
8808 s = build_string (IDENTIFIER_LENGTH (sig_id),
8809 IDENTIFIER_POINTER (sig_id));
8810 return build_method_invocation (build_wfl_node (classdollar_identifier_node),
8811 build_tree_list (NULL_TREE, s));
8814 /* This section of the code deals with constructor. */
8816 /* Craft a body for default constructor. Patch existing constructor
8817 bodies with call to super() and field initialization statements if
8821 fix_constructors (mdecl)
8824 tree iii; /* Instance Initializer Invocation */
8825 tree body = DECL_FUNCTION_BODY (mdecl);
8826 tree thisn_assign, compound = NULL_TREE;
8827 tree class_type = DECL_CONTEXT (mdecl);
8829 if (DECL_FIXED_CONSTRUCTOR_P (mdecl))
8831 DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
8835 /* It is an error for the compiler to generate a default
8836 constructor if the superclass doesn't have a constructor that
8837 takes no argument, or the same args for an anonymous class */
8838 if (verify_constructor_super (mdecl))
8840 tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (class_type));
8841 tree save = DECL_NAME (mdecl);
8842 const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
8843 DECL_NAME (mdecl) = DECL_NAME (sclass_decl);
8845 (lookup_cl (TYPE_NAME (class_type)),
8846 "No constructor matching `%s' found in class `%s'",
8847 lang_printable_name (mdecl, 0), n);
8848 DECL_NAME (mdecl) = save;
8851 /* The constructor body must be crafted by hand. It's the
8852 constructor we defined when we realize we didn't have the
8853 CLASSNAME() constructor */
8854 start_artificial_method_body (mdecl);
8856 /* Insert an assignment to the this$<n> hidden field, if
8858 if ((thisn_assign = build_thisn_assign ()))
8859 java_method_add_stmt (mdecl, thisn_assign);
8861 /* We don't generate a super constructor invocation if we're
8862 compiling java.lang.Object. build_super_invocation takes care
8864 java_method_add_stmt (mdecl, build_super_invocation (mdecl));
8867 if ((iii = build_instinit_invocation (class_type)))
8868 java_method_add_stmt (mdecl, iii);
8870 end_artificial_method_body (mdecl);
8872 /* Search for an explicit constructor invocation */
8876 int invokes_this = 0;
8877 tree found_call = NULL_TREE;
8878 tree main_block = BLOCK_EXPR_BODY (body);
8881 switch (TREE_CODE (body))
8884 found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
8885 if (CALL_THIS_CONSTRUCTOR_P (body))
8890 case EXPR_WITH_FILE_LOCATION:
8892 body = TREE_OPERAND (body, 0);
8896 body = BLOCK_EXPR_BODY (body);
8903 /* Generate the assignment to this$<n>, if necessary */
8904 if ((thisn_assign = build_thisn_assign ()))
8905 compound = add_stmt_to_compound (compound, NULL_TREE, thisn_assign);
8907 /* The constructor is missing an invocation of super() */
8909 compound = add_stmt_to_compound (compound, NULL_TREE,
8910 build_super_invocation (mdecl));
8911 /* Explicit super() invokation should take place before the
8912 instance initializer blocks. */
8915 compound = add_stmt_to_compound (compound, NULL_TREE,
8916 TREE_OPERAND (found_call, 0));
8917 TREE_OPERAND (found_call, 0) = empty_stmt_node;
8920 DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
8922 /* Insert the instance initializer block right after. */
8923 if (!invokes_this && (iii = build_instinit_invocation (class_type)))
8924 compound = add_stmt_to_compound (compound, NULL_TREE, iii);
8926 /* Fix the constructor main block if we're adding extra stmts */
8929 compound = add_stmt_to_compound (compound, NULL_TREE,
8930 BLOCK_EXPR_BODY (main_block));
8931 BLOCK_EXPR_BODY (main_block) = compound;
8936 /* Browse constructors in the super class, searching for a constructor
8937 that doesn't take any argument. Return 0 if one is found, 1
8938 otherwise. If the current class is an anonymous inner class, look
8939 for something that has the same signature. */
8942 verify_constructor_super (mdecl)
8945 tree class = CLASSTYPE_SUPER (current_class);
8946 int super_inner = PURE_INNER_CLASS_TYPE_P (class);
8952 if (ANONYMOUS_CLASS_P (current_class))
8954 tree mdecl_arg_type;
8955 SKIP_THIS_AND_ARTIFICIAL_PARMS (mdecl_arg_type, mdecl);
8956 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
8957 if (DECL_CONSTRUCTOR_P (sdecl))
8960 tree arg_type = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
8962 arg_type = TREE_CHAIN (arg_type);
8963 for (m_arg_type = mdecl_arg_type;
8964 (arg_type != end_params_node
8965 && m_arg_type != end_params_node);
8966 arg_type = TREE_CHAIN (arg_type),
8967 m_arg_type = TREE_CHAIN (m_arg_type))
8968 if (!valid_method_invocation_conversion_p
8969 (TREE_VALUE (arg_type),
8970 TREE_VALUE (m_arg_type)))
8973 if (arg_type == end_params_node && m_arg_type == end_params_node)
8979 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
8981 tree arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
8983 arg = TREE_CHAIN (arg);
8984 if (DECL_CONSTRUCTOR_P (sdecl) && arg == end_params_node)
8991 /* Generate code for all context remembered for code generation. */
8993 static GTY(()) tree reversed_class_list;
8995 java_expand_classes ()
8997 int save_error_count = 0;
8998 static struct parser_ctxt *cur_ctxp = NULL;
9000 java_parse_abort_on_error ();
9001 if (!(ctxp = ctxp_for_generation))
9003 java_layout_classes ();
9004 java_parse_abort_on_error ();
9006 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9009 input_filename = ctxp->filename;
9010 lang_init_source (2); /* Error msgs have method prototypes */
9011 java_complete_expand_classes (); /* Complete and expand classes */
9012 java_parse_abort_on_error ();
9014 input_filename = main_input_filename;
9017 /* Find anonymous classes and expand their constructor. This extra pass is
9018 neccessary because the constructor itself is only generated when the
9019 method in which it is defined is expanded. */
9020 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9024 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9026 current_class = TREE_TYPE (current);
9027 if (ANONYMOUS_CLASS_P (current_class))
9030 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9032 if (DECL_CONSTRUCTOR_P (d))
9034 restore_line_number_status (1);
9035 java_complete_expand_method (d);
9036 restore_line_number_status (0);
9037 break; /* There is only one constructor. */
9044 /* If we've found error at that stage, don't try to generate
9045 anything, unless we're emitting xrefs or checking the syntax only
9046 (but not using -fsyntax-only for the purpose of generating
9048 if (java_error_count && !flag_emit_xref
9049 && (!flag_syntax_only && !flag_emit_class_files))
9052 /* Now things are stable, go for generation of the class data. */
9054 /* We pessimistically marked all fields external until we knew
9055 what set of classes we were planning to compile. Now mark
9056 those that will be generated locally as not external. */
9057 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9061 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9063 tree class = TREE_TYPE (current);
9065 for (field = TYPE_FIELDS (class); field ; field = TREE_CHAIN (field))
9066 if (FIELD_STATIC (field))
9067 DECL_EXTERNAL (field) = 0;
9071 /* Compile the classes. */
9072 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9075 reversed_class_list = NULL;
9079 /* We write out the classes in reverse order. This ensures that
9080 inner classes are written before their containing classes,
9081 which is important for parallel builds. Otherwise, the
9082 class file for the outer class may be found, but the class
9083 file for the inner class may not be present. In that
9084 situation, the compiler cannot fall back to the original
9085 source, having already read the outer class, so we must
9086 prevent that situation. */
9087 for (current = ctxp->class_list;
9089 current = TREE_CHAIN (current))
9091 = tree_cons (NULL_TREE, current, reversed_class_list);
9093 for (current = reversed_class_list;
9095 current = TREE_CHAIN (current))
9097 current_class = TREE_TYPE (TREE_VALUE (current));
9098 outgoing_cpool = TYPE_CPOOL (current_class);
9099 if (flag_emit_class_files)
9100 write_classfile (current_class);
9102 expand_xref (current_class);
9103 else if (! flag_syntax_only)
9105 java_expand_method_bodies (current_class);
9112 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
9113 a tree list node containing RIGHT. Fore coming RIGHTs will be
9114 chained to this hook. LOCATION contains the location of the
9115 separating `.' operator. */
9118 make_qualified_primary (primary, right, location)
9119 tree primary, right;
9124 if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
9125 wfl = build_wfl_wrap (primary, location);
9129 /* If wfl wasn't qualified, we build a first anchor */
9130 if (!EXPR_WFL_QUALIFICATION (wfl))
9131 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (wfl, NULL_TREE);
9134 /* And chain them */
9135 EXPR_WFL_LINECOL (right) = location;
9136 chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
9137 PRIMARY_P (wfl) = 1;
9141 /* Simple merge of two name separated by a `.' */
9144 merge_qualified_name (left, right)
9148 if (!left && !right)
9157 obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
9158 IDENTIFIER_LENGTH (left));
9159 obstack_1grow (&temporary_obstack, '.');
9160 obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
9161 IDENTIFIER_LENGTH (right));
9162 node = get_identifier (obstack_base (&temporary_obstack));
9163 obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
9164 QUALIFIED_P (node) = 1;
9168 /* Merge the two parts of a qualified name into LEFT. Set the
9169 location information of the resulting node to LOCATION, usually
9170 inherited from the location information of the `.' operator. */
9173 make_qualified_name (left, right, location)
9177 #ifdef USE_COMPONENT_REF
9178 tree node = build (COMPONENT_REF, NULL_TREE, left, right);
9179 EXPR_WFL_LINECOL (node) = location;
9182 tree left_id = EXPR_WFL_NODE (left);
9183 tree right_id = EXPR_WFL_NODE (right);
9186 merge = merge_qualified_name (left_id, right_id);
9188 /* Left wasn't qualified and is now qualified */
9189 if (!QUALIFIED_P (left_id))
9191 tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
9192 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
9193 EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
9196 wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
9197 EXPR_WFL_LINECOL (wfl) = location;
9198 chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
9200 EXPR_WFL_NODE (left) = merge;
9205 /* Extract the last identifier component of the qualified in WFL. The
9206 last identifier is removed from the linked list */
9209 cut_identifier_in_qualified (wfl)
9213 tree previous = NULL_TREE;
9214 for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
9215 if (!TREE_CHAIN (q))
9218 /* Operating on a non qualified qualified WFL. */
9221 TREE_CHAIN (previous) = NULL_TREE;
9222 return TREE_PURPOSE (q);
9226 /* Resolve the expression name NAME. Return its decl. */
9229 resolve_expression_name (id, orig)
9233 tree name = EXPR_WFL_NODE (id);
9236 /* 6.5.5.1: Simple expression names */
9237 if (!PRIMARY_P (id) && !QUALIFIED_P (name))
9239 /* 15.13.1: NAME can appear within the scope of a local variable
9241 if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
9244 /* 15.13.1: NAME can appear within a class declaration */
9247 decl = lookup_field_wrapper (current_class, name);
9250 tree access = NULL_TREE;
9251 int fs = FIELD_STATIC (decl);
9253 /* If we're accessing an outer scope local alias, make
9254 sure we change the name of the field we're going to
9256 if (FIELD_LOCAL_ALIAS_USED (decl))
9257 name = DECL_NAME (decl);
9259 /* Instance variable (8.3.1.1) can't appear within
9260 static method, static initializer or initializer for
9261 a static variable. */
9262 if (!fs && METHOD_STATIC (current_function_decl))
9264 static_ref_err (id, name, current_class);
9265 return error_mark_node;
9267 /* Instance variables can't appear as an argument of
9268 an explicit constructor invocation */
9269 if (!fs && ctxp->explicit_constructor_p
9270 && !enclosing_context_p (DECL_CONTEXT (decl), current_class))
9273 (id, "Can't reference `%s' before the superclass constructor has been called", IDENTIFIER_POINTER (name));
9274 return error_mark_node;
9277 /* If we're processing an inner class and we're trying
9278 to access a field belonging to an outer class, build
9279 the access to the field */
9280 if (!fs && outer_field_access_p (current_class, decl))
9282 if (CLASS_STATIC (TYPE_NAME (current_class)))
9284 static_ref_err (id, DECL_NAME (decl), current_class);
9285 return error_mark_node;
9287 access = build_outer_field_access (id, decl);
9293 /* Otherwise build what it takes to access the field */
9294 access = build_field_ref ((fs ? NULL_TREE : current_this),
9295 DECL_CONTEXT (decl), name);
9297 access = maybe_build_class_init_for_field (decl, access);
9298 /* We may be asked to save the real field access node */
9301 /* And we return what we got */
9304 /* Fall down to error report on undefined variable */
9307 /* 6.5.5.2 Qualified Expression Names */
9312 qualify_ambiguous_name (id);
9313 /* 15.10.1 Field Access Using a Primary and/or Expression Name */
9314 /* 15.10.2: Accessing Superclass Members using super */
9315 return resolve_field_access (id, orig, NULL);
9318 /* We've got an error here */
9319 if (INNER_CLASS_TYPE_P (current_class))
9320 parse_error_context (id,
9321 "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final",
9322 IDENTIFIER_POINTER (name),
9323 IDENTIFIER_POINTER (DECL_NAME
9324 (TYPE_NAME (current_class))));
9326 parse_error_context (id, "Undefined variable `%s'",
9327 IDENTIFIER_POINTER (name));
9329 return error_mark_node;
9333 static_ref_err (wfl, field_id, class_type)
9334 tree wfl, field_id, class_type;
9338 "Can't make a static reference to nonstatic variable `%s' in class `%s'",
9339 IDENTIFIER_POINTER (field_id),
9340 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
9343 /* 15.10.1 Field Access Using a Primary and/or Expression Name.
9344 We return something suitable to generate the field access. We also
9345 return the field decl in FIELD_DECL and its type in FIELD_TYPE. If
9346 recipient's address can be null. */
9349 resolve_field_access (qual_wfl, field_decl, field_type)
9351 tree *field_decl, *field_type;
9355 tree decl, where_found, type_found;
9357 if (resolve_qualified_expression_name (qual_wfl, &decl,
9358 &where_found, &type_found))
9359 return error_mark_node;
9361 /* Resolve the LENGTH field of an array here */
9362 if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node
9363 && type_found && TYPE_ARRAY_P (type_found)
9364 && ! flag_emit_class_files && ! flag_emit_xref)
9366 tree length = build_java_array_length_access (where_found);
9369 /* In case we're dealing with a static array, we need to
9370 initialize its class before the array length can be fetched.
9371 It's also a good time to create a DECL_RTL for the field if
9372 none already exists, otherwise if the field was declared in a
9373 class found in an external file and hasn't been (and won't
9374 be) accessed for its value, none will be created. */
9375 if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
9377 build_static_field_ref (where_found);
9378 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9381 /* We might have been trying to resolve field.method(). In which
9382 case, the resolution is over and decl is the answer */
9383 else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
9385 else if (JDECL_P (decl))
9388 type_found = DECL_CONTEXT (decl);
9389 is_static = FIELD_STATIC (decl);
9390 field_ref = build_field_ref ((is_static && !flag_emit_xref?
9391 NULL_TREE : where_found),
9392 type_found, DECL_NAME (decl));
9393 if (field_ref == error_mark_node)
9394 return error_mark_node;
9396 field_ref = maybe_build_class_init_for_field (decl, field_ref);
9404 *field_type = (QUAL_DECL_TYPE (decl) ?
9405 QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
9409 /* If NODE is an access to f static field, strip out the class
9410 initialization part and return the field decl, otherwise, return
9414 strip_out_static_field_access_decl (node)
9417 if (TREE_CODE (node) == COMPOUND_EXPR)
9419 tree op1 = TREE_OPERAND (node, 1);
9420 if (TREE_CODE (op1) == COMPOUND_EXPR)
9422 tree call = TREE_OPERAND (op1, 0);
9423 if (TREE_CODE (call) == CALL_EXPR
9424 && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
9425 && TREE_OPERAND (TREE_OPERAND (call, 0), 0)
9426 == soft_initclass_node)
9427 return TREE_OPERAND (op1, 1);
9429 else if (JDECL_P (op1))
9435 /* 6.5.5.2: Qualified Expression Names */
9438 resolve_qualified_expression_name (wfl, found_decl, where_found, type_found)
9440 tree *found_decl, *type_found, *where_found;
9442 int from_type = 0; /* Field search initiated from a type */
9443 int from_super = 0, from_cast = 0, from_qualified_this = 0;
9444 int previous_call_static = 0;
9446 tree decl = NULL_TREE, type = NULL_TREE, q;
9447 /* For certain for of inner class instantiation */
9448 tree saved_current, saved_this;
9449 #define RESTORE_THIS_AND_CURRENT_CLASS \
9450 { current_class = saved_current; current_this = saved_this;}
9452 *type_found = *where_found = NULL_TREE;
9454 for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
9456 tree qual_wfl = QUAL_WFL (q);
9457 tree ret_decl; /* for EH checking */
9458 int location; /* for EH checking */
9460 /* 15.10.1 Field Access Using a Primary */
9461 switch (TREE_CODE (qual_wfl))
9464 case NEW_CLASS_EXPR:
9465 /* If the access to the function call is a non static field,
9466 build the code to access it. */
9467 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9469 decl = maybe_access_field (decl, *where_found,
9470 DECL_CONTEXT (decl));
9471 if (decl == error_mark_node)
9475 /* And code for the function call */
9476 if (complete_function_arguments (qual_wfl))
9479 /* We might have to setup a new current class and a new this
9480 for the search of an inner class, relative to the type of
9481 a expression resolved as `decl'. The current values are
9482 saved and restored shortly after */
9483 saved_current = current_class;
9484 saved_this = current_this;
9486 && (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9487 || from_qualified_this))
9489 /* If we still have `from_qualified_this', we have the form
9490 <T>.this.f() and we need to build <T>.this */
9491 if (from_qualified_this)
9493 decl = build_access_to_thisn (current_class, type, 0);
9494 decl = java_complete_tree (decl);
9495 type = TREE_TYPE (TREE_TYPE (decl));
9497 current_class = type;
9498 current_this = decl;
9499 from_qualified_this = 0;
9502 if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
9503 CALL_USING_SUPER (qual_wfl) = 1;
9504 location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
9505 EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
9506 *where_found = patch_method_invocation (qual_wfl, decl, type,
9508 &is_static, &ret_decl);
9510 if (*where_found == error_mark_node)
9512 RESTORE_THIS_AND_CURRENT_CLASS;
9515 *type_found = type = QUAL_DECL_TYPE (*where_found);
9517 /* If we're creating an inner class instance, check for that
9518 an enclosing instance is in scope */
9519 if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9520 && INNER_ENCLOSING_SCOPE_CHECK (type))
9523 (qual_wfl, "No enclosing instance for inner class `%s' is in scope%s",
9524 lang_printable_name (type, 0),
9525 (!current_this ? "" :
9526 "; an explicit one must be provided when creating this inner class"));
9527 RESTORE_THIS_AND_CURRENT_CLASS;
9531 /* In case we had to change then to resolve a inner class
9532 instantiation using a primary qualified by a `new' */
9533 RESTORE_THIS_AND_CURRENT_CLASS;
9535 /* EH check. No check on access$<n> functions */
9537 && !OUTER_FIELD_ACCESS_IDENTIFIER_P
9538 (DECL_NAME (current_function_decl)))
9539 check_thrown_exceptions (location, ret_decl);
9541 /* If the previous call was static and this one is too,
9542 build a compound expression to hold the two (because in
9543 that case, previous function calls aren't transported as
9544 forcoming function's argument. */
9545 if (previous_call_static && is_static)
9547 decl = build (COMPOUND_EXPR, TREE_TYPE (*where_found),
9548 decl, *where_found);
9549 TREE_SIDE_EFFECTS (decl) = 1;
9553 previous_call_static = is_static;
9554 decl = *where_found;
9559 case NEW_ARRAY_EXPR:
9560 case NEW_ANONYMOUS_ARRAY_EXPR:
9561 *where_found = decl = java_complete_tree (qual_wfl);
9562 if (decl == error_mark_node)
9564 *type_found = type = QUAL_DECL_TYPE (decl);
9568 *where_found = decl = java_complete_tree (qual_wfl);
9569 if (decl == error_mark_node)
9571 *type_found = type = QUAL_DECL_TYPE (decl);
9575 case CONDITIONAL_EXPR:
9578 *where_found = decl = java_complete_tree (qual_wfl);
9579 if (decl == error_mark_node)
9581 *type_found = type = QUAL_DECL_TYPE (decl);
9585 /* If the access to the function call is a non static field,
9586 build the code to access it. */
9587 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9589 decl = maybe_access_field (decl, *where_found, type);
9590 if (decl == error_mark_node)
9593 /* And code for the array reference expression */
9594 decl = java_complete_tree (qual_wfl);
9595 if (decl == error_mark_node)
9597 type = QUAL_DECL_TYPE (decl);
9601 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9603 if ((type = patch_string (decl)))
9605 *where_found = QUAL_RESOLUTION (q) = decl;
9606 *type_found = type = TREE_TYPE (decl);
9610 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9612 *where_found = QUAL_RESOLUTION (q) = decl;
9613 *type_found = type = TREE_TYPE (decl);
9617 /* Fix for -Wall Just go to the next statement. Don't
9622 /* If we fall here, we weren't processing a (static) function call. */
9623 previous_call_static = 0;
9625 /* It can be the keyword THIS */
9626 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9627 && EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
9632 (wfl, "Keyword `this' used outside allowed context");
9635 if (ctxp->explicit_constructor_p
9636 && type == current_class)
9638 parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
9641 /* We have to generate code for intermediate access */
9642 if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type)
9644 *where_found = decl = current_this;
9645 *type_found = type = QUAL_DECL_TYPE (decl);
9647 /* We're trying to access the this from somewhere else. Make sure
9648 it's allowed before doing so. */
9651 if (!enclosing_context_p (type, current_class))
9653 char *p = xstrdup (lang_printable_name (type, 0));
9654 parse_error_context (qual_wfl, "Can't use variable `%s.this': type `%s' isn't an outer type of type `%s'",
9656 lang_printable_name (current_class, 0));
9660 from_qualified_this = 1;
9661 /* If there's nothing else after that, we need to
9662 produce something now, otherwise, the section of the
9663 code that needs to produce <T>.this will generate
9664 what is necessary. */
9665 if (!TREE_CHAIN (q))
9667 decl = build_access_to_thisn (current_class, type, 0);
9668 *where_found = decl = java_complete_tree (decl);
9669 *type_found = type = TREE_TYPE (decl);
9677 /* 15.10.2 Accessing Superclass Members using SUPER */
9678 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9679 && EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
9682 /* Check on the restricted use of SUPER */
9683 if (METHOD_STATIC (current_function_decl)
9684 || current_class == object_type_node)
9687 (wfl, "Keyword `super' used outside allowed context");
9690 /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
9691 node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
9692 CLASSTYPE_SUPER (current_class),
9693 build_this (EXPR_WFL_LINECOL (qual_wfl)));
9694 *where_found = decl = java_complete_tree (node);
9695 if (decl == error_mark_node)
9697 *type_found = type = QUAL_DECL_TYPE (decl);
9698 from_super = from_type = 1;
9702 /* 15.13.1: Can't search for field name in packages, so we
9703 assume a variable/class name was meant. */
9704 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
9707 if ((decl = resolve_package (wfl, &q, &name)))
9710 *where_found = decl;
9712 /* We want to be absolutely sure that the class is laid
9713 out. We're going to search something inside it. */
9714 *type_found = type = TREE_TYPE (decl);
9715 layout_class (type);
9718 /* Fix them all the way down, if any are left. */
9721 list = TREE_CHAIN (q);
9724 RESOLVE_EXPRESSION_NAME_P (QUAL_WFL (list)) = 1;
9725 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (list)) = 0;
9726 list = TREE_CHAIN (list);
9732 if (from_super || from_cast)
9734 ((from_cast ? qual_wfl : wfl),
9735 "No variable `%s' defined in class `%s'",
9736 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9737 lang_printable_name (type, 0));
9740 (qual_wfl, "Undefined variable or class name: `%s'",
9741 IDENTIFIER_POINTER (name));
9746 /* We have a type name. It's been already resolved when the
9747 expression was qualified. */
9748 else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q))
9750 decl = QUAL_RESOLUTION (q);
9752 /* Sneak preview. If next we see a `new', we're facing a
9753 qualification with resulted in a type being selected
9754 instead of a field. Report the error */
9756 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR)
9758 parse_error_context (qual_wfl, "Undefined variable `%s'",
9759 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
9763 if (not_accessible_p (TREE_TYPE (decl), decl, type, 0))
9766 (qual_wfl, "Can't access %s field `%s.%s' from `%s'",
9767 java_accstring_lookup (get_access_flags_from_decl (decl)),
9768 GET_TYPE_NAME (type),
9769 IDENTIFIER_POINTER (DECL_NAME (decl)),
9770 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
9773 check_deprecation (qual_wfl, decl);
9775 type = TREE_TYPE (decl);
9778 /* We resolve an expression name */
9781 tree field_decl = NULL_TREE;
9783 /* If there exists an early resolution, use it. That occurs
9784 only once and we know that there are more things to
9785 come. Don't do that when processing something after SUPER
9786 (we need more thing to be put in place below */
9787 if (!from_super && QUAL_RESOLUTION (q))
9789 decl = QUAL_RESOLUTION (q);
9792 if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
9795 *where_found = current_this;
9798 static_ref_err (qual_wfl, DECL_NAME (decl),
9802 if (outer_field_access_p (current_class, decl))
9803 decl = build_outer_field_access (qual_wfl, decl);
9807 *where_found = TREE_TYPE (decl);
9808 if (TREE_CODE (*where_found) == POINTER_TYPE)
9809 *where_found = TREE_TYPE (*where_found);
9814 /* Report and error if we're using a numerical litteral as a
9815 qualifier. It can only be an INTEGER_CST. */
9816 else if (TREE_CODE (qual_wfl) == INTEGER_CST)
9819 (wfl, "Can't use type `%s' as a qualifier",
9820 lang_printable_name (TREE_TYPE (qual_wfl), 0));
9824 /* We have to search for a field, knowing the type of its
9825 container. The flag FROM_TYPE indicates that we resolved
9826 the last member of the expression as a type name, which
9827 means that for the resolution of this field, we'll look
9828 for other errors than if it was resolved as a member of
9833 tree field_decl_type; /* For layout */
9835 if (!from_type && !JREFERENCE_TYPE_P (type))
9838 (qual_wfl, "Attempt to reference field `%s' in `%s %s'",
9839 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9840 lang_printable_name (type, 0),
9841 IDENTIFIER_POINTER (DECL_NAME (decl)));
9845 field_decl = lookup_field_wrapper (type,
9846 EXPR_WFL_NODE (qual_wfl));
9848 /* Maybe what we're trying to access to is an inner
9849 class, only if decl is a TYPE_DECL. */
9850 if (!field_decl && TREE_CODE (decl) == TYPE_DECL)
9852 tree ptr, inner_decl;
9854 BUILD_PTR_FROM_NAME (ptr, EXPR_WFL_NODE (qual_wfl));
9855 inner_decl = resolve_class (decl, ptr, NULL_TREE, qual_wfl);
9858 check_inner_class_access (inner_decl, decl, qual_wfl);
9859 type = TREE_TYPE (inner_decl);
9866 if (field_decl == NULL_TREE)
9869 (qual_wfl, "No variable `%s' defined in type `%s'",
9870 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9871 GET_TYPE_NAME (type));
9874 if (field_decl == error_mark_node)
9877 /* Layout the type of field_decl, since we may need
9878 it. Don't do primitive types or loaded classes. The
9879 situation of non primitive arrays may not handled
9880 properly here. FIXME */
9881 if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
9882 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
9884 field_decl_type = TREE_TYPE (field_decl);
9885 if (!JPRIMITIVE_TYPE_P (field_decl_type)
9886 && !CLASS_LOADED_P (field_decl_type)
9887 && !TYPE_ARRAY_P (field_decl_type))
9888 resolve_and_layout (field_decl_type, NULL_TREE);
9890 /* Check on accessibility here */
9891 if (not_accessible_p (current_class, field_decl,
9892 DECL_CONTEXT (field_decl), from_super))
9896 "Can't access %s field `%s.%s' from `%s'",
9897 java_accstring_lookup
9898 (get_access_flags_from_decl (field_decl)),
9899 GET_TYPE_NAME (type),
9900 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
9902 (DECL_NAME (TYPE_NAME (current_class))));
9905 check_deprecation (qual_wfl, field_decl);
9907 /* There are things to check when fields are accessed
9908 from type. There are no restrictions on a static
9909 declaration of the field when it is accessed from an
9911 is_static = FIELD_STATIC (field_decl);
9912 if (!from_super && from_type
9913 && !TYPE_INTERFACE_P (type)
9915 && (current_function_decl
9916 && METHOD_STATIC (current_function_decl)))
9918 static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
9921 from_cast = from_super = 0;
9923 /* It's an access from a type but it isn't static, we
9924 make it relative to `this'. */
9925 if (!is_static && from_type)
9926 decl = current_this;
9928 /* If we need to generate something to get a proper
9929 handle on what this field is accessed from, do it
9933 decl = maybe_access_field (decl, *where_found, *type_found);
9934 if (decl == error_mark_node)
9938 /* We want to keep the location were found it, and the type
9940 *where_found = decl;
9943 /* Generate the correct expression for field access from
9945 if (from_qualified_this)
9947 field_decl = build_outer_field_access (qual_wfl, field_decl);
9948 from_qualified_this = 0;
9951 /* This is the decl found and eventually the next one to
9956 type = QUAL_DECL_TYPE (decl);
9958 /* Sneak preview. If decl is qualified by a `new', report
9959 the error here to be accurate on the peculiar construct */
9961 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR
9962 && !JREFERENCE_TYPE_P (type))
9964 parse_error_context (qual_wfl, "Attempt to reference field `new' in a `%s'",
9965 lang_printable_name (type, 0));
9969 /* `q' might have changed due to a after package resolution
9978 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
9979 can't be accessed from REFERENCE (a record type). If MEMBER
9980 features a protected access, we then use WHERE which, if non null,
9981 holds the type of MEMBER's access that is checked against
9982 6.6.2.1. This function should be used when decl is a field or a
9986 not_accessible_p (reference, member, where, from_super)
9987 tree reference, member;
9991 int access_flag = get_access_flags_from_decl (member);
9993 /* Inner classes are processed by check_inner_class_access */
9994 if (INNER_CLASS_TYPE_P (reference))
9997 /* Access always granted for members declared public */
9998 if (access_flag & ACC_PUBLIC)
10001 /* Check access on protected members */
10002 if (access_flag & ACC_PROTECTED)
10004 /* Access granted if it occurs from within the package
10005 containing the class in which the protected member is
10007 if (class_in_current_package (DECL_CONTEXT (member)))
10010 /* If accessed with the form `super.member', then access is granted */
10014 /* If where is active, access was made through a
10015 qualifier. Access is granted if the type of the qualifier is
10016 or is a sublass of the type the access made from (6.6.2.1.) */
10017 if (where && !inherits_from_p (reference, where))
10020 /* Otherwise, access is granted if occurring from the class where
10021 member is declared or a subclass of it. Find the right
10022 context to perform the check */
10023 if (PURE_INNER_CLASS_TYPE_P (reference))
10025 while (INNER_CLASS_TYPE_P (reference))
10027 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10029 reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10032 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10037 /* Check access on private members. Access is granted only if it
10038 occurs from within the class in which it is declared -- that does
10039 it for innerclasses too. */
10040 if (access_flag & ACC_PRIVATE)
10042 if (reference == DECL_CONTEXT (member))
10044 if (enclosing_context_p (reference, DECL_CONTEXT (member)))
10049 /* Default access are permitted only when occurring within the
10050 package in which the type (REFERENCE) is declared. In other words,
10051 REFERENCE is defined in the current package */
10053 return !class_in_current_package (reference);
10055 /* Otherwise, access is granted */
10059 /* Test deprecated decl access. */
10061 check_deprecation (wfl, decl)
10064 const char *file = DECL_SOURCE_FILE (decl);
10065 /* Complain if the field is deprecated and the file it was defined
10066 in isn't compiled at the same time the file which contains its
10068 if (DECL_DEPRECATED (decl)
10069 && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
10072 switch (TREE_CODE (decl))
10074 case FUNCTION_DECL:
10075 strcpy (the, "method");
10079 strcpy (the, "field");
10082 parse_warning_context (wfl, "The class `%s' has been deprecated",
10083 IDENTIFIER_POINTER (DECL_NAME (decl)));
10088 /* Don't issue a message if the context as been deprecated as a
10090 if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl))))
10091 parse_warning_context
10092 (wfl, "The %s `%s' in class `%s' has been deprecated",
10093 the, lang_printable_name (decl, 0),
10094 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
10098 /* Returns 1 if class was declared in the current package, 0 otherwise */
10100 static GTY(()) tree cicp_cache;
10102 class_in_current_package (class)
10105 int qualified_flag;
10108 if (cicp_cache == class)
10111 qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
10113 /* If the current package is empty and the name of CLASS is
10114 qualified, class isn't in the current package. If there is a
10115 current package and the name of the CLASS is not qualified, class
10116 isn't in the current package */
10117 if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
10120 /* If there is not package and the name of CLASS isn't qualified,
10121 they belong to the same unnamed package */
10122 if (!ctxp->package && !qualified_flag)
10125 /* Compare the left part of the name of CLASS with the package name */
10126 breakdown_qualified (&left, NULL, DECL_NAME (TYPE_NAME (class)));
10127 if (ctxp->package == left)
10129 cicp_cache = class;
10135 /* This function may generate code to access DECL from WHERE. This is
10136 done only if certain conditions meet. */
10139 maybe_access_field (decl, where, type)
10140 tree decl, where, type;
10142 if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
10143 && !FIELD_STATIC (decl))
10144 decl = build_field_ref (where ? where : current_this,
10145 (type ? type : DECL_CONTEXT (decl)),
10150 /* Build a method invocation, by patching PATCH. If non NULL
10151 and according to the situation, PRIMARY and WHERE may be
10152 used. IS_STATIC is set to 1 if the invoked function is static. */
10155 patch_method_invocation (patch, primary, where, from_super,
10156 is_static, ret_decl)
10157 tree patch, primary, where;
10162 tree wfl = TREE_OPERAND (patch, 0);
10163 tree args = TREE_OPERAND (patch, 1);
10164 tree name = EXPR_WFL_NODE (wfl);
10166 int is_static_flag = 0;
10167 int is_super_init = 0;
10168 tree this_arg = NULL_TREE;
10169 int is_array_clone_call = 0;
10171 /* Should be overriden if everything goes well. Otherwise, if
10172 something fails, it should keep this value. It stop the
10173 evaluation of a bogus assignment. See java_complete_tree,
10174 MODIFY_EXPR: for the reasons why we sometimes want to keep on
10175 evaluating an assignment */
10176 TREE_TYPE (patch) = error_mark_node;
10178 /* Since lookup functions are messing with line numbers, save the
10180 java_parser_context_save_global ();
10182 /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
10184 /* Resolution of qualified name, excluding constructors */
10185 if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
10187 tree identifier, identifier_wfl, type, resolved;
10188 /* Extract the last IDENTIFIER of the qualified
10189 expression. This is a wfl and we will use it's location
10190 data during error report. */
10191 identifier_wfl = cut_identifier_in_qualified (wfl);
10192 identifier = EXPR_WFL_NODE (identifier_wfl);
10194 /* Given the context, IDENTIFIER is syntactically qualified
10195 as a MethodName. We need to qualify what's before */
10196 qualify_ambiguous_name (wfl);
10197 resolved = resolve_field_access (wfl, NULL, NULL);
10199 if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved)
10200 && FIELD_FINAL (resolved)
10201 && !inherits_from_p (DECL_CONTEXT (resolved), current_class)
10202 && !flag_emit_class_files && !flag_emit_xref)
10203 resolved = build_class_init (DECL_CONTEXT (resolved), resolved);
10205 if (resolved == error_mark_node)
10206 PATCH_METHOD_RETURN_ERROR ();
10208 type = GET_SKIP_TYPE (resolved);
10209 resolve_and_layout (type, NULL_TREE);
10211 if (JPRIMITIVE_TYPE_P (type))
10213 parse_error_context
10215 "Can't invoke a method on primitive type `%s'",
10216 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10217 PATCH_METHOD_RETURN_ERROR ();
10220 list = lookup_method_invoke (0, identifier_wfl, type, identifier, args);
10221 args = nreverse (args);
10223 /* We're resolving a call from a type */
10224 if (TREE_CODE (resolved) == TYPE_DECL)
10226 if (CLASS_INTERFACE (resolved))
10228 parse_error_context
10230 "Can't make static reference to method `%s' in interface `%s'",
10231 IDENTIFIER_POINTER (identifier),
10232 IDENTIFIER_POINTER (name));
10233 PATCH_METHOD_RETURN_ERROR ();
10235 if (list && !METHOD_STATIC (list))
10237 char *fct_name = xstrdup (lang_printable_name (list, 0));
10238 parse_error_context
10240 "Can't make static reference to method `%s %s' in class `%s'",
10241 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
10242 fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10244 PATCH_METHOD_RETURN_ERROR ();
10248 this_arg = primary = resolved;
10250 if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
10251 is_array_clone_call = 1;
10253 /* IDENTIFIER_WFL will be used to report any problem further */
10254 wfl = identifier_wfl;
10256 /* Resolution of simple names, names generated after a primary: or
10260 tree class_to_search = NULL_TREE;
10261 int lc; /* Looking for Constructor */
10263 /* We search constructor in their target class */
10264 if (CALL_CONSTRUCTOR_P (patch))
10266 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10267 class_to_search = EXPR_WFL_NODE (wfl);
10268 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10269 this_identifier_node)
10270 class_to_search = NULL_TREE;
10271 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10272 super_identifier_node)
10275 if (CLASSTYPE_SUPER (current_class))
10277 DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
10280 parse_error_context (wfl, "Can't invoke super constructor on java.lang.Object");
10281 PATCH_METHOD_RETURN_ERROR ();
10285 /* Class to search is NULL if we're searching the current one */
10286 if (class_to_search)
10288 class_to_search = resolve_and_layout (class_to_search, wfl);
10290 if (!class_to_search)
10292 parse_error_context
10293 (wfl, "Class `%s' not found in type declaration",
10294 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10295 PATCH_METHOD_RETURN_ERROR ();
10298 /* Can't instantiate an abstract class, but we can
10299 invoke it's constructor. It's use within the `new'
10300 context is denied here. */
10301 if (CLASS_ABSTRACT (class_to_search)
10302 && TREE_CODE (patch) == NEW_CLASS_EXPR)
10304 parse_error_context
10305 (wfl, "Class `%s' is an abstract class. It can't be instantiated",
10306 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10307 PATCH_METHOD_RETURN_ERROR ();
10310 class_to_search = TREE_TYPE (class_to_search);
10313 class_to_search = current_class;
10316 /* This is a regular search in the local class, unless an
10317 alternate class is specified. */
10320 if (where != NULL_TREE)
10321 class_to_search = where;
10322 else if (QUALIFIED_P (name))
10323 class_to_search = current_class;
10326 class_to_search = current_class;
10330 if (has_method (class_to_search, name))
10332 if (! INNER_CLASS_TYPE_P (class_to_search))
10334 parse_error_context (wfl,
10335 "No method named `%s' in scope",
10336 IDENTIFIER_POINTER (name));
10337 PATCH_METHOD_RETURN_ERROR ();
10340 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
10346 /* NAME is a simple identifier or comes from a primary. Search
10347 in the class whose declaration contain the method being
10349 resolve_and_layout (class_to_search, NULL_TREE);
10351 list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
10352 /* Don't continue if no method were found, as the next statement
10353 can't be executed then. */
10355 PATCH_METHOD_RETURN_ERROR ();
10357 if (TYPE_ARRAY_P (class_to_search)
10358 && DECL_NAME (list) == get_identifier ("clone"))
10359 is_array_clone_call = 1;
10361 /* Check for static reference if non static methods */
10362 if (check_for_static_method_reference (wfl, patch, list,
10363 class_to_search, primary))
10364 PATCH_METHOD_RETURN_ERROR ();
10366 /* Check for inner classes creation from illegal contexts */
10367 if (lc && (INNER_CLASS_TYPE_P (class_to_search)
10368 && !CLASS_STATIC (TYPE_NAME (class_to_search)))
10369 && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)
10370 && !DECL_INIT_P (current_function_decl))
10372 parse_error_context
10373 (wfl, "No enclosing instance for inner class `%s' is in scope%s",
10374 lang_printable_name (class_to_search, 0),
10375 (!current_this ? "" :
10376 "; an explicit one must be provided when creating this inner class"));
10377 PATCH_METHOD_RETURN_ERROR ();
10380 /* Non static methods are called with the current object extra
10381 argument. If patch a `new TYPE()', the argument is the value
10382 returned by the object allocator. If method is resolved as a
10383 primary, use the primary otherwise use the current THIS. */
10384 args = nreverse (args);
10385 if (TREE_CODE (patch) != NEW_CLASS_EXPR)
10387 this_arg = primary ? primary : current_this;
10389 /* If we're using an access method, things are different.
10390 There are two familly of cases:
10392 1) We're not generating bytecodes:
10394 - LIST is non static. It's invocation is transformed from
10395 x(a1,...,an) into this$<n>.x(a1,....an).
10396 - LIST is static. It's invocation is transformed from
10397 x(a1,...,an) into TYPE_OF(this$<n>).x(a1,....an)
10399 2) We're generating bytecodes:
10401 - LIST is non static. It's invocation is transformed from
10402 x(a1,....,an) into access$<n>(this$<n>,a1,...,an).
10403 - LIST is static. It's invocation is transformed from
10404 x(a1,....,an) into TYPE_OF(this$<n>).x(a1,....an).
10406 Of course, this$<n> can be abitrary complex, ranging from
10407 this$0 (the immediate outer context) to
10408 access$0(access$0(...(this$0))).
10410 maybe_use_access_method returns a non zero value if the
10411 this_arg has to be moved into the (then generated) stub
10412 argument list. In the meantime, the selected function
10413 might have be replaced by a generated stub. */
10415 maybe_use_access_method (is_super_init, &list, &this_arg))
10417 args = tree_cons (NULL_TREE, this_arg, args);
10418 this_arg = NULL_TREE; /* So it doesn't get chained twice */
10423 /* Merge point of all resolution schemes. If we have nothing, this
10424 is an error, already signaled */
10426 PATCH_METHOD_RETURN_ERROR ();
10428 /* Check accessibility, position the is_static flag, build and
10430 if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
10431 (primary ? TREE_TYPE (TREE_TYPE (primary)) :
10432 NULL_TREE), from_super)
10433 /* Calls to clone() on array types are permitted as a special-case. */
10434 && !is_array_clone_call)
10436 const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list));
10437 const char *const access =
10438 java_accstring_lookup (get_access_flags_from_decl (list));
10439 const char *const klass =
10440 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list))));
10441 const char *const refklass =
10442 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
10443 const char *const what = (DECL_CONSTRUCTOR_P (list)
10444 ? "constructor" : "method");
10445 /* FIXME: WFL yields the wrong message here but I don't know
10446 what else to use. */
10447 parse_error_context (wfl,
10448 "Can't access %s %s `%s.%s' from `%s'",
10449 access, what, klass, fct_name, refklass);
10450 PATCH_METHOD_RETURN_ERROR ();
10453 /* Deprecation check: check whether the method being invoked or the
10454 instance-being-created's type are deprecated. */
10455 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10456 check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list)));
10458 check_deprecation (wfl, list);
10460 /* If invoking a innerclass constructor, there are hidden parameters
10462 if (TREE_CODE (patch) == NEW_CLASS_EXPR
10463 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10465 /* And make sure we add the accessed local variables to be saved
10466 in field aliases. */
10467 args = build_alias_initializer_parameter_list
10468 (AIPL_FUNCTION_CTOR_INVOCATION, DECL_CONTEXT (list), args, NULL);
10470 /* Secretly pass the current_this/primary as a second argument */
10471 if (primary || current_this)
10474 tree this_type = (current_this ?
10475 TREE_TYPE (TREE_TYPE (current_this)) : NULL_TREE);
10476 /* Method's (list) enclosing context */
10477 tree mec = DECL_CONTEXT (TYPE_NAME (DECL_CONTEXT (list)));
10478 /* If we have a primary, use it. */
10480 extra_arg = primary;
10481 /* The current `this' is an inner class but isn't a direct
10482 enclosing context for the inner class we're trying to
10483 create. Build an access to the proper enclosing context
10485 else if (current_this && PURE_INNER_CLASS_TYPE_P (this_type)
10486 && this_type != TREE_TYPE (mec))
10489 extra_arg = build_access_to_thisn (current_class,
10490 TREE_TYPE (mec), 0);
10491 extra_arg = java_complete_tree (extra_arg);
10493 /* Otherwise, just use the current `this' as an enclosing
10496 extra_arg = current_this;
10497 args = tree_cons (NULL_TREE, extra_arg, args);
10500 args = tree_cons (NULL_TREE, integer_zero_node, args);
10503 /* This handles the situation where a constructor invocation needs
10504 to have an enclosing context passed as a second parameter (the
10505 constructor is one of an inner class). */
10506 if ((is_super_init ||
10507 (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node))
10508 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10510 tree dest = TYPE_NAME (DECL_CONTEXT (list));
10512 build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0);
10513 extra_arg = java_complete_tree (extra_arg);
10514 args = tree_cons (NULL_TREE, extra_arg, args);
10517 is_static_flag = METHOD_STATIC (list);
10518 if (! is_static_flag && this_arg != NULL_TREE)
10519 args = tree_cons (NULL_TREE, this_arg, args);
10521 /* In the context of an explicit constructor invocation, we can't
10522 invoke any method relying on `this'. Exceptions are: we're
10523 invoking a static function, primary exists and is not the current
10524 this, we're creating a new object. */
10525 if (ctxp->explicit_constructor_p
10527 && (!primary || primary == current_this)
10528 && (TREE_CODE (patch) != NEW_CLASS_EXPR))
10530 parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
10531 PATCH_METHOD_RETURN_ERROR ();
10533 java_parser_context_restore_global ();
10535 *is_static = is_static_flag;
10536 /* Sometimes, we want the decl of the selected method. Such as for
10540 patch = patch_invoke (patch, list, args);
10542 /* Now is a good time to insert the call to finit$ */
10543 if (is_super_init && CLASS_HAS_FINIT_P (current_class))
10545 tree finit_parms, finit_call;
10547 /* Prepare to pass hidden parameters to finit$, if any. */
10548 finit_parms = build_alias_initializer_parameter_list
10549 (AIPL_FUNCTION_FINIT_INVOCATION, current_class, NULL_TREE, NULL);
10552 build_method_invocation (build_wfl_node (finit_identifier_node),
10555 /* Generate the code used to initialize fields declared with an
10556 initialization statement and build a compound statement along
10557 with the super constructor invocation. */
10558 CAN_COMPLETE_NORMALLY (patch) = 1;
10559 patch = build (COMPOUND_EXPR, void_type_node, patch,
10560 java_complete_tree (finit_call));
10565 /* Check that we're not trying to do a static reference to a method in
10566 non static method. Return 1 if it's the case, 0 otherwise. */
10569 check_for_static_method_reference (wfl, node, method, where, primary)
10570 tree wfl, node, method, where, primary;
10572 if (METHOD_STATIC (current_function_decl)
10573 && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
10575 char *fct_name = xstrdup (lang_printable_name (method, 0));
10576 parse_error_context
10577 (wfl, "Can't make static reference to method `%s %s' in class `%s'",
10578 lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
10579 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
10586 /* Fix the invocation of *MDECL if necessary in the case of a
10587 invocation from an inner class. *THIS_ARG might be modified
10588 appropriately and an alternative access to *MDECL might be
10592 maybe_use_access_method (is_super_init, mdecl, this_arg)
10594 tree *mdecl, *this_arg;
10597 tree md = *mdecl, ta = *this_arg;
10599 int non_static_context = !METHOD_STATIC (md);
10602 || DECL_CONTEXT (md) == current_class
10603 || !PURE_INNER_CLASS_TYPE_P (current_class)
10604 || DECL_FINIT_P (md)
10605 || DECL_INSTINIT_P (md))
10608 /* If we're calling a method found in an enclosing class, generate
10609 what it takes to retrieve the right this. Don't do that if we're
10610 invoking a static method. Note that if MD's type is unrelated to
10611 CURRENT_CLASS, then the current this can be used. */
10613 if (non_static_context && DECL_CONTEXT (md) != object_type_node)
10615 ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
10616 if (inherits_from_p (ctx, DECL_CONTEXT (md)))
10618 ta = build_current_thisn (current_class);
10619 ta = build_wfl_node (ta);
10626 maybe_build_thisn_access_method (type);
10627 if (inherits_from_p (type, DECL_CONTEXT (md)))
10629 ta = build_access_to_thisn (ctx, type, 0);
10632 type = (DECL_CONTEXT (TYPE_NAME (type)) ?
10633 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))) : NULL_TREE);
10636 ta = java_complete_tree (ta);
10639 /* We might have to use an access method to get to MD. We can
10640 break the method access rule as far as we're not generating
10642 if (METHOD_PRIVATE (md) && flag_emit_class_files)
10644 md = build_outer_method_access_method (md);
10651 /* Returnin a non zero value indicates we were doing a non static
10652 method invokation that is now a static invocation. It will have
10653 callee displace `this' to insert it in the regular argument
10655 return (non_static_context && to_return);
10658 /* Patch an invoke expression METHOD and ARGS, based on its invocation
10662 patch_invoke (patch, method, args)
10663 tree patch, method, args;
10666 tree original_call, t, ta;
10667 tree check = NULL_TREE;
10669 /* Last step for args: convert build-in types. If we're dealing with
10670 a new TYPE() type call, the first argument to the constructor
10671 isn't found in the incoming argument list, but delivered by
10673 t = TYPE_ARG_TYPES (TREE_TYPE (method));
10674 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10675 t = TREE_CHAIN (t);
10676 for (ta = args; t != end_params_node && ta;
10677 t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
10678 if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
10679 TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
10680 TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
10682 /* Resolve unresolved returned type isses */
10683 t = TREE_TYPE (TREE_TYPE (method));
10684 if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
10685 resolve_and_layout (TREE_TYPE (t), NULL);
10687 if (flag_emit_class_files || flag_emit_xref)
10691 switch (invocation_mode (method, CALL_USING_SUPER (patch)))
10693 case INVOKE_VIRTUAL:
10694 dtable = invoke_build_dtable (0, args);
10695 func = build_invokevirtual (dtable, method);
10698 case INVOKE_NONVIRTUAL:
10699 /* If the object for the method call is null, we throw an
10700 exception. We don't do this if the object is the current
10701 method's `this'. In other cases we just rely on an
10702 optimization pass to eliminate redundant checks. */
10703 if (TREE_VALUE (args) != current_this)
10705 /* We use a save_expr here to make sure we only evaluate
10706 the new `self' expression once. */
10707 tree save_arg = save_expr (TREE_VALUE (args));
10708 TREE_VALUE (args) = save_arg;
10709 check = java_check_reference (save_arg, 1);
10711 /* Fall through. */
10714 case INVOKE_STATIC:
10716 tree signature = build_java_signature (TREE_TYPE (method));
10717 func = build_known_method_ref (method, TREE_TYPE (method),
10718 DECL_CONTEXT (method),
10723 case INVOKE_INTERFACE:
10724 dtable = invoke_build_dtable (1, args);
10725 func = build_invokeinterface (dtable, method);
10732 /* Ensure self_type is initialized, (invokestatic). FIXME */
10733 func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
10736 TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
10737 TREE_OPERAND (patch, 0) = func;
10738 TREE_OPERAND (patch, 1) = args;
10739 patch = check_for_builtin (method, patch);
10740 original_call = patch;
10742 /* We're processing a `new TYPE ()' form. New is called and its
10743 returned value is the first argument to the constructor. We build
10744 a COMPOUND_EXPR and use saved expression so that the overall NEW
10745 expression value is a pointer to a newly created and initialized
10747 if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
10749 tree class = DECL_CONTEXT (method);
10750 tree c1, saved_new, size, new;
10753 if (flag_emit_class_files || flag_emit_xref)
10755 TREE_TYPE (patch) = build_pointer_type (class);
10758 if (!TYPE_SIZE (class))
10759 safe_layout_class (class);
10760 size = size_in_bytes (class);
10762 (class_has_finalize_method (class) ? alloc_object_node
10763 : alloc_no_finalizer_node);
10764 new = build (CALL_EXPR, promote_type (class),
10765 build_address_of (alloc_node),
10766 tree_cons (NULL_TREE, build_class_ref (class),
10767 build_tree_list (NULL_TREE,
10768 size_in_bytes (class))),
10770 saved_new = save_expr (new);
10771 c1 = build_tree_list (NULL_TREE, saved_new);
10772 TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
10773 TREE_OPERAND (original_call, 1) = c1;
10774 TREE_SET_CODE (original_call, CALL_EXPR);
10775 patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
10778 /* If CHECK is set, then we are building a check to see if the object
10780 if (check != NULL_TREE)
10782 patch = build (COMPOUND_EXPR, TREE_TYPE (patch), check, patch);
10783 TREE_SIDE_EFFECTS (patch) = 1;
10786 /* In order to be able to modify PATCH later, we SAVE_EXPR it and
10787 put it as the first expression of a COMPOUND_EXPR. The second
10788 expression being an empty statement to be later patched if
10789 necessary. We remember a TREE_LIST (the PURPOSE is the method,
10790 the VALUE is the compound) in a hashtable and return a
10791 COMPOUND_EXPR built so that the result of the evaluation of the
10792 original PATCH node is returned. */
10793 if (STATIC_CLASS_INIT_OPT_P ()
10794 && current_function_decl && METHOD_STATIC (method))
10797 tree fndecl = current_function_decl;
10798 tree save = save_expr (patch);
10799 tree type = TREE_TYPE (patch);
10801 patch = build (COMPOUND_EXPR, type, save, empty_stmt_node);
10802 list = tree_cons (method, patch,
10803 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl));
10805 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list;
10807 patch = build (COMPOUND_EXPR, type, patch, save);
10814 invocation_mode (method, super)
10818 int access = get_access_flags_from_decl (method);
10821 return INVOKE_SUPER;
10823 if (access & ACC_STATIC)
10824 return INVOKE_STATIC;
10826 /* We have to look for a constructor before we handle nonvirtual
10827 calls; otherwise the constructor will look nonvirtual. */
10828 if (DECL_CONSTRUCTOR_P (method))
10829 return INVOKE_STATIC;
10831 if (access & ACC_FINAL || access & ACC_PRIVATE)
10832 return INVOKE_NONVIRTUAL;
10834 if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
10835 return INVOKE_NONVIRTUAL;
10837 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
10838 return INVOKE_INTERFACE;
10840 return INVOKE_VIRTUAL;
10843 /* Retrieve a refined list of matching methods. It covers the step
10844 15.11.2 (Compile-Time Step 2) */
10847 lookup_method_invoke (lc, cl, class, name, arg_list)
10850 tree class, name, arg_list;
10852 tree atl = end_params_node; /* Arg Type List */
10853 tree method, signature, list, node;
10854 const char *candidates; /* Used for error report */
10857 /* Fix the arguments */
10858 for (node = arg_list; node; node = TREE_CHAIN (node))
10860 tree current_arg = TREE_TYPE (TREE_VALUE (node));
10861 /* Non primitive type may have to be resolved */
10862 if (!JPRIMITIVE_TYPE_P (current_arg))
10863 resolve_and_layout (current_arg, NULL_TREE);
10865 if (TREE_CODE (current_arg) == RECORD_TYPE)
10866 current_arg = promote_type (current_arg);
10867 atl = tree_cons (NULL_TREE, current_arg, atl);
10870 /* Presto. If we're dealing with an anonymous class and a
10871 constructor call, generate the right constructor now, since we
10872 know the arguments' types. */
10874 if (lc && ANONYMOUS_CLASS_P (class))
10876 tree saved_current_class;
10877 tree mdecl = craft_constructor (TYPE_NAME (class), atl);
10878 saved_current_class = current_class;
10879 current_class = class;
10880 fix_constructors (mdecl);
10881 current_class = saved_current_class;
10884 /* Find all candidates and then refine the list, searching for the
10885 most specific method. */
10886 list = find_applicable_accessible_methods_list (lc, class, name, atl);
10887 list = find_most_specific_methods_list (list);
10888 if (list && !TREE_CHAIN (list))
10889 return TREE_VALUE (list);
10891 /* Issue an error. List candidates if any. Candidates are listed
10892 only if accessible (non accessible methods may end-up here for
10893 the sake of a better error report). */
10898 obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
10899 for (current = list; current; current = TREE_CHAIN (current))
10901 tree cm = TREE_VALUE (current);
10902 char string [4096];
10903 if (!cm || not_accessible_p (class, cm, NULL_TREE, 0))
10906 (string, " `%s' in `%s'%s",
10907 get_printable_method_name (cm),
10908 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
10909 (TREE_CHAIN (current) ? "\n" : ""));
10910 obstack_grow (&temporary_obstack, string, strlen (string));
10912 obstack_1grow (&temporary_obstack, '\0');
10913 candidates = obstack_finish (&temporary_obstack);
10915 /* Issue the error message */
10916 method = make_node (FUNCTION_TYPE);
10917 TYPE_ARG_TYPES (method) = atl;
10918 signature = build_java_argument_signature (method);
10919 dup = xstrdup (lang_printable_name (class, 0));
10920 parse_error_context (cl, "Can't find %s `%s(%s)' in type `%s'%s",
10921 (lc ? "constructor" : "method"),
10922 (lc ? dup : IDENTIFIER_POINTER (name)),
10923 IDENTIFIER_POINTER (signature), dup,
10924 (candidates ? candidates : ""));
10929 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
10930 when we're looking for a constructor. */
10933 find_applicable_accessible_methods_list (lc, class, name, arglist)
10935 tree class, name, arglist;
10937 static htab_t searched_classes;
10938 static int search_not_done = 0;
10939 tree list = NULL_TREE, all_list = NULL_TREE;
10941 /* Check the hash table to determine if this class has been searched
10943 if (searched_classes)
10945 if (htab_find (searched_classes, class) != NULL)
10950 searched_classes = htab_create (10, htab_hash_pointer,
10951 htab_eq_pointer, NULL);
10955 *htab_find_slot (searched_classes, class, INSERT) = class;
10957 if (!CLASS_LOADED_P (class) && !CLASS_FROM_SOURCE_P (class))
10959 load_class (class, 1);
10960 safe_layout_class (class);
10963 /* Search interfaces */
10964 if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL
10965 && CLASS_INTERFACE (TYPE_NAME (class)))
10968 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
10969 search_applicable_methods_list (lc, TYPE_METHODS (class),
10970 name, arglist, &list, &all_list);
10971 n = TREE_VEC_LENGTH (basetype_vec);
10972 for (i = 1; i < n; i++)
10974 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
10977 rlist = find_applicable_accessible_methods_list (lc, t, name,
10979 list = chainon (rlist, list);
10982 /* Search classes */
10985 search_applicable_methods_list (lc, TYPE_METHODS (class),
10986 name, arglist, &list, &all_list);
10988 /* When looking finit$, class$ or instinit$, we turn LC to 1 so
10989 that we only search in class. Note that we should have found
10990 something at this point. */
10991 if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name))
10998 /* We must search all interfaces of this class */
11001 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
11002 int n = TREE_VEC_LENGTH (basetype_vec), i;
11003 for (i = 1; i < n; i++)
11005 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11006 if (t != object_type_node)
11009 = find_applicable_accessible_methods_list (lc, t,
11011 list = chainon (rlist, list);
11016 /* Search superclass */
11017 if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
11020 class = CLASSTYPE_SUPER (class);
11021 rlist = find_applicable_accessible_methods_list (lc, class,
11023 list = chainon (rlist, list);
11029 /* We're done. Reset the searched classes list and finally search
11030 java.lang.Object if it wasn't searched already. */
11031 if (!search_not_done)
11034 && TYPE_METHODS (object_type_node)
11035 && htab_find (searched_classes, object_type_node) == NULL)
11037 search_applicable_methods_list (lc,
11038 TYPE_METHODS (object_type_node),
11039 name, arglist, &list, &all_list);
11041 htab_delete (searched_classes);
11042 searched_classes = NULL;
11045 /* Either return the list obtained or all selected (but
11046 inaccessible) methods for better error report. */
11047 return (!list ? all_list : list);
11050 /* Effectively search for the appropriate method in method */
11053 search_applicable_methods_list (lc, method, name, arglist, list, all_list)
11055 tree method, name, arglist;
11056 tree *list, *all_list;
11058 for (; method; method = TREE_CHAIN (method))
11060 /* When dealing with constructor, stop here, otherwise search
11062 if (lc && !DECL_CONSTRUCTOR_P (method))
11064 else if (!lc && (DECL_CONSTRUCTOR_P (method)
11065 || (DECL_NAME (method) != name)))
11068 if (argument_types_convertible (method, arglist))
11070 /* Retain accessible methods only */
11071 if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
11072 method, NULL_TREE, 0))
11073 *list = tree_cons (NULL_TREE, method, *list);
11075 /* Also retain all selected method here */
11076 *all_list = tree_cons (NULL_TREE, method, *list);
11081 /* 15.11.2.2 Choose the Most Specific Method */
11084 find_most_specific_methods_list (list)
11088 int abstract, candidates;
11089 tree current, new_list = NULL_TREE;
11090 for (current = list; current; current = TREE_CHAIN (current))
11093 DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
11095 for (method = list; method; method = TREE_CHAIN (method))
11097 tree method_v, current_v;
11098 /* Don't test a method against itself */
11099 if (method == current)
11102 method_v = TREE_VALUE (method);
11103 current_v = TREE_VALUE (current);
11105 /* Compare arguments and location where methods where declared */
11106 if (argument_types_convertible (method_v, current_v))
11108 if (valid_method_invocation_conversion_p
11109 (DECL_CONTEXT (method_v), DECL_CONTEXT (current_v))
11110 || (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v))
11111 && enclosing_context_p (DECL_CONTEXT (method_v),
11112 DECL_CONTEXT (current_v))))
11114 int v = (DECL_SPECIFIC_COUNT (current_v) +=
11115 (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v)) ? 2 : 1));
11116 max = (v > max ? v : max);
11122 /* Review the list and select the maximally specific methods */
11123 for (current = list, abstract = -1, candidates = -1;
11124 current; current = TREE_CHAIN (current))
11125 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11127 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11128 abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0);
11132 /* If we have several and they're all abstract, just pick the
11134 if (candidates > 0 && (candidates == abstract))
11136 new_list = nreverse (new_list);
11137 TREE_CHAIN (new_list) = NULL_TREE;
11140 /* We have several (we couldn't find a most specific), all but one
11141 are abstract, we pick the only non abstract one. */
11142 if (candidates > 0 && (candidates == abstract+1))
11144 for (current = new_list; current; current = TREE_CHAIN (current))
11145 if (!METHOD_ABSTRACT (TREE_VALUE (current)))
11147 TREE_CHAIN (current) = NULL_TREE;
11148 new_list = current;
11152 /* If we can't find one, lower expectations and try to gather multiple
11153 maximally specific methods */
11154 while (!new_list && max)
11158 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11159 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11166 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
11167 converted by method invocation conversion (5.3) to the type of the
11168 corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
11169 to change less often than M1. */
11171 static GTY(()) tree m2_arg_value;
11172 static GTY(()) tree m2_arg_cache;
11175 argument_types_convertible (m1, m2_or_arglist)
11176 tree m1, m2_or_arglist;
11178 register tree m1_arg, m2_arg;
11180 SKIP_THIS_AND_ARTIFICIAL_PARMS (m1_arg, m1)
11182 if (m2_arg_value == m2_or_arglist)
11183 m2_arg = m2_arg_cache;
11186 /* M2_OR_ARGLIST can be a function DECL or a raw list of
11188 if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
11190 m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
11191 if (!METHOD_STATIC (m2_or_arglist))
11192 m2_arg = TREE_CHAIN (m2_arg);
11195 m2_arg = m2_or_arglist;
11197 m2_arg_value = m2_or_arglist;
11198 m2_arg_cache = m2_arg;
11201 while (m1_arg != end_params_node && m2_arg != end_params_node)
11203 resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
11204 if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
11205 TREE_VALUE (m2_arg)))
11207 m1_arg = TREE_CHAIN (m1_arg);
11208 m2_arg = TREE_CHAIN (m2_arg);
11210 return m1_arg == end_params_node && m2_arg == end_params_node;
11213 /* Qualification routines */
11216 qualify_ambiguous_name (id)
11219 tree qual, qual_wfl, name = NULL_TREE, decl, ptr_type = NULL_TREE,
11220 saved_current_class;
11221 int again, super_found = 0, this_found = 0, new_array_found = 0;
11224 /* We first qualify the first element, then derive qualification of
11225 others based on the first one. If the first element is qualified
11226 by a resolution (field or type), this resolution is stored in the
11227 QUAL_RESOLUTION of the qual element being examined. We need to
11228 save the current_class since the use of SUPER might change the
11230 saved_current_class = current_class;
11231 qual = EXPR_WFL_QUALIFICATION (id);
11234 /* Simple qualified expression feature a qual_wfl that is a
11235 WFL. Expression derived from a primary feature more complicated
11236 things like a CALL_EXPR. Expression from primary need to be
11237 worked out to extract the part on which the qualification will
11239 qual_wfl = QUAL_WFL (qual);
11240 switch (TREE_CODE (qual_wfl))
11243 qual_wfl = TREE_OPERAND (qual_wfl, 0);
11244 if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION
11245 || (EXPR_WFL_QUALIFICATION (qual_wfl)
11246 && TREE_CODE (EXPR_WFL_QUALIFICATION (qual_wfl)) == TREE_LIST))
11248 qual = EXPR_WFL_QUALIFICATION (qual_wfl);
11249 qual_wfl = QUAL_WFL (qual);
11252 case NEW_ARRAY_EXPR:
11253 case NEW_ANONYMOUS_ARRAY_EXPR:
11254 qual = TREE_CHAIN (qual);
11255 again = new_array_found = 1;
11259 case NEW_CLASS_EXPR:
11260 qual_wfl = TREE_OPERAND (qual_wfl, 0);
11263 while (TREE_CODE (qual_wfl) == ARRAY_REF)
11264 qual_wfl = TREE_OPERAND (qual_wfl, 0);
11267 qual = TREE_CHAIN (qual);
11268 qual_wfl = QUAL_WFL (qual);
11270 case CLASS_LITERAL:
11271 qual = TREE_CHAIN (qual);
11272 qual_wfl = QUAL_WFL (qual);
11275 /* Fix for -Wall. Just break doing nothing */
11279 ptr_type = current_class;
11281 code = TREE_CODE (qual_wfl);
11283 /* Pos evaluation: non WFL leading expression nodes */
11284 if (code == CONVERT_EXPR
11285 && TREE_CODE (TREE_TYPE (qual_wfl)) == EXPR_WITH_FILE_LOCATION)
11286 name = EXPR_WFL_NODE (TREE_TYPE (qual_wfl));
11288 else if (code == INTEGER_CST)
11291 else if (code == CONVERT_EXPR &&
11292 TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION)
11293 name = TREE_OPERAND (qual_wfl, 0);
11295 else if (code == CONVERT_EXPR
11296 && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == CALL_EXPR
11297 && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (qual_wfl, 0), 0))
11298 == EXPR_WITH_FILE_LOCATION))
11299 name = TREE_OPERAND (TREE_OPERAND (qual_wfl, 0), 0);
11301 else if ((code == ARRAY_REF || code == CALL_EXPR || code == MODIFY_EXPR) &&
11302 TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION)
11303 name = EXPR_WFL_NODE (TREE_OPERAND (qual_wfl, 0));
11305 else if (code == TREE_LIST)
11306 name = EXPR_WFL_NODE (TREE_PURPOSE (qual_wfl));
11308 else if (code == STRING_CST || code == CONDITIONAL_EXPR
11309 || code == PLUS_EXPR)
11311 qual = TREE_CHAIN (qual);
11312 qual_wfl = QUAL_WFL (qual);
11317 name = EXPR_WFL_NODE (qual_wfl);
11320 qual = EXPR_WFL_QUALIFICATION (qual_wfl);
11325 /* If we have a THIS (from a primary), we set the context accordingly */
11326 if (name == this_identifier_node)
11328 /* This isn't really elegant. One more added irregularity
11329 before I start using COMPONENT_REF (hopefully very soon.) */
11330 if (TREE_CODE (TREE_PURPOSE (qual)) == ARRAY_REF
11331 && TREE_CODE (TREE_OPERAND (TREE_PURPOSE (qual), 0)) ==
11332 EXPR_WITH_FILE_LOCATION
11333 && EXPR_WFL_NODE (TREE_OPERAND (TREE_PURPOSE (qual), 0)) ==
11334 this_identifier_node)
11336 qual = TREE_OPERAND (TREE_PURPOSE (qual), 0);
11337 qual = EXPR_WFL_QUALIFICATION (qual);
11339 qual = TREE_CHAIN (qual);
11340 qual_wfl = QUAL_WFL (qual);
11341 if (TREE_CODE (qual_wfl) == CALL_EXPR)
11343 else if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION)
11344 name = EXPR_WFL_NODE (qual_wfl);
11345 else if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR)
11346 name = TREE_OPERAND (qual_wfl, 0);
11349 /* If we have a SUPER, we set the context accordingly */
11350 if (name == super_identifier_node)
11352 current_class = CLASSTYPE_SUPER (ptr_type);
11353 /* Check that there is such a thing as a super class. If not,
11354 return. The error will be caught later on, during the
11356 if (!current_class)
11358 current_class = saved_current_class;
11361 qual = TREE_CHAIN (qual);
11362 /* Do one more interation to set things up */
11363 super_found = again = 1;
11367 /* If name appears within the scope of a local variable declaration
11368 or parameter declaration, then it is an expression name. We don't
11369 carry this test out if we're in the context of the use of SUPER
11371 if (!this_found && !super_found
11372 && TREE_CODE (name) != STRING_CST && TREE_CODE (name) != INTEGER_CST
11373 && (decl = IDENTIFIER_LOCAL_VALUE (name)))
11375 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
11376 QUAL_RESOLUTION (qual) = decl;
11379 /* If within the class/interface NAME was found to be used there
11380 exists a (possibly inherited) field named NAME, then this is an
11381 expression name. If we saw a NEW_ARRAY_EXPR before and want to
11382 address length, it is OK. */
11383 else if ((decl = lookup_field_wrapper (ptr_type, name))
11384 || name == length_identifier_node)
11386 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
11387 QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
11390 /* We reclassify NAME as yielding to a type name resolution if:
11391 - NAME is a class/interface declared within the compilation
11392 unit containing NAME,
11393 - NAME is imported via a single-type-import declaration,
11394 - NAME is declared in an another compilation unit of the package
11395 of the compilation unit containing NAME,
11396 - NAME is declared by exactly on type-import-on-demand declaration
11397 of the compilation unit containing NAME.
11398 - NAME is actually a STRING_CST.
11399 This can't happen if the expression was qualified by `this.' */
11400 else if (! this_found &&
11401 (TREE_CODE (name) == STRING_CST ||
11402 TREE_CODE (name) == INTEGER_CST ||
11403 (decl = resolve_and_layout (name, NULL_TREE))))
11405 RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
11406 QUAL_RESOLUTION (qual) = decl;
11409 /* Method call, array references and cast are expression name */
11410 else if (TREE_CODE (QUAL_WFL (qual)) == CALL_EXPR
11411 || TREE_CODE (QUAL_WFL (qual)) == ARRAY_REF
11412 || TREE_CODE (QUAL_WFL (qual)) == CONVERT_EXPR
11413 || TREE_CODE (QUAL_WFL (qual)) == MODIFY_EXPR)
11414 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
11416 /* Check here that NAME isn't declared by more than one
11417 type-import-on-demand declaration of the compilation unit
11418 containing NAME. FIXME */
11420 /* Otherwise, NAME is reclassified as a package name */
11422 RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
11424 /* Propagate the qualification accross other components of the
11426 for (qual = TREE_CHAIN (qual); qual;
11427 qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
11429 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11430 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
11432 RESOLVE_EXPRESSION_NAME_P (QUAL_WFL (qual)) = 1;
11435 /* Store the global qualification for the ambiguous part of ID back
11437 if (RESOLVE_EXPRESSION_NAME_P (qual_wfl))
11438 RESOLVE_EXPRESSION_NAME_P (id) = 1;
11439 else if (RESOLVE_TYPE_NAME_P (qual_wfl))
11440 RESOLVE_TYPE_NAME_P (id) = 1;
11441 else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11442 RESOLVE_PACKAGE_NAME_P (id) = 1;
11444 /* Restore the current class */
11445 current_class = saved_current_class;
11449 breakdown_qualified (left, right, source)
11450 tree *left, *right, source;
11453 int l = IDENTIFIER_LENGTH (source);
11455 base = alloca (l + 1);
11456 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
11458 /* Breakdown NAME into REMAINDER . IDENTIFIER */
11460 while (*p != '.' && p != base)
11463 /* We didn't find a '.'. Return an error */
11469 *right = get_identifier (p+1);
11470 *left = get_identifier (base);
11475 /* Return TRUE if two classes are from the same package. */
11478 in_same_package (name1, name2)
11485 if (TREE_CODE (name1) == TYPE_DECL)
11486 name1 = DECL_NAME (name1);
11487 if (TREE_CODE (name2) == TYPE_DECL)
11488 name2 = DECL_NAME (name2);
11490 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
11491 /* One in empty package. */
11494 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
11495 /* Both in empty package. */
11498 breakdown_qualified (&pkg1, &tmp, name1);
11499 breakdown_qualified (&pkg2, &tmp, name2);
11501 return (pkg1 == pkg2);
11504 /* Patch tree nodes in a function body. When a BLOCK is found, push
11505 local variable decls if present.
11506 Same as java_complete_lhs, but does resolve static finals to values. */
11509 java_complete_tree (node)
11512 node = java_complete_lhs (node);
11513 if (JDECL_P (node) && CLASS_FINAL_VARIABLE_P (node)
11514 && DECL_INITIAL (node) != NULL_TREE
11515 && !flag_emit_xref)
11517 tree value = DECL_INITIAL (node);
11518 DECL_INITIAL (node) = NULL_TREE;
11519 value = fold_constant_for_init (value, node);
11520 DECL_INITIAL (node) = value;
11521 if (value != NULL_TREE)
11523 /* fold_constant_for_init sometimes widens the original type
11524 of the constant (i.e. byte to int). It's not desirable,
11525 especially if NODE is a function argument. */
11526 if ((TREE_CODE (value) == INTEGER_CST
11527 || TREE_CODE (value) == REAL_CST)
11528 && TREE_TYPE (node) != TREE_TYPE (value))
11529 return convert (TREE_TYPE (node), value);
11538 java_stabilize_reference (node)
11541 if (TREE_CODE (node) == COMPOUND_EXPR)
11543 tree op0 = TREE_OPERAND (node, 0);
11544 tree op1 = TREE_OPERAND (node, 1);
11545 TREE_OPERAND (node, 0) = save_expr (op0);
11546 TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
11549 return stabilize_reference (node);
11552 /* Patch tree nodes in a function body. When a BLOCK is found, push
11553 local variable decls if present.
11554 Same as java_complete_tree, but does not resolve static finals to values. */
11557 java_complete_lhs (node)
11560 tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
11563 /* CONVERT_EXPR always has its type set, even though it needs to be
11565 if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
11568 /* The switch block implements cases processing container nodes
11569 first. Contained nodes are always written back. Leaves come
11570 next and return a value. */
11571 switch (TREE_CODE (node))
11575 /* 1- Block section.
11576 Set the local values on decl names so we can identify them
11577 faster when they're referenced. At that stage, identifiers
11578 are legal so we don't check for declaration errors. */
11579 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11581 DECL_CONTEXT (cn) = current_function_decl;
11582 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
11584 if (BLOCK_EXPR_BODY (node) == NULL_TREE)
11585 CAN_COMPLETE_NORMALLY (node) = 1;
11588 tree stmt = BLOCK_EXPR_BODY (node);
11590 int error_seen = 0;
11591 if (TREE_CODE (stmt) == COMPOUND_EXPR)
11593 /* Re-order from (((A; B); C); ...; Z) to
11594 (A; (B; (C ; (...; Z)))).
11595 This makes it easier to scan the statements left-to-right
11596 without using recursion (which might overflow the stack
11597 if the block has many statements. */
11600 tree left = TREE_OPERAND (stmt, 0);
11601 if (TREE_CODE (left) != COMPOUND_EXPR)
11603 TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
11604 TREE_OPERAND (left, 1) = stmt;
11607 BLOCK_EXPR_BODY (node) = stmt;
11610 /* Now do the actual complete, without deep recursion for
11612 ptr = &BLOCK_EXPR_BODY (node);
11613 while (TREE_CODE (*ptr) == COMPOUND_EXPR
11614 && TREE_OPERAND (*ptr, 1) != empty_stmt_node)
11616 tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
11617 tree *next = &TREE_OPERAND (*ptr, 1);
11618 TREE_OPERAND (*ptr, 0) = cur;
11619 if (cur == empty_stmt_node)
11621 /* Optimization; makes it easier to detect empty bodies.
11622 Most useful for <clinit> with all-constant initializer. */
11626 if (TREE_CODE (cur) == ERROR_MARK)
11628 else if (! CAN_COMPLETE_NORMALLY (cur))
11633 if (TREE_CODE (wfl_op2) == BLOCK)
11634 wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
11635 else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
11636 wfl_op2 = TREE_OPERAND (wfl_op2, 0);
11640 if (TREE_CODE (wfl_op2) != CASE_EXPR
11641 && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
11642 unreachable_stmt_error (*ptr);
11646 *ptr = java_complete_tree (*ptr);
11648 if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
11649 return error_mark_node;
11650 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
11652 /* Turn local bindings to null */
11653 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11654 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
11656 TREE_TYPE (node) = void_type_node;
11659 /* 2- They are expressions but ultimately deal with statements */
11662 wfl_op1 = TREE_OPERAND (node, 0);
11663 COMPLETE_CHECK_OP_0 (node);
11664 /* 14.19 A throw statement cannot complete normally. */
11665 CAN_COMPLETE_NORMALLY (node) = 0;
11666 return patch_throw_statement (node, wfl_op1);
11668 case SYNCHRONIZED_EXPR:
11669 wfl_op1 = TREE_OPERAND (node, 0);
11670 return patch_synchronized_statement (node, wfl_op1);
11673 return patch_try_statement (node);
11675 case TRY_FINALLY_EXPR:
11676 COMPLETE_CHECK_OP_0 (node);
11677 COMPLETE_CHECK_OP_1 (node);
11678 if (TREE_OPERAND (node, 0) == empty_stmt_node)
11679 return TREE_OPERAND (node, 1);
11680 if (TREE_OPERAND (node, 1) == empty_stmt_node)
11681 return TREE_OPERAND (node, 0);
11682 CAN_COMPLETE_NORMALLY (node)
11683 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11684 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11685 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
11688 case LABELED_BLOCK_EXPR:
11689 PUSH_LABELED_BLOCK (node);
11690 if (LABELED_BLOCK_BODY (node))
11691 COMPLETE_CHECK_OP_1 (node);
11692 TREE_TYPE (node) = void_type_node;
11693 POP_LABELED_BLOCK ();
11695 if (LABELED_BLOCK_BODY (node) == empty_stmt_node)
11697 LABELED_BLOCK_BODY (node) = NULL_TREE;
11698 CAN_COMPLETE_NORMALLY (node) = 1;
11700 else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
11701 CAN_COMPLETE_NORMALLY (node) = 1;
11704 case EXIT_BLOCK_EXPR:
11705 /* We don't complete operand 1, because it's the return value of
11706 the EXIT_BLOCK_EXPR which doesn't exist it Java */
11707 return patch_bc_statement (node);
11710 cn = java_complete_tree (TREE_OPERAND (node, 0));
11711 if (cn == error_mark_node)
11714 /* First, the case expression must be constant. Values of final
11715 fields are accepted. */
11717 if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
11718 && JDECL_P (TREE_OPERAND (cn, 1))
11719 && FIELD_FINAL (TREE_OPERAND (cn, 1))
11720 && DECL_INITIAL (TREE_OPERAND (cn, 1)))
11722 cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
11723 TREE_OPERAND (cn, 1));
11725 /* Accept final locals too. */
11726 else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn))
11727 cn = fold_constant_for_init (DECL_INITIAL (cn), cn);
11729 if (!TREE_CONSTANT (cn) && !flag_emit_xref)
11731 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11732 parse_error_context (node, "Constant expression required");
11733 return error_mark_node;
11736 nn = ctxp->current_loop;
11738 /* It must be assignable to the type of the switch expression. */
11739 if (!try_builtin_assignconv (NULL_TREE,
11740 TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
11742 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11743 parse_error_context
11745 "Incompatible type for case. Can't convert `%s' to `int'",
11746 lang_printable_name (TREE_TYPE (cn), 0));
11747 return error_mark_node;
11750 cn = fold (convert (int_type_node, cn));
11751 TREE_CONSTANT_OVERFLOW (cn) = 0;
11752 CAN_COMPLETE_NORMALLY (cn) = 1;
11754 /* Save the label on a list so that we can later check for
11756 case_label_list = tree_cons (node, cn, case_label_list);
11758 /* Multiple instance of a case label bearing the same value is
11759 checked later. The case expression is all right so far. */
11760 if (TREE_CODE (cn) == VAR_DECL)
11761 cn = DECL_INITIAL (cn);
11762 TREE_OPERAND (node, 0) = cn;
11763 TREE_TYPE (node) = void_type_node;
11764 CAN_COMPLETE_NORMALLY (node) = 1;
11765 TREE_SIDE_EFFECTS (node) = 1;
11769 nn = ctxp->current_loop;
11770 /* Only one default label is allowed per switch statement */
11771 if (SWITCH_HAS_DEFAULT (nn))
11773 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11774 parse_error_context (wfl_operator,
11775 "Duplicate case label: `default'");
11776 return error_mark_node;
11779 SWITCH_HAS_DEFAULT (nn) = 1;
11780 TREE_TYPE (node) = void_type_node;
11781 TREE_SIDE_EFFECTS (node) = 1;
11782 CAN_COMPLETE_NORMALLY (node) = 1;
11788 /* Check whether the loop was enclosed in a labeled
11789 statement. If not, create one, insert the loop in it and
11791 nn = patch_loop_statement (node);
11793 /* Anyways, walk the body of the loop */
11794 if (TREE_CODE (node) == LOOP_EXPR)
11795 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11796 /* Switch statement: walk the switch expression and the cases */
11798 node = patch_switch_statement (node);
11800 if (node == error_mark_node || TREE_OPERAND (node, 0) == error_mark_node)
11801 nn = error_mark_node;
11804 TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
11805 /* If we returned something different, that's because we
11806 inserted a label. Pop the label too. */
11809 if (CAN_COMPLETE_NORMALLY (node))
11810 CAN_COMPLETE_NORMALLY (nn) = 1;
11811 POP_LABELED_BLOCK ();
11818 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11819 return patch_exit_expr (node);
11823 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11824 if (TREE_OPERAND (node, 0) == error_mark_node)
11825 return error_mark_node;
11826 /* then-else branches */
11827 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11828 if (TREE_OPERAND (node, 1) == error_mark_node)
11829 return error_mark_node;
11830 TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
11831 if (TREE_OPERAND (node, 2) == error_mark_node)
11832 return error_mark_node;
11833 return patch_if_else_statement (node);
11836 case CONDITIONAL_EXPR:
11838 wfl_op1 = TREE_OPERAND (node, 0);
11839 COMPLETE_CHECK_OP_0 (node);
11840 wfl_op2 = TREE_OPERAND (node, 1);
11841 COMPLETE_CHECK_OP_1 (node);
11842 wfl_op3 = TREE_OPERAND (node, 2);
11843 COMPLETE_CHECK_OP_2 (node);
11844 return patch_conditional_expr (node, wfl_op1, wfl_op2);
11846 /* 3- Expression section */
11847 case COMPOUND_EXPR:
11848 wfl_op2 = TREE_OPERAND (node, 1);
11849 TREE_OPERAND (node, 0) = nn =
11850 java_complete_tree (TREE_OPERAND (node, 0));
11851 if (wfl_op2 == empty_stmt_node)
11852 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
11855 if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
11857 /* An unreachable condition in a do-while statement
11858 is *not* (technically) an unreachable statement. */
11860 if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
11861 nn = EXPR_WFL_NODE (nn);
11862 if (TREE_CODE (nn) != EXIT_EXPR)
11864 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
11865 if (SUPPRESS_UNREACHABLE_ERROR (nn))
11867 /* Perhaps this warning should have an
11868 associated flag. The code being compiled is
11869 pedantically correct, but useless. */
11870 parse_warning_context (wfl_operator,
11871 "Unreachable statement");
11874 parse_error_context (wfl_operator,
11875 "Unreachable statement");
11878 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11879 if (TREE_OPERAND (node, 1) == error_mark_node)
11880 return error_mark_node;
11881 /* Even though we might allow the case where the first
11882 operand doesn't return normally, we still should compute
11883 CAN_COMPLETE_NORMALLY correctly. */
11884 CAN_COMPLETE_NORMALLY (node)
11885 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11886 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11888 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
11892 /* CAN_COMPLETE_NORMALLY (node) = 0; */
11893 return patch_return (node);
11895 case EXPR_WITH_FILE_LOCATION:
11896 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
11897 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
11900 node = resolve_expression_name (node, NULL);
11901 if (node == error_mark_node)
11903 /* Keep line number information somewhere were it doesn't
11904 disrupt the completion process. */
11905 if (flag_emit_xref && TREE_CODE (node) != CALL_EXPR)
11907 EXPR_WFL_NODE (wfl) = TREE_OPERAND (node, 1);
11908 TREE_OPERAND (node, 1) = wfl;
11910 CAN_COMPLETE_NORMALLY (node) = 1;
11915 int save_lineno = lineno;
11916 lineno = EXPR_WFL_LINENO (node);
11917 body = java_complete_tree (EXPR_WFL_NODE (node));
11918 lineno = save_lineno;
11919 EXPR_WFL_NODE (node) = body;
11920 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
11921 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
11922 if (body == empty_stmt_node || TREE_CONSTANT (body))
11924 /* Makes it easier to constant fold, detect empty bodies. */
11927 if (body == error_mark_node)
11929 /* Its important for the evaluation of assignment that
11930 this mark on the TREE_TYPE is propagated. */
11931 TREE_TYPE (node) = error_mark_node;
11932 return error_mark_node;
11935 TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
11940 case NEW_ARRAY_EXPR:
11941 /* Patch all the dimensions */
11943 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
11945 int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
11946 tree dim = convert (int_type_node,
11947 java_complete_tree (TREE_VALUE (cn)));
11948 if (dim == error_mark_node)
11955 TREE_VALUE (cn) = dim;
11956 /* Setup the location of the current dimension, for
11957 later error report. */
11958 TREE_PURPOSE (cn) =
11959 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
11960 EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
11963 /* They complete the array creation expression, if no errors
11965 CAN_COMPLETE_NORMALLY (node) = 1;
11966 return (flag ? error_mark_node
11967 : force_evaluation_order (patch_newarray (node)));
11969 case NEW_ANONYMOUS_ARRAY_EXPR:
11970 /* Create the array type if necessary. */
11971 if (ANONYMOUS_ARRAY_DIMS_SIG (node))
11973 tree type = ANONYMOUS_ARRAY_BASE_TYPE (node);
11974 if (!(type = resolve_type_during_patch (type)))
11975 return error_mark_node;
11976 type = build_array_from_name (type, NULL_TREE,
11977 ANONYMOUS_ARRAY_DIMS_SIG (node), NULL);
11978 ANONYMOUS_ARRAY_BASE_TYPE (node) = build_pointer_type (type);
11980 node = patch_new_array_init (ANONYMOUS_ARRAY_BASE_TYPE (node),
11981 ANONYMOUS_ARRAY_INITIALIZER (node));
11982 if (node == error_mark_node)
11983 return error_mark_node;
11984 CAN_COMPLETE_NORMALLY (node) = 1;
11987 case NEW_CLASS_EXPR:
11989 /* Complete function's argument(s) first */
11990 if (complete_function_arguments (node))
11991 return error_mark_node;
11994 tree decl, wfl = TREE_OPERAND (node, 0);
11995 int in_this = CALL_THIS_CONSTRUCTOR_P (node);
11996 int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
11997 super_identifier_node);
11999 node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
12000 from_super, 0, &decl);
12001 if (node == error_mark_node)
12002 return error_mark_node;
12004 check_thrown_exceptions (EXPR_WFL_LINECOL (node), decl);
12005 /* If we call this(...), register signature and positions */
12007 DECL_CONSTRUCTOR_CALLS (current_function_decl) =
12008 tree_cons (wfl, decl,
12009 DECL_CONSTRUCTOR_CALLS (current_function_decl));
12010 CAN_COMPLETE_NORMALLY (node) = 1;
12011 return force_evaluation_order (node);
12015 /* Save potential wfls */
12016 wfl_op1 = TREE_OPERAND (node, 0);
12017 TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
12019 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
12020 && TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
12021 && DECL_INITIAL (nn) != NULL_TREE)
12025 value = fold_constant_for_init (nn, nn);
12027 /* When we have a primitype type, or a string and we're not
12028 emitting a class file, we actually don't want to generate
12029 anything for the assignment. */
12030 if (value != NULL_TREE &&
12031 (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) ||
12032 (TREE_TYPE (value) == string_ptr_type_node &&
12033 ! flag_emit_class_files)))
12035 /* Prepare node for patch_assignment */
12036 TREE_OPERAND (node, 1) = value;
12037 /* Call patch assignment to verify the assignment */
12038 if (patch_assignment (node, wfl_op1) == error_mark_node)
12039 return error_mark_node;
12040 /* Set DECL_INITIAL properly (a conversion might have
12041 been decided by patch_assignment) and return the
12042 empty statement. */
12045 tree patched = patch_string (TREE_OPERAND (node, 1));
12047 DECL_INITIAL (nn) = patched;
12049 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
12050 DECL_FIELD_FINAL_IUD (nn) = 1;
12051 return empty_stmt_node;
12054 if (! flag_emit_class_files)
12055 DECL_INITIAL (nn) = NULL_TREE;
12057 wfl_op2 = TREE_OPERAND (node, 1);
12059 if (TREE_OPERAND (node, 0) == error_mark_node)
12060 return error_mark_node;
12062 flag = COMPOUND_ASSIGN_P (wfl_op2);
12065 /* This might break when accessing outer field from inner
12066 class. TESTME, FIXME */
12067 tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
12069 /* Hand stabilize the lhs on both places */
12070 TREE_OPERAND (node, 0) = lvalue;
12071 TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
12072 (flag_emit_class_files ? lvalue : save_expr (lvalue));
12074 /* 15.25.2.a: Left hand is not an array access. FIXME */
12075 /* Now complete the RHS. We write it back later on. */
12076 nn = java_complete_tree (TREE_OPERAND (node, 1));
12078 if ((cn = patch_string (nn)))
12081 /* The last part of the rewrite for E1 op= E2 is to have
12082 E1 = (T)(E1 op E2), with T being the type of E1. */
12083 nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
12084 TREE_TYPE (lvalue), nn));
12086 /* If the assignment is compound and has reference type,
12087 then ensure the LHS has type String and nothing else. */
12088 if (JREFERENCE_TYPE_P (TREE_TYPE (lvalue))
12089 && ! JSTRING_TYPE_P (TREE_TYPE (lvalue)))
12090 parse_error_context (wfl_op2,
12091 "Incompatible type for `+='. Can't convert `%s' to `java.lang.String'",
12092 lang_printable_name (TREE_TYPE (lvalue), 0));
12094 /* 15.25.2.b: Left hand is an array access. FIXME */
12097 /* If we're about to patch a NEW_ARRAY_INIT, we call a special
12098 function to complete this RHS. Note that a NEW_ARRAY_INIT
12099 might have been already fully expanded if created as a result
12100 of processing an anonymous array initializer. We avoid doing
12101 the operation twice by testing whether the node already bears
12103 else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT && !TREE_TYPE (wfl_op2))
12104 nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
12105 TREE_OPERAND (node, 1));
12106 /* Otherwise we simply complete the RHS */
12108 nn = java_complete_tree (TREE_OPERAND (node, 1));
12110 if (nn == error_mark_node)
12111 return error_mark_node;
12113 /* Write back the RHS as we evaluated it. */
12114 TREE_OPERAND (node, 1) = nn;
12116 /* In case we're handling = with a String as a RHS, we need to
12117 produce a String out of the RHS (it might still be a
12118 STRING_CST or a StringBuffer at this stage */
12119 if ((nn = patch_string (TREE_OPERAND (node, 1))))
12120 TREE_OPERAND (node, 1) = nn;
12122 if ((nn = outer_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
12123 TREE_OPERAND (node, 1))))
12125 /* We return error_mark_node if outer_field_access_fix
12126 detects we write into a final. */
12127 if (nn == error_mark_node)
12128 return error_mark_node;
12133 node = patch_assignment (node, wfl_op1);
12134 if (node == error_mark_node)
12135 return error_mark_node;
12136 /* Reorganize the tree if necessary. */
12137 if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
12138 || JSTRING_P (TREE_TYPE (node))))
12139 node = java_refold (node);
12142 /* Seek to set DECL_INITIAL to a proper value, since it might have
12143 undergone a conversion in patch_assignment. We do that only when
12144 it's necessary to have DECL_INITIAL properly set. */
12145 nn = TREE_OPERAND (node, 0);
12146 if (TREE_CODE (nn) == VAR_DECL
12147 && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn))
12148 && FIELD_STATIC (nn) && FIELD_FINAL (nn)
12149 && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn))
12150 || TREE_TYPE (nn) == string_ptr_type_node))
12151 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
12153 CAN_COMPLETE_NORMALLY (node) = 1;
12165 case TRUNC_MOD_EXPR:
12166 case TRUNC_DIV_EXPR:
12168 case TRUTH_ANDIF_EXPR:
12169 case TRUTH_ORIF_EXPR:
12176 /* Operands 0 and 1 are WFL in certain cases only. patch_binop
12177 knows how to handle those cases. */
12178 wfl_op1 = TREE_OPERAND (node, 0);
12179 wfl_op2 = TREE_OPERAND (node, 1);
12181 CAN_COMPLETE_NORMALLY (node) = 1;
12182 /* Don't complete string nodes if dealing with the PLUS operand. */
12183 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
12185 nn = java_complete_tree (wfl_op1);
12186 if (nn == error_mark_node)
12187 return error_mark_node;
12189 TREE_OPERAND (node, 0) = nn;
12191 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
12193 nn = java_complete_tree (wfl_op2);
12194 if (nn == error_mark_node)
12195 return error_mark_node;
12197 TREE_OPERAND (node, 1) = nn;
12199 return force_evaluation_order (patch_binop (node, wfl_op1, wfl_op2));
12201 case INSTANCEOF_EXPR:
12202 wfl_op1 = TREE_OPERAND (node, 0);
12203 COMPLETE_CHECK_OP_0 (node);
12204 if (flag_emit_xref)
12206 TREE_TYPE (node) = boolean_type_node;
12209 return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
12211 case UNARY_PLUS_EXPR:
12213 case TRUTH_NOT_EXPR:
12215 case PREDECREMENT_EXPR:
12216 case PREINCREMENT_EXPR:
12217 case POSTDECREMENT_EXPR:
12218 case POSTINCREMENT_EXPR:
12220 /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
12221 how to handle those cases. */
12222 wfl_op1 = TREE_OPERAND (node, 0);
12223 CAN_COMPLETE_NORMALLY (node) = 1;
12224 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12225 if (TREE_OPERAND (node, 0) == error_mark_node)
12226 return error_mark_node;
12227 node = patch_unaryop (node, wfl_op1);
12228 CAN_COMPLETE_NORMALLY (node) = 1;
12232 /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
12233 how to handle those cases. */
12234 wfl_op1 = TREE_OPERAND (node, 0);
12235 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12236 if (TREE_OPERAND (node, 0) == error_mark_node)
12237 return error_mark_node;
12238 if (!flag_emit_class_files && !flag_emit_xref)
12239 TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
12240 /* The same applies to wfl_op2 */
12241 wfl_op2 = TREE_OPERAND (node, 1);
12242 TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
12243 if (TREE_OPERAND (node, 1) == error_mark_node)
12244 return error_mark_node;
12245 if (!flag_emit_class_files && !flag_emit_xref)
12246 TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
12247 return patch_array_ref (node);
12252 case COMPONENT_REF:
12253 /* The first step in the re-write of qualified name handling. FIXME.
12254 So far, this is only to support PRIMTYPE.class -> PRIMCLASS.TYPE. */
12255 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
12256 if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
12258 tree name = TREE_OPERAND (node, 1);
12259 tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
12260 if (field == NULL_TREE)
12262 error ("missing static field `%s'", IDENTIFIER_POINTER (name));
12263 return error_mark_node;
12265 if (! FIELD_STATIC (field))
12267 error ("not a static field `%s'", IDENTIFIER_POINTER (name));
12268 return error_mark_node;
12277 /* Can't use THIS in a static environment */
12280 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12281 parse_error_context (wfl_operator,
12282 "Keyword `this' used outside allowed context");
12283 TREE_TYPE (node) = error_mark_node;
12284 return error_mark_node;
12286 if (ctxp->explicit_constructor_p)
12288 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12289 parse_error_context
12290 (wfl_operator, "Can't reference `this' or `super' before the superclass constructor has been called");
12291 TREE_TYPE (node) = error_mark_node;
12292 return error_mark_node;
12294 return current_this;
12296 case CLASS_LITERAL:
12297 CAN_COMPLETE_NORMALLY (node) = 1;
12298 node = patch_incomplete_class_ref (node);
12299 if (node == error_mark_node)
12300 return error_mark_node;
12304 CAN_COMPLETE_NORMALLY (node) = 1;
12305 /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
12306 and it's time to turn it into the appropriate String object */
12307 if ((nn = patch_string (node)))
12310 internal_error ("No case for %s", tree_code_name [TREE_CODE (node)]);
12315 /* Complete function call's argument. Return a non zero value is an
12316 error was found. */
12319 complete_function_arguments (node)
12325 ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12326 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
12328 tree wfl = TREE_VALUE (cn), parm, temp;
12329 parm = java_complete_tree (wfl);
12331 if (parm == error_mark_node)
12336 /* If have a string literal that we haven't transformed yet or a
12337 crafted string buffer, as a result of use of the the String
12338 `+' operator. Build `parm.toString()' and expand it. */
12339 if ((temp = patch_string (parm)))
12342 TREE_VALUE (cn) = parm;
12344 ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12348 /* Sometimes (for loops and variable initialized during their
12349 declaration), we want to wrap a statement around a WFL and turn it
12353 build_debugable_stmt (location, stmt)
12357 if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
12359 stmt = build_expr_wfl (stmt, input_filename, 0, 0);
12360 EXPR_WFL_LINECOL (stmt) = location;
12362 JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
12367 build_expr_block (body, decls)
12370 tree node = make_node (BLOCK);
12371 BLOCK_EXPR_DECLS (node) = decls;
12372 BLOCK_EXPR_BODY (node) = body;
12374 TREE_TYPE (node) = TREE_TYPE (body);
12375 TREE_SIDE_EFFECTS (node) = 1;
12379 /* Create a new function block and link it appropriately to current
12380 function block chain */
12385 tree b = build_expr_block (NULL_TREE, NULL_TREE);
12387 /* Link block B supercontext to the previous block. The current
12388 function DECL is used as supercontext when enter_a_block is called
12389 for the first time for a given function. The current function body
12390 (DECL_FUNCTION_BODY) is set to be block B. */
12392 tree fndecl = current_function_decl;
12395 BLOCK_SUPERCONTEXT (b) = current_static_block;
12396 current_static_block = b;
12399 else if (!DECL_FUNCTION_BODY (fndecl))
12401 BLOCK_SUPERCONTEXT (b) = fndecl;
12402 DECL_FUNCTION_BODY (fndecl) = b;
12406 BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
12407 DECL_FUNCTION_BODY (fndecl) = b;
12412 /* Exit a block by changing the current function body
12413 (DECL_FUNCTION_BODY) to the current block super context, only if
12414 the block being exited isn't the method's top level one. */
12420 if (current_function_decl)
12422 b = DECL_FUNCTION_BODY (current_function_decl);
12423 if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
12424 DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
12428 b = current_static_block;
12430 if (BLOCK_SUPERCONTEXT (b))
12431 current_static_block = BLOCK_SUPERCONTEXT (b);
12436 /* Lookup for NAME in the nested function's blocks, all the way up to
12437 the current toplevel one. It complies with Java's local variable
12441 lookup_name_in_blocks (name)
12444 tree b = GET_CURRENT_BLOCK (current_function_decl);
12446 while (b != current_function_decl)
12450 /* Paranoid sanity check. To be removed */
12451 if (TREE_CODE (b) != BLOCK)
12454 for (current = BLOCK_EXPR_DECLS (b); current;
12455 current = TREE_CHAIN (current))
12456 if (DECL_NAME (current) == name)
12458 b = BLOCK_SUPERCONTEXT (b);
12464 maybe_absorb_scoping_blocks ()
12466 while (BLOCK_IS_IMPLICIT (GET_CURRENT_BLOCK (current_function_decl)))
12468 tree b = exit_block ();
12469 java_method_add_stmt (current_function_decl, b);
12470 SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", lineno));
12475 /* This section of the source is reserved to build_* functions that
12476 are building incomplete tree nodes and the patch_* functions that
12477 are completing them. */
12479 /* Wrap a non WFL node around a WFL. */
12482 build_wfl_wrap (node, location)
12486 tree wfl, node_to_insert = node;
12488 /* We want to process THIS . xxx symbolicaly, to keep it consistent
12489 with the way we're processing SUPER. A THIS from a primary as a
12490 different form than a SUPER. Turn THIS into something symbolic */
12491 if (TREE_CODE (node) == THIS_EXPR)
12492 node_to_insert = wfl = build_wfl_node (this_identifier_node);
12494 wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
12496 EXPR_WFL_LINECOL (wfl) = location;
12497 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
12501 /* Build a super() constructor invocation. Returns empty_stmt_node if
12502 we're currently dealing with the class java.lang.Object. */
12505 build_super_invocation (mdecl)
12508 if (DECL_CONTEXT (mdecl) == object_type_node)
12509 return empty_stmt_node;
12512 tree super_wfl = build_wfl_node (super_identifier_node);
12513 tree a = NULL_TREE, t;
12514 /* If we're dealing with an anonymous class, pass the arguments
12515 of the crafted constructor along. */
12516 if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
12518 SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
12519 for (; t != end_params_node; t = TREE_CHAIN (t))
12520 a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
12522 return build_method_invocation (super_wfl, a);
12526 /* Build a SUPER/THIS qualified method invocation. */
12529 build_this_super_qualified_invocation (use_this, name, args, lloc, rloc)
12536 build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
12537 EXPR_WFL_LINECOL (wfl) = lloc;
12538 invok = build_method_invocation (name, args);
12539 return make_qualified_primary (wfl, invok, rloc);
12542 /* Build an incomplete CALL_EXPR node. */
12545 build_method_invocation (name, args)
12549 tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
12550 TREE_SIDE_EFFECTS (call) = 1;
12551 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12555 /* Build an incomplete new xxx(...) node. */
12558 build_new_invocation (name, args)
12561 tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
12562 TREE_SIDE_EFFECTS (call) = 1;
12563 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12567 /* Build an incomplete assignment expression. */
12570 build_assignment (op, op_location, lhs, rhs)
12571 int op, op_location;
12575 /* Build the corresponding binop if we deal with a Compound
12576 Assignment operator. Mark the binop sub-tree as part of a
12577 Compound Assignment expression */
12578 if (op != ASSIGN_TK)
12580 rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
12581 COMPOUND_ASSIGN_P (rhs) = 1;
12583 assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
12584 TREE_SIDE_EFFECTS (assignment) = 1;
12585 EXPR_WFL_LINECOL (assignment) = op_location;
12589 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12590 the buffer. This is used only for string conversion. */
12592 string_convert_int_cst (node)
12595 static char buffer[80];
12597 unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
12598 unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
12599 char *p = buffer + sizeof (buffer) - 1;
12602 unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
12603 << (HOST_BITS_PER_WIDE_INT - 1));
12607 /* If negative, note the fact and negate the value. */
12617 /* Divide by 10 until there are no bits left. */
12620 unsigned HOST_WIDE_INT acc = 0;
12621 unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
12624 /* Use long division to compute the result and the remainder. */
12625 for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
12627 /* Shift a bit into accumulator. */
12632 /* Shift the value. */
12638 /* Shift the correct bit into the result. */
12640 if ((outlo & hibit))
12650 /* FIXME: ASCII assumption. */
12663 /* Print an INTEGER_CST node in a static buffer, and return the
12664 buffer. This is used only for error handling. */
12666 print_int_node (node)
12669 static char buffer [80];
12670 if (TREE_CONSTANT_OVERFLOW (node))
12671 sprintf (buffer, "<overflow>");
12673 if (TREE_INT_CST_HIGH (node) == 0)
12674 sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
12675 TREE_INT_CST_LOW (node));
12676 else if (TREE_INT_CST_HIGH (node) == -1
12677 && TREE_INT_CST_LOW (node) != 0)
12680 sprintf (&buffer [1], HOST_WIDE_INT_PRINT_UNSIGNED,
12681 -TREE_INT_CST_LOW (node));
12684 sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
12685 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
12691 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12694 /* 15.25 Assignment operators. */
12697 patch_assignment (node, wfl_op1)
12701 tree rhs = TREE_OPERAND (node, 1);
12702 tree lvalue = TREE_OPERAND (node, 0), llvalue;
12703 tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
12704 int error_found = 0;
12705 int lvalue_from_array = 0;
12708 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12710 /* Lhs can be a named variable */
12711 if (JDECL_P (lvalue))
12713 lhs_type = TREE_TYPE (lvalue);
12715 /* Or Lhs can be an array access. */
12716 else if (TREE_CODE (lvalue) == ARRAY_REF)
12718 lhs_type = TREE_TYPE (lvalue);
12719 lvalue_from_array = 1;
12721 /* Or a field access */
12722 else if (TREE_CODE (lvalue) == COMPONENT_REF)
12723 lhs_type = TREE_TYPE (lvalue);
12724 /* Or a function return slot */
12725 else if (TREE_CODE (lvalue) == RESULT_DECL)
12727 /* If the return type is an integral type, then we create the
12728 RESULT_DECL with a promoted type, but we need to do these
12729 checks against the unpromoted type to ensure type safety. So
12730 here we look at the real type, not the type of the decl we
12732 lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
12735 /* Otherwise, we might want to try to write into an optimized static
12736 final, this is an of a different nature, reported further on. */
12737 else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
12738 && resolve_expression_name (wfl_op1, &llvalue))
12740 lhs_type = TREE_TYPE (lvalue);
12744 parse_error_context (wfl_op1, "Invalid left hand side of assignment");
12748 rhs_type = TREE_TYPE (rhs);
12750 /* 5.1 Try the assignment conversion for builtin type. */
12751 new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
12753 /* 5.2 If it failed, try a reference conversion */
12754 if (!new_rhs && (new_rhs = try_reference_assignconv (lhs_type, rhs)))
12755 lhs_type = promote_type (rhs_type);
12757 /* 15.25.2 If we have a compound assignment, convert RHS into the
12759 else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12760 new_rhs = convert (lhs_type, rhs);
12762 /* Explicit cast required. This is an error */
12765 char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
12766 char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
12768 char operation [32]; /* Max size known */
12770 /* If the assignment is part of a declaration, we use the WFL of
12771 the declared variable to point out the error and call it a
12772 declaration problem. If the assignment is a genuine =
12773 operator, we call is a operator `=' problem, otherwise we
12774 call it an assignment problem. In both of these last cases,
12775 we use the WFL of the operator to indicate the error. */
12777 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
12780 strcpy (operation, "declaration");
12784 wfl = wfl_operator;
12785 if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12786 strcpy (operation, "assignment");
12787 else if (is_return)
12788 strcpy (operation, "`return'");
12790 strcpy (operation, "`='");
12793 if (!valid_cast_to_p (rhs_type, lhs_type))
12794 parse_error_context
12795 (wfl, "Incompatible type for %s. Can't convert `%s' to `%s'",
12796 operation, t1, t2);
12798 parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert `%s' to `%s'",
12799 operation, t1, t2);
12800 free (t1); free (t2);
12805 return error_mark_node;
12807 /* If we're processing a `return' statement, promote the actual type
12808 to the promoted type. */
12810 new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
12812 /* 10.10: Array Store Exception runtime check */
12813 if (!flag_emit_class_files
12815 && lvalue_from_array
12816 && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
12818 tree array, store_check, base, index_expr;
12820 /* Save RHS so that it doesn't get re-evaluated by the store check. */
12821 new_rhs = save_expr (new_rhs);
12823 /* Get the INDIRECT_REF. */
12824 array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
12825 /* Get the array pointer expr. */
12826 array = TREE_OPERAND (array, 0);
12827 store_check = build_java_arraystore_check (array, new_rhs);
12829 index_expr = TREE_OPERAND (lvalue, 1);
12831 if (TREE_CODE (index_expr) == COMPOUND_EXPR)
12833 /* A COMPOUND_EXPR here is a bounds check. The bounds check must
12834 happen before the store check, so prepare to insert the store
12835 check within the second operand of the existing COMPOUND_EXPR. */
12841 index_expr = TREE_OPERAND (base, 1);
12842 TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr),
12843 store_check, index_expr);
12846 /* Final locals can be used as case values in switch
12847 statement. Prepare them for this eventuality. */
12848 if (TREE_CODE (lvalue) == VAR_DECL
12849 && DECL_FINAL (lvalue)
12850 && TREE_CONSTANT (new_rhs)
12851 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
12852 && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
12855 TREE_CONSTANT (lvalue) = 1;
12856 DECL_INITIAL (lvalue) = new_rhs;
12859 TREE_OPERAND (node, 0) = lvalue;
12860 TREE_OPERAND (node, 1) = new_rhs;
12861 TREE_TYPE (node) = lhs_type;
12865 /* Check that type SOURCE can be cast into type DEST. If the cast
12866 can't occur at all, return NULL; otherwise, return a possibly
12870 try_reference_assignconv (lhs_type, rhs)
12871 tree lhs_type, rhs;
12873 tree new_rhs = NULL_TREE;
12874 tree rhs_type = TREE_TYPE (rhs);
12876 if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
12878 /* `null' may be assigned to any reference type */
12879 if (rhs == null_pointer_node)
12880 new_rhs = null_pointer_node;
12881 /* Try the reference assignment conversion */
12882 else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
12884 /* This is a magic assignment that we process differently */
12885 else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
12891 /* Check that RHS can be converted into LHS_TYPE by the assignment
12892 conversion (5.2), for the cases of RHS being a builtin type. Return
12893 NULL_TREE if the conversion fails or if because RHS isn't of a
12894 builtin type. Return a converted RHS if the conversion is possible. */
12897 try_builtin_assignconv (wfl_op1, lhs_type, rhs)
12898 tree wfl_op1, lhs_type, rhs;
12900 tree new_rhs = NULL_TREE;
12901 tree rhs_type = TREE_TYPE (rhs);
12903 /* Handle boolean specially. */
12904 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12905 || TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12907 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12908 && TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12912 /* 5.1.1 Try Identity Conversion,
12913 5.1.2 Try Widening Primitive Conversion */
12914 else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
12915 new_rhs = convert (lhs_type, rhs);
12917 /* Try a narrowing primitive conversion (5.1.3):
12918 - expression is a constant expression of type int AND
12919 - variable is byte, short or char AND
12920 - The value of the expression is representable in the type of the
12922 else if (rhs_type == int_type_node && TREE_CONSTANT (rhs)
12923 && (lhs_type == byte_type_node || lhs_type == char_type_node
12924 || lhs_type == short_type_node))
12926 if (int_fits_type_p (rhs, lhs_type))
12927 new_rhs = convert (lhs_type, rhs);
12928 else if (wfl_op1) /* Might be called with a NULL */
12929 parse_warning_context
12930 (wfl_op1, "Constant expression `%s' too wide for narrowing primitive conversion to `%s'",
12931 print_int_node (rhs), lang_printable_name (lhs_type, 0));
12932 /* Reported a warning that will turn into an error further
12933 down, so we don't return */
12939 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
12940 conversion (5.1.1) or widening primitive conversion (5.1.2). Return
12941 0 is the conversion test fails. This implements parts the method
12942 invocation convertion (5.3). */
12945 valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type)
12946 tree lhs_type, rhs_type;
12948 /* 5.1.1: This is the identity conversion part. */
12949 if (lhs_type == rhs_type)
12952 /* Reject non primitive types and boolean conversions. */
12953 if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
12956 /* 5.1.2: widening primitive conversion. byte, even if it's smaller
12957 than a char can't be converted into a char. Short can't too, but
12958 the < test below takes care of that */
12959 if (lhs_type == char_type_node && rhs_type == byte_type_node)
12962 /* Accept all promoted type here. Note, we can't use <= in the test
12963 below, because we still need to bounce out assignments of short
12964 to char and the likes */
12965 if (lhs_type == int_type_node
12966 && (rhs_type == promoted_byte_type_node
12967 || rhs_type == promoted_short_type_node
12968 || rhs_type == promoted_char_type_node
12969 || rhs_type == promoted_boolean_type_node))
12972 /* From here, an integral is widened if its precision is smaller
12973 than the precision of the LHS or if the LHS is a floating point
12974 type, or the RHS is a float and the RHS a double. */
12975 if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
12976 && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
12977 || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
12978 || (rhs_type == float_type_node && lhs_type == double_type_node))
12984 /* Check that something of SOURCE type can be assigned or cast to
12985 something of DEST type at runtime. Return 1 if the operation is
12986 valid, 0 otherwise. If CAST is set to 1, we're treating the case
12987 were SOURCE is cast into DEST, which borrows a lot of the
12988 assignment check. */
12991 valid_ref_assignconv_cast_p (source, dest, cast)
12996 /* SOURCE or DEST might be null if not from a declared entity. */
12997 if (!source || !dest)
12999 if (JNULLP_TYPE_P (source))
13001 if (TREE_CODE (source) == POINTER_TYPE)
13002 source = TREE_TYPE (source);
13003 if (TREE_CODE (dest) == POINTER_TYPE)
13004 dest = TREE_TYPE (dest);
13006 /* If source and dest are being compiled from bytecode, they may need to
13008 if (CLASS_P (source) && !CLASS_LOADED_P (source))
13010 load_class (source, 1);
13011 safe_layout_class (source);
13013 if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
13015 load_class (dest, 1);
13016 safe_layout_class (dest);
13019 /* Case where SOURCE is a class type */
13020 if (TYPE_CLASS_P (source))
13022 if (TYPE_CLASS_P (dest))
13023 return (source == dest
13024 || inherits_from_p (source, dest)
13025 || (cast && inherits_from_p (dest, source)));
13026 if (TYPE_INTERFACE_P (dest))
13028 /* If doing a cast and SOURCE is final, the operation is
13029 always correct a compile time (because even if SOURCE
13030 does not implement DEST, a subclass of SOURCE might). */
13031 if (cast && !CLASS_FINAL (TYPE_NAME (source)))
13033 /* Otherwise, SOURCE must implement DEST */
13034 return interface_of_p (dest, source);
13036 /* DEST is an array, cast permited if SOURCE is of Object type */
13037 return (cast && source == object_type_node ? 1 : 0);
13039 if (TYPE_INTERFACE_P (source))
13041 if (TYPE_CLASS_P (dest))
13043 /* If not casting, DEST must be the Object type */
13045 return dest == object_type_node;
13046 /* We're doing a cast. The cast is always valid is class
13047 DEST is not final, otherwise, DEST must implement SOURCE */
13048 else if (!CLASS_FINAL (TYPE_NAME (dest)))
13051 return interface_of_p (source, dest);
13053 if (TYPE_INTERFACE_P (dest))
13055 /* If doing a cast, then if SOURCE and DEST contain method
13056 with the same signature but different return type, then
13057 this is a (compile time) error */
13060 tree method_source, method_dest;
13064 for (method_source = TYPE_METHODS (source); method_source;
13065 method_source = TREE_CHAIN (method_source))
13068 build_java_argument_signature (TREE_TYPE (method_source));
13069 source_type = TREE_TYPE (TREE_TYPE (method_source));
13070 source_name = DECL_NAME (method_source);
13071 for (method_dest = TYPE_METHODS (dest);
13072 method_dest; method_dest = TREE_CHAIN (method_dest))
13074 build_java_argument_signature (TREE_TYPE (method_dest))
13075 && source_name == DECL_NAME (method_dest)
13076 && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
13082 return source == dest || interface_of_p (dest, source);
13088 && (DECL_NAME (TYPE_NAME (source)) == java_lang_cloneable
13089 || (DECL_NAME (TYPE_NAME (source))
13090 == java_io_serializable)));
13093 if (TYPE_ARRAY_P (source))
13095 if (TYPE_CLASS_P (dest))
13096 return dest == object_type_node;
13097 /* Can't cast an array to an interface unless the interface is
13098 java.lang.Cloneable or java.io.Serializable. */
13099 if (TYPE_INTERFACE_P (dest))
13100 return (DECL_NAME (TYPE_NAME (dest)) == java_lang_cloneable
13101 || DECL_NAME (TYPE_NAME (dest)) == java_io_serializable);
13104 tree source_element_type = TYPE_ARRAY_ELEMENT (source);
13105 tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
13107 /* In case of severe errors, they turn out null */
13108 if (!dest_element_type || !source_element_type)
13110 if (source_element_type == dest_element_type)
13112 return valid_ref_assignconv_cast_p (source_element_type,
13113 dest_element_type, cast);
13121 valid_cast_to_p (source, dest)
13125 if (TREE_CODE (source) == POINTER_TYPE)
13126 source = TREE_TYPE (source);
13127 if (TREE_CODE (dest) == POINTER_TYPE)
13128 dest = TREE_TYPE (dest);
13130 if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
13131 return valid_ref_assignconv_cast_p (source, dest, 1);
13133 else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
13136 else if (TREE_CODE (source) == BOOLEAN_TYPE
13137 && TREE_CODE (dest) == BOOLEAN_TYPE)
13144 do_unary_numeric_promotion (arg)
13147 tree type = TREE_TYPE (arg);
13148 if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
13149 || TREE_CODE (type) == CHAR_TYPE)
13150 arg = convert (int_type_node, arg);
13154 /* Return a non zero value if SOURCE can be converted into DEST using
13155 the method invocation conversion rule (5.3). */
13157 valid_method_invocation_conversion_p (dest, source)
13160 return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
13161 && valid_builtin_assignconv_identity_widening_p (dest, source))
13162 || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
13163 && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
13164 && valid_ref_assignconv_cast_p (source, dest, 0)));
13167 /* Build an incomplete binop expression. */
13170 build_binop (op, op_location, op1, op2)
13175 tree binop = build (op, NULL_TREE, op1, op2);
13176 TREE_SIDE_EFFECTS (binop) = 1;
13177 /* Store the location of the operator, for better error report. The
13178 string of the operator will be rebuild based on the OP value. */
13179 EXPR_WFL_LINECOL (binop) = op_location;
13183 /* Build the string of the operator retained by NODE. If NODE is part
13184 of a compound expression, add an '=' at the end of the string. This
13185 function is called when an error needs to be reported on an
13186 operator. The string is returned as a pointer to a static character
13190 operator_string (node)
13193 #define BUILD_OPERATOR_STRING(S) \
13195 sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
13199 static char buffer [10];
13200 switch (TREE_CODE (node))
13202 case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
13203 case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
13204 case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
13205 case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13206 case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
13207 case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
13208 case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
13209 case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
13210 case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
13211 case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
13212 case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
13213 case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
13214 case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
13215 case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
13216 case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
13217 case GT_EXPR: BUILD_OPERATOR_STRING (">");
13218 case GE_EXPR: BUILD_OPERATOR_STRING (">=");
13219 case LT_EXPR: BUILD_OPERATOR_STRING ("<");
13220 case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
13221 case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13222 case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
13223 case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
13224 case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
13225 case PREINCREMENT_EXPR: /* Fall through */
13226 case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
13227 case PREDECREMENT_EXPR: /* Fall through */
13228 case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
13230 internal_error ("unregistered operator %s",
13231 tree_code_name [TREE_CODE (node)]);
13234 #undef BUILD_OPERATOR_STRING
13237 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2. */
13240 java_decl_equiv (var_acc1, var_acc2)
13241 tree var_acc1, var_acc2;
13243 if (JDECL_P (var_acc1))
13244 return (var_acc1 == var_acc2);
13246 return (TREE_CODE (var_acc1) == COMPONENT_REF
13247 && TREE_CODE (var_acc2) == COMPONENT_REF
13248 && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
13249 == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
13250 && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
13253 /* Return a non zero value if CODE is one of the operators that can be
13254 used in conjunction with the `=' operator in a compound assignment. */
13257 binop_compound_p (code)
13258 enum tree_code code;
13261 for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
13262 if (binop_lookup [i] == code)
13265 return i < BINOP_COMPOUND_CANDIDATES;
13268 /* Reorganize after a fold to get SAVE_EXPR to generate what we want. */
13274 tree c, b, ns, decl;
13276 if (TREE_CODE (t) != MODIFY_EXPR)
13279 c = TREE_OPERAND (t, 1);
13280 if (! (c && TREE_CODE (c) == COMPOUND_EXPR
13281 && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
13282 && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
13285 /* Now the left branch of the binary operator. */
13286 b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
13287 if (! (b && TREE_CODE (b) == NOP_EXPR
13288 && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
13291 ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
13292 if (! (ns && TREE_CODE (ns) == NOP_EXPR
13293 && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
13296 decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
13297 if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
13298 /* It's got to be the an equivalent decl */
13299 && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
13301 /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13302 TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
13303 /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13304 TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
13305 /* Change the right part of the BINOP_EXPR */
13306 TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
13312 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13313 errors but we modify NODE so that it contains the type computed
13314 according to the expression, when it's fixed. Otherwise, we write
13315 error_mark_node as the type. It allows us to further the analysis
13316 of remaining nodes and detects more errors in certain cases. */
13319 patch_binop (node, wfl_op1, wfl_op2)
13324 tree op1 = TREE_OPERAND (node, 0);
13325 tree op2 = TREE_OPERAND (node, 1);
13326 tree op1_type = TREE_TYPE (op1);
13327 tree op2_type = TREE_TYPE (op2);
13328 tree prom_type = NULL_TREE, cn;
13329 enum tree_code code = TREE_CODE (node);
13331 /* If 1, tell the routine that we have to return error_mark_node
13332 after checking for the initialization of the RHS */
13333 int error_found = 0;
13335 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13337 /* If either op<n>_type are NULL, this might be early signs of an
13338 error situation, unless it's too early to tell (in case we're
13339 handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13340 correctly so the error can be later on reported accurately. */
13341 if (! (code == PLUS_EXPR || code == NE_EXPR
13342 || code == EQ_EXPR || code == INSTANCEOF_EXPR))
13347 n = java_complete_tree (op1);
13348 op1_type = TREE_TYPE (n);
13352 n = java_complete_tree (op2);
13353 op2_type = TREE_TYPE (n);
13359 /* 15.16 Multiplicative operators */
13360 case MULT_EXPR: /* 15.16.1 Multiplication Operator * */
13361 case RDIV_EXPR: /* 15.16.2 Division Operator / */
13362 case TRUNC_DIV_EXPR: /* 15.16.2 Integral type Division Operator / */
13363 case TRUNC_MOD_EXPR: /* 15.16.3 Remainder operator % */
13364 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13366 if (!JNUMERIC_TYPE_P (op1_type))
13367 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13368 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13369 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13370 TREE_TYPE (node) = error_mark_node;
13374 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13376 /* Detect integral division by zero */
13377 if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
13378 && TREE_CODE (prom_type) == INTEGER_TYPE
13379 && (op2 == integer_zero_node || op2 == long_zero_node ||
13380 (TREE_CODE (op2) == INTEGER_CST &&
13381 ! TREE_INT_CST_LOW (op2) && ! TREE_INT_CST_HIGH (op2))))
13383 parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown");
13384 TREE_CONSTANT (node) = 0;
13387 /* Change the division operator if necessary */
13388 if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
13389 TREE_SET_CODE (node, TRUNC_DIV_EXPR);
13391 /* Before divisions as is disapear, try to simplify and bail if
13392 applicable, otherwise we won't perform even simple
13393 simplifications like (1-1)/3. We can't do that with floating
13394 point number, folds can't handle them at this stage. */
13395 if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
13396 && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
13398 TREE_TYPE (node) = prom_type;
13399 node = fold (node);
13400 if (TREE_CODE (node) != code)
13404 if (TREE_CODE (prom_type) == INTEGER_TYPE
13405 && flag_use_divide_subroutine
13406 && ! flag_emit_class_files
13407 && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
13408 return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
13410 /* This one is more complicated. FLOATs are processed by a
13411 function call to soft_fmod. Duplicate the value of the
13412 COMPOUND_ASSIGN_P flag. */
13413 if (code == TRUNC_MOD_EXPR)
13415 tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
13416 COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
13417 TREE_SIDE_EFFECTS (mod)
13418 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13423 /* 15.17 Additive Operators */
13424 case PLUS_EXPR: /* 15.17.1 String Concatenation Operator + */
13426 /* Operation is valid if either one argument is a string
13427 constant, a String object or a StringBuffer crafted for the
13428 purpose of the a previous usage of the String concatenation
13431 if (TREE_CODE (op1) == STRING_CST
13432 || TREE_CODE (op2) == STRING_CST
13433 || JSTRING_TYPE_P (op1_type)
13434 || JSTRING_TYPE_P (op2_type)
13435 || IS_CRAFTED_STRING_BUFFER_P (op1)
13436 || IS_CRAFTED_STRING_BUFFER_P (op2))
13437 return build_string_concatenation (op1, op2);
13439 case MINUS_EXPR: /* 15.17.2 Additive Operators (+ and -) for
13441 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13443 if (!JNUMERIC_TYPE_P (op1_type))
13444 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13445 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13446 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13447 TREE_TYPE (node) = error_mark_node;
13451 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13454 /* 15.18 Shift Operators */
13458 if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
13460 if (!JINTEGRAL_TYPE_P (op1_type))
13461 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13464 if (JNUMERIC_TYPE_P (op2_type))
13465 parse_error_context (wfl_operator,
13466 "Incompatible type for `%s'. Explicit cast needed to convert shift distance from `%s' to integral",
13467 operator_string (node),
13468 lang_printable_name (op2_type, 0));
13470 parse_error_context (wfl_operator,
13471 "Incompatible type for `%s'. Can't convert shift distance from `%s' to integral",
13472 operator_string (node),
13473 lang_printable_name (op2_type, 0));
13475 TREE_TYPE (node) = error_mark_node;
13480 /* Unary numeric promotion (5.6.1) is performed on each operand
13482 op1 = do_unary_numeric_promotion (op1);
13483 op2 = do_unary_numeric_promotion (op2);
13485 /* The type of the shift expression is the type of the promoted
13486 type of the left-hand operand */
13487 prom_type = TREE_TYPE (op1);
13489 /* Shift int only up to 0x1f and long up to 0x3f */
13490 if (prom_type == int_type_node)
13491 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13492 build_int_2 (0x1f, 0)));
13494 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13495 build_int_2 (0x3f, 0)));
13497 /* The >>> operator is a >> operating on unsigned quantities */
13498 if (code == URSHIFT_EXPR && ! flag_emit_class_files)
13501 tree utype = java_unsigned_type (prom_type);
13502 op1 = convert (utype, op1);
13503 TREE_SET_CODE (node, RSHIFT_EXPR);
13504 TREE_OPERAND (node, 0) = op1;
13505 TREE_OPERAND (node, 1) = op2;
13506 TREE_TYPE (node) = utype;
13507 to_return = convert (prom_type, node);
13508 /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13509 COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
13510 TREE_SIDE_EFFECTS (to_return)
13511 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13516 /* 15.19.1 Type Comparison Operator instaceof */
13517 case INSTANCEOF_EXPR:
13519 TREE_TYPE (node) = boolean_type_node;
13521 /* OP1_TYPE might be NULL when OP1 is a string constant. */
13522 if ((cn = patch_string (op1)))
13525 op1_type = TREE_TYPE (op1);
13527 if (op1_type == NULL_TREE)
13530 if (!(op2_type = resolve_type_during_patch (op2)))
13531 return error_mark_node;
13533 /* The first operand must be a reference type or the null type */
13534 if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
13535 error_found = 1; /* Error reported further below */
13537 /* The second operand must be a reference type */
13538 if (!JREFERENCE_TYPE_P (op2_type))
13540 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
13541 parse_error_context
13542 (wfl_operator, "Invalid argument `%s' for `instanceof'",
13543 lang_printable_name (op2_type, 0));
13547 if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
13549 /* If the first operand is null, the result is always false */
13550 if (op1 == null_pointer_node)
13551 return boolean_false_node;
13552 else if (flag_emit_class_files)
13554 TREE_OPERAND (node, 1) = op2_type;
13555 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
13558 /* Otherwise we have to invoke instance of to figure it out */
13560 return build_instanceof (op1, op2_type);
13562 /* There is no way the expression operand can be an instance of
13563 the type operand. This is a compile time error. */
13566 char *t1 = xstrdup (lang_printable_name (op1_type, 0));
13567 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
13568 parse_error_context
13569 (wfl_operator, "Impossible for `%s' to be instance of `%s'",
13570 t1, lang_printable_name (op2_type, 0));
13577 /* 15.21 Bitwise and Logical Operators */
13581 if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
13582 /* Binary numeric promotion is performed on both operand and the
13583 expression retain that type */
13584 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13586 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
13587 && TREE_CODE (op1_type) == BOOLEAN_TYPE)
13588 /* The type of the bitwise operator expression is BOOLEAN */
13589 prom_type = boolean_type_node;
13592 if (!JINTEGRAL_TYPE_P (op1_type))
13593 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13594 if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
13595 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
13596 TREE_TYPE (node) = error_mark_node;
13598 /* Insert a break here if adding thing before the switch's
13599 break for this case */
13603 /* 15.22 Conditional-And Operator */
13604 case TRUTH_ANDIF_EXPR:
13605 /* 15.23 Conditional-Or Operator */
13606 case TRUTH_ORIF_EXPR:
13607 /* Operands must be of BOOLEAN type */
13608 if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
13609 TREE_CODE (op2_type) != BOOLEAN_TYPE)
13611 if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
13612 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
13613 if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
13614 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
13615 TREE_TYPE (node) = boolean_type_node;
13619 else if (integer_zerop (op1))
13621 return code == TRUTH_ANDIF_EXPR ? op1 : op2;
13623 else if (integer_onep (op1))
13625 return code == TRUTH_ANDIF_EXPR ? op2 : op1;
13627 /* The type of the conditional operators is BOOLEAN */
13628 prom_type = boolean_type_node;
13631 /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13636 /* The type of each of the operands must be a primitive numeric
13638 if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
13640 if (!JNUMERIC_TYPE_P (op1_type))
13641 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13642 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13643 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13644 TREE_TYPE (node) = boolean_type_node;
13648 /* Binary numeric promotion is performed on the operands */
13649 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13650 /* The type of the relation expression is always BOOLEAN */
13651 prom_type = boolean_type_node;
13654 /* 15.20 Equality Operator */
13657 /* It's time for us to patch the strings. */
13658 if ((cn = patch_string (op1)))
13661 op1_type = TREE_TYPE (op1);
13663 if ((cn = patch_string (op2)))
13666 op2_type = TREE_TYPE (op2);
13669 /* 15.20.1 Numerical Equality Operators == and != */
13670 /* Binary numeric promotion is performed on the operands */
13671 if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
13672 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13674 /* 15.20.2 Boolean Equality Operators == and != */
13675 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
13676 TREE_CODE (op2_type) == BOOLEAN_TYPE)
13677 ; /* Nothing to do here */
13679 /* 15.20.3 Reference Equality Operators == and != */
13680 /* Types have to be either references or the null type. If
13681 they're references, it must be possible to convert either
13682 type to the other by casting conversion. */
13683 else if (op1 == null_pointer_node || op2 == null_pointer_node
13684 || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
13685 && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
13686 || valid_ref_assignconv_cast_p (op2_type,
13688 ; /* Nothing to do here */
13690 /* Else we have an error figure what can't be converted into
13691 what and report the error */
13695 t1 = xstrdup (lang_printable_name (op1_type, 0));
13696 parse_error_context
13698 "Incompatible type for `%s'. Can't convert `%s' to `%s'",
13699 operator_string (node), t1,
13700 lang_printable_name (op2_type, 0));
13702 TREE_TYPE (node) = boolean_type_node;
13706 prom_type = boolean_type_node;
13713 return error_mark_node;
13715 TREE_OPERAND (node, 0) = op1;
13716 TREE_OPERAND (node, 1) = op2;
13717 TREE_TYPE (node) = prom_type;
13718 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13720 if (flag_emit_xref)
13723 /* fold does not respect side-effect order as required for Java but not C.
13724 * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13727 if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
13728 : ! TREE_SIDE_EFFECTS (node))
13729 node = fold (node);
13733 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13734 zero value, the value of CSTE comes after the valude of STRING */
13737 do_merge_string_cste (cste, string, string_len, after)
13739 const char *string;
13740 int string_len, after;
13742 const char *old = TREE_STRING_POINTER (cste);
13743 int old_len = TREE_STRING_LENGTH (cste);
13744 int len = old_len + string_len;
13745 char *new = alloca (len+1);
13749 memcpy (new, string, string_len);
13750 memcpy (&new [string_len], old, old_len);
13754 memcpy (new, old, old_len);
13755 memcpy (&new [old_len], string, string_len);
13758 return build_string (len, new);
13761 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13762 new STRING_CST on success, NULL_TREE on failure */
13765 merge_string_cste (op1, op2, after)
13769 /* Handle two string constants right away */
13770 if (TREE_CODE (op2) == STRING_CST)
13771 return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
13772 TREE_STRING_LENGTH (op2), after);
13774 /* Reasonable integer constant can be treated right away */
13775 if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
13777 static const char *const boolean_true = "true";
13778 static const char *const boolean_false = "false";
13779 static const char *const null_pointer = "null";
13781 const char *string;
13783 if (op2 == boolean_true_node)
13784 string = boolean_true;
13785 else if (op2 == boolean_false_node)
13786 string = boolean_false;
13787 else if (op2 == null_pointer_node)
13788 string = null_pointer;
13789 else if (TREE_TYPE (op2) == char_type_node)
13791 ch[0] = (char )TREE_INT_CST_LOW (op2);
13796 string = string_convert_int_cst (op2);
13798 return do_merge_string_cste (op1, string, strlen (string), after);
13803 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
13804 has to be a STRING_CST and the other part must be a STRING_CST or a
13805 INTEGRAL constant. Return a new STRING_CST if the operation
13806 succeed, NULL_TREE otherwise.
13808 If the case we want to optimize for space, we might want to return
13809 NULL_TREE for each invocation of this routine. FIXME */
13812 string_constant_concatenation (op1, op2)
13815 if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
13820 string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
13821 rest = (string == op1 ? op2 : op1);
13822 invert = (string == op1 ? 0 : 1 );
13824 /* Walk REST, only if it looks reasonable */
13825 if (TREE_CODE (rest) != STRING_CST
13826 && !IS_CRAFTED_STRING_BUFFER_P (rest)
13827 && !JSTRING_TYPE_P (TREE_TYPE (rest))
13828 && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
13830 rest = java_complete_tree (rest);
13831 if (rest == error_mark_node)
13832 return error_mark_node;
13833 rest = fold (rest);
13835 return merge_string_cste (string, rest, invert);
13840 /* Implement the `+' operator. Does static optimization if possible,
13841 otherwise create (if necessary) and append elements to a
13842 StringBuffer. The StringBuffer will be carried around until it is
13843 used for a function call or an assignment. Then toString() will be
13844 called on it to turn it into a String object. */
13847 build_string_concatenation (op1, op2)
13851 int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13853 if (flag_emit_xref)
13854 return build (PLUS_EXPR, string_type_node, op1, op2);
13856 /* Try to do some static optimization */
13857 if ((result = string_constant_concatenation (op1, op2)))
13860 /* Discard empty strings on either side of the expression */
13861 if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
13866 else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
13869 /* If operands are string constant, turn then into object references */
13870 if (TREE_CODE (op1) == STRING_CST)
13871 op1 = patch_string_cst (op1);
13872 if (op2 && TREE_CODE (op2) == STRING_CST)
13873 op2 = patch_string_cst (op2);
13875 /* If either one of the constant is null and the other non null
13876 operand is a String constant, return it. */
13877 if ((TREE_CODE (op1) == STRING_CST) && !op2)
13880 /* If OP1 isn't already a StringBuffer, create and
13881 initialize a new one */
13882 if (!IS_CRAFTED_STRING_BUFFER_P (op1))
13884 /* Two solutions here:
13885 1) OP1 is a constant string reference, we call new StringBuffer(OP1)
13886 2) OP1 is something else, we call new StringBuffer().append(OP1). */
13887 if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
13888 op1 = BUILD_STRING_BUFFER (op1);
13891 tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
13892 op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
13898 /* OP1 is no longer the last node holding a crafted StringBuffer */
13899 IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
13900 /* Create a node for `{new...,xxx}.append (op2)' */
13902 op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
13905 /* Mark the last node holding a crafted StringBuffer */
13906 IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
13908 TREE_SIDE_EFFECTS (op1) = side_effects;
13912 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
13913 StringBuffer. If no string were found to be patched, return
13917 patch_string (node)
13920 if (node == error_mark_node)
13921 return error_mark_node;
13922 if (TREE_CODE (node) == STRING_CST)
13923 return patch_string_cst (node);
13924 else if (IS_CRAFTED_STRING_BUFFER_P (node))
13926 int saved = ctxp->explicit_constructor_p;
13927 tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
13929 /* Temporary disable forbid the use of `this'. */
13930 ctxp->explicit_constructor_p = 0;
13931 ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
13932 /* String concatenation arguments must be evaluated in order too. */
13933 ret = force_evaluation_order (ret);
13934 /* Restore it at its previous value */
13935 ctxp->explicit_constructor_p = saved;
13941 /* Build the internal representation of a string constant. */
13944 patch_string_cst (node)
13948 if (! flag_emit_class_files)
13950 node = get_identifier (TREE_STRING_POINTER (node));
13951 location = alloc_name_constant (CONSTANT_String, node);
13952 node = build_ref_from_constant_pool (location);
13954 TREE_TYPE (node) = string_ptr_type_node;
13955 TREE_CONSTANT (node) = 1;
13959 /* Build an incomplete unary operator expression. */
13962 build_unaryop (op_token, op_location, op1)
13963 int op_token, op_location;
13970 case PLUS_TK: op = UNARY_PLUS_EXPR; break;
13971 case MINUS_TK: op = NEGATE_EXPR; break;
13972 case NEG_TK: op = TRUTH_NOT_EXPR; break;
13973 case NOT_TK: op = BIT_NOT_EXPR; break;
13977 unaryop = build1 (op, NULL_TREE, op1);
13978 TREE_SIDE_EFFECTS (unaryop) = 1;
13979 /* Store the location of the operator, for better error report. The
13980 string of the operator will be rebuild based on the OP value. */
13981 EXPR_WFL_LINECOL (unaryop) = op_location;
13985 /* Special case for the ++/-- operators, since they require an extra
13986 argument to build, which is set to NULL and patched
13987 later. IS_POST_P is 1 if the operator, 0 otherwise. */
13990 build_incdec (op_token, op_location, op1, is_post_p)
13991 int op_token, op_location;
13995 static const enum tree_code lookup [2][2] =
13997 { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
13998 { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
14000 tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
14001 NULL_TREE, op1, NULL_TREE);
14002 TREE_SIDE_EFFECTS (node) = 1;
14003 /* Store the location of the operator, for better error report. The
14004 string of the operator will be rebuild based on the OP value. */
14005 EXPR_WFL_LINECOL (node) = op_location;
14009 /* Build an incomplete cast operator, based on the use of the
14010 CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
14011 set. java_complete_tree is trained to walk a CONVERT_EXPR even
14012 though its type is already set. */
14015 build_cast (location, type, exp)
14019 tree node = build1 (CONVERT_EXPR, type, exp);
14020 EXPR_WFL_LINECOL (node) = location;
14024 /* Build an incomplete class reference operator. */
14026 build_incomplete_class_ref (location, class_name)
14030 tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
14031 EXPR_WFL_LINECOL (node) = location;
14035 /* Complete an incomplete class reference operator. */
14037 patch_incomplete_class_ref (node)
14040 tree type = TREE_OPERAND (node, 0);
14043 if (!(ref_type = resolve_type_during_patch (type)))
14044 return error_mark_node;
14046 if (!flag_emit_class_files || JPRIMITIVE_TYPE_P (ref_type)
14047 || TREE_CODE (ref_type) == VOID_TYPE)
14049 tree dot = build_class_ref (ref_type);
14050 /* A class referenced by `foo.class' is initialized. */
14051 if (!flag_emit_class_files)
14052 dot = build_class_init (ref_type, dot);
14053 return java_complete_tree (dot);
14056 /* If we're emitting class files and we have to deal with non
14057 primitive types, we invoke (and consider generating) the
14058 synthetic static method `class$'. */
14059 if (!TYPE_DOT_CLASS (current_class))
14060 build_dot_class_method (current_class);
14061 ref_type = build_dot_class_method_invocation (ref_type);
14062 return java_complete_tree (ref_type);
14065 /* 15.14 Unary operators. We return error_mark_node in case of error,
14066 but preserve the type of NODE if the type is fixed. */
14069 patch_unaryop (node, wfl_op)
14073 tree op = TREE_OPERAND (node, 0);
14074 tree op_type = TREE_TYPE (op);
14075 tree prom_type = NULL_TREE, value, decl;
14076 int outer_field_flag = 0;
14077 int code = TREE_CODE (node);
14078 int error_found = 0;
14080 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14084 /* 15.13.2 Postfix Increment Operator ++ */
14085 case POSTINCREMENT_EXPR:
14086 /* 15.13.3 Postfix Increment Operator -- */
14087 case POSTDECREMENT_EXPR:
14088 /* 15.14.1 Prefix Increment Operator ++ */
14089 case PREINCREMENT_EXPR:
14090 /* 15.14.2 Prefix Decrement Operator -- */
14091 case PREDECREMENT_EXPR:
14092 op = decl = strip_out_static_field_access_decl (op);
14093 outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
14094 /* We might be trying to change an outer field accessed using
14096 if (outer_field_flag)
14098 /* Retrieve the decl of the field we're trying to access. We
14099 do that by first retrieving the function we would call to
14100 access the field. It has been already verified that this
14101 field isn't final */
14102 if (flag_emit_class_files)
14103 decl = TREE_OPERAND (op, 0);
14105 decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
14106 decl = DECL_FUNCTION_ACCESS_DECL (decl);
14108 /* We really should have a JAVA_ARRAY_EXPR to avoid this */
14109 else if (!JDECL_P (decl)
14110 && TREE_CODE (decl) != COMPONENT_REF
14111 && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
14112 && TREE_CODE (decl) != INDIRECT_REF
14113 && !(TREE_CODE (decl) == COMPOUND_EXPR
14114 && TREE_OPERAND (decl, 1)
14115 && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
14117 TREE_TYPE (node) = error_mark_node;
14121 /* From now on, we know that op if a variable and that it has a
14122 valid wfl. We use wfl_op to locate errors related to the
14124 if (!JNUMERIC_TYPE_P (op_type))
14126 parse_error_context
14127 (wfl_op, "Invalid argument type `%s' to `%s'",
14128 lang_printable_name (op_type, 0), operator_string (node));
14129 TREE_TYPE (node) = error_mark_node;
14134 /* Before the addition, binary numeric promotion is performed on
14135 both operands, if really necessary */
14136 if (JINTEGRAL_TYPE_P (op_type))
14138 value = build_int_2 (1, 0);
14139 TREE_TYPE (value) = TREE_TYPE (node) = op_type;
14143 value = build_int_2 (1, 0);
14145 binary_numeric_promotion (op_type,
14146 TREE_TYPE (value), &op, &value);
14149 /* We remember we might be accessing an outer field */
14150 if (outer_field_flag)
14152 /* We re-generate an access to the field */
14153 value = build (PLUS_EXPR, TREE_TYPE (op),
14154 build_outer_field_access (wfl_op, decl), value);
14156 /* And we patch the original access$() into a write
14157 with plus_op as a rhs */
14158 return outer_field_access_fix (node, op, value);
14161 /* And write back into the node. */
14162 TREE_OPERAND (node, 0) = op;
14163 TREE_OPERAND (node, 1) = value;
14164 /* Convert the overall back into its original type, if
14165 necessary, and return */
14166 if (JINTEGRAL_TYPE_P (op_type))
14167 return fold (node);
14169 return fold (convert (op_type, node));
14173 /* 15.14.3 Unary Plus Operator + */
14174 case UNARY_PLUS_EXPR:
14175 /* 15.14.4 Unary Minus Operator - */
14177 if (!JNUMERIC_TYPE_P (op_type))
14179 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
14180 TREE_TYPE (node) = error_mark_node;
14183 /* Unary numeric promotion is performed on operand */
14186 op = do_unary_numeric_promotion (op);
14187 prom_type = TREE_TYPE (op);
14188 if (code == UNARY_PLUS_EXPR)
14193 /* 15.14.5 Bitwise Complement Operator ~ */
14195 if (!JINTEGRAL_TYPE_P (op_type))
14197 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
14198 TREE_TYPE (node) = error_mark_node;
14203 op = do_unary_numeric_promotion (op);
14204 prom_type = TREE_TYPE (op);
14208 /* 15.14.6 Logical Complement Operator ! */
14209 case TRUTH_NOT_EXPR:
14210 if (TREE_CODE (op_type) != BOOLEAN_TYPE)
14212 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
14213 /* But the type is known. We will report an error if further
14214 attempt of a assignment is made with this rhs */
14215 TREE_TYPE (node) = boolean_type_node;
14219 prom_type = boolean_type_node;
14222 /* 15.15 Cast Expression */
14224 value = patch_cast (node, wfl_operator);
14225 if (value == error_mark_node)
14227 /* If this cast is part of an assignment, we tell the code
14228 that deals with it not to complain about a mismatch,
14229 because things have been cast, anyways */
14230 TREE_TYPE (node) = error_mark_node;
14235 value = fold (value);
14236 TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
14243 return error_mark_node;
14245 /* There are cases where node has been replaced by something else
14246 and we don't end up returning here: UNARY_PLUS_EXPR,
14247 CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14248 TREE_OPERAND (node, 0) = fold (op);
14249 TREE_TYPE (node) = prom_type;
14250 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
14251 return fold (node);
14254 /* Generic type resolution that sometimes takes place during node
14255 patching. Returned the resolved type or generate an error
14256 message. Return the resolved type or NULL_TREE. */
14259 resolve_type_during_patch (type)
14262 if (unresolved_type_p (type, NULL))
14264 tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
14267 parse_error_context (type,
14268 "Class `%s' not found in type declaration",
14269 IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
14272 return TREE_TYPE (type_decl);
14276 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14277 found. Otherwise NODE or something meant to replace it is returned. */
14280 patch_cast (node, wfl_op)
14284 tree op = TREE_OPERAND (node, 0);
14285 tree cast_type = TREE_TYPE (node);
14286 tree patched, op_type;
14289 /* Some string patching might be necessary at this stage */
14290 if ((patched = patch_string (op)))
14291 TREE_OPERAND (node, 0) = op = patched;
14292 op_type = TREE_TYPE (op);
14294 /* First resolve OP_TYPE if unresolved */
14295 if (!(cast_type = resolve_type_during_patch (cast_type)))
14296 return error_mark_node;
14298 /* Check on cast that are proven correct at compile time */
14299 if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
14302 if (cast_type == op_type)
14305 /* float and double type are converted to the original type main
14306 variant and then to the target type. */
14307 if (JFLOAT_TYPE_P (op_type) && TREE_CODE (cast_type) == CHAR_TYPE)
14308 op = convert (integer_type_node, op);
14310 /* Try widening/narowwing convertion. Potentially, things need
14311 to be worked out in gcc so we implement the extreme cases
14312 correctly. fold_convert() needs to be fixed. */
14313 return convert (cast_type, op);
14316 /* It's also valid to cast a boolean into a boolean */
14317 if (op_type == boolean_type_node && cast_type == boolean_type_node)
14320 /* null can be casted to references */
14321 if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
14322 return build_null_of_type (cast_type);
14324 /* The remaining legal casts involve conversion between reference
14325 types. Check for their compile time correctness. */
14326 if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
14327 && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
14329 TREE_TYPE (node) = promote_type (cast_type);
14330 /* Now, the case can be determined correct at compile time if
14331 OP_TYPE can be converted into CAST_TYPE by assignment
14332 conversion (5.2) */
14334 if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
14336 TREE_SET_CODE (node, NOP_EXPR);
14340 if (flag_emit_class_files)
14342 TREE_SET_CODE (node, CONVERT_EXPR);
14346 /* The cast requires a run-time check */
14347 return build (CALL_EXPR, promote_type (cast_type),
14348 build_address_of (soft_checkcast_node),
14349 tree_cons (NULL_TREE, build_class_ref (cast_type),
14350 build_tree_list (NULL_TREE, op)),
14354 /* Any other casts are proven incorrect at compile time */
14355 t1 = xstrdup (lang_printable_name (op_type, 0));
14356 parse_error_context (wfl_op, "Invalid cast from `%s' to `%s'",
14357 t1, lang_printable_name (cast_type, 0));
14359 return error_mark_node;
14362 /* Build a null constant and give it the type TYPE. */
14365 build_null_of_type (type)
14368 tree node = build_int_2 (0, 0);
14369 TREE_TYPE (node) = promote_type (type);
14373 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14374 a list of indices. */
14376 build_array_ref (location, array, index)
14380 tree node = build (ARRAY_REF, NULL_TREE, array, index);
14381 EXPR_WFL_LINECOL (node) = location;
14385 /* 15.12 Array Access Expression */
14388 patch_array_ref (node)
14391 tree array = TREE_OPERAND (node, 0);
14392 tree array_type = TREE_TYPE (array);
14393 tree index = TREE_OPERAND (node, 1);
14394 tree index_type = TREE_TYPE (index);
14395 int error_found = 0;
14397 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14399 if (TREE_CODE (array_type) == POINTER_TYPE)
14400 array_type = TREE_TYPE (array_type);
14402 /* The array reference must be an array */
14403 if (!TYPE_ARRAY_P (array_type))
14405 parse_error_context
14407 "`[]' can only be applied to arrays. It can't be applied to `%s'",
14408 lang_printable_name (array_type, 0));
14409 TREE_TYPE (node) = error_mark_node;
14413 /* The array index undergoes unary numeric promotion. The promoted
14414 type must be int */
14415 index = do_unary_numeric_promotion (index);
14416 if (TREE_TYPE (index) != int_type_node)
14418 if (valid_cast_to_p (index_type, int_type_node))
14419 parse_error_context (wfl_operator,
14420 "Incompatible type for `[]'. Explicit cast needed to convert `%s' to `int'",
14421 lang_printable_name (index_type, 0));
14423 parse_error_context (wfl_operator,
14424 "Incompatible type for `[]'. Can't convert `%s' to `int'",
14425 lang_printable_name (index_type, 0));
14426 TREE_TYPE (node) = error_mark_node;
14431 return error_mark_node;
14433 array_type = TYPE_ARRAY_ELEMENT (array_type);
14435 if (flag_emit_class_files || flag_emit_xref)
14437 TREE_OPERAND (node, 0) = array;
14438 TREE_OPERAND (node, 1) = index;
14441 node = build_java_arrayaccess (array, array_type, index);
14442 TREE_TYPE (node) = array_type;
14446 /* 15.9 Array Creation Expressions */
14449 build_newarray_node (type, dims, extra_dims)
14455 build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
14456 build_int_2 (extra_dims, 0));
14461 patch_newarray (node)
14464 tree type = TREE_OPERAND (node, 0);
14465 tree dims = TREE_OPERAND (node, 1);
14466 tree cdim, array_type;
14467 int error_found = 0;
14469 int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
14471 /* Dimension types are verified. It's better for the types to be
14472 verified in order. */
14473 for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
14476 tree dim = TREE_VALUE (cdim);
14478 /* Dim might have been saved during its evaluation */
14479 dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
14481 /* The type of each specified dimension must be an integral type. */
14482 if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
14485 /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14486 promoted type must be int. */
14489 dim = do_unary_numeric_promotion (dim);
14490 if (TREE_TYPE (dim) != int_type_node)
14494 /* Report errors on types here */
14497 parse_error_context
14498 (TREE_PURPOSE (cdim),
14499 "Incompatible type for dimension in array creation expression. %s convert `%s' to `int'",
14500 (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
14501 "Explicit cast needed to" : "Can't"),
14502 lang_printable_name (TREE_TYPE (dim), 0));
14506 TREE_PURPOSE (cdim) = NULL_TREE;
14509 /* Resolve array base type if unresolved */
14510 if (!(type = resolve_type_during_patch (type)))
14515 /* We don't want further evaluation of this bogus array creation
14517 TREE_TYPE (node) = error_mark_node;
14518 return error_mark_node;
14521 /* Set array_type to the actual (promoted) array type of the result. */
14522 if (TREE_CODE (type) == RECORD_TYPE)
14523 type = build_pointer_type (type);
14524 while (--xdims >= 0)
14526 type = promote_type (build_java_array_type (type, -1));
14528 dims = nreverse (dims);
14530 for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
14534 = build_java_array_type (type,
14535 TREE_CODE (cdim) == INTEGER_CST
14536 ? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
14538 array_type = promote_type (array_type);
14540 dims = nreverse (dims);
14542 /* The node is transformed into a function call. Things are done
14543 differently according to the number of dimensions. If the number
14544 of dimension is equal to 1, then the nature of the base type
14545 (primitive or not) matters. */
14547 return build_new_array (type, TREE_VALUE (dims));
14549 /* Can't reuse what's already written in expr.c because it uses the
14550 JVM stack representation. Provide a build_multianewarray. FIXME */
14551 return build (CALL_EXPR, array_type,
14552 build_address_of (soft_multianewarray_node),
14553 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
14554 tree_cons (NULL_TREE,
14555 build_int_2 (ndims, 0), dims )),
14559 /* 10.6 Array initializer. */
14561 /* Build a wfl for array element that don't have one, so we can
14562 pin-point errors. */
14565 maybe_build_array_element_wfl (node)
14568 if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
14569 return build_expr_wfl (NULL_TREE, ctxp->filename,
14570 ctxp->elc.line, ctxp->elc.prev_col);
14575 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14576 identification of initialized arrays easier to detect during walk
14580 build_new_array_init (location, values)
14584 tree constructor = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, values);
14585 tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
14586 EXPR_WFL_LINECOL (to_return) = location;
14590 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14591 occurred. Otherwise return NODE after having set its type
14595 patch_new_array_init (type, node)
14598 int error_seen = 0;
14599 tree current, element_type;
14600 HOST_WIDE_INT length;
14601 int all_constant = 1;
14602 tree init = TREE_OPERAND (node, 0);
14604 if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
14606 parse_error_context (node,
14607 "Invalid array initializer for non-array type `%s'",
14608 lang_printable_name (type, 1));
14609 return error_mark_node;
14611 type = TREE_TYPE (type);
14612 element_type = TYPE_ARRAY_ELEMENT (type);
14614 CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
14616 for (length = 0, current = CONSTRUCTOR_ELTS (init);
14617 current; length++, current = TREE_CHAIN (current))
14619 tree elt = TREE_VALUE (current);
14620 if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
14622 error_seen |= array_constructor_check_entry (element_type, current);
14623 elt = TREE_VALUE (current);
14624 /* When compiling to native code, STRING_CST is converted to
14625 INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14626 if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
14631 TREE_VALUE (current) = patch_new_array_init (element_type, elt);
14632 TREE_PURPOSE (current) = NULL_TREE;
14635 if (elt && TREE_CODE (elt) == TREE_LIST
14636 && TREE_VALUE (elt) == error_mark_node)
14641 return error_mark_node;
14643 /* Create a new type. We can't reuse the one we have here by
14644 patching its dimension because it originally is of dimension -1
14645 hence reused by gcc. This would prevent triangular arrays. */
14646 type = build_java_array_type (element_type, length);
14647 TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
14648 TREE_TYPE (node) = promote_type (type);
14649 TREE_CONSTANT (init) = all_constant;
14650 TREE_CONSTANT (node) = all_constant;
14654 /* Verify that one entry of the initializer element list can be
14655 assigned to the array base type. Report 1 if an error occurred, 0
14659 array_constructor_check_entry (type, entry)
14662 char *array_type_string = NULL; /* For error reports */
14663 tree value, type_value, new_value, wfl_value, patched;
14664 int error_seen = 0;
14666 new_value = NULL_TREE;
14667 wfl_value = TREE_VALUE (entry);
14669 value = java_complete_tree (TREE_VALUE (entry));
14670 /* patch_string return error_mark_node if arg is error_mark_node */
14671 if ((patched = patch_string (value)))
14673 if (value == error_mark_node)
14676 type_value = TREE_TYPE (value);
14678 /* At anytime, try_builtin_assignconv can report a warning on
14679 constant overflow during narrowing. */
14680 SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
14681 new_value = try_builtin_assignconv (wfl_operator, type, value);
14682 if (!new_value && (new_value = try_reference_assignconv (type, value)))
14683 type_value = promote_type (type);
14685 /* Check and report errors */
14688 const char *const msg = (!valid_cast_to_p (type_value, type) ?
14689 "Can't" : "Explicit cast needed to");
14690 if (!array_type_string)
14691 array_type_string = xstrdup (lang_printable_name (type, 1));
14692 parse_error_context
14693 (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
14694 msg, lang_printable_name (type_value, 1), array_type_string);
14699 TREE_VALUE (entry) = new_value;
14701 if (array_type_string)
14702 free (array_type_string);
14704 TREE_PURPOSE (entry) = NULL_TREE;
14709 build_this (location)
14712 tree node = build_wfl_node (this_identifier_node);
14713 TREE_SET_CODE (node, THIS_EXPR);
14714 EXPR_WFL_LINECOL (node) = location;
14718 /* 14.15 The return statement. It builds a modify expression that
14719 assigns the returned value to the RESULT_DECL that hold the value
14723 build_return (location, op)
14727 tree node = build1 (RETURN_EXPR, NULL_TREE, op);
14728 EXPR_WFL_LINECOL (node) = location;
14729 node = build_debugable_stmt (location, node);
14734 patch_return (node)
14737 tree return_exp = TREE_OPERAND (node, 0);
14738 tree meth = current_function_decl;
14739 tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
14740 int error_found = 0;
14742 TREE_TYPE (node) = error_mark_node;
14743 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14745 /* It's invalid to have a return value within a function that is
14746 declared with the keyword void or that is a constructor */
14747 if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
14750 /* It's invalid to use a return statement in a static block */
14751 if (DECL_CLINIT_P (current_function_decl))
14754 /* It's invalid to have a no return value within a function that
14755 isn't declared with the keyword `void' */
14756 if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
14759 if (DECL_INSTINIT_P (current_function_decl))
14764 if (DECL_INSTINIT_P (current_function_decl))
14765 parse_error_context (wfl_operator,
14766 "`return' inside instance initializer");
14768 else if (DECL_CLINIT_P (current_function_decl))
14769 parse_error_context (wfl_operator,
14770 "`return' inside static initializer");
14772 else if (!DECL_CONSTRUCTOR_P (meth))
14774 char *t = xstrdup (lang_printable_name (mtype, 0));
14775 parse_error_context (wfl_operator,
14776 "`return' with%s value from `%s %s'",
14777 (error_found == 1 ? "" : "out"),
14778 t, lang_printable_name (meth, 0));
14782 parse_error_context (wfl_operator,
14783 "`return' with value from constructor `%s'",
14784 lang_printable_name (meth, 0));
14785 return error_mark_node;
14788 /* If we have a return_exp, build a modify expression and expand
14789 it. Note: at that point, the assignment is declared valid, but we
14790 may want to carry some more hacks */
14793 tree exp = java_complete_tree (return_exp);
14794 tree modify, patched;
14796 if ((patched = patch_string (exp)))
14799 modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
14800 EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
14801 modify = java_complete_tree (modify);
14803 if (modify != error_mark_node)
14805 TREE_SIDE_EFFECTS (modify) = 1;
14806 TREE_OPERAND (node, 0) = modify;
14809 return error_mark_node;
14811 TREE_TYPE (node) = void_type_node;
14812 TREE_SIDE_EFFECTS (node) = 1;
14816 /* 14.8 The if Statement */
14819 build_if_else_statement (location, expression, if_body, else_body)
14821 tree expression, if_body, else_body;
14825 else_body = empty_stmt_node;
14826 node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
14827 EXPR_WFL_LINECOL (node) = location;
14828 node = build_debugable_stmt (location, node);
14833 patch_if_else_statement (node)
14836 tree expression = TREE_OPERAND (node, 0);
14837 int can_complete_normally
14838 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
14839 | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
14841 TREE_TYPE (node) = error_mark_node;
14842 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14844 /* The type of expression must be boolean */
14845 if (TREE_TYPE (expression) != boolean_type_node
14846 && TREE_TYPE (expression) != promoted_boolean_type_node)
14848 parse_error_context
14850 "Incompatible type for `if'. Can't convert `%s' to `boolean'",
14851 lang_printable_name (TREE_TYPE (expression), 0));
14852 return error_mark_node;
14855 if (TREE_CODE (expression) == INTEGER_CST)
14857 if (integer_zerop (expression))
14858 node = TREE_OPERAND (node, 2);
14860 node = TREE_OPERAND (node, 1);
14861 if (CAN_COMPLETE_NORMALLY (node) != can_complete_normally)
14863 node = build (COMPOUND_EXPR, void_type_node, node, empty_stmt_node);
14864 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14868 TREE_TYPE (node) = void_type_node;
14869 TREE_SIDE_EFFECTS (node) = 1;
14870 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14874 /* 14.6 Labeled Statements */
14876 /* Action taken when a lableled statement is parsed. a new
14877 LABELED_BLOCK_EXPR is created. No statement is attached to the
14878 label, yet. LABEL can be NULL_TREE for artificially-generated blocks. */
14881 build_labeled_block (location, label)
14886 tree label_decl, node;
14887 if (label == NULL_TREE || label == continue_identifier_node)
14888 label_name = label;
14891 label_name = merge_qualified_name (label_id, label);
14892 /* Issue an error if we try to reuse a label that was previously
14894 if (IDENTIFIER_LOCAL_VALUE (label_name))
14896 EXPR_WFL_LINECOL (wfl_operator) = location;
14897 parse_error_context (wfl_operator,
14898 "Declaration of `%s' shadows a previous label declaration",
14899 IDENTIFIER_POINTER (label));
14900 EXPR_WFL_LINECOL (wfl_operator) =
14901 EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
14902 parse_error_context (wfl_operator,
14903 "This is the location of the previous declaration of label `%s'",
14904 IDENTIFIER_POINTER (label));
14905 java_error_count--;
14909 label_decl = create_label_decl (label_name);
14910 node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
14911 EXPR_WFL_LINECOL (node) = location;
14912 TREE_SIDE_EFFECTS (node) = 1;
14916 /* A labeled statement LBE is attached a statement. */
14919 finish_labeled_statement (lbe, statement)
14920 tree lbe; /* Labeled block expr */
14923 /* In anyways, tie the loop to its statement */
14924 LABELED_BLOCK_BODY (lbe) = statement;
14925 pop_labeled_block ();
14926 POP_LABELED_BLOCK ();
14930 /* 14.10, 14.11, 14.12 Loop Statements */
14932 /* Create an empty LOOP_EXPR and make it the last in the nested loop
14936 build_new_loop (loop_body)
14939 tree loop = build (LOOP_EXPR, NULL_TREE, loop_body);
14940 TREE_SIDE_EFFECTS (loop) = 1;
14945 /* Create a loop body according to the following structure:
14947 COMPOUND_EXPR (loop main body)
14948 EXIT_EXPR (this order is for while/for loops.
14949 LABELED_BLOCK_EXPR the order is reversed for do loops)
14950 LABEL_DECL (a continue occurring here branches at the
14951 BODY end of this labeled block)
14954 REVERSED, if non zero, tells that the loop condition expr comes
14955 after the body, like in the do-while loop.
14957 To obtain a loop, the loop body structure described above is
14958 encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
14961 LABEL_DECL (use this label to exit the loop)
14963 <structure described above> */
14966 build_loop_body (location, condition, reversed)
14971 tree first, second, body;
14973 condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
14974 EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
14975 condition = build_debugable_stmt (location, condition);
14976 TREE_SIDE_EFFECTS (condition) = 1;
14978 body = build_labeled_block (0, continue_identifier_node);
14979 first = (reversed ? body : condition);
14980 second = (reversed ? condition : body);
14982 build (COMPOUND_EXPR, NULL_TREE,
14983 build (COMPOUND_EXPR, NULL_TREE, first, second), empty_stmt_node);
14986 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
14987 their order) on the current loop. Unlink the current loop from the
14991 finish_loop_body (location, condition, body, reversed)
14993 tree condition, body;
14996 tree to_return = ctxp->current_loop;
14997 tree loop_body = LOOP_EXPR_BODY (to_return);
15000 tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
15001 /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
15002 The real EXIT_EXPR is one operand further. */
15003 EXPR_WFL_LINECOL (cnode) = location;
15004 /* This one is for accurate error reports */
15005 EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
15006 TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
15008 LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
15013 /* Tailored version of finish_loop_body for FOR loops, when FOR
15014 loops feature the condition part */
15017 finish_for_loop (location, condition, update, body)
15019 tree condition, update, body;
15021 /* Put the condition and the loop body in place */
15022 tree loop = finish_loop_body (location, condition, body, 0);
15023 /* LOOP is the current loop which has been now popped of the loop
15024 stack. Mark the update block as reachable and install it. We do
15025 this because the (current interpretation of the) JLS requires
15026 that the update expression be considered reachable even if the
15027 for loop's body doesn't complete normally. */
15028 if (update != NULL_TREE && update != empty_stmt_node)
15031 if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
15032 up2 = EXPR_WFL_NODE (up2);
15033 /* Try to detect constraint violations. These would be
15034 programming errors somewhere. */
15035 if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
15036 || TREE_CODE (up2) == LOOP_EXPR)
15038 SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
15040 LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
15044 /* Try to find the loop a block might be related to. This comprises
15045 the case where the LOOP_EXPR is found as the second operand of a
15046 COMPOUND_EXPR, because the loop happens to have an initialization
15047 part, then expressed as the first operand of the COMPOUND_EXPR. If
15048 the search finds something, 1 is returned. Otherwise, 0 is
15049 returned. The search is assumed to start from a
15050 LABELED_BLOCK_EXPR's block. */
15053 search_loop (statement)
15056 if (TREE_CODE (statement) == LOOP_EXPR)
15059 if (TREE_CODE (statement) == BLOCK)
15060 statement = BLOCK_SUBBLOCKS (statement);
15064 if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15065 while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15066 statement = TREE_OPERAND (statement, 1);
15068 return (TREE_CODE (statement) == LOOP_EXPR
15069 && FOR_LOOP_P (statement) ? statement : NULL_TREE);
15072 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
15073 returned otherwise. */
15076 labeled_block_contains_loop_p (block, loop)
15082 if (LABELED_BLOCK_BODY (block) == loop)
15085 if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
15091 /* If the loop isn't surrounded by a labeled statement, create one and
15092 insert LOOP as its body. */
15095 patch_loop_statement (loop)
15100 TREE_TYPE (loop) = void_type_node;
15101 if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
15104 loop_label = build_labeled_block (0, NULL_TREE);
15105 /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
15106 that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
15107 LABELED_BLOCK_BODY (loop_label) = loop;
15108 PUSH_LABELED_BLOCK (loop_label);
15112 /* 14.13, 14.14: break and continue Statements */
15114 /* Build a break or a continue statement. a null NAME indicates an
15115 unlabeled break/continue statement. */
15118 build_bc_statement (location, is_break, name)
15119 int location, is_break;
15122 tree break_continue, label_block_expr = NULL_TREE;
15126 if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
15127 (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
15128 /* Null means that we don't have a target for this named
15129 break/continue. In this case, we make the target to be the
15130 label name, so that the error can be reported accuratly in
15131 patch_bc_statement. */
15132 label_block_expr = EXPR_WFL_NODE (name);
15134 /* Unlabeled break/continue will be handled during the
15135 break/continue patch operation */
15137 = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
15139 IS_BREAK_STMT_P (break_continue) = is_break;
15140 TREE_SIDE_EFFECTS (break_continue) = 1;
15141 EXPR_WFL_LINECOL (break_continue) = location;
15142 break_continue = build_debugable_stmt (location, break_continue);
15143 return break_continue;
15146 /* Verification of a break/continue statement. */
15149 patch_bc_statement (node)
15152 tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
15153 tree labeled_block = ctxp->current_labeled_block;
15154 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15156 /* Having an identifier here means that the target is unknown. */
15157 if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
15159 parse_error_context (wfl_operator, "No label definition found for `%s'",
15160 IDENTIFIER_POINTER (bc_label));
15161 return error_mark_node;
15163 if (! IS_BREAK_STMT_P (node))
15165 /* It's a continue statement. */
15166 for (;; labeled_block = TREE_CHAIN (labeled_block))
15168 if (labeled_block == NULL_TREE)
15170 if (bc_label == NULL_TREE)
15171 parse_error_context (wfl_operator,
15172 "`continue' must be in loop");
15174 parse_error_context
15175 (wfl_operator, "continue label `%s' does not name a loop",
15176 IDENTIFIER_POINTER (bc_label));
15177 return error_mark_node;
15179 if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
15180 == continue_identifier_node)
15181 && (bc_label == NULL_TREE
15182 || TREE_CHAIN (labeled_block) == bc_label))
15184 bc_label = labeled_block;
15189 else if (!bc_label)
15191 for (;; labeled_block = TREE_CHAIN (labeled_block))
15193 if (labeled_block == NULL_TREE)
15195 parse_error_context (wfl_operator,
15196 "`break' must be in loop or switch");
15197 return error_mark_node;
15199 target_stmt = LABELED_BLOCK_BODY (labeled_block);
15200 if (TREE_CODE (target_stmt) == SWITCH_EXPR
15201 || search_loop (target_stmt))
15203 bc_label = labeled_block;
15209 EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
15210 CAN_COMPLETE_NORMALLY (bc_label) = 1;
15212 /* Our break/continue don't return values. */
15213 TREE_TYPE (node) = void_type_node;
15214 /* Encapsulate the break within a compound statement so that it's
15215 expanded all the times by expand_expr (and not clobbered
15216 sometimes, like after a if statement) */
15217 node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
15218 TREE_SIDE_EFFECTS (node) = 1;
15222 /* Process the exit expression belonging to a loop. Its type must be
15226 patch_exit_expr (node)
15229 tree expression = TREE_OPERAND (node, 0);
15230 TREE_TYPE (node) = error_mark_node;
15231 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15233 /* The type of expression must be boolean */
15234 if (TREE_TYPE (expression) != boolean_type_node)
15236 parse_error_context
15238 "Incompatible type for loop conditional. Can't convert `%s' to `boolean'",
15239 lang_printable_name (TREE_TYPE (expression), 0));
15240 return error_mark_node;
15242 /* Now we know things are allright, invert the condition, fold and
15244 TREE_OPERAND (node, 0) =
15245 fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
15247 if (! integer_zerop (TREE_OPERAND (node, 0))
15248 && ctxp->current_loop != NULL_TREE
15249 && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
15250 CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
15251 if (! integer_onep (TREE_OPERAND (node, 0)))
15252 CAN_COMPLETE_NORMALLY (node) = 1;
15255 TREE_TYPE (node) = void_type_node;
15259 /* 14.9 Switch statement */
15262 patch_switch_statement (node)
15265 tree se = TREE_OPERAND (node, 0), se_type;
15268 /* Complete the switch expression */
15269 se = TREE_OPERAND (node, 0) = java_complete_tree (se);
15270 se_type = TREE_TYPE (se);
15271 /* The type of the switch expression must be char, byte, short or
15273 if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
15275 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15276 parse_error_context (wfl_operator,
15277 "Incompatible type for `switch'. Can't convert `%s' to `int'",
15278 lang_printable_name (se_type, 0));
15279 /* This is what java_complete_tree will check */
15280 TREE_OPERAND (node, 0) = error_mark_node;
15281 return error_mark_node;
15284 /* Save and restore the outer case label list. */
15285 save = case_label_list;
15286 case_label_list = NULL_TREE;
15288 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
15290 /* See if we've found a duplicate label. We can't leave this until
15291 code generation, because in `--syntax-only' and `-C' modes we
15292 don't do ordinary code generation. */
15293 for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
15295 HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
15297 for (subiter = TREE_CHAIN (iter);
15298 subiter != NULL_TREE;
15299 subiter = TREE_CHAIN (subiter))
15301 HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
15304 EXPR_WFL_LINECOL (wfl_operator)
15305 = EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
15306 /* The case_label_list is in reverse order, so print the
15307 outer label first. */
15308 parse_error_context (wfl_operator, "duplicate case label: `"
15309 HOST_WIDE_INT_PRINT_DEC "'", subval);
15310 EXPR_WFL_LINECOL (wfl_operator)
15311 = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
15312 parse_error_context (wfl_operator, "original label is here");
15319 case_label_list = save;
15321 /* Ready to return */
15322 if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
15324 TREE_TYPE (node) = error_mark_node;
15325 return error_mark_node;
15327 TREE_TYPE (node) = void_type_node;
15328 TREE_SIDE_EFFECTS (node) = 1;
15329 CAN_COMPLETE_NORMALLY (node)
15330 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15331 || ! SWITCH_HAS_DEFAULT (node);
15337 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15338 might be NULL_TREE. */
15340 build_assertion (location, condition, value)
15342 tree condition, value;
15345 tree klass = GET_CPC ();
15347 if (! CLASS_USES_ASSERTIONS (klass))
15349 tree field, classdollar, id, call;
15350 tree class_type = TREE_TYPE (klass);
15352 field = add_field (class_type,
15353 get_identifier ("$assertionsDisabled"),
15355 ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
15356 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
15357 FIELD_SYNTHETIC (field) = 1;
15359 if (!TYPE_DOT_CLASS (class_type))
15360 build_dot_class_method (class_type);
15361 classdollar = build_dot_class_method_invocation (class_type);
15363 /* Call CLASS.desiredAssertionStatus(). */
15364 id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
15365 call = build (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
15366 call = make_qualified_primary (classdollar, call, location);
15367 TREE_SIDE_EFFECTS (call) = 1;
15369 /* Invert to obtain !CLASS.desiredAssertionStatus(). This may
15370 seem odd, but we do it to generate code identical to that of
15372 call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
15373 TREE_SIDE_EFFECTS (call) = 1;
15374 DECL_INITIAL (field) = call;
15376 /* Record the initializer in the initializer statement list. */
15377 call = build (MODIFY_EXPR, NULL_TREE, field, call);
15378 TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
15379 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
15380 MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
15382 CLASS_USES_ASSERTIONS (klass) = 1;
15385 if (value != NULL_TREE)
15386 value = tree_cons (NULL_TREE, value, NULL_TREE);
15388 node = build_wfl_node (get_identifier ("java"));
15389 node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
15391 node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
15394 node = build (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
15395 TREE_SIDE_EFFECTS (node) = 1;
15396 /* It is too early to use BUILD_THROW. */
15397 node = build1 (THROW_EXPR, NULL_TREE, node);
15398 TREE_SIDE_EFFECTS (node) = 1;
15400 /* We invert the condition; if we just put NODE as the `else' part
15401 then we generate weird-looking bytecode. */
15402 condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
15403 /* Check $assertionsDisabled. */
15405 = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15406 build1 (TRUTH_NOT_EXPR, NULL_TREE,
15407 build_wfl_node (get_identifier ("$assertionsDisabled"))),
15409 node = build_if_else_statement (location, condition, node, NULL_TREE);
15413 /* 14.18 The try/catch statements */
15415 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15416 catches TYPE and executes CATCH_STMTS. */
15419 encapsulate_with_try_catch (location, type, try_stmts, catch_stmts)
15421 tree type, try_stmts, catch_stmts;
15423 tree try_block, catch_clause_param, catch_block, catch;
15425 /* First build a try block */
15426 try_block = build_expr_block (try_stmts, NULL_TREE);
15428 /* Build a catch block: we need a catch clause parameter */
15429 catch_clause_param = build_decl (VAR_DECL,
15430 wpv_id, build_pointer_type (type));
15432 catch_block = build_expr_block (NULL_TREE, catch_clause_param);
15434 /* Initialize the variable and store in the block */
15435 catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param,
15436 build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
15437 add_stmt_to_block (catch_block, NULL_TREE, catch);
15439 /* Add the catch statements */
15440 add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
15442 /* Now we can build a CATCH_EXPR */
15443 catch_block = build1 (CATCH_EXPR, NULL_TREE, catch_block);
15445 return build_try_statement (location, try_block, catch_block);
15449 build_try_statement (location, try_block, catches)
15451 tree try_block, catches;
15453 tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
15454 EXPR_WFL_LINECOL (node) = location;
15459 build_try_finally_statement (location, try_block, finally)
15461 tree try_block, finally;
15463 tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
15464 EXPR_WFL_LINECOL (node) = location;
15469 patch_try_statement (node)
15472 int error_found = 0;
15473 tree try = TREE_OPERAND (node, 0);
15474 /* Exception handlers are considered in left to right order */
15475 tree catch = nreverse (TREE_OPERAND (node, 1));
15476 tree current, caught_type_list = NULL_TREE;
15478 /* Check catch clauses, if any. Every time we find an error, we try
15479 to process the next catch clause. We process the catch clause before
15480 the try block so that when processing the try block we can check thrown
15481 exceptions againts the caught type list. */
15482 for (current = catch; current; current = TREE_CHAIN (current))
15484 tree carg_decl, carg_type;
15485 tree sub_current, catch_block, catch_clause;
15488 /* At this point, the structure of the catch clause is
15489 CATCH_EXPR (catch node)
15490 BLOCK (with the decl of the parameter)
15492 MODIFY_EXPR (assignment of the catch parameter)
15493 BLOCK (catch clause block)
15495 catch_clause = TREE_OPERAND (current, 0);
15496 carg_decl = BLOCK_EXPR_DECLS (catch_clause);
15497 carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
15499 /* Catch clauses can't have more than one parameter declared,
15500 but it's already enforced by the grammar. Make sure that the
15501 only parameter of the clause statement in of class Throwable
15502 or a subclass of Throwable, but that was done earlier. The
15503 catch clause parameter type has also been resolved. */
15505 /* Just make sure that the catch clause parameter type inherits
15506 from java.lang.Throwable */
15507 if (!inherits_from_p (carg_type, throwable_type_node))
15509 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15510 parse_error_context (wfl_operator,
15511 "Can't catch class `%s'. Catch clause parameter type must be a subclass of class `java.lang.Throwable'",
15512 lang_printable_name (carg_type, 0));
15517 /* Partial check for unreachable catch statement: The catch
15518 clause is reachable iff is no earlier catch block A in
15519 the try statement such that the type of the catch
15520 clause's parameter is the same as or a subclass of the
15521 type of A's parameter */
15523 for (sub_current = catch;
15524 sub_current != current; sub_current = TREE_CHAIN (sub_current))
15526 tree sub_catch_clause, decl;
15527 sub_catch_clause = TREE_OPERAND (sub_current, 0);
15528 decl = BLOCK_EXPR_DECLS (sub_catch_clause);
15530 if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
15532 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15533 parse_error_context
15535 "`catch' not reached because of the catch clause at line %d",
15536 EXPR_WFL_LINENO (sub_current));
15537 unreachable = error_found = 1;
15541 /* Complete the catch clause block */
15542 catch_block = java_complete_tree (TREE_OPERAND (current, 0));
15543 if (catch_block == error_mark_node)
15548 if (CAN_COMPLETE_NORMALLY (catch_block))
15549 CAN_COMPLETE_NORMALLY (node) = 1;
15550 TREE_OPERAND (current, 0) = catch_block;
15555 /* Things to do here: the exception must be thrown */
15557 /* Link this type to the caught type list */
15558 caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
15561 PUSH_EXCEPTIONS (caught_type_list);
15562 if ((try = java_complete_tree (try)) == error_mark_node)
15564 if (CAN_COMPLETE_NORMALLY (try))
15565 CAN_COMPLETE_NORMALLY (node) = 1;
15568 /* Verification ends here */
15570 return error_mark_node;
15572 TREE_OPERAND (node, 0) = try;
15573 TREE_OPERAND (node, 1) = catch;
15574 TREE_TYPE (node) = void_type_node;
15578 /* 14.17 The synchronized Statement */
15581 patch_synchronized_statement (node, wfl_op1)
15582 tree node, wfl_op1;
15584 tree expr = java_complete_tree (TREE_OPERAND (node, 0));
15585 tree block = TREE_OPERAND (node, 1);
15587 tree tmp, enter, exit, expr_decl, assignment;
15589 if (expr == error_mark_node)
15591 block = java_complete_tree (block);
15595 /* We might be trying to synchronize on a STRING_CST */
15596 if ((tmp = patch_string (expr)))
15599 /* The TYPE of expr must be a reference type */
15600 if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
15602 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15603 parse_error_context (wfl_operator, "Incompatible type for `synchronized'. Can't convert `%s' to `java.lang.Object'",
15604 lang_printable_name (TREE_TYPE (expr), 0));
15605 return error_mark_node;
15608 if (flag_emit_xref)
15610 TREE_OPERAND (node, 0) = expr;
15611 TREE_OPERAND (node, 1) = java_complete_tree (block);
15612 CAN_COMPLETE_NORMALLY (node) = 1;
15616 /* Generate a try-finally for the synchronized statement, except
15617 that the handler that catches all throw exception calls
15618 _Jv_MonitorExit and then rethrow the exception.
15619 The synchronized statement is then implemented as:
15622 _Jv_MonitorEnter (expression)
15624 _Jv_MonitorExit (expression)
15628 e = _Jv_exception_info ();
15629 _Jv_MonitorExit (expression)
15633 expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
15634 BUILD_MONITOR_ENTER (enter, expr_decl);
15635 BUILD_MONITOR_EXIT (exit, expr_decl);
15636 CAN_COMPLETE_NORMALLY (enter) = 1;
15637 CAN_COMPLETE_NORMALLY (exit) = 1;
15638 assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
15639 TREE_SIDE_EFFECTS (assignment) = 1;
15640 node = build (COMPOUND_EXPR, NULL_TREE,
15641 build (COMPOUND_EXPR, NULL_TREE, assignment, enter),
15642 build (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
15643 node = build_expr_block (node, expr_decl);
15645 return java_complete_tree (node);
15648 /* 14.16 The throw Statement */
15651 patch_throw_statement (node, wfl_op1)
15652 tree node, wfl_op1;
15654 tree expr = TREE_OPERAND (node, 0);
15655 tree type = TREE_TYPE (expr);
15656 int unchecked_ok = 0, tryblock_throws_ok = 0;
15658 /* Thrown expression must be assignable to java.lang.Throwable */
15659 if (!try_reference_assignconv (throwable_type_node, expr))
15661 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15662 parse_error_context (wfl_operator,
15663 "Can't throw `%s'; it must be a subclass of class `java.lang.Throwable'",
15664 lang_printable_name (type, 0));
15665 /* If the thrown expression was a reference, we further the
15666 compile-time check. */
15667 if (!JREFERENCE_TYPE_P (type))
15668 return error_mark_node;
15671 /* At least one of the following must be true */
15673 /* The type of the throw expression is a not checked exception,
15674 i.e. is a unchecked expression. */
15675 unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
15677 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15678 /* An instance can't throw a checked exception unless that exception
15679 is explicitly declared in the `throws' clause of each
15680 constructor. This doesn't apply to anonymous classes, since they
15681 don't have declared constructors. */
15683 && DECL_INSTINIT_P (current_function_decl)
15684 && !ANONYMOUS_CLASS_P (current_class))
15687 for (current = TYPE_METHODS (current_class); current;
15688 current = TREE_CHAIN (current))
15689 if (DECL_CONSTRUCTOR_P (current)
15690 && !check_thrown_exceptions_do (TREE_TYPE (expr)))
15692 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)",
15693 lang_printable_name (TREE_TYPE (expr), 0));
15694 return error_mark_node;
15698 /* Throw is contained in a try statement and at least one catch
15699 clause can receive the thrown expression or the current method is
15700 declared to throw such an exception. Or, the throw statement is
15701 contained in a method or constructor declaration and the type of
15702 the Expression is assignable to at least one type listed in the
15703 throws clause the declaration. */
15705 tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
15706 if (!(unchecked_ok || tryblock_throws_ok))
15708 /* If there is a surrounding try block that has no matching
15709 clatch clause, report it first. A surrounding try block exits
15710 only if there is something after the list of checked
15711 exception thrown by the current function (if any). */
15712 if (IN_TRY_BLOCK_P ())
15713 parse_error_context (wfl_operator, "Checked exception `%s' can't be caught by any of the catch clause(s) of the surrounding `try' block",
15714 lang_printable_name (type, 0));
15715 /* If we have no surrounding try statement and the method doesn't have
15716 any throws, report it now. FIXME */
15718 /* We report that the exception can't be throw from a try block
15719 in all circumstances but when the `throw' is inside a static
15721 else if (!EXCEPTIONS_P (currently_caught_type_list)
15722 && !tryblock_throws_ok)
15724 if (DECL_CLINIT_P (current_function_decl))
15725 parse_error_context (wfl_operator,
15726 "Checked exception `%s' can't be thrown in initializer",
15727 lang_printable_name (type, 0));
15729 parse_error_context (wfl_operator,
15730 "Checked exception `%s' isn't thrown from a `try' block",
15731 lang_printable_name (type, 0));
15733 /* Otherwise, the current method doesn't have the appropriate
15734 throws declaration */
15736 parse_error_context (wfl_operator, "Checked exception `%s' doesn't match any of current method's `throws' declaration(s)",
15737 lang_printable_name (type, 0));
15738 return error_mark_node;
15741 if (! flag_emit_class_files && ! flag_emit_xref)
15742 BUILD_THROW (node, expr);
15744 /* If doing xrefs, keep the location where the `throw' was seen. */
15745 if (flag_emit_xref)
15746 EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
15750 /* Check that exception said to be thrown by method DECL can be
15751 effectively caught from where DECL is invoked. */
15754 check_thrown_exceptions (location, decl)
15759 /* For all the unchecked exceptions thrown by DECL */
15760 for (throws = DECL_FUNCTION_THROWS (decl); throws;
15761 throws = TREE_CHAIN (throws))
15762 if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
15765 /* Temporary hack to suppresses errors about cloning arrays. FIXME */
15766 if (DECL_NAME (decl) == get_identifier ("clone"))
15769 EXPR_WFL_LINECOL (wfl_operator) = location;
15770 if (DECL_FINIT_P (current_function_decl))
15771 parse_error_context
15772 (wfl_operator, "Exception `%s' can't be thrown in initializer",
15773 lang_printable_name (TREE_VALUE (throws), 0));
15776 parse_error_context
15777 (wfl_operator, "Exception `%s' must be caught, or it must be declared in the `throws' clause of `%s'",
15778 lang_printable_name (TREE_VALUE (throws), 0),
15779 (DECL_INIT_P (current_function_decl) ?
15780 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
15781 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
15786 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
15787 try-catch blocks, OR is listed in the `throws' clause of the
15791 check_thrown_exceptions_do (exception)
15794 tree list = currently_caught_type_list;
15795 resolve_and_layout (exception, NULL_TREE);
15796 /* First, all the nested try-catch-finally at that stage. The
15797 last element contains `throws' clause exceptions, if any. */
15798 if (IS_UNCHECKED_EXCEPTION_P (exception))
15803 for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
15804 if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
15806 list = TREE_CHAIN (list);
15812 purge_unchecked_exceptions (mdecl)
15815 tree throws = DECL_FUNCTION_THROWS (mdecl);
15816 tree new = NULL_TREE;
15820 tree next = TREE_CHAIN (throws);
15821 if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
15823 TREE_CHAIN (throws) = new;
15828 /* List is inverted here, but it doesn't matter */
15829 DECL_FUNCTION_THROWS (mdecl) = new;
15832 /* This function goes over all of CLASS_TYPE ctors and checks whether
15833 each of them features at least one unchecked exception in its
15834 `throws' clause. If it's the case, it returns `true', `false'
15838 ctors_unchecked_throws_clause_p (class_type)
15843 for (current = TYPE_METHODS (class_type); current;
15844 current = TREE_CHAIN (current))
15846 bool ctu = false; /* Ctor Throws Unchecked */
15847 if (DECL_CONSTRUCTOR_P (current))
15850 for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
15851 throws = TREE_CHAIN (throws))
15852 if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
15855 /* We return false as we found one ctor that is unfit. */
15856 if (!ctu && DECL_CONSTRUCTOR_P (current))
15859 /* All ctors feature at least one unchecked exception in their
15860 `throws' clause. */
15864 /* 15.24 Conditional Operator ?: */
15867 patch_conditional_expr (node, wfl_cond, wfl_op1)
15868 tree node, wfl_cond, wfl_op1;
15870 tree cond = TREE_OPERAND (node, 0);
15871 tree op1 = TREE_OPERAND (node, 1);
15872 tree op2 = TREE_OPERAND (node, 2);
15873 tree resulting_type = NULL_TREE;
15874 tree t1, t2, patched;
15875 int error_found = 0;
15877 /* Operands of ?: might be StringBuffers crafted as a result of a
15878 string concatenation. Obtain a descent operand here. */
15879 if ((patched = patch_string (op1)))
15880 TREE_OPERAND (node, 1) = op1 = patched;
15881 if ((patched = patch_string (op2)))
15882 TREE_OPERAND (node, 2) = op2 = patched;
15884 t1 = TREE_TYPE (op1);
15885 t2 = TREE_TYPE (op2);
15887 /* The first expression must be a boolean */
15888 if (TREE_TYPE (cond) != boolean_type_node)
15890 SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
15891 parse_error_context (wfl_operator,
15892 "Incompatible type for `?:'. Can't convert `%s' to `boolean'",
15893 lang_printable_name (TREE_TYPE (cond), 0));
15897 /* Second and third can be numeric, boolean (i.e. primitive),
15898 references or null. Anything else results in an error */
15899 if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
15900 || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
15901 && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
15902 || (t1 == boolean_type_node && t2 == boolean_type_node)))
15905 /* Determine the type of the conditional expression. Same types are
15906 easy to deal with */
15908 resulting_type = t1;
15910 /* There are different rules for numeric types */
15911 else if (JNUMERIC_TYPE_P (t1))
15913 /* if byte/short found, the resulting type is short */
15914 if ((t1 == byte_type_node && t2 == short_type_node)
15915 || (t1 == short_type_node && t2 == byte_type_node))
15916 resulting_type = short_type_node;
15918 /* If t1 is a constant int and t2 is of type byte, short or char
15919 and t1's value fits in t2, then the resulting type is t2 */
15920 else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
15921 && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
15922 resulting_type = t2;
15924 /* If t2 is a constant int and t1 is of type byte, short or char
15925 and t2's value fits in t1, then the resulting type is t1 */
15926 else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
15927 && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
15928 resulting_type = t1;
15930 /* Otherwise, binary numeric promotion is applied and the
15931 resulting type is the promoted type of operand 1 and 2 */
15933 resulting_type = binary_numeric_promotion (t1, t2,
15934 &TREE_OPERAND (node, 1),
15935 &TREE_OPERAND (node, 2));
15938 /* Cases of a reference and a null type */
15939 else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
15940 resulting_type = t1;
15942 else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
15943 resulting_type = t2;
15945 /* Last case: different reference types. If a type can be converted
15946 into the other one by assignment conversion, the latter
15947 determines the type of the expression */
15948 else if ((resulting_type = try_reference_assignconv (t1, op2)))
15949 resulting_type = promote_type (t1);
15951 else if ((resulting_type = try_reference_assignconv (t2, op1)))
15952 resulting_type = promote_type (t2);
15954 /* If we don't have any resulting type, we're in trouble */
15955 if (!resulting_type)
15957 char *t = xstrdup (lang_printable_name (t1, 0));
15958 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15959 parse_error_context (wfl_operator,
15960 "Incompatible type for `?:'. Can't convert `%s' to `%s'",
15961 t, lang_printable_name (t2, 0));
15968 TREE_TYPE (node) = error_mark_node;
15969 return error_mark_node;
15972 TREE_TYPE (node) = resulting_type;
15973 TREE_SET_CODE (node, COND_EXPR);
15974 CAN_COMPLETE_NORMALLY (node) = 1;
15978 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
15981 maybe_build_class_init_for_field (decl, expr)
15984 tree clas = DECL_CONTEXT (decl);
15985 if (flag_emit_class_files || flag_emit_xref)
15988 if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
15989 && FIELD_FINAL (decl))
15991 tree init = DECL_INITIAL (decl);
15992 if (init != NULL_TREE)
15993 init = fold_constant_for_init (init, decl);
15994 if (init != NULL_TREE && CONSTANT_VALUE_P (init))
15998 return build_class_init (clas, expr);
16001 /* Try to constant fold NODE.
16002 If NODE is not a constant expression, return NULL_EXPR.
16003 CONTEXT is a static final VAR_DECL whose initializer we are folding. */
16006 fold_constant_for_init (node, context)
16010 tree op0, op1, val;
16011 enum tree_code code = TREE_CODE (node);
16023 case TRUNC_MOD_EXPR:
16031 case TRUTH_ANDIF_EXPR:
16032 case TRUTH_ORIF_EXPR:
16039 op0 = TREE_OPERAND (node, 0);
16040 op1 = TREE_OPERAND (node, 1);
16041 val = fold_constant_for_init (op0, context);
16042 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16044 TREE_OPERAND (node, 0) = val;
16045 val = fold_constant_for_init (op1, context);
16046 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16048 TREE_OPERAND (node, 1) = val;
16049 return patch_binop (node, op0, op1);
16051 case UNARY_PLUS_EXPR:
16053 case TRUTH_NOT_EXPR:
16056 op0 = TREE_OPERAND (node, 0);
16057 val = fold_constant_for_init (op0, context);
16058 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16060 TREE_OPERAND (node, 0) = val;
16061 return patch_unaryop (node, op0);
16065 val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
16066 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16068 TREE_OPERAND (node, 0) = val;
16069 val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
16070 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16072 TREE_OPERAND (node, 1) = val;
16073 val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
16074 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16076 TREE_OPERAND (node, 2) = val;
16077 return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
16078 : TREE_OPERAND (node, 2);
16082 if (! FIELD_FINAL (node)
16083 || DECL_INITIAL (node) == NULL_TREE)
16085 val = DECL_INITIAL (node);
16086 /* Guard against infinite recursion. */
16087 DECL_INITIAL (node) = NULL_TREE;
16088 val = fold_constant_for_init (val, node);
16089 DECL_INITIAL (node) = val;
16092 case EXPR_WITH_FILE_LOCATION:
16093 /* Compare java_complete_tree and resolve_expression_name. */
16094 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
16095 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
16097 tree name = EXPR_WFL_NODE (node);
16099 if (PRIMARY_P (node))
16101 else if (! QUALIFIED_P (name))
16103 decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
16104 if (decl == NULL_TREE
16105 || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
16107 return fold_constant_for_init (decl, decl);
16111 /* Install the proper context for the field resolution.
16112 The prior context is restored once the name is
16113 properly qualified. */
16114 tree saved_current_class = current_class;
16115 /* Wait until the USE_COMPONENT_REF re-write. FIXME. */
16116 current_class = DECL_CONTEXT (context);
16117 qualify_ambiguous_name (node);
16118 current_class = saved_current_class;
16119 if (resolve_field_access (node, &decl, NULL)
16120 && decl != NULL_TREE)
16121 return fold_constant_for_init (decl, decl);
16127 op0 = TREE_OPERAND (node, 0);
16128 val = fold_constant_for_init (op0, context);
16129 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16131 TREE_OPERAND (node, 0) = val;
16135 #ifdef USE_COMPONENT_REF
16137 case COMPONENT_REF:
16146 #ifdef USE_COMPONENT_REF
16147 /* Context is 'T' for TypeName, 'P' for PackageName,
16148 'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16151 resolve_simple_name (name, context)
16158 resolve_qualified_name (name, context)
16165 /* Mark P, which is really a `struct parser_ctxt **' for GC. */
16168 mark_parser_ctxt (p)
16171 struct parser_ctxt *pc = *((struct parser_ctxt **) p);
16180 for (i = 0; i < ARRAY_SIZE (pc->modifier_ctx); ++i)
16181 ggc_mark_tree (pc->modifier_ctx[i]);
16182 ggc_mark_tree (pc->class_type);
16183 ggc_mark_tree (pc->function_decl);
16184 ggc_mark_tree (pc->package);
16185 ggc_mark_tree (pc->class_list);
16186 ggc_mark_tree (pc->current_parsed_class);
16187 ggc_mark_tree (pc->current_parsed_class_un);
16188 ggc_mark_tree (pc->non_static_initialized);
16189 ggc_mark_tree (pc->static_initialized);
16190 ggc_mark_tree (pc->instance_initializers);
16191 ggc_mark_tree (pc->import_list);
16192 ggc_mark_tree (pc->import_demand_list);
16193 ggc_mark_tree (pc->current_loop);
16194 ggc_mark_tree (pc->current_labeled_block);
16195 #endif /* JC1_LITE */
16198 mark_parser_ctxt (&pc->next);
16204 /* Sanity check; we've been bit by this before. */
16205 if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
16211 /* This section deals with the functions that are called when tables
16212 recording class initialization information are traversed. */
16214 /* Attach to PTR (a block) the declaration found in ENTRY. */
16217 attach_init_test_initialization_flags (entry, ptr)
16221 tree block = (tree)ptr;
16222 struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
16224 TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
16225 BLOCK_EXPR_DECLS (block) = ite->value;
16229 /* This function is called for each classes that is known definitely
16230 assigned when a given static method was called. This function
16231 augments a compound expression (INFO) storing all assignment to
16232 initialized static class flags if a flag already existed, otherwise
16233 a new one is created. */
16236 emit_test_initialization (entry_p, info)
16240 tree l = (tree) info;
16242 tree key = (tree) *entry_p;
16244 htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
16246 /* If we haven't found a flag and we're dealing with self registered
16247 with current_function_decl, then don't do anything. Self is
16248 always added as definitely initialized but this information is
16249 valid only if used outside the current function. */
16250 if (current_function_decl == TREE_PURPOSE (l)
16251 && java_treetreehash_find (cf_ht, key) == NULL)
16254 ite = java_treetreehash_new (cf_ht, key);
16256 /* If we don't have a variable, create one and install it. */
16261 decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
16262 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
16263 LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
16264 DECL_CONTEXT (decl) = current_function_decl;
16265 DECL_INITIAL (decl) = boolean_true_node;
16267 /* The trick is to find the right context for it. */
16268 block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
16269 TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
16270 BLOCK_EXPR_DECLS (block) = decl;
16276 /* Now simply augment the compound that holds all the assignments
16277 pertaining to this method invocation. */
16278 init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
16279 TREE_SIDE_EFFECTS (init) = 1;
16280 TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
16281 TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
16286 #include "gt-java-parse.h"
16287 #include "gtype-java.h"