1 /* Source code parsing and tree node generation for the GNU compiler
2 for the Java(TM) language.
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
4 Free Software Foundation, Inc.
5 Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA.
24 Java and all Java-based marks are trademarks or registered trademarks
25 of Sun Microsystems, Inc. in the United States and other countries.
26 The Free Software Foundation is independent of Sun Microsystems, Inc. */
28 /* This file parses java source code and issues a tree node image
29 suitable for code generation (byte code and targeted CPU assembly
32 The grammar conforms to the Java grammar described in "The Java(TM)
33 Language Specification. J. Gosling, B. Joy, G. Steele. Addison Wesley
34 1996, ISBN 0-201-63451-1"
36 The following modifications were brought to the original grammar:
38 method_body: added the rule '| block SC_TK'
39 static_initializer: added the rule 'static block SC_TK'.
41 Note: All the extra rules described above should go away when the
42 empty_statement rule will work.
44 statement_nsi: 'nsi' should be read no_short_if.
46 Some rules have been modified to support JDK1.1 inner classes
47 definitions and other extensions. */
52 #include "coretypes.h"
61 #include "java-tree.h"
73 #include "tree-inline.h"
77 /* Local function prototypes */
78 static char *java_accstring_lookup (int);
79 static const char *accessibility_string (int);
80 static void classitf_redefinition_error (const char *,tree, tree, tree);
81 static void variable_redefinition_error (tree, tree, tree, int);
82 static tree create_class (int, tree, tree, tree);
83 static tree create_interface (int, tree, tree);
84 static void end_class_declaration (int);
85 static tree find_field (tree, tree);
86 static tree lookup_field_wrapper (tree, tree);
87 static int duplicate_declaration_error_p (tree, tree, tree);
88 static void register_fields (int, tree, tree);
89 static tree parser_qualified_classname (tree);
90 static int parser_check_super (tree, tree, tree);
91 static int parser_check_super_interface (tree, tree, tree);
92 static void check_modifiers_consistency (int);
93 static tree lookup_cl (tree);
94 static tree lookup_java_method2 (tree, tree, int);
95 static tree method_header (int, tree, tree, tree);
96 static void fix_method_argument_names (tree ,tree);
97 static tree method_declarator (tree, tree);
98 static void parse_warning_context (tree cl, const char *msg, ...)
100 static void issue_warning_error_from_context (tree, const char *msg, va_list)
101 ATTRIBUTE_PRINTF (2, 0);
102 static void parse_ctor_invocation_error (void);
103 static tree parse_jdk1_1_error (const char *);
104 static void complete_class_report_errors (jdep *);
105 static int process_imports (void);
106 static void read_import_dir (tree);
107 static int find_in_imports_on_demand (tree, tree);
108 static void find_in_imports (tree, tree);
109 static void check_inner_class_access (tree, tree, tree);
110 static int check_pkg_class_access (tree, tree, bool, tree);
111 static void register_package (tree);
112 static tree resolve_package (tree, tree *, tree *);
113 static tree resolve_class (tree, tree, tree, tree);
114 static void declare_local_variables (int, tree, tree);
115 static void dump_java_tree (enum tree_dump_index, tree);
116 static void source_start_java_method (tree);
117 static void source_end_java_method (void);
118 static tree find_name_in_single_imports (tree);
119 static void check_abstract_method_header (tree);
120 static tree lookup_java_interface_method2 (tree, tree);
121 static tree resolve_expression_name (tree, tree *);
122 static tree maybe_create_class_interface_decl (tree, tree, tree, tree);
123 static int check_class_interface_creation (int, int, tree, tree, tree, tree);
124 static tree patch_method_invocation (tree, tree, tree, int, int *, tree *);
125 static int breakdown_qualified (tree *, tree *, tree);
126 static int in_same_package (tree, tree);
127 static tree resolve_and_layout (tree, tree);
128 static tree qualify_and_find (tree, tree, tree);
129 static tree resolve_no_layout (tree, tree);
130 static int invocation_mode (tree, int);
131 static tree find_applicable_accessible_methods_list (int, tree, tree, tree);
132 static void search_applicable_methods_list (int, tree, tree, tree, tree *, tree *);
133 static tree find_most_specific_methods_list (tree);
134 static int argument_types_convertible (tree, tree);
135 static tree patch_invoke (tree, tree, tree);
136 static int maybe_use_access_method (int, tree *, tree *);
137 static tree lookup_method_invoke (int, tree, tree, tree, tree);
138 static tree register_incomplete_type (int, tree, tree, tree);
139 static tree check_inner_circular_reference (tree, tree);
140 static tree check_circular_reference (tree);
141 static tree obtain_incomplete_type (tree);
142 static tree java_complete_lhs (tree);
143 static tree java_complete_tree (tree);
144 static tree maybe_generate_pre_expand_clinit (tree);
145 static int analyze_clinit_body (tree, tree);
146 static int maybe_yank_clinit (tree);
147 static void java_complete_expand_method (tree);
148 static void java_expand_method_bodies (tree);
149 static int unresolved_type_p (tree, tree *);
150 static void create_jdep_list (struct parser_ctxt *);
151 static tree build_expr_block (tree, tree);
152 static tree enter_block (void);
153 static tree exit_block (void);
154 static tree lookup_name_in_blocks (tree);
155 static void maybe_absorb_scoping_blocks (void);
156 static tree build_method_invocation (tree, tree);
157 static tree build_new_invocation (tree, tree);
158 static tree build_assignment (int, int, tree, tree);
159 static tree build_binop (enum tree_code, int, tree, tree);
160 static tree patch_assignment (tree, tree);
161 static tree patch_binop (tree, tree, tree);
162 static tree build_unaryop (int, int, tree);
163 static tree build_incdec (int, int, tree, int);
164 static tree patch_unaryop (tree, tree);
165 static tree build_cast (int, tree, tree);
166 static tree build_null_of_type (tree);
167 static tree patch_cast (tree, tree);
168 static int valid_ref_assignconv_cast_p (tree, tree, int);
169 static int valid_builtin_assignconv_identity_widening_p (tree, tree);
170 static int valid_cast_to_p (tree, tree);
171 static int valid_method_invocation_conversion_p (tree, tree);
172 static tree try_builtin_assignconv (tree, tree, tree);
173 static tree try_reference_assignconv (tree, tree);
174 static tree build_unresolved_array_type (tree);
175 static int build_type_name_from_array_name (tree, tree *);
176 static tree build_array_from_name (tree, tree, tree, tree *);
177 static tree build_array_ref (int, tree, tree);
178 static tree patch_array_ref (tree);
179 static tree make_qualified_name (tree, tree, int);
180 static tree merge_qualified_name (tree, tree);
181 static tree make_qualified_primary (tree, tree, int);
182 static int resolve_qualified_expression_name (tree, tree *, tree *, tree *);
183 static void qualify_ambiguous_name (tree);
184 static tree resolve_field_access (tree, tree *, tree *);
185 static tree build_newarray_node (tree, tree, int);
186 static tree patch_newarray (tree);
187 static tree resolve_type_during_patch (tree);
188 static tree build_this (int);
189 static tree build_wfl_wrap (tree, int);
190 static tree build_return (int, tree);
191 static tree patch_return (tree);
192 static tree maybe_access_field (tree, tree, tree);
193 static int complete_function_arguments (tree);
194 static int check_for_static_method_reference (tree, tree, tree, tree, tree);
195 static int not_accessible_p (tree, tree, tree, int);
196 static void check_deprecation (tree, tree);
197 static int class_in_current_package (tree);
198 static tree build_if_else_statement (int, tree, tree, tree);
199 static tree patch_if_else_statement (tree);
200 static tree add_stmt_to_compound (tree, tree, tree);
201 static tree add_stmt_to_block (tree, tree, tree);
202 static tree patch_exit_expr (tree);
203 static tree build_labeled_block (int, tree);
204 static tree finish_labeled_statement (tree, tree);
205 static tree build_bc_statement (int, int, tree);
206 static tree patch_bc_statement (tree);
207 static tree patch_loop_statement (tree);
208 static tree build_new_loop (tree);
209 static tree build_loop_body (int, tree, int);
210 static tree finish_loop_body (int, tree, tree, int);
211 static tree build_debugable_stmt (int, tree);
212 static tree finish_for_loop (int, tree, tree, tree);
213 static tree patch_switch_statement (tree);
214 static tree string_constant_concatenation (tree, tree);
215 static tree build_string_concatenation (tree, tree);
216 static tree patch_string_cst (tree);
217 static tree patch_string (tree);
218 static tree encapsulate_with_try_catch (int, tree, tree, tree);
219 static tree build_assertion (int, tree, tree);
220 static tree build_try_statement (int, tree, tree);
221 static tree build_try_finally_statement (int, tree, tree);
222 static tree patch_try_statement (tree);
223 static tree patch_synchronized_statement (tree, tree);
224 static tree patch_throw_statement (tree, tree);
225 static void check_thrown_exceptions (int, tree, tree);
226 static int check_thrown_exceptions_do (tree);
227 static void purge_unchecked_exceptions (tree);
228 static bool ctors_unchecked_throws_clause_p (tree);
229 static void check_concrete_throws_clauses (tree, tree, tree, tree);
230 static void check_throws_clauses (tree, tree, tree);
231 static void finish_method_declaration (tree);
232 static tree build_super_invocation (tree);
233 static int verify_constructor_circularity (tree, tree);
234 static char *constructor_circularity_msg (tree, tree);
235 static tree build_this_super_qualified_invocation (int, tree, tree, int, int);
236 static const char *get_printable_method_name (tree);
237 static tree patch_conditional_expr (tree, tree, tree);
238 static tree generate_finit (tree);
239 static tree generate_instinit (tree);
240 static tree build_instinit_invocation (tree);
241 static void fix_constructors (tree);
242 static tree build_alias_initializer_parameter_list (int, tree, tree, int *);
243 static tree craft_constructor (tree, tree);
244 static int verify_constructor_super (tree);
245 static tree create_artificial_method (tree, int, tree, tree, tree);
246 static void start_artificial_method_body (tree);
247 static void end_artificial_method_body (tree);
248 static int check_method_redefinition (tree, tree);
249 static int check_method_types_complete (tree);
250 static bool hack_is_accessible_p (tree, tree);
251 static void java_check_regular_methods (tree);
252 static void check_interface_throws_clauses (tree, tree);
253 static void java_check_abstract_methods (tree);
254 static void unreachable_stmt_error (tree);
255 static int not_accessible_field_error (tree, tree);
256 static tree find_expr_with_wfl (tree);
257 static void missing_return_error (tree);
258 static tree build_new_array_init (int, tree);
259 static tree patch_new_array_init (tree, tree);
260 static tree maybe_build_array_element_wfl (tree);
261 static int array_constructor_check_entry (tree, tree);
262 static const char *purify_type_name (const char *);
263 static tree fold_constant_for_init (tree, tree);
264 static tree strip_out_static_field_access_decl (tree);
265 static jdeplist *reverse_jdep_list (struct parser_ctxt *);
266 static void static_ref_err (tree, tree, tree);
267 static void parser_add_interface (tree, tree, tree);
268 static void add_superinterfaces (tree, tree);
269 static tree jdep_resolve_class (jdep *);
270 static int note_possible_classname (const char *, int);
271 static void java_complete_expand_classes (void);
272 static void java_complete_expand_class (tree);
273 static void java_complete_expand_methods (tree);
274 static tree cut_identifier_in_qualified (tree);
275 static tree java_stabilize_reference (tree);
276 static tree do_unary_numeric_promotion (tree);
277 static char * operator_string (tree);
278 static tree do_merge_string_cste (tree, const char *, int, int);
279 static tree merge_string_cste (tree, tree, int);
280 static tree java_refold (tree);
281 static int java_decl_equiv (tree, tree);
282 static int binop_compound_p (enum tree_code);
283 static tree search_loop (tree);
284 static int labeled_block_contains_loop_p (tree, tree);
285 static int check_abstract_method_definitions (int, tree, tree);
286 static void java_check_abstract_method_definitions (tree);
287 static void java_debug_context_do (int);
288 static void java_parser_context_push_initialized_field (void);
289 static void java_parser_context_pop_initialized_field (void);
290 static tree reorder_static_initialized (tree);
291 static void java_parser_context_suspend (void);
292 static void java_parser_context_resume (void);
293 static int pop_current_osb (struct parser_ctxt *);
295 /* JDK 1.1 work. FIXME */
297 static tree maybe_make_nested_class_name (tree);
298 static int make_nested_class_name (tree);
299 static void set_nested_class_simple_name_value (tree, int);
300 static void link_nested_class_to_enclosing (void);
301 static tree resolve_inner_class (htab_t, tree, tree *, tree *, tree);
302 static tree find_as_inner_class (tree, tree, tree);
303 static tree find_as_inner_class_do (tree, tree);
304 static int check_inner_class_redefinition (tree, tree);
306 static tree build_thisn_assign (void);
307 static tree build_current_thisn (tree);
308 static tree build_access_to_thisn (tree, tree, int);
309 static tree maybe_build_thisn_access_method (tree);
311 static tree build_outer_field_access (tree, tree);
312 static tree build_outer_field_access_methods (tree);
313 static tree build_outer_field_access_expr (int, tree, tree,
315 static tree build_outer_method_access_method (tree);
316 static tree build_new_access_id (void);
317 static tree build_outer_field_access_method (tree, tree, tree,
320 static int outer_field_access_p (tree, tree);
321 static int outer_field_expanded_access_p (tree, tree *,
323 static tree outer_field_access_fix (tree, tree, tree);
324 static tree build_incomplete_class_ref (int, tree);
325 static tree patch_incomplete_class_ref (tree);
326 static tree create_anonymous_class (int, tree);
327 static void patch_anonymous_class (tree, tree, tree);
328 static void add_inner_class_fields (tree, tree);
330 static tree build_dot_class_method (tree);
331 static tree build_dot_class_method_invocation (tree, tree);
332 static void create_new_parser_context (int);
333 static tree maybe_build_class_init_for_field (tree, tree);
335 static int attach_init_test_initialization_flags (void **, void *);
336 static int emit_test_initialization (void **, void *);
338 static char *string_convert_int_cst (tree);
340 /* Number of error found so far. */
341 int java_error_count;
342 /* Number of warning found so far. */
343 int java_warning_count;
344 /* Tell when not to fold, when doing xrefs */
346 /* Cyclic inheritance report, as it can be set by layout_class */
347 const char *cyclic_inheritance_report;
349 /* The current parser context */
350 struct parser_ctxt *ctxp;
352 /* List of things that were analyzed for which code will be generated */
353 struct parser_ctxt *ctxp_for_generation = NULL;
355 /* binop_lookup maps token to tree_code. It is used where binary
356 operations are involved and required by the parser. RDIV_EXPR
357 covers both integral/floating point division. The code is changed
358 once the type of both operator is worked out. */
360 static const enum tree_code binop_lookup[19] =
362 PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR,
363 LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR,
364 BIT_AND_EXPR, BIT_XOR_EXPR, BIT_IOR_EXPR,
365 TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR,
366 EQ_EXPR, NE_EXPR, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR,
368 #define BINOP_LOOKUP(VALUE) \
369 binop_lookup [((VALUE) - PLUS_TK) % ARRAY_SIZE (binop_lookup)]
371 /* This is the end index for binary operators that can also be used
372 in compound assignments. */
373 #define BINOP_COMPOUND_CANDIDATES 11
375 /* The "$L" identifier we use to create labels. */
376 static GTY(()) tree label_id;
378 /* The "StringBuffer" identifier used for the String `+' operator. */
379 static GTY(()) tree wfl_string_buffer;
381 /* The "append" identifier used for String `+' operator. */
382 static GTY(()) tree wfl_append;
384 /* The "toString" identifier used for String `+' operator. */
385 static GTY(()) tree wfl_to_string;
387 /* The "java.lang" import qualified name. */
388 static GTY(()) tree java_lang_id;
390 /* The generated `inst$' identifier used for generated enclosing
391 instance/field access functions. */
392 static GTY(()) tree inst_id;
394 /* Context and flag for static blocks */
395 static GTY(()) tree current_static_block;
397 /* The generated `write_parm_value$' identifier. */
398 static GTY(()) tree wpv_id;
400 /* The list of all packages we've seen so far */
401 static GTY(()) tree package_list;
403 /* Hold THIS for the scope of the current method decl. */
404 static GTY(()) tree current_this;
406 /* Hold a list of catch clauses list. The first element of this list is
407 the list of the catch clauses of the currently analyzed try block. */
408 static GTY(()) tree currently_caught_type_list;
410 /* This holds a linked list of all the case labels for the current
411 switch statement. It is only used when checking to see if there
412 are duplicate labels. FIXME: probably this should just be attached
413 to the switch itself; then it could be referenced via
414 `ctxp->current_loop'. */
415 static GTY(()) tree case_label_list;
417 /* Anonymous class counter. Will be reset to 1 every time a non
418 anonymous class gets created. */
419 static int anonymous_class_counter = 1;
421 static GTY(()) tree src_parse_roots[1];
423 /* All classes seen from source code */
424 #define gclass_list src_parse_roots[0]
426 /* Check modifiers. If one doesn't fit, retrieve it in its declaration
427 line and point it out. */
428 /* Should point out the one that don't fit. ASCII/unicode, going
431 #define check_modifiers(__message, __value, __mask) do { \
432 if ((__value) & ~(__mask)) \
434 size_t i, remainder = (__value) & ~(__mask); \
435 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++) \
436 if ((1 << i) & remainder) \
437 parse_error_context (ctxp->modifier_ctx [i], (__message), \
438 java_accstring_lookup (1 << i)); \
460 /* Things defined here have to match the order of what's in the
461 binop_lookup table. */
463 %token PLUS_TK MINUS_TK MULT_TK DIV_TK REM_TK
464 %token LS_TK SRS_TK ZRS_TK
465 %token AND_TK XOR_TK OR_TK
466 %token BOOL_AND_TK BOOL_OR_TK
467 %token EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
469 /* This maps to the same binop_lookup entry than the token above */
471 %token PLUS_ASSIGN_TK MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
473 %token LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
474 %token AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
477 /* Modifier TOKEN have to be kept in this order. Don't scramble it */
479 %token PUBLIC_TK PRIVATE_TK PROTECTED_TK
480 %token STATIC_TK FINAL_TK SYNCHRONIZED_TK
481 %token VOLATILE_TK TRANSIENT_TK NATIVE_TK
482 %token PAD_TK ABSTRACT_TK STRICT_TK
485 /* Keep those two in order, too */
486 %token DECR_TK INCR_TK
488 /* From now one, things can be in any order */
490 %token DEFAULT_TK IF_TK THROW_TK
491 %token BOOLEAN_TK DO_TK IMPLEMENTS_TK
492 %token THROWS_TK BREAK_TK IMPORT_TK
493 %token ELSE_TK INSTANCEOF_TK RETURN_TK
494 %token VOID_TK CATCH_TK INTERFACE_TK
495 %token CASE_TK EXTENDS_TK FINALLY_TK
496 %token SUPER_TK WHILE_TK CLASS_TK
497 %token SWITCH_TK CONST_TK TRY_TK
498 %token FOR_TK NEW_TK CONTINUE_TK
499 %token GOTO_TK PACKAGE_TK THIS_TK
502 %token BYTE_TK SHORT_TK INT_TK LONG_TK
503 %token CHAR_TK INTEGRAL_TK
505 %token FLOAT_TK DOUBLE_TK FP_TK
509 %token REL_QM_TK REL_CL_TK NOT_TK NEG_TK
511 %token ASSIGN_ANY_TK ASSIGN_TK
512 %token OP_TK CP_TK OCB_TK CCB_TK OSB_TK CSB_TK SC_TK C_TK DOT_TK
514 %token STRING_LIT_TK CHAR_LIT_TK INT_LIT_TK FP_LIT_TK
515 %token TRUE_TK FALSE_TK BOOL_LIT_TK NULL_TK
517 %type <value> modifiers MODIFIER_TK final synchronized
519 %type <node> super ID_TK identifier
520 %type <node> name simple_name qualified_name
521 %type <node> type_declaration compilation_unit
522 field_declaration method_declaration extends_interfaces
523 interfaces interface_type_list
524 import_declarations package_declaration
525 type_declarations interface_body
526 interface_member_declaration constant_declaration
527 interface_member_declarations interface_type
528 abstract_method_declaration
529 %type <node> class_body_declaration class_member_declaration
530 static_initializer constructor_declaration block
531 %type <node> class_body_declarations constructor_header
532 %type <node> class_or_interface_type class_type class_type_list
533 constructor_declarator explicit_constructor_invocation
534 %type <node> dim_expr dim_exprs this_or_super throws
536 %type <node> variable_declarator_id variable_declarator
537 variable_declarators variable_initializer
538 variable_initializers constructor_body
541 %type <node> class_body block_end constructor_block_end
542 %type <node> statement statement_without_trailing_substatement
543 labeled_statement if_then_statement label_decl
544 if_then_else_statement while_statement for_statement
545 statement_nsi labeled_statement_nsi do_statement
546 if_then_else_statement_nsi while_statement_nsi
547 for_statement_nsi statement_expression_list for_init
548 for_update statement_expression expression_statement
549 primary_no_new_array expression primary
550 array_creation_expression array_type
551 class_instance_creation_expression field_access
552 method_invocation array_access something_dot_new
553 argument_list postfix_expression while_expression
554 post_increment_expression post_decrement_expression
555 unary_expression_not_plus_minus unary_expression
556 pre_increment_expression pre_decrement_expression
558 multiplicative_expression additive_expression
559 shift_expression relational_expression
560 equality_expression and_expression
561 exclusive_or_expression inclusive_or_expression
562 conditional_and_expression conditional_or_expression
563 conditional_expression assignment_expression
564 left_hand_side assignment for_header for_begin
565 constant_expression do_statement_begin empty_statement
566 switch_statement synchronized_statement throw_statement
567 try_statement assert_statement
568 switch_expression switch_block
569 catches catch_clause catch_clause_parameter finally
570 anonymous_class_creation trap_overflow_corner_case
571 %type <node> return_statement break_statement continue_statement
573 %type <operator> ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
574 %type <operator> REM_ASSIGN_TK PLUS_ASSIGN_TK MINUS_ASSIGN_TK
575 %type <operator> LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
576 %type <operator> AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
577 %type <operator> ASSIGN_ANY_TK assignment_operator
578 %token <operator> EQ_TK GTE_TK ZRS_TK SRS_TK GT_TK LTE_TK LS_TK
579 %token <operator> BOOL_AND_TK AND_TK BOOL_OR_TK OR_TK INCR_TK PLUS_TK
580 %token <operator> DECR_TK MINUS_TK MULT_TK DIV_TK XOR_TK REM_TK NEQ_TK
581 %token <operator> NEG_TK REL_QM_TK REL_CL_TK NOT_TK LT_TK OCB_TK CCB_TK
582 %token <operator> OP_TK OSB_TK DOT_TK THROW_TK INSTANCEOF_TK
583 %type <operator> THIS_TK SUPER_TK RETURN_TK BREAK_TK CONTINUE_TK
584 %type <operator> CASE_TK DEFAULT_TK TRY_TK CATCH_TK SYNCHRONIZED_TK
585 %type <operator> NEW_TK ASSERT_TK
587 %type <node> method_body
589 %type <node> literal INT_LIT_TK FP_LIT_TK BOOL_LIT_TK CHAR_LIT_TK
590 STRING_LIT_TK NULL_TK VOID_TK
592 %type <node> IF_TK WHILE_TK FOR_TK
594 %type <node> formal_parameter_list formal_parameter
595 method_declarator method_header
597 %type <node> primitive_type reference_type type
598 BOOLEAN_TK INTEGRAL_TK FP_TK
600 /* Added or modified JDK 1.1 rule types */
601 %type <node> type_literals
604 /* 19.2 Production from 2.3: The Syntactic Grammar */
605 goal: compilation_unit
609 /* 19.3 Productions from 3: Lexical structure */
619 /* 19.4 Productions from 4: Types, Values and Variables */
632 class_or_interface_type
636 class_or_interface_type:
641 class_or_interface_type /* Default rule */
645 class_or_interface_type
651 int osb = pop_current_osb (ctxp);
652 tree t = build_java_array_type (($1), -1);
654 t = build_unresolved_array_type (t);
659 int osb = pop_current_osb (ctxp);
662 t = build_unresolved_array_type (t);
667 /* 19.5 Productions from 6: Names */
669 simple_name /* Default rule */
670 | qualified_name /* Default rule */
674 identifier /* Default rule */
678 name DOT_TK identifier
679 { $$ = make_qualified_name ($1, $3, $2.location); }
686 /* 19.6: Production from 7: Packages */
689 | package_declaration
690 | import_declarations
692 | package_declaration import_declarations
693 | package_declaration type_declarations
694 | import_declarations type_declarations
695 | package_declaration import_declarations type_declarations
703 | import_declarations import_declaration
711 | type_declarations type_declaration
715 PACKAGE_TK name SC_TK
717 ctxp->package = EXPR_WFL_NODE ($2);
718 register_package (ctxp->package);
721 {yyerror ("Missing name"); RECOVER;}
722 | PACKAGE_TK name error
723 {yyerror ("';' expected"); RECOVER;}
727 single_type_import_declaration
728 | type_import_on_demand_declaration
731 single_type_import_declaration:
734 tree name = EXPR_WFL_NODE ($2), last_name;
735 int i = IDENTIFIER_LENGTH (name)-1;
736 const char *last = &IDENTIFIER_POINTER (name)[i];
737 while (last != IDENTIFIER_POINTER (name))
743 last_name = get_identifier (++last);
744 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (last_name))
746 tree err = find_name_in_single_imports (last_name);
747 if (err && err != name)
749 ($2, "Ambiguous class: `%s' and `%s'",
750 IDENTIFIER_POINTER (name),
751 IDENTIFIER_POINTER (err));
753 REGISTER_IMPORT ($2, last_name);
756 REGISTER_IMPORT ($2, last_name);
759 {yyerror ("Missing name"); RECOVER;}
760 | IMPORT_TK name error
761 {yyerror ("';' expected"); RECOVER;}
764 type_import_on_demand_declaration:
765 IMPORT_TK name DOT_TK MULT_TK SC_TK
767 tree name = EXPR_WFL_NODE ($2);
769 /* Search for duplicates. */
770 for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it))
771 if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name)
773 /* Don't import the same thing more than once, just ignore
774 duplicates (7.5.2) */
777 read_import_dir ($2);
778 ctxp->import_demand_list =
779 chainon (ctxp->import_demand_list,
780 build_tree_list ($2, NULL_TREE));
783 | IMPORT_TK name DOT_TK error
784 {yyerror ("'*' expected"); RECOVER;}
785 | IMPORT_TK name DOT_TK MULT_TK error
786 {yyerror ("';' expected"); RECOVER;}
791 { end_class_declaration (0); }
792 | interface_declaration
793 { end_class_declaration (0); }
798 yyerror ("Class or interface declaration expected");
802 /* 19.7 Shortened from the original:
803 modifiers: modifier | modifiers modifier
804 modifier: any of public... */
810 | modifiers MODIFIER_TK
815 (ctxp->modifier_ctx [$2], "Modifier `%s' declared twice",
816 java_accstring_lookup (acc));
824 /* 19.8.1 Production from $8.1: Class Declaration */
826 modifiers CLASS_TK identifier super interfaces
827 { create_class ($1, $3, $4, $5); }
830 | CLASS_TK identifier super interfaces
831 { create_class (0, $2, $3, $4); }
834 | modifiers CLASS_TK error
835 { yyerror ("Missing class name"); RECOVER; }
837 { yyerror ("Missing class name"); RECOVER; }
838 | CLASS_TK identifier error
840 if (!ctxp->class_err) yyerror ("'{' expected");
843 | modifiers CLASS_TK identifier error
844 { if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER; }
849 | EXTENDS_TK class_type
851 | EXTENDS_TK class_type error
852 {yyerror ("'{' expected"); ctxp->class_err=1;}
854 {yyerror ("Missing super class name"); ctxp->class_err=1;}
859 | IMPLEMENTS_TK interface_type_list
861 | IMPLEMENTS_TK error
864 yyerror ("Missing interface name");
871 ctxp->interface_number = 1;
872 $$ = build_tree_list ($1, NULL_TREE);
874 | interface_type_list C_TK interface_type
876 ctxp->interface_number++;
877 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
879 | interface_type_list C_TK error
880 {yyerror ("Missing interface name"); RECOVER;}
886 /* Store the location of the `}' when doing xrefs */
888 DECL_END_SOURCE_LINE (GET_CPC ()) =
889 EXPR_WFL_ADD_COL ($2.location, 1);
892 | OCB_TK class_body_declarations CCB_TK
894 /* Store the location of the `}' when doing xrefs */
896 DECL_END_SOURCE_LINE (GET_CPC ()) =
897 EXPR_WFL_ADD_COL ($3.location, 1);
902 class_body_declarations:
903 class_body_declaration
904 | class_body_declarations class_body_declaration
907 class_body_declaration:
908 class_member_declaration
910 | constructor_declaration
911 | block /* Added, JDK1.1, instance initializer */
913 if ($1 != empty_stmt_node)
915 TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
916 SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
921 class_member_declaration:
924 | class_declaration /* Added, JDK1.1 inner classes */
925 { end_class_declaration (1); }
926 | interface_declaration /* Added, JDK1.1 inner interfaces */
927 { end_class_declaration (1); }
931 /* 19.8.2 Productions from 8.3: Field Declarations */
933 type variable_declarators SC_TK
934 { register_fields (0, $1, $2); }
935 | modifiers type variable_declarators SC_TK
938 ("Illegal modifier `%s' for field declaration",
939 $1, FIELD_MODIFIERS);
940 check_modifiers_consistency ($1);
941 register_fields ($1, $2, $3);
945 variable_declarators:
946 /* Should we use build_decl_list () instead ? FIXME */
947 variable_declarator /* Default rule */
948 | variable_declarators C_TK variable_declarator
949 { $$ = chainon ($1, $3); }
950 | variable_declarators C_TK error
951 {yyerror ("Missing term"); RECOVER;}
955 variable_declarator_id
956 { $$ = build_tree_list ($1, NULL_TREE); }
957 | variable_declarator_id ASSIGN_TK variable_initializer
959 if (java_error_count)
962 ($1, build_assignment ($2.token, $2.location, $1, $3));
964 | variable_declarator_id ASSIGN_TK error
966 yyerror ("Missing variable initializer");
967 $$ = build_tree_list ($1, NULL_TREE);
970 | variable_declarator_id ASSIGN_TK variable_initializer error
972 yyerror ("';' expected");
973 $$ = build_tree_list ($1, NULL_TREE);
978 variable_declarator_id:
980 | variable_declarator_id OSB_TK CSB_TK
981 { $$ = build_unresolved_array_type ($1); }
983 {yyerror ("Invalid declaration"); DRECOVER(vdi);}
984 | variable_declarator_id OSB_TK error
986 yyerror ("']' expected");
989 | variable_declarator_id CSB_TK error
990 {yyerror ("Unbalanced ']'"); DRECOVER(vdi);}
993 variable_initializer:
998 /* 19.8.3 Productions from 8.4: Method Declarations */
1002 current_function_decl = $1;
1003 if (current_function_decl
1004 && TREE_CODE (current_function_decl) == FUNCTION_DECL)
1005 source_start_java_method (current_function_decl);
1007 current_function_decl = NULL_TREE;
1010 { finish_method_declaration ($3); }
1011 | method_header error
1012 {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;}
1016 type method_declarator throws
1017 { $$ = method_header (0, $1, $2, $3); }
1018 | VOID_TK method_declarator throws
1019 { $$ = method_header (0, void_type_node, $2, $3); }
1020 | modifiers type method_declarator throws
1021 { $$ = method_header ($1, $2, $3, $4); }
1022 | modifiers VOID_TK method_declarator throws
1023 { $$ = method_header ($1, void_type_node, $3, $4); }
1026 yyerror ("Invalid method declaration, method name required");
1029 | modifiers type error
1031 yyerror ("Identifier expected");
1036 yyerror ("Identifier expected");
1039 | modifiers VOID_TK error
1041 yyerror ("Identifier expected");
1046 yyerror ("Invalid method declaration, return type required");
1052 identifier OP_TK CP_TK
1054 ctxp->formal_parameter_number = 0;
1055 $$ = method_declarator ($1, NULL_TREE);
1057 | identifier OP_TK formal_parameter_list CP_TK
1058 { $$ = method_declarator ($1, $3); }
1059 | method_declarator OSB_TK CSB_TK
1061 EXPR_WFL_LINECOL (wfl_operator) = $2.location;
1063 build_unresolved_array_type (TREE_PURPOSE ($1));
1064 parse_warning_context
1066 "Discouraged form of returned type specification");
1068 | identifier OP_TK error
1069 {yyerror ("')' expected"); DRECOVER(method_declarator);}
1070 | method_declarator OSB_TK error
1071 {yyerror ("']' expected"); RECOVER;}
1074 formal_parameter_list:
1077 ctxp->formal_parameter_number = 1;
1079 | formal_parameter_list C_TK formal_parameter
1081 ctxp->formal_parameter_number += 1;
1082 $$ = chainon ($1, $3);
1084 | formal_parameter_list C_TK error
1085 { yyerror ("Missing formal parameter term"); RECOVER; }
1089 type variable_declarator_id
1091 $$ = build_tree_list ($2, $1);
1093 | final type variable_declarator_id /* Added, JDK1.1 final parms */
1095 $$ = build_tree_list ($3, $2);
1096 ARG_FINAL_P ($$) = 1;
1100 yyerror ("Missing identifier"); RECOVER;
1105 yyerror ("Missing identifier"); RECOVER;
1113 check_modifiers ("Illegal modifier `%s'. Only `final' was expected here",
1115 if ($1 != ACC_FINAL)
1116 MODIFIER_WFL (FINAL_TK) = build_wfl_node (NULL_TREE);
1122 | THROWS_TK class_type_list
1125 {yyerror ("Missing class type term"); RECOVER;}
1130 { $$ = build_tree_list ($1, $1); }
1131 | class_type_list C_TK class_type
1132 { $$ = tree_cons ($3, $3, $1); }
1133 | class_type_list C_TK error
1134 {yyerror ("Missing class type term"); RECOVER;}
1139 | SC_TK { $$ = NULL_TREE; }
1142 /* 19.8.4 Productions from 8.5: Static Initializers */
1146 TREE_CHAIN ($2) = CPC_STATIC_INITIALIZER_STMT (ctxp);
1147 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, $2);
1148 current_static_block = NULL_TREE;
1152 static: /* Test lval.sub_token here */
1155 check_modifiers ("Illegal modifier `%s' for static initializer", $1, ACC_STATIC);
1156 /* Can't have a static initializer in an innerclass */
1157 if ($1 | ACC_STATIC &&
1158 GET_CPC_LIST () && !TOPLEVEL_CLASS_DECL_P (GET_CPC ()))
1160 (MODIFIER_WFL (STATIC_TK),
1161 "Can't define static initializer in class `%s'. Static initializer can only be defined in top-level classes",
1162 IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())));
1163 SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
1167 /* 19.8.5 Productions from 8.6: Constructor Declarations */
1168 constructor_declaration:
1171 current_function_decl = $1;
1172 source_start_java_method (current_function_decl);
1175 { finish_method_declaration ($3); }
1179 constructor_declarator throws
1180 { $$ = method_header (0, NULL_TREE, $1, $2); }
1181 | modifiers constructor_declarator throws
1182 { $$ = method_header ($1, NULL_TREE, $2, $3); }
1185 constructor_declarator:
1186 simple_name OP_TK CP_TK
1188 ctxp->formal_parameter_number = 0;
1189 $$ = method_declarator ($1, NULL_TREE);
1191 | simple_name OP_TK formal_parameter_list CP_TK
1192 { $$ = method_declarator ($1, $3); }
1196 /* Unlike regular method, we always need a complete (empty)
1197 body so we can safely perform all the required code
1198 addition (super invocation and field initialization) */
1199 block_begin constructor_block_end
1201 BLOCK_EXPR_BODY ($2) = empty_stmt_node;
1204 | block_begin explicit_constructor_invocation constructor_block_end
1206 | block_begin block_statements constructor_block_end
1208 | block_begin explicit_constructor_invocation block_statements constructor_block_end
1212 constructor_block_end:
1216 /* Error recovery for that rule moved down expression_statement: rule. */
1217 explicit_constructor_invocation:
1218 this_or_super OP_TK CP_TK SC_TK
1220 $$ = build_method_invocation ($1, NULL_TREE);
1221 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1222 $$ = java_method_add_stmt (current_function_decl, $$);
1224 | this_or_super OP_TK argument_list CP_TK SC_TK
1226 $$ = build_method_invocation ($1, $3);
1227 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1228 $$ = java_method_add_stmt (current_function_decl, $$);
1230 /* Added, JDK1.1 inner classes. Modified because the rule
1231 'primary' couldn't work. */
1232 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
1233 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1234 | name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
1235 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1238 this_or_super: /* Added, simplifies error diagnostics */
1241 tree wfl = build_wfl_node (this_identifier_node);
1242 EXPR_WFL_LINECOL (wfl) = $1.location;
1247 tree wfl = build_wfl_node (super_identifier_node);
1248 EXPR_WFL_LINECOL (wfl) = $1.location;
1253 /* 19.9 Productions from 9: Interfaces */
1254 /* 19.9.1 Productions from 9.1: Interfaces Declarations */
1255 interface_declaration:
1256 INTERFACE_TK identifier
1257 { create_interface (0, $2, NULL_TREE); }
1260 | modifiers INTERFACE_TK identifier
1261 { create_interface ($1, $3, NULL_TREE); }
1264 | INTERFACE_TK identifier extends_interfaces
1265 { create_interface (0, $2, $3); }
1268 | modifiers INTERFACE_TK identifier extends_interfaces
1269 { create_interface ($1, $3, $4); }
1272 | INTERFACE_TK identifier error
1273 { yyerror ("'{' expected"); RECOVER; }
1274 | modifiers INTERFACE_TK identifier error
1275 { yyerror ("'{' expected"); RECOVER; }
1279 EXTENDS_TK interface_type
1281 ctxp->interface_number = 1;
1282 $$ = build_tree_list ($2, NULL_TREE);
1284 | extends_interfaces C_TK interface_type
1286 ctxp->interface_number++;
1287 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
1290 {yyerror ("Invalid interface type"); RECOVER;}
1291 | extends_interfaces C_TK error
1292 {yyerror ("Missing term"); RECOVER;}
1298 | OCB_TK interface_member_declarations CCB_TK
1302 interface_member_declarations:
1303 interface_member_declaration
1304 | interface_member_declarations interface_member_declaration
1307 interface_member_declaration:
1308 constant_declaration
1309 | abstract_method_declaration
1310 | class_declaration /* Added, JDK1.1 inner classes */
1311 { end_class_declaration (1); }
1312 | interface_declaration /* Added, JDK1.1 inner interfaces */
1313 { end_class_declaration (1); }
1316 constant_declaration:
1320 abstract_method_declaration:
1323 check_abstract_method_header ($1);
1324 current_function_decl = NULL_TREE; /* FIXME ? */
1326 | method_header error
1327 {yyerror ("';' expected"); RECOVER;}
1330 /* 19.10 Productions from 10: Arrays */
1333 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1334 | OCB_TK C_TK CCB_TK
1335 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1336 | OCB_TK variable_initializers CCB_TK
1337 { $$ = build_new_array_init ($1.location, $2); }
1338 | OCB_TK variable_initializers C_TK CCB_TK
1339 { $$ = build_new_array_init ($1.location, $2); }
1342 variable_initializers:
1343 variable_initializer
1345 $$ = tree_cons (maybe_build_array_element_wfl ($1),
1348 | variable_initializers C_TK variable_initializer
1350 $$ = tree_cons (maybe_build_array_element_wfl ($3), $3, $1);
1352 | variable_initializers C_TK error
1353 {yyerror ("Missing term"); RECOVER;}
1356 /* 19.11 Production from 14: Blocks and Statements */
1358 block_begin block_end
1360 | block_begin block_statements block_end
1372 maybe_absorb_scoping_blocks ();
1373 /* Store the location of the `}' when doing xrefs */
1374 if (current_function_decl && flag_emit_xref)
1375 DECL_END_SOURCE_LINE (current_function_decl) =
1376 EXPR_WFL_ADD_COL ($1.location, 1);
1378 if (!BLOCK_SUBBLOCKS ($$))
1379 BLOCK_SUBBLOCKS ($$) = empty_stmt_node;
1385 | block_statements block_statement
1389 local_variable_declaration_statement
1391 { java_method_add_stmt (current_function_decl, $1); }
1392 | class_declaration /* Added, JDK1.1 local classes */
1394 LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1;
1395 end_class_declaration (1);
1399 local_variable_declaration_statement:
1400 local_variable_declaration SC_TK /* Can't catch missing ';' here */
1403 local_variable_declaration:
1404 type variable_declarators
1405 { declare_local_variables (0, $1, $2); }
1406 | final type variable_declarators /* Added, JDK1.1 final locals */
1407 { declare_local_variables ($1, $2, $3); }
1411 statement_without_trailing_substatement
1414 | if_then_else_statement
1417 { $$ = exit_block (); }
1421 statement_without_trailing_substatement
1422 | labeled_statement_nsi
1423 | if_then_else_statement_nsi
1424 | while_statement_nsi
1426 { $$ = exit_block (); }
1429 statement_without_trailing_substatement:
1432 | expression_statement
1436 | continue_statement
1438 | synchronized_statement
1447 if (flag_extraneous_semicolon
1448 && ! current_static_block
1449 && (! current_function_decl ||
1450 /* Verify we're not in a inner class declaration */
1451 (GET_CPC () != TYPE_NAME
1452 (DECL_CONTEXT (current_function_decl)))))
1455 EXPR_WFL_SET_LINECOL (wfl_operator, input_line, -1);
1456 parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used");
1458 $$ = empty_stmt_node;
1463 identifier REL_CL_TK
1465 $$ = build_labeled_block (EXPR_WFL_LINECOL ($1),
1466 EXPR_WFL_NODE ($1));
1468 push_labeled_block ($$);
1469 PUSH_LABELED_BLOCK ($$);
1474 label_decl statement
1475 { $$ = finish_labeled_statement ($1, $2); }
1477 {yyerror ("':' expected"); RECOVER;}
1480 labeled_statement_nsi:
1481 label_decl statement_nsi
1482 { $$ = finish_labeled_statement ($1, $2); }
1485 /* We concentrate here a bunch of error handling rules that we couldn't write
1486 earlier, because expression_statement catches a missing ';'. */
1487 expression_statement:
1488 statement_expression SC_TK
1490 /* We have a statement. Generate a WFL around it so
1492 $$ = build_expr_wfl ($1, input_filename, input_line, 0);
1493 /* We know we have a statement, so set the debug
1494 info to be eventually generate here. */
1495 $$ = JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
1499 YYNOT_TWICE yyerror ("Invalid expression statement");
1500 DRECOVER (expr_stmt);
1504 YYNOT_TWICE yyerror ("Invalid expression statement");
1505 DRECOVER (expr_stmt);
1509 YYNOT_TWICE yyerror ("Invalid expression statement");
1510 DRECOVER (expr_stmt);
1512 | this_or_super OP_TK error
1513 {yyerror ("')' expected"); RECOVER;}
1514 | this_or_super OP_TK CP_TK error
1516 parse_ctor_invocation_error ();
1519 | this_or_super OP_TK argument_list error
1520 {yyerror ("')' expected"); RECOVER;}
1521 | this_or_super OP_TK argument_list CP_TK error
1523 parse_ctor_invocation_error ();
1526 | name DOT_TK SUPER_TK error
1527 {yyerror ("'(' expected"); RECOVER;}
1528 | name DOT_TK SUPER_TK OP_TK error
1529 {yyerror ("')' expected"); RECOVER;}
1530 | name DOT_TK SUPER_TK OP_TK argument_list error
1531 {yyerror ("')' expected"); RECOVER;}
1532 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK error
1533 {yyerror ("';' expected"); RECOVER;}
1534 | name DOT_TK SUPER_TK OP_TK CP_TK error
1535 {yyerror ("';' expected"); RECOVER;}
1538 statement_expression:
1540 | pre_increment_expression
1541 | pre_decrement_expression
1542 | post_increment_expression
1543 | post_decrement_expression
1545 | class_instance_creation_expression
1549 IF_TK OP_TK expression CP_TK statement
1551 $$ = build_if_else_statement ($2.location, $3,
1555 {yyerror ("'(' expected"); RECOVER;}
1557 {yyerror ("Missing term"); RECOVER;}
1558 | IF_TK OP_TK expression error
1559 {yyerror ("')' expected"); RECOVER;}
1562 if_then_else_statement:
1563 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
1564 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1567 if_then_else_statement_nsi:
1568 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
1569 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1579 /* Make into "proper list" of COMPOUND_EXPRs.
1580 I.e. make the last statement also have its own
1582 maybe_absorb_scoping_blocks ();
1583 TREE_OPERAND ($1, 1) = exit_block ();
1584 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $1);
1589 SWITCH_TK OP_TK expression CP_TK
1591 $$ = build (SWITCH_EXPR, NULL_TREE, $3, NULL_TREE);
1592 EXPR_WFL_LINECOL ($$) = $2.location;
1595 {yyerror ("'(' expected"); RECOVER;}
1596 | SWITCH_TK OP_TK error
1597 {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);}
1598 | SWITCH_TK OP_TK expression CP_TK error
1599 {yyerror ("'{' expected"); RECOVER;}
1602 /* Default assignment is there to avoid type node on switch_block
1608 | OCB_TK switch_labels CCB_TK
1610 | OCB_TK switch_block_statement_groups CCB_TK
1612 | OCB_TK switch_block_statement_groups switch_labels CCB_TK
1616 switch_block_statement_groups:
1617 switch_block_statement_group
1618 | switch_block_statement_groups switch_block_statement_group
1621 switch_block_statement_group:
1622 switch_labels block_statements
1627 | switch_labels switch_label
1631 CASE_TK constant_expression REL_CL_TK
1633 tree lab = build1 (CASE_EXPR, NULL_TREE, $2);
1634 EXPR_WFL_LINECOL (lab) = $1.location;
1635 java_method_add_stmt (current_function_decl, lab);
1637 | DEFAULT_TK REL_CL_TK
1639 tree lab = make_node (DEFAULT_EXPR);
1640 EXPR_WFL_LINECOL (lab) = $1.location;
1641 java_method_add_stmt (current_function_decl, lab);
1644 {yyerror ("Missing or invalid constant expression"); RECOVER;}
1645 | CASE_TK constant_expression error
1646 {yyerror ("':' expected"); RECOVER;}
1648 {yyerror ("':' expected"); RECOVER;}
1652 WHILE_TK OP_TK expression CP_TK
1654 tree body = build_loop_body ($2.location, $3, 0);
1655 $$ = build_new_loop (body);
1660 while_expression statement
1661 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1663 {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;}
1664 | WHILE_TK OP_TK error
1665 {yyerror ("Missing term and ')' expected"); RECOVER;}
1666 | WHILE_TK OP_TK expression error
1667 {yyerror ("')' expected"); RECOVER;}
1670 while_statement_nsi:
1671 while_expression statement_nsi
1672 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1678 tree body = build_loop_body (0, NULL_TREE, 1);
1679 $$ = build_new_loop (body);
1681 /* Need error handing here. FIXME */
1685 do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1686 { $$ = finish_loop_body ($4.location, $5, $2, 1); }
1690 for_begin SC_TK expression SC_TK for_update CP_TK statement
1692 if (TREE_CODE_CLASS (TREE_CODE ($3)) == 'c')
1693 $3 = build_wfl_node ($3);
1694 $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);
1696 | for_begin SC_TK SC_TK for_update CP_TK statement
1698 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1699 /* We have not condition, so we get rid of the EXIT_EXPR */
1700 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1703 | for_begin SC_TK error
1704 {yyerror ("Invalid control expression"); RECOVER;}
1705 | for_begin SC_TK expression SC_TK error
1706 {yyerror ("Invalid update expression"); RECOVER;}
1707 | for_begin SC_TK SC_TK error
1708 {yyerror ("Invalid update expression"); RECOVER;}
1712 for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
1713 { $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);}
1714 | for_begin SC_TK SC_TK for_update CP_TK statement_nsi
1716 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1717 /* We have not condition, so we get rid of the EXIT_EXPR */
1718 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1726 /* This scope defined for local variable that may be
1727 defined within the scope of the for loop */
1731 {yyerror ("'(' expected"); DRECOVER(for_1);}
1732 | FOR_TK OP_TK error
1733 {yyerror ("Invalid init statement"); RECOVER;}
1739 /* We now declare the loop body. The loop is
1740 declared as a for loop. */
1741 tree body = build_loop_body (0, NULL_TREE, 0);
1742 $$ = build_new_loop (body);
1743 FOR_LOOP_P ($$) = 1;
1744 /* The loop is added to the current block the for
1745 statement is defined within */
1746 java_method_add_stmt (current_function_decl, $$);
1749 for_init: /* Can be empty */
1750 { $$ = empty_stmt_node; }
1751 | statement_expression_list
1753 /* Init statement recorded within the previously
1754 defined block scope */
1755 $$ = java_method_add_stmt (current_function_decl, $1);
1757 | local_variable_declaration
1759 /* Local variable are recorded within the previously
1760 defined block scope */
1763 | statement_expression_list error
1764 {yyerror ("';' expected"); DRECOVER(for_init_1);}
1767 for_update: /* Can be empty */
1768 {$$ = empty_stmt_node;}
1769 | statement_expression_list
1770 { $$ = build_debugable_stmt (BUILD_LOCATION (), $1); }
1773 statement_expression_list:
1774 statement_expression
1775 { $$ = add_stmt_to_compound (NULL_TREE, NULL_TREE, $1); }
1776 | statement_expression_list C_TK statement_expression
1777 { $$ = add_stmt_to_compound ($1, NULL_TREE, $3); }
1778 | statement_expression_list C_TK error
1779 {yyerror ("Missing term"); RECOVER;}
1784 { $$ = build_bc_statement ($1.location, 1, NULL_TREE); }
1785 | BREAK_TK identifier SC_TK
1786 { $$ = build_bc_statement ($1.location, 1, $2); }
1788 {yyerror ("Missing term"); RECOVER;}
1789 | BREAK_TK identifier error
1790 {yyerror ("';' expected"); RECOVER;}
1795 { $$ = build_bc_statement ($1.location, 0, NULL_TREE); }
1796 | CONTINUE_TK identifier SC_TK
1797 { $$ = build_bc_statement ($1.location, 0, $2); }
1799 {yyerror ("Missing term"); RECOVER;}
1800 | CONTINUE_TK identifier error
1801 {yyerror ("';' expected"); RECOVER;}
1806 { $$ = build_return ($1.location, NULL_TREE); }
1807 | RETURN_TK expression SC_TK
1808 { $$ = build_return ($1.location, $2); }
1810 {yyerror ("Missing term"); RECOVER;}
1811 | RETURN_TK expression error
1812 {yyerror ("';' expected"); RECOVER;}
1816 THROW_TK expression SC_TK
1818 $$ = build1 (THROW_EXPR, NULL_TREE, $2);
1819 EXPR_WFL_LINECOL ($$) = $1.location;
1822 {yyerror ("Missing term"); RECOVER;}
1823 | THROW_TK expression error
1824 {yyerror ("';' expected"); RECOVER;}
1828 ASSERT_TK expression REL_CL_TK expression SC_TK
1830 $$ = build_assertion ($1.location, $2, $4);
1832 | ASSERT_TK expression SC_TK
1834 $$ = build_assertion ($1.location, $2, NULL_TREE);
1837 {yyerror ("Missing term"); RECOVER;}
1838 | ASSERT_TK expression error
1839 {yyerror ("';' expected"); RECOVER;}
1842 synchronized_statement:
1843 synchronized OP_TK expression CP_TK block
1845 $$ = build (SYNCHRONIZED_EXPR, NULL_TREE, $3, $5);
1846 EXPR_WFL_LINECOL ($$) =
1847 EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK));
1849 | synchronized OP_TK expression CP_TK error
1850 {yyerror ("'{' expected"); RECOVER;}
1851 | synchronized error
1852 {yyerror ("'(' expected"); RECOVER;}
1853 | synchronized OP_TK error CP_TK
1854 {yyerror ("Missing term"); RECOVER;}
1855 | synchronized OP_TK error
1856 {yyerror ("Missing term"); RECOVER;}
1863 "Illegal modifier `%s'. Only `synchronized' was expected here",
1864 $1, ACC_SYNCHRONIZED);
1865 if ($1 != ACC_SYNCHRONIZED)
1866 MODIFIER_WFL (SYNCHRONIZED_TK) =
1867 build_wfl_node (NULL_TREE);
1872 TRY_TK block catches
1873 { $$ = build_try_statement ($1.location, $2, $3); }
1874 | TRY_TK block finally
1875 { $$ = build_try_finally_statement ($1.location, $2, $3); }
1876 | TRY_TK block catches finally
1877 { $$ = build_try_finally_statement
1878 ($1.location, build_try_statement ($1.location,
1882 {yyerror ("'{' expected"); DRECOVER (try_statement);}
1887 | catches catch_clause
1889 TREE_CHAIN ($2) = $1;
1895 catch_clause_parameter block
1897 java_method_add_stmt (current_function_decl, $2);
1903 catch_clause_parameter:
1904 CATCH_TK OP_TK formal_parameter CP_TK
1906 /* We add a block to define a scope for
1907 formal_parameter (CCBP). The formal parameter is
1908 declared initialized by the appropriate function
1914 ccpb = enter_block ();
1915 init = build_assignment
1916 (ASSIGN_TK, $2.location, TREE_PURPOSE ($3),
1917 build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
1918 declare_local_variables (0, TREE_VALUE ($3),
1920 (TREE_PURPOSE ($3), init));
1921 $$ = build1 (CATCH_EXPR, NULL_TREE, ccpb);
1922 EXPR_WFL_LINECOL ($$) = $1.location;
1926 $$ = error_mark_node;
1930 {yyerror ("'(' expected"); RECOVER; $$ = NULL_TREE;}
1931 | CATCH_TK OP_TK error
1933 yyerror ("Missing term or ')' expected");
1934 RECOVER; $$ = NULL_TREE;
1936 | CATCH_TK OP_TK error CP_TK /* That's for () */
1937 {yyerror ("Missing term"); RECOVER; $$ = NULL_TREE;}
1944 {yyerror ("'{' expected"); RECOVER; }
1947 /* 19.12 Production from 15: Expressions */
1949 primary_no_new_array
1950 | array_creation_expression
1953 primary_no_new_array:
1956 { $$ = build_this ($1.location); }
1957 | OP_TK expression CP_TK
1959 | class_instance_creation_expression
1964 /* Added, JDK1.1 inner classes. Documentation is wrong
1965 refering to a 'ClassName' (class_name) rule that doesn't
1966 exist. Used name: instead. */
1967 | name DOT_TK THIS_TK
1969 tree wfl = build_wfl_node (this_identifier_node);
1970 $$ = make_qualified_primary ($1, wfl, EXPR_WFL_LINECOL ($1));
1972 | OP_TK expression error
1973 {yyerror ("')' expected"); RECOVER;}
1975 {yyerror ("'class' or 'this' expected" ); RECOVER;}
1976 | primitive_type DOT_TK error
1977 {yyerror ("'class' expected" ); RECOVER;}
1978 | VOID_TK DOT_TK error
1979 {yyerror ("'class' expected" ); RECOVER;}
1983 name DOT_TK CLASS_TK
1984 { $$ = build_incomplete_class_ref ($2.location, $1); }
1985 | array_type DOT_TK CLASS_TK
1986 { $$ = build_incomplete_class_ref ($2.location, $1); }
1987 | primitive_type DOT_TK CLASS_TK
1988 { $$ = build_incomplete_class_ref ($2.location, $1); }
1989 | VOID_TK DOT_TK CLASS_TK
1991 $$ = build_incomplete_class_ref ($2.location,
1996 class_instance_creation_expression:
1997 NEW_TK class_type OP_TK argument_list CP_TK
1998 { $$ = build_new_invocation ($2, $4); }
1999 | NEW_TK class_type OP_TK CP_TK
2000 { $$ = build_new_invocation ($2, NULL_TREE); }
2001 | anonymous_class_creation
2002 /* Added, JDK1.1 inner classes, modified to use name or
2003 primary instead of primary solely which couldn't work in
2005 | something_dot_new identifier OP_TK CP_TK
2007 tree ctor = build_new_invocation ($2, NULL_TREE);
2008 $$ = make_qualified_primary ($1, ctor,
2009 EXPR_WFL_LINECOL ($1));
2011 | something_dot_new identifier OP_TK CP_TK class_body
2012 | something_dot_new identifier OP_TK argument_list CP_TK
2014 tree ctor = build_new_invocation ($2, $4);
2015 $$ = make_qualified_primary ($1, ctor,
2016 EXPR_WFL_LINECOL ($1));
2018 | something_dot_new identifier OP_TK argument_list CP_TK class_body
2019 | NEW_TK error SC_TK
2020 {yyerror ("'(' expected"); DRECOVER(new_1);}
2021 | NEW_TK class_type error
2022 {yyerror ("'(' expected"); RECOVER;}
2023 | NEW_TK class_type OP_TK error
2024 {yyerror ("')' or term expected"); RECOVER;}
2025 | NEW_TK class_type OP_TK argument_list error
2026 {yyerror ("')' expected"); RECOVER;}
2027 | something_dot_new error
2028 {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;}
2029 | something_dot_new identifier error
2030 {yyerror ("'(' expected"); RECOVER;}
2033 /* Created after JDK1.1 rules originally added to
2034 class_instance_creation_expression, but modified to use
2035 'class_type' instead of 'TypeName' (type_name) which is mentioned
2036 in the documentation but doesn't exist. */
2038 anonymous_class_creation:
2039 NEW_TK class_type OP_TK argument_list CP_TK
2040 { create_anonymous_class ($1.location, $2); }
2043 tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2044 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2046 end_class_declaration (1);
2048 /* Now we can craft the new expression */
2049 $$ = build_new_invocation (id, $4);
2051 /* Note that we can't possibly be here if
2052 `class_type' is an interface (in which case the
2053 anonymous class extends Object and implements
2054 `class_type', hence its constructor can't have
2057 /* Otherwise, the innerclass must feature a
2058 constructor matching `argument_list'. Anonymous
2059 classes are a bit special: it's impossible to
2060 define constructor for them, hence constructors
2061 must be generated following the hints provided by
2062 the `new' expression. Whether a super constructor
2063 of that nature exists or not is to be verified
2064 later on in verify_constructor_super.
2066 It's during the expansion of a `new' statement
2067 refering to an anonymous class that a ctor will
2068 be generated for the anonymous class, with the
2072 | NEW_TK class_type OP_TK CP_TK
2073 { create_anonymous_class ($1.location, $2); }
2076 tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2077 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2079 end_class_declaration (1);
2081 /* Now we can craft the new expression. The
2082 statement doesn't need to be remember so that a
2083 constructor can be generated, since its signature
2084 is already known. */
2085 $$ = build_new_invocation (id, NULL_TREE);
2089 something_dot_new: /* Added, not part of the specs. */
2092 | primary DOT_TK NEW_TK
2099 $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
2100 ctxp->formal_parameter_number = 1;
2102 | argument_list C_TK expression
2104 ctxp->formal_parameter_number += 1;
2105 $$ = tree_cons (NULL_TREE, $3, $1);
2107 | argument_list C_TK error
2108 {yyerror ("Missing term"); RECOVER;}
2111 array_creation_expression:
2112 NEW_TK primitive_type dim_exprs
2113 { $$ = build_newarray_node ($2, $3, 0); }
2114 | NEW_TK class_or_interface_type dim_exprs
2115 { $$ = build_newarray_node ($2, $3, 0); }
2116 | NEW_TK primitive_type dim_exprs dims
2117 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2118 | NEW_TK class_or_interface_type dim_exprs dims
2119 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2120 /* Added, JDK1.1 anonymous array. Initial documentation rule
2122 | NEW_TK class_or_interface_type dims array_initializer
2125 int osb = pop_current_osb (ctxp);
2127 obstack_grow (&temporary_obstack, "[]", 2);
2128 obstack_1grow (&temporary_obstack, '\0');
2129 sig = obstack_finish (&temporary_obstack);
2130 $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2131 $2, get_identifier (sig), $4);
2133 | NEW_TK primitive_type dims array_initializer
2135 int osb = pop_current_osb (ctxp);
2138 type = build_java_array_type (type, -1);
2139 $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2140 build_pointer_type (type), NULL_TREE, $4);
2142 | NEW_TK error CSB_TK
2143 {yyerror ("'[' expected"); DRECOVER ("]");}
2144 | NEW_TK error OSB_TK
2145 {yyerror ("']' expected"); RECOVER;}
2150 { $$ = build_tree_list (NULL_TREE, $1); }
2151 | dim_exprs dim_expr
2152 { $$ = tree_cons (NULL_TREE, $2, $$); }
2156 OSB_TK expression CSB_TK
2158 if (JNUMERIC_TYPE_P (TREE_TYPE ($2)))
2160 $2 = build_wfl_node ($2);
2161 TREE_TYPE ($2) = NULL_TREE;
2163 EXPR_WFL_LINECOL ($2) = $1.location;
2166 | OSB_TK expression error
2167 {yyerror ("']' expected"); RECOVER;}
2170 yyerror ("Missing term");
2171 yyerror ("']' expected");
2180 /* If not initialized, allocate memory for the osb
2182 if (!ctxp->osb_limit)
2184 allocate = ctxp->osb_limit = 32;
2185 ctxp->osb_depth = -1;
2187 /* If capacity overflown, reallocate a bigger chunk */
2188 else if (ctxp->osb_depth+1 == ctxp->osb_limit)
2189 allocate = ctxp->osb_limit << 1;
2193 allocate *= sizeof (int);
2194 if (ctxp->osb_number)
2195 ctxp->osb_number = xrealloc (ctxp->osb_number,
2198 ctxp->osb_number = xmalloc (allocate);
2201 CURRENT_OSB (ctxp) = 1;
2203 | dims OSB_TK CSB_TK
2204 { CURRENT_OSB (ctxp)++; }
2206 { yyerror ("']' expected"); RECOVER;}
2210 primary DOT_TK identifier
2211 { $$ = make_qualified_primary ($1, $3, $2.location); }
2212 /* FIXME - REWRITE TO:
2213 { $$ = build_binop (COMPONENT_REF, $2.location, $1, $3); } */
2214 | SUPER_TK DOT_TK identifier
2216 tree super_wfl = build_wfl_node (super_identifier_node);
2217 EXPR_WFL_LINECOL (super_wfl) = $1.location;
2218 $$ = make_qualified_name (super_wfl, $3, $2.location);
2221 {yyerror ("Field expected"); DRECOVER (super_field_acces);}
2226 { $$ = build_method_invocation ($1, NULL_TREE); }
2227 | name OP_TK argument_list CP_TK
2228 { $$ = build_method_invocation ($1, $3); }
2229 | primary DOT_TK identifier OP_TK CP_TK
2231 if (TREE_CODE ($1) == THIS_EXPR)
2232 $$ = build_this_super_qualified_invocation
2233 (1, $3, NULL_TREE, 0, $2.location);
2236 tree invok = build_method_invocation ($3, NULL_TREE);
2237 $$ = make_qualified_primary ($1, invok, $2.location);
2240 | primary DOT_TK identifier OP_TK argument_list CP_TK
2242 if (TREE_CODE ($1) == THIS_EXPR)
2243 $$ = build_this_super_qualified_invocation
2244 (1, $3, $5, 0, $2.location);
2247 tree invok = build_method_invocation ($3, $5);
2248 $$ = make_qualified_primary ($1, invok, $2.location);
2251 | SUPER_TK DOT_TK identifier OP_TK CP_TK
2253 $$ = build_this_super_qualified_invocation
2254 (0, $3, NULL_TREE, $1.location, $2.location);
2256 | SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
2258 $$ = build_this_super_qualified_invocation
2259 (0, $3, $5, $1.location, $2.location);
2261 /* Screws up thing. I let it here until I'm convinced it can
2263 | primary DOT_TK error
2264 {yyerror ("'(' expected"); DRECOVER(bad);} */
2265 | SUPER_TK DOT_TK error CP_TK
2266 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2267 | SUPER_TK DOT_TK error DOT_TK
2268 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2272 name OSB_TK expression CSB_TK
2273 { $$ = build_array_ref ($2.location, $1, $3); }
2274 | primary_no_new_array OSB_TK expression CSB_TK
2275 { $$ = build_array_ref ($2.location, $1, $3); }
2278 yyerror ("Missing term and ']' expected");
2279 DRECOVER(array_access);
2281 | name OSB_TK expression error
2283 yyerror ("']' expected");
2284 DRECOVER(array_access);
2286 | primary_no_new_array OSB_TK error
2288 yyerror ("Missing term and ']' expected");
2289 DRECOVER(array_access);
2291 | primary_no_new_array OSB_TK expression error
2293 yyerror ("']' expected");
2294 DRECOVER(array_access);
2301 | post_increment_expression
2302 | post_decrement_expression
2305 post_increment_expression:
2306 postfix_expression INCR_TK
2307 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2310 post_decrement_expression:
2311 postfix_expression DECR_TK
2312 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2315 trap_overflow_corner_case:
2316 pre_increment_expression
2317 | pre_decrement_expression
2318 | PLUS_TK unary_expression
2319 {$$ = build_unaryop ($1.token, $1.location, $2); }
2320 | unary_expression_not_plus_minus
2322 {yyerror ("Missing term"); RECOVER}
2326 trap_overflow_corner_case
2328 error_if_numeric_overflow ($1);
2331 | MINUS_TK trap_overflow_corner_case
2332 {$$ = build_unaryop ($1.token, $1.location, $2); }
2334 {yyerror ("Missing term"); RECOVER}
2337 pre_increment_expression:
2338 INCR_TK unary_expression
2339 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2341 {yyerror ("Missing term"); RECOVER}
2344 pre_decrement_expression:
2345 DECR_TK unary_expression
2346 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2348 {yyerror ("Missing term"); RECOVER}
2351 unary_expression_not_plus_minus:
2353 | NOT_TK unary_expression
2354 {$$ = build_unaryop ($1.token, $1.location, $2); }
2355 | NEG_TK unary_expression
2356 {$$ = build_unaryop ($1.token, $1.location, $2); }
2359 {yyerror ("Missing term"); RECOVER}
2361 {yyerror ("Missing term"); RECOVER}
2364 cast_expression: /* Error handling here is potentially weak */
2365 OP_TK primitive_type dims CP_TK unary_expression
2368 int osb = pop_current_osb (ctxp);
2370 type = build_java_array_type (type, -1);
2371 $$ = build_cast ($1.location, type, $5);
2373 | OP_TK primitive_type CP_TK unary_expression
2374 { $$ = build_cast ($1.location, $2, $4); }
2375 | OP_TK expression CP_TK unary_expression_not_plus_minus
2376 { $$ = build_cast ($1.location, $2, $4); }
2377 | OP_TK name dims CP_TK unary_expression_not_plus_minus
2380 int osb = pop_current_osb (ctxp);
2381 obstack_grow (&temporary_obstack,
2382 IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)),
2383 IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2)));
2385 obstack_grow (&temporary_obstack, "[]", 2);
2386 obstack_1grow (&temporary_obstack, '\0');
2387 ptr = obstack_finish (&temporary_obstack);
2388 EXPR_WFL_NODE ($2) = get_identifier (ptr);
2389 $$ = build_cast ($1.location, $2, $5);
2391 | OP_TK primitive_type OSB_TK error
2392 {yyerror ("']' expected, invalid type expression");}
2395 YYNOT_TWICE yyerror ("Invalid type expression"); RECOVER;
2398 | OP_TK primitive_type dims CP_TK error
2399 {yyerror ("Missing term"); RECOVER;}
2400 | OP_TK primitive_type CP_TK error
2401 {yyerror ("Missing term"); RECOVER;}
2402 | OP_TK name dims CP_TK error
2403 {yyerror ("Missing term"); RECOVER;}
2406 multiplicative_expression:
2408 | multiplicative_expression MULT_TK unary_expression
2410 $$ = build_binop (BINOP_LOOKUP ($2.token),
2411 $2.location, $1, $3);
2413 | multiplicative_expression DIV_TK unary_expression
2415 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2418 | multiplicative_expression REM_TK unary_expression
2420 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2423 | multiplicative_expression MULT_TK error
2424 {yyerror ("Missing term"); RECOVER;}
2425 | multiplicative_expression DIV_TK error
2426 {yyerror ("Missing term"); RECOVER;}
2427 | multiplicative_expression REM_TK error
2428 {yyerror ("Missing term"); RECOVER;}
2431 additive_expression:
2432 multiplicative_expression
2433 | additive_expression PLUS_TK multiplicative_expression
2435 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2438 | additive_expression MINUS_TK multiplicative_expression
2440 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2443 | additive_expression PLUS_TK error
2444 {yyerror ("Missing term"); RECOVER;}
2445 | additive_expression MINUS_TK error
2446 {yyerror ("Missing term"); RECOVER;}
2451 | shift_expression LS_TK additive_expression
2453 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2456 | shift_expression SRS_TK additive_expression
2458 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2461 | shift_expression ZRS_TK additive_expression
2463 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2466 | shift_expression LS_TK error
2467 {yyerror ("Missing term"); RECOVER;}
2468 | shift_expression SRS_TK error
2469 {yyerror ("Missing term"); RECOVER;}
2470 | shift_expression ZRS_TK error
2471 {yyerror ("Missing term"); RECOVER;}
2474 relational_expression:
2476 | relational_expression LT_TK shift_expression
2478 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2481 | relational_expression GT_TK shift_expression
2483 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2486 | relational_expression LTE_TK shift_expression
2488 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2491 | relational_expression GTE_TK shift_expression
2493 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2496 | relational_expression INSTANCEOF_TK reference_type
2497 { $$ = build_binop (INSTANCEOF_EXPR, $2.location, $1, $3); }
2498 | relational_expression LT_TK error
2499 {yyerror ("Missing term"); RECOVER;}
2500 | relational_expression GT_TK error
2501 {yyerror ("Missing term"); RECOVER;}
2502 | relational_expression LTE_TK error
2503 {yyerror ("Missing term"); RECOVER;}
2504 | relational_expression GTE_TK error
2505 {yyerror ("Missing term"); RECOVER;}
2506 | relational_expression INSTANCEOF_TK error
2507 {yyerror ("Invalid reference type"); RECOVER;}
2510 equality_expression:
2511 relational_expression
2512 | equality_expression EQ_TK relational_expression
2514 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2517 | equality_expression NEQ_TK relational_expression
2519 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2522 | equality_expression EQ_TK error
2523 {yyerror ("Missing term"); RECOVER;}
2524 | equality_expression NEQ_TK error
2525 {yyerror ("Missing term"); RECOVER;}
2530 | and_expression AND_TK equality_expression
2532 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2535 | and_expression AND_TK error
2536 {yyerror ("Missing term"); RECOVER;}
2539 exclusive_or_expression:
2541 | exclusive_or_expression XOR_TK and_expression
2543 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2546 | exclusive_or_expression XOR_TK error
2547 {yyerror ("Missing term"); RECOVER;}
2550 inclusive_or_expression:
2551 exclusive_or_expression
2552 | inclusive_or_expression OR_TK exclusive_or_expression
2554 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2557 | inclusive_or_expression OR_TK error
2558 {yyerror ("Missing term"); RECOVER;}
2561 conditional_and_expression:
2562 inclusive_or_expression
2563 | conditional_and_expression BOOL_AND_TK inclusive_or_expression
2565 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2568 | conditional_and_expression BOOL_AND_TK error
2569 {yyerror ("Missing term"); RECOVER;}
2572 conditional_or_expression:
2573 conditional_and_expression
2574 | conditional_or_expression BOOL_OR_TK conditional_and_expression
2576 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2579 | conditional_or_expression BOOL_OR_TK error
2580 {yyerror ("Missing term"); RECOVER;}
2583 conditional_expression: /* Error handling here is weak */
2584 conditional_or_expression
2585 | conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
2587 $$ = build (CONDITIONAL_EXPR, NULL_TREE, $1, $3, $5);
2588 EXPR_WFL_LINECOL ($$) = $2.location;
2590 | conditional_or_expression REL_QM_TK REL_CL_TK error
2593 yyerror ("Missing term");
2596 | conditional_or_expression REL_QM_TK error
2597 {yyerror ("Missing term"); DRECOVER (2);}
2598 | conditional_or_expression REL_QM_TK expression REL_CL_TK error
2599 {yyerror ("Missing term"); DRECOVER (3);}
2602 assignment_expression:
2603 conditional_expression
2608 left_hand_side assignment_operator assignment_expression
2609 { $$ = build_assignment ($2.token, $2.location, $1, $3); }
2610 | left_hand_side assignment_operator error
2612 YYNOT_TWICE yyerror ("Missing term");
2623 assignment_operator:
2629 assignment_expression
2632 constant_expression:
2638 /* Helper function to retrieve an OSB count. Should be used when the
2639 `dims:' rule is being used. */
2642 pop_current_osb (struct parser_ctxt *ctxp)
2646 if (ctxp->osb_depth < 0)
2649 to_return = CURRENT_OSB (ctxp);
2657 /* This section of the code deal with save/restoring parser contexts.
2658 Add mode documentation here. FIXME */
2660 /* Helper function. Create a new parser context. With
2661 COPY_FROM_PREVIOUS set to a nonzero value, content of the previous
2662 context is copied, otherwise, the new context is zeroed. The newly
2663 created context becomes the current one. */
2666 create_new_parser_context (int copy_from_previous)
2668 struct parser_ctxt *new;
2670 new = ggc_alloc (sizeof (struct parser_ctxt));
2671 if (copy_from_previous)
2673 memcpy (new, ctxp, sizeof (struct parser_ctxt));
2674 /* This flag, indicating the context saves global values,
2675 should only be set by java_parser_context_save_global. */
2676 new->saved_data_ctx = 0;
2679 memset (new, 0, sizeof (struct parser_ctxt));
2685 /* Create a new parser context and make it the current one. */
2688 java_push_parser_context (void)
2690 create_new_parser_context (0);
2694 java_pop_parser_context (int generate)
2697 struct parser_ctxt *toFree, *next;
2706 input_line = ctxp->lineno;
2707 current_class = ctxp->class_type;
2710 /* If the old and new lexers differ, then free the old one. */
2711 if (ctxp->lexer && next && ctxp->lexer != next->lexer)
2712 java_destroy_lexer (ctxp->lexer);
2714 /* Set the single import class file flag to 0 for the current list
2715 of imported things */
2716 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2717 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 0;
2719 /* And restore those of the previous context */
2720 if ((ctxp = next)) /* Assignment is really meant here */
2721 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2722 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 1;
2724 /* If we pushed a context to parse a class intended to be generated,
2725 we keep it so we can remember the class. What we could actually
2726 do is to just update a list of class names. */
2729 toFree->next = ctxp_for_generation;
2730 ctxp_for_generation = toFree;
2734 /* Create a parser context for the use of saving some global
2738 java_parser_context_save_global (void)
2742 java_push_parser_context ();
2743 ctxp->saved_data_ctx = 1;
2746 /* If this context already stores data, create a new one suitable
2747 for data storage. */
2748 else if (ctxp->saved_data)
2750 create_new_parser_context (1);
2751 ctxp->saved_data_ctx = 1;
2754 ctxp->lineno = input_line;
2755 ctxp->class_type = current_class;
2756 ctxp->filename = input_filename;
2757 ctxp->function_decl = current_function_decl;
2758 ctxp->saved_data = 1;
2761 /* Restore some global variables from the previous context. Make the
2762 previous context the current one. */
2765 java_parser_context_restore_global (void)
2767 input_line = ctxp->lineno;
2768 current_class = ctxp->class_type;
2769 input_filename = ctxp->filename;
2773 BUILD_FILENAME_IDENTIFIER_NODE (s, input_filename);
2774 EXPR_WFL_FILENAME_NODE (wfl_operator) = s;
2776 current_function_decl = ctxp->function_decl;
2777 ctxp->saved_data = 0;
2778 if (ctxp->saved_data_ctx)
2779 java_pop_parser_context (0);
2782 /* Suspend vital data for the current class/function being parsed so
2783 that an other class can be parsed. Used to let local/anonymous
2784 classes be parsed. */
2787 java_parser_context_suspend (void)
2789 /* This makes debugging through java_debug_context easier */
2790 static const char *const name = "<inner buffer context>";
2792 /* Duplicate the previous context, use it to save the globals we're
2794 create_new_parser_context (1);
2795 ctxp->function_decl = current_function_decl;
2796 ctxp->class_type = current_class;
2798 /* Then create a new context which inherits all data from the
2799 previous one. This will be the new current context */
2800 create_new_parser_context (1);
2802 /* Help debugging */
2803 ctxp->next->filename = name;
2806 /* Resume vital data for the current class/function being parsed so
2807 that an other class can be parsed. Used to let local/anonymous
2808 classes be parsed. The trick is the data storing file position
2809 informations must be restored to their current value, so parsing
2810 can resume as if no context was ever saved. */
2813 java_parser_context_resume (void)
2815 struct parser_ctxt *old = ctxp; /* This one is to be discarded */
2816 struct parser_ctxt *saver = old->next; /* This one contain saved info */
2817 struct parser_ctxt *restored = saver->next; /* This one is the old current */
2819 /* We need to inherit the list of classes to complete/generate */
2820 restored->classd_list = old->classd_list;
2821 restored->class_list = old->class_list;
2823 /* Restore the current class and function from the saver */
2824 current_class = saver->class_type;
2825 current_function_decl = saver->function_decl;
2827 /* Retrieve the restored context */
2830 /* Re-installed the data for the parsing to carry on */
2831 memcpy (&ctxp->marker_begining, &old->marker_begining,
2832 (size_t)(&ctxp->marker_end - &ctxp->marker_begining));
2835 /* Add a new anchor node to which all statement(s) initializing static
2836 and non static initialized upon declaration field(s) will be
2840 java_parser_context_push_initialized_field (void)
2844 node = build_tree_list (NULL_TREE, NULL_TREE);
2845 TREE_CHAIN (node) = CPC_STATIC_INITIALIZER_LIST (ctxp);
2846 CPC_STATIC_INITIALIZER_LIST (ctxp) = node;
2848 node = build_tree_list (NULL_TREE, NULL_TREE);
2849 TREE_CHAIN (node) = CPC_INITIALIZER_LIST (ctxp);
2850 CPC_INITIALIZER_LIST (ctxp) = node;
2852 node = build_tree_list (NULL_TREE, NULL_TREE);
2853 TREE_CHAIN (node) = CPC_INSTANCE_INITIALIZER_LIST (ctxp);
2854 CPC_INSTANCE_INITIALIZER_LIST (ctxp) = node;
2857 /* Pop the lists of initialized field. If this lists aren't empty,
2858 remember them so we can use it to create and populate the finit$
2859 or <clinit> functions. */
2862 java_parser_context_pop_initialized_field (void)
2865 tree class_type = TREE_TYPE (GET_CPC ());
2867 if (CPC_INITIALIZER_LIST (ctxp))
2869 stmts = CPC_INITIALIZER_STMT (ctxp);
2870 CPC_INITIALIZER_LIST (ctxp) = TREE_CHAIN (CPC_INITIALIZER_LIST (ctxp));
2871 if (stmts && !java_error_count)
2872 TYPE_FINIT_STMT_LIST (class_type) = reorder_static_initialized (stmts);
2875 if (CPC_STATIC_INITIALIZER_LIST (ctxp))
2877 stmts = CPC_STATIC_INITIALIZER_STMT (ctxp);
2878 CPC_STATIC_INITIALIZER_LIST (ctxp) =
2879 TREE_CHAIN (CPC_STATIC_INITIALIZER_LIST (ctxp));
2880 /* Keep initialization in order to enforce 8.5 */
2881 if (stmts && !java_error_count)
2882 TYPE_CLINIT_STMT_LIST (class_type) = nreverse (stmts);
2885 /* JDK 1.1 instance initializers */
2886 if (CPC_INSTANCE_INITIALIZER_LIST (ctxp))
2888 stmts = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
2889 CPC_INSTANCE_INITIALIZER_LIST (ctxp) =
2890 TREE_CHAIN (CPC_INSTANCE_INITIALIZER_LIST (ctxp));
2891 if (stmts && !java_error_count)
2892 TYPE_II_STMT_LIST (class_type) = nreverse (stmts);
2897 reorder_static_initialized (tree list)
2899 /* We have to keep things in order. The alias initializer have to
2900 come first, then the initialized regular field, in reverse to
2901 keep them in lexical order. */
2902 tree marker, previous = NULL_TREE;
2903 for (marker = list; marker; previous = marker, marker = TREE_CHAIN (marker))
2904 if (TREE_CODE (marker) == TREE_LIST
2905 && !TREE_VALUE (marker) && !TREE_PURPOSE (marker))
2908 /* No static initialized, the list is fine as is */
2910 list = TREE_CHAIN (marker);
2912 /* No marker? reverse the whole list */
2914 list = nreverse (list);
2916 /* Otherwise, reverse what's after the marker and the new reordered
2917 sublist will replace the marker. */
2920 TREE_CHAIN (previous) = NULL_TREE;
2921 list = nreverse (list);
2922 list = chainon (TREE_CHAIN (marker), list);
2927 /* Helper functions to dump the parser context stack. */
2929 #define TAB_CONTEXT(C) \
2930 {int i; for (i = 0; i < (C); i++) fputc (' ', stderr);}
2933 java_debug_context_do (int tab)
2935 struct parser_ctxt *copy = ctxp;
2939 fprintf (stderr, "ctxt: 0x%0lX\n", (unsigned long)copy);
2941 fprintf (stderr, "filename: %s\n", copy->filename);
2943 fprintf (stderr, "lineno: %d\n", copy->lineno);
2945 fprintf (stderr, "package: %s\n",
2947 IDENTIFIER_POINTER (copy->package) : "<none>"));
2949 fprintf (stderr, "context for saving: %d\n", copy->saved_data_ctx);
2951 fprintf (stderr, "saved data: %d\n", copy->saved_data);
2957 /* Dump the stacked up parser contexts. Intended to be called from a
2961 java_debug_context (void)
2963 java_debug_context_do (0);
2968 /* Flag for the error report routine to issue the error the first time
2969 it's called (overriding the default behavior which is to drop the
2970 first invocation and honor the second one, taking advantage of a
2972 static int force_error = 0;
2974 /* Reporting an constructor invocation error. */
2976 parse_ctor_invocation_error (void)
2978 if (DECL_CONSTRUCTOR_P (current_function_decl))
2979 yyerror ("Constructor invocation must be first thing in a constructor");
2981 yyerror ("Only constructors can invoke constructors");
2984 /* Reporting JDK1.1 features not implemented. */
2987 parse_jdk1_1_error (const char *msg)
2989 sorry (": `%s' JDK1.1(TM) feature", msg);
2991 return empty_stmt_node;
2994 static int do_warning = 0;
2997 yyerror (const char *msg)
3000 static int prev_lineno;
3001 static const char *prev_msg;
3004 char *remainder, *code_from_source;
3006 if (!force_error && prev_lineno == input_line)
3009 /* Save current error location but report latter, when the context is
3011 if (ctxp->java_error_flag == 0)
3013 ctxp->java_error_flag = 1;
3015 /* Do something to use the previous line if we're reaching the
3016 end of the file... */
3017 #ifdef VERBOSE_SKELETON
3018 printf ("* Error detected (%s)\n", (msg ? msg : "(null)"));
3023 /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
3024 if (!force_error && msg == prev_msg && prev_lineno == elc.line)
3027 ctxp->java_error_flag = 0;
3029 java_warning_count++;
3033 if (elc.col == 0 && msg && msg[1] == ';')
3035 elc.col = ctxp->p_line->char_col-1;
3036 elc.line = ctxp->p_line->lineno;
3039 save_lineno = input_line;
3040 prev_lineno = input_line = elc.line;
3043 code_from_source = java_get_line_col (ctxp->filename, elc.line, elc.col);
3044 obstack_grow0 (&temporary_obstack,
3045 code_from_source, strlen (code_from_source));
3046 remainder = obstack_finish (&temporary_obstack);
3048 warning ("%s.\n%s", msg, remainder);
3050 error ("%s.\n%s", msg, remainder);
3052 /* This allow us to cheaply avoid an extra 'Invalid expression
3053 statement' error report when errors have been already reported on
3054 the same line. This occurs when we report an error but don't have
3055 a synchronization point other than ';', which
3056 expression_statement is the only one to take care of. */
3057 ctxp->prevent_ese = input_line = save_lineno;
3061 issue_warning_error_from_context (tree cl, const char *msg, va_list ap)
3063 const char *saved, *saved_input_filename;
3065 vsprintf (buffer, msg, ap);
3068 ctxp->elc.line = EXPR_WFL_LINENO (cl);
3069 ctxp->elc.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1 :
3070 (EXPR_WFL_COLNO (cl) == 0xffe ? -2 : EXPR_WFL_COLNO (cl)));
3072 /* We have a CL, that's a good reason for using it if it contains data */
3073 saved = ctxp->filename;
3074 if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
3075 ctxp->filename = EXPR_WFL_FILENAME (cl);
3076 saved_input_filename = input_filename;
3077 input_filename = ctxp->filename;
3079 java_error (buffer);
3080 ctxp->filename = saved;
3081 input_filename = saved_input_filename;
3085 /* Issue an error message at a current source line CL */
3088 parse_error_context (tree cl, const char *msg, ...)
3092 issue_warning_error_from_context (cl, msg, ap);
3096 /* Issue a warning at a current source line CL */
3099 parse_warning_context (tree cl, const char *msg, ...)
3104 force_error = do_warning = 1;
3105 issue_warning_error_from_context (cl, msg, ap);
3106 do_warning = force_error = 0;
3111 find_expr_with_wfl (tree node)
3118 switch (TREE_CODE (node))
3121 node = BLOCK_EXPR_BODY (node);
3125 to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
3128 node = TREE_OPERAND (node, 1);
3132 node = TREE_OPERAND (node, 0);
3135 case LABELED_BLOCK_EXPR:
3136 node = TREE_OPERAND (node, 1);
3140 code = TREE_CODE_CLASS (TREE_CODE (node));
3141 if (((code == '1') || (code == '2') || (code == 'e'))
3142 && EXPR_WFL_LINECOL (node))
3150 /* Issue a missing return statement error. Uses METHOD to figure the
3151 last line of the method the error occurs in. */
3154 missing_return_error (tree method)
3156 EXPR_WFL_SET_LINECOL (wfl_operator, DECL_FUNCTION_LAST_LINE (method), -2);
3157 parse_error_context (wfl_operator, "Missing return statement");
3160 /* Issue an unreachable statement error. From NODE, find the next
3161 statement to report appropriately. */
3163 unreachable_stmt_error (tree node)
3165 /* Browse node to find the next expression node that has a WFL. Use
3166 the location to report the error */
3167 if (TREE_CODE (node) == COMPOUND_EXPR)
3168 node = find_expr_with_wfl (TREE_OPERAND (node, 1));
3170 node = find_expr_with_wfl (node);
3174 EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
3175 parse_error_context (wfl_operator, "Unreachable statement");
3182 not_accessible_field_error (tree wfl, tree decl)
3185 (wfl, "Can't access %s field `%s.%s' from `%s'",
3186 accessibility_string (get_access_flags_from_decl (decl)),
3187 GET_TYPE_NAME (DECL_CONTEXT (decl)),
3188 IDENTIFIER_POINTER (DECL_NAME (decl)),
3189 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
3194 java_report_errors (void)
3196 if (java_error_count)
3197 fprintf (stderr, "%d error%s",
3198 java_error_count, (java_error_count == 1 ? "" : "s"));
3199 if (java_warning_count)
3200 fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
3201 java_warning_count, (java_warning_count == 1 ? "" : "s"));
3202 if (java_error_count || java_warning_count)
3203 putc ('\n', stderr);
3204 return java_error_count;
3208 java_accstring_lookup (int flags)
3210 static char buffer [80];
3211 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
3213 /* Access modifier looked-up first for easier report on forbidden
3215 if (flags & ACC_PUBLIC) COPY_RETURN ("public");
3216 if (flags & ACC_PRIVATE) COPY_RETURN ("private");
3217 if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
3218 if (flags & ACC_STATIC) COPY_RETURN ("static");
3219 if (flags & ACC_FINAL) COPY_RETURN ("final");
3220 if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
3221 if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
3222 if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
3223 if (flags & ACC_NATIVE) COPY_RETURN ("native");
3224 if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
3225 if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
3232 /* Returns a string denoting the accessibility of a class or a member as
3233 indicated by FLAGS. We need a separate function from
3234 java_accstring_lookup, as the latter can return spurious "static", etc.
3235 if package-private access is defined (in which case none of the
3236 relevant access control bits in FLAGS is set). */
3239 accessibility_string (int flags)
3241 if (flags & ACC_PRIVATE) return "private";
3242 if (flags & ACC_PROTECTED) return "protected";
3243 if (flags & ACC_PUBLIC) return "public";
3245 return "package-private";
3248 /* Issuing error messages upon redefinition of classes, interfaces or
3252 classitf_redefinition_error (const char *context, tree id, tree decl, tree cl)
3254 parse_error_context (cl, "%s `%s' already defined in %s:%d",
3255 context, IDENTIFIER_POINTER (id),
3256 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3257 /* Here we should point out where its redefined. It's a unicode. FIXME */
3261 variable_redefinition_error (tree context, tree name, tree type, int line)
3263 const char *type_name;
3265 /* Figure a proper name for type. We might haven't resolved it */
3266 if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
3267 type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
3269 type_name = lang_printable_name (type, 0);
3271 parse_error_context (context,
3272 "Variable `%s' is already defined in this method and was declared `%s %s' at line %d",
3273 IDENTIFIER_POINTER (name),
3274 type_name, IDENTIFIER_POINTER (name), line);
3277 /* If ANAME is terminated with `[]', it indicates an array. This
3278 function returns the number of `[]' found and if this number is
3279 greater than zero, it extracts the array type name and places it in
3280 the node pointed to by TRIMMED unless TRIMMED is null. */
3283 build_type_name_from_array_name (tree aname, tree *trimmed)
3285 const char *name = IDENTIFIER_POINTER (aname);
3286 int len = IDENTIFIER_LENGTH (aname);
3289 STRING_STRIP_BRACKETS (name, len, array_dims);
3291 if (array_dims && trimmed)
3292 *trimmed = get_identifier_with_length (name, len);
3298 build_array_from_name (tree type, tree type_wfl, tree name, tree *ret_name)
3302 /* Eventually get more dims */
3303 more_dims = build_type_name_from_array_name (name, &name);
3305 /* If we have, then craft a new type for this variable */
3310 /* If we have a pointer, use its type */
3311 if (TREE_CODE (type) == POINTER_TYPE)
3312 type = TREE_TYPE (type);
3314 /* Building the first dimension of a primitive type uses this
3316 if (JPRIMITIVE_TYPE_P (type))
3318 type = build_java_array_type (type, -1);
3321 /* Otherwise, if we have a WFL for this type, use it (the type
3322 is already an array on an unresolved type, and we just keep
3323 on adding dimensions) */
3327 more_dims += build_type_name_from_array_name (TYPE_NAME (save),
3331 /* Add all the dimensions */
3333 type = build_unresolved_array_type (type);
3335 /* The type may have been incomplete in the first place */
3337 type = obtain_incomplete_type (type);
3345 /* Build something that the type identifier resolver will identify as
3346 being an array to an unresolved type. TYPE_WFL is a WFL on a
3350 build_unresolved_array_type (tree type_or_wfl)
3355 /* TYPE_OR_WFL might be an array on a resolved type. In this case,
3356 just create a array type */
3357 if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
3358 return build_java_array_type (type_or_wfl, -1);
3360 obstack_grow (&temporary_obstack,
3361 IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
3362 IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
3363 obstack_grow0 (&temporary_obstack, "[]", 2);
3364 ptr = obstack_finish (&temporary_obstack);
3365 wfl = build_expr_wfl (get_identifier (ptr),
3366 EXPR_WFL_FILENAME (type_or_wfl),
3367 EXPR_WFL_LINENO (type_or_wfl),
3368 EXPR_WFL_COLNO (type_or_wfl));
3369 /* Re-install the existing qualifications so that the type can be
3370 resolved properly. */
3371 EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl);
3376 parser_add_interface (tree class_decl, tree interface_decl, tree wfl)
3378 if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
3379 parse_error_context (wfl, "Interface `%s' repeated",
3380 IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
3383 /* Bulk of common class/interface checks. Return 1 if an error was
3384 encountered. TAG is 0 for a class, 1 for an interface. */
3387 check_class_interface_creation (int is_interface, int flags, tree raw_name,
3388 tree qualified_name, tree decl, tree cl)
3391 int sca = 0; /* Static class allowed */
3392 int icaf = 0; /* Inner class allowed flags */
3393 int uaaf = CLASS_MODIFIERS; /* Usually allowed access flags */
3396 fprintf (stderr, " %s%s %s",
3397 (CPC_INNER_P () ? "inner" : ""),
3398 (is_interface ? "interface" : "class"),
3399 IDENTIFIER_POINTER (qualified_name));
3401 /* Scope of an interface/class type name:
3402 - Can't be imported by a single type import
3403 - Can't already exists in the package */
3404 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
3405 && (node = find_name_in_single_imports (raw_name))
3409 (cl, "%s name `%s' clashes with imported type `%s'",
3410 (is_interface ? "Interface" : "Class"),
3411 IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
3414 if (decl && CLASS_COMPLETE_P (decl))
3416 classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
3417 qualified_name, decl, cl);
3421 if (check_inner_class_redefinition (raw_name, cl))
3424 /* If public, file name should match class/interface name, except
3425 when dealing with an inner class */
3426 if (!CPC_INNER_P () && (flags & ACC_PUBLIC ))
3430 for (f = &input_filename [strlen (input_filename)];
3431 f != input_filename && ! IS_DIR_SEPARATOR (f[0]);
3434 if (IS_DIR_SEPARATOR (f[0]))
3436 if (strncmp (IDENTIFIER_POINTER (raw_name),
3437 f , IDENTIFIER_LENGTH (raw_name)) ||
3438 f [IDENTIFIER_LENGTH (raw_name)] != '.')
3440 (cl, "Public %s `%s' must be defined in a file called `%s.java'",
3441 (is_interface ? "interface" : "class"),
3442 IDENTIFIER_POINTER (qualified_name),
3443 IDENTIFIER_POINTER (raw_name));
3446 /* Static classes can be declared only in top level classes. Note:
3447 once static, a inner class is a top level class. */
3448 if (flags & ACC_STATIC)
3450 /* Catch the specific error of declaring an class inner class
3451 with no toplevel enclosing class. Prevent check_modifiers from
3452 complaining a second time */
3453 if (CPC_INNER_P () && !TOPLEVEL_CLASS_DECL_P (GET_CPC()))
3455 parse_error_context (cl, "Inner class `%s' can't be static. Static classes can only occur in interfaces and top-level classes",
3456 IDENTIFIER_POINTER (qualified_name));
3459 /* Else, in the context of a top-level class declaration, let
3460 `check_modifiers' do its job, otherwise, give it a go */
3462 sca = (GET_CPC_LIST () ? ACC_STATIC : 0);
3465 /* Inner classes can be declared private or protected
3466 within their enclosing classes. */
3469 /* A class which is local to a block can't be public, private,
3470 protected or static. But it is created final, so allow this
3472 if (current_function_decl)
3473 icaf = sca = uaaf = ACC_FINAL;
3476 check_modifiers_consistency (flags);
3477 icaf = ACC_PROTECTED;
3478 if (! CLASS_INTERFACE (GET_CPC ()))
3479 icaf |= ACC_PRIVATE;
3486 uaaf = INTERFACE_INNER_MODIFIERS;
3488 uaaf = INTERFACE_MODIFIERS;
3490 check_modifiers ("Illegal modifier `%s' for interface declaration",
3494 check_modifiers ((current_function_decl ?
3495 "Illegal modifier `%s' for local class declaration" :
3496 "Illegal modifier `%s' for class declaration"),
3497 flags, uaaf|sca|icaf);
3501 /* Construct a nested class name. If the final component starts with
3502 a digit, return true. Otherwise return false. */
3504 make_nested_class_name (tree cpc_list)
3511 make_nested_class_name (TREE_CHAIN (cpc_list));
3513 /* Pick the qualified name when dealing with the first upmost
3515 name = (TREE_CHAIN (cpc_list)
3516 ? TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list)));
3517 obstack_grow (&temporary_obstack,
3518 IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name));
3519 obstack_1grow (&temporary_obstack, '$');
3521 return ISDIGIT (IDENTIFIER_POINTER (name)[0]);
3524 /* Can't redefine a class already defined in an earlier scope. */
3527 check_inner_class_redefinition (tree raw_name, tree cl)
3531 for (scope_list = GET_CPC_LIST (); scope_list;
3532 scope_list = GET_NEXT_ENCLOSING_CPC (scope_list))
3533 if (raw_name == GET_CPC_UN_NODE (scope_list))
3536 (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",
3537 IDENTIFIER_POINTER (raw_name));
3543 /* Tries to find a decl for CLASS_TYPE within ENCLOSING. If we fail,
3544 we remember ENCLOSING and SUPER. */
3547 resolve_inner_class (htab_t circularity_hash, tree cl, tree *enclosing,
3548 tree *super, tree class_type)
3550 tree local_enclosing = *enclosing;
3551 tree local_super = NULL_TREE;
3553 while (local_enclosing)
3555 tree intermediate, decl;
3557 *htab_find_slot (circularity_hash, local_enclosing, INSERT) =
3560 if ((decl = find_as_inner_class (local_enclosing, class_type, cl)))
3563 intermediate = local_enclosing;
3564 /* Explore enclosing contexts. */
3565 while (INNER_CLASS_DECL_P (intermediate))
3567 intermediate = DECL_CONTEXT (intermediate);
3568 if ((decl = find_as_inner_class (intermediate, class_type, cl)))
3572 /* Now go to the upper classes, bail out if necessary. We will
3573 analyze the returned SUPER and act accordingly (see
3574 do_resolve_class). */
3575 if (JPRIMITIVE_TYPE_P (TREE_TYPE (local_enclosing))
3576 || TREE_TYPE (local_enclosing) == void_type_node)
3578 parse_error_context (cl, "Qualifier must be a reference");
3579 local_enclosing = NULL_TREE;
3582 local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing));
3583 if (!local_super || local_super == object_type_node)
3586 if (TREE_CODE (local_super) == POINTER_TYPE)
3587 local_super = do_resolve_class (NULL, local_super, NULL, NULL);
3589 local_super = TYPE_NAME (local_super);
3591 /* We may not have checked for circular inheritance yet, so do so
3592 here to prevent an infinite loop. */
3593 if (htab_find (circularity_hash, local_super) != NULL)
3596 cl = lookup_cl (local_enclosing);
3599 (cl, "Cyclic inheritance involving %s",
3600 IDENTIFIER_POINTER (DECL_NAME (local_enclosing)));
3601 local_enclosing = NULL_TREE;
3604 local_enclosing = local_super;
3607 /* We failed. Return LOCAL_SUPER and LOCAL_ENCLOSING. */
3608 *super = local_super;
3609 *enclosing = local_enclosing;
3614 /* Within ENCLOSING, find a decl for NAME and return it. NAME can be
3618 find_as_inner_class (tree enclosing, tree name, tree cl)
3620 tree qual, to_return;
3624 name = TYPE_NAME (name);
3626 /* First search: within the scope of `enclosing', search for name */
3627 if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3628 qual = EXPR_WFL_QUALIFICATION (cl);
3630 qual = build_tree_list (cl, NULL_TREE);
3632 qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3634 if ((to_return = find_as_inner_class_do (qual, enclosing)))
3637 /* We're dealing with a qualified name. Try to resolve thing until
3638 we get something that is an enclosing class. */
3639 if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3641 tree acc = NULL_TREE, decl = NULL_TREE, ptr;
3643 for (qual = EXPR_WFL_QUALIFICATION (cl); qual && !decl;
3644 qual = TREE_CHAIN (qual))
3646 acc = merge_qualified_name (acc,
3647 EXPR_WFL_NODE (TREE_PURPOSE (qual)));
3648 BUILD_PTR_FROM_NAME (ptr, acc);
3649 decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl);
3652 /* A NULL qual and a decl means that the search ended
3653 successfully?!? We have to do something then. FIXME */
3658 qual = EXPR_WFL_QUALIFICATION (cl);
3660 /* Otherwise, create a qual for the other part of the resolution. */
3662 qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3664 return find_as_inner_class_do (qual, enclosing);
3667 /* We go inside the list of sub classes and try to find a way
3671 find_as_inner_class_do (tree qual, tree enclosing)
3676 for (; qual && enclosing; qual = TREE_CHAIN (qual))
3678 tree name_to_match = EXPR_WFL_NODE (TREE_PURPOSE (qual));
3679 tree next_enclosing = NULL_TREE;
3682 for (inner_list = DECL_INNER_CLASS_LIST (enclosing);
3683 inner_list; inner_list = TREE_CHAIN (inner_list))
3685 if (TREE_VALUE (inner_list) == name_to_match)
3687 next_enclosing = TREE_PURPOSE (inner_list);
3691 enclosing = next_enclosing;
3694 return (!qual && enclosing ? enclosing : NULL_TREE);
3697 /* Reach all inner classes and tie their unqualified name to a
3701 set_nested_class_simple_name_value (tree outer, int set)
3705 for (l = DECL_INNER_CLASS_LIST (outer); l; l = TREE_CHAIN (l))
3706 IDENTIFIER_GLOBAL_VALUE (TREE_VALUE (l)) = (set ?
3707 TREE_PURPOSE (l) : NULL_TREE);
3711 link_nested_class_to_enclosing (void)
3713 if (GET_ENCLOSING_CPC ())
3715 tree enclosing = GET_ENCLOSING_CPC_CONTEXT ();
3716 DECL_INNER_CLASS_LIST (enclosing) =
3717 tree_cons (GET_CPC (), GET_CPC_UN (),
3718 DECL_INNER_CLASS_LIST (enclosing));
3723 maybe_make_nested_class_name (tree name)
3725 tree id = NULL_TREE;
3729 /* If we're in a function, we must append a number to create the
3730 nested class name. However, we don't do this if the class we
3731 are constructing is anonymous, because in that case we'll
3732 already have a number as the class name. */
3733 if (! make_nested_class_name (GET_CPC_LIST ())
3734 && current_function_decl != NULL_TREE
3735 && ! ISDIGIT (IDENTIFIER_POINTER (name)[0]))
3738 sprintf (buf, "%d", anonymous_class_counter);
3739 ++anonymous_class_counter;
3740 obstack_grow (&temporary_obstack, buf, strlen (buf));
3741 obstack_1grow (&temporary_obstack, '$');
3743 obstack_grow0 (&temporary_obstack,
3744 IDENTIFIER_POINTER (name),
3745 IDENTIFIER_LENGTH (name));
3746 id = get_identifier (obstack_finish (&temporary_obstack));
3748 QUALIFIED_P (id) = 1;
3753 /* If DECL is NULL, create and push a new DECL, record the current
3754 line CL and do other maintenance things. */
3757 maybe_create_class_interface_decl (tree decl, tree raw_name,
3758 tree qualified_name, tree cl)
3761 decl = push_class (make_class (), qualified_name);
3763 /* Take care of the file and line business */
3764 DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
3765 /* If we're emitting xrefs, store the line/col number information */
3767 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
3769 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
3770 CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
3771 CLASS_PARSED_P (TREE_TYPE (decl)) = 1;
3772 CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
3773 IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
3775 PUSH_CPC (decl, raw_name);
3776 DECL_CONTEXT (decl) = GET_ENCLOSING_CPC_CONTEXT ();
3778 /* Link the declaration to the already seen ones */
3779 TREE_CHAIN (decl) = ctxp->class_list;
3780 ctxp->class_list = decl;
3782 /* Create a new nodes in the global lists */
3783 gclass_list = tree_cons (NULL_TREE, decl, gclass_list);
3784 all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
3786 /* Install a new dependency list element */
3787 create_jdep_list (ctxp);
3789 SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
3790 IDENTIFIER_POINTER (qualified_name)));
3795 add_superinterfaces (tree decl, tree interface_list)
3798 /* Superinterface(s): if present and defined, parser_check_super_interface ()
3799 takes care of ensuring that:
3800 - This is an accessible interface type,
3801 - Circularity detection.
3802 parser_add_interface is then called. If present but not defined,
3803 the check operation is delayed until the super interface gets
3805 for (node = interface_list; node; node = TREE_CHAIN (node))
3807 tree current = TREE_PURPOSE (node);
3808 tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
3809 if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
3811 if (!parser_check_super_interface (idecl, decl, current))
3812 parser_add_interface (decl, idecl, current);
3815 register_incomplete_type (JDEP_INTERFACE,
3816 current, decl, NULL_TREE);
3820 /* Create an interface in pass1 and return its decl. Return the
3821 interface's decl in pass 2. */
3824 create_interface (int flags, tree id, tree super)
3826 tree raw_name = EXPR_WFL_NODE (id);
3827 tree q_name = parser_qualified_classname (raw_name);
3828 tree decl = IDENTIFIER_CLASS_VALUE (q_name);
3830 /* Certain syntax errors are making SUPER be like ID. Avoid this
3832 if (ctxp->class_err && id == super)
3835 EXPR_WFL_NODE (id) = q_name; /* Keep source location, even if refined. */
3837 /* Basic checks: scope, redefinition, modifiers */
3838 if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
3844 /* Suspend the current parsing context if we're parsing an inner
3848 java_parser_context_suspend ();
3849 /* Interface members are public. */
3850 if (CLASS_INTERFACE (GET_CPC ()))
3851 flags |= ACC_PUBLIC;
3854 /* Push a new context for (static) initialized upon declaration fields */
3855 java_parser_context_push_initialized_field ();
3857 /* Interface modifiers check
3858 - public/abstract allowed (already done at that point)
3859 - abstract is obsolete (comes first, it's a warning, or should be)
3860 - Can't use twice the same (checked in the modifier rule) */
3861 if ((flags & ACC_ABSTRACT) && flag_redundant)
3862 parse_warning_context
3863 (MODIFIER_WFL (ABSTRACT_TK),
3864 "Redundant use of `abstract' modifier. Interface `%s' is implicitly abstract", IDENTIFIER_POINTER (raw_name));
3866 /* Create a new decl if DECL is NULL, otherwise fix it */
3867 decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id);
3869 /* Set super info and mark the class a complete */
3870 set_super_info (ACC_INTERFACE | flags, TREE_TYPE (decl),
3871 object_type_node, ctxp->interface_number);
3872 ctxp->interface_number = 0;
3873 CLASS_COMPLETE_P (decl) = 1;
3874 add_superinterfaces (decl, super);
3876 /* Eventually sets the @deprecated tag flag */
3877 CHECK_DEPRECATED (decl);
3882 /* Patch anonymous class CLASS, by either extending or implementing
3886 patch_anonymous_class (tree type_decl, tree class_decl, tree wfl)
3888 tree class = TREE_TYPE (class_decl);
3889 tree type = TREE_TYPE (type_decl);
3890 tree binfo = TYPE_BINFO (class);
3892 /* If it's an interface, implement it */
3893 if (CLASS_INTERFACE (type_decl))
3898 if (parser_check_super_interface (type_decl, class_decl, wfl))
3901 s_binfo = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (class)), 0);
3902 length = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (class))+1;
3903 TYPE_BINFO_BASETYPES (class) = make_tree_vec (length);
3904 TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (class)), 0) = s_binfo;
3905 /* And add the interface */
3906 parser_add_interface (class_decl, type_decl, wfl);
3908 /* Otherwise, it's a type we want to extend */
3911 if (parser_check_super (type_decl, class_decl, wfl))
3913 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (binfo), 0)) = type;
3918 create_anonymous_class (int location, tree type_name)
3921 tree super = NULL_TREE, itf = NULL_TREE;
3922 tree id, type_decl, class;
3924 /* The unqualified name of the anonymous class. It's just a number. */
3925 sprintf (buffer, "%d", anonymous_class_counter++);
3926 id = build_wfl_node (get_identifier (buffer));
3927 EXPR_WFL_LINECOL (id) = location;
3929 /* We know about the type to extend/implement. We go ahead */
3930 if ((type_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (type_name))))
3932 /* Create a class which either implements on extends the designated
3933 class. The class bears an inaccessible name. */
3934 if (CLASS_INTERFACE (type_decl))
3936 /* It's OK to modify it here. It's been already used and
3937 shouldn't be reused */
3938 ctxp->interface_number = 1;
3939 /* Interfaces should presented as a list of WFLs */
3940 itf = build_tree_list (type_name, NULL_TREE);
3946 class = create_class (ACC_FINAL, id, super, itf);
3948 /* We didn't know anything about the stuff. We register a dependence. */
3950 register_incomplete_type (JDEP_ANONYMOUS, type_name, class, NULL_TREE);
3952 ANONYMOUS_CLASS_P (TREE_TYPE (class)) = 1;
3956 /* Create a class in pass1 and return its decl. Return class
3957 interface's decl in pass 2. */
3960 create_class (int flags, tree id, tree super, tree interfaces)
3962 tree raw_name = EXPR_WFL_NODE (id);
3963 tree class_id, decl;
3964 tree super_decl_type;
3966 /* Certain syntax errors are making SUPER be like ID. Avoid this
3968 if (ctxp->class_err && id == super)
3971 class_id = parser_qualified_classname (raw_name);
3972 decl = IDENTIFIER_CLASS_VALUE (class_id);
3973 EXPR_WFL_NODE (id) = class_id;
3975 /* Basic check: scope, redefinition, modifiers */
3976 if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
3982 /* Suspend the current parsing context if we're parsing an inner
3983 class or an anonymous class. */
3986 java_parser_context_suspend ();
3987 /* Interface members are public. */
3988 if (CLASS_INTERFACE (GET_CPC ()))
3989 flags |= ACC_PUBLIC;
3992 /* Push a new context for (static) initialized upon declaration fields */
3993 java_parser_context_push_initialized_field ();
3995 /* Class modifier check:
3996 - Allowed modifier (already done at that point)
3997 - abstract AND final forbidden
3998 - Public classes defined in the correct file */
3999 if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
4001 (id, "Class `%s' can't be declared both abstract and final",
4002 IDENTIFIER_POINTER (raw_name));
4004 /* Create a new decl if DECL is NULL, otherwise fix it */
4005 decl = maybe_create_class_interface_decl (decl, raw_name, class_id, id);
4007 /* If SUPER exists, use it, otherwise use Object */
4010 /* Can't extend java.lang.Object */
4011 if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
4013 parse_error_context (id, "Can't extend `java.lang.Object'");
4018 register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
4020 else if (TREE_TYPE (decl) != object_type_node)
4021 super_decl_type = object_type_node;
4022 /* We're defining java.lang.Object */
4024 super_decl_type = NULL_TREE;
4026 /* A class nested in an interface is implicitly static. */
4027 if (INNER_CLASS_DECL_P (decl)
4028 && CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (DECL_CONTEXT (decl)))))
4030 flags |= ACC_STATIC;
4033 /* Set super info and mark the class as complete. */
4034 set_super_info (flags, TREE_TYPE (decl), super_decl_type,
4035 ctxp->interface_number);
4036 ctxp->interface_number = 0;
4037 CLASS_COMPLETE_P (decl) = 1;
4038 add_superinterfaces (decl, interfaces);
4040 /* TYPE_VFIELD' is a compiler-generated field used to point to
4041 virtual function tables. In gcj, every class has a common base
4042 virtual function table in java.lang.object. */
4043 TYPE_VFIELD (TREE_TYPE (decl)) = TYPE_VFIELD (object_type_node);
4045 /* Add the private this$<n> field, Replicate final locals still in
4046 scope as private final fields mangled like val$<local_name>.
4047 This doesn't not occur for top level (static) inner classes. */
4048 if (PURE_INNER_CLASS_DECL_P (decl))
4049 add_inner_class_fields (decl, current_function_decl);
4051 /* If doing xref, store the location at which the inherited class
4052 (if any) was seen. */
4053 if (flag_emit_xref && super)
4054 DECL_INHERITED_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (super);
4056 /* Eventually sets the @deprecated tag flag */
4057 CHECK_DEPRECATED (decl);
4059 /* Reset the anonymous class counter when declaring non inner classes */
4060 if (!INNER_CLASS_DECL_P (decl))
4061 anonymous_class_counter = 1;
4066 /* End a class declaration: register the statements used to create
4067 finit$ and <clinit>, pop the current class and resume the prior
4068 parser context if necessary. */
4071 end_class_declaration (int resume)
4073 /* If an error occurred, context weren't pushed and won't need to be
4074 popped by a resume. */
4075 int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node;
4077 if (GET_CPC () != error_mark_node)
4078 dump_java_tree (TDI_class, GET_CPC ());
4080 java_parser_context_pop_initialized_field ();
4082 if (resume && no_error_occurred)
4083 java_parser_context_resume ();
4085 /* We're ending a class declaration, this is a good time to reset
4086 the interface cout. Note that might have been already done in
4087 create_interface, but if at that time an inner class was being
4088 dealt with, the interface count was reset in a context created
4089 for the sake of handling inner classes declaration. */
4090 ctxp->interface_number = 0;
4094 add_inner_class_fields (tree class_decl, tree fct_decl)
4096 tree block, marker, f;
4098 f = add_field (TREE_TYPE (class_decl),
4099 build_current_thisn (TREE_TYPE (class_decl)),
4100 build_pointer_type (TREE_TYPE (DECL_CONTEXT (class_decl))),
4102 FIELD_THISN (f) = 1;
4107 for (block = GET_CURRENT_BLOCK (fct_decl);
4108 block && TREE_CODE (block) == BLOCK; block = BLOCK_SUPERCONTEXT (block))
4111 for (decl = BLOCK_EXPR_DECLS (block); decl; decl = TREE_CHAIN (decl))
4114 tree wfl, init, list;
4116 /* Avoid non final arguments. */
4117 if (!LOCAL_FINAL_P (decl))
4120 MANGLE_OUTER_LOCAL_VARIABLE_NAME (name, DECL_NAME (decl));
4121 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID (pname, DECL_NAME (decl));
4122 wfl = build_wfl_node (name);
4123 init = build_wfl_node (pname);
4124 /* Build an initialization for the field: it will be
4125 initialized by a parameter added to finit$, bearing a
4126 mangled name of the field itself (param$<n>.) The
4127 parameter is provided to finit$ by the constructor
4128 invoking it (hence the constructor will also feature a
4129 hidden parameter, set to the value of the outer context
4130 local at the time the inner class is created.)
4132 Note: we take into account all possible locals that can
4133 be accessed by the inner class. It's actually not trivial
4134 to minimize these aliases down to the ones really
4135 used. One way to do that would be to expand all regular
4136 methods first, then finit$ to get a picture of what's
4137 used. It works with the exception that we would have to
4138 go back on all constructor invoked in regular methods to
4139 have their invocation reworked (to include the right amount
4140 of alias initializer parameters.)
4142 The only real way around, I think, is a first pass to
4143 identify locals really used in the inner class. We leave
4144 the flag FIELD_LOCAL_ALIAS_USED around for that future
4147 On the other hand, it only affect local inner classes,
4148 whose constructors (and finit$ call) will be featuring
4149 unnecessary arguments. It's easy for a developer to keep
4150 this number of parameter down by using the `final'
4151 keyword only when necessary. For the time being, we can
4152 issue a warning on unnecessary finals. FIXME */
4153 init = build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (wfl),
4156 /* Register the field. The TREE_LIST holding the part
4157 initialized/initializer will be marked ARG_FINAL_P so
4158 that the created field can be marked
4159 FIELD_LOCAL_ALIAS. */
4160 list = build_tree_list (wfl, init);
4161 ARG_FINAL_P (list) = 1;
4162 register_fields (ACC_PRIVATE | ACC_FINAL, TREE_TYPE (decl), list);
4166 if (!CPC_INITIALIZER_STMT (ctxp))
4169 /* If we ever registered an alias field, insert and marker to
4170 remember where the list ends. The second part of the list (the one
4171 featuring initialized fields) so it can be later reversed to
4172 enforce 8.5. The marker will be removed during that operation. */
4173 marker = build_tree_list (NULL_TREE, NULL_TREE);
4174 TREE_CHAIN (marker) = CPC_INITIALIZER_STMT (ctxp);
4175 SET_CPC_INITIALIZER_STMT (ctxp, marker);
4178 /* Can't use lookup_field () since we don't want to load the class and
4179 can't set the CLASS_LOADED_P flag */
4182 find_field (tree class, tree name)
4185 for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
4187 if (DECL_NAME (decl) == name)
4193 /* Wrap around lookup_field that doesn't potentially upset the value
4197 lookup_field_wrapper (tree class, tree name)
4200 tree decl = NULL_TREE;
4201 java_parser_context_save_global ();
4203 /* Last chance: if we're within the context of an inner class, we
4204 might be trying to access a local variable defined in an outer
4205 context. We try to look for it now. */
4206 if (INNER_CLASS_TYPE_P (class) && TREE_CODE (name) == IDENTIFIER_NODE)
4209 MANGLE_OUTER_LOCAL_VARIABLE_NAME (new_name, name);
4210 decl = lookup_field (&type, new_name);
4211 if (decl && decl != error_mark_node)
4212 FIELD_LOCAL_ALIAS_USED (decl) = 1;
4214 if (!decl || decl == error_mark_node)
4217 decl = lookup_field (&type, name);
4220 /* If the field still hasn't been found, try the next enclosing context. */
4221 if (!decl && INNER_CLASS_TYPE_P (class))
4223 tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class)));
4224 decl = lookup_field_wrapper (outer_type, name);
4227 java_parser_context_restore_global ();
4228 return decl == error_mark_node ? NULL : decl;
4231 /* Find duplicate field within the same class declarations and report
4232 the error. Returns 1 if a duplicated field was found, 0
4236 duplicate_declaration_error_p (tree new_field_name, tree new_type, tree cl)
4238 /* This might be modified to work with method decl as well */
4239 tree decl = find_field (TREE_TYPE (GET_CPC ()), new_field_name);
4242 char *t1 = xstrdup (purify_type_name
4243 ((TREE_CODE (new_type) == POINTER_TYPE
4244 && TREE_TYPE (new_type) == NULL_TREE) ?
4245 IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
4246 lang_printable_name (new_type, 1)));
4247 /* The type may not have been completed by the time we report
4249 char *t2 = xstrdup (purify_type_name
4250 ((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
4251 && TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
4252 IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
4253 lang_printable_name (TREE_TYPE (decl), 1)));
4255 (cl , "Duplicate variable declaration: `%s %s' was `%s %s' (%s:%d)",
4256 t1, IDENTIFIER_POINTER (new_field_name),
4257 t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
4258 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4266 /* Field registration routine. If TYPE doesn't exist, field
4267 declarations are linked to the undefined TYPE dependency list, to
4268 be later resolved in java_complete_class () */
4271 register_fields (int flags, tree type, tree variable_list)
4273 tree current, saved_type;
4274 tree class_type = NULL_TREE;
4275 int saved_lineno = input_line;
4277 tree wfl = NULL_TREE;
4280 class_type = TREE_TYPE (GET_CPC ());
4282 if (!class_type || class_type == error_mark_node)
4285 /* If we're adding fields to interfaces, those fields are public,
4287 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
4289 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
4290 flags, ACC_PUBLIC, "interface field(s)");
4291 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
4292 flags, ACC_STATIC, "interface field(s)");
4293 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
4294 flags, ACC_FINAL, "interface field(s)");
4295 check_modifiers ("Illegal interface member modifier `%s'", flags,
4296 INTERFACE_FIELD_MODIFIERS);
4297 flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
4300 /* Obtain a suitable type for resolution, if necessary */
4301 SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
4303 /* If TYPE is fully resolved and we don't have a reference, make one */
4304 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4306 for (current = variable_list, saved_type = type; current;
4307 current = TREE_CHAIN (current), type = saved_type)
4311 tree cl = TREE_PURPOSE (current);
4312 tree init = TREE_VALUE (current);
4313 tree current_name = EXPR_WFL_NODE (cl);
4315 /* Can't declare non-final static fields in inner classes */
4316 if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (class_type)
4317 && !(flags & ACC_FINAL))
4319 (cl, "Field `%s' can't be static in inner class `%s' unless it is final",
4320 IDENTIFIER_POINTER (EXPR_WFL_NODE (cl)),
4321 lang_printable_name (class_type, 0));
4323 /* Process NAME, as it may specify extra dimension(s) for it */
4324 type = build_array_from_name (type, wfl, current_name, ¤t_name);
4326 /* Type adjustment. We may have just readjusted TYPE because
4327 the variable specified more dimensions. Make sure we have
4328 a reference if we can and don't have one already. Also
4329 change the name if we have an init. */
4330 if (type != saved_type)
4332 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4334 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
4337 real_type = GET_REAL_TYPE (type);
4338 /* Check for redeclarations */
4339 if (duplicate_declaration_error_p (current_name, real_type, cl))
4342 /* Set lineno to the line the field was found and create a
4343 declaration for it. Eventually sets the @deprecated tag flag. */
4345 input_line = EXPR_WFL_LINECOL (cl);
4347 input_line = EXPR_WFL_LINENO (cl);
4348 field_decl = add_field (class_type, current_name, real_type, flags);
4349 CHECK_DEPRECATED_NO_RESET (field_decl);
4351 /* If the field denotes a final instance variable, then we
4352 allocate a LANG_DECL_SPECIFIC part to keep track of its
4353 initialization. We also mark whether the field was
4354 initialized upon its declaration. We don't do that if the
4355 created field is an alias to a final local. */
4356 if (!ARG_FINAL_P (current) && (flags & ACC_FINAL))
4358 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl);
4359 DECL_FIELD_FINAL_WFL (field_decl) = cl;
4362 /* If the couple initializer/initialized is marked ARG_FINAL_P,
4363 we mark the created field FIELD_LOCAL_ALIAS, so that we can
4364 hide parameters to this inner class finit$ and
4365 constructors. It also means that the field isn't final per
4367 if (ARG_FINAL_P (current))
4369 FIELD_LOCAL_ALIAS (field_decl) = 1;
4370 FIELD_FINAL (field_decl) = 0;
4373 /* Check if we must chain. */
4375 register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
4377 /* If we have an initialization value tied to the field */
4380 /* The field is declared static */
4381 if (flags & ACC_STATIC)
4383 /* We include the field and its initialization part into
4384 a list used to generate <clinit>. After <clinit> is
4385 walked, field initializations will be processed and
4386 fields initialized with known constants will be taken
4387 out of <clinit> and have their DECL_INITIAL set
4389 TREE_CHAIN (init) = CPC_STATIC_INITIALIZER_STMT (ctxp);
4390 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, init);
4391 if (TREE_OPERAND (init, 1)
4392 && TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
4393 TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
4395 /* A non-static field declared with an immediate initialization is
4396 to be initialized in <init>, if any. This field is remembered
4397 to be processed at the time of the generation of <init>. */
4400 TREE_CHAIN (init) = CPC_INITIALIZER_STMT (ctxp);
4401 SET_CPC_INITIALIZER_STMT (ctxp, init);
4403 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
4404 DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
4409 input_line = saved_lineno;
4412 /* Generate finit$, using the list of initialized fields to populate
4413 its body. finit$'s parameter(s) list is adjusted to include the
4414 one(s) used to initialized the field(s) caching outer context
4418 generate_finit (tree class_type)
4421 tree list = TYPE_FINIT_STMT_LIST (class_type);
4422 tree mdecl, current, parms;
4424 parms = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
4425 class_type, NULL_TREE,
4427 CRAFTED_PARAM_LIST_FIXUP (parms);
4428 mdecl = create_artificial_method (class_type, ACC_PRIVATE, void_type_node,
4429 finit_identifier_node, parms);
4430 fix_method_argument_names (parms, mdecl);
4431 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4433 DECL_FUNCTION_NAP (mdecl) = count;
4434 start_artificial_method_body (mdecl);
4436 for (current = list; current; current = TREE_CHAIN (current))
4437 java_method_add_stmt (mdecl,
4438 build_debugable_stmt (EXPR_WFL_LINECOL (current),
4440 end_artificial_method_body (mdecl);
4444 /* Generate a function to run the instance initialization code. The
4445 private method is called `instinit$'. Unless we're dealing with an
4446 anonymous class, we determine whether all ctors of CLASS_TYPE
4447 declare a checked exception in their `throws' clause in order to
4448 see whether it's necessary to encapsulate the instance initializer
4449 statements in a try/catch/rethrow sequence. */
4452 generate_instinit (tree class_type)
4455 tree compound = NULL_TREE;
4456 tree parms = tree_cons (this_identifier_node,
4457 build_pointer_type (class_type), end_params_node);
4458 tree mdecl = create_artificial_method (class_type, ACC_PRIVATE,
4460 instinit_identifier_node, parms);
4462 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4465 /* Gather all the statements in a compound */
4466 for (current = TYPE_II_STMT_LIST (class_type);
4467 current; current = TREE_CHAIN (current))
4468 compound = add_stmt_to_compound (compound, NULL_TREE, current);
4470 /* We need to encapsulate COMPOUND by a try/catch statement to
4471 rethrow exceptions that might occur in the instance initializer.
4472 We do that only if all ctors of CLASS_TYPE are set to catch a
4473 checked exception. This doesn't apply to anonymous classes (since
4474 they don't have declared ctors.) */
4475 if (!ANONYMOUS_CLASS_P (class_type) &&
4476 ctors_unchecked_throws_clause_p (class_type))
4478 compound = encapsulate_with_try_catch (0, exception_type_node, compound,
4479 build1 (THROW_EXPR, NULL_TREE,
4480 build_wfl_node (wpv_id)));
4481 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE,
4482 exception_type_node);
4485 start_artificial_method_body (mdecl);
4486 java_method_add_stmt (mdecl, compound);
4487 end_artificial_method_body (mdecl);
4494 build_instinit_invocation (tree class_type)
4496 tree to_return = NULL_TREE;
4498 if (TYPE_II_STMT_LIST (class_type))
4500 tree parm = build_tree_list (NULL_TREE,
4501 build_wfl_node (this_identifier_node));
4503 build_method_invocation (build_wfl_node (instinit_identifier_node),
4509 /* Shared across method_declarator and method_header to remember the
4510 patch stage that was reached during the declaration of the method.
4511 A method DECL is built differently is there is no patch
4512 (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
4513 pending on the currently defined method. */
4515 static int patch_stage;
4517 /* Check the method declaration and add the method to its current
4518 class. If the argument list is known to contain incomplete types,
4519 the method is partially added and the registration will be resume
4520 once the method arguments resolved. If TYPE is NULL, we're dealing
4521 with a constructor. */
4524 method_header (int flags, tree type, tree mdecl, tree throws)
4526 tree type_wfl = NULL_TREE;
4527 tree meth_name = NULL_TREE;
4528 tree current, orig_arg, this_class = NULL;
4531 int constructor_ok = 0, must_chain;
4534 if (mdecl == error_mark_node)
4535 return error_mark_node;
4536 meth = TREE_VALUE (mdecl);
4537 id = TREE_PURPOSE (mdecl);
4539 check_modifiers_consistency (flags);
4542 this_class = TREE_TYPE (GET_CPC ());
4544 if (!this_class || this_class == error_mark_node)
4547 /* There are some forbidden modifiers for an abstract method and its
4548 class must be abstract as well. */
4549 if (type && (flags & ACC_ABSTRACT))
4551 ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
4552 ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
4553 ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
4554 ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
4555 ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized");
4556 ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp");
4557 if (!CLASS_ABSTRACT (TYPE_NAME (this_class))
4558 && !CLASS_INTERFACE (TYPE_NAME (this_class)))
4560 (id, "Class `%s' must be declared abstract to define abstract method `%s'",
4561 IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())),
4562 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4565 /* A native method can't be strictfp. */
4566 if ((flags & ACC_NATIVE) && (flags & ACC_STRICT))
4567 parse_error_context (id, "native method `%s' can't be strictfp",
4568 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4569 /* No such thing as a transient or volatile method. */
4570 if ((flags & ACC_TRANSIENT))
4571 parse_error_context (id, "method `%s' can't be transient",
4572 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4573 if ((flags & ACC_VOLATILE))
4574 parse_error_context (id, "method `%s' can't be volatile",
4575 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4577 /* Things to be checked when declaring a constructor */
4580 int ec = java_error_count;
4581 /* 8.6: Constructor declarations: we might be trying to define a
4582 method without specifying a return type. */
4583 if (EXPR_WFL_NODE (id) != GET_CPC_UN ())
4585 (id, "Invalid method declaration, return type required");
4586 /* 8.6.3: Constructor modifiers */
4589 JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
4590 JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
4591 JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
4592 JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
4593 JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
4594 JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp");
4596 /* If we found error here, we don't consider it's OK to tread
4597 the method definition as a constructor, for the rest of this
4599 if (ec == java_error_count)
4603 /* Method declared within the scope of an interface are implicitly
4604 abstract and public. Conflicts with other erroneously provided
4605 modifiers are checked right after. */
4607 if (CLASS_INTERFACE (TYPE_NAME (this_class)))
4609 /* If FLAGS isn't set because of a modifier, turn the
4610 corresponding modifier WFL to NULL so we issue a warning on
4611 the obsolete use of the modifier */
4612 if (!(flags & ACC_PUBLIC))
4613 MODIFIER_WFL (PUBLIC_TK) = NULL;
4614 if (!(flags & ACC_ABSTRACT))
4615 MODIFIER_WFL (ABSTRACT_TK) = NULL;
4616 flags |= ACC_PUBLIC;
4617 flags |= ACC_ABSTRACT;
4620 /* Inner class can't declare static methods */
4621 if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (this_class))
4624 (id, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
4625 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)),
4626 lang_printable_name (this_class, 0));
4629 /* Modifiers context reset moved up, so abstract method declaration
4630 modifiers can be later checked. */
4632 /* Set constructor returned type to void and method name to <init>,
4633 unless we found an error identifier the constructor (in which
4634 case we retain the original name) */
4637 type = void_type_node;
4639 meth_name = init_identifier_node;
4642 meth_name = EXPR_WFL_NODE (id);
4644 /* Do the returned type resolution and registration if necessary */
4645 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4648 type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
4649 EXPR_WFL_NODE (id) = meth_name;
4650 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4654 patch_stage = JDEP_METHOD_RETURN;
4655 register_incomplete_type (patch_stage, type_wfl, id, type);
4656 TREE_TYPE (meth) = GET_REAL_TYPE (type);
4659 TREE_TYPE (meth) = type;
4661 saved_lineno = input_line;
4662 /* When defining an abstract or interface method, the curly
4663 bracket at level 1 doesn't exist because there is no function
4665 input_line = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
4666 EXPR_WFL_LINENO (id));
4668 /* Remember the original argument list */
4669 orig_arg = TYPE_ARG_TYPES (meth);
4671 if (patch_stage) /* includes ret type and/or all args */
4674 meth = add_method_1 (this_class, flags, meth_name, meth);
4675 /* Patch for the return type */
4676 if (patch_stage == JDEP_METHOD_RETURN)
4678 jdep = CLASSD_LAST (ctxp->classd_list);
4679 JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
4681 /* This is the stop JDEP. METH allows the function's signature
4683 register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
4686 meth = add_method (this_class, flags, meth_name,
4687 build_java_signature (meth));
4689 /* Remember final parameters */
4690 MARK_FINAL_PARMS (meth, orig_arg);
4692 /* Fix the method argument list so we have the argument name
4694 fix_method_argument_names (orig_arg, meth);
4696 /* Register the parameter number and re-install the current line
4698 DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
4699 input_line = saved_lineno;
4701 /* Register exception specified by the `throws' keyword for
4702 resolution and set the method decl appropriate field to the list.
4703 Note: the grammar ensures that what we get here are class
4707 throws = nreverse (throws);
4708 for (current = throws; current; current = TREE_CHAIN (current))
4710 register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
4711 NULL_TREE, NULL_TREE);
4712 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
4713 &TREE_VALUE (current);
4715 DECL_FUNCTION_THROWS (meth) = throws;
4718 if (TREE_TYPE (GET_CPC ()) != object_type_node)
4719 DECL_FUNCTION_WFL (meth) = id;
4721 /* Set the flag if we correctly processed a constructor */
4724 DECL_CONSTRUCTOR_P (meth) = 1;
4725 /* Compute and store the number of artificial parameters declared
4726 for this constructor */
4727 for (count = 0, current = TYPE_FIELDS (this_class); current;
4728 current = TREE_CHAIN (current))
4729 if (FIELD_LOCAL_ALIAS (current))
4731 DECL_FUNCTION_NAP (meth) = count;
4734 /* Eventually set the @deprecated tag flag */
4735 CHECK_DEPRECATED (meth);
4737 /* If doing xref, store column and line number information instead
4738 of the line number only. */
4740 DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
4746 fix_method_argument_names (tree orig_arg, tree meth)
4748 tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
4749 if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
4751 TREE_PURPOSE (arg) = this_identifier_node;
4752 arg = TREE_CHAIN (arg);
4754 while (orig_arg != end_params_node)
4756 TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
4757 orig_arg = TREE_CHAIN (orig_arg);
4758 arg = TREE_CHAIN (arg);
4762 /* Complete the method declaration with METHOD_BODY. */
4765 finish_method_declaration (tree method_body)
4769 if (!current_function_decl)
4772 flags = get_access_flags_from_decl (current_function_decl);
4774 /* 8.4.5 Method Body */
4775 if ((flags & ACC_ABSTRACT || flags & ACC_NATIVE) && method_body)
4777 tree name = DECL_NAME (current_function_decl);
4778 parse_error_context (DECL_FUNCTION_WFL (current_function_decl),
4779 "%s method `%s' can't have a body defined",
4780 (METHOD_NATIVE (current_function_decl) ?
4781 "Native" : "Abstract"),
4782 IDENTIFIER_POINTER (name));
4783 method_body = NULL_TREE;
4785 else if (!(flags & ACC_ABSTRACT) && !(flags & ACC_NATIVE) && !method_body)
4787 tree name = DECL_NAME (current_function_decl);
4789 (DECL_FUNCTION_WFL (current_function_decl),
4790 "Non native and non abstract method `%s' must have a body defined",
4791 IDENTIFIER_POINTER (name));
4792 method_body = NULL_TREE;
4795 if (flag_emit_class_files && method_body
4796 && TREE_CODE (method_body) == NOP_EXPR
4797 && TREE_TYPE (current_function_decl)
4798 && TREE_TYPE (TREE_TYPE (current_function_decl)) == void_type_node)
4799 method_body = build1 (RETURN_EXPR, void_type_node, NULL);
4801 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
4802 maybe_absorb_scoping_blocks ();
4803 /* Exit function's body */
4805 /* Merge last line of the function with first line, directly in the
4806 function decl. It will be used to emit correct debug info. */
4807 if (!flag_emit_xref)
4808 DECL_FUNCTION_LAST_LINE (current_function_decl) = ctxp->last_ccb_indent1;
4810 /* Since function's argument's list are shared, reset the
4811 ARG_FINAL_P parameter that might have been set on some of this
4812 function parameters. */
4813 UNMARK_FINAL_PARMS (current_function_decl);
4815 /* So we don't have an irrelevant function declaration context for
4816 the next static block we'll see. */
4817 current_function_decl = NULL_TREE;
4820 /* Build a an error message for constructor circularity errors. */
4823 constructor_circularity_msg (tree from, tree to)
4825 static char string [4096];
4826 char *t = xstrdup (lang_printable_name (from, 0));
4827 sprintf (string, "`%s' invokes `%s'", t, lang_printable_name (to, 0));
4832 /* Verify a circular call to METH. Return 1 if an error is found, 0
4835 static GTY(()) tree vcc_list;
4837 verify_constructor_circularity (tree meth, tree current)
4841 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4843 if (TREE_VALUE (c) == meth)
4849 vcc_list = nreverse (vcc_list);
4850 for (liste = vcc_list; liste; liste = TREE_CHAIN (liste))
4853 (TREE_PURPOSE (TREE_PURPOSE (liste)), "%s",
4854 constructor_circularity_msg
4855 (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
4859 t = xstrdup (lang_printable_name (meth, 0));
4860 parse_error_context (TREE_PURPOSE (c),
4861 "%s: recursive invocation of constructor `%s'",
4862 constructor_circularity_msg (current, meth), t);
4864 vcc_list = NULL_TREE;
4868 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4870 vcc_list = tree_cons (c, current, vcc_list);
4871 if (verify_constructor_circularity (meth, TREE_VALUE (c)))
4873 vcc_list = TREE_CHAIN (vcc_list);
4878 /* Check modifiers that can be declared but exclusively */
4881 check_modifiers_consistency (int flags)
4884 tree cl = NULL_TREE;
4886 THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, PUBLIC_TK, acc_count, cl);
4887 THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, PRIVATE_TK, acc_count, cl);
4888 THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, PROTECTED_TK, acc_count, cl);
4891 (cl, "Inconsistent member declaration. At most one of `public', `private', or `protected' may be specified");
4895 THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK, acc_count, cl);
4896 THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK, acc_count, cl);
4898 parse_error_context (cl,
4899 "Inconsistent member declaration. At most one of `final' or `volatile' may be specified");
4902 /* Check the methode header METH for abstract specifics features */
4905 check_abstract_method_header (tree meth)
4907 int flags = get_access_flags_from_decl (meth);
4909 OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (ABSTRACT_TK), flags,
4910 ACC_ABSTRACT, "abstract method",
4911 IDENTIFIER_POINTER (DECL_NAME (meth)));
4912 OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (PUBLIC_TK), flags,
4913 ACC_PUBLIC, "abstract method",
4914 IDENTIFIER_POINTER (DECL_NAME (meth)));
4916 check_modifiers ("Illegal modifier `%s' for interface method",
4917 flags, INTERFACE_METHOD_MODIFIERS);
4920 /* Create a FUNCTION_TYPE node and start augmenting it with the
4921 declared function arguments. Arguments type that can't be resolved
4922 are left as they are, but the returned node is marked as containing
4923 incomplete types. */
4926 method_declarator (tree id, tree list)
4928 tree arg_types = NULL_TREE, current, node;
4929 tree meth = make_node (FUNCTION_TYPE);
4932 patch_stage = JDEP_NO_PATCH;
4934 if (GET_CPC () == error_mark_node)
4935 return error_mark_node;
4937 /* If we're dealing with an inner class constructor, we hide the
4938 this$<n> decl in the name field of its parameter declaration. We
4939 also might have to hide the outer context local alias
4940 initializers. Not done when the class is a toplevel class. */
4941 if (PURE_INNER_CLASS_DECL_P (GET_CPC ())
4942 && EXPR_WFL_NODE (id) == GET_CPC_UN ())
4944 tree aliases_list, type, thisn;
4945 /* First the aliases, linked to the regular parameters */
4947 build_alias_initializer_parameter_list (AIPL_FUNCTION_DECLARATION,
4948 TREE_TYPE (GET_CPC ()),
4950 list = chainon (nreverse (aliases_list), list);
4953 type = TREE_TYPE (DECL_CONTEXT (GET_CPC ()));
4954 thisn = build_current_thisn (TREE_TYPE (GET_CPC ()));
4955 list = tree_cons (build_wfl_node (thisn), build_pointer_type (type),
4959 for (current = list; current; current = TREE_CHAIN (current))
4962 tree wfl_name = TREE_PURPOSE (current);
4963 tree type = TREE_VALUE (current);
4964 tree name = EXPR_WFL_NODE (wfl_name);
4965 tree already, arg_node;
4966 tree type_wfl = NULL_TREE;
4969 /* Obtain a suitable type for resolution, if necessary */
4970 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4972 /* Process NAME, as it may specify extra dimension(s) for it */
4973 type = build_array_from_name (type, type_wfl, name, &name);
4974 EXPR_WFL_NODE (wfl_name) = name;
4976 real_type = GET_REAL_TYPE (type);
4977 if (TREE_CODE (real_type) == RECORD_TYPE)
4979 real_type = promote_type (real_type);
4980 if (TREE_CODE (type) == TREE_LIST)
4981 TREE_PURPOSE (type) = real_type;
4984 /* Check redefinition */
4985 for (already = arg_types; already; already = TREE_CHAIN (already))
4986 if (TREE_PURPOSE (already) == name)
4989 (wfl_name, "Variable `%s' is used more than once in the argument list of method `%s'",
4990 IDENTIFIER_POINTER (name),
4991 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4995 /* If we've an incomplete argument type, we know there is a location
4996 to patch when the type get resolved, later. */
5000 patch_stage = JDEP_METHOD;
5001 type = register_incomplete_type (patch_stage,
5002 type_wfl, wfl_name, type);
5003 jdep = CLASSD_LAST (ctxp->classd_list);
5004 JDEP_MISC (jdep) = id;
5007 /* The argument node: a name and a (possibly) incomplete type. */
5008 arg_node = build_tree_list (name, real_type);
5009 /* Remember arguments declared final. */
5010 ARG_FINAL_P (arg_node) = ARG_FINAL_P (current);
5013 JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
5014 TREE_CHAIN (arg_node) = arg_types;
5015 arg_types = arg_node;
5017 TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
5018 node = build_tree_list (id, meth);
5023 unresolved_type_p (tree wfl, tree *returned)
5026 if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
5030 tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
5031 if (decl && current_class && (decl == TYPE_NAME (current_class)))
5032 *returned = TREE_TYPE (decl);
5033 else if (GET_CPC_UN () == EXPR_WFL_NODE (wfl))
5034 *returned = TREE_TYPE (GET_CPC ());
5036 *returned = NULL_TREE;
5045 /* From NAME, build a qualified identifier node using the
5046 qualification from the current package definition. */
5049 parser_qualified_classname (tree name)
5051 tree nested_class_name;
5053 if ((nested_class_name = maybe_make_nested_class_name (name)))
5054 return nested_class_name;
5057 return merge_qualified_name (ctxp->package, name);
5062 /* Called once the type a interface extends is resolved. Returns 0 if
5063 everything is OK. */
5066 parser_check_super_interface (tree super_decl, tree this_decl, tree this_wfl)
5068 tree super_type = TREE_TYPE (super_decl);
5070 /* Has to be an interface */
5071 if (!CLASS_INTERFACE (super_decl))
5074 (this_wfl, "%s `%s' can't implement/extend %s `%s'",
5075 (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
5076 "Interface" : "Class"),
5077 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5078 (TYPE_ARRAY_P (super_type) ? "array" : "class"),
5079 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5083 /* Check top-level interface access. Inner classes are subject to member
5084 access rules (6.6.1). */
5085 if (! INNER_CLASS_P (super_type)
5086 && check_pkg_class_access (DECL_NAME (super_decl),
5087 NULL_TREE, true, this_decl))
5090 SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
5091 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5092 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5096 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
5097 0 if everything is OK. */
5100 parser_check_super (tree super_decl, tree this_decl, tree wfl)
5102 tree super_type = TREE_TYPE (super_decl);
5104 /* SUPER should be a CLASS (neither an array nor an interface) */
5105 if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
5108 (wfl, "Class `%s' can't subclass %s `%s'",
5109 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5110 (CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
5111 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5115 if (CLASS_FINAL (TYPE_NAME (super_type)))
5117 parse_error_context (wfl, "Can't subclass final classes: %s",
5118 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5122 /* Check top-level class scope. Inner classes are subject to member access
5124 if (! INNER_CLASS_P (super_type)
5125 && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true, NULL_TREE)))
5128 SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
5129 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5130 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5134 /* Create a new dependency list and link it (in a LIFO manner) to the
5135 CTXP list of type dependency list. */
5138 create_jdep_list (struct parser_ctxt *ctxp)
5140 jdeplist *new = xmalloc (sizeof (jdeplist));
5141 new->first = new->last = NULL;
5142 new->next = ctxp->classd_list;
5143 ctxp->classd_list = new;
5147 reverse_jdep_list (struct parser_ctxt *ctxp)
5149 jdeplist *prev = NULL, *current, *next;
5150 for (current = ctxp->classd_list; current; current = next)
5152 next = current->next;
5153 current->next = prev;
5159 /* Create a fake pointer based on the ID stored in
5160 TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
5161 registered again. */
5164 obtain_incomplete_type (tree type_name)
5166 tree ptr = NULL_TREE, name;
5168 if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
5169 name = EXPR_WFL_NODE (type_name);
5170 else if (INCOMPLETE_TYPE_P (type_name))
5171 name = TYPE_NAME (type_name);
5175 /* Workaround from build_pointer_type for incomplete types. */
5176 BUILD_PTR_FROM_NAME (ptr, name);
5177 TYPE_MODE (ptr) = ptr_mode;
5183 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
5184 non NULL instead of computing a new fake type based on WFL. The new
5185 dependency is inserted in the current type dependency list, in FIFO
5189 register_incomplete_type (int kind, tree wfl, tree decl, tree ptr)
5191 jdep *new = xmalloc (sizeof (jdep));
5193 if (!ptr && kind != JDEP_METHOD_END) /* JDEP_METHOD_END is a mere marker */
5194 ptr = obtain_incomplete_type (wfl);
5196 JDEP_KIND (new) = kind;
5197 JDEP_DECL (new) = decl;
5198 JDEP_TO_RESOLVE (new) = ptr;
5199 JDEP_WFL (new) = wfl;
5200 JDEP_CHAIN (new) = NULL;
5201 JDEP_MISC (new) = NULL_TREE;
5202 /* For some dependencies, set the enclosing class of the current
5203 class to be the enclosing context */
5204 if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS)
5205 && GET_ENCLOSING_CPC ())
5206 JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ());
5207 else if (kind == JDEP_SUPER)
5208 JDEP_ENCLOSING (new) = (GET_ENCLOSING_CPC () ?
5209 TREE_VALUE (GET_ENCLOSING_CPC ()) : NULL_TREE);
5211 JDEP_ENCLOSING (new) = GET_CPC ();
5212 JDEP_GET_PATCH (new) = (tree *)NULL;
5214 JDEP_INSERT (ctxp->classd_list, new);
5219 /* This checks for circular references with innerclasses. We start
5220 from SOURCE and should never reach TARGET. Extended/implemented
5221 types in SOURCE have their enclosing context checked not to reach
5222 TARGET. When the last enclosing context of SOURCE is reached, its
5223 extended/implemented types are also checked not to reach TARGET.
5224 In case of error, WFL of the offending type is returned; NULL_TREE
5228 check_inner_circular_reference (tree source, tree target)
5230 tree basetype_vec = TYPE_BINFO_BASETYPES (source);
5237 for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
5241 /* We can end up with a NULL_TREE or an incomplete type here if
5242 we encountered previous type resolution errors. It's safe to
5243 simply ignore these cases. */
5244 if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE)
5246 su = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
5247 if (INCOMPLETE_TYPE_P (su))
5250 if (inherits_from_p (su, target))
5251 return lookup_cl (TYPE_NAME (su));
5253 for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx))
5255 /* An enclosing context shouldn't be TARGET */
5256 if (ctx == TYPE_NAME (target))
5257 return lookup_cl (TYPE_NAME (su));
5259 /* When we reach the enclosing last context, start a check
5260 on it, with the same target */
5261 if (! DECL_CONTEXT (ctx) &&
5262 (cl = check_inner_circular_reference (TREE_TYPE (ctx), target)))
5269 /* Explore TYPE's `extends' clause member(s) and return the WFL of the
5270 offending type if a circularity is detected. NULL_TREE is returned
5271 otherwise. TYPE can be an interface or a class. */
5274 check_circular_reference (tree type)
5276 tree basetype_vec = TYPE_BINFO_BASETYPES (type);
5282 if (! CLASS_INTERFACE (TYPE_NAME (type)))
5284 if (inherits_from_p (CLASSTYPE_SUPER (type), type))
5285 return lookup_cl (TYPE_NAME (type));
5289 for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
5291 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
5292 if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node
5293 && interface_of_p (type, BINFO_TYPE (vec_elt)))
5294 return lookup_cl (TYPE_NAME (BINFO_TYPE (vec_elt)));
5300 java_check_circular_reference (void)
5303 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5305 tree type = TREE_TYPE (current);
5308 cl = check_circular_reference (type);
5310 cl = check_inner_circular_reference (type, type);
5312 parse_error_context (cl, "Cyclic class inheritance%s",
5313 (cyclic_inheritance_report ?
5314 cyclic_inheritance_report : ""));
5318 /* Augment the parameter list PARM with parameters crafted to
5319 initialize outer context locals aliases. Through ARTIFICIAL, a
5320 count is kept of the number of crafted parameters. MODE governs
5321 what eventually gets created: something suitable for a function
5322 creation or a function invocation, either the constructor or
5326 build_alias_initializer_parameter_list (int mode, tree class_type, tree parm,
5330 tree additional_parms = NULL_TREE;
5332 for (field = TYPE_FIELDS (class_type); field; field = TREE_CHAIN (field))
5333 if (FIELD_LOCAL_ALIAS (field))
5335 const char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
5336 tree purpose = NULL_TREE, value = NULL_TREE, name = NULL_TREE;
5341 case AIPL_FUNCTION_DECLARATION:
5342 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5344 purpose = build_wfl_node (mangled_id);
5345 if (TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE)
5346 value = build_wfl_node (TYPE_NAME (TREE_TYPE (field)));
5348 value = TREE_TYPE (field);
5351 case AIPL_FUNCTION_CREATION:
5352 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (purpose,
5354 value = TREE_TYPE (field);
5357 case AIPL_FUNCTION_FINIT_INVOCATION:
5358 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5360 /* Now, this is wrong. purpose should always be the NAME
5361 of something and value its matching value (decl, type,
5362 etc...) FIXME -- but there is a lot to fix. */
5364 /* When invoked for this kind of operation, we already
5365 know whether a field is used or not. */
5366 purpose = TREE_TYPE (field);
5367 value = build_wfl_node (mangled_id);
5370 case AIPL_FUNCTION_CTOR_INVOCATION:
5371 /* There are two case: the constructor invocation happens
5372 outside the local inner, in which case, locales from the outer
5373 context are directly used.
5375 Otherwise, we fold to using the alias directly. */
5376 if (class_type == current_class)
5380 name = get_identifier (&buffer[4]);
5381 value = IDENTIFIER_LOCAL_VALUE (name);
5385 additional_parms = tree_cons (purpose, value, additional_parms);
5389 if (additional_parms)
5391 if (ANONYMOUS_CLASS_P (class_type)
5392 && mode == AIPL_FUNCTION_CTOR_INVOCATION)
5393 additional_parms = nreverse (additional_parms);
5394 parm = chainon (additional_parms, parm);
5400 /* Craft a constructor for CLASS_DECL -- what we should do when none
5401 where found. ARGS is non NULL when a special signature must be
5402 enforced. This is the case for anonymous classes. */
5405 craft_constructor (tree class_decl, tree args)
5407 tree class_type = TREE_TYPE (class_decl);
5408 tree parm = NULL_TREE;
5409 int flags = (get_access_flags_from_decl (class_decl) & ACC_PUBLIC ?
5411 int i = 0, artificial = 0;
5412 tree decl, ctor_name;
5415 /* The constructor name is <init> unless we're dealing with an
5416 anonymous class, in which case the name will be fixed after having
5418 if (ANONYMOUS_CLASS_P (class_type))
5419 ctor_name = DECL_NAME (class_decl);
5421 ctor_name = init_identifier_node;
5423 /* If we're dealing with an inner class constructor, we hide the
5424 this$<n> decl in the name field of its parameter declaration. */
5425 if (PURE_INNER_CLASS_TYPE_P (class_type))
5427 tree type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_type)));
5428 parm = tree_cons (build_current_thisn (class_type),
5429 build_pointer_type (type), parm);
5431 /* Some more arguments to be hidden here. The values of the local
5432 variables of the outer context that the inner class needs to see. */
5433 parm = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
5438 /* Then if there are any args to be enforced, enforce them now */
5439 for (; args && args != end_params_node; args = TREE_CHAIN (args))
5441 sprintf (buffer, "parm%d", i++);
5442 parm = tree_cons (get_identifier (buffer), TREE_VALUE (args), parm);
5445 CRAFTED_PARAM_LIST_FIXUP (parm);
5446 decl = create_artificial_method (class_type, flags, void_type_node,
5448 fix_method_argument_names (parm, decl);
5449 /* Now, mark the artificial parameters. */
5450 DECL_FUNCTION_NAP (decl) = artificial;
5451 DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1;
5452 DECL_INLINE (decl) = 1;
5457 /* Fix the constructors. This will be called right after circular
5458 references have been checked. It is necessary to fix constructors
5459 early even if no code generation will take place for that class:
5460 some generated constructor might be required by the class whose
5461 compilation triggered this one to be simply loaded. */
5464 java_fix_constructors (void)
5468 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5470 tree class_type = TREE_TYPE (current);
5474 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
5477 output_class = current_class = class_type;
5478 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
5480 if (DECL_CONSTRUCTOR_P (decl))
5482 fix_constructors (decl);
5487 /* Anonymous class constructor can't be generated that early. */
5488 if (!saw_ctor && !ANONYMOUS_CLASS_P (class_type))
5489 craft_constructor (current, NULL_TREE);
5493 /* safe_layout_class just makes sure that we can load a class without
5494 disrupting the current_class, input_file, lineno, etc, information
5495 about the class processed currently. */
5498 safe_layout_class (tree class)
5500 tree save_current_class = current_class;
5501 location_t save_location = input_location;
5503 layout_class (class);
5505 current_class = save_current_class;
5506 input_location = save_location;
5510 jdep_resolve_class (jdep *dep)
5514 if (JDEP_RESOLVED_P (dep))
5515 decl = JDEP_RESOLVED_DECL (dep);
5518 decl = resolve_class (JDEP_ENCLOSING (dep), JDEP_TO_RESOLVE (dep),
5519 JDEP_DECL (dep), JDEP_WFL (dep));
5520 JDEP_RESOLVED (dep, decl);
5521 /* If there is no WFL, that's ok. We generate this warning
5523 if (decl && JDEP_WFL (dep) != NULL_TREE)
5524 check_deprecation (JDEP_WFL (dep), decl);
5528 complete_class_report_errors (dep);
5529 else if (PURE_INNER_CLASS_DECL_P (decl))
5531 tree inner = TREE_TYPE (decl);
5532 if (! CLASS_LOADED_P (inner))
5534 safe_layout_class (inner);
5535 if (TYPE_SIZE (inner) == error_mark_node)
5536 TYPE_SIZE (inner) = NULL_TREE;
5538 check_inner_class_access (decl, JDEP_ENCLOSING (dep), JDEP_WFL (dep));
5543 /* Complete unsatisfied class declaration and their dependencies */
5546 java_complete_class (void)
5553 /* Process imports */
5556 /* Reverse things so we have the right order */
5557 ctxp->class_list = nreverse (ctxp->class_list);
5558 ctxp->classd_list = reverse_jdep_list (ctxp);
5560 for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
5562 cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
5566 /* We keep the compilation unit imports in the class so that
5567 they can be used later to resolve type dependencies that
5568 aren't necessary to solve now. */
5569 TYPE_IMPORT_LIST (TREE_TYPE (cclass)) = ctxp->import_list;
5570 TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (cclass)) = ctxp->import_demand_list;
5572 for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
5575 if (!(decl = jdep_resolve_class (dep)))
5578 /* Now it's time to patch */
5579 switch (JDEP_KIND (dep))
5582 /* Simply patch super */
5583 if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
5585 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO
5586 (TREE_TYPE (JDEP_DECL (dep)))), 0)) = TREE_TYPE (decl);
5591 /* We do part of the job done in add_field */
5592 tree field_decl = JDEP_DECL (dep);
5593 tree field_type = TREE_TYPE (decl);
5594 if (TREE_CODE (field_type) == RECORD_TYPE)
5595 field_type = promote_type (field_type);
5596 TREE_TYPE (field_decl) = field_type;
5597 DECL_ALIGN (field_decl) = 0;
5598 DECL_USER_ALIGN (field_decl) = 0;
5599 layout_decl (field_decl, 0);
5600 SOURCE_FRONTEND_DEBUG
5601 (("Completed field/var decl `%s' with `%s'",
5602 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
5603 IDENTIFIER_POINTER (DECL_NAME (decl))));
5606 case JDEP_METHOD: /* We start patching a method */
5607 case JDEP_METHOD_RETURN:
5613 type = TREE_TYPE(decl);
5614 if (TREE_CODE (type) == RECORD_TYPE)
5615 type = promote_type (type);
5616 JDEP_APPLY_PATCH (dep, type);
5617 SOURCE_FRONTEND_DEBUG
5618 (((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
5619 "Completing fct `%s' with ret type `%s'":
5620 "Completing arg `%s' with type `%s'"),
5621 IDENTIFIER_POINTER (EXPR_WFL_NODE
5622 (JDEP_DECL_WFL (dep))),
5623 IDENTIFIER_POINTER (DECL_NAME (decl))));
5627 dep = JDEP_CHAIN (dep);
5628 if (JDEP_KIND (dep) == JDEP_METHOD_END)
5631 decl = jdep_resolve_class (dep);
5635 tree mdecl = JDEP_DECL (dep), signature;
5636 /* Recompute and reset the signature, check first that
5637 all types are now defined. If they're not,
5638 don't build the signature. */
5639 if (check_method_types_complete (mdecl))
5641 signature = build_java_signature (TREE_TYPE (mdecl));
5642 set_java_signature (TREE_TYPE (mdecl), signature);
5649 case JDEP_INTERFACE:
5650 if (parser_check_super_interface (decl, JDEP_DECL (dep),
5653 parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
5658 type = TREE_TYPE(decl);
5659 if (TREE_CODE (type) == RECORD_TYPE)
5660 type = promote_type (type);
5661 JDEP_APPLY_PATCH (dep, type);
5665 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5666 SOURCE_FRONTEND_DEBUG
5667 (("Completing a random type dependency on a '%s' node",
5668 tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
5671 case JDEP_EXCEPTION:
5672 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5673 SOURCE_FRONTEND_DEBUG
5674 (("Completing `%s' `throws' argument node",
5675 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
5678 case JDEP_ANONYMOUS:
5679 patch_anonymous_class (decl, JDEP_DECL (dep), JDEP_WFL (dep));
5690 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
5694 resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5696 tree tname = TYPE_NAME (class_type);
5697 tree resolved_type = TREE_TYPE (class_type);
5699 tree resolved_type_decl;
5701 if (resolved_type != NULL_TREE)
5703 tree resolved_type_decl = TYPE_NAME (resolved_type);
5704 if (resolved_type_decl == NULL_TREE
5705 || TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
5707 resolved_type_decl = build_decl (TYPE_DECL,
5708 TYPE_NAME (class_type),
5711 return resolved_type_decl;
5714 /* 1- Check to see if we have an array. If true, find what we really
5716 if ((array_dims = build_type_name_from_array_name (tname,
5717 &TYPE_NAME (class_type))))
5718 WFL_STRIP_BRACKET (cl, cl);
5720 /* 2- Resolve the bare type */
5721 if (!(resolved_type_decl = do_resolve_class (enclosing, class_type,
5724 resolved_type = TREE_TYPE (resolved_type_decl);
5726 /* 3- If we have an array, reconstruct the array down to its nesting */
5729 for (; array_dims; array_dims--)
5730 resolved_type = build_java_array_type (resolved_type, -1);
5731 resolved_type_decl = TYPE_NAME (resolved_type);
5733 TREE_TYPE (class_type) = resolved_type;
5734 return resolved_type_decl;
5737 /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL
5738 are used to report error messages; CL must either be NULL_TREE or a
5739 WFL wrapping a class. Do not try to replace TYPE_NAME (class_type)
5740 by a variable, since it is changed by find_in_imports{_on_demand}
5741 and (but it doesn't really matter) qualify_and_find. */
5744 do_resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5746 tree new_class_decl = NULL_TREE, super = NULL_TREE;
5747 tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
5749 htab_t circularity_hash;
5751 if (QUALIFIED_P (TYPE_NAME (class_type)))
5753 /* If the type name is of the form `Q . Id', then Q is either a
5754 package name or a class name. First we try to find Q as a
5755 class and then treat Id as a member type. If we can't find Q
5756 as a class then we fall through. */
5757 tree q, left, left_type, right;
5758 if (breakdown_qualified (&left, &right, TYPE_NAME (class_type)) == 0)
5760 BUILD_PTR_FROM_NAME (left_type, left);
5761 q = do_resolve_class (enclosing, left_type, decl, cl);
5765 saved_enclosing_type = TREE_TYPE (q);
5766 BUILD_PTR_FROM_NAME (class_type, right);
5773 /* This hash table is used to register the classes we're going
5774 through when searching the current class as an inner class, in
5775 order to detect circular references. Remember to free it before
5776 returning the section 0- of this function. */
5777 circularity_hash = htab_create (20, htab_hash_pointer, htab_eq_pointer,
5780 /* 0- Search in the current class as an inner class.
5781 Maybe some code here should be added to load the class or
5782 something, at least if the class isn't an inner class and ended
5783 being loaded from class file. FIXME. */
5786 new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing,
5787 &super, class_type);
5791 /* If we haven't found anything because SUPER reached Object and
5792 ENCLOSING happens to be an innerclass, try the enclosing context. */
5793 if ((!super || super == object_type_node) &&
5794 enclosing && INNER_CLASS_DECL_P (enclosing))
5795 enclosing = DECL_CONTEXT (enclosing);
5797 enclosing = NULL_TREE;
5800 htab_delete (circularity_hash);
5803 return new_class_decl;
5806 /* 1- Check for the type in single imports. This will change
5807 TYPE_NAME() if something relevant is found */
5808 find_in_imports (saved_enclosing_type, class_type);
5810 /* 2- And check for the type in the current compilation unit */
5811 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5813 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
5814 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
5815 load_class (TYPE_NAME (class_type), 0);
5816 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5819 /* 3- Search according to the current package definition */
5820 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5822 if ((new_class_decl = qualify_and_find (class_type, ctxp->package,
5823 TYPE_NAME (class_type))))
5824 return new_class_decl;
5827 /* 4- Check the import on demands. Don't allow bar.baz to be
5828 imported from foo.* */
5829 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5830 if (find_in_imports_on_demand (saved_enclosing_type, class_type))
5833 /* If found in find_in_imports_on_demand, the type has already been
5835 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5836 return new_class_decl;
5838 /* 5- Try with a name qualified with the package name we've seen so far */
5839 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5843 /* If there is a current package (ctxp->package), it's the first
5844 element of package_list and we can skip it. */
5845 for (package = (ctxp->package ?
5846 TREE_CHAIN (package_list) : package_list);
5847 package; package = TREE_CHAIN (package))
5848 if ((new_class_decl = qualify_and_find (class_type,
5849 TREE_PURPOSE (package),
5850 TYPE_NAME (class_type))))
5851 return new_class_decl;
5854 /* 5- Check another compilation unit that bears the name of type */
5855 load_class (TYPE_NAME (class_type), 0);
5858 cl = lookup_cl (decl);
5860 /* If we don't have a value for CL, then we're being called recursively.
5861 We can't check package access just yet, but it will be taken care of
5865 if (check_pkg_class_access (TYPE_NAME (class_type), cl, true, NULL_TREE))
5869 /* 6- Last call for a resolution */
5870 decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5872 /* The final lookup might have registered a.b.c into a.b$c If we
5873 failed at the first lookup, progressively change the name if
5874 applicable and use the matching DECL instead. */
5875 if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
5878 tree name = TYPE_NAME (class_type);
5879 char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1);
5881 strcpy (namebuffer, IDENTIFIER_POINTER (name));
5885 /* Reach the last '.', and if applicable, replace it by a `$' and
5886 see if this exists as a type. */
5887 if ((separator = strrchr (namebuffer, '.')))
5890 name = get_identifier (namebuffer);
5891 decl_result = IDENTIFIER_CLASS_VALUE (name);
5893 } while (!decl_result && separator);
5899 qualify_and_find (tree class_type, tree package, tree name)
5901 tree new_qualified = merge_qualified_name (package, name);
5902 tree new_class_decl;
5904 if (!IDENTIFIER_CLASS_VALUE (new_qualified))
5905 load_class (new_qualified, 0);
5906 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_qualified)))
5908 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
5909 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
5910 load_class (new_qualified, 0);
5911 TYPE_NAME (class_type) = new_qualified;
5912 return IDENTIFIER_CLASS_VALUE (new_qualified);
5917 /* Resolve NAME and lay it out (if not done and if not the current
5918 parsed class). Return a decl node. This function is meant to be
5919 called when type resolution is necessary during the walk pass. */
5922 resolve_and_layout (tree something, tree cl)
5924 tree decl, decl_type;
5926 /* Don't do that on the current class */
5927 if (something == current_class)
5928 return TYPE_NAME (current_class);
5930 /* Don't do anything for void and other primitive types */
5931 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5934 /* Pointer types can be reall pointer types or fake pointers. When
5935 finding a real pointer, recheck for primitive types */
5936 if (TREE_CODE (something) == POINTER_TYPE)
5938 if (TREE_TYPE (something))
5940 something = TREE_TYPE (something);
5941 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5945 something = TYPE_NAME (something);
5948 /* Don't do anything for arrays of primitive types */
5949 if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
5950 && JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
5953 /* Something might be a WFL */
5954 if (TREE_CODE (something) == EXPR_WITH_FILE_LOCATION)
5955 something = EXPR_WFL_NODE (something);
5957 /* Otherwise, if something is not and IDENTIFIER_NODE, it can be a a
5958 TYPE_DECL or a real TYPE */
5959 else if (TREE_CODE (something) != IDENTIFIER_NODE)
5960 something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
5961 DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
5963 if (!(decl = resolve_no_layout (something, cl)))
5966 /* Resolve and layout if necessary */
5967 decl_type = TREE_TYPE (decl);
5968 layout_class_methods (decl_type);
5970 if (CLASS_FROM_SOURCE_P (decl_type))
5971 java_check_methods (decl);
5972 /* Layout the type if necessary */
5973 if (decl_type != current_class && !CLASS_LOADED_P (decl_type))
5974 safe_layout_class (decl_type);
5979 /* Resolve a class, returns its decl but doesn't perform any
5980 layout. The current parsing context is saved and restored */
5983 resolve_no_layout (tree name, tree cl)
5986 BUILD_PTR_FROM_NAME (ptr, name);
5987 java_parser_context_save_global ();
5988 decl = resolve_class (TYPE_NAME (current_class), ptr, NULL_TREE, cl);
5989 java_parser_context_restore_global ();
5994 /* Called when reporting errors. Skip the '[]'s in a complex array
5995 type description that failed to be resolved. purify_type_name can't
5996 use an identifier tree. */
5999 purify_type_name (const char *name)
6001 int len = strlen (name);
6004 STRING_STRIP_BRACKETS (name, len, bracket_found);
6007 char *stripped_name = xmemdup (name, len, len+1);
6008 stripped_name [len] = '\0';
6009 return stripped_name;
6014 /* The type CURRENT refers to can't be found. We print error messages. */
6017 complete_class_report_errors (jdep *dep)
6021 if (!JDEP_WFL (dep))
6024 name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
6025 switch (JDEP_KIND (dep))
6029 (JDEP_WFL (dep), "Superclass `%s' of class `%s' not found",
6030 purify_type_name (name),
6031 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6035 (JDEP_WFL (dep), "Type `%s' not found in declaration of field `%s'",
6036 purify_type_name (name),
6037 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6039 case JDEP_METHOD: /* Covers arguments */
6041 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the argument `%s' of method `%s'",
6042 purify_type_name (name),
6043 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
6044 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
6046 case JDEP_METHOD_RETURN: /* Covers return type */
6048 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the return type of method `%s'",
6049 purify_type_name (name),
6050 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
6052 case JDEP_INTERFACE:
6054 (JDEP_WFL (dep), "Superinterface `%s' of %s `%s' not found",
6055 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
6056 (CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
6057 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6061 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the local variable `%s'",
6062 purify_type_name (IDENTIFIER_POINTER
6063 (EXPR_WFL_NODE (JDEP_WFL (dep)))),
6064 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6066 case JDEP_EXCEPTION: /* As specified by `throws' */
6068 (JDEP_WFL (dep), "Class `%s' not found in `throws'",
6069 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
6072 /* Fix for -Wall. Just break doing nothing. The error will be
6078 /* Return a static string containing the DECL prototype string. If
6079 DECL is a constructor, use the class name instead of the form
6083 get_printable_method_name (tree decl)
6085 const char *to_return;
6086 tree name = NULL_TREE;
6088 if (DECL_CONSTRUCTOR_P (decl))
6090 name = DECL_NAME (decl);
6091 DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
6094 to_return = lang_printable_name (decl, 0);
6095 if (DECL_CONSTRUCTOR_P (decl))
6096 DECL_NAME (decl) = name;
6101 /* Track method being redefined inside the same class. As a side
6102 effect, set DECL_NAME to an IDENTIFIER (prior entering this
6103 function it's a FWL, so we can track errors more accurately.) */
6106 check_method_redefinition (tree class, tree method)
6110 /* There's no need to verify <clinit> and finit$ and instinit$ */
6111 if (DECL_CLINIT_P (method)
6112 || DECL_FINIT_P (method) || DECL_INSTINIT_P (method))
6115 sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
6116 for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
6118 if (redef == method)
6120 if (DECL_NAME (redef) == DECL_NAME (method)
6121 && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))
6122 && !DECL_ARTIFICIAL (method))
6125 (DECL_FUNCTION_WFL (method), "Duplicate %s declaration `%s'",
6126 (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
6127 get_printable_method_name (redef));
6134 /* Return 1 if check went ok, 0 otherwise. */
6136 check_abstract_method_definitions (int do_interface, tree class_decl,
6139 tree class = TREE_TYPE (class_decl);
6140 tree method, end_type;
6143 end_type = (do_interface ? object_type_node : type);
6144 for (method = TYPE_METHODS (type); method; method = TREE_CHAIN (method))
6146 tree other_super, other_method, method_sig, method_name;
6148 int end_type_reached = 0;
6150 if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
6153 /* Now verify that somewhere in between TYPE and CLASS,
6154 abstract method METHOD gets a non abstract definition
6155 that is inherited by CLASS. */
6157 method_sig = build_java_signature (TREE_TYPE (method));
6158 method_name = DECL_NAME (method);
6159 if (TREE_CODE (method_name) == EXPR_WITH_FILE_LOCATION)
6160 method_name = EXPR_WFL_NODE (method_name);
6162 other_super = class;
6164 if (other_super == end_type)
6165 end_type_reached = 1;
6168 for (other_method = TYPE_METHODS (other_super); other_method;
6169 other_method = TREE_CHAIN (other_method))
6171 tree s = build_java_signature (TREE_TYPE (other_method));
6172 tree other_name = DECL_NAME (other_method);
6174 if (TREE_CODE (other_name) == EXPR_WITH_FILE_LOCATION)
6175 other_name = EXPR_WFL_NODE (other_name);
6176 if (!DECL_CLINIT_P (other_method)
6177 && !DECL_CONSTRUCTOR_P (other_method)
6178 && method_name == other_name
6180 && !METHOD_ABSTRACT (other_method))
6186 other_super = CLASSTYPE_SUPER (other_super);
6187 } while (!end_type_reached);
6189 /* Report that abstract METHOD didn't find an implementation
6190 that CLASS can use. */
6193 char *t = xstrdup (lang_printable_name
6194 (TREE_TYPE (TREE_TYPE (method)), 0));
6195 tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
6198 (lookup_cl (class_decl),
6199 "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",
6200 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6201 t, lang_printable_name (method, 0),
6202 (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))) ?
6203 "interface" : "class"),
6204 IDENTIFIER_POINTER (ccn),
6205 (CLASS_INTERFACE (class_decl) ? "interface" : "class"),
6206 IDENTIFIER_POINTER (DECL_NAME (class_decl)));
6212 if (ok && do_interface)
6214 /* Check for implemented interfaces. */
6216 tree vector = TYPE_BINFO_BASETYPES (type);
6217 for (i = 1; ok && vector && i < TREE_VEC_LENGTH (vector); i++)
6219 tree super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
6220 ok = check_abstract_method_definitions (1, class_decl, super);
6227 /* Check that CLASS_DECL somehow implements all inherited abstract
6231 java_check_abstract_method_definitions (tree class_decl)
6233 tree class = TREE_TYPE (class_decl);
6237 if (CLASS_ABSTRACT (class_decl))
6240 /* Check for inherited types */
6243 super = CLASSTYPE_SUPER (super);
6244 check_abstract_method_definitions (0, class_decl, super);
6245 } while (super != object_type_node);
6247 /* Check for implemented interfaces. */
6248 vector = TYPE_BINFO_BASETYPES (class);
6249 for (i = 1; i < TREE_VEC_LENGTH (vector); i++)
6251 super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
6252 check_abstract_method_definitions (1, class_decl, super);
6256 /* Check all the types method DECL uses and return 1 if all of them
6257 are now complete, 0 otherwise. This is used to check whether its
6258 safe to build a method signature or not. */
6261 check_method_types_complete (tree decl)
6263 tree type = TREE_TYPE (decl);
6266 if (!INCOMPLETE_TYPE_P (TREE_TYPE (type)))
6269 args = TYPE_ARG_TYPES (type);
6270 if (TREE_CODE (type) == METHOD_TYPE)
6271 args = TREE_CHAIN (args);
6272 for (; args != end_params_node; args = TREE_CHAIN (args))
6273 if (INCOMPLETE_TYPE_P (TREE_VALUE (args)))
6279 /* Visible interface to check methods contained in CLASS_DECL */
6282 java_check_methods (tree class_decl)
6284 if (CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)))
6287 if (CLASS_INTERFACE (class_decl))
6288 java_check_abstract_methods (class_decl);
6290 java_check_regular_methods (class_decl);
6292 CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)) = 1;
6295 /* Like not_accessible_p, but doesn't refer to the current class at
6298 hack_is_accessible_p (tree member, tree from_where)
6300 int flags = get_access_flags_from_decl (member);
6302 if (from_where == DECL_CONTEXT (member)
6303 || (flags & ACC_PUBLIC))
6306 if ((flags & ACC_PROTECTED))
6308 if (inherits_from_p (from_where, DECL_CONTEXT (member)))
6312 if ((flags & ACC_PRIVATE))
6315 /* Package private, or protected. */
6316 return in_same_package (TYPE_NAME (from_where),
6317 TYPE_NAME (DECL_CONTEXT (member)));
6320 /* Check all the methods of CLASS_DECL. Methods are first completed
6321 then checked according to regular method existence rules. If no
6322 constructor for CLASS_DECL were encountered, then build its
6325 java_check_regular_methods (tree class_decl)
6327 int saw_constructor = ANONYMOUS_CLASS_P (TREE_TYPE (class_decl));
6329 tree class = TREE_TYPE (class_decl);
6330 tree found = NULL_TREE;
6333 /* It is not necessary to check methods defined in java.lang.Object */
6334 if (class == object_type_node)
6337 if (!TYPE_NVIRTUALS (class))
6338 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6340 /* Should take interfaces into account. FIXME */
6341 for (method = TYPE_METHODS (class); method; method = TREE_CHAIN (method))
6344 tree method_wfl = DECL_FUNCTION_WFL (method);
6347 /* Check for redefinitions */
6348 if (check_method_redefinition (class, method))
6351 /* We verify things thrown by the method. They must inherit from
6352 java.lang.Throwable. */
6353 for (mthrows = DECL_FUNCTION_THROWS (method);
6354 mthrows; mthrows = TREE_CHAIN (mthrows))
6356 if (!inherits_from_p (TREE_VALUE (mthrows), throwable_type_node))
6358 (TREE_PURPOSE (mthrows), "Class `%s' in `throws' clause must be a subclass of class `java.lang.Throwable'",
6360 (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))));
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 hidden or overridden. */
6366 if (DECL_CONSTRUCTOR_P (method))
6368 saw_constructor = 1;
6372 sig = build_java_argument_signature (TREE_TYPE (method));
6373 found = lookup_argument_method_generic (class, DECL_NAME (method), sig,
6374 SEARCH_SUPER | SEARCH_INTERFACE);
6376 /* Inner class can't declare static methods */
6377 if (METHOD_STATIC (method) && !TOPLEVEL_CLASS_DECL_P (class_decl))
6379 char *t = xstrdup (lang_printable_name (class, 0));
6381 (method_wfl, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
6382 lang_printable_name (method, 0), t);
6386 /* Nothing overrides or it's a private method. */
6389 if (METHOD_PRIVATE (found))
6395 /* If `found' is declared in an interface, make sure the
6396 modifier matches. */
6397 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6398 && clinit_identifier_node != DECL_NAME (found)
6399 && !METHOD_PUBLIC (method))
6401 tree found_decl = TYPE_NAME (DECL_CONTEXT (found));
6402 parse_error_context (method_wfl, "Class `%s' must override `%s' with a public method in order to implement interface `%s'",
6403 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6404 lang_printable_name (method, 0),
6405 IDENTIFIER_POINTER (DECL_NAME (found_decl)));
6408 /* Can't override a method with the same name and different return
6410 if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
6413 (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6416 "Method `%s' was defined with return type `%s' in class `%s'",
6417 lang_printable_name (found, 0), t,
6419 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6423 aflags = get_access_flags_from_decl (found);
6425 /* Can't override final. Can't override static. */
6426 if (METHOD_FINAL (found) || METHOD_STATIC (found))
6428 /* Static *can* override static */
6429 if (METHOD_STATIC (found) && METHOD_STATIC (method))
6433 "%s methods can't be overridden. Method `%s' is %s in class `%s'",
6434 (METHOD_FINAL (found) ? "Final" : "Static"),
6435 lang_printable_name (found, 0),
6436 (METHOD_FINAL (found) ? "final" : "static"),
6438 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6442 /* Static method can't override instance method. */
6443 if (METHOD_STATIC (method))
6447 "Instance methods can't be overridden by a static method. Method `%s' is an instance method in class `%s'",
6448 lang_printable_name (found, 0),
6450 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6454 /* - Overriding/hiding public must be public
6455 - Overriding/hiding protected must be protected or public
6456 - If the overridden or hidden method has default (package)
6457 access, then the overriding or hiding method must not be
6458 private; otherwise, a compile-time error occurs. If
6459 `found' belongs to an interface, things have been already
6461 if (!CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6462 && ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
6463 || (METHOD_PROTECTED (found)
6464 && !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
6465 || (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
6466 && METHOD_PRIVATE (method))))
6470 "Methods can't be overridden to be more private. Method `%s' is not %s in class `%s'", lang_printable_name (method, 0),
6471 (METHOD_PUBLIC (method) ? "public" :
6472 (METHOD_PRIVATE (method) ? "private" : "protected")),
6473 IDENTIFIER_POINTER (DECL_NAME
6474 (TYPE_NAME (DECL_CONTEXT (found)))));
6478 /* Check this method against all the other implementations it
6479 overrides. Here we only check the class hierarchy; the rest
6480 of the checking is done later. If this method is just a
6481 Miranda method, we can skip the check. */
6482 if (! METHOD_INVISIBLE (method))
6483 check_concrete_throws_clauses (class, method, DECL_NAME (method), sig);
6486 /* The above throws clause check only looked at superclasses. Now
6487 we must also make sure that all methods declared in interfaces
6488 have compatible throws clauses. FIXME: there are more efficient
6489 ways to organize this checking; we should implement one. */
6490 check_interface_throws_clauses (class, class);
6492 if (!TYPE_NVIRTUALS (class))
6493 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6495 /* Search for inherited abstract method not yet implemented in this
6497 java_check_abstract_method_definitions (class_decl);
6499 if (!saw_constructor)
6503 /* Check to make sure that all the methods in all the interfaces
6504 implemented by CLASS_DECL are compatible with the concrete
6505 implementations available in CHECK_CLASS_DECL. */
6507 check_interface_throws_clauses (tree check_class_decl, tree class_decl)
6509 for (; class_decl != NULL_TREE; class_decl = CLASSTYPE_SUPER (class_decl))
6515 if (! CLASS_LOADED_P (class_decl))
6517 if (CLASS_FROM_SOURCE_P (class_decl))
6518 safe_layout_class (class_decl);
6520 load_class (class_decl, 1);
6523 bases = TYPE_BINFO_BASETYPES (class_decl);
6524 iface_len = TREE_VEC_LENGTH (bases) - 1;
6525 for (i = iface_len; i > 0; --i)
6527 tree interface = BINFO_TYPE (TREE_VEC_ELT (bases, i));
6530 for (iface_method = TYPE_METHODS (interface);
6531 iface_method != NULL_TREE;
6532 iface_method = TREE_CHAIN (iface_method))
6536 /* First look for a concrete method implemented or
6537 inherited by this class. No need to search
6538 interfaces here, since we're already looking through
6540 sig = build_java_argument_signature (TREE_TYPE (iface_method));
6542 = lookup_argument_method_generic (check_class_decl,
6543 DECL_NAME (iface_method),
6544 sig, SEARCH_VISIBLE);
6545 /* If we don't find an implementation, that is ok. Any
6546 potential errors from that are diagnosed elsewhere.
6547 Also, multiple inheritance with conflicting throws
6548 clauses is fine in the absence of a concrete
6550 if (method != NULL_TREE && !METHOD_ABSTRACT (method)
6551 && !METHOD_INVISIBLE (iface_method))
6553 tree method_wfl = DECL_FUNCTION_WFL (method);
6554 check_throws_clauses (method, method_wfl, iface_method);
6558 /* Now check superinterfaces. */
6559 check_interface_throws_clauses (check_class_decl, interface);
6564 /* Check throws clauses of a method against the clauses of all the
6565 methods it overrides. We do this by searching up the class
6566 hierarchy, examining all matching accessible methods. */
6568 check_concrete_throws_clauses (tree class, tree self_method,
6569 tree name, tree signature)
6571 tree method = lookup_argument_method_generic (class, name, signature,
6572 SEARCH_SUPER | SEARCH_VISIBLE);
6573 while (method != NULL_TREE)
6575 if (! METHOD_INVISIBLE (method) && hack_is_accessible_p (method, class))
6576 check_throws_clauses (self_method, DECL_FUNCTION_WFL (self_method),
6579 method = lookup_argument_method_generic (DECL_CONTEXT (method),
6581 SEARCH_SUPER | SEARCH_VISIBLE);
6585 /* Generate an error if the `throws' clause of METHOD (if any) is
6586 incompatible with the `throws' clause of FOUND (if any). */
6588 check_throws_clauses (tree method, tree method_wfl, tree found)
6592 /* Can't check these things with class loaded from bytecode. FIXME */
6593 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
6596 for (mthrows = DECL_FUNCTION_THROWS (method);
6597 mthrows; mthrows = TREE_CHAIN (mthrows))
6601 /* We don't verify unchecked expressions */
6602 if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
6604 /* Checked expression must be compatible */
6605 for (fthrows = DECL_FUNCTION_THROWS (found);
6606 fthrows; fthrows = TREE_CHAIN (fthrows))
6608 if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
6614 (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'",
6615 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
6616 lang_printable_name (found, 0),
6618 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6623 /* Check abstract method of interface INTERFACE */
6625 java_check_abstract_methods (tree interface_decl)
6628 tree method, basetype_vec, found;
6629 tree interface = TREE_TYPE (interface_decl);
6631 for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
6633 /* 2- Check for double definition inside the defining interface */
6634 if (check_method_redefinition (interface, method))
6637 /* 3- Overriding is OK as far as we preserve the return type. */
6638 found = lookup_java_interface_method2 (interface, method);
6642 t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6644 (DECL_FUNCTION_WFL (found),
6645 "Method `%s' was defined with return type `%s' in class `%s'",
6646 lang_printable_name (found, 0), t,
6648 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6654 /* 4- Inherited methods can't differ by their returned types */
6655 if (!(basetype_vec = TYPE_BINFO_BASETYPES (interface)))
6657 n = TREE_VEC_LENGTH (basetype_vec);
6658 for (i = 0; i < n; i++)
6660 tree sub_interface_method, sub_interface;
6661 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
6664 sub_interface = BINFO_TYPE (vec_elt);
6665 for (sub_interface_method = TYPE_METHODS (sub_interface);
6666 sub_interface_method;
6667 sub_interface_method = TREE_CHAIN (sub_interface_method))
6669 found = lookup_java_interface_method2 (interface,
6670 sub_interface_method);
6671 if (found && (found != sub_interface_method))
6674 (lookup_cl (sub_interface_method),
6675 "Interface `%s' inherits method `%s' from interface `%s'. This method is redefined with a different return type in interface `%s'",
6676 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
6677 lang_printable_name (found, 0),
6679 (DECL_NAME (TYPE_NAME
6680 (DECL_CONTEXT (sub_interface_method)))),
6682 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6688 /* Lookup methods in interfaces using their name and partial
6689 signature. Return a matching method only if their types differ. */
6692 lookup_java_interface_method2 (tree class, tree method_decl)
6695 tree basetype_vec = TYPE_BINFO_BASETYPES (class), to_return;
6700 n = TREE_VEC_LENGTH (basetype_vec);
6701 for (i = 0; i < n; i++)
6703 tree vec_elt = TREE_VEC_ELT (basetype_vec, i), to_return;
6704 if ((BINFO_TYPE (vec_elt) != object_type_node)
6706 lookup_java_method2 (BINFO_TYPE (vec_elt), method_decl, 1)))
6709 for (i = 0; i < n; i++)
6711 to_return = lookup_java_interface_method2
6712 (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)), method_decl);
6720 /* Lookup method using their name and partial signature. Return a
6721 matching method only if their types differ. */
6724 lookup_java_method2 (tree clas, tree method_decl, int do_interface)
6726 tree method, method_signature, method_name, method_type, name;
6728 method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
6729 name = DECL_NAME (method_decl);
6730 method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6731 EXPR_WFL_NODE (name) : name);
6732 method_type = TREE_TYPE (TREE_TYPE (method_decl));
6734 while (clas != NULL_TREE)
6736 for (method = TYPE_METHODS (clas);
6737 method != NULL_TREE; method = TREE_CHAIN (method))
6739 tree method_sig = build_java_argument_signature (TREE_TYPE (method));
6740 tree name = DECL_NAME (method);
6741 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6742 EXPR_WFL_NODE (name) : name) == method_name
6743 && method_sig == method_signature
6744 && TREE_TYPE (TREE_TYPE (method)) != method_type)
6747 clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
6752 /* Return the line that matches DECL line number, and try its best to
6753 position the column number. Used during error reports. */
6755 static GTY(()) tree cl_v;
6757 lookup_cl (tree decl)
6764 if (cl_v == NULL_TREE)
6766 cl_v = build_expr_wfl (NULL_TREE, NULL, 0, 0);
6769 EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
6770 EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE (decl), -1);
6772 line = java_get_line_col (EXPR_WFL_FILENAME (cl_v),
6773 EXPR_WFL_LINENO (cl_v), EXPR_WFL_COLNO (cl_v));
6775 found = strstr ((const char *)line,
6776 (const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
6778 EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
6783 /* Look for a simple name in the single-type import list */
6786 find_name_in_single_imports (tree name)
6790 for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
6791 if (TREE_VALUE (node) == name)
6792 return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
6797 /* Process all single-type import. */
6800 process_imports (void)
6805 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
6807 tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
6808 char *original_name;
6810 original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
6811 IDENTIFIER_LENGTH (to_be_found),
6812 IDENTIFIER_LENGTH (to_be_found) + 1);
6814 /* Don't load twice something already defined. */
6815 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6822 QUALIFIED_P (to_be_found) = 1;
6823 load_class (to_be_found, 0);
6825 check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true, NULL_TREE);
6827 /* We found it, we can bail out */
6828 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6830 check_deprecation (TREE_PURPOSE (import),
6831 IDENTIFIER_CLASS_VALUE (to_be_found));
6835 /* We haven't found it. Maybe we're trying to access an
6836 inner class. The only way for us to know is to try again
6837 after having dropped a qualifier. If we can't break it further,
6838 we have an error. */
6839 if (breakdown_qualified (&left, NULL, to_be_found))
6844 if (!IDENTIFIER_CLASS_VALUE (to_be_found))
6846 parse_error_context (TREE_PURPOSE (import),
6847 "Class or interface `%s' not found in import",
6852 free (original_name);
6859 /* Possibly find and mark a class imported by a single-type import
6863 find_in_imports (tree enclosing_type, tree class_type)
6865 tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) :
6869 if (TREE_VALUE (import) == TYPE_NAME (class_type))
6871 TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
6872 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
6875 import = TREE_CHAIN (import);
6880 note_possible_classname (const char *name, int len)
6883 if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
6885 else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
6889 node = ident_subst (name, len, "", '/', '.', "");
6890 IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
6891 QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
6895 /* Read a import directory, gathering potential match for further type
6896 references. Indifferently reads a filesystem or a ZIP archive
6900 read_import_dir (tree wfl)
6902 tree package_id = EXPR_WFL_NODE (wfl);
6903 const char *package_name = IDENTIFIER_POINTER (package_id);
6904 int package_length = IDENTIFIER_LENGTH (package_id);
6906 JCF *saved_jcf = current_jcf;
6911 struct buffer filename[1];
6913 if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
6915 IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
6917 BUFFER_INIT (filename);
6918 buffer_grow (filename, package_length + 100);
6920 for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
6922 const char *entry_name = jcf_path_name (entry);
6923 int entry_length = strlen (entry_name);
6924 if (jcf_path_is_zipfile (entry))
6927 buffer_grow (filename, entry_length);
6928 memcpy (filename->data, entry_name, entry_length - 1);
6929 filename->data[entry_length-1] = '\0';
6930 zipf = opendir_in_zip (filename->data, jcf_path_is_system (entry));
6932 error ("malformed .zip archive in CLASSPATH: %s", entry_name);
6935 ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
6936 BUFFER_RESET (filename);
6937 for (k = 0; k < package_length; k++)
6939 char ch = package_name[k];
6940 *filename->ptr++ = ch == '.' ? '/' : ch;
6942 *filename->ptr++ = '/';
6944 for (k = 0; k < zipf->count; k++, zipd = ZIPDIR_NEXT (zipd))
6946 const char *current_entry = ZIPDIR_FILENAME (zipd);
6947 int current_entry_len = zipd->filename_length;
6949 if (current_entry_len >= BUFFER_LENGTH (filename)
6950 && strncmp (filename->data, current_entry,
6951 BUFFER_LENGTH (filename)) != 0)
6953 found |= note_possible_classname (current_entry,
6960 BUFFER_RESET (filename);
6961 buffer_grow (filename, entry_length + package_length + 4);
6962 strcpy (filename->data, entry_name);
6963 filename->ptr = filename->data + entry_length;
6964 for (k = 0; k < package_length; k++)
6966 char ch = package_name[k];
6967 *filename->ptr++ = ch == '.' ? '/' : ch;
6969 *filename->ptr = '\0';
6971 dirp = opendir (filename->data);
6974 *filename->ptr++ = '/';
6979 struct dirent *direntp = readdir (dirp);
6982 d_name = direntp->d_name;
6983 len = strlen (direntp->d_name);
6984 buffer_grow (filename, len+1);
6985 strcpy (filename->ptr, d_name);
6986 found |= note_possible_classname (filename->data + entry_length,
6987 package_length+len+1);
6994 free (filename->data);
6996 /* Here we should have a unified way of retrieving an entry, to be
7000 static int first = 1;
7003 error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives", package_name);
7008 parse_error_context (wfl, "Package `%s' not found in import",
7010 current_jcf = saved_jcf;
7013 current_jcf = saved_jcf;
7016 /* Possibly find a type in the import on demands specified
7017 types. Returns 1 if an error occurred, 0 otherwise. Run through the
7018 entire list, to detected potential double definitions. */
7021 find_in_imports_on_demand (tree enclosing_type, tree class_type)
7023 tree class_type_name = TYPE_NAME (class_type);
7024 tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) :
7025 ctxp->import_demand_list);
7026 tree cl = NULL_TREE;
7027 int seen_once = -1; /* -1 when not set, 1 if seen once, >1 otherwise. */
7028 int to_return = -1; /* -1 when not set, 0 or 1 otherwise */
7031 for (; import; import = TREE_CHAIN (import))
7033 int saved_lineno = input_line;
7035 const char *id_name;
7036 tree decl, type_name_copy;
7038 obstack_grow (&temporary_obstack,
7039 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
7040 IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
7041 obstack_1grow (&temporary_obstack, '.');
7042 obstack_grow0 (&temporary_obstack,
7043 IDENTIFIER_POINTER (class_type_name),
7044 IDENTIFIER_LENGTH (class_type_name));
7045 id_name = obstack_finish (&temporary_obstack);
7047 if (! (node = maybe_get_identifier (id_name)))
7050 /* Setup lineno so that it refers to the line of the import (in
7051 case we parse a class file and encounter errors */
7052 input_line = EXPR_WFL_LINENO (TREE_PURPOSE (import));
7054 type_name_copy = TYPE_NAME (class_type);
7055 TYPE_NAME (class_type) = node;
7056 QUALIFIED_P (node) = 1;
7057 decl = IDENTIFIER_CLASS_VALUE (node);
7059 /* If there is no DECL set for the class or if the class isn't
7060 loaded and not seen in source yet, then load */
7061 if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl))
7062 && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl))))
7064 load_class (node, 0);
7065 decl = IDENTIFIER_CLASS_VALUE (node);
7067 if (decl && ! INNER_CLASS_P (TREE_TYPE (decl)))
7068 access_check = check_pkg_class_access (node, TREE_PURPOSE (import),
7071 /* 6.6.1: Inner classes are subject to member access rules. */
7074 input_line = saved_lineno;
7076 /* If the loaded class is not accessible or couldn't be loaded,
7077 we restore the original TYPE_NAME and process the next
7079 if (access_check || !decl)
7081 TYPE_NAME (class_type) = type_name_copy;
7085 /* If the loaded class is accessible, we keep a tab on it to
7086 detect and report multiple inclusions. */
7087 if (IS_A_CLASSFILE_NAME (node))
7091 cl = TREE_PURPOSE (import);
7094 else if (seen_once >= 0)
7096 tree location = (cl ? cl : TREE_PURPOSE (import));
7097 tree package = (cl ? EXPR_WFL_NODE (cl) :
7098 EXPR_WFL_NODE (TREE_PURPOSE (import)));
7102 "Type `%s' also potentially defined in package `%s'",
7103 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
7104 IDENTIFIER_POINTER (package));
7107 to_return = access_check;
7113 return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
7116 /* Add package NAME to the list of packages encountered so far. To
7117 speed up class lookup in do_resolve_class, we make sure a
7118 particular package is added only once. */
7121 register_package (tree name)
7127 pht = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
7129 e = htab_find_slot (pht, name, INSERT);
7132 package_list = chainon (package_list, build_tree_list (name, NULL));
7138 resolve_package (tree pkg, tree *next, tree *type_name)
7141 tree decl = NULL_TREE;
7142 *type_name = NULL_TREE;
7144 /* The trick is to determine when the package name stops and were
7145 the name of something contained in the package starts. Then we
7146 return a fully qualified name of what we want to get. */
7148 *next = EXPR_WFL_QUALIFICATION (pkg);
7150 /* Try to progressively construct a type name */
7151 if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION)
7152 for (current = EXPR_WFL_QUALIFICATION (pkg);
7153 current; current = TREE_CHAIN (current))
7155 /* If we don't have what we're expecting, exit now. TYPE_NAME
7156 will be null and the error caught later. */
7157 if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION)
7160 merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current)));
7161 if ((decl = resolve_no_layout (*type_name, NULL_TREE)))
7163 /* resolve_package should be used in a loop, hence we
7164 point at this one to naturally process the next one at
7165 the next iteration. */
7174 /* Check accessibility of inner classes according to member access rules.
7175 DECL is the inner class, ENCLOSING_DECL is the class from which the
7176 access is being attempted. */
7179 check_inner_class_access (tree decl, tree enclosing_decl, tree cl)
7182 tree enclosing_decl_type;
7184 /* We don't issue an error message when CL is null. CL can be null
7185 as a result of processing a JDEP crafted by source_start_java_method
7186 for the purpose of patching its parm decl. But the error would
7187 have been already trapped when fixing the method's signature.
7188 DECL can also be NULL in case of earlier errors. */
7192 enclosing_decl_type = TREE_TYPE (enclosing_decl);
7194 if (CLASS_PRIVATE (decl))
7196 /* Access is permitted only within the body of the top-level
7197 class in which DECL is declared. */
7198 tree top_level = decl;
7199 while (DECL_CONTEXT (top_level))
7200 top_level = DECL_CONTEXT (top_level);
7201 while (DECL_CONTEXT (enclosing_decl))
7202 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7203 if (top_level == enclosing_decl)
7207 else if (CLASS_PROTECTED (decl))
7210 /* Access is permitted from within the same package... */
7211 if (in_same_package (decl, enclosing_decl))
7214 /* ... or from within the body of a subtype of the context in which
7215 DECL is declared. */
7216 decl_context = DECL_CONTEXT (decl);
7217 while (enclosing_decl)
7219 if (CLASS_INTERFACE (decl))
7221 if (interface_of_p (TREE_TYPE (decl_context),
7222 enclosing_decl_type))
7227 /* Eww. The order of the arguments is different!! */
7228 if (inherits_from_p (enclosing_decl_type,
7229 TREE_TYPE (decl_context)))
7232 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7234 access = "protected";
7236 else if (! CLASS_PUBLIC (decl))
7238 /* Access is permitted only from within the same package as DECL. */
7239 if (in_same_package (decl, enclosing_decl))
7241 access = "non-public";
7244 /* Class is public. */
7247 parse_error_context (cl, "Nested %s %s is %s; cannot be accessed from here",
7248 (CLASS_INTERFACE (decl) ? "interface" : "class"),
7249 lang_printable_name (decl, 0), access);
7252 /* Accessibility check for top-level classes. If CLASS_NAME is in a
7253 foreign package, it must be PUBLIC. Return 0 if no access
7254 violations were found, 1 otherwise. If VERBOSE is true and an error
7255 was found, it is reported and accounted for. If CL is NULL then
7256 look it up with THIS_DECL. */
7259 check_pkg_class_access (tree class_name, tree cl, bool verbose, tree this_decl)
7263 if (!IDENTIFIER_CLASS_VALUE (class_name))
7266 if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
7269 if (!CLASS_PUBLIC (TYPE_NAME (type)))
7271 /* Access to a private class within the same package is
7274 breakdown_qualified (&l, &r, class_name);
7275 if (!QUALIFIED_P (class_name) && !ctxp->package)
7276 /* Both in the empty package. */
7278 if (l == ctxp->package)
7279 /* Both in the same package. */
7284 (cl == NULL ? lookup_cl (this_decl): cl,
7285 "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed",
7286 (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
7287 IDENTIFIER_POINTER (class_name));
7293 /* Local variable declaration. */
7296 declare_local_variables (int modifier, tree type, tree vlist)
7298 tree decl, current, saved_type;
7299 tree type_wfl = NULL_TREE;
7303 /* Push a new block if statements were seen between the last time we
7304 pushed a block and now. Keep a count of blocks to close */
7305 if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
7307 tree b = enter_block ();
7308 BLOCK_IS_IMPLICIT (b) = 1;
7314 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)
7315 if (1 << i & modifier)
7317 if (modifier == ACC_FINAL)
7322 (ctxp->modifier_ctx [i],
7323 "Only `final' is allowed as a local variables modifier");
7328 /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
7329 hold the TYPE value if a new incomplete has to be created (as
7330 opposed to being found already existing and reused). */
7331 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
7333 /* If TYPE is fully resolved and we don't have a reference, make one */
7334 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7336 /* Go through all the declared variables */
7337 for (current = vlist, saved_type = type; current;
7338 current = TREE_CHAIN (current), type = saved_type)
7340 tree other, real_type;
7341 tree wfl = TREE_PURPOSE (current);
7342 tree name = EXPR_WFL_NODE (wfl);
7343 tree init = TREE_VALUE (current);
7345 /* Process NAME, as it may specify extra dimension(s) for it */
7346 type = build_array_from_name (type, type_wfl, name, &name);
7348 /* Variable redefinition check */
7349 if ((other = lookup_name_in_blocks (name)))
7351 variable_redefinition_error (wfl, name, TREE_TYPE (other),
7352 DECL_SOURCE_LINE (other));
7356 /* Type adjustment. We may have just readjusted TYPE because
7357 the variable specified more dimensions. Make sure we have
7358 a reference if we can and don't have one already. */
7359 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7361 real_type = GET_REAL_TYPE (type);
7362 /* Never layout this decl. This will be done when its scope
7364 decl = build_decl (VAR_DECL, name, real_type);
7365 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
7366 DECL_FINAL (decl) = final_p;
7367 BLOCK_CHAIN_DECL (decl);
7369 /* If doing xreferencing, replace the line number with the WFL
7372 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
7374 /* Don't try to use an INIT statement when an error was found */
7375 if (init && java_error_count)
7378 /* Add the initialization function to the current function's code */
7381 /* Name might have been readjusted */
7382 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
7383 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
7384 java_method_add_stmt (current_function_decl,
7385 build_debugable_stmt (EXPR_WFL_LINECOL (init),
7389 /* Setup dependency the type of the decl */
7393 register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
7394 dep = CLASSD_LAST (ctxp->classd_list);
7395 JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
7398 SOURCE_FRONTEND_DEBUG (("Defined locals"));
7401 /* Called during parsing. Build decls from argument list. */
7404 source_start_java_method (tree fndecl)
7413 current_function_decl = fndecl;
7415 /* New scope for the function */
7417 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
7418 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
7420 tree type = TREE_VALUE (tem);
7421 tree name = TREE_PURPOSE (tem);
7423 /* If type is incomplete. Create an incomplete decl and ask for
7424 the decl to be patched later */
7425 if (INCOMPLETE_TYPE_P (type))
7428 tree real_type = GET_REAL_TYPE (type);
7429 parm_decl = build_decl (PARM_DECL, name, real_type);
7430 type = obtain_incomplete_type (type);
7431 register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
7432 jdep = CLASSD_LAST (ctxp->classd_list);
7433 JDEP_MISC (jdep) = name;
7434 JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
7437 parm_decl = build_decl (PARM_DECL, name, type);
7439 /* Remember if a local variable was declared final (via its
7440 TREE_LIST of type/name.) Set DECL_FINAL accordingly. */
7441 if (ARG_FINAL_P (tem))
7443 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl);
7444 DECL_FINAL (parm_decl) = 1;
7447 BLOCK_CHAIN_DECL (parm_decl);
7449 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7450 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
7452 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
7453 DECL_MAX_LOCALS (current_function_decl) = i;
7456 /* Called during parsing. Creates an artificial method declaration. */
7459 create_artificial_method (tree class, int flags, tree type,
7460 tree name, tree args)
7464 java_parser_context_save_global ();
7466 mdecl = make_node (FUNCTION_TYPE);
7467 TREE_TYPE (mdecl) = type;
7468 TYPE_ARG_TYPES (mdecl) = args;
7469 mdecl = add_method (class, flags, name, build_java_signature (mdecl));
7470 java_parser_context_restore_global ();
7471 DECL_ARTIFICIAL (mdecl) = 1;
7475 /* Starts the body if an artificial method. */
7478 start_artificial_method_body (tree mdecl)
7480 DECL_SOURCE_LINE (mdecl) = 1;
7481 DECL_FUNCTION_LAST_LINE (mdecl) = 1;
7482 source_start_java_method (mdecl);
7487 end_artificial_method_body (tree mdecl)
7489 /* exit_block modifies DECL_FUNCTION_BODY (current_function_decl).
7490 It has to be evaluated first. (if mdecl is current_function_decl,
7491 we have an undefined behavior if no temporary variable is used.) */
7492 tree b = exit_block ();
7493 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = b;
7497 /* Dump a tree of some kind. This is a convenience wrapper for the
7498 dump_* functions in tree-dump.c. */
7500 dump_java_tree (enum tree_dump_index phase, tree t)
7505 stream = dump_begin (phase, &flags);
7509 dump_node (t, flags, stream);
7510 dump_end (phase, stream);
7514 /* Terminate a function and expand its body. */
7517 source_end_java_method (void)
7519 tree fndecl = current_function_decl;
7524 java_parser_context_save_global ();
7525 input_line = ctxp->last_ccb_indent1;
7527 /* Turn function bodies with only a NOP expr null, so they don't get
7528 generated at all and we won't get warnings when using the -W
7530 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) == empty_stmt_node)
7531 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
7533 /* We've generated all the trees for this function, and it has been
7534 patched. Dump it to a file if the user requested it. */
7535 dump_java_tree (TDI_original, fndecl);
7537 /* Defer expanding the method until cgraph analysis is complete. */
7538 if (DECL_SAVED_TREE (fndecl))
7539 cgraph_finalize_function (fndecl, false);
7541 current_function_decl = NULL_TREE;
7542 java_parser_context_restore_global ();
7545 /* Record EXPR in the current function block. Complements compound
7546 expression second operand if necessary. */
7549 java_method_add_stmt (tree fndecl, tree expr)
7551 if (!GET_CURRENT_BLOCK (fndecl))
7553 return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
7557 add_stmt_to_block (tree b, tree type, tree stmt)
7559 tree body = BLOCK_EXPR_BODY (b), c;
7561 if (java_error_count)
7564 if ((c = add_stmt_to_compound (body, type, stmt)) == body)
7567 BLOCK_EXPR_BODY (b) = c;
7568 TREE_SIDE_EFFECTS (c) = 1;
7572 /* Add STMT to EXISTING if possible, otherwise create a new
7573 COMPOUND_EXPR and add STMT to it. */
7576 add_stmt_to_compound (tree existing, tree type, tree stmt)
7579 return build (COMPOUND_EXPR, type, existing, stmt);
7584 void java_layout_seen_class_methods (void)
7586 tree previous_list = all_class_list;
7587 tree end = NULL_TREE;
7592 for (current = previous_list;
7593 current != end; current = TREE_CHAIN (current))
7594 layout_class_methods (TREE_TYPE (TREE_VALUE (current)));
7596 if (previous_list != all_class_list)
7598 end = previous_list;
7599 previous_list = all_class_list;
7606 static GTY(()) tree stop_reordering;
7608 java_reorder_fields (void)
7612 for (current = gclass_list; current; current = TREE_CHAIN (current))
7614 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7616 if (current_class == stop_reordering)
7619 /* Reverse the fields, but leave the dummy field in front.
7620 Fields are already ordered for Object and Class */
7621 if (TYPE_FIELDS (current_class) && current_class != object_type_node
7622 && current_class != class_type_node)
7624 /* If the dummy field is there, reverse the right fields and
7625 just layout the type for proper fields offset */
7626 if (!DECL_NAME (TYPE_FIELDS (current_class)))
7628 tree fields = TYPE_FIELDS (current_class);
7629 TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
7630 TYPE_SIZE (current_class) = NULL_TREE;
7632 /* We don't have a dummy field, we need to layout the class,
7633 after having reversed the fields */
7636 TYPE_FIELDS (current_class) =
7637 nreverse (TYPE_FIELDS (current_class));
7638 TYPE_SIZE (current_class) = NULL_TREE;
7642 /* There are cases were gclass_list will be empty. */
7644 stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list));
7647 /* Layout the methods of all classes loaded in one way or another.
7648 Check methods of source parsed classes. Then reorder the
7649 fields and layout the classes or the type of all source parsed
7653 java_layout_classes (void)
7656 int save_error_count = java_error_count;
7658 /* Layout the methods of all classes seen so far */
7659 java_layout_seen_class_methods ();
7660 java_parse_abort_on_error ();
7661 all_class_list = NULL_TREE;
7663 /* Then check the methods of all parsed classes */
7664 for (current = gclass_list; current; current = TREE_CHAIN (current))
7665 if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
7666 java_check_methods (TREE_VALUE (current));
7667 java_parse_abort_on_error ();
7669 for (current = gclass_list; current; current = TREE_CHAIN (current))
7671 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7672 layout_class (current_class);
7674 /* Error reported by the caller */
7675 if (java_error_count)
7679 /* We might have reloaded classes durign the process of laying out
7680 classes for code generation. We must layout the methods of those
7681 late additions, as constructor checks might use them */
7682 java_layout_seen_class_methods ();
7683 java_parse_abort_on_error ();
7686 /* Expand methods in the current set of classes remembered for
7690 java_complete_expand_classes (void)
7694 do_not_fold = flag_emit_xref;
7696 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
7697 if (!INNER_CLASS_DECL_P (current))
7698 java_complete_expand_class (current);
7701 /* Expand the methods found in OUTER, starting first by OUTER's inner
7705 java_complete_expand_class (tree outer)
7709 set_nested_class_simple_name_value (outer, 1); /* Set */
7711 /* We need to go after all inner classes and start expanding them,
7712 starting with most nested ones. We have to do that because nested
7713 classes might add functions to outer classes */
7715 for (inner_list = DECL_INNER_CLASS_LIST (outer);
7716 inner_list; inner_list = TREE_CHAIN (inner_list))
7717 java_complete_expand_class (TREE_PURPOSE (inner_list));
7719 java_complete_expand_methods (outer);
7720 set_nested_class_simple_name_value (outer, 0); /* Reset */
7723 /* Expand methods registered in CLASS_DECL. The general idea is that
7724 we expand regular methods first. This allows us get an estimate on
7725 how outer context local alias fields are really used so we can add
7726 to the constructor just enough code to initialize them properly (it
7727 also lets us generate finit$ correctly.) Then we expand the
7728 constructors and then <clinit>. */
7731 java_complete_expand_methods (tree class_decl)
7733 tree clinit, decl, first_decl;
7735 output_class = current_class = TREE_TYPE (class_decl);
7737 /* Pre-expand <clinit> to figure whether we really need it or
7738 not. If we do need it, we pre-expand the static fields so they're
7739 ready to be used somewhere else. <clinit> will be fully expanded
7740 after we processed the constructors. */
7741 first_decl = TYPE_METHODS (current_class);
7742 clinit = maybe_generate_pre_expand_clinit (current_class);
7744 /* Then generate finit$ (if we need to) because constructors will
7746 if (TYPE_FINIT_STMT_LIST (current_class))
7747 java_complete_expand_method (generate_finit (current_class));
7749 /* Then generate instinit$ (if we need to) because constructors will
7751 if (TYPE_II_STMT_LIST (current_class))
7752 java_complete_expand_method (generate_instinit (current_class));
7754 /* Now do the constructors */
7755 for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl))
7759 if (!DECL_CONSTRUCTOR_P (decl))
7762 no_body = !DECL_FUNCTION_BODY (decl);
7763 /* Don't generate debug info on line zero when expanding a
7764 generated constructor. */
7766 restore_line_number_status (1);
7768 java_complete_expand_method (decl);
7771 restore_line_number_status (0);
7774 /* First, do the ordinary methods. */
7775 for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
7777 /* Ctors aren't part of this batch. */
7778 if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
7781 /* Skip abstract or native methods -- but do handle native
7782 methods when generating JNI stubs. */
7783 if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl)))
7785 DECL_FUNCTION_BODY (decl) = NULL_TREE;
7789 if (METHOD_NATIVE (decl))
7792 current_function_decl = decl;
7793 body = build_jni_stub (decl);
7794 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
7797 java_complete_expand_method (decl);
7800 /* If there is indeed a <clinit>, fully expand it now */
7803 /* Prevent the use of `this' inside <clinit> */
7804 ctxp->explicit_constructor_p = 1;
7805 java_complete_expand_method (clinit);
7806 ctxp->explicit_constructor_p = 0;
7809 /* We might have generated a class$ that we now want to expand */
7810 if (TYPE_DOT_CLASS (current_class))
7811 java_complete_expand_method (TYPE_DOT_CLASS (current_class));
7813 /* Now verify constructor circularity (stop after the first one we
7815 if (!CLASS_INTERFACE (class_decl))
7816 for (decl = TYPE_METHODS (current_class); decl; decl = TREE_CHAIN (decl))
7817 if (DECL_CONSTRUCTOR_P (decl)
7818 && verify_constructor_circularity (decl, decl))
7822 /* Attempt to create <clinit>. Pre-expand static fields so they can be
7823 safely used in some other methods/constructors. */
7826 maybe_generate_pre_expand_clinit (tree class_type)
7828 tree current, mdecl;
7830 if (!TYPE_CLINIT_STMT_LIST (class_type))
7833 /* Go through all static fields and pre expand them */
7834 for (current = TYPE_FIELDS (class_type); current;
7835 current = TREE_CHAIN (current))
7836 if (FIELD_STATIC (current))
7837 build_field_ref (NULL_TREE, class_type, DECL_NAME (current));
7839 /* Then build the <clinit> method */
7840 mdecl = create_artificial_method (class_type, ACC_STATIC, void_type_node,
7841 clinit_identifier_node, end_params_node);
7842 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
7844 start_artificial_method_body (mdecl);
7846 /* We process the list of assignment we produced as the result of
7847 the declaration of initialized static field and add them as
7848 statement to the <clinit> method. */
7849 for (current = TYPE_CLINIT_STMT_LIST (class_type); current;
7850 current = TREE_CHAIN (current))
7852 tree stmt = current;
7853 /* We build the assignment expression that will initialize the
7854 field to its value. There are strict rules on static
7855 initializers (8.5). FIXME */
7856 if (TREE_CODE (stmt) != BLOCK && stmt != empty_stmt_node)
7857 stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt);
7858 java_method_add_stmt (mdecl, stmt);
7861 end_artificial_method_body (mdecl);
7863 /* Now we want to place <clinit> as the last method (because we need
7864 it at least for interface so that it doesn't interfere with the
7865 dispatch table based lookup. */
7866 if (TREE_CHAIN (TYPE_METHODS (class_type)))
7868 current = TREE_CHAIN (TYPE_METHODS (class_type));
7869 TYPE_METHODS (class_type) = current;
7871 while (TREE_CHAIN (current))
7872 current = TREE_CHAIN (current);
7874 TREE_CHAIN (current) = mdecl;
7875 TREE_CHAIN (mdecl) = NULL_TREE;
7881 /* Analyzes a method body and look for something that isn't a
7882 MODIFY_EXPR with a constant value. */
7885 analyze_clinit_body (tree this_class, tree bbody)
7888 switch (TREE_CODE (bbody))
7891 bbody = BLOCK_EXPR_BODY (bbody);
7894 case EXPR_WITH_FILE_LOCATION:
7895 bbody = EXPR_WFL_NODE (bbody);
7899 if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0)))
7901 bbody = TREE_OPERAND (bbody, 1);
7905 /* If we're generating to class file and we're dealing with an
7906 array initialization, we return 1 to keep <clinit> */
7907 if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT
7908 && flag_emit_class_files)
7911 /* There are a few cases where we're required to keep
7913 - If this is an assignment whose operand is not constant,
7914 - If this is an assignment to a non-initialized field,
7915 - If this field is not a member of the current class.
7917 return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1))
7918 || ! DECL_INITIAL (TREE_OPERAND (bbody, 0))
7919 || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class);
7928 /* See whether we could get rid of <clinit>. Criteria are: all static
7929 final fields have constant initial values and the body of <clinit>
7930 is empty. Return 1 if <clinit> was discarded, 0 otherwise. */
7933 maybe_yank_clinit (tree mdecl)
7938 if (!DECL_CLINIT_P (mdecl))
7941 /* If the body isn't empty, then we keep <clinit>. Note that if
7942 we're emitting classfiles, this isn't enough not to rule it
7944 fbody = DECL_FUNCTION_BODY (mdecl);
7945 bbody = BLOCK_EXPR_BODY (fbody);
7946 if (bbody && bbody != error_mark_node)
7947 bbody = BLOCK_EXPR_BODY (bbody);
7950 if (bbody && ! flag_emit_class_files && bbody != empty_stmt_node)
7953 type = DECL_CONTEXT (mdecl);
7954 current = TYPE_FIELDS (type);
7956 for (current = (current ? TREE_CHAIN (current) : current);
7957 current; current = TREE_CHAIN (current))
7961 /* We're not interested in non-static fields. */
7962 if (!FIELD_STATIC (current))
7965 /* Nor in fields without initializers. */
7966 f_init = DECL_INITIAL (current);
7967 if (f_init == NULL_TREE)
7970 /* Anything that isn't String or a basic type is ruled out -- or
7971 if we know how to deal with it (when doing things natively) we
7972 should generated an empty <clinit> so that SUID are computed
7974 if (! JSTRING_TYPE_P (TREE_TYPE (current))
7975 && ! JNUMERIC_TYPE_P (TREE_TYPE (current)))
7978 if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init))
7982 /* Now we analyze the method body and look for something that
7983 isn't a MODIFY_EXPR */
7984 if (bbody != empty_stmt_node && analyze_clinit_body (type, bbody))
7987 /* Get rid of <clinit> in the class' list of methods */
7988 if (TYPE_METHODS (type) == mdecl)
7989 TYPE_METHODS (type) = TREE_CHAIN (mdecl);
7991 for (current = TYPE_METHODS (type); current;
7992 current = TREE_CHAIN (current))
7993 if (TREE_CHAIN (current) == mdecl)
7995 TREE_CHAIN (current) = TREE_CHAIN (mdecl);
8002 /* Install the argument from MDECL. Suitable to completion and
8003 expansion of mdecl's body. */
8006 start_complete_expand_method (tree mdecl)
8010 pushlevel (1); /* Prepare for a parameter push */
8011 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
8012 DECL_ARGUMENTS (mdecl) = tem;
8014 for (; tem; tem = TREE_CHAIN (tem))
8016 /* TREE_CHAIN (tem) will change after pushdecl. */
8017 tree next = TREE_CHAIN (tem);
8018 tree type = TREE_TYPE (tem);
8019 if (targetm.calls.promote_prototypes (type)
8020 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
8021 && INTEGRAL_TYPE_P (type))
8022 type = integer_type_node;
8023 DECL_ARG_TYPE (tem) = type;
8024 layout_decl (tem, 0);
8026 /* Re-install the next so that the list is kept and the loop
8028 TREE_CHAIN (tem) = next;
8030 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8031 input_line = DECL_SOURCE_LINE (mdecl);
8032 build_result_decl (mdecl);
8036 /* Complete and expand a method. */
8039 java_complete_expand_method (tree mdecl)
8041 tree fbody, block_body, exception_copy;
8043 current_function_decl = mdecl;
8044 /* Fix constructors before expanding them */
8045 if (DECL_CONSTRUCTOR_P (mdecl))
8046 fix_constructors (mdecl);
8048 /* Expand functions that have a body */
8049 if (!DECL_FUNCTION_BODY (mdecl))
8052 fbody = DECL_FUNCTION_BODY (mdecl);
8053 block_body = BLOCK_EXPR_BODY (fbody);
8054 exception_copy = NULL_TREE;
8056 current_function_decl = mdecl;
8059 fprintf (stderr, " [%s.",
8060 lang_printable_name (DECL_CONTEXT (mdecl), 0));
8061 announce_function (mdecl);
8063 fprintf (stderr, "]");
8065 /* Prepare the function for tree completion */
8066 start_complete_expand_method (mdecl);
8068 /* Install the current this */
8069 current_this = (!METHOD_STATIC (mdecl) ?
8070 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
8072 /* Purge the `throws' list of unchecked exceptions (we save a copy
8073 of the list and re-install it later.) */
8074 exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl));
8075 purge_unchecked_exceptions (mdecl);
8077 /* Install exceptions thrown with `throws' */
8078 PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
8080 if (block_body != NULL_TREE)
8082 block_body = java_complete_tree (block_body);
8084 /* Before we check initialization, attached all class initialization
8085 variable to the block_body */
8086 htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (mdecl),
8087 attach_init_test_initialization_flags, block_body);
8089 if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
8091 check_for_initialization (block_body, mdecl);
8093 /* Go through all the flags marking the initialization of
8094 static variables and see whether they're definitively
8095 assigned, in which case the type is remembered as
8096 definitively initialized in MDECL. */
8097 if (STATIC_CLASS_INIT_OPT_P ())
8099 /* Always register the context as properly initialized in
8100 MDECL. This used with caution helps removing extra
8101 initialization of self. */
8102 if (METHOD_STATIC (mdecl))
8105 (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl),
8106 DECL_CONTEXT (mdecl), INSERT)) = DECL_CONTEXT (mdecl);
8110 ctxp->explicit_constructor_p = 0;
8113 BLOCK_EXPR_BODY (fbody) = block_body;
8115 /* If we saw a return but couldn't evaluate it properly, we'll have
8116 an error_mark_node here. */
8117 if (block_body != error_mark_node
8118 && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
8119 && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE
8121 missing_return_error (current_function_decl);
8123 /* See if we can get rid of <clinit> if MDECL happens to be <clinit> */
8124 maybe_yank_clinit (mdecl);
8126 /* Pop the current level, with special measures if we found errors. */
8127 if (java_error_count)
8128 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8131 /* Pop the exceptions and sanity check */
8133 if (currently_caught_type_list)
8136 /* Restore the copy of the list of exceptions if emitting xrefs. */
8137 DECL_FUNCTION_THROWS (mdecl) = exception_copy;
8140 /* For with each class for which there's code to generate. */
8143 java_expand_method_bodies (tree class)
8146 for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl))
8151 if (! DECL_FUNCTION_BODY (decl))
8154 current_function_decl = decl;
8156 block = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
8158 if (TREE_CODE (block) != BLOCK)
8161 /* Save the function body for inlining. */
8162 DECL_SAVED_TREE (decl) = block;
8164 body = BLOCK_EXPR_BODY (block);
8166 if (TREE_TYPE (body) == NULL_TREE)
8169 /* It's time to assign the variable flagging static class
8170 initialization based on which classes invoked static methods
8171 are definitely initializing. This should be flagged. */
8172 if (STATIC_CLASS_INIT_OPT_P ())
8174 tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl);
8175 for (; list != NULL_TREE; list = TREE_CHAIN (list))
8177 /* Executed for each statement calling a static function.
8178 LIST is a TREE_LIST whose PURPOSE is the called function
8179 and VALUE is a compound whose second operand can be patched
8180 with static class initialization flag assignments. */
8182 tree called_method = TREE_PURPOSE (list);
8183 tree compound = TREE_VALUE (list);
8184 tree assignment_compound_list
8185 = build_tree_list (called_method, NULL);
8187 /* For each class definitely initialized in
8188 CALLED_METHOD, fill ASSIGNMENT_COMPOUND with
8189 assignment to the class initialization flag. */
8190 htab_traverse (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method),
8191 emit_test_initialization,
8192 assignment_compound_list);
8194 if (TREE_VALUE (assignment_compound_list))
8195 TREE_OPERAND (compound, 1)
8196 = TREE_VALUE (assignment_compound_list);
8200 /* Prepend class initialization to static methods. */
8201 if (METHOD_STATIC (decl) && ! METHOD_PRIVATE (decl)
8202 && ! flag_emit_class_files
8203 && ! DECL_CLINIT_P (decl)
8204 && ! CLASS_INTERFACE (TYPE_NAME (class)))
8206 tree init = build (CALL_EXPR, void_type_node,
8207 build_address_of (soft_initclass_node),
8208 build_tree_list (NULL_TREE,
8209 build_class_ref (class)),
8211 TREE_SIDE_EFFECTS (init) = 1;
8212 body = build (COMPOUND_EXPR, TREE_TYPE (body), init, body);
8213 BLOCK_EXPR_BODY (block) = body;
8216 /* Wrap synchronized method bodies in a monitorenter
8217 plus monitorexit cleanup. */
8218 if (METHOD_SYNCHRONIZED (decl) && ! flag_emit_class_files)
8220 tree enter, exit, lock;
8221 if (METHOD_STATIC (decl))
8222 lock = build_class_ref (class);
8224 lock = DECL_ARGUMENTS (decl);
8225 BUILD_MONITOR_ENTER (enter, lock);
8226 BUILD_MONITOR_EXIT (exit, lock);
8228 body = build (COMPOUND_EXPR, void_type_node,
8230 build (TRY_FINALLY_EXPR, void_type_node, body, exit));
8231 BLOCK_EXPR_BODY (block) = body;
8234 /* Expand the the function body. */
8235 source_end_java_method ();
8241 /* This section of the code deals with accessing enclosing context
8242 fields either directly by using the relevant access to this$<n> or
8243 by invoking an access method crafted for that purpose. */
8245 /* Build the necessary access from an inner class to an outer
8246 class. This routine could be optimized to cache previous result
8247 (decl, current_class and returned access). When an access method
8248 needs to be generated, it always takes the form of a read. It might
8249 be later turned into a write by calling outer_field_access_fix. */
8252 build_outer_field_access (tree id, tree decl)
8254 tree access = NULL_TREE;
8255 tree ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
8256 tree decl_ctx = DECL_CONTEXT (decl);
8258 /* If the immediate enclosing context of the current class is the
8259 field decl's class or inherits from it; build the access as
8260 `this$<n>.<field>'. Note that we will break the `private' barrier
8261 if we're not emitting bytecodes. */
8262 if ((ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
8263 && (!FIELD_PRIVATE (decl) || !flag_emit_class_files ))
8265 tree thisn = build_current_thisn (current_class);
8266 access = make_qualified_primary (build_wfl_node (thisn),
8267 id, EXPR_WFL_LINECOL (id));
8269 /* Otherwise, generate access methods to outer this and access the
8270 field (either using an access method or by direct access.) */
8273 int lc = EXPR_WFL_LINECOL (id);
8275 /* Now we chain the required number of calls to the access$0 to
8276 get a hold to the enclosing instance we need, and then we
8277 build the field access. */
8278 access = build_access_to_thisn (current_class, decl_ctx, lc);
8280 /* If the field is private and we're generating bytecode, then
8281 we generate an access method */
8282 if (FIELD_PRIVATE (decl) && flag_emit_class_files )
8284 tree name = build_outer_field_access_methods (decl);
8285 access = build_outer_field_access_expr (lc, decl_ctx,
8286 name, access, NULL_TREE);
8288 /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'.
8289 Once again we break the `private' access rule from a foreign
8292 access = make_qualified_primary (access, id, lc);
8294 return resolve_expression_name (access, NULL);
8297 /* Return a nonzero value if NODE describes an outer field inner
8301 outer_field_access_p (tree type, tree decl)
8303 if (!INNER_CLASS_TYPE_P (type)
8304 || TREE_CODE (decl) != FIELD_DECL
8305 || DECL_CONTEXT (decl) == type)
8308 /* If the inner class extends the declaration context of the field
8309 we're trying to access, then this isn't an outer field access */
8310 if (inherits_from_p (type, DECL_CONTEXT (decl)))
8313 for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ;
8314 type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))))
8316 if (type == DECL_CONTEXT (decl))
8319 if (!DECL_CONTEXT (TYPE_NAME (type)))
8321 /* Before we give up, see whether the field is inherited from
8322 the enclosing context we're considering. */
8323 if (inherits_from_p (type, DECL_CONTEXT (decl)))
8332 /* Return a nonzero value if NODE represents an outer field inner
8333 access that was been already expanded. As a side effect, it returns
8334 the name of the field being accessed and the argument passed to the
8335 access function, suitable for a regeneration of the access method
8336 call if necessary. */
8339 outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
8344 if (TREE_CODE (node) != CALL_EXPR)
8347 /* Well, gcj generates slightly different tree nodes when compiling
8348 to native or bytecodes. It's the case for function calls. */
8350 if (flag_emit_class_files
8351 && TREE_CODE (node) == CALL_EXPR
8352 && OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
8354 else if (!flag_emit_class_files)
8356 node = TREE_OPERAND (node, 0);
8358 if (node && TREE_OPERAND (node, 0)
8359 && TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)
8361 node = TREE_OPERAND (node, 0);
8362 if (TREE_OPERAND (node, 0)
8363 && TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
8364 && (OUTER_FIELD_ACCESS_IDENTIFIER_P
8365 (DECL_NAME (TREE_OPERAND (node, 0)))))
8370 if (identified && name && arg_type && arg)
8372 tree argument = TREE_OPERAND (node, 1);
8373 *name = DECL_NAME (TREE_OPERAND (node, 0));
8374 *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
8375 *arg = TREE_VALUE (argument);
8380 /* Detect in NODE an outer field read access from an inner class and
8381 transform it into a write with RHS as an argument. This function is
8382 called from the java_complete_lhs when an assignment to a LHS can
8386 outer_field_access_fix (tree wfl, tree node, tree rhs)
8388 tree name, arg_type, arg;
8390 if (outer_field_expanded_access_p (node, &name, &arg_type, &arg))
8392 node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl),
8393 arg_type, name, arg, rhs);
8394 return java_complete_tree (node);
8399 /* Construct the expression that calls an access method:
8400 <type>.access$<n>(<arg1> [, <arg2>]);
8402 ARG2 can be NULL and will be omitted in that case. It will denote a
8406 build_outer_field_access_expr (int lc, tree type, tree access_method_name,
8407 tree arg1, tree arg2)
8409 tree args, cn, access;
8411 args = arg1 ? arg1 :
8412 build_wfl_node (build_current_thisn (current_class));
8413 args = build_tree_list (NULL_TREE, args);
8416 args = tree_cons (NULL_TREE, arg2, args);
8418 access = build_method_invocation (build_wfl_node (access_method_name), args);
8419 cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
8420 return make_qualified_primary (cn, access, lc);
8424 build_new_access_id (void)
8426 static int access_n_counter = 1;
8429 sprintf (buffer, "access$%d", access_n_counter++);
8430 return get_identifier (buffer);
8433 /* Create the static access functions for the outer field DECL. We define a
8435 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
8439 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$,
8440 TREE_TYPE (<field>) value$) {
8441 return inst$.field = value$;
8443 We should have a usage flags on the DECL so we can lazily turn the ones
8444 we're using for code generation. FIXME.
8448 build_outer_field_access_methods (tree decl)
8450 tree id, args, stmt, mdecl;
8452 if (FIELD_INNER_ACCESS_P (decl))
8453 return FIELD_INNER_ACCESS (decl);
8455 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
8457 /* Create the identifier and a function named after it. */
8458 id = build_new_access_id ();
8460 /* The identifier is marked as bearing the name of a generated write
8461 access function for outer field accessed from inner classes. */
8462 OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8464 /* Create the read access */
8465 args = build_tree_list (inst_id, build_pointer_type (DECL_CONTEXT (decl)));
8466 TREE_CHAIN (args) = end_params_node;
8467 stmt = make_qualified_primary (build_wfl_node (inst_id),
8468 build_wfl_node (DECL_NAME (decl)), 0);
8469 stmt = build_return (0, stmt);
8470 mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8471 TREE_TYPE (decl), id, args, stmt);
8472 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8474 /* Create the write access method. No write access for final variable */
8475 if (!FIELD_FINAL (decl))
8477 args = build_tree_list (inst_id,
8478 build_pointer_type (DECL_CONTEXT (decl)));
8479 TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
8480 TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
8481 stmt = make_qualified_primary (build_wfl_node (inst_id),
8482 build_wfl_node (DECL_NAME (decl)), 0);
8483 stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
8484 build_wfl_node (wpv_id)));
8485 mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8486 TREE_TYPE (decl), id,
8489 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8491 /* Return the access name */
8492 return FIELD_INNER_ACCESS (decl) = id;
8495 /* Build an field access method NAME. */
8498 build_outer_field_access_method (tree class, tree type, tree name,
8499 tree args, tree body)
8501 tree saved_current_function_decl, mdecl;
8503 /* Create the method */
8504 mdecl = create_artificial_method (class, ACC_STATIC, type, name, args);
8505 fix_method_argument_names (args, mdecl);
8506 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8508 /* Attach the method body. */
8509 saved_current_function_decl = current_function_decl;
8510 start_artificial_method_body (mdecl);
8511 java_method_add_stmt (mdecl, body);
8512 end_artificial_method_body (mdecl);
8513 current_function_decl = saved_current_function_decl;
8519 /* This section deals with building access function necessary for
8520 certain kinds of method invocation from inner classes. */
8523 build_outer_method_access_method (tree decl)
8525 tree saved_current_function_decl, mdecl;
8526 tree args = NULL_TREE, call_args = NULL_TREE;
8527 tree carg, id, body, class;
8529 int parm_id_count = 0;
8531 /* Test this abort with an access to a private field */
8532 if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "access$"))
8535 /* Check the cache first */
8536 if (DECL_FUNCTION_INNER_ACCESS (decl))
8537 return DECL_FUNCTION_INNER_ACCESS (decl);
8539 class = DECL_CONTEXT (decl);
8541 /* Obtain an access identifier and mark it */
8542 id = build_new_access_id ();
8543 OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8545 carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
8546 /* Create the arguments, as much as the original */
8547 for (; carg && carg != end_params_node;
8548 carg = TREE_CHAIN (carg))
8550 sprintf (buffer, "write_parm_value$%d", parm_id_count++);
8551 args = chainon (args, build_tree_list (get_identifier (buffer),
8552 TREE_VALUE (carg)));
8554 args = chainon (args, end_params_node);
8556 /* Create the method */
8557 mdecl = create_artificial_method (class, ACC_STATIC,
8558 TREE_TYPE (TREE_TYPE (decl)), id, args);
8559 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8560 /* There is a potential bug here. We should be able to use
8561 fix_method_argument_names, but then arg names get mixed up and
8562 eventually a constructor will have its this$0 altered and the
8563 outer context won't be assignment properly. The testcase is
8565 TYPE_ARG_TYPES (TREE_TYPE (mdecl)) = args;
8567 /* Attach the method body. */
8568 saved_current_function_decl = current_function_decl;
8569 start_artificial_method_body (mdecl);
8571 /* The actual method invocation uses the same args. When invoking a
8572 static methods that way, we don't want to skip the first
8575 if (!METHOD_STATIC (decl))
8576 carg = TREE_CHAIN (carg);
8577 for (; carg && carg != end_params_node; carg = TREE_CHAIN (carg))
8578 call_args = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (carg)),
8581 body = build_method_invocation (build_wfl_node (DECL_NAME (decl)),
8583 if (!METHOD_STATIC (decl))
8584 body = make_qualified_primary (build_wfl_node (TREE_PURPOSE (args)),
8586 if (TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
8587 body = build_return (0, body);
8588 java_method_add_stmt (mdecl,body);
8589 end_artificial_method_body (mdecl);
8590 current_function_decl = saved_current_function_decl;
8592 /* Back tag the access function so it know what it accesses */
8593 DECL_FUNCTION_ACCESS_DECL (decl) = mdecl;
8595 /* Tag the current method so it knows it has an access generated */
8596 return DECL_FUNCTION_INNER_ACCESS (decl) = mdecl;
8600 /* This section of the code deals with building expressions to access
8601 the enclosing instance of an inner class. The enclosing instance is
8602 kept in a generated field called this$<n>, with <n> being the
8603 inner class nesting level (starting from 0.) */
8605 /* Build an access to a given this$<n>, always chaining access call to
8606 others. Access methods to this$<n> are build on the fly if
8607 necessary. This CAN'T be used to solely access this$<n-1> from
8608 this$<n> (which alway yield to special cases and optimization, see
8609 for example build_outer_field_access). */
8612 build_access_to_thisn (tree from, tree to, int lc)
8614 tree access = NULL_TREE;
8616 while (from != to && PURE_INNER_CLASS_TYPE_P (from))
8620 access = build_current_thisn (from);
8621 access = build_wfl_node (access);
8625 tree access0_wfl, cn;
8627 maybe_build_thisn_access_method (from);
8628 access0_wfl = build_wfl_node (access0_identifier_node);
8629 cn = build_wfl_node (DECL_NAME (TYPE_NAME (from)));
8630 EXPR_WFL_LINECOL (access0_wfl) = lc;
8631 access = build_tree_list (NULL_TREE, access);
8632 access = build_method_invocation (access0_wfl, access);
8633 access = make_qualified_primary (cn, access, lc);
8636 /* If FROM isn't an inner class, that's fine, we've done enough.
8637 What we're looking for can be accessed from there. */
8638 from = DECL_CONTEXT (TYPE_NAME (from));
8641 from = TREE_TYPE (from);
8646 /* Build an access function to the this$<n> local to TYPE. NULL_TREE
8647 is returned if nothing needs to be generated. Otherwise, the method
8648 generated and a method decl is returned.
8650 NOTE: These generated methods should be declared in a class file
8651 attribute so that they can't be referred to directly. */
8654 maybe_build_thisn_access_method (tree type)
8656 tree mdecl, args, stmt, rtype;
8657 tree saved_current_function_decl;
8659 /* If TYPE is a top-level class, no access method is required.
8660 If there already is such an access method, bail out. */
8661 if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type))
8664 /* We generate the method. The method looks like:
8665 static <outer_of_type> access$0 (<type> inst$) { return inst$.this$<n>; }
8667 args = build_tree_list (inst_id, build_pointer_type (type));
8668 TREE_CHAIN (args) = end_params_node;
8669 rtype = build_pointer_type (TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))));
8670 mdecl = create_artificial_method (type, ACC_STATIC, rtype,
8671 access0_identifier_node, args);
8672 fix_method_argument_names (args, mdecl);
8673 layout_class_method (type, NULL_TREE, mdecl, NULL_TREE);
8674 stmt = build_current_thisn (type);
8675 stmt = make_qualified_primary (build_wfl_node (inst_id),
8676 build_wfl_node (stmt), 0);
8677 stmt = build_return (0, stmt);
8679 saved_current_function_decl = current_function_decl;
8680 start_artificial_method_body (mdecl);
8681 java_method_add_stmt (mdecl, stmt);
8682 end_artificial_method_body (mdecl);
8683 current_function_decl = saved_current_function_decl;
8685 CLASS_ACCESS0_GENERATED_P (type) = 1;
8690 /* Craft an correctly numbered `this$<n>'string. this$0 is used for
8691 the first level of innerclassing. this$1 for the next one, etc...
8692 This function can be invoked with TYPE to NULL, available and then
8693 has to count the parser context. */
8695 static GTY(()) tree saved_thisn;
8696 static GTY(()) tree saved_type;
8699 build_current_thisn (tree type)
8701 static int saved_i = -1;
8702 static int saved_type_i = 0;
8709 if (type == saved_type)
8713 for (i = -1, decl = DECL_CONTEXT (TYPE_NAME (type));
8714 decl; decl = DECL_CONTEXT (decl), i++)
8722 i = list_length (GET_CPC_LIST ())-2;
8727 sprintf (buffer, "this$%d", i);
8729 saved_thisn = get_identifier (buffer);
8733 /* Return the assignment to the hidden enclosing context `this$<n>'
8734 by the second incoming parameter to the innerclass constructor. The
8735 form used is `this.this$<n> = this$<n>;'. */
8738 build_thisn_assign (void)
8740 if (current_class && PURE_INNER_CLASS_TYPE_P (current_class))
8742 tree thisn = build_current_thisn (current_class);
8743 tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
8744 build_wfl_node (thisn), 0);
8745 tree rhs = build_wfl_node (thisn);
8746 EXPR_WFL_SET_LINECOL (lhs, input_line, 0);
8747 return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
8753 /* Building the synthetic `class$' used to implement the `.class' 1.1
8754 extension for non primitive types. This method looks like:
8756 static Class class$(String type) throws NoClassDefFoundError
8758 try {return (java.lang.Class.forName (String));}
8759 catch (ClassNotFoundException e) {
8760 throw new NoClassDefFoundError(e.getMessage());}
8763 static GTY(()) tree get_message_wfl;
8764 static GTY(()) tree type_parm_wfl;
8767 build_dot_class_method (tree class)
8769 #define BWF(S) build_wfl_node (get_identifier ((S)))
8770 #define MQN(X,Y) make_qualified_name ((X), (Y), 0)
8771 tree args, tmp, saved_current_function_decl, mdecl, qual_name;
8772 tree stmt, throw_stmt;
8774 if (!get_message_wfl)
8776 get_message_wfl = build_wfl_node (get_identifier ("getMessage"));
8777 type_parm_wfl = build_wfl_node (get_identifier ("type$"));
8780 /* Build the arguments */
8781 args = build_tree_list (get_identifier ("type$"),
8782 build_pointer_type (string_type_node));
8783 TREE_CHAIN (args) = end_params_node;
8785 /* Build the qualified name java.lang.Class.forName */
8786 tmp = MQN (MQN (MQN (BWF ("java"),
8787 BWF ("lang")), BWF ("Class")), BWF ("forName"));
8789 /* Create the "class$" function */
8790 mdecl = create_artificial_method (class, ACC_STATIC,
8791 build_pointer_type (class_type_node),
8792 classdollar_identifier_node, args);
8793 qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8794 BWF ("NoClassDefFoundError"));
8795 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, qual_name);
8796 register_incomplete_type (JDEP_EXCEPTION, qual_name, NULL_TREE, NULL_TREE);
8797 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
8798 &TREE_VALUE (DECL_FUNCTION_THROWS (mdecl));
8800 /* We start by building the try block. We need to build:
8801 return (java.lang.Class.forName (type)); */
8802 stmt = build_method_invocation (tmp,
8803 build_tree_list (NULL_TREE, type_parm_wfl));
8804 stmt = build_return (0, stmt);
8806 /* Now onto the catch block. We start by building the expression
8807 throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
8808 throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
8809 get_message_wfl, 0);
8810 throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
8812 /* Build new NoClassDefFoundError (_.getMessage) */
8813 throw_stmt = build_new_invocation
8814 (build_wfl_node (get_identifier ("NoClassDefFoundError")),
8815 build_tree_list (build_pointer_type (string_type_node), throw_stmt));
8817 /* Build the throw, (it's too early to use BUILD_THROW) */
8818 throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt);
8820 /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */
8821 qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8822 BWF ("ClassNotFoundException"));
8823 stmt = encapsulate_with_try_catch (0, qual_name, stmt, throw_stmt);
8825 fix_method_argument_names (args, mdecl);
8826 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8827 saved_current_function_decl = current_function_decl;
8828 start_artificial_method_body (mdecl);
8829 java_method_add_stmt (mdecl, stmt);
8830 end_artificial_method_body (mdecl);
8831 current_function_decl = saved_current_function_decl;
8832 TYPE_DOT_CLASS (class) = mdecl;
8838 build_dot_class_method_invocation (tree this_class, tree type)
8840 tree dot_class_method = TYPE_DOT_CLASS (this_class);
8843 if (TYPE_ARRAY_P (type))
8844 sig_id = build_java_signature (type);
8846 sig_id = DECL_NAME (TYPE_NAME (type));
8848 /* Ensure that the proper name separator is used */
8849 sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id),
8850 IDENTIFIER_LENGTH (sig_id));
8852 s = build_string (IDENTIFIER_LENGTH (sig_id),
8853 IDENTIFIER_POINTER (sig_id));
8854 t = build_method_invocation (build_wfl_node (DECL_NAME (dot_class_method)),
8855 build_tree_list (NULL_TREE, s));
8856 if (DECL_CONTEXT (dot_class_method) != this_class)
8858 tree class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (dot_class_method)));
8859 t = make_qualified_primary (build_wfl_node (class_name), t, 0);
8864 /* This section of the code deals with constructor. */
8866 /* Craft a body for default constructor. Patch existing constructor
8867 bodies with call to super() and field initialization statements if
8871 fix_constructors (tree mdecl)
8873 tree iii; /* Instance Initializer Invocation */
8874 tree body = DECL_FUNCTION_BODY (mdecl);
8875 tree thisn_assign, compound = NULL_TREE;
8876 tree class_type = DECL_CONTEXT (mdecl);
8878 if (DECL_FIXED_CONSTRUCTOR_P (mdecl))
8880 DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
8884 /* It is an error for the compiler to generate a default
8885 constructor if the superclass doesn't have a constructor that
8886 takes no argument, or the same args for an anonymous class */
8887 if (verify_constructor_super (mdecl))
8889 tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (class_type));
8890 tree save = DECL_NAME (mdecl);
8891 const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
8892 DECL_NAME (mdecl) = DECL_NAME (sclass_decl);
8894 (lookup_cl (TYPE_NAME (class_type)),
8895 "No constructor matching `%s' found in class `%s'",
8896 lang_printable_name (mdecl, 0), n);
8897 DECL_NAME (mdecl) = save;
8900 /* The constructor body must be crafted by hand. It's the
8901 constructor we defined when we realize we didn't have the
8902 CLASSNAME() constructor */
8903 start_artificial_method_body (mdecl);
8905 /* Insert an assignment to the this$<n> hidden field, if
8907 if ((thisn_assign = build_thisn_assign ()))
8908 java_method_add_stmt (mdecl, thisn_assign);
8910 /* We don't generate a super constructor invocation if we're
8911 compiling java.lang.Object. build_super_invocation takes care
8913 java_method_add_stmt (mdecl, build_super_invocation (mdecl));
8916 if ((iii = build_instinit_invocation (class_type)))
8917 java_method_add_stmt (mdecl, iii);
8919 end_artificial_method_body (mdecl);
8921 /* Search for an explicit constructor invocation */
8925 int invokes_this = 0;
8926 tree found_call = NULL_TREE;
8927 tree main_block = BLOCK_EXPR_BODY (body);
8930 switch (TREE_CODE (body))
8933 found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
8934 if (CALL_THIS_CONSTRUCTOR_P (body))
8939 case EXPR_WITH_FILE_LOCATION:
8941 body = TREE_OPERAND (body, 0);
8945 body = BLOCK_EXPR_BODY (body);
8952 /* Generate the assignment to this$<n>, if necessary */
8953 if ((thisn_assign = build_thisn_assign ()))
8954 compound = add_stmt_to_compound (compound, NULL_TREE, thisn_assign);
8956 /* The constructor is missing an invocation of super() */
8958 compound = add_stmt_to_compound (compound, NULL_TREE,
8959 build_super_invocation (mdecl));
8960 /* Explicit super() invocation should take place before the
8961 instance initializer blocks. */
8964 compound = add_stmt_to_compound (compound, NULL_TREE,
8965 TREE_OPERAND (found_call, 0));
8966 TREE_OPERAND (found_call, 0) = empty_stmt_node;
8969 DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
8971 /* Insert the instance initializer block right after. */
8972 if (!invokes_this && (iii = build_instinit_invocation (class_type)))
8973 compound = add_stmt_to_compound (compound, NULL_TREE, iii);
8975 /* Fix the constructor main block if we're adding extra stmts */
8978 compound = add_stmt_to_compound (compound, NULL_TREE,
8979 BLOCK_EXPR_BODY (main_block));
8980 BLOCK_EXPR_BODY (main_block) = compound;
8985 /* Browse constructors in the super class, searching for a constructor
8986 that doesn't take any argument. Return 0 if one is found, 1
8987 otherwise. If the current class is an anonymous inner class, look
8988 for something that has the same signature. */
8991 verify_constructor_super (tree mdecl)
8993 tree class = CLASSTYPE_SUPER (current_class);
8994 int super_inner = PURE_INNER_CLASS_TYPE_P (class);
9000 if (ANONYMOUS_CLASS_P (current_class))
9002 tree mdecl_arg_type;
9003 SKIP_THIS_AND_ARTIFICIAL_PARMS (mdecl_arg_type, mdecl);
9004 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
9005 if (DECL_CONSTRUCTOR_P (sdecl))
9008 tree arg_type = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
9010 arg_type = TREE_CHAIN (arg_type);
9011 for (m_arg_type = mdecl_arg_type;
9012 (arg_type != end_params_node
9013 && m_arg_type != end_params_node);
9014 arg_type = TREE_CHAIN (arg_type),
9015 m_arg_type = TREE_CHAIN (m_arg_type))
9016 if (!valid_method_invocation_conversion_p
9017 (TREE_VALUE (arg_type),
9018 TREE_VALUE (m_arg_type)))
9021 if (arg_type == end_params_node && m_arg_type == end_params_node)
9027 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
9029 tree arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
9031 arg = TREE_CHAIN (arg);
9032 if (DECL_CONSTRUCTOR_P (sdecl) && arg == end_params_node)
9039 /* Generate code for all context remembered for code generation. */
9041 static GTY(()) tree reversed_class_list;
9043 java_expand_classes (void)
9045 int save_error_count = 0;
9046 static struct parser_ctxt *cur_ctxp = NULL;
9048 java_parse_abort_on_error ();
9049 if (!(ctxp = ctxp_for_generation))
9051 java_layout_classes ();
9052 java_parse_abort_on_error ();
9054 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9057 for (current = cur_ctxp->class_list;
9059 current = TREE_CHAIN (current))
9060 gen_indirect_dispatch_tables (TREE_TYPE (current));
9063 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9066 input_filename = ctxp->filename;
9067 lang_init_source (2); /* Error msgs have method prototypes */
9068 java_complete_expand_classes (); /* Complete and expand classes */
9069 java_parse_abort_on_error ();
9071 input_filename = main_input_filename;
9073 /* Find anonymous classes and expand their constructor. This extra pass is
9074 necessary because the constructor itself is only generated when the
9075 method in which it is defined is expanded. */
9076 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9080 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9082 output_class = current_class = TREE_TYPE (current);
9083 if (ANONYMOUS_CLASS_P (current_class))
9086 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9088 if (DECL_CONSTRUCTOR_P (d))
9090 restore_line_number_status (1);
9091 java_complete_expand_method (d);
9092 restore_line_number_status (0);
9093 break; /* There is only one constructor. */
9100 /* Expanding the constructors of anonymous classes generates access
9101 methods. Scan all the methods looking for null DECL_RESULTs --
9102 this will be the case if a method hasn't been expanded. */
9103 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9107 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9110 output_class = current_class = TREE_TYPE (current);
9111 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9113 if (DECL_RESULT (d) == NULL_TREE)
9115 restore_line_number_status (1);
9116 java_complete_expand_method (d);
9117 restore_line_number_status (0);
9123 /* ??? Instead of all this we could iterate around the list of
9124 classes until there were no more un-expanded methods. It would
9125 take a little longer -- one pass over the whole list of methods
9126 -- but it would be simpler. Like this: */
9129 int something_changed;
9133 something_changed = 0;
9134 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9138 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9141 output_class = current_class = TREE_TYPE (current);
9142 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9144 if (DECL_RESULT (d) == NULL_TREE)
9146 something_changed = 1;
9147 restore_line_number_status (1);
9148 java_complete_expand_method (d);
9149 restore_line_number_status (0);
9155 while (something_changed);
9159 /* If we've found error at that stage, don't try to generate
9160 anything, unless we're emitting xrefs or checking the syntax only
9161 (but not using -fsyntax-only for the purpose of generating
9163 if (java_error_count && !flag_emit_xref
9164 && (!flag_syntax_only && !flag_emit_class_files))
9167 /* Now things are stable, go for generation of the class data. */
9169 /* We pessimistically marked all methods and fields external until
9170 we knew what set of classes we were planning to compile. Now mark
9171 those that will be generated locally as not external. */
9172 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9176 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9177 java_mark_class_local (TREE_TYPE (current));
9180 /* Compile the classes. */
9181 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9184 reversed_class_list = NULL;
9188 /* We write out the classes in reverse order. This ensures that
9189 inner classes are written before their containing classes,
9190 which is important for parallel builds. Otherwise, the
9191 class file for the outer class may be found, but the class
9192 file for the inner class may not be present. In that
9193 situation, the compiler cannot fall back to the original
9194 source, having already read the outer class, so we must
9195 prevent that situation. */
9196 for (current = ctxp->class_list;
9198 current = TREE_CHAIN (current))
9200 = tree_cons (NULL_TREE, current, reversed_class_list);
9202 for (current = reversed_class_list;
9204 current = TREE_CHAIN (current))
9206 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
9207 if (flag_emit_class_files)
9208 write_classfile (current_class);
9210 expand_xref (current_class);
9211 else if (! flag_syntax_only)
9212 java_expand_method_bodies (current_class);
9218 java_finish_classes (void)
9220 static struct parser_ctxt *cur_ctxp = NULL;
9221 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9225 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9227 output_class = current_class = TREE_TYPE (current);
9233 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
9234 a tree list node containing RIGHT. Fore coming RIGHTs will be
9235 chained to this hook. LOCATION contains the location of the
9236 separating `.' operator. */
9239 make_qualified_primary (tree primary, tree right, int location)
9243 if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
9244 wfl = build_wfl_wrap (primary, location);
9248 /* If wfl wasn't qualified, we build a first anchor */
9249 if (!EXPR_WFL_QUALIFICATION (wfl))
9250 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (wfl, NULL_TREE);
9253 /* And chain them */
9254 EXPR_WFL_LINECOL (right) = location;
9255 chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
9256 PRIMARY_P (wfl) = 1;
9260 /* Simple merge of two name separated by a `.' */
9263 merge_qualified_name (tree left, tree right)
9266 if (!left && !right)
9275 obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
9276 IDENTIFIER_LENGTH (left));
9277 obstack_1grow (&temporary_obstack, '.');
9278 obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
9279 IDENTIFIER_LENGTH (right));
9280 node = get_identifier (obstack_base (&temporary_obstack));
9281 obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
9282 QUALIFIED_P (node) = 1;
9286 /* Merge the two parts of a qualified name into LEFT. Set the
9287 location information of the resulting node to LOCATION, usually
9288 inherited from the location information of the `.' operator. */
9291 make_qualified_name (tree left, tree right, int location)
9293 #ifdef USE_COMPONENT_REF
9294 tree node = build (COMPONENT_REF, NULL_TREE, left, right);
9295 EXPR_WFL_LINECOL (node) = location;
9298 tree left_id = EXPR_WFL_NODE (left);
9299 tree right_id = EXPR_WFL_NODE (right);
9302 merge = merge_qualified_name (left_id, right_id);
9304 /* Left wasn't qualified and is now qualified */
9305 if (!QUALIFIED_P (left_id))
9307 tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
9308 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
9309 EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
9312 wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
9313 EXPR_WFL_LINECOL (wfl) = location;
9314 chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
9316 EXPR_WFL_NODE (left) = merge;
9321 /* Extract the last identifier component of the qualified in WFL. The
9322 last identifier is removed from the linked list */
9325 cut_identifier_in_qualified (tree wfl)
9328 tree previous = NULL_TREE;
9329 for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
9330 if (!TREE_CHAIN (q))
9333 /* Operating on a non qualified qualified WFL. */
9336 TREE_CHAIN (previous) = NULL_TREE;
9337 return TREE_PURPOSE (q);
9341 /* Resolve the expression name NAME. Return its decl. */
9344 resolve_expression_name (tree id, tree *orig)
9346 tree name = EXPR_WFL_NODE (id);
9349 /* 6.5.5.1: Simple expression names */
9350 if (!PRIMARY_P (id) && !QUALIFIED_P (name))
9352 /* 15.13.1: NAME can appear within the scope of a local variable
9354 if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
9357 /* 15.13.1: NAME can appear within a class declaration */
9360 decl = lookup_field_wrapper (current_class, name);
9363 tree access = NULL_TREE;
9364 int fs = FIELD_STATIC (decl);
9366 /* If we're accessing an outer scope local alias, make
9367 sure we change the name of the field we're going to
9369 if (FIELD_LOCAL_ALIAS_USED (decl))
9370 name = DECL_NAME (decl);
9372 check_deprecation (id, decl);
9374 /* Instance variable (8.3.1.1) can't appear within
9375 static method, static initializer or initializer for
9376 a static variable. */
9377 if (!fs && METHOD_STATIC (current_function_decl))
9379 static_ref_err (id, name, current_class);
9380 return error_mark_node;
9382 /* Instance variables can't appear as an argument of
9383 an explicit constructor invocation */
9384 if (!fs && ctxp->explicit_constructor_p
9385 && !enclosing_context_p (DECL_CONTEXT (decl), current_class))
9388 (id, "Can't reference `%s' before the superclass constructor has been called", IDENTIFIER_POINTER (name));
9389 return error_mark_node;
9392 /* If we're processing an inner class and we're trying
9393 to access a field belonging to an outer class, build
9394 the access to the field */
9395 if (!fs && outer_field_access_p (current_class, decl))
9397 if (CLASS_STATIC (TYPE_NAME (current_class)))
9399 static_ref_err (id, DECL_NAME (decl), current_class);
9400 return error_mark_node;
9402 access = build_outer_field_access (id, decl);
9408 /* Otherwise build what it takes to access the field */
9409 access = build_field_ref ((fs ? NULL_TREE : current_this),
9410 DECL_CONTEXT (decl), name);
9412 access = maybe_build_class_init_for_field (decl, access);
9413 /* We may be asked to save the real field access node */
9416 /* Last check: can we access the field? */
9417 if (not_accessible_p (current_class, decl, NULL_TREE, 0))
9419 not_accessible_field_error (id, decl);
9420 return error_mark_node;
9422 /* And we return what we got */
9425 /* Fall down to error report on undefined variable */
9428 /* 6.5.5.2 Qualified Expression Names */
9433 qualify_ambiguous_name (id);
9434 /* 15.10.1 Field Access Using a Primary and/or Expression Name */
9435 /* 15.10.2: Accessing Superclass Members using super */
9436 return resolve_field_access (id, orig, NULL);
9439 /* We've got an error here */
9440 if (INNER_CLASS_TYPE_P (current_class))
9441 parse_error_context (id,
9442 "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final",
9443 IDENTIFIER_POINTER (name),
9444 IDENTIFIER_POINTER (DECL_NAME
9445 (TYPE_NAME (current_class))));
9447 parse_error_context (id, "Undefined variable `%s'",
9448 IDENTIFIER_POINTER (name));
9450 return error_mark_node;
9454 static_ref_err (tree wfl, tree field_id, tree class_type)
9458 "Can't make a static reference to nonstatic variable `%s' in class `%s'",
9459 IDENTIFIER_POINTER (field_id),
9460 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
9463 /* 15.10.1 Field Access Using a Primary and/or Expression Name.
9464 We return something suitable to generate the field access. We also
9465 return the field decl in FIELD_DECL and its type in FIELD_TYPE. If
9466 recipient's address can be null. */
9469 resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
9473 tree decl, where_found, type_found;
9475 if (resolve_qualified_expression_name (qual_wfl, &decl,
9476 &where_found, &type_found))
9477 return error_mark_node;
9479 /* Resolve the LENGTH field of an array here */
9480 if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node
9481 && type_found && TYPE_ARRAY_P (type_found)
9482 && ! flag_emit_class_files && ! flag_emit_xref)
9484 tree length = build_java_array_length_access (where_found);
9487 /* In case we're dealing with a static array, we need to
9488 initialize its class before the array length can be fetched.
9489 It's also a good time to create a DECL_RTL for the field if
9490 none already exists, otherwise if the field was declared in a
9491 class found in an external file and hasn't been (and won't
9492 be) accessed for its value, none will be created. */
9493 if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
9495 build_static_field_ref (where_found);
9496 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9499 /* We might have been trying to resolve field.method(). In which
9500 case, the resolution is over and decl is the answer */
9501 else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
9503 else if (JDECL_P (decl))
9506 type_found = DECL_CONTEXT (decl);
9507 is_static = FIELD_STATIC (decl);
9508 field_ref = build_field_ref ((is_static && !flag_emit_xref?
9509 NULL_TREE : where_found),
9510 type_found, DECL_NAME (decl));
9511 if (field_ref == error_mark_node)
9512 return error_mark_node;
9514 field_ref = maybe_build_class_init_for_field (decl, field_ref);
9516 /* If we're looking at a static field, we may need to generate a
9517 class initialization for it. This can happen when the access
9518 looks like `field.ref', where `field' is a static field in an
9519 interface we implement. */
9520 if (!flag_emit_class_files
9522 && TREE_CODE (where_found) == VAR_DECL
9523 && FIELD_STATIC (where_found))
9525 build_static_field_ref (where_found);
9526 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9535 *field_type = (QUAL_DECL_TYPE (decl) ?
9536 QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
9540 /* If NODE is an access to f static field, strip out the class
9541 initialization part and return the field decl, otherwise, return
9545 strip_out_static_field_access_decl (tree node)
9547 if (TREE_CODE (node) == COMPOUND_EXPR)
9549 tree op1 = TREE_OPERAND (node, 1);
9550 if (TREE_CODE (op1) == COMPOUND_EXPR)
9552 tree call = TREE_OPERAND (op1, 0);
9553 if (TREE_CODE (call) == CALL_EXPR
9554 && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
9555 && TREE_OPERAND (TREE_OPERAND (call, 0), 0)
9556 == soft_initclass_node)
9557 return TREE_OPERAND (op1, 1);
9559 else if (JDECL_P (op1))
9565 /* 6.5.5.2: Qualified Expression Names */
9568 resolve_qualified_expression_name (tree wfl, tree *found_decl,
9569 tree *where_found, tree *type_found)
9571 int from_type = 0; /* Field search initiated from a type */
9572 int from_super = 0, from_cast = 0, from_qualified_this = 0;
9573 int previous_call_static = 0;
9575 tree decl = NULL_TREE, type = NULL_TREE, q;
9576 /* For certain for of inner class instantiation */
9577 tree saved_current, saved_this;
9578 #define RESTORE_THIS_AND_CURRENT_CLASS \
9579 { current_class = saved_current; current_this = saved_this;}
9581 *type_found = *where_found = NULL_TREE;
9583 for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
9585 tree qual_wfl = QUAL_WFL (q);
9586 tree ret_decl; /* for EH checking */
9587 int location; /* for EH checking */
9589 /* 15.10.1 Field Access Using a Primary */
9590 switch (TREE_CODE (qual_wfl))
9593 case NEW_CLASS_EXPR:
9594 /* If the access to the function call is a non static field,
9595 build the code to access it. */
9596 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9598 decl = maybe_access_field (decl, *where_found,
9599 DECL_CONTEXT (decl));
9600 if (decl == error_mark_node)
9604 /* And code for the function call */
9605 if (complete_function_arguments (qual_wfl))
9608 /* We might have to setup a new current class and a new this
9609 for the search of an inner class, relative to the type of
9610 a expression resolved as `decl'. The current values are
9611 saved and restored shortly after */
9612 saved_current = current_class;
9613 saved_this = current_this;
9615 && (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9616 || from_qualified_this))
9618 /* If we still have `from_qualified_this', we have the form
9619 <T>.this.f() and we need to build <T>.this */
9620 if (from_qualified_this)
9622 decl = build_access_to_thisn (current_class, type, 0);
9623 decl = java_complete_tree (decl);
9624 type = TREE_TYPE (TREE_TYPE (decl));
9626 current_class = type;
9627 current_this = decl;
9628 from_qualified_this = 0;
9631 if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
9632 CALL_USING_SUPER (qual_wfl) = 1;
9633 location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
9634 EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
9635 *where_found = patch_method_invocation (qual_wfl, decl, type,
9637 &is_static, &ret_decl);
9639 if (*where_found == error_mark_node)
9641 RESTORE_THIS_AND_CURRENT_CLASS;
9644 *type_found = type = QUAL_DECL_TYPE (*where_found);
9646 *where_found = force_evaluation_order (*where_found);
9648 /* If we're creating an inner class instance, check for that
9649 an enclosing instance is in scope */
9650 if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9651 && INNER_ENCLOSING_SCOPE_CHECK (type))
9654 (qual_wfl, "No enclosing instance for inner class `%s' is in scope%s",
9655 lang_printable_name (type, 0),
9656 (!current_this ? "" :
9657 "; an explicit one must be provided when creating this inner class"));
9658 RESTORE_THIS_AND_CURRENT_CLASS;
9662 /* In case we had to change then to resolve a inner class
9663 instantiation using a primary qualified by a `new' */
9664 RESTORE_THIS_AND_CURRENT_CLASS;
9668 tree arguments = NULL_TREE;
9669 if (TREE_CODE (qual_wfl) == CALL_EXPR
9670 && TREE_OPERAND (qual_wfl, 1) != NULL_TREE)
9671 arguments = TREE_VALUE (TREE_OPERAND (qual_wfl, 1));
9672 check_thrown_exceptions (location, ret_decl, arguments);
9675 /* If the previous call was static and this one is too,
9676 build a compound expression to hold the two (because in
9677 that case, previous function calls aren't transported as
9678 forcoming function's argument. */
9679 if (previous_call_static && is_static)
9681 decl = build (COMPOUND_EXPR, TREE_TYPE (*where_found),
9682 decl, *where_found);
9683 TREE_SIDE_EFFECTS (decl) = 1;
9687 previous_call_static = is_static;
9688 decl = *where_found;
9693 case NEW_ARRAY_EXPR:
9694 case NEW_ANONYMOUS_ARRAY_EXPR:
9695 *where_found = decl = java_complete_tree (qual_wfl);
9696 if (decl == error_mark_node)
9698 *type_found = type = QUAL_DECL_TYPE (decl);
9702 *where_found = decl = java_complete_tree (qual_wfl);
9703 if (decl == error_mark_node)
9705 *type_found = type = QUAL_DECL_TYPE (decl);
9709 case CONDITIONAL_EXPR:
9712 *where_found = decl = java_complete_tree (qual_wfl);
9713 if (decl == error_mark_node)
9715 *type_found = type = QUAL_DECL_TYPE (decl);
9719 /* If the access to the function call is a non static field,
9720 build the code to access it. */
9721 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9723 decl = maybe_access_field (decl, *where_found, type);
9724 if (decl == error_mark_node)
9727 /* And code for the array reference expression */
9728 decl = java_complete_tree (qual_wfl);
9729 if (decl == error_mark_node)
9731 type = QUAL_DECL_TYPE (decl);
9735 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9737 if ((type = patch_string (decl)))
9739 *where_found = QUAL_RESOLUTION (q) = decl;
9740 *type_found = type = TREE_TYPE (decl);
9744 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9746 *where_found = QUAL_RESOLUTION (q) = decl;
9747 *type_found = type = TREE_TYPE (decl);
9751 /* Fix for -Wall Just go to the next statement. Don't
9756 /* If we fall here, we weren't processing a (static) function call. */
9757 previous_call_static = 0;
9759 /* It can be the keyword THIS */
9760 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9761 && EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
9766 (wfl, "Keyword `this' used outside allowed context");
9769 if (ctxp->explicit_constructor_p
9770 && type == current_class)
9772 parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
9775 /* We have to generate code for intermediate access */
9776 if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type)
9778 *where_found = decl = current_this;
9779 *type_found = type = QUAL_DECL_TYPE (decl);
9781 /* We're trying to access the this from somewhere else. Make sure
9782 it's allowed before doing so. */
9785 if (!enclosing_context_p (type, current_class))
9787 char *p = xstrdup (lang_printable_name (type, 0));
9788 parse_error_context (qual_wfl, "Can't use variable `%s.this': type `%s' isn't an outer type of type `%s'",
9790 lang_printable_name (current_class, 0));
9794 from_qualified_this = 1;
9795 /* If there's nothing else after that, we need to
9796 produce something now, otherwise, the section of the
9797 code that needs to produce <T>.this will generate
9798 what is necessary. */
9799 if (!TREE_CHAIN (q))
9801 decl = build_access_to_thisn (current_class, type, 0);
9802 *where_found = decl = java_complete_tree (decl);
9803 *type_found = type = TREE_TYPE (decl);
9811 /* 15.10.2 Accessing Superclass Members using SUPER */
9812 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9813 && EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
9816 /* Check on the restricted use of SUPER */
9817 if (METHOD_STATIC (current_function_decl)
9818 || current_class == object_type_node)
9821 (wfl, "Keyword `super' used outside allowed context");
9824 /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
9825 node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
9826 CLASSTYPE_SUPER (current_class),
9827 build_this (EXPR_WFL_LINECOL (qual_wfl)));
9828 *where_found = decl = java_complete_tree (node);
9829 if (decl == error_mark_node)
9831 *type_found = type = QUAL_DECL_TYPE (decl);
9832 from_super = from_type = 1;
9836 /* 15.13.1: Can't search for field name in packages, so we
9837 assume a variable/class name was meant. */
9838 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
9841 if ((decl = resolve_package (wfl, &q, &name)))
9844 *where_found = decl;
9846 check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
9848 /* We want to be absolutely sure that the class is laid
9849 out. We're going to search something inside it. */
9850 *type_found = type = TREE_TYPE (decl);
9851 layout_class (type);
9854 /* Fix them all the way down, if any are left. */
9857 list = TREE_CHAIN (q);
9860 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (list)) = 0;
9861 list = TREE_CHAIN (list);
9867 if (from_super || from_cast)
9869 ((from_cast ? qual_wfl : wfl),
9870 "No variable `%s' defined in class `%s'",
9871 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9872 lang_printable_name (type, 0));
9875 (qual_wfl, "Undefined variable or class name: `%s'",
9876 IDENTIFIER_POINTER (name));
9881 /* We have a type name. It's been already resolved when the
9882 expression was qualified. */
9883 else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q))
9885 decl = QUAL_RESOLUTION (q);
9887 /* Sneak preview. If next we see a `new', we're facing a
9888 qualification which resulted in a type being selected
9889 instead of a field. Report the error. */
9891 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR)
9893 parse_error_context (qual_wfl, "Undefined variable `%s'",
9894 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
9898 check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
9900 check_deprecation (qual_wfl, decl);
9902 type = TREE_TYPE (decl);
9905 /* We resolve an expression name */
9908 tree field_decl = NULL_TREE;
9910 /* If there exists an early resolution, use it. That occurs
9911 only once and we know that there are more things to
9912 come. Don't do that when processing something after SUPER
9913 (we need more thing to be put in place below */
9914 if (!from_super && QUAL_RESOLUTION (q))
9916 decl = QUAL_RESOLUTION (q);
9919 if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
9922 *where_found = current_this;
9925 static_ref_err (qual_wfl, DECL_NAME (decl),
9929 if (outer_field_access_p (current_class, decl))
9930 decl = build_outer_field_access (qual_wfl, decl);
9934 *where_found = TREE_TYPE (decl);
9935 if (TREE_CODE (*where_found) == POINTER_TYPE)
9936 *where_found = TREE_TYPE (*where_found);
9941 /* Report and error if we're using a numerical literal as a
9942 qualifier. It can only be an INTEGER_CST. */
9943 else if (TREE_CODE (qual_wfl) == INTEGER_CST)
9946 (wfl, "Can't use type `%s' as a qualifier",
9947 lang_printable_name (TREE_TYPE (qual_wfl), 0));
9951 /* We have to search for a field, knowing the type of its
9952 container. The flag FROM_TYPE indicates that we resolved
9953 the last member of the expression as a type name, which
9954 means that for the resolution of this field, we'll look
9955 for other errors than if it was resolved as a member of
9960 tree field_decl_type; /* For layout */
9962 if (!from_type && !JREFERENCE_TYPE_P (type))
9965 (qual_wfl, "Attempt to reference field `%s' in `%s %s'",
9966 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9967 lang_printable_name (type, 0),
9968 IDENTIFIER_POINTER (DECL_NAME (decl)));
9972 field_decl = lookup_field_wrapper (type,
9973 EXPR_WFL_NODE (qual_wfl));
9975 /* Maybe what we're trying to access to is an inner
9976 class, only if decl is a TYPE_DECL. */
9977 if (!field_decl && TREE_CODE (decl) == TYPE_DECL)
9979 tree ptr, inner_decl;
9981 BUILD_PTR_FROM_NAME (ptr, EXPR_WFL_NODE (qual_wfl));
9982 inner_decl = resolve_class (decl, ptr, NULL_TREE, qual_wfl);
9985 check_inner_class_access (inner_decl, decl, qual_wfl);
9986 type = TREE_TYPE (inner_decl);
9993 if (field_decl == NULL_TREE)
9996 (qual_wfl, "No variable `%s' defined in type `%s'",
9997 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9998 GET_TYPE_NAME (type));
10001 if (field_decl == error_mark_node)
10004 /* Layout the type of field_decl, since we may need
10005 it. Don't do primitive types or loaded classes. The
10006 situation of non primitive arrays may not handled
10007 properly here. FIXME */
10008 if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
10009 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
10011 field_decl_type = TREE_TYPE (field_decl);
10012 if (!JPRIMITIVE_TYPE_P (field_decl_type)
10013 && !CLASS_LOADED_P (field_decl_type)
10014 && !TYPE_ARRAY_P (field_decl_type))
10015 resolve_and_layout (field_decl_type, NULL_TREE);
10017 /* Check on accessibility here */
10018 if (not_accessible_p (current_class, field_decl,
10019 DECL_CONTEXT (field_decl), from_super))
10020 return not_accessible_field_error (qual_wfl,field_decl);
10021 check_deprecation (qual_wfl, field_decl);
10023 /* There are things to check when fields are accessed
10024 from type. There are no restrictions on a static
10025 declaration of the field when it is accessed from an
10027 is_static = FIELD_STATIC (field_decl);
10028 if (!from_super && from_type
10029 && !TYPE_INTERFACE_P (type)
10031 && (current_function_decl
10032 && METHOD_STATIC (current_function_decl)))
10034 static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
10037 from_cast = from_super = 0;
10039 /* It's an access from a type but it isn't static, we
10040 make it relative to `this'. */
10041 if (!is_static && from_type)
10042 decl = current_this;
10044 /* If we need to generate something to get a proper
10045 handle on what this field is accessed from, do it
10049 decl = maybe_access_field (decl, *where_found, *type_found);
10050 if (decl == error_mark_node)
10054 /* We want to keep the location were found it, and the type
10056 *where_found = decl;
10057 *type_found = type;
10059 /* Generate the correct expression for field access from
10061 if (from_qualified_this)
10063 field_decl = build_outer_field_access (qual_wfl, field_decl);
10064 from_qualified_this = 0;
10067 /* This is the decl found and eventually the next one to
10072 type = QUAL_DECL_TYPE (decl);
10074 /* Sneak preview. If decl is qualified by a `new', report
10075 the error here to be accurate on the peculiar construct */
10077 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR
10078 && !JREFERENCE_TYPE_P (type))
10080 parse_error_context (qual_wfl, "Attempt to reference field `new' in a `%s'",
10081 lang_printable_name (type, 0));
10085 /* `q' might have changed due to a after package resolution
10086 re-qualification */
10090 *found_decl = decl;
10094 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
10095 can't be accessed from REFERENCE (a record type). If MEMBER
10096 features a protected access, we then use WHERE which, if non null,
10097 holds the type of MEMBER's access that is checked against
10098 6.6.2.1. This function should be used when decl is a field or a
10102 not_accessible_p (tree reference, tree member, tree where, int from_super)
10104 int access_flag = get_access_flags_from_decl (member);
10106 /* Inner classes are processed by check_inner_class_access */
10107 if (INNER_CLASS_TYPE_P (reference))
10110 /* Access always granted for members declared public */
10111 if (access_flag & ACC_PUBLIC)
10114 /* Check access on protected members */
10115 if (access_flag & ACC_PROTECTED)
10117 /* Access granted if it occurs from within the package
10118 containing the class in which the protected member is
10120 if (class_in_current_package (DECL_CONTEXT (member)))
10123 /* If accessed with the form `super.member', then access is granted */
10127 /* If where is active, access was made through a
10128 qualifier. Access is granted if the type of the qualifier is
10129 or is a sublass of the type the access made from (6.6.2.1.) */
10130 if (where && !inherits_from_p (reference, where))
10133 /* Otherwise, access is granted if occurring from the class where
10134 member is declared or a subclass of it. Find the right
10135 context to perform the check */
10136 if (PURE_INNER_CLASS_TYPE_P (reference))
10138 while (INNER_CLASS_TYPE_P (reference))
10140 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10142 reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10145 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10150 /* Check access on private members. Access is granted only if it
10151 occurs from within the class in which it is declared -- that does
10152 it for innerclasses too. */
10153 if (access_flag & ACC_PRIVATE)
10155 if (reference == DECL_CONTEXT (member))
10157 if (enclosing_context_p (reference, DECL_CONTEXT (member)))
10162 /* Default access is permitted only when occurring from within the
10163 package in which the context (MEMBER) is declared. */
10164 return !class_in_current_package (DECL_CONTEXT (member));
10167 /* Test deprecated decl access. */
10169 check_deprecation (tree wfl, tree decl)
10174 if (! flag_deprecated)
10177 /* We want to look at the element type of arrays here, so we strip
10178 all surrounding array types. */
10179 if (TYPE_ARRAY_P (TREE_TYPE (decl)))
10181 elt = TREE_TYPE (decl);
10182 while (TYPE_ARRAY_P (elt))
10183 elt = TYPE_ARRAY_ELEMENT (elt);
10184 /* We'll end up with a pointer type, so we use TREE_TYPE to go
10186 decl = TYPE_NAME (TREE_TYPE (elt));
10188 file = DECL_SOURCE_FILE (decl);
10190 /* Complain if the field is deprecated and the file it was defined
10191 in isn't compiled at the same time the file which contains its
10193 if (DECL_DEPRECATED (decl)
10194 && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
10197 switch (TREE_CODE (decl))
10199 case FUNCTION_DECL:
10207 parse_warning_context (wfl, "The class `%s' has been deprecated",
10208 IDENTIFIER_POINTER (DECL_NAME (decl)));
10213 /* Don't issue a message if the context as been deprecated as a
10215 if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl))))
10216 parse_warning_context
10217 (wfl, "The %s `%s' in class `%s' has been deprecated",
10218 the, lang_printable_name (decl, 0),
10219 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
10223 /* Returns 1 if class was declared in the current package, 0 otherwise */
10225 static GTY(()) tree cicp_cache;
10227 class_in_current_package (tree class)
10229 int qualified_flag;
10232 if (cicp_cache == class)
10235 qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
10237 /* If the current package is empty and the name of CLASS is
10238 qualified, class isn't in the current package. If there is a
10239 current package and the name of the CLASS is not qualified, class
10240 isn't in the current package */
10241 if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
10244 /* If there is not package and the name of CLASS isn't qualified,
10245 they belong to the same unnamed package */
10246 if (!ctxp->package && !qualified_flag)
10249 /* Compare the left part of the name of CLASS with the package name */
10250 breakdown_qualified (&left, NULL, DECL_NAME (TYPE_NAME (class)));
10251 if (ctxp->package == left)
10253 cicp_cache = class;
10259 /* This function may generate code to access DECL from WHERE. This is
10260 done only if certain conditions meet. */
10263 maybe_access_field (tree decl, tree where, tree type)
10265 if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
10266 && !FIELD_STATIC (decl))
10267 decl = build_field_ref (where ? where : current_this,
10268 (type ? type : DECL_CONTEXT (decl)),
10273 /* Build a method invocation, by patching PATCH. If non NULL
10274 and according to the situation, PRIMARY and WHERE may be
10275 used. IS_STATIC is set to 1 if the invoked function is static. */
10278 patch_method_invocation (tree patch, tree primary, tree where, int from_super,
10279 int *is_static, tree *ret_decl)
10281 tree wfl = TREE_OPERAND (patch, 0);
10282 tree args = TREE_OPERAND (patch, 1);
10283 tree name = EXPR_WFL_NODE (wfl);
10285 int is_static_flag = 0;
10286 int is_super_init = 0;
10287 tree this_arg = NULL_TREE;
10288 int is_array_clone_call = 0;
10290 /* Should be overridden if everything goes well. Otherwise, if
10291 something fails, it should keep this value. It stop the
10292 evaluation of a bogus assignment. See java_complete_tree,
10293 MODIFY_EXPR: for the reasons why we sometimes want to keep on
10294 evaluating an assignment */
10295 TREE_TYPE (patch) = error_mark_node;
10297 /* Since lookup functions are messing with line numbers, save the
10299 java_parser_context_save_global ();
10301 /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
10303 /* Resolution of qualified name, excluding constructors */
10304 if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
10306 tree identifier, identifier_wfl, type, resolved;
10307 /* Extract the last IDENTIFIER of the qualified
10308 expression. This is a wfl and we will use it's location
10309 data during error report. */
10310 identifier_wfl = cut_identifier_in_qualified (wfl);
10311 identifier = EXPR_WFL_NODE (identifier_wfl);
10313 /* Given the context, IDENTIFIER is syntactically qualified
10314 as a MethodName. We need to qualify what's before */
10315 qualify_ambiguous_name (wfl);
10316 resolved = resolve_field_access (wfl, NULL, NULL);
10318 if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved)
10319 && FIELD_FINAL (resolved)
10320 && !inherits_from_p (DECL_CONTEXT (resolved), current_class)
10321 && !flag_emit_class_files && !flag_emit_xref)
10322 resolved = build_class_init (DECL_CONTEXT (resolved), resolved);
10324 if (resolved == error_mark_node)
10325 PATCH_METHOD_RETURN_ERROR ();
10327 type = GET_SKIP_TYPE (resolved);
10328 resolve_and_layout (type, NULL_TREE);
10330 if (JPRIMITIVE_TYPE_P (type))
10332 parse_error_context
10334 "Can't invoke a method on primitive type `%s'",
10335 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10336 PATCH_METHOD_RETURN_ERROR ();
10339 list = lookup_method_invoke (0, identifier_wfl, type, identifier, args);
10340 args = nreverse (args);
10342 /* We're resolving a call from a type */
10343 if (TREE_CODE (resolved) == TYPE_DECL)
10345 if (CLASS_INTERFACE (resolved))
10347 parse_error_context
10349 "Can't make static reference to method `%s' in interface `%s'",
10350 IDENTIFIER_POINTER (identifier),
10351 IDENTIFIER_POINTER (name));
10352 PATCH_METHOD_RETURN_ERROR ();
10354 if (list && !METHOD_STATIC (list))
10356 char *fct_name = xstrdup (lang_printable_name (list, 0));
10357 parse_error_context
10359 "Can't make static reference to method `%s %s' in class `%s'",
10360 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
10361 fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10363 PATCH_METHOD_RETURN_ERROR ();
10367 this_arg = primary = resolved;
10369 if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
10370 is_array_clone_call = 1;
10372 /* IDENTIFIER_WFL will be used to report any problem further */
10373 wfl = identifier_wfl;
10375 /* Resolution of simple names, names generated after a primary: or
10379 tree class_to_search = NULL_TREE;
10380 int lc; /* Looking for Constructor */
10382 /* We search constructor in their target class */
10383 if (CALL_CONSTRUCTOR_P (patch))
10385 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10386 class_to_search = EXPR_WFL_NODE (wfl);
10387 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10388 this_identifier_node)
10389 class_to_search = NULL_TREE;
10390 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10391 super_identifier_node)
10394 if (CLASSTYPE_SUPER (current_class))
10396 DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
10399 parse_error_context (wfl, "Can't invoke super constructor on java.lang.Object");
10400 PATCH_METHOD_RETURN_ERROR ();
10404 /* Class to search is NULL if we're searching the current one */
10405 if (class_to_search)
10407 class_to_search = resolve_and_layout (class_to_search, wfl);
10409 if (!class_to_search)
10411 parse_error_context
10412 (wfl, "Class `%s' not found in type declaration",
10413 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10414 PATCH_METHOD_RETURN_ERROR ();
10417 /* Can't instantiate an abstract class, but we can
10418 invoke it's constructor. It's use within the `new'
10419 context is denied here. */
10420 if (CLASS_ABSTRACT (class_to_search)
10421 && TREE_CODE (patch) == NEW_CLASS_EXPR)
10423 parse_error_context
10424 (wfl, "Class `%s' is an abstract class. It can't be instantiated",
10425 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10426 PATCH_METHOD_RETURN_ERROR ();
10429 class_to_search = TREE_TYPE (class_to_search);
10432 class_to_search = current_class;
10435 /* This is a regular search in the local class, unless an
10436 alternate class is specified. */
10439 if (where != NULL_TREE)
10440 class_to_search = where;
10441 else if (QUALIFIED_P (name))
10442 class_to_search = current_class;
10445 class_to_search = current_class;
10449 if (has_method (class_to_search, name))
10451 if (! INNER_CLASS_TYPE_P (class_to_search))
10453 parse_error_context (wfl,
10454 "No method named `%s' in scope",
10455 IDENTIFIER_POINTER (name));
10456 PATCH_METHOD_RETURN_ERROR ();
10459 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
10465 /* NAME is a simple identifier or comes from a primary. Search
10466 in the class whose declaration contain the method being
10468 resolve_and_layout (class_to_search, NULL_TREE);
10470 list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
10471 /* Don't continue if no method were found, as the next statement
10472 can't be executed then. */
10474 PATCH_METHOD_RETURN_ERROR ();
10476 if (TYPE_ARRAY_P (class_to_search)
10477 && DECL_NAME (list) == get_identifier ("clone"))
10478 is_array_clone_call = 1;
10480 /* Check for static reference if non static methods */
10481 if (check_for_static_method_reference (wfl, patch, list,
10482 class_to_search, primary))
10483 PATCH_METHOD_RETURN_ERROR ();
10485 /* Check for inner classes creation from illegal contexts */
10486 if (lc && (INNER_CLASS_TYPE_P (class_to_search)
10487 && !CLASS_STATIC (TYPE_NAME (class_to_search)))
10488 && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)
10489 && !DECL_INIT_P (current_function_decl))
10491 parse_error_context
10492 (wfl, "No enclosing instance for inner class `%s' is in scope%s",
10493 lang_printable_name (class_to_search, 0),
10494 (!current_this ? "" :
10495 "; an explicit one must be provided when creating this inner class"));
10496 PATCH_METHOD_RETURN_ERROR ();
10499 /* Non static methods are called with the current object extra
10500 argument. If patch a `new TYPE()', the argument is the value
10501 returned by the object allocator. If method is resolved as a
10502 primary, use the primary otherwise use the current THIS. */
10503 args = nreverse (args);
10504 if (TREE_CODE (patch) != NEW_CLASS_EXPR)
10506 this_arg = primary ? primary : current_this;
10508 /* If we're using an access method, things are different.
10509 There are two family of cases:
10511 1) We're not generating bytecodes:
10513 - LIST is non static. It's invocation is transformed from
10514 x(a1,...,an) into this$<n>.x(a1,....an).
10515 - LIST is static. It's invocation is transformed from
10516 x(a1,...,an) into TYPE_OF(this$<n>).x(a1,....an)
10518 2) We're generating bytecodes:
10520 - LIST is non static. It's invocation is transformed from
10521 x(a1,....,an) into access$<n>(this$<n>,a1,...,an).
10522 - LIST is static. It's invocation is transformed from
10523 x(a1,....,an) into TYPE_OF(this$<n>).x(a1,....an).
10525 Of course, this$<n> can be arbitrarily complex, ranging from
10526 this$0 (the immediate outer context) to
10527 access$0(access$0(...(this$0))).
10529 maybe_use_access_method returns a nonzero value if the
10530 this_arg has to be moved into the (then generated) stub
10531 argument list. In the meantime, the selected function
10532 might have be replaced by a generated stub. */
10534 maybe_use_access_method (is_super_init, &list, &this_arg))
10536 args = tree_cons (NULL_TREE, this_arg, args);
10537 this_arg = NULL_TREE; /* So it doesn't get chained twice */
10542 /* Merge point of all resolution schemes. If we have nothing, this
10543 is an error, already signaled */
10545 PATCH_METHOD_RETURN_ERROR ();
10547 /* Check accessibility, position the is_static flag, build and
10549 if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
10550 (primary ? TREE_TYPE (TREE_TYPE (primary)) :
10551 NULL_TREE), from_super)
10552 /* Calls to clone() on array types are permitted as a special-case. */
10553 && !is_array_clone_call)
10555 const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list));
10556 const char *const access =
10557 accessibility_string (get_access_flags_from_decl (list));
10558 const char *const klass =
10559 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list))));
10560 const char *const refklass =
10561 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
10562 const char *const what = (DECL_CONSTRUCTOR_P (list)
10563 ? "constructor" : "method");
10564 /* FIXME: WFL yields the wrong message here but I don't know
10565 what else to use. */
10566 parse_error_context (wfl,
10567 "Can't access %s %s `%s.%s' from `%s'",
10568 access, what, klass, fct_name, refklass);
10569 PATCH_METHOD_RETURN_ERROR ();
10572 /* Deprecation check: check whether the method being invoked or the
10573 instance-being-created's type are deprecated. */
10574 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10575 check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list)));
10576 check_deprecation (wfl, list);
10578 /* If invoking a innerclass constructor, there are hidden parameters
10580 if (TREE_CODE (patch) == NEW_CLASS_EXPR
10581 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10583 /* And make sure we add the accessed local variables to be saved
10584 in field aliases. */
10585 args = build_alias_initializer_parameter_list
10586 (AIPL_FUNCTION_CTOR_INVOCATION, DECL_CONTEXT (list), args, NULL);
10588 /* Secretly pass the current_this/primary as a second argument */
10589 if (primary || current_this)
10592 tree this_type = (current_this ?
10593 TREE_TYPE (TREE_TYPE (current_this)) : NULL_TREE);
10594 /* Method's (list) enclosing context */
10595 tree mec = DECL_CONTEXT (TYPE_NAME (DECL_CONTEXT (list)));
10596 /* If we have a primary, use it. */
10598 extra_arg = primary;
10599 /* The current `this' is an inner class but isn't a direct
10600 enclosing context for the inner class we're trying to
10601 create. Build an access to the proper enclosing context
10603 else if (current_this && PURE_INNER_CLASS_TYPE_P (this_type)
10604 && this_type != TREE_TYPE (mec))
10607 extra_arg = build_access_to_thisn (current_class,
10608 TREE_TYPE (mec), 0);
10609 extra_arg = java_complete_tree (extra_arg);
10611 /* Otherwise, just use the current `this' as an enclosing
10614 extra_arg = current_this;
10615 args = tree_cons (NULL_TREE, extra_arg, args);
10618 args = tree_cons (NULL_TREE, integer_zero_node, args);
10621 /* This handles the situation where a constructor invocation needs
10622 to have an enclosing context passed as a second parameter (the
10623 constructor is one of an inner class). */
10624 if ((is_super_init ||
10625 (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node))
10626 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10628 tree dest = TYPE_NAME (DECL_CONTEXT (list));
10630 build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0);
10631 extra_arg = java_complete_tree (extra_arg);
10632 args = tree_cons (NULL_TREE, extra_arg, args);
10635 is_static_flag = METHOD_STATIC (list);
10636 if (! is_static_flag && this_arg != NULL_TREE)
10637 args = tree_cons (NULL_TREE, this_arg, args);
10639 /* In the context of an explicit constructor invocation, we can't
10640 invoke any method relying on `this'. Exceptions are: we're
10641 invoking a static function, primary exists and is not the current
10642 this, we're creating a new object. */
10643 if (ctxp->explicit_constructor_p
10645 && (!primary || primary == current_this)
10646 && (TREE_CODE (patch) != NEW_CLASS_EXPR))
10648 parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
10649 PATCH_METHOD_RETURN_ERROR ();
10651 java_parser_context_restore_global ();
10653 *is_static = is_static_flag;
10654 /* Sometimes, we want the decl of the selected method. Such as for
10658 patch = patch_invoke (patch, list, args);
10660 /* Now is a good time to insert the call to finit$ */
10661 if (is_super_init && CLASS_HAS_FINIT_P (current_class))
10663 tree finit_parms, finit_call;
10665 /* Prepare to pass hidden parameters to finit$, if any. */
10666 finit_parms = build_alias_initializer_parameter_list
10667 (AIPL_FUNCTION_FINIT_INVOCATION, current_class, NULL_TREE, NULL);
10670 build_method_invocation (build_wfl_node (finit_identifier_node),
10673 /* Generate the code used to initialize fields declared with an
10674 initialization statement and build a compound statement along
10675 with the super constructor invocation. */
10676 CAN_COMPLETE_NORMALLY (patch) = 1;
10677 patch = build (COMPOUND_EXPR, void_type_node, patch,
10678 java_complete_tree (finit_call));
10683 /* Check that we're not trying to do a static reference to a method in
10684 non static method. Return 1 if it's the case, 0 otherwise. */
10687 check_for_static_method_reference (tree wfl, tree node, tree method,
10688 tree where, tree primary)
10690 if (METHOD_STATIC (current_function_decl)
10691 && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
10693 char *fct_name = xstrdup (lang_printable_name (method, 0));
10694 parse_error_context
10695 (wfl, "Can't make static reference to method `%s %s' in class `%s'",
10696 lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
10697 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
10704 /* Fix the invocation of *MDECL if necessary in the case of a
10705 invocation from an inner class. *THIS_ARG might be modified
10706 appropriately and an alternative access to *MDECL might be
10710 maybe_use_access_method (int is_super_init, tree *mdecl, tree *this_arg)
10713 tree md = *mdecl, ta = *this_arg;
10715 int non_static_context = !METHOD_STATIC (md);
10718 || DECL_CONTEXT (md) == current_class
10719 || !PURE_INNER_CLASS_TYPE_P (current_class)
10720 || DECL_FINIT_P (md)
10721 || DECL_INSTINIT_P (md))
10724 /* If we're calling a method found in an enclosing class, generate
10725 what it takes to retrieve the right this. Don't do that if we're
10726 invoking a static method. Note that if MD's type is unrelated to
10727 CURRENT_CLASS, then the current this can be used. */
10729 if (non_static_context && DECL_CONTEXT (md) != object_type_node)
10731 ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
10732 if (inherits_from_p (ctx, DECL_CONTEXT (md)))
10734 ta = build_current_thisn (current_class);
10735 ta = build_wfl_node (ta);
10742 maybe_build_thisn_access_method (type);
10743 if (inherits_from_p (type, DECL_CONTEXT (md)))
10745 ta = build_access_to_thisn (ctx, type, 0);
10748 type = (DECL_CONTEXT (TYPE_NAME (type)) ?
10749 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))) : NULL_TREE);
10752 ta = java_complete_tree (ta);
10755 /* We might have to use an access method to get to MD. We can
10756 break the method access rule as far as we're not generating
10758 if (METHOD_PRIVATE (md) && flag_emit_class_files)
10760 md = build_outer_method_access_method (md);
10767 /* Returning a nonzero value indicates we were doing a non static
10768 method invocation that is now a static invocation. It will have
10769 callee displace `this' to insert it in the regular argument
10771 return (non_static_context && to_return);
10774 /* Patch an invoke expression METHOD and ARGS, based on its invocation
10778 patch_invoke (tree patch, tree method, tree args)
10781 tree original_call, t, ta;
10782 tree check = NULL_TREE;
10784 /* Last step for args: convert build-in types. If we're dealing with
10785 a new TYPE() type call, the first argument to the constructor
10786 isn't found in the incoming argument list, but delivered by
10788 t = TYPE_ARG_TYPES (TREE_TYPE (method));
10789 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10790 t = TREE_CHAIN (t);
10791 for (ta = args; t != end_params_node && ta;
10792 t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
10793 if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
10794 TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
10795 TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
10797 /* Resolve unresolved returned type issues */
10798 t = TREE_TYPE (TREE_TYPE (method));
10799 if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
10800 resolve_and_layout (TREE_TYPE (t), NULL);
10802 if (flag_emit_class_files || flag_emit_xref)
10806 switch (invocation_mode (method, CALL_USING_SUPER (patch)))
10808 case INVOKE_VIRTUAL:
10809 dtable = invoke_build_dtable (0, args);
10810 func = build_invokevirtual (dtable, method);
10813 case INVOKE_NONVIRTUAL:
10814 /* If the object for the method call is null, we throw an
10815 exception. We don't do this if the object is the current
10816 method's `this'. In other cases we just rely on an
10817 optimization pass to eliminate redundant checks. */
10818 if (TREE_VALUE (args) != current_this)
10820 /* We use a save_expr here to make sure we only evaluate
10821 the new `self' expression once. */
10822 tree save_arg = save_expr (TREE_VALUE (args));
10823 TREE_VALUE (args) = save_arg;
10824 check = java_check_reference (save_arg, 1);
10826 /* Fall through. */
10829 case INVOKE_STATIC:
10831 tree signature = build_java_signature (TREE_TYPE (method));
10832 func = build_known_method_ref (method, TREE_TYPE (method),
10833 DECL_CONTEXT (method),
10838 case INVOKE_INTERFACE:
10839 dtable = invoke_build_dtable (1, args);
10840 func = build_invokeinterface (dtable, method);
10847 /* Ensure self_type is initialized, (invokestatic). FIXME */
10848 func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
10851 TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
10852 TREE_OPERAND (patch, 0) = func;
10853 TREE_OPERAND (patch, 1) = args;
10854 patch = check_for_builtin (method, patch);
10855 original_call = patch;
10857 /* We're processing a `new TYPE ()' form. New is called and its
10858 returned value is the first argument to the constructor. We build
10859 a COMPOUND_EXPR and use saved expression so that the overall NEW
10860 expression value is a pointer to a newly created and initialized
10862 if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
10864 tree class = DECL_CONTEXT (method);
10865 tree c1, saved_new, size, new;
10868 if (flag_emit_class_files || flag_emit_xref)
10870 TREE_TYPE (patch) = build_pointer_type (class);
10873 if (!TYPE_SIZE (class))
10874 safe_layout_class (class);
10875 size = size_in_bytes (class);
10877 (class_has_finalize_method (class) ? alloc_object_node
10878 : alloc_no_finalizer_node);
10879 new = build (CALL_EXPR, promote_type (class),
10880 build_address_of (alloc_node),
10881 build_tree_list (NULL_TREE, build_class_ref (class)),
10883 saved_new = save_expr (new);
10884 c1 = build_tree_list (NULL_TREE, saved_new);
10885 TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
10886 TREE_OPERAND (original_call, 1) = c1;
10887 TREE_SET_CODE (original_call, CALL_EXPR);
10888 patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
10891 /* If CHECK is set, then we are building a check to see if the object
10893 if (check != NULL_TREE)
10895 /* We have to call force_evaluation_order now because creating a
10896 COMPOUND_EXPR wraps the arg list in a way that makes it
10897 unrecognizable by force_evaluation_order later. Yuk. */
10898 patch = build (COMPOUND_EXPR, TREE_TYPE (patch), check,
10899 force_evaluation_order (patch));
10900 TREE_SIDE_EFFECTS (patch) = 1;
10903 /* In order to be able to modify PATCH later, we SAVE_EXPR it and
10904 put it as the first expression of a COMPOUND_EXPR. The second
10905 expression being an empty statement to be later patched if
10906 necessary. We remember a TREE_LIST (the PURPOSE is the method,
10907 the VALUE is the compound) in a hashtable and return a
10908 COMPOUND_EXPR built so that the result of the evaluation of the
10909 original PATCH node is returned. */
10910 if (STATIC_CLASS_INIT_OPT_P ()
10911 && current_function_decl && METHOD_STATIC (method))
10914 tree fndecl = current_function_decl;
10915 /* We have to call force_evaluation_order now because creating a
10916 COMPOUND_EXPR wraps the arg list in a way that makes it
10917 unrecognizable by force_evaluation_order later. Yuk. */
10918 tree save = save_expr (force_evaluation_order (patch));
10919 tree type = TREE_TYPE (patch);
10921 patch = build (COMPOUND_EXPR, type, save, empty_stmt_node);
10922 list = tree_cons (method, patch,
10923 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl));
10925 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list;
10927 patch = build (COMPOUND_EXPR, type, patch, save);
10934 invocation_mode (tree method, int super)
10936 int access = get_access_flags_from_decl (method);
10939 return INVOKE_SUPER;
10941 if (access & ACC_STATIC)
10942 return INVOKE_STATIC;
10944 /* We have to look for a constructor before we handle nonvirtual
10945 calls; otherwise the constructor will look nonvirtual. */
10946 if (DECL_CONSTRUCTOR_P (method))
10947 return INVOKE_STATIC;
10949 if (access & ACC_FINAL || access & ACC_PRIVATE)
10950 return INVOKE_NONVIRTUAL;
10952 if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
10953 return INVOKE_NONVIRTUAL;
10955 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
10956 return INVOKE_INTERFACE;
10958 return INVOKE_VIRTUAL;
10961 /* Retrieve a refined list of matching methods. It covers the step
10962 15.11.2 (Compile-Time Step 2) */
10965 lookup_method_invoke (int lc, tree cl, tree class, tree name, tree arg_list)
10967 tree atl = end_params_node; /* Arg Type List */
10968 tree method, signature, list, node;
10969 const char *candidates; /* Used for error report */
10972 /* Fix the arguments */
10973 for (node = arg_list; node; node = TREE_CHAIN (node))
10975 tree current_arg = TREE_TYPE (TREE_VALUE (node));
10976 /* Non primitive type may have to be resolved */
10977 if (!JPRIMITIVE_TYPE_P (current_arg))
10978 resolve_and_layout (current_arg, NULL_TREE);
10980 if (TREE_CODE (current_arg) == RECORD_TYPE)
10981 current_arg = promote_type (current_arg);
10982 atl = tree_cons (NULL_TREE, current_arg, atl);
10985 /* Presto. If we're dealing with an anonymous class and a
10986 constructor call, generate the right constructor now, since we
10987 know the arguments' types. */
10989 if (lc && ANONYMOUS_CLASS_P (class))
10991 tree saved_current_class;
10992 tree mdecl = craft_constructor (TYPE_NAME (class), atl);
10993 saved_current_class = current_class;
10994 current_class = class;
10995 fix_constructors (mdecl);
10996 current_class = saved_current_class;
10999 /* Find all candidates and then refine the list, searching for the
11000 most specific method. */
11001 list = find_applicable_accessible_methods_list (lc, class, name, atl);
11002 list = find_most_specific_methods_list (list);
11003 if (list && !TREE_CHAIN (list))
11004 return TREE_VALUE (list);
11006 /* Issue an error. List candidates if any. Candidates are listed
11007 only if accessible (non accessible methods may end-up here for
11008 the sake of a better error report). */
11013 obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
11014 for (current = list; current; current = TREE_CHAIN (current))
11016 tree cm = TREE_VALUE (current);
11017 char string [4096];
11018 if (!cm || not_accessible_p (class, cm, NULL_TREE, 0))
11021 (string, " `%s' in `%s'%s",
11022 get_printable_method_name (cm),
11023 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
11024 (TREE_CHAIN (current) ? "\n" : ""));
11025 obstack_grow (&temporary_obstack, string, strlen (string));
11027 obstack_1grow (&temporary_obstack, '\0');
11028 candidates = obstack_finish (&temporary_obstack);
11030 /* Issue the error message */
11031 method = make_node (FUNCTION_TYPE);
11032 TYPE_ARG_TYPES (method) = atl;
11033 signature = build_java_argument_signature (method);
11034 dup = xstrdup (lang_printable_name (class, 0));
11035 parse_error_context (cl, "Can't find %s `%s(%s)' in type `%s'%s",
11036 (lc ? "constructor" : "method"),
11037 (lc ? dup : IDENTIFIER_POINTER (name)),
11038 IDENTIFIER_POINTER (signature), dup,
11039 (candidates ? candidates : ""));
11044 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
11045 when we're looking for a constructor. */
11048 find_applicable_accessible_methods_list (int lc, tree class, tree name,
11051 static htab_t searched_classes;
11052 static int search_not_done = 0;
11053 tree list = NULL_TREE, all_list = NULL_TREE;
11055 /* Check the hash table to determine if this class has been searched
11057 if (searched_classes)
11059 if (htab_find (searched_classes, class) != NULL)
11064 searched_classes = htab_create (10, htab_hash_pointer,
11065 htab_eq_pointer, NULL);
11069 *htab_find_slot (searched_classes, class, INSERT) = class;
11071 if (!CLASS_LOADED_P (class) && !CLASS_FROM_SOURCE_P (class))
11073 load_class (class, 1);
11074 safe_layout_class (class);
11077 /* Search interfaces */
11078 if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL
11079 && CLASS_INTERFACE (TYPE_NAME (class)))
11082 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
11083 search_applicable_methods_list (lc, TYPE_METHODS (class),
11084 name, arglist, &list, &all_list);
11085 n = TREE_VEC_LENGTH (basetype_vec);
11086 for (i = 1; i < n; i++)
11088 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11091 rlist = find_applicable_accessible_methods_list (lc, t, name,
11093 list = chainon (rlist, list);
11096 /* Search classes */
11099 search_applicable_methods_list (lc, TYPE_METHODS (class),
11100 name, arglist, &list, &all_list);
11102 /* When looking finit$, class$ or instinit$, we turn LC to 1 so
11103 that we only search in class. Note that we should have found
11104 something at this point. */
11105 if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name))
11112 /* We must search all interfaces of this class */
11115 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
11116 int n = TREE_VEC_LENGTH (basetype_vec), i;
11117 for (i = 1; i < n; i++)
11119 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11120 if (t != object_type_node)
11123 = find_applicable_accessible_methods_list (lc, t,
11125 list = chainon (rlist, list);
11130 /* Search superclass */
11131 if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
11134 class = CLASSTYPE_SUPER (class);
11135 rlist = find_applicable_accessible_methods_list (lc, class,
11137 list = chainon (rlist, list);
11143 /* We're done. Reset the searched classes list and finally search
11144 java.lang.Object if it wasn't searched already. */
11145 if (!search_not_done)
11148 && TYPE_METHODS (object_type_node)
11149 && htab_find (searched_classes, object_type_node) == NULL)
11151 search_applicable_methods_list (lc,
11152 TYPE_METHODS (object_type_node),
11153 name, arglist, &list, &all_list);
11155 htab_delete (searched_classes);
11156 searched_classes = NULL;
11159 /* Either return the list obtained or all selected (but
11160 inaccessible) methods for better error report. */
11161 return (!list ? all_list : list);
11164 /* Effectively search for the appropriate method in method */
11167 search_applicable_methods_list (int lc, tree method, tree name, tree arglist,
11168 tree *list, tree *all_list)
11170 for (; method; method = TREE_CHAIN (method))
11172 /* When dealing with constructor, stop here, otherwise search
11174 if (lc && !DECL_CONSTRUCTOR_P (method))
11176 else if (!lc && (DECL_CONSTRUCTOR_P (method)
11177 || (DECL_NAME (method) != name)))
11180 if (argument_types_convertible (method, arglist))
11182 /* Retain accessible methods only */
11183 if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
11184 method, NULL_TREE, 0))
11185 *list = tree_cons (NULL_TREE, method, *list);
11187 /* Also retain all selected method here */
11188 *all_list = tree_cons (NULL_TREE, method, *list);
11193 /* 15.11.2.2 Choose the Most Specific Method */
11196 find_most_specific_methods_list (tree list)
11199 int abstract, candidates;
11200 tree current, new_list = NULL_TREE;
11201 for (current = list; current; current = TREE_CHAIN (current))
11204 DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
11206 for (method = list; method; method = TREE_CHAIN (method))
11208 tree method_v, current_v;
11209 /* Don't test a method against itself */
11210 if (method == current)
11213 method_v = TREE_VALUE (method);
11214 current_v = TREE_VALUE (current);
11216 /* Compare arguments and location where methods where declared */
11217 if (argument_types_convertible (method_v, current_v))
11219 if (valid_method_invocation_conversion_p
11220 (DECL_CONTEXT (method_v), DECL_CONTEXT (current_v))
11221 || (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v))
11222 && enclosing_context_p (DECL_CONTEXT (method_v),
11223 DECL_CONTEXT (current_v))))
11225 int v = (DECL_SPECIFIC_COUNT (current_v) +=
11226 (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v)) ? 2 : 1));
11227 max = (v > max ? v : max);
11233 /* Review the list and select the maximally specific methods */
11234 for (current = list, abstract = -1, candidates = -1;
11235 current; current = TREE_CHAIN (current))
11236 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11238 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11239 abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0);
11243 /* If we have several and they're all abstract, just pick the
11245 if (candidates > 0 && candidates == abstract)
11247 /* FIXME: merge the throws clauses. There is no convenient way
11248 to do this in gcj right now, since ideally we'd like to
11249 introduce a new METHOD_DECL here, but that is really not
11251 new_list = nreverse (new_list);
11252 TREE_CHAIN (new_list) = NULL_TREE;
11256 /* We have several (we couldn't find a most specific), all but one
11257 are abstract, we pick the only non abstract one. */
11258 if (candidates > 0 && (candidates == abstract+1))
11260 for (current = new_list; current; current = TREE_CHAIN (current))
11261 if (!METHOD_ABSTRACT (TREE_VALUE (current)))
11263 TREE_CHAIN (current) = NULL_TREE;
11264 new_list = current;
11268 /* If we can't find one, lower expectations and try to gather multiple
11269 maximally specific methods */
11270 while (!new_list && max)
11274 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11275 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11282 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
11283 converted by method invocation conversion (5.3) to the type of the
11284 corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
11285 to change less often than M1. */
11287 static GTY(()) tree m2_arg_value;
11288 static GTY(()) tree m2_arg_cache;
11291 argument_types_convertible (tree m1, tree m2_or_arglist)
11293 tree m1_arg, m2_arg;
11295 SKIP_THIS_AND_ARTIFICIAL_PARMS (m1_arg, m1)
11297 if (m2_arg_value == m2_or_arglist)
11298 m2_arg = m2_arg_cache;
11301 /* M2_OR_ARGLIST can be a function DECL or a raw list of
11303 if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
11305 m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
11306 if (!METHOD_STATIC (m2_or_arglist))
11307 m2_arg = TREE_CHAIN (m2_arg);
11310 m2_arg = m2_or_arglist;
11312 m2_arg_value = m2_or_arglist;
11313 m2_arg_cache = m2_arg;
11316 while (m1_arg != end_params_node && m2_arg != end_params_node)
11318 resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
11319 if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
11320 TREE_VALUE (m2_arg)))
11322 m1_arg = TREE_CHAIN (m1_arg);
11323 m2_arg = TREE_CHAIN (m2_arg);
11325 return m1_arg == end_params_node && m2_arg == end_params_node;
11328 /* Qualification routines */
11330 /* Given a name x.y.z, look up x locally. If it's found, save the
11331 decl. If it's not found, mark the name as RESOLVE_PACKAGE_NAME_P,
11332 so that we later try and load the appropriate classes. */
11334 qualify_ambiguous_name (tree id)
11338 /* We inspect the first item of the qualification list. As a sanity
11339 check, make sure that it is an identfier node. */
11340 tree qual = EXPR_WFL_QUALIFICATION (id);
11341 tree qual_wfl = QUAL_WFL (qual);
11343 if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
11346 name = EXPR_WFL_NODE (qual_wfl);
11348 /* If we don't have an identifier, or we have a 'this' or 'super',
11349 then field access processing is all we need : there is nothing
11351 if (!name || TREE_CODE (name) != IDENTIFIER_NODE ||
11352 name == this_identifier_node ||
11353 name == super_identifier_node)
11356 /* If name appears within the scope of a local variable declaration
11357 or parameter declaration, or is a field within an enclosing
11358 class, then it is an expression name. Save the decl and let
11359 resolve_field_access do it's work. */
11360 if ((decl = IDENTIFIER_LOCAL_VALUE (name)) ||
11361 (decl = lookup_field_wrapper (current_class, name)))
11363 QUAL_RESOLUTION (qual) = decl;
11367 /* If name is a known class name (either declared or imported), mark
11368 us as a type name. */
11369 if ((decl = resolve_and_layout (name, NULL_TREE)))
11371 RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
11372 QUAL_RESOLUTION (qual) = decl;
11375 /* Check here that NAME isn't declared by more than one
11376 type-import-on-demand declaration of the compilation unit
11377 containing NAME. FIXME */
11379 /* We couldn't find a declaration for the name. Assume for now that
11380 we have a qualified class name that needs to be loaded from an
11381 external class file. */
11383 RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
11385 /* Propagate the qualification across other components of the
11387 for (qual = TREE_CHAIN (qual); qual;
11388 qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
11390 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11391 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
11394 /* Store the global qualification for the ambiguous part of ID back
11396 if (RESOLVE_TYPE_NAME_P (qual_wfl))
11397 RESOLVE_TYPE_NAME_P (id) = 1;
11398 else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11399 RESOLVE_PACKAGE_NAME_P (id) = 1;
11403 breakdown_qualified (tree *left, tree *right, tree source)
11406 int l = IDENTIFIER_LENGTH (source);
11408 base = alloca (l + 1);
11409 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
11411 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
11413 while (*p != '.' && p != base)
11416 /* We didn't find a '.'. Return an error. */
11422 *right = get_identifier (p+1);
11423 *left = get_identifier (base);
11428 /* Return TRUE if two classes are from the same package. */
11431 in_same_package (tree name1, tree name2)
11437 if (TREE_CODE (name1) == TYPE_DECL)
11438 name1 = DECL_NAME (name1);
11439 if (TREE_CODE (name2) == TYPE_DECL)
11440 name2 = DECL_NAME (name2);
11442 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
11443 /* One in empty package. */
11446 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
11447 /* Both in empty package. */
11450 breakdown_qualified (&pkg1, &tmp, name1);
11451 breakdown_qualified (&pkg2, &tmp, name2);
11453 return (pkg1 == pkg2);
11456 /* Patch tree nodes in a function body. When a BLOCK is found, push
11457 local variable decls if present.
11458 Same as java_complete_lhs, but does resolve static finals to values. */
11461 java_complete_tree (tree node)
11463 node = java_complete_lhs (node);
11464 if (JDECL_P (node) && CLASS_FINAL_VARIABLE_P (node)
11465 && DECL_INITIAL (node) != NULL_TREE
11466 && !flag_emit_xref)
11468 tree value = fold_constant_for_init (node, node);
11469 if (value != NULL_TREE)
11476 java_stabilize_reference (tree node)
11478 if (TREE_CODE (node) == COMPOUND_EXPR)
11480 tree op0 = TREE_OPERAND (node, 0);
11481 tree op1 = TREE_OPERAND (node, 1);
11482 TREE_OPERAND (node, 0) = save_expr (op0);
11483 TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
11486 return stabilize_reference (node);
11489 /* Patch tree nodes in a function body. When a BLOCK is found, push
11490 local variable decls if present.
11491 Same as java_complete_tree, but does not resolve static finals to values. */
11494 java_complete_lhs (tree node)
11496 tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
11499 /* CONVERT_EXPR always has its type set, even though it needs to be
11501 if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
11504 /* The switch block implements cases processing container nodes
11505 first. Contained nodes are always written back. Leaves come
11506 next and return a value. */
11507 switch (TREE_CODE (node))
11511 /* 1- Block section.
11512 Set the local values on decl names so we can identify them
11513 faster when they're referenced. At that stage, identifiers
11514 are legal so we don't check for declaration errors. */
11515 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11517 DECL_CONTEXT (cn) = current_function_decl;
11518 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
11520 if (BLOCK_EXPR_BODY (node) == NULL_TREE)
11521 CAN_COMPLETE_NORMALLY (node) = 1;
11524 tree stmt = BLOCK_EXPR_BODY (node);
11526 int error_seen = 0;
11527 if (TREE_CODE (stmt) == COMPOUND_EXPR)
11529 /* Re-order from (((A; B); C); ...; Z) to
11530 (A; (B; (C ; (...; Z)))).
11531 This makes it easier to scan the statements left-to-right
11532 without using recursion (which might overflow the stack
11533 if the block has many statements. */
11536 tree left = TREE_OPERAND (stmt, 0);
11537 if (TREE_CODE (left) != COMPOUND_EXPR)
11539 TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
11540 TREE_OPERAND (left, 1) = stmt;
11543 BLOCK_EXPR_BODY (node) = stmt;
11546 /* Now do the actual complete, without deep recursion for
11548 ptr = &BLOCK_EXPR_BODY (node);
11549 while (TREE_CODE (*ptr) == COMPOUND_EXPR
11550 && TREE_OPERAND (*ptr, 1) != empty_stmt_node)
11552 tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
11553 tree *next = &TREE_OPERAND (*ptr, 1);
11554 TREE_OPERAND (*ptr, 0) = cur;
11555 if (cur == empty_stmt_node)
11557 /* Optimization; makes it easier to detect empty bodies.
11558 Most useful for <clinit> with all-constant initializer. */
11562 if (TREE_CODE (cur) == ERROR_MARK)
11564 else if (! CAN_COMPLETE_NORMALLY (cur))
11569 if (TREE_CODE (wfl_op2) == BLOCK)
11570 wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
11571 else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
11572 wfl_op2 = TREE_OPERAND (wfl_op2, 0);
11576 if (TREE_CODE (wfl_op2) != CASE_EXPR
11577 && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
11578 unreachable_stmt_error (*ptr);
11580 if (TREE_TYPE (*ptr) == NULL_TREE)
11581 TREE_TYPE (*ptr) = void_type_node;
11584 *ptr = java_complete_tree (*ptr);
11586 if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
11587 return error_mark_node;
11588 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
11590 /* Turn local bindings to null */
11591 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11592 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
11594 TREE_TYPE (node) = void_type_node;
11597 /* 2- They are expressions but ultimately deal with statements */
11600 wfl_op1 = TREE_OPERAND (node, 0);
11601 COMPLETE_CHECK_OP_0 (node);
11602 /* 14.19 A throw statement cannot complete normally. */
11603 CAN_COMPLETE_NORMALLY (node) = 0;
11604 return patch_throw_statement (node, wfl_op1);
11606 case SYNCHRONIZED_EXPR:
11607 wfl_op1 = TREE_OPERAND (node, 0);
11608 return patch_synchronized_statement (node, wfl_op1);
11611 return patch_try_statement (node);
11613 case TRY_FINALLY_EXPR:
11614 COMPLETE_CHECK_OP_0 (node);
11615 COMPLETE_CHECK_OP_1 (node);
11616 /* Reduce try/finally nodes with an empty try block. */
11617 if (TREE_OPERAND (node, 0) == empty_stmt_node
11618 || BLOCK_EMPTY_P (TREE_OPERAND (node, 0)))
11619 return TREE_OPERAND (node, 1);
11620 /* Likewise for an empty finally block. */
11621 if (TREE_OPERAND (node, 1) == empty_stmt_node
11622 || BLOCK_EMPTY_P (TREE_OPERAND (node, 1)))
11623 return TREE_OPERAND (node, 0);
11624 CAN_COMPLETE_NORMALLY (node)
11625 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11626 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11627 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
11630 case LABELED_BLOCK_EXPR:
11631 PUSH_LABELED_BLOCK (node);
11632 if (LABELED_BLOCK_BODY (node))
11633 COMPLETE_CHECK_OP_1 (node);
11634 TREE_TYPE (node) = void_type_node;
11635 POP_LABELED_BLOCK ();
11637 if (LABELED_BLOCK_BODY (node) == empty_stmt_node)
11639 LABELED_BLOCK_BODY (node) = NULL_TREE;
11640 CAN_COMPLETE_NORMALLY (node) = 1;
11642 else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
11643 CAN_COMPLETE_NORMALLY (node) = 1;
11646 case EXIT_BLOCK_EXPR:
11647 /* We don't complete operand 1, because it's the return value of
11648 the EXIT_BLOCK_EXPR which doesn't exist it Java */
11649 return patch_bc_statement (node);
11652 cn = java_complete_tree (TREE_OPERAND (node, 0));
11653 if (cn == error_mark_node)
11656 /* First, the case expression must be constant. Values of final
11657 fields are accepted. */
11659 if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
11660 && JDECL_P (TREE_OPERAND (cn, 1))
11661 && FIELD_FINAL (TREE_OPERAND (cn, 1))
11662 && DECL_INITIAL (TREE_OPERAND (cn, 1)))
11664 cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
11665 TREE_OPERAND (cn, 1));
11667 /* Accept final locals too. */
11668 else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn)
11669 && DECL_INITIAL (cn))
11670 cn = fold_constant_for_init (DECL_INITIAL (cn), cn);
11672 if (!TREE_CONSTANT (cn) && !flag_emit_xref)
11674 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11675 parse_error_context (node, "Constant expression required");
11676 return error_mark_node;
11679 nn = ctxp->current_loop;
11681 /* It must be assignable to the type of the switch expression. */
11682 if (!try_builtin_assignconv (NULL_TREE,
11683 TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
11685 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11686 parse_error_context
11688 "Incompatible type for case. Can't convert `%s' to `int'",
11689 lang_printable_name (TREE_TYPE (cn), 0));
11690 return error_mark_node;
11693 cn = fold (convert (int_type_node, cn));
11694 TREE_CONSTANT_OVERFLOW (cn) = 0;
11695 CAN_COMPLETE_NORMALLY (cn) = 1;
11697 /* Save the label on a list so that we can later check for
11699 case_label_list = tree_cons (node, cn, case_label_list);
11701 /* Multiple instance of a case label bearing the same value is
11702 checked later. The case expression is all right so far. */
11703 if (TREE_CODE (cn) == VAR_DECL)
11704 cn = DECL_INITIAL (cn);
11705 TREE_OPERAND (node, 0) = cn;
11706 TREE_TYPE (node) = void_type_node;
11707 CAN_COMPLETE_NORMALLY (node) = 1;
11708 TREE_SIDE_EFFECTS (node) = 1;
11712 nn = ctxp->current_loop;
11713 /* Only one default label is allowed per switch statement */
11714 if (SWITCH_HAS_DEFAULT (nn))
11716 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11717 parse_error_context (wfl_operator,
11718 "Duplicate case label: `default'");
11719 return error_mark_node;
11722 SWITCH_HAS_DEFAULT (nn) = 1;
11723 TREE_TYPE (node) = void_type_node;
11724 TREE_SIDE_EFFECTS (node) = 1;
11725 CAN_COMPLETE_NORMALLY (node) = 1;
11731 /* Check whether the loop was enclosed in a labeled
11732 statement. If not, create one, insert the loop in it and
11734 nn = patch_loop_statement (node);
11736 /* Anyways, walk the body of the loop */
11737 if (TREE_CODE (node) == LOOP_EXPR)
11738 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11739 /* Switch statement: walk the switch expression and the cases */
11741 node = patch_switch_statement (node);
11743 if (node == error_mark_node || TREE_OPERAND (node, 0) == error_mark_node)
11744 nn = error_mark_node;
11747 TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
11748 /* If we returned something different, that's because we
11749 inserted a label. Pop the label too. */
11752 if (CAN_COMPLETE_NORMALLY (node))
11753 CAN_COMPLETE_NORMALLY (nn) = 1;
11754 POP_LABELED_BLOCK ();
11761 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11762 return patch_exit_expr (node);
11766 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11767 if (TREE_OPERAND (node, 0) == error_mark_node)
11768 return error_mark_node;
11769 /* then-else branches */
11770 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11771 if (TREE_OPERAND (node, 1) == error_mark_node)
11772 return error_mark_node;
11773 TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
11774 if (TREE_OPERAND (node, 2) == error_mark_node)
11775 return error_mark_node;
11776 return patch_if_else_statement (node);
11779 case CONDITIONAL_EXPR:
11781 wfl_op1 = TREE_OPERAND (node, 0);
11782 COMPLETE_CHECK_OP_0 (node);
11783 wfl_op2 = TREE_OPERAND (node, 1);
11784 COMPLETE_CHECK_OP_1 (node);
11785 wfl_op3 = TREE_OPERAND (node, 2);
11786 COMPLETE_CHECK_OP_2 (node);
11787 return patch_conditional_expr (node, wfl_op1, wfl_op2);
11789 /* 3- Expression section */
11790 case COMPOUND_EXPR:
11791 wfl_op2 = TREE_OPERAND (node, 1);
11792 TREE_OPERAND (node, 0) = nn =
11793 java_complete_tree (TREE_OPERAND (node, 0));
11794 if (wfl_op2 == empty_stmt_node)
11795 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
11798 if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
11800 /* An unreachable condition in a do-while statement
11801 is *not* (technically) an unreachable statement. */
11803 if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
11804 nn = EXPR_WFL_NODE (nn);
11805 /* NN can be NULL_TREE exactly when UPDATE is, in
11806 finish_for_loop. */
11807 if (nn != NULL_TREE && TREE_CODE (nn) != EXIT_EXPR)
11809 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
11810 if (SUPPRESS_UNREACHABLE_ERROR (nn))
11812 /* Perhaps this warning should have an
11813 associated flag. The code being compiled is
11814 pedantically correct, but useless. */
11815 parse_warning_context (wfl_operator,
11816 "Unreachable statement");
11819 parse_error_context (wfl_operator,
11820 "Unreachable statement");
11823 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11824 if (TREE_OPERAND (node, 1) == error_mark_node)
11825 return error_mark_node;
11826 /* Even though we might allow the case where the first
11827 operand doesn't return normally, we still should compute
11828 CAN_COMPLETE_NORMALLY correctly. */
11829 CAN_COMPLETE_NORMALLY (node)
11830 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11831 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11833 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
11837 /* CAN_COMPLETE_NORMALLY (node) = 0; */
11838 return patch_return (node);
11840 case EXPR_WITH_FILE_LOCATION:
11841 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
11842 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
11845 node = resolve_expression_name (node, NULL);
11846 if (node == error_mark_node)
11848 /* Keep line number information somewhere were it doesn't
11849 disrupt the completion process. */
11850 if (flag_emit_xref && TREE_CODE (node) != CALL_EXPR)
11852 EXPR_WFL_NODE (wfl) = TREE_OPERAND (node, 1);
11853 TREE_OPERAND (node, 1) = wfl;
11855 CAN_COMPLETE_NORMALLY (node) = 1;
11860 int save_lineno = input_line;
11861 input_line = EXPR_WFL_LINENO (node);
11862 body = java_complete_tree (EXPR_WFL_NODE (node));
11863 input_line = save_lineno;
11864 EXPR_WFL_NODE (node) = body;
11865 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
11866 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
11867 if (body == empty_stmt_node || TREE_CONSTANT (body))
11869 /* Makes it easier to constant fold, detect empty bodies. */
11872 if (body == error_mark_node)
11874 /* Its important for the evaluation of assignment that
11875 this mark on the TREE_TYPE is propagated. */
11876 TREE_TYPE (node) = error_mark_node;
11877 return error_mark_node;
11880 TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
11885 case NEW_ARRAY_EXPR:
11886 /* Patch all the dimensions */
11888 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
11890 int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
11891 tree dim = convert (int_type_node,
11892 java_complete_tree (TREE_VALUE (cn)));
11893 if (dim == error_mark_node)
11900 TREE_VALUE (cn) = dim;
11901 /* Setup the location of the current dimension, for
11902 later error report. */
11903 TREE_PURPOSE (cn) =
11904 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
11905 EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
11908 /* They complete the array creation expression, if no errors
11910 CAN_COMPLETE_NORMALLY (node) = 1;
11911 return (flag ? error_mark_node
11912 : force_evaluation_order (patch_newarray (node)));
11914 case NEW_ANONYMOUS_ARRAY_EXPR:
11915 /* Create the array type if necessary. */
11916 if (ANONYMOUS_ARRAY_DIMS_SIG (node))
11918 tree type = ANONYMOUS_ARRAY_BASE_TYPE (node);
11919 if (!(type = resolve_type_during_patch (type)))
11920 return error_mark_node;
11921 type = build_array_from_name (type, NULL_TREE,
11922 ANONYMOUS_ARRAY_DIMS_SIG (node), NULL);
11923 ANONYMOUS_ARRAY_BASE_TYPE (node) = build_pointer_type (type);
11925 node = patch_new_array_init (ANONYMOUS_ARRAY_BASE_TYPE (node),
11926 ANONYMOUS_ARRAY_INITIALIZER (node));
11927 if (node == error_mark_node)
11928 return error_mark_node;
11929 CAN_COMPLETE_NORMALLY (node) = 1;
11932 case NEW_CLASS_EXPR:
11934 /* Complete function's argument(s) first */
11935 if (complete_function_arguments (node))
11936 return error_mark_node;
11939 tree decl, wfl = TREE_OPERAND (node, 0);
11940 int in_this = CALL_THIS_CONSTRUCTOR_P (node);
11941 int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
11942 super_identifier_node);
11944 int location = EXPR_WFL_LINECOL (node);
11946 node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
11947 from_super, 0, &decl);
11948 if (node == error_mark_node)
11949 return error_mark_node;
11951 if (TREE_CODE (node) == CALL_EXPR
11952 && TREE_OPERAND (node, 1) != NULL_TREE)
11953 arguments = TREE_VALUE (TREE_OPERAND (node, 1));
11955 arguments = NULL_TREE;
11956 check_thrown_exceptions (location, decl, arguments);
11957 /* If we call this(...), register signature and positions */
11959 DECL_CONSTRUCTOR_CALLS (current_function_decl) =
11960 tree_cons (wfl, decl,
11961 DECL_CONSTRUCTOR_CALLS (current_function_decl));
11962 CAN_COMPLETE_NORMALLY (node) = 1;
11963 return force_evaluation_order (node);
11967 /* Save potential wfls */
11968 wfl_op1 = TREE_OPERAND (node, 0);
11969 TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
11971 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
11972 && TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
11973 && DECL_INITIAL (nn) != NULL_TREE)
11977 value = fold_constant_for_init (nn, nn);
11979 /* When we have a primitype type, or a string and we're not
11980 emitting a class file, we actually don't want to generate
11981 anything for the assignment. */
11982 if (value != NULL_TREE &&
11983 (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) ||
11984 (TREE_TYPE (value) == string_ptr_type_node &&
11985 ! flag_emit_class_files)))
11987 /* Prepare node for patch_assignment */
11988 TREE_OPERAND (node, 1) = value;
11989 /* Call patch assignment to verify the assignment */
11990 if (patch_assignment (node, wfl_op1) == error_mark_node)
11991 return error_mark_node;
11992 /* Set DECL_INITIAL properly (a conversion might have
11993 been decided by patch_assignment) and return the
11994 empty statement. */
11997 tree patched = patch_string (TREE_OPERAND (node, 1));
11999 DECL_INITIAL (nn) = patched;
12001 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
12002 DECL_FIELD_FINAL_IUD (nn) = 1;
12003 return empty_stmt_node;
12006 if (! flag_emit_class_files)
12007 DECL_INITIAL (nn) = NULL_TREE;
12009 wfl_op2 = TREE_OPERAND (node, 1);
12011 if (TREE_OPERAND (node, 0) == error_mark_node)
12012 return error_mark_node;
12014 flag = COMPOUND_ASSIGN_P (wfl_op2);
12017 /* This might break when accessing outer field from inner
12018 class. TESTME, FIXME */
12019 tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
12021 /* Hand stabilize the lhs on both places */
12022 TREE_OPERAND (node, 0) = lvalue;
12023 TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
12024 (flag_emit_class_files ? lvalue : save_expr (lvalue));
12026 /* 15.25.2.a: Left hand is not an array access. FIXME */
12027 /* Now complete the RHS. We write it back later on. */
12028 nn = java_complete_tree (TREE_OPERAND (node, 1));
12030 if ((cn = patch_string (nn)))
12033 /* The last part of the rewrite for E1 op= E2 is to have
12034 E1 = (T)(E1 op E2), with T being the type of E1. */
12035 nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
12036 TREE_TYPE (lvalue), nn));
12038 /* If the assignment is compound and has reference type,
12039 then ensure the LHS has type String and nothing else. */
12040 if (JREFERENCE_TYPE_P (TREE_TYPE (lvalue))
12041 && ! JSTRING_TYPE_P (TREE_TYPE (lvalue)))
12042 parse_error_context (wfl_op2,
12043 "Incompatible type for `+='. Can't convert `%s' to `java.lang.String'",
12044 lang_printable_name (TREE_TYPE (lvalue), 0));
12046 /* 15.25.2.b: Left hand is an array access. FIXME */
12049 /* If we're about to patch a NEW_ARRAY_INIT, we call a special
12050 function to complete this RHS. Note that a NEW_ARRAY_INIT
12051 might have been already fully expanded if created as a result
12052 of processing an anonymous array initializer. We avoid doing
12053 the operation twice by testing whether the node already bears
12055 else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT && !TREE_TYPE (wfl_op2))
12056 nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
12057 TREE_OPERAND (node, 1));
12058 /* Otherwise we simply complete the RHS */
12060 nn = java_complete_tree (TREE_OPERAND (node, 1));
12062 if (nn == error_mark_node)
12063 return error_mark_node;
12065 /* Write back the RHS as we evaluated it. */
12066 TREE_OPERAND (node, 1) = nn;
12068 /* In case we're handling = with a String as a RHS, we need to
12069 produce a String out of the RHS (it might still be a
12070 STRING_CST or a StringBuffer at this stage */
12071 if ((nn = patch_string (TREE_OPERAND (node, 1))))
12072 TREE_OPERAND (node, 1) = nn;
12074 if ((nn = outer_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
12075 TREE_OPERAND (node, 1))))
12077 /* We return error_mark_node if outer_field_access_fix
12078 detects we write into a final. */
12079 if (nn == error_mark_node)
12080 return error_mark_node;
12085 node = patch_assignment (node, wfl_op1);
12086 if (node == error_mark_node)
12087 return error_mark_node;
12088 /* Reorganize the tree if necessary. */
12089 if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
12090 || JSTRING_P (TREE_TYPE (node))))
12091 node = java_refold (node);
12094 /* Seek to set DECL_INITIAL to a proper value, since it might have
12095 undergone a conversion in patch_assignment. We do that only when
12096 it's necessary to have DECL_INITIAL properly set. */
12097 nn = TREE_OPERAND (node, 0);
12098 if (TREE_CODE (nn) == VAR_DECL
12099 && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn))
12100 && FIELD_STATIC (nn) && FIELD_FINAL (nn)
12101 && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn))
12102 || TREE_TYPE (nn) == string_ptr_type_node))
12103 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
12105 CAN_COMPLETE_NORMALLY (node) = 1;
12117 case TRUNC_MOD_EXPR:
12118 case TRUNC_DIV_EXPR:
12120 case TRUTH_ANDIF_EXPR:
12121 case TRUTH_ORIF_EXPR:
12128 /* Operands 0 and 1 are WFL in certain cases only. patch_binop
12129 knows how to handle those cases. */
12130 wfl_op1 = TREE_OPERAND (node, 0);
12131 wfl_op2 = TREE_OPERAND (node, 1);
12133 CAN_COMPLETE_NORMALLY (node) = 1;
12134 /* Don't complete string nodes if dealing with the PLUS operand. */
12135 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
12137 nn = java_complete_tree (wfl_op1);
12138 if (nn == error_mark_node)
12139 return error_mark_node;
12141 TREE_OPERAND (node, 0) = nn;
12143 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
12145 nn = java_complete_tree (wfl_op2);
12146 if (nn == error_mark_node)
12147 return error_mark_node;
12149 TREE_OPERAND (node, 1) = nn;
12151 return patch_binop (node, wfl_op1, wfl_op2);
12153 case INSTANCEOF_EXPR:
12154 wfl_op1 = TREE_OPERAND (node, 0);
12155 COMPLETE_CHECK_OP_0 (node);
12156 if (flag_emit_xref)
12158 TREE_TYPE (node) = boolean_type_node;
12161 return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
12163 case UNARY_PLUS_EXPR:
12165 case TRUTH_NOT_EXPR:
12167 case PREDECREMENT_EXPR:
12168 case PREINCREMENT_EXPR:
12169 case POSTDECREMENT_EXPR:
12170 case POSTINCREMENT_EXPR:
12172 /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
12173 how to handle those cases. */
12174 wfl_op1 = TREE_OPERAND (node, 0);
12175 CAN_COMPLETE_NORMALLY (node) = 1;
12176 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12177 if (TREE_OPERAND (node, 0) == error_mark_node)
12178 return error_mark_node;
12179 node = patch_unaryop (node, wfl_op1);
12180 CAN_COMPLETE_NORMALLY (node) = 1;
12184 /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
12185 how to handle those cases. */
12186 wfl_op1 = TREE_OPERAND (node, 0);
12187 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12188 if (TREE_OPERAND (node, 0) == error_mark_node)
12189 return error_mark_node;
12190 if (!flag_emit_class_files && !flag_emit_xref)
12191 TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
12192 /* The same applies to wfl_op2 */
12193 wfl_op2 = TREE_OPERAND (node, 1);
12194 TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
12195 if (TREE_OPERAND (node, 1) == error_mark_node)
12196 return error_mark_node;
12197 if (!flag_emit_class_files && !flag_emit_xref)
12198 TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
12199 return patch_array_ref (node);
12204 case COMPONENT_REF:
12205 /* The first step in the re-write of qualified name handling. FIXME.
12206 So far, this is only to support PRIMTYPE.class -> PRIMCLASS.TYPE. */
12207 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
12208 if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
12210 tree name = TREE_OPERAND (node, 1);
12211 tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
12212 if (field == NULL_TREE)
12214 error ("missing static field `%s'", IDENTIFIER_POINTER (name));
12215 return error_mark_node;
12217 if (! FIELD_STATIC (field))
12219 error ("not a static field `%s'", IDENTIFIER_POINTER (name));
12220 return error_mark_node;
12229 /* Can't use THIS in a static environment */
12232 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12233 parse_error_context (wfl_operator,
12234 "Keyword `this' used outside allowed context");
12235 TREE_TYPE (node) = error_mark_node;
12236 return error_mark_node;
12238 if (ctxp->explicit_constructor_p)
12240 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12241 parse_error_context
12242 (wfl_operator, "Can't reference `this' or `super' before the superclass constructor has been called");
12243 TREE_TYPE (node) = error_mark_node;
12244 return error_mark_node;
12246 return current_this;
12248 case CLASS_LITERAL:
12249 CAN_COMPLETE_NORMALLY (node) = 1;
12250 node = patch_incomplete_class_ref (node);
12251 if (node == error_mark_node)
12252 return error_mark_node;
12256 CAN_COMPLETE_NORMALLY (node) = 1;
12257 /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
12258 and it's time to turn it into the appropriate String object */
12259 if ((nn = patch_string (node)))
12262 internal_error ("No case for %s", tree_code_name [TREE_CODE (node)]);
12267 /* Complete function call's argument. Return a nonzero value is an
12268 error was found. */
12271 complete_function_arguments (tree node)
12276 ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12277 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
12279 tree wfl = TREE_VALUE (cn), parm, temp;
12280 parm = java_complete_tree (wfl);
12282 if (parm == error_mark_node)
12287 /* If have a string literal that we haven't transformed yet or a
12288 crafted string buffer, as a result of use of the the String
12289 `+' operator. Build `parm.toString()' and expand it. */
12290 if ((temp = patch_string (parm)))
12293 TREE_VALUE (cn) = parm;
12295 ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12299 /* Sometimes (for loops and variable initialized during their
12300 declaration), we want to wrap a statement around a WFL and turn it
12304 build_debugable_stmt (int location, tree stmt)
12306 if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
12308 stmt = build_expr_wfl (stmt, input_filename, 0, 0);
12309 EXPR_WFL_LINECOL (stmt) = location;
12311 JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
12316 build_expr_block (tree body, tree decls)
12319 tree node = make_node (BLOCK);
12320 BLOCK_EXPR_DECLS (node) = decls;
12321 BLOCK_EXPR_BODY (node) = body;
12323 TREE_TYPE (node) = TREE_TYPE (body);
12324 TREE_SIDE_EFFECTS (node) = 1;
12328 /* Create a new function block and link it appropriately to current
12329 function block chain */
12334 tree b = build_expr_block (NULL_TREE, NULL_TREE);
12336 /* Link block B supercontext to the previous block. The current
12337 function DECL is used as supercontext when enter_a_block is called
12338 for the first time for a given function. The current function body
12339 (DECL_FUNCTION_BODY) is set to be block B. */
12341 tree fndecl = current_function_decl;
12344 BLOCK_SUPERCONTEXT (b) = current_static_block;
12345 current_static_block = b;
12348 else if (!DECL_FUNCTION_BODY (fndecl))
12350 BLOCK_SUPERCONTEXT (b) = fndecl;
12351 DECL_FUNCTION_BODY (fndecl) = b;
12355 BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
12356 DECL_FUNCTION_BODY (fndecl) = b;
12361 /* Exit a block by changing the current function body
12362 (DECL_FUNCTION_BODY) to the current block super context, only if
12363 the block being exited isn't the method's top level one. */
12369 if (current_function_decl)
12371 b = DECL_FUNCTION_BODY (current_function_decl);
12372 if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
12373 DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
12377 b = current_static_block;
12379 if (BLOCK_SUPERCONTEXT (b))
12380 current_static_block = BLOCK_SUPERCONTEXT (b);
12385 /* Lookup for NAME in the nested function's blocks, all the way up to
12386 the current toplevel one. It complies with Java's local variable
12390 lookup_name_in_blocks (tree name)
12392 tree b = GET_CURRENT_BLOCK (current_function_decl);
12394 while (b != current_function_decl)
12398 /* Paranoid sanity check. To be removed */
12399 if (TREE_CODE (b) != BLOCK)
12402 for (current = BLOCK_EXPR_DECLS (b); current;
12403 current = TREE_CHAIN (current))
12404 if (DECL_NAME (current) == name)
12406 b = BLOCK_SUPERCONTEXT (b);
12412 maybe_absorb_scoping_blocks (void)
12414 while (BLOCK_IS_IMPLICIT (GET_CURRENT_BLOCK (current_function_decl)))
12416 tree b = exit_block ();
12417 java_method_add_stmt (current_function_decl, b);
12418 SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", input_line));
12423 /* This section of the source is reserved to build_* functions that
12424 are building incomplete tree nodes and the patch_* functions that
12425 are completing them. */
12427 /* Wrap a non WFL node around a WFL. */
12430 build_wfl_wrap (tree node, int location)
12432 tree wfl, node_to_insert = node;
12434 /* We want to process THIS . xxx symbolically, to keep it consistent
12435 with the way we're processing SUPER. A THIS from a primary as a
12436 different form than a SUPER. Turn THIS into something symbolic */
12437 if (TREE_CODE (node) == THIS_EXPR)
12438 node_to_insert = wfl = build_wfl_node (this_identifier_node);
12440 wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
12442 EXPR_WFL_LINECOL (wfl) = location;
12443 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
12447 /* Build a super() constructor invocation. Returns empty_stmt_node if
12448 we're currently dealing with the class java.lang.Object. */
12451 build_super_invocation (tree mdecl)
12453 if (DECL_CONTEXT (mdecl) == object_type_node)
12454 return empty_stmt_node;
12457 tree super_wfl = build_wfl_node (super_identifier_node);
12458 tree a = NULL_TREE, t;
12459 /* If we're dealing with an anonymous class, pass the arguments
12460 of the crafted constructor along. */
12461 if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
12463 SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
12464 for (; t != end_params_node; t = TREE_CHAIN (t))
12465 a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
12467 return build_method_invocation (super_wfl, a);
12471 /* Build a SUPER/THIS qualified method invocation. */
12474 build_this_super_qualified_invocation (int use_this, tree name, tree args,
12475 int lloc, int rloc)
12479 build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
12480 EXPR_WFL_LINECOL (wfl) = lloc;
12481 invok = build_method_invocation (name, args);
12482 return make_qualified_primary (wfl, invok, rloc);
12485 /* Build an incomplete CALL_EXPR node. */
12488 build_method_invocation (tree name, tree args)
12490 tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
12491 TREE_SIDE_EFFECTS (call) = 1;
12492 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12496 /* Build an incomplete new xxx(...) node. */
12499 build_new_invocation (tree name, tree args)
12501 tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
12502 TREE_SIDE_EFFECTS (call) = 1;
12503 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12507 /* Build an incomplete assignment expression. */
12510 build_assignment (int op, int op_location, tree lhs, tree rhs)
12513 /* Build the corresponding binop if we deal with a Compound
12514 Assignment operator. Mark the binop sub-tree as part of a
12515 Compound Assignment expression */
12516 if (op != ASSIGN_TK)
12518 rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
12519 COMPOUND_ASSIGN_P (rhs) = 1;
12521 assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
12522 TREE_SIDE_EFFECTS (assignment) = 1;
12523 EXPR_WFL_LINECOL (assignment) = op_location;
12527 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12528 the buffer. This is used only for string conversion. */
12530 string_convert_int_cst (tree node)
12532 /* Long.MIN_VALUE is -9223372036854775808, 20 characters. */
12533 static char buffer[21];
12535 unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
12536 unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
12537 char *p = buffer + sizeof (buffer);
12540 unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
12541 << (HOST_BITS_PER_WIDE_INT - 1));
12545 /* If negative, note the fact and negate the value. */
12555 /* Divide by 10 until there are no bits left. */
12558 unsigned HOST_WIDE_INT acc = 0;
12559 unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
12562 /* Use long division to compute the result and the remainder. */
12563 for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
12565 /* Shift a bit into accumulator. */
12570 /* Shift the value. */
12576 /* Shift the correct bit into the result. */
12578 if ((outlo & hibit))
12588 /* '0' == 060 in Java, but might not be here (think EBCDIC). */
12589 *--p = '\060' + acc;
12597 *--p = '\055'; /* '-' == 055 in Java, but might not be here. */
12602 /* Print an INTEGER_CST node in a static buffer, and return the
12603 buffer. This is used only for error handling. */
12605 print_int_node (tree node)
12607 static char buffer [80];
12608 if (TREE_CONSTANT_OVERFLOW (node))
12609 sprintf (buffer, "<overflow>");
12611 if (TREE_INT_CST_HIGH (node) == 0)
12612 sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
12613 TREE_INT_CST_LOW (node));
12614 else if (TREE_INT_CST_HIGH (node) == -1
12615 && TREE_INT_CST_LOW (node) != 0)
12616 sprintf (buffer, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
12617 -TREE_INT_CST_LOW (node));
12619 sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
12620 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
12626 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12629 /* 15.25 Assignment operators. */
12632 patch_assignment (tree node, tree wfl_op1)
12634 tree rhs = TREE_OPERAND (node, 1);
12635 tree lvalue = TREE_OPERAND (node, 0), llvalue;
12636 tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
12637 int error_found = 0;
12638 int lvalue_from_array = 0;
12641 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12643 /* Lhs can be a named variable */
12644 if (JDECL_P (lvalue))
12646 lhs_type = TREE_TYPE (lvalue);
12648 /* Or Lhs can be an array access. */
12649 else if (TREE_CODE (lvalue) == ARRAY_REF)
12651 lhs_type = TREE_TYPE (lvalue);
12652 lvalue_from_array = 1;
12654 /* Or a field access */
12655 else if (TREE_CODE (lvalue) == COMPONENT_REF)
12656 lhs_type = TREE_TYPE (lvalue);
12657 /* Or a function return slot */
12658 else if (TREE_CODE (lvalue) == RESULT_DECL)
12660 /* If the return type is an integral type, then we create the
12661 RESULT_DECL with a promoted type, but we need to do these
12662 checks against the unpromoted type to ensure type safety. So
12663 here we look at the real type, not the type of the decl we
12665 lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
12668 /* Otherwise, we might want to try to write into an optimized static
12669 final, this is an of a different nature, reported further on. */
12670 else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
12671 && resolve_expression_name (wfl_op1, &llvalue))
12673 lhs_type = TREE_TYPE (lvalue);
12677 parse_error_context (wfl_op1, "Invalid left hand side of assignment");
12681 rhs_type = TREE_TYPE (rhs);
12683 /* 5.1 Try the assignment conversion for builtin type. */
12684 new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
12686 /* 5.2 If it failed, try a reference conversion */
12688 new_rhs = try_reference_assignconv (lhs_type, rhs);
12690 /* 15.25.2 If we have a compound assignment, convert RHS into the
12692 else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12693 new_rhs = convert (lhs_type, rhs);
12695 /* Explicit cast required. This is an error */
12698 char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
12699 char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
12701 char operation [32]; /* Max size known */
12703 /* If the assignment is part of a declaration, we use the WFL of
12704 the declared variable to point out the error and call it a
12705 declaration problem. If the assignment is a genuine =
12706 operator, we call is a operator `=' problem, otherwise we
12707 call it an assignment problem. In both of these last cases,
12708 we use the WFL of the operator to indicate the error. */
12710 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
12713 strcpy (operation, "declaration");
12717 wfl = wfl_operator;
12718 if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12719 strcpy (operation, "assignment");
12720 else if (is_return)
12721 strcpy (operation, "`return'");
12723 strcpy (operation, "`='");
12726 if (!valid_cast_to_p (rhs_type, lhs_type))
12727 parse_error_context
12728 (wfl, "Incompatible type for %s. Can't convert `%s' to `%s'",
12729 operation, t1, t2);
12731 parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert `%s' to `%s'",
12732 operation, t1, t2);
12733 free (t1); free (t2);
12738 return error_mark_node;
12740 /* If we're processing a `return' statement, promote the actual type
12741 to the promoted type. */
12743 new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
12745 /* 10.10: Array Store Exception runtime check */
12746 if (!flag_emit_class_files
12748 && lvalue_from_array
12749 && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
12751 tree array, store_check, base, index_expr;
12753 /* Save RHS so that it doesn't get re-evaluated by the store check. */
12754 new_rhs = save_expr (new_rhs);
12756 /* Get the INDIRECT_REF. */
12757 array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
12758 /* Get the array pointer expr. */
12759 array = TREE_OPERAND (array, 0);
12760 store_check = build_java_arraystore_check (array, new_rhs);
12762 index_expr = TREE_OPERAND (lvalue, 1);
12764 if (TREE_CODE (index_expr) == COMPOUND_EXPR)
12766 /* A COMPOUND_EXPR here is a bounds check. The bounds check must
12767 happen before the store check, so prepare to insert the store
12768 check within the second operand of the existing COMPOUND_EXPR. */
12774 index_expr = TREE_OPERAND (base, 1);
12775 TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr),
12776 store_check, index_expr);
12779 /* Final locals can be used as case values in switch
12780 statement. Prepare them for this eventuality. */
12781 if (TREE_CODE (lvalue) == VAR_DECL
12782 && DECL_FINAL (lvalue)
12783 && TREE_CONSTANT (new_rhs)
12784 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
12785 && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
12788 TREE_CONSTANT (lvalue) = 1;
12789 DECL_INITIAL (lvalue) = new_rhs;
12792 /* Copy the rhs if it's a reference. */
12793 if (! flag_check_references && ! flag_emit_class_files && optimize > 0)
12795 switch (TREE_CODE (new_rhs))
12799 case COMPONENT_REF:
12800 /* Transform a = foo.bar
12801 into a = { int tmp; tmp = foo.bar; tmp; ).
12802 We need to ensure that if a read from memory fails
12803 because of a NullPointerException, a destination variable
12804 will remain unchanged. An explicit temporary does what
12807 If flag_check_references is set, this is unnecessary
12808 because we'll check each reference before doing any
12809 reads. If optimize is not set the result will never be
12810 written to a stack slot that contains the LHS. */
12812 tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"),
12813 TREE_TYPE (new_rhs));
12814 tree block = make_node (BLOCK);
12816 = build (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
12817 DECL_CONTEXT (tmp) = current_function_decl;
12818 TREE_TYPE (block) = TREE_TYPE (new_rhs);
12819 BLOCK_VARS (block) = tmp;
12820 BLOCK_EXPR_BODY (block)
12821 = build (COMPOUND_EXPR, TREE_TYPE (new_rhs), assignment, tmp);
12822 TREE_SIDE_EFFECTS (block) = 1;
12831 TREE_OPERAND (node, 0) = lvalue;
12832 TREE_OPERAND (node, 1) = new_rhs;
12833 TREE_TYPE (node) = lhs_type;
12837 /* Check that type SOURCE can be cast into type DEST. If the cast
12838 can't occur at all, return NULL; otherwise, return a possibly
12842 try_reference_assignconv (tree lhs_type, tree rhs)
12844 tree new_rhs = NULL_TREE;
12845 tree rhs_type = TREE_TYPE (rhs);
12847 if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
12849 /* `null' may be assigned to any reference type */
12850 if (rhs == null_pointer_node)
12851 new_rhs = null_pointer_node;
12852 /* Try the reference assignment conversion */
12853 else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
12855 /* This is a magic assignment that we process differently */
12856 else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
12862 /* Check that RHS can be converted into LHS_TYPE by the assignment
12863 conversion (5.2), for the cases of RHS being a builtin type. Return
12864 NULL_TREE if the conversion fails or if because RHS isn't of a
12865 builtin type. Return a converted RHS if the conversion is possible. */
12868 try_builtin_assignconv (tree wfl_op1, tree lhs_type, tree rhs)
12870 tree new_rhs = NULL_TREE;
12871 tree rhs_type = TREE_TYPE (rhs);
12873 /* Handle boolean specially. */
12874 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12875 || TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12877 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12878 && TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12882 /* 5.1.1 Try Identity Conversion,
12883 5.1.2 Try Widening Primitive Conversion */
12884 else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
12885 new_rhs = convert (lhs_type, rhs);
12887 /* Try a narrowing primitive conversion (5.1.3):
12888 - expression is a constant expression of type byte, short, char,
12890 - variable is byte, short or char AND
12891 - The value of the expression is representable in the type of the
12893 else if ((rhs_type == byte_type_node || rhs_type == short_type_node
12894 || rhs_type == char_type_node || rhs_type == int_type_node)
12895 && TREE_CONSTANT (rhs)
12896 && (lhs_type == byte_type_node || lhs_type == char_type_node
12897 || lhs_type == short_type_node))
12899 if (int_fits_type_p (rhs, lhs_type))
12900 new_rhs = convert (lhs_type, rhs);
12901 else if (wfl_op1) /* Might be called with a NULL */
12902 parse_warning_context
12903 (wfl_op1, "Constant expression `%s' too wide for narrowing primitive conversion to `%s'",
12904 print_int_node (rhs), lang_printable_name (lhs_type, 0));
12905 /* Reported a warning that will turn into an error further
12906 down, so we don't return */
12912 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
12913 conversion (5.1.1) or widening primitive conversion (5.1.2). Return
12914 0 is the conversion test fails. This implements parts the method
12915 invocation conversion (5.3). */
12918 valid_builtin_assignconv_identity_widening_p (tree lhs_type, tree rhs_type)
12920 /* 5.1.1: This is the identity conversion part. */
12921 if (lhs_type == rhs_type)
12924 /* Reject non primitive types and boolean conversions. */
12925 if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
12928 /* 5.1.2: widening primitive conversion. byte, even if it's smaller
12929 than a char can't be converted into a char. Short can't too, but
12930 the < test below takes care of that */
12931 if (lhs_type == char_type_node && rhs_type == byte_type_node)
12934 /* Accept all promoted type here. Note, we can't use <= in the test
12935 below, because we still need to bounce out assignments of short
12936 to char and the likes */
12937 if (lhs_type == int_type_node
12938 && (rhs_type == promoted_byte_type_node
12939 || rhs_type == promoted_short_type_node
12940 || rhs_type == promoted_char_type_node
12941 || rhs_type == promoted_boolean_type_node))
12944 /* From here, an integral is widened if its precision is smaller
12945 than the precision of the LHS or if the LHS is a floating point
12946 type, or the RHS is a float and the RHS a double. */
12947 if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
12948 && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
12949 || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
12950 || (rhs_type == float_type_node && lhs_type == double_type_node))
12956 /* Check that something of SOURCE type can be assigned or cast to
12957 something of DEST type at runtime. Return 1 if the operation is
12958 valid, 0 otherwise. If CAST is set to 1, we're treating the case
12959 were SOURCE is cast into DEST, which borrows a lot of the
12960 assignment check. */
12963 valid_ref_assignconv_cast_p (tree source, tree dest, int cast)
12965 /* SOURCE or DEST might be null if not from a declared entity. */
12966 if (!source || !dest)
12968 if (JNULLP_TYPE_P (source))
12970 if (TREE_CODE (source) == POINTER_TYPE)
12971 source = TREE_TYPE (source);
12972 if (TREE_CODE (dest) == POINTER_TYPE)
12973 dest = TREE_TYPE (dest);
12975 /* If source and dest are being compiled from bytecode, they may need to
12977 if (CLASS_P (source) && !CLASS_LOADED_P (source))
12979 load_class (source, 1);
12980 safe_layout_class (source);
12982 if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
12984 load_class (dest, 1);
12985 safe_layout_class (dest);
12988 /* Case where SOURCE is a class type */
12989 if (TYPE_CLASS_P (source))
12991 if (TYPE_CLASS_P (dest))
12992 return (source == dest
12993 || inherits_from_p (source, dest)
12994 || (cast && inherits_from_p (dest, source)));
12995 if (TYPE_INTERFACE_P (dest))
12997 /* If doing a cast and SOURCE is final, the operation is
12998 always correct a compile time (because even if SOURCE
12999 does not implement DEST, a subclass of SOURCE might). */
13000 if (cast && !CLASS_FINAL (TYPE_NAME (source)))
13002 /* Otherwise, SOURCE must implement DEST */
13003 return interface_of_p (dest, source);
13005 /* DEST is an array, cast permitted if SOURCE is of Object type */
13006 return (cast && source == object_type_node ? 1 : 0);
13008 if (TYPE_INTERFACE_P (source))
13010 if (TYPE_CLASS_P (dest))
13012 /* If not casting, DEST must be the Object type */
13014 return dest == object_type_node;
13015 /* We're doing a cast. The cast is always valid is class
13016 DEST is not final, otherwise, DEST must implement SOURCE */
13017 else if (!CLASS_FINAL (TYPE_NAME (dest)))
13020 return interface_of_p (source, dest);
13022 if (TYPE_INTERFACE_P (dest))
13024 /* If doing a cast, then if SOURCE and DEST contain method
13025 with the same signature but different return type, then
13026 this is a (compile time) error */
13029 tree method_source, method_dest;
13033 for (method_source = TYPE_METHODS (source); method_source;
13034 method_source = TREE_CHAIN (method_source))
13037 build_java_argument_signature (TREE_TYPE (method_source));
13038 source_type = TREE_TYPE (TREE_TYPE (method_source));
13039 source_name = DECL_NAME (method_source);
13040 for (method_dest = TYPE_METHODS (dest);
13041 method_dest; method_dest = TREE_CHAIN (method_dest))
13043 build_java_argument_signature (TREE_TYPE (method_dest))
13044 && source_name == DECL_NAME (method_dest)
13045 && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
13051 return source == dest || interface_of_p (dest, source);
13057 && (DECL_NAME (TYPE_NAME (source))
13058 == java_lang_cloneable_identifier_node
13059 || (DECL_NAME (TYPE_NAME (source))
13060 == java_io_serializable_identifier_node)));
13063 if (TYPE_ARRAY_P (source))
13065 if (TYPE_CLASS_P (dest))
13066 return dest == object_type_node;
13067 /* Can't cast an array to an interface unless the interface is
13068 java.lang.Cloneable or java.io.Serializable. */
13069 if (TYPE_INTERFACE_P (dest))
13070 return (DECL_NAME (TYPE_NAME (dest))
13071 == java_lang_cloneable_identifier_node
13072 || (DECL_NAME (TYPE_NAME (dest))
13073 == java_io_serializable_identifier_node));
13076 tree source_element_type = TYPE_ARRAY_ELEMENT (source);
13077 tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
13079 /* In case of severe errors, they turn out null */
13080 if (!dest_element_type || !source_element_type)
13082 if (source_element_type == dest_element_type)
13084 return valid_ref_assignconv_cast_p (source_element_type,
13085 dest_element_type, cast);
13093 valid_cast_to_p (tree source, tree dest)
13095 if (TREE_CODE (source) == POINTER_TYPE)
13096 source = TREE_TYPE (source);
13097 if (TREE_CODE (dest) == POINTER_TYPE)
13098 dest = TREE_TYPE (dest);
13100 if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
13101 return valid_ref_assignconv_cast_p (source, dest, 1);
13103 else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
13106 else if (TREE_CODE (source) == BOOLEAN_TYPE
13107 && TREE_CODE (dest) == BOOLEAN_TYPE)
13114 do_unary_numeric_promotion (tree arg)
13116 tree type = TREE_TYPE (arg);
13117 if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
13118 || TREE_CODE (type) == CHAR_TYPE)
13119 arg = convert (int_type_node, arg);
13123 /* Return a nonzero value if SOURCE can be converted into DEST using
13124 the method invocation conversion rule (5.3). */
13126 valid_method_invocation_conversion_p (tree dest, tree source)
13128 return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
13129 && valid_builtin_assignconv_identity_widening_p (dest, source))
13130 || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
13131 && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
13132 && valid_ref_assignconv_cast_p (source, dest, 0)));
13135 /* Build an incomplete binop expression. */
13138 build_binop (enum tree_code op, int op_location, tree op1, tree op2)
13140 tree binop = build (op, NULL_TREE, op1, op2);
13141 TREE_SIDE_EFFECTS (binop) = 1;
13142 /* Store the location of the operator, for better error report. The
13143 string of the operator will be rebuild based on the OP value. */
13144 EXPR_WFL_LINECOL (binop) = op_location;
13148 /* Build the string of the operator retained by NODE. If NODE is part
13149 of a compound expression, add an '=' at the end of the string. This
13150 function is called when an error needs to be reported on an
13151 operator. The string is returned as a pointer to a static character
13155 operator_string (tree node)
13157 #define BUILD_OPERATOR_STRING(S) \
13159 sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
13163 static char buffer [10];
13164 switch (TREE_CODE (node))
13166 case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
13167 case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
13168 case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
13169 case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13170 case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
13171 case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
13172 case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
13173 case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
13174 case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
13175 case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
13176 case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
13177 case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
13178 case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
13179 case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
13180 case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
13181 case GT_EXPR: BUILD_OPERATOR_STRING (">");
13182 case GE_EXPR: BUILD_OPERATOR_STRING (">=");
13183 case LT_EXPR: BUILD_OPERATOR_STRING ("<");
13184 case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
13185 case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13186 case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
13187 case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
13188 case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
13189 case PREINCREMENT_EXPR: /* Fall through */
13190 case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
13191 case PREDECREMENT_EXPR: /* Fall through */
13192 case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
13194 internal_error ("unregistered operator %s",
13195 tree_code_name [TREE_CODE (node)]);
13198 #undef BUILD_OPERATOR_STRING
13201 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2. */
13204 java_decl_equiv (tree var_acc1, tree var_acc2)
13206 if (JDECL_P (var_acc1))
13207 return (var_acc1 == var_acc2);
13209 return (TREE_CODE (var_acc1) == COMPONENT_REF
13210 && TREE_CODE (var_acc2) == COMPONENT_REF
13211 && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
13212 == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
13213 && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
13216 /* Return a nonzero value if CODE is one of the operators that can be
13217 used in conjunction with the `=' operator in a compound assignment. */
13220 binop_compound_p (enum tree_code code)
13223 for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
13224 if (binop_lookup [i] == code)
13227 return i < BINOP_COMPOUND_CANDIDATES;
13230 /* Reorganize after a fold to get SAVE_EXPR to generate what we want. */
13233 java_refold (tree t)
13235 tree c, b, ns, decl;
13237 if (TREE_CODE (t) != MODIFY_EXPR)
13240 c = TREE_OPERAND (t, 1);
13241 if (! (c && TREE_CODE (c) == COMPOUND_EXPR
13242 && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
13243 && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
13246 /* Now the left branch of the binary operator. */
13247 b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
13248 if (! (b && TREE_CODE (b) == NOP_EXPR
13249 && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
13252 ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
13253 if (! (ns && TREE_CODE (ns) == NOP_EXPR
13254 && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
13257 decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
13258 if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
13259 /* It's got to be the an equivalent decl */
13260 && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
13262 /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13263 TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
13264 /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13265 TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
13266 /* Change the right part of the BINOP_EXPR */
13267 TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
13273 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13274 errors but we modify NODE so that it contains the type computed
13275 according to the expression, when it's fixed. Otherwise, we write
13276 error_mark_node as the type. It allows us to further the analysis
13277 of remaining nodes and detects more errors in certain cases. */
13280 patch_binop (tree node, tree wfl_op1, tree wfl_op2)
13282 tree op1 = TREE_OPERAND (node, 0);
13283 tree op2 = TREE_OPERAND (node, 1);
13284 tree op1_type = TREE_TYPE (op1);
13285 tree op2_type = TREE_TYPE (op2);
13286 tree prom_type = NULL_TREE, cn;
13287 enum tree_code code = TREE_CODE (node);
13289 /* If 1, tell the routine that we have to return error_mark_node
13290 after checking for the initialization of the RHS */
13291 int error_found = 0;
13293 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13295 /* If either op<n>_type are NULL, this might be early signs of an
13296 error situation, unless it's too early to tell (in case we're
13297 handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13298 correctly so the error can be later on reported accurately. */
13299 if (! (code == PLUS_EXPR || code == NE_EXPR
13300 || code == EQ_EXPR || code == INSTANCEOF_EXPR))
13305 n = java_complete_tree (op1);
13306 op1_type = TREE_TYPE (n);
13310 n = java_complete_tree (op2);
13311 op2_type = TREE_TYPE (n);
13317 /* 15.16 Multiplicative operators */
13318 case MULT_EXPR: /* 15.16.1 Multiplication Operator * */
13319 case RDIV_EXPR: /* 15.16.2 Division Operator / */
13320 case TRUNC_DIV_EXPR: /* 15.16.2 Integral type Division Operator / */
13321 case TRUNC_MOD_EXPR: /* 15.16.3 Remainder operator % */
13322 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13324 if (!JNUMERIC_TYPE_P (op1_type))
13325 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13326 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13327 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13328 TREE_TYPE (node) = error_mark_node;
13332 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13334 /* Detect integral division by zero */
13335 if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
13336 && TREE_CODE (prom_type) == INTEGER_TYPE
13337 && (op2 == integer_zero_node || op2 == long_zero_node ||
13338 (TREE_CODE (op2) == INTEGER_CST &&
13339 ! TREE_INT_CST_LOW (op2) && ! TREE_INT_CST_HIGH (op2))))
13341 parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown");
13342 TREE_CONSTANT (node) = 0;
13345 /* Change the division operator if necessary */
13346 if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
13347 TREE_SET_CODE (node, TRUNC_DIV_EXPR);
13349 /* Before divisions as is disappear, try to simplify and bail if
13350 applicable, otherwise we won't perform even simple
13351 simplifications like (1-1)/3. We can't do that with floating
13352 point number, folds can't handle them at this stage. */
13353 if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
13354 && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
13356 TREE_TYPE (node) = prom_type;
13357 node = fold (node);
13358 if (TREE_CODE (node) != code)
13362 if (TREE_CODE (prom_type) == INTEGER_TYPE
13363 && flag_use_divide_subroutine
13364 && ! flag_emit_class_files
13365 && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
13366 return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
13368 /* This one is more complicated. FLOATs are processed by a
13369 function call to soft_fmod. Duplicate the value of the
13370 COMPOUND_ASSIGN_P flag. */
13371 if (code == TRUNC_MOD_EXPR)
13373 tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
13374 COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
13375 TREE_SIDE_EFFECTS (mod)
13376 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13381 /* 15.17 Additive Operators */
13382 case PLUS_EXPR: /* 15.17.1 String Concatenation Operator + */
13384 /* Operation is valid if either one argument is a string
13385 constant, a String object or a StringBuffer crafted for the
13386 purpose of the a previous usage of the String concatenation
13389 if (TREE_CODE (op1) == STRING_CST
13390 || TREE_CODE (op2) == STRING_CST
13391 || JSTRING_TYPE_P (op1_type)
13392 || JSTRING_TYPE_P (op2_type)
13393 || IS_CRAFTED_STRING_BUFFER_P (op1)
13394 || IS_CRAFTED_STRING_BUFFER_P (op2))
13395 return build_string_concatenation (op1, op2);
13397 case MINUS_EXPR: /* 15.17.2 Additive Operators (+ and -) for
13399 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13401 if (!JNUMERIC_TYPE_P (op1_type))
13402 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13403 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13404 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13405 TREE_TYPE (node) = error_mark_node;
13409 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13412 /* 15.18 Shift Operators */
13416 if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
13418 if (!JINTEGRAL_TYPE_P (op1_type))
13419 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13422 if (JNUMERIC_TYPE_P (op2_type))
13423 parse_error_context (wfl_operator,
13424 "Incompatible type for `%s'. Explicit cast needed to convert shift distance from `%s' to integral",
13425 operator_string (node),
13426 lang_printable_name (op2_type, 0));
13428 parse_error_context (wfl_operator,
13429 "Incompatible type for `%s'. Can't convert shift distance from `%s' to integral",
13430 operator_string (node),
13431 lang_printable_name (op2_type, 0));
13433 TREE_TYPE (node) = error_mark_node;
13438 /* Unary numeric promotion (5.6.1) is performed on each operand
13440 op1 = do_unary_numeric_promotion (op1);
13441 op2 = do_unary_numeric_promotion (op2);
13443 /* If the right hand side is of type `long', first cast it to
13445 if (TREE_TYPE (op2) == long_type_node)
13446 op2 = build1 (CONVERT_EXPR, int_type_node, op2);
13448 /* The type of the shift expression is the type of the promoted
13449 type of the left-hand operand */
13450 prom_type = TREE_TYPE (op1);
13452 /* Shift int only up to 0x1f and long up to 0x3f */
13453 if (prom_type == int_type_node)
13454 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13455 build_int_2 (0x1f, 0)));
13457 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13458 build_int_2 (0x3f, 0)));
13460 /* The >>> operator is a >> operating on unsigned quantities */
13461 if (code == URSHIFT_EXPR && ! flag_emit_class_files)
13464 tree utype = java_unsigned_type (prom_type);
13465 op1 = convert (utype, op1);
13466 TREE_SET_CODE (node, RSHIFT_EXPR);
13467 TREE_OPERAND (node, 0) = op1;
13468 TREE_OPERAND (node, 1) = op2;
13469 TREE_TYPE (node) = utype;
13470 to_return = convert (prom_type, node);
13471 /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13472 COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
13473 TREE_SIDE_EFFECTS (to_return)
13474 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13479 /* 15.19.1 Type Comparison Operator instanceof */
13480 case INSTANCEOF_EXPR:
13482 TREE_TYPE (node) = boolean_type_node;
13484 /* OP1_TYPE might be NULL when OP1 is a string constant. */
13485 if ((cn = patch_string (op1)))
13488 op1_type = TREE_TYPE (op1);
13490 if (op1_type == NULL_TREE)
13493 if (!(op2_type = resolve_type_during_patch (op2)))
13494 return error_mark_node;
13496 /* The first operand must be a reference type or the null type */
13497 if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
13498 error_found = 1; /* Error reported further below */
13500 /* The second operand must be a reference type */
13501 if (!JREFERENCE_TYPE_P (op2_type))
13503 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
13504 parse_error_context
13505 (wfl_operator, "Invalid argument `%s' for `instanceof'",
13506 lang_printable_name (op2_type, 0));
13510 if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
13512 /* If the first operand is null, the result is always false */
13513 if (op1 == null_pointer_node)
13514 return boolean_false_node;
13515 else if (flag_emit_class_files)
13517 TREE_OPERAND (node, 1) = op2_type;
13518 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
13521 /* Otherwise we have to invoke instance of to figure it out */
13523 return build_instanceof (op1, op2_type);
13525 /* There is no way the expression operand can be an instance of
13526 the type operand. This is a compile time error. */
13529 char *t1 = xstrdup (lang_printable_name (op1_type, 0));
13530 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
13531 parse_error_context
13532 (wfl_operator, "Impossible for `%s' to be instance of `%s'",
13533 t1, lang_printable_name (op2_type, 0));
13540 /* 15.21 Bitwise and Logical Operators */
13544 if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
13545 /* Binary numeric promotion is performed on both operand and the
13546 expression retain that type */
13547 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13549 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
13550 && TREE_CODE (op1_type) == BOOLEAN_TYPE)
13551 /* The type of the bitwise operator expression is BOOLEAN */
13552 prom_type = boolean_type_node;
13555 if (!JINTEGRAL_TYPE_P (op1_type))
13556 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13557 if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
13558 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
13559 TREE_TYPE (node) = error_mark_node;
13561 /* Insert a break here if adding thing before the switch's
13562 break for this case */
13566 /* 15.22 Conditional-And Operator */
13567 case TRUTH_ANDIF_EXPR:
13568 /* 15.23 Conditional-Or Operator */
13569 case TRUTH_ORIF_EXPR:
13570 /* Operands must be of BOOLEAN type */
13571 if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
13572 TREE_CODE (op2_type) != BOOLEAN_TYPE)
13574 if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
13575 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
13576 if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
13577 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
13578 TREE_TYPE (node) = boolean_type_node;
13582 else if (integer_zerop (op1))
13584 return code == TRUTH_ANDIF_EXPR ? op1 : op2;
13586 else if (integer_onep (op1))
13588 return code == TRUTH_ANDIF_EXPR ? op2 : op1;
13590 /* The type of the conditional operators is BOOLEAN */
13591 prom_type = boolean_type_node;
13594 /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13599 /* The type of each of the operands must be a primitive numeric
13601 if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
13603 if (!JNUMERIC_TYPE_P (op1_type))
13604 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13605 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13606 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13607 TREE_TYPE (node) = boolean_type_node;
13611 /* Binary numeric promotion is performed on the operands */
13612 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13613 /* The type of the relation expression is always BOOLEAN */
13614 prom_type = boolean_type_node;
13617 /* 15.20 Equality Operator */
13620 /* It's time for us to patch the strings. */
13621 if ((cn = patch_string (op1)))
13624 op1_type = TREE_TYPE (op1);
13626 if ((cn = patch_string (op2)))
13629 op2_type = TREE_TYPE (op2);
13632 /* 15.20.1 Numerical Equality Operators == and != */
13633 /* Binary numeric promotion is performed on the operands */
13634 if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
13635 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13637 /* 15.20.2 Boolean Equality Operators == and != */
13638 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
13639 TREE_CODE (op2_type) == BOOLEAN_TYPE)
13640 ; /* Nothing to do here */
13642 /* 15.20.3 Reference Equality Operators == and != */
13643 /* Types have to be either references or the null type. If
13644 they're references, it must be possible to convert either
13645 type to the other by casting conversion. */
13646 else if (op1 == null_pointer_node || op2 == null_pointer_node
13647 || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
13648 && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
13649 || valid_ref_assignconv_cast_p (op2_type,
13651 ; /* Nothing to do here */
13653 /* Else we have an error figure what can't be converted into
13654 what and report the error */
13658 t1 = xstrdup (lang_printable_name (op1_type, 0));
13659 parse_error_context
13661 "Incompatible type for `%s'. Can't convert `%s' to `%s'",
13662 operator_string (node), t1,
13663 lang_printable_name (op2_type, 0));
13665 TREE_TYPE (node) = boolean_type_node;
13669 prom_type = boolean_type_node;
13676 return error_mark_node;
13678 TREE_OPERAND (node, 0) = op1;
13679 TREE_OPERAND (node, 1) = op2;
13680 TREE_TYPE (node) = prom_type;
13681 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13683 if (flag_emit_xref)
13686 /* fold does not respect side-effect order as required for Java but not C.
13687 * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13690 if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
13691 : ! TREE_SIDE_EFFECTS (node))
13692 node = fold (node);
13696 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13697 zero value, the value of CSTE comes after the valude of STRING */
13700 do_merge_string_cste (tree cste, const char *string, int string_len, int after)
13702 const char *old = TREE_STRING_POINTER (cste);
13703 int old_len = TREE_STRING_LENGTH (cste);
13704 int len = old_len + string_len;
13705 char *new = alloca (len+1);
13709 memcpy (new, string, string_len);
13710 memcpy (&new [string_len], old, old_len);
13714 memcpy (new, old, old_len);
13715 memcpy (&new [old_len], string, string_len);
13718 return build_string (len, new);
13721 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13722 new STRING_CST on success, NULL_TREE on failure. */
13725 merge_string_cste (tree op1, tree op2, int after)
13727 /* Handle two string constants right away. */
13728 if (TREE_CODE (op2) == STRING_CST)
13729 return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
13730 TREE_STRING_LENGTH (op2), after);
13732 /* Reasonable integer constant can be treated right away. */
13733 if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
13735 static const char *const boolean_true = "true";
13736 static const char *const boolean_false = "false";
13737 static const char *const null_pointer = "null";
13739 const char *string;
13741 if (op2 == boolean_true_node)
13742 string = boolean_true;
13743 else if (op2 == boolean_false_node)
13744 string = boolean_false;
13745 else if (op2 == null_pointer_node
13746 || (integer_zerop (op2)
13747 && TREE_CODE (TREE_TYPE (op2)) == POINTER_TYPE))
13748 /* FIXME: null is not a compile-time constant, so it is only safe to
13749 merge if the overall expression is non-constant. However, this
13750 code always merges without checking the overall expression. */
13751 string = null_pointer;
13752 else if (TREE_TYPE (op2) == char_type_node)
13754 /* Convert the character into UTF-8. */
13755 unsigned int c = (unsigned int) TREE_INT_CST_LOW (op2);
13756 unsigned char *p = (unsigned char *) ch;
13757 if (0x01 <= c && c <= 0x7f)
13758 *p++ = (unsigned char) c;
13759 else if (c < 0x7ff)
13761 *p++ = (unsigned char) (c >> 6 | 0xc0);
13762 *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13766 *p++ = (unsigned char) (c >> 12 | 0xe0);
13767 *p++ = (unsigned char) (((c >> 6) & 0x3f) | 0x80);
13768 *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13775 string = string_convert_int_cst (op2);
13777 return do_merge_string_cste (op1, string, strlen (string), after);
13782 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
13783 has to be a STRING_CST and the other part must be a STRING_CST or a
13784 INTEGRAL constant. Return a new STRING_CST if the operation
13785 succeed, NULL_TREE otherwise.
13787 If the case we want to optimize for space, we might want to return
13788 NULL_TREE for each invocation of this routine. FIXME */
13791 string_constant_concatenation (tree op1, tree op2)
13793 if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
13798 string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
13799 rest = (string == op1 ? op2 : op1);
13800 invert = (string == op1 ? 0 : 1 );
13802 /* Walk REST, only if it looks reasonable */
13803 if (TREE_CODE (rest) != STRING_CST
13804 && !IS_CRAFTED_STRING_BUFFER_P (rest)
13805 && !JSTRING_TYPE_P (TREE_TYPE (rest))
13806 && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
13808 rest = java_complete_tree (rest);
13809 if (rest == error_mark_node)
13810 return error_mark_node;
13811 rest = fold (rest);
13813 return merge_string_cste (string, rest, invert);
13818 /* Implement the `+' operator. Does static optimization if possible,
13819 otherwise create (if necessary) and append elements to a
13820 StringBuffer. The StringBuffer will be carried around until it is
13821 used for a function call or an assignment. Then toString() will be
13822 called on it to turn it into a String object. */
13825 build_string_concatenation (tree op1, tree op2)
13828 int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13830 if (flag_emit_xref)
13831 return build (PLUS_EXPR, string_type_node, op1, op2);
13833 /* Try to do some static optimization */
13834 if ((result = string_constant_concatenation (op1, op2)))
13837 /* Discard empty strings on either side of the expression */
13838 if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
13843 else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
13846 /* If operands are string constant, turn then into object references */
13847 if (TREE_CODE (op1) == STRING_CST)
13848 op1 = patch_string_cst (op1);
13849 if (op2 && TREE_CODE (op2) == STRING_CST)
13850 op2 = patch_string_cst (op2);
13852 /* If either one of the constant is null and the other non null
13853 operand is a String constant, return it. */
13854 if ((TREE_CODE (op1) == STRING_CST) && !op2)
13857 /* If OP1 isn't already a StringBuffer, create and
13858 initialize a new one */
13859 if (!IS_CRAFTED_STRING_BUFFER_P (op1))
13861 /* Two solutions here:
13862 1) OP1 is a constant string reference, we call new StringBuffer(OP1)
13863 2) OP1 is something else, we call new StringBuffer().append(OP1). */
13864 if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
13865 op1 = BUILD_STRING_BUFFER (op1);
13868 tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
13869 op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
13875 /* OP1 is no longer the last node holding a crafted StringBuffer */
13876 IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
13877 /* Create a node for `{new...,xxx}.append (op2)' */
13879 op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
13882 /* Mark the last node holding a crafted StringBuffer */
13883 IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
13885 TREE_SIDE_EFFECTS (op1) = side_effects;
13889 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
13890 StringBuffer. If no string were found to be patched, return
13894 patch_string (tree node)
13896 if (node == error_mark_node)
13897 return error_mark_node;
13898 if (TREE_CODE (node) == STRING_CST)
13899 return patch_string_cst (node);
13900 else if (IS_CRAFTED_STRING_BUFFER_P (node))
13902 int saved = ctxp->explicit_constructor_p;
13903 tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
13905 /* Temporary disable forbid the use of `this'. */
13906 ctxp->explicit_constructor_p = 0;
13907 ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
13908 /* String concatenation arguments must be evaluated in order too. */
13909 ret = force_evaluation_order (ret);
13910 /* Restore it at its previous value */
13911 ctxp->explicit_constructor_p = saved;
13917 /* Build the internal representation of a string constant. */
13920 patch_string_cst (tree node)
13923 if (! flag_emit_class_files)
13925 node = get_identifier (TREE_STRING_POINTER (node));
13926 location = alloc_name_constant (CONSTANT_String, node);
13927 node = build_ref_from_constant_pool (location);
13929 TREE_TYPE (node) = string_ptr_type_node;
13930 TREE_CONSTANT (node) = 1;
13934 /* Build an incomplete unary operator expression. */
13937 build_unaryop (int op_token, int op_location, tree op1)
13943 case PLUS_TK: op = UNARY_PLUS_EXPR; break;
13944 case MINUS_TK: op = NEGATE_EXPR; break;
13945 case NEG_TK: op = TRUTH_NOT_EXPR; break;
13946 case NOT_TK: op = BIT_NOT_EXPR; break;
13950 unaryop = build1 (op, NULL_TREE, op1);
13951 TREE_SIDE_EFFECTS (unaryop) = 1;
13952 /* Store the location of the operator, for better error report. The
13953 string of the operator will be rebuild based on the OP value. */
13954 EXPR_WFL_LINECOL (unaryop) = op_location;
13958 /* Special case for the ++/-- operators, since they require an extra
13959 argument to build, which is set to NULL and patched
13960 later. IS_POST_P is 1 if the operator, 0 otherwise. */
13963 build_incdec (int op_token, int op_location, tree op1, int is_post_p)
13965 static const enum tree_code lookup [2][2] =
13967 { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
13968 { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
13970 tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
13971 NULL_TREE, op1, NULL_TREE);
13972 TREE_SIDE_EFFECTS (node) = 1;
13973 /* Store the location of the operator, for better error report. The
13974 string of the operator will be rebuild based on the OP value. */
13975 EXPR_WFL_LINECOL (node) = op_location;
13979 /* Build an incomplete cast operator, based on the use of the
13980 CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
13981 set. java_complete_tree is trained to walk a CONVERT_EXPR even
13982 though its type is already set. */
13985 build_cast (int location, tree type, tree exp)
13987 tree node = build1 (CONVERT_EXPR, type, exp);
13988 EXPR_WFL_LINECOL (node) = location;
13992 /* Build an incomplete class reference operator. */
13994 build_incomplete_class_ref (int location, tree class_name)
13996 tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
13997 tree class_decl = GET_CPC ();
13998 tree this_class = TREE_TYPE (class_decl);
14000 /* Generate the synthetic static method `class$'. (Previously we
14001 deferred this, causing different method tables to be emitted
14002 for native code and bytecode.) */
14003 if (!TYPE_DOT_CLASS (this_class)
14004 && !JPRIMITIVE_TYPE_P (class_name)
14005 && !(TREE_CODE (class_name) == VOID_TYPE))
14007 tree cpc_list = GET_CPC_LIST();
14008 tree cpc = cpc_list;
14011 /* For inner classes, add a 'class$' method to their outermost
14012 context, creating it if necessary. */
14014 while (GET_NEXT_ENCLOSING_CPC(cpc))
14015 cpc = GET_NEXT_ENCLOSING_CPC(cpc);
14016 class_decl = TREE_VALUE (cpc);
14018 target_class = TREE_TYPE (class_decl);
14020 if (CLASS_INTERFACE (TYPE_NAME (target_class)))
14022 /* For interfaces, adding a static 'class$' method directly
14023 is illegal. So create an inner class to contain the new
14024 method. Empirically this matches the behavior of javac. */
14026 /* We want the generated inner class inside the outermost class. */
14027 GET_CPC_LIST() = cpc;
14028 t = build_wfl_node (DECL_NAME (TYPE_NAME (object_type_node)));
14029 inner = create_anonymous_class (0, t);
14030 target_class = TREE_TYPE (inner);
14031 end_class_declaration (1);
14032 GET_CPC_LIST() = cpc_list;
14035 if (TYPE_DOT_CLASS (target_class) == NULL_TREE)
14036 build_dot_class_method (target_class);
14038 if (this_class != target_class)
14039 TYPE_DOT_CLASS (this_class) = TYPE_DOT_CLASS (target_class);
14042 EXPR_WFL_LINECOL (node) = location;
14046 /* Complete an incomplete class reference operator. */
14048 patch_incomplete_class_ref (tree node)
14050 tree type = TREE_OPERAND (node, 0);
14053 if (!(ref_type = resolve_type_during_patch (type)))
14054 return error_mark_node;
14056 /* If we're not emitting class files and we know ref_type is a
14057 compiled class, build a direct reference. */
14058 if ((! flag_emit_class_files && is_compiled_class (ref_type))
14059 || JPRIMITIVE_TYPE_P (ref_type)
14060 || TREE_CODE (ref_type) == VOID_TYPE)
14062 tree dot = build_class_ref (ref_type);
14063 /* A class referenced by `foo.class' is initialized. */
14064 if (!flag_emit_class_files)
14065 dot = build_class_init (ref_type, dot);
14066 return java_complete_tree (dot);
14069 /* If we're emitting class files and we have to deal with non
14070 primitive types, we invoke the synthetic static method `class$'. */
14071 ref_type = build_dot_class_method_invocation (current_class, ref_type);
14072 return java_complete_tree (ref_type);
14075 /* 15.14 Unary operators. We return error_mark_node in case of error,
14076 but preserve the type of NODE if the type is fixed. */
14079 patch_unaryop (tree node, tree wfl_op)
14081 tree op = TREE_OPERAND (node, 0);
14082 tree op_type = TREE_TYPE (op);
14083 tree prom_type = NULL_TREE, value, decl;
14084 int outer_field_flag = 0;
14085 int code = TREE_CODE (node);
14086 int error_found = 0;
14088 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14092 /* 15.13.2 Postfix Increment Operator ++ */
14093 case POSTINCREMENT_EXPR:
14094 /* 15.13.3 Postfix Increment Operator -- */
14095 case POSTDECREMENT_EXPR:
14096 /* 15.14.1 Prefix Increment Operator ++ */
14097 case PREINCREMENT_EXPR:
14098 /* 15.14.2 Prefix Decrement Operator -- */
14099 case PREDECREMENT_EXPR:
14100 op = decl = strip_out_static_field_access_decl (op);
14101 outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
14102 /* We might be trying to change an outer field accessed using
14104 if (outer_field_flag)
14106 /* Retrieve the decl of the field we're trying to access. We
14107 do that by first retrieving the function we would call to
14108 access the field. It has been already verified that this
14109 field isn't final */
14110 if (flag_emit_class_files)
14111 decl = TREE_OPERAND (op, 0);
14113 decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
14114 decl = DECL_FUNCTION_ACCESS_DECL (decl);
14116 /* We really should have a JAVA_ARRAY_EXPR to avoid this */
14117 else if (!JDECL_P (decl)
14118 && TREE_CODE (decl) != COMPONENT_REF
14119 && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
14120 && TREE_CODE (decl) != INDIRECT_REF
14121 && !(TREE_CODE (decl) == COMPOUND_EXPR
14122 && TREE_OPERAND (decl, 1)
14123 && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
14125 TREE_TYPE (node) = error_mark_node;
14129 /* From now on, we know that op if a variable and that it has a
14130 valid wfl. We use wfl_op to locate errors related to the
14132 if (!JNUMERIC_TYPE_P (op_type))
14134 parse_error_context
14135 (wfl_op, "Invalid argument type `%s' to `%s'",
14136 lang_printable_name (op_type, 0), operator_string (node));
14137 TREE_TYPE (node) = error_mark_node;
14142 /* Before the addition, binary numeric promotion is performed on
14143 both operands, if really necessary */
14144 if (JINTEGRAL_TYPE_P (op_type))
14146 value = build_int_2 (1, 0);
14147 TREE_TYPE (value) = TREE_TYPE (node) = op_type;
14151 value = build_int_2 (1, 0);
14153 binary_numeric_promotion (op_type,
14154 TREE_TYPE (value), &op, &value);
14157 /* We remember we might be accessing an outer field */
14158 if (outer_field_flag)
14160 /* We re-generate an access to the field */
14161 value = build (PLUS_EXPR, TREE_TYPE (op),
14162 build_outer_field_access (wfl_op, decl), value);
14164 /* And we patch the original access$() into a write
14165 with plus_op as a rhs */
14166 return outer_field_access_fix (node, op, value);
14169 /* And write back into the node. */
14170 TREE_OPERAND (node, 0) = op;
14171 TREE_OPERAND (node, 1) = value;
14172 /* Convert the overall back into its original type, if
14173 necessary, and return */
14174 if (JINTEGRAL_TYPE_P (op_type))
14175 return fold (node);
14177 return fold (convert (op_type, node));
14181 /* 15.14.3 Unary Plus Operator + */
14182 case UNARY_PLUS_EXPR:
14183 /* 15.14.4 Unary Minus Operator - */
14185 if (!JNUMERIC_TYPE_P (op_type))
14187 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
14188 TREE_TYPE (node) = error_mark_node;
14191 /* Unary numeric promotion is performed on operand */
14194 op = do_unary_numeric_promotion (op);
14195 prom_type = TREE_TYPE (op);
14196 if (code == UNARY_PLUS_EXPR)
14201 /* 15.14.5 Bitwise Complement Operator ~ */
14203 if (!JINTEGRAL_TYPE_P (op_type))
14205 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
14206 TREE_TYPE (node) = error_mark_node;
14211 op = do_unary_numeric_promotion (op);
14212 prom_type = TREE_TYPE (op);
14216 /* 15.14.6 Logical Complement Operator ! */
14217 case TRUTH_NOT_EXPR:
14218 if (TREE_CODE (op_type) != BOOLEAN_TYPE)
14220 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
14221 /* But the type is known. We will report an error if further
14222 attempt of a assignment is made with this rhs */
14223 TREE_TYPE (node) = boolean_type_node;
14227 prom_type = boolean_type_node;
14230 /* 15.15 Cast Expression */
14232 value = patch_cast (node, wfl_operator);
14233 if (value == error_mark_node)
14235 /* If this cast is part of an assignment, we tell the code
14236 that deals with it not to complain about a mismatch,
14237 because things have been cast, anyways */
14238 TREE_TYPE (node) = error_mark_node;
14243 value = fold (value);
14244 TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
14251 return error_mark_node;
14253 /* There are cases where node has been replaced by something else
14254 and we don't end up returning here: UNARY_PLUS_EXPR,
14255 CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14256 TREE_OPERAND (node, 0) = fold (op);
14257 TREE_TYPE (node) = prom_type;
14258 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
14259 return fold (node);
14262 /* Generic type resolution that sometimes takes place during node
14263 patching. Returned the resolved type or generate an error
14264 message. Return the resolved type or NULL_TREE. */
14267 resolve_type_during_patch (tree type)
14269 if (unresolved_type_p (type, NULL))
14271 tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
14274 parse_error_context (type,
14275 "Class `%s' not found in type declaration",
14276 IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
14280 check_deprecation (type, type_decl);
14282 return TREE_TYPE (type_decl);
14287 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14288 found. Otherwise NODE or something meant to replace it is returned. */
14291 patch_cast (tree node, tree wfl_op)
14293 tree op = TREE_OPERAND (node, 0);
14294 tree cast_type = TREE_TYPE (node);
14295 tree patched, op_type;
14298 /* Some string patching might be necessary at this stage */
14299 if ((patched = patch_string (op)))
14300 TREE_OPERAND (node, 0) = op = patched;
14301 op_type = TREE_TYPE (op);
14303 /* First resolve OP_TYPE if unresolved */
14304 if (!(cast_type = resolve_type_during_patch (cast_type)))
14305 return error_mark_node;
14307 /* Check on cast that are proven correct at compile time */
14308 if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
14311 if (cast_type == op_type)
14314 /* A narrowing conversion from a floating-point number to an
14315 integral type requires special handling (5.1.3). */
14316 if (JFLOAT_TYPE_P (op_type) && JINTEGRAL_TYPE_P (cast_type))
14317 if (cast_type != long_type_node)
14318 op = convert (integer_type_node, op);
14320 /* Try widening/narrowing conversion. Potentially, things need
14321 to be worked out in gcc so we implement the extreme cases
14322 correctly. fold_convert() needs to be fixed. */
14323 return convert (cast_type, op);
14326 /* It's also valid to cast a boolean into a boolean */
14327 if (op_type == boolean_type_node && cast_type == boolean_type_node)
14330 /* null can be casted to references */
14331 if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
14332 return build_null_of_type (cast_type);
14334 /* The remaining legal casts involve conversion between reference
14335 types. Check for their compile time correctness. */
14336 if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
14337 && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
14339 TREE_TYPE (node) = promote_type (cast_type);
14340 /* Now, the case can be determined correct at compile time if
14341 OP_TYPE can be converted into CAST_TYPE by assignment
14342 conversion (5.2) */
14344 if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
14346 TREE_SET_CODE (node, NOP_EXPR);
14350 if (flag_emit_class_files)
14352 TREE_SET_CODE (node, CONVERT_EXPR);
14356 /* The cast requires a run-time check */
14357 return build (CALL_EXPR, promote_type (cast_type),
14358 build_address_of (soft_checkcast_node),
14359 tree_cons (NULL_TREE, build_class_ref (cast_type),
14360 build_tree_list (NULL_TREE, op)),
14364 /* Any other casts are proven incorrect at compile time */
14365 t1 = xstrdup (lang_printable_name (op_type, 0));
14366 parse_error_context (wfl_op, "Invalid cast from `%s' to `%s'",
14367 t1, lang_printable_name (cast_type, 0));
14369 return error_mark_node;
14372 /* Build a null constant and give it the type TYPE. */
14375 build_null_of_type (tree type)
14377 tree node = build_int_2 (0, 0);
14378 TREE_TYPE (node) = promote_type (type);
14382 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14383 a list of indices. */
14385 build_array_ref (int location, tree array, tree index)
14387 tree node = build (ARRAY_REF, NULL_TREE, array, index);
14388 EXPR_WFL_LINECOL (node) = location;
14392 /* 15.12 Array Access Expression */
14395 patch_array_ref (tree node)
14397 tree array = TREE_OPERAND (node, 0);
14398 tree array_type = TREE_TYPE (array);
14399 tree index = TREE_OPERAND (node, 1);
14400 tree index_type = TREE_TYPE (index);
14401 int error_found = 0;
14403 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14405 if (TREE_CODE (array_type) == POINTER_TYPE)
14406 array_type = TREE_TYPE (array_type);
14408 /* The array reference must be an array */
14409 if (!TYPE_ARRAY_P (array_type))
14411 parse_error_context
14413 "`[]' can only be applied to arrays. It can't be applied to `%s'",
14414 lang_printable_name (array_type, 0));
14415 TREE_TYPE (node) = error_mark_node;
14419 /* The array index undergoes unary numeric promotion. The promoted
14420 type must be int */
14421 index = do_unary_numeric_promotion (index);
14422 if (TREE_TYPE (index) != int_type_node)
14424 if (valid_cast_to_p (index_type, int_type_node))
14425 parse_error_context (wfl_operator,
14426 "Incompatible type for `[]'. Explicit cast needed to convert `%s' to `int'",
14427 lang_printable_name (index_type, 0));
14429 parse_error_context (wfl_operator,
14430 "Incompatible type for `[]'. Can't convert `%s' to `int'",
14431 lang_printable_name (index_type, 0));
14432 TREE_TYPE (node) = error_mark_node;
14437 return error_mark_node;
14439 array_type = TYPE_ARRAY_ELEMENT (array_type);
14441 if (flag_emit_class_files || flag_emit_xref)
14443 TREE_OPERAND (node, 0) = array;
14444 TREE_OPERAND (node, 1) = index;
14447 node = build_java_arrayaccess (array, array_type, index);
14448 TREE_TYPE (node) = array_type;
14452 /* 15.9 Array Creation Expressions */
14455 build_newarray_node (tree type, tree dims, int extra_dims)
14458 build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
14459 build_int_2 (extra_dims, 0));
14464 patch_newarray (tree node)
14466 tree type = TREE_OPERAND (node, 0);
14467 tree dims = TREE_OPERAND (node, 1);
14468 tree cdim, array_type;
14469 int error_found = 0;
14471 int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
14473 /* Dimension types are verified. It's better for the types to be
14474 verified in order. */
14475 for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
14478 tree dim = TREE_VALUE (cdim);
14480 /* Dim might have been saved during its evaluation */
14481 dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
14483 /* The type of each specified dimension must be an integral type. */
14484 if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
14487 /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14488 promoted type must be int. */
14491 dim = do_unary_numeric_promotion (dim);
14492 if (TREE_TYPE (dim) != int_type_node)
14496 /* Report errors on types here */
14499 parse_error_context
14500 (TREE_PURPOSE (cdim),
14501 "Incompatible type for dimension in array creation expression. %s convert `%s' to `int'",
14502 (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
14503 "Explicit cast needed to" : "Can't"),
14504 lang_printable_name (TREE_TYPE (dim), 0));
14508 TREE_PURPOSE (cdim) = NULL_TREE;
14511 /* Resolve array base type if unresolved */
14512 if (!(type = resolve_type_during_patch (type)))
14517 /* We don't want further evaluation of this bogus array creation
14519 TREE_TYPE (node) = error_mark_node;
14520 return error_mark_node;
14523 /* Set array_type to the actual (promoted) array type of the result. */
14524 if (TREE_CODE (type) == RECORD_TYPE)
14525 type = build_pointer_type (type);
14526 while (--xdims >= 0)
14528 type = promote_type (build_java_array_type (type, -1));
14530 dims = nreverse (dims);
14532 for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
14536 = build_java_array_type (type,
14537 TREE_CODE (cdim) == INTEGER_CST
14538 ? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
14540 array_type = promote_type (array_type);
14542 dims = nreverse (dims);
14544 /* The node is transformed into a function call. Things are done
14545 differently according to the number of dimensions. If the number
14546 of dimension is equal to 1, then the nature of the base type
14547 (primitive or not) matters. */
14549 return build_new_array (type, TREE_VALUE (dims));
14551 /* Can't reuse what's already written in expr.c because it uses the
14552 JVM stack representation. Provide a build_multianewarray. FIXME */
14553 return build (CALL_EXPR, array_type,
14554 build_address_of (soft_multianewarray_node),
14555 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
14556 tree_cons (NULL_TREE,
14557 build_int_2 (ndims, 0), dims )),
14561 /* 10.6 Array initializer. */
14563 /* Build a wfl for array element that don't have one, so we can
14564 pin-point errors. */
14567 maybe_build_array_element_wfl (tree node)
14569 if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
14570 return build_expr_wfl (NULL_TREE, ctxp->filename,
14571 ctxp->elc.line, ctxp->elc.prev_col);
14576 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14577 identification of initialized arrays easier to detect during walk
14581 build_new_array_init (int location, tree values)
14583 tree constructor = build_constructor (NULL_TREE, values);
14584 tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
14585 EXPR_WFL_LINECOL (to_return) = location;
14589 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14590 occurred. Otherwise return NODE after having set its type
14594 patch_new_array_init (tree type, tree node)
14596 int error_seen = 0;
14597 tree current, element_type;
14598 HOST_WIDE_INT length;
14599 int all_constant = 1;
14600 tree init = TREE_OPERAND (node, 0);
14602 if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
14604 parse_error_context (node,
14605 "Invalid array initializer for non-array type `%s'",
14606 lang_printable_name (type, 1));
14607 return error_mark_node;
14609 type = TREE_TYPE (type);
14610 element_type = TYPE_ARRAY_ELEMENT (type);
14612 CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
14614 for (length = 0, current = CONSTRUCTOR_ELTS (init);
14615 current; length++, current = TREE_CHAIN (current))
14617 tree elt = TREE_VALUE (current);
14618 if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
14620 error_seen |= array_constructor_check_entry (element_type, current);
14621 elt = TREE_VALUE (current);
14622 /* When compiling to native code, STRING_CST is converted to
14623 INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14624 if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
14629 TREE_VALUE (current) = patch_new_array_init (element_type, elt);
14630 TREE_PURPOSE (current) = NULL_TREE;
14633 if (elt && TREE_CODE (elt) == TREE_LIST
14634 && TREE_VALUE (elt) == error_mark_node)
14639 return error_mark_node;
14641 /* Create a new type. We can't reuse the one we have here by
14642 patching its dimension because it originally is of dimension -1
14643 hence reused by gcc. This would prevent triangular arrays. */
14644 type = build_java_array_type (element_type, length);
14645 TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
14646 TREE_TYPE (node) = promote_type (type);
14647 TREE_CONSTANT (init) = all_constant;
14648 TREE_CONSTANT (node) = all_constant;
14652 /* Verify that one entry of the initializer element list can be
14653 assigned to the array base type. Report 1 if an error occurred, 0
14657 array_constructor_check_entry (tree type, tree entry)
14659 char *array_type_string = NULL; /* For error reports */
14660 tree value, type_value, new_value, wfl_value, patched;
14661 int error_seen = 0;
14663 new_value = NULL_TREE;
14664 wfl_value = TREE_VALUE (entry);
14666 value = java_complete_tree (TREE_VALUE (entry));
14667 /* patch_string return error_mark_node if arg is error_mark_node */
14668 if ((patched = patch_string (value)))
14670 if (value == error_mark_node)
14673 type_value = TREE_TYPE (value);
14675 /* At anytime, try_builtin_assignconv can report a warning on
14676 constant overflow during narrowing. */
14677 SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
14678 new_value = try_builtin_assignconv (wfl_operator, type, value);
14679 if (!new_value && (new_value = try_reference_assignconv (type, value)))
14680 type_value = promote_type (type);
14682 /* Check and report errors */
14685 const char *const msg = (!valid_cast_to_p (type_value, type) ?
14686 "Can't" : "Explicit cast needed to");
14687 if (!array_type_string)
14688 array_type_string = xstrdup (lang_printable_name (type, 1));
14689 parse_error_context
14690 (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
14691 msg, lang_printable_name (type_value, 1), array_type_string);
14696 TREE_VALUE (entry) = new_value;
14698 if (array_type_string)
14699 free (array_type_string);
14701 TREE_PURPOSE (entry) = NULL_TREE;
14706 build_this (int location)
14708 tree node = build_wfl_node (this_identifier_node);
14709 TREE_SET_CODE (node, THIS_EXPR);
14710 EXPR_WFL_LINECOL (node) = location;
14714 /* 14.15 The return statement. It builds a modify expression that
14715 assigns the returned value to the RESULT_DECL that hold the value
14719 build_return (int location, tree op)
14721 tree node = build1 (RETURN_EXPR, NULL_TREE, op);
14722 EXPR_WFL_LINECOL (node) = location;
14723 node = build_debugable_stmt (location, node);
14728 patch_return (tree node)
14730 tree return_exp = TREE_OPERAND (node, 0);
14731 tree meth = current_function_decl;
14732 tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
14733 int error_found = 0;
14735 TREE_TYPE (node) = error_mark_node;
14736 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14738 /* It's invalid to have a return value within a function that is
14739 declared with the keyword void or that is a constructor */
14740 if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
14743 /* It's invalid to use a return statement in a static block */
14744 if (DECL_CLINIT_P (current_function_decl))
14747 /* It's invalid to have a no return value within a function that
14748 isn't declared with the keyword `void' */
14749 if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
14752 if (DECL_INSTINIT_P (current_function_decl))
14757 if (DECL_INSTINIT_P (current_function_decl))
14758 parse_error_context (wfl_operator,
14759 "`return' inside instance initializer");
14761 else if (DECL_CLINIT_P (current_function_decl))
14762 parse_error_context (wfl_operator,
14763 "`return' inside static initializer");
14765 else if (!DECL_CONSTRUCTOR_P (meth))
14767 char *t = xstrdup (lang_printable_name (mtype, 0));
14768 parse_error_context (wfl_operator,
14769 "`return' with%s value from `%s %s'",
14770 (error_found == 1 ? "" : "out"),
14771 t, lang_printable_name (meth, 0));
14775 parse_error_context (wfl_operator,
14776 "`return' with value from constructor `%s'",
14777 lang_printable_name (meth, 0));
14778 return error_mark_node;
14781 /* If we have a return_exp, build a modify expression and expand
14782 it. Note: at that point, the assignment is declared valid, but we
14783 may want to carry some more hacks */
14786 tree exp = java_complete_tree (return_exp);
14787 tree modify, patched;
14789 if ((patched = patch_string (exp)))
14792 modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
14793 EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
14794 modify = java_complete_tree (modify);
14796 if (modify != error_mark_node)
14798 TREE_SIDE_EFFECTS (modify) = 1;
14799 TREE_OPERAND (node, 0) = modify;
14802 return error_mark_node;
14804 TREE_TYPE (node) = void_type_node;
14805 TREE_SIDE_EFFECTS (node) = 1;
14809 /* 14.8 The if Statement */
14812 build_if_else_statement (int location, tree expression, tree if_body,
14817 else_body = empty_stmt_node;
14818 node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
14819 EXPR_WFL_LINECOL (node) = location;
14820 node = build_debugable_stmt (location, node);
14825 patch_if_else_statement (tree node)
14827 tree expression = TREE_OPERAND (node, 0);
14828 int can_complete_normally
14829 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
14830 | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
14832 TREE_TYPE (node) = error_mark_node;
14833 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14835 /* The type of expression must be boolean */
14836 if (TREE_TYPE (expression) != boolean_type_node
14837 && TREE_TYPE (expression) != promoted_boolean_type_node)
14839 parse_error_context
14841 "Incompatible type for `if'. Can't convert `%s' to `boolean'",
14842 lang_printable_name (TREE_TYPE (expression), 0));
14843 return error_mark_node;
14846 if (TREE_CODE (expression) == INTEGER_CST)
14848 if (integer_zerop (expression))
14849 node = TREE_OPERAND (node, 2);
14851 node = TREE_OPERAND (node, 1);
14852 if (CAN_COMPLETE_NORMALLY (node) != can_complete_normally)
14854 node = build (COMPOUND_EXPR, void_type_node, node, empty_stmt_node);
14855 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14859 TREE_TYPE (node) = void_type_node;
14860 TREE_SIDE_EFFECTS (node) = 1;
14861 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14865 /* 14.6 Labeled Statements */
14867 /* Action taken when a labeled statement is parsed. a new
14868 LABELED_BLOCK_EXPR is created. No statement is attached to the
14869 label, yet. LABEL can be NULL_TREE for artificially-generated blocks. */
14872 build_labeled_block (int location, tree label)
14875 tree label_decl, node;
14876 if (label == NULL_TREE || label == continue_identifier_node)
14877 label_name = label;
14880 label_name = merge_qualified_name (label_id, label);
14881 /* Issue an error if we try to reuse a label that was previously
14883 if (IDENTIFIER_LOCAL_VALUE (label_name))
14885 EXPR_WFL_LINECOL (wfl_operator) = location;
14886 parse_error_context (wfl_operator,
14887 "Declaration of `%s' shadows a previous label declaration",
14888 IDENTIFIER_POINTER (label));
14889 EXPR_WFL_LINECOL (wfl_operator) =
14890 EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
14891 parse_error_context (wfl_operator,
14892 "This is the location of the previous declaration of label `%s'",
14893 IDENTIFIER_POINTER (label));
14894 java_error_count--;
14898 label_decl = create_label_decl (label_name);
14899 node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
14900 EXPR_WFL_LINECOL (node) = location;
14901 TREE_SIDE_EFFECTS (node) = 1;
14905 /* A labeled statement LBE is attached a statement. */
14908 finish_labeled_statement (tree lbe, /* Labeled block expr */
14911 /* In anyways, tie the loop to its statement */
14912 LABELED_BLOCK_BODY (lbe) = statement;
14913 pop_labeled_block ();
14914 POP_LABELED_BLOCK ();
14918 /* 14.10, 14.11, 14.12 Loop Statements */
14920 /* Create an empty LOOP_EXPR and make it the last in the nested loop
14924 build_new_loop (tree loop_body)
14926 tree loop = build (LOOP_EXPR, NULL_TREE, loop_body);
14927 TREE_SIDE_EFFECTS (loop) = 1;
14932 /* Create a loop body according to the following structure:
14934 COMPOUND_EXPR (loop main body)
14935 EXIT_EXPR (this order is for while/for loops.
14936 LABELED_BLOCK_EXPR the order is reversed for do loops)
14937 LABEL_DECL (a continue occurring here branches at the
14938 BODY end of this labeled block)
14941 REVERSED, if nonzero, tells that the loop condition expr comes
14942 after the body, like in the do-while loop.
14944 To obtain a loop, the loop body structure described above is
14945 encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
14948 LABEL_DECL (use this label to exit the loop)
14950 <structure described above> */
14953 build_loop_body (int location, tree condition, int reversed)
14955 tree first, second, body;
14957 condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
14958 EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
14959 condition = build_debugable_stmt (location, condition);
14960 TREE_SIDE_EFFECTS (condition) = 1;
14962 body = build_labeled_block (0, continue_identifier_node);
14963 first = (reversed ? body : condition);
14964 second = (reversed ? condition : body);
14966 build (COMPOUND_EXPR, NULL_TREE,
14967 build (COMPOUND_EXPR, NULL_TREE, first, second), empty_stmt_node);
14970 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
14971 their order) on the current loop. Unlink the current loop from the
14975 finish_loop_body (int location, tree condition, tree body, int reversed)
14977 tree to_return = ctxp->current_loop;
14978 tree loop_body = LOOP_EXPR_BODY (to_return);
14981 tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
14982 /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
14983 The real EXIT_EXPR is one operand further. */
14984 EXPR_WFL_LINECOL (cnode) = location;
14985 /* This one is for accurate error reports */
14986 EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
14987 TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
14989 LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
14994 /* Tailored version of finish_loop_body for FOR loops, when FOR
14995 loops feature the condition part */
14998 finish_for_loop (int location, tree condition, tree update, tree body)
15000 /* Put the condition and the loop body in place */
15001 tree loop = finish_loop_body (location, condition, body, 0);
15002 /* LOOP is the current loop which has been now popped of the loop
15003 stack. Mark the update block as reachable and install it. We do
15004 this because the (current interpretation of the) JLS requires
15005 that the update expression be considered reachable even if the
15006 for loop's body doesn't complete normally. */
15007 if (update != NULL_TREE && update != empty_stmt_node)
15010 if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
15011 up2 = EXPR_WFL_NODE (up2);
15012 /* It is possible for the update expression to be an
15013 EXPR_WFL_NODE wrapping nothing. */
15014 if (up2 != NULL_TREE && up2 != empty_stmt_node)
15016 /* Try to detect constraint violations. These would be
15017 programming errors somewhere. */
15018 if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
15019 || TREE_CODE (up2) == LOOP_EXPR)
15021 SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
15024 LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
15028 /* Try to find the loop a block might be related to. This comprises
15029 the case where the LOOP_EXPR is found as the second operand of a
15030 COMPOUND_EXPR, because the loop happens to have an initialization
15031 part, then expressed as the first operand of the COMPOUND_EXPR. If
15032 the search finds something, 1 is returned. Otherwise, 0 is
15033 returned. The search is assumed to start from a
15034 LABELED_BLOCK_EXPR's block. */
15037 search_loop (tree statement)
15039 if (TREE_CODE (statement) == LOOP_EXPR)
15042 if (TREE_CODE (statement) == BLOCK)
15043 statement = BLOCK_SUBBLOCKS (statement);
15047 if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15048 while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15049 statement = TREE_OPERAND (statement, 1);
15051 return (TREE_CODE (statement) == LOOP_EXPR
15052 && FOR_LOOP_P (statement) ? statement : NULL_TREE);
15055 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
15056 returned otherwise. */
15059 labeled_block_contains_loop_p (tree block, tree loop)
15064 if (LABELED_BLOCK_BODY (block) == loop)
15067 if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
15073 /* If the loop isn't surrounded by a labeled statement, create one and
15074 insert LOOP as its body. */
15077 patch_loop_statement (tree loop)
15081 TREE_TYPE (loop) = void_type_node;
15082 if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
15085 loop_label = build_labeled_block (0, NULL_TREE);
15086 /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
15087 that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
15088 LABELED_BLOCK_BODY (loop_label) = loop;
15089 PUSH_LABELED_BLOCK (loop_label);
15093 /* 14.13, 14.14: break and continue Statements */
15095 /* Build a break or a continue statement. a null NAME indicates an
15096 unlabeled break/continue statement. */
15099 build_bc_statement (int location, int is_break, tree name)
15101 tree break_continue, label_block_expr = NULL_TREE;
15105 if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
15106 (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
15107 /* Null means that we don't have a target for this named
15108 break/continue. In this case, we make the target to be the
15109 label name, so that the error can be reported accurately in
15110 patch_bc_statement. */
15111 label_block_expr = EXPR_WFL_NODE (name);
15113 /* Unlabeled break/continue will be handled during the
15114 break/continue patch operation */
15116 = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
15118 IS_BREAK_STMT_P (break_continue) = is_break;
15119 TREE_SIDE_EFFECTS (break_continue) = 1;
15120 EXPR_WFL_LINECOL (break_continue) = location;
15121 break_continue = build_debugable_stmt (location, break_continue);
15122 return break_continue;
15125 /* Verification of a break/continue statement. */
15128 patch_bc_statement (tree node)
15130 tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
15131 tree labeled_block = ctxp->current_labeled_block;
15132 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15134 /* Having an identifier here means that the target is unknown. */
15135 if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
15137 parse_error_context (wfl_operator, "No label definition found for `%s'",
15138 IDENTIFIER_POINTER (bc_label));
15139 return error_mark_node;
15141 if (! IS_BREAK_STMT_P (node))
15143 /* It's a continue statement. */
15144 for (;; labeled_block = TREE_CHAIN (labeled_block))
15146 if (labeled_block == NULL_TREE)
15148 if (bc_label == NULL_TREE)
15149 parse_error_context (wfl_operator,
15150 "`continue' must be in loop");
15152 parse_error_context
15153 (wfl_operator, "continue label `%s' does not name a loop",
15154 IDENTIFIER_POINTER (bc_label));
15155 return error_mark_node;
15157 if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
15158 == continue_identifier_node)
15159 && (bc_label == NULL_TREE
15160 || TREE_CHAIN (labeled_block) == bc_label))
15162 bc_label = labeled_block;
15167 else if (!bc_label)
15169 for (;; labeled_block = TREE_CHAIN (labeled_block))
15171 if (labeled_block == NULL_TREE)
15173 parse_error_context (wfl_operator,
15174 "`break' must be in loop or switch");
15175 return error_mark_node;
15177 target_stmt = LABELED_BLOCK_BODY (labeled_block);
15178 if (TREE_CODE (target_stmt) == SWITCH_EXPR
15179 || search_loop (target_stmt))
15181 bc_label = labeled_block;
15187 EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
15188 CAN_COMPLETE_NORMALLY (bc_label) = 1;
15190 /* Our break/continue don't return values. */
15191 TREE_TYPE (node) = void_type_node;
15192 /* Encapsulate the break within a compound statement so that it's
15193 expanded all the times by expand_expr (and not clobbered
15194 sometimes, like after a if statement) */
15195 node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
15196 TREE_SIDE_EFFECTS (node) = 1;
15200 /* Process the exit expression belonging to a loop. Its type must be
15204 patch_exit_expr (tree node)
15206 tree expression = TREE_OPERAND (node, 0);
15207 TREE_TYPE (node) = error_mark_node;
15208 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15210 /* The type of expression must be boolean */
15211 if (TREE_TYPE (expression) != boolean_type_node)
15213 parse_error_context
15215 "Incompatible type for loop conditional. Can't convert `%s' to `boolean'",
15216 lang_printable_name (TREE_TYPE (expression), 0));
15217 return error_mark_node;
15219 /* Now we know things are allright, invert the condition, fold and
15221 TREE_OPERAND (node, 0) =
15222 fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
15224 if (! integer_zerop (TREE_OPERAND (node, 0))
15225 && ctxp->current_loop != NULL_TREE
15226 && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
15227 CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
15228 if (! integer_onep (TREE_OPERAND (node, 0)))
15229 CAN_COMPLETE_NORMALLY (node) = 1;
15232 TREE_TYPE (node) = void_type_node;
15236 /* 14.9 Switch statement */
15239 patch_switch_statement (tree node)
15241 tree se = TREE_OPERAND (node, 0), se_type;
15244 /* Complete the switch expression */
15245 se = TREE_OPERAND (node, 0) = java_complete_tree (se);
15246 se_type = TREE_TYPE (se);
15247 /* The type of the switch expression must be char, byte, short or
15249 if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
15251 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15252 parse_error_context (wfl_operator,
15253 "Incompatible type for `switch'. Can't convert `%s' to `int'",
15254 lang_printable_name (se_type, 0));
15255 /* This is what java_complete_tree will check */
15256 TREE_OPERAND (node, 0) = error_mark_node;
15257 return error_mark_node;
15260 /* Save and restore the outer case label list. */
15261 save = case_label_list;
15262 case_label_list = NULL_TREE;
15264 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
15266 /* See if we've found a duplicate label. We can't leave this until
15267 code generation, because in `--syntax-only' and `-C' modes we
15268 don't do ordinary code generation. */
15269 for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
15271 HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
15273 for (subiter = TREE_CHAIN (iter);
15274 subiter != NULL_TREE;
15275 subiter = TREE_CHAIN (subiter))
15277 HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
15280 EXPR_WFL_LINECOL (wfl_operator)
15281 = EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
15282 /* The case_label_list is in reverse order, so print the
15283 outer label first. */
15284 parse_error_context (wfl_operator, "duplicate case label: `"
15285 HOST_WIDE_INT_PRINT_DEC "'", subval);
15286 EXPR_WFL_LINECOL (wfl_operator)
15287 = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
15288 parse_error_context (wfl_operator, "original label is here");
15295 case_label_list = save;
15297 /* Ready to return */
15298 if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
15300 TREE_TYPE (node) = error_mark_node;
15301 return error_mark_node;
15303 TREE_TYPE (node) = void_type_node;
15304 TREE_SIDE_EFFECTS (node) = 1;
15305 CAN_COMPLETE_NORMALLY (node)
15306 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15307 || ! SWITCH_HAS_DEFAULT (node);
15313 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15314 might be NULL_TREE. */
15316 build_assertion (int location, tree condition, tree value)
15319 tree klass = GET_CPC ();
15321 if (! enable_assertions (klass))
15323 condition = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15324 boolean_false_node, condition);
15325 if (value == NULL_TREE)
15326 value = empty_stmt_node;
15327 return build_if_else_statement (location, condition,
15331 if (! CLASS_USES_ASSERTIONS (klass))
15333 tree field, classdollar, id, call;
15334 tree class_type = TREE_TYPE (klass);
15336 field = add_field (class_type,
15337 get_identifier ("$assertionsDisabled"),
15339 ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
15340 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
15341 FIELD_SYNTHETIC (field) = 1;
15343 classdollar = build_incomplete_class_ref (location, class_type);
15345 /* Call CLASS.desiredAssertionStatus(). */
15346 id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
15347 call = build (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
15348 call = make_qualified_primary (classdollar, call, location);
15349 TREE_SIDE_EFFECTS (call) = 1;
15351 /* Invert to obtain !CLASS.desiredAssertionStatus(). This may
15352 seem odd, but we do it to generate code identical to that of
15354 call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
15355 TREE_SIDE_EFFECTS (call) = 1;
15356 DECL_INITIAL (field) = call;
15358 /* Record the initializer in the initializer statement list. */
15359 call = build (MODIFY_EXPR, NULL_TREE, field, call);
15360 TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
15361 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
15362 MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
15364 CLASS_USES_ASSERTIONS (klass) = 1;
15367 if (value != NULL_TREE)
15368 value = tree_cons (NULL_TREE, value, NULL_TREE);
15370 node = build_wfl_node (get_identifier ("java"));
15371 node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
15373 node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
15376 node = build (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
15377 TREE_SIDE_EFFECTS (node) = 1;
15378 /* It is too early to use BUILD_THROW. */
15379 node = build1 (THROW_EXPR, NULL_TREE, node);
15380 TREE_SIDE_EFFECTS (node) = 1;
15382 /* We invert the condition; if we just put NODE as the `else' part
15383 then we generate weird-looking bytecode. */
15384 condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
15385 /* Check $assertionsDisabled. */
15387 = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15388 build1 (TRUTH_NOT_EXPR, NULL_TREE,
15389 build_wfl_node (get_identifier ("$assertionsDisabled"))),
15391 node = build_if_else_statement (location, condition, node, NULL_TREE);
15395 /* 14.18 The try/catch statements */
15397 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15398 catches TYPE and executes CATCH_STMTS. */
15401 encapsulate_with_try_catch (int location, tree type_or_name, tree try_stmts,
15404 tree try_block, catch_clause_param, catch_block, catch;
15406 /* First build a try block */
15407 try_block = build_expr_block (try_stmts, NULL_TREE);
15409 /* Build a catch block: we need a catch clause parameter */
15410 if (TREE_CODE (type_or_name) == EXPR_WITH_FILE_LOCATION)
15412 tree catch_type = obtain_incomplete_type (type_or_name);
15414 catch_clause_param = build_decl (VAR_DECL, wpv_id, catch_type);
15415 register_incomplete_type (JDEP_VARIABLE, type_or_name,
15416 catch_clause_param, catch_type);
15417 dep = CLASSD_LAST (ctxp->classd_list);
15418 JDEP_GET_PATCH (dep) = &TREE_TYPE (catch_clause_param);
15421 catch_clause_param = build_decl (VAR_DECL, wpv_id,
15422 build_pointer_type (type_or_name));
15425 catch_block = build_expr_block (NULL_TREE, catch_clause_param);
15427 /* Initialize the variable and store in the block */
15428 catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param,
15429 build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
15430 add_stmt_to_block (catch_block, NULL_TREE, catch);
15432 /* Add the catch statements */
15433 add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
15435 /* Now we can build a CATCH_EXPR */
15436 catch_block = build1 (CATCH_EXPR, NULL_TREE, catch_block);
15438 return build_try_statement (location, try_block, catch_block);
15442 build_try_statement (int location, tree try_block, tree catches)
15444 tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
15445 EXPR_WFL_LINECOL (node) = location;
15450 build_try_finally_statement (int location, tree try_block, tree finally)
15452 tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
15453 EXPR_WFL_LINECOL (node) = location;
15458 patch_try_statement (tree node)
15460 int error_found = 0;
15461 tree try = TREE_OPERAND (node, 0);
15462 /* Exception handlers are considered in left to right order */
15463 tree catch = nreverse (TREE_OPERAND (node, 1));
15464 tree current, caught_type_list = NULL_TREE;
15466 /* Check catch clauses, if any. Every time we find an error, we try
15467 to process the next catch clause. We process the catch clause before
15468 the try block so that when processing the try block we can check thrown
15469 exceptions againts the caught type list. */
15470 for (current = catch; current; current = TREE_CHAIN (current))
15472 tree carg_decl, carg_type;
15473 tree sub_current, catch_block, catch_clause;
15476 /* At this point, the structure of the catch clause is
15477 CATCH_EXPR (catch node)
15478 BLOCK (with the decl of the parameter)
15480 MODIFY_EXPR (assignment of the catch parameter)
15481 BLOCK (catch clause block)
15483 catch_clause = TREE_OPERAND (current, 0);
15484 carg_decl = BLOCK_EXPR_DECLS (catch_clause);
15485 carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
15487 /* Catch clauses can't have more than one parameter declared,
15488 but it's already enforced by the grammar. Make sure that the
15489 only parameter of the clause statement in of class Throwable
15490 or a subclass of Throwable, but that was done earlier. The
15491 catch clause parameter type has also been resolved. */
15493 /* Just make sure that the catch clause parameter type inherits
15494 from java.lang.Throwable */
15495 if (!inherits_from_p (carg_type, throwable_type_node))
15497 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15498 parse_error_context (wfl_operator,
15499 "Can't catch class `%s'. Catch clause parameter type must be a subclass of class `java.lang.Throwable'",
15500 lang_printable_name (carg_type, 0));
15505 /* Partial check for unreachable catch statement: The catch
15506 clause is reachable iff is no earlier catch block A in
15507 the try statement such that the type of the catch
15508 clause's parameter is the same as or a subclass of the
15509 type of A's parameter */
15511 for (sub_current = catch;
15512 sub_current != current; sub_current = TREE_CHAIN (sub_current))
15514 tree sub_catch_clause, decl;
15515 sub_catch_clause = TREE_OPERAND (sub_current, 0);
15516 decl = BLOCK_EXPR_DECLS (sub_catch_clause);
15518 if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
15520 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15521 parse_error_context
15523 "`catch' not reached because of the catch clause at line %d",
15524 EXPR_WFL_LINENO (sub_current));
15525 unreachable = error_found = 1;
15529 /* Complete the catch clause block */
15530 catch_block = java_complete_tree (TREE_OPERAND (current, 0));
15531 if (catch_block == error_mark_node)
15536 if (CAN_COMPLETE_NORMALLY (catch_block))
15537 CAN_COMPLETE_NORMALLY (node) = 1;
15538 TREE_OPERAND (current, 0) = catch_block;
15543 /* Things to do here: the exception must be thrown */
15545 /* Link this type to the caught type list */
15546 caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
15549 PUSH_EXCEPTIONS (caught_type_list);
15550 if ((try = java_complete_tree (try)) == error_mark_node)
15552 if (CAN_COMPLETE_NORMALLY (try))
15553 CAN_COMPLETE_NORMALLY (node) = 1;
15556 /* Verification ends here */
15558 return error_mark_node;
15560 TREE_OPERAND (node, 0) = try;
15561 TREE_OPERAND (node, 1) = catch;
15562 TREE_TYPE (node) = void_type_node;
15566 /* 14.17 The synchronized Statement */
15569 patch_synchronized_statement (tree node, tree wfl_op1)
15571 tree expr = java_complete_tree (TREE_OPERAND (node, 0));
15572 tree block = TREE_OPERAND (node, 1);
15574 tree tmp, enter, exit, expr_decl, assignment;
15576 if (expr == error_mark_node)
15578 block = java_complete_tree (block);
15582 /* We might be trying to synchronize on a STRING_CST */
15583 if ((tmp = patch_string (expr)))
15586 /* The TYPE of expr must be a reference type */
15587 if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
15589 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15590 parse_error_context (wfl_operator, "Incompatible type for `synchronized'. Can't convert `%s' to `java.lang.Object'",
15591 lang_printable_name (TREE_TYPE (expr), 0));
15592 return error_mark_node;
15595 if (flag_emit_xref)
15597 TREE_OPERAND (node, 0) = expr;
15598 TREE_OPERAND (node, 1) = java_complete_tree (block);
15599 CAN_COMPLETE_NORMALLY (node) = 1;
15603 /* Generate a try-finally for the synchronized statement, except
15604 that the handler that catches all throw exception calls
15605 _Jv_MonitorExit and then rethrow the exception.
15606 The synchronized statement is then implemented as:
15609 _Jv_MonitorEnter (expression)
15611 _Jv_MonitorExit (expression)
15615 e = _Jv_exception_info ();
15616 _Jv_MonitorExit (expression)
15620 expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
15621 BUILD_MONITOR_ENTER (enter, expr_decl);
15622 BUILD_MONITOR_EXIT (exit, expr_decl);
15623 CAN_COMPLETE_NORMALLY (enter) = 1;
15624 CAN_COMPLETE_NORMALLY (exit) = 1;
15625 assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
15626 TREE_SIDE_EFFECTS (assignment) = 1;
15627 node = build (COMPOUND_EXPR, NULL_TREE,
15628 build (COMPOUND_EXPR, NULL_TREE, assignment, enter),
15629 build (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
15630 node = build_expr_block (node, expr_decl);
15632 return java_complete_tree (node);
15635 /* 14.16 The throw Statement */
15638 patch_throw_statement (tree node, tree wfl_op1)
15640 tree expr = TREE_OPERAND (node, 0);
15641 tree type = TREE_TYPE (expr);
15642 int unchecked_ok = 0, tryblock_throws_ok = 0;
15644 /* Thrown expression must be assignable to java.lang.Throwable */
15645 if (!try_reference_assignconv (throwable_type_node, expr))
15647 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15648 parse_error_context (wfl_operator,
15649 "Can't throw `%s'; it must be a subclass of class `java.lang.Throwable'",
15650 lang_printable_name (type, 0));
15651 /* If the thrown expression was a reference, we further the
15652 compile-time check. */
15653 if (!JREFERENCE_TYPE_P (type))
15654 return error_mark_node;
15657 /* At least one of the following must be true */
15659 /* The type of the throw expression is a not checked exception,
15660 i.e. is a unchecked expression. */
15661 unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
15663 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15664 /* An instance can't throw a checked exception unless that exception
15665 is explicitly declared in the `throws' clause of each
15666 constructor. This doesn't apply to anonymous classes, since they
15667 don't have declared constructors. */
15669 && DECL_INSTINIT_P (current_function_decl)
15670 && !ANONYMOUS_CLASS_P (current_class))
15673 for (current = TYPE_METHODS (current_class); current;
15674 current = TREE_CHAIN (current))
15675 if (DECL_CONSTRUCTOR_P (current)
15676 && !check_thrown_exceptions_do (TREE_TYPE (expr)))
15678 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)",
15679 lang_printable_name (TREE_TYPE (expr), 0));
15680 return error_mark_node;
15684 /* Throw is contained in a try statement and at least one catch
15685 clause can receive the thrown expression or the current method is
15686 declared to throw such an exception. Or, the throw statement is
15687 contained in a method or constructor declaration and the type of
15688 the Expression is assignable to at least one type listed in the
15689 throws clause the declaration. */
15691 tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
15692 if (!(unchecked_ok || tryblock_throws_ok))
15694 /* If there is a surrounding try block that has no matching
15695 clatch clause, report it first. A surrounding try block exits
15696 only if there is something after the list of checked
15697 exception thrown by the current function (if any). */
15698 if (IN_TRY_BLOCK_P ())
15699 parse_error_context (wfl_operator, "Checked exception `%s' can't be caught by any of the catch clause(s) of the surrounding `try' block",
15700 lang_printable_name (type, 0));
15701 /* If we have no surrounding try statement and the method doesn't have
15702 any throws, report it now. FIXME */
15704 /* We report that the exception can't be throw from a try block
15705 in all circumstances but when the `throw' is inside a static
15707 else if (!EXCEPTIONS_P (currently_caught_type_list)
15708 && !tryblock_throws_ok)
15710 if (DECL_CLINIT_P (current_function_decl))
15711 parse_error_context (wfl_operator,
15712 "Checked exception `%s' can't be thrown in initializer",
15713 lang_printable_name (type, 0));
15715 parse_error_context (wfl_operator,
15716 "Checked exception `%s' isn't thrown from a `try' block",
15717 lang_printable_name (type, 0));
15719 /* Otherwise, the current method doesn't have the appropriate
15720 throws declaration */
15722 parse_error_context (wfl_operator, "Checked exception `%s' doesn't match any of current method's `throws' declaration(s)",
15723 lang_printable_name (type, 0));
15724 return error_mark_node;
15727 if (! flag_emit_class_files && ! flag_emit_xref)
15728 BUILD_THROW (node, expr);
15730 /* If doing xrefs, keep the location where the `throw' was seen. */
15731 if (flag_emit_xref)
15732 EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
15736 /* Check that exception said to be thrown by method DECL can be
15737 effectively caught from where DECL is invoked. THIS_EXPR is the
15738 expression that computes `this' for the method call. */
15740 check_thrown_exceptions (int location, tree decl, tree this_expr)
15743 int is_array_call = 0;
15745 /* Skip check within generated methods, such as access$<n>. */
15746 if (OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
15749 if (this_expr != NULL_TREE
15750 && TREE_CODE (TREE_TYPE (this_expr)) == POINTER_TYPE
15751 && TYPE_ARRAY_P (TREE_TYPE (TREE_TYPE (this_expr))))
15754 /* For all the unchecked exceptions thrown by DECL. */
15755 for (throws = DECL_FUNCTION_THROWS (decl); throws;
15756 throws = TREE_CHAIN (throws))
15757 if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
15759 /* Suppress errors about cloning arrays. */
15760 if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
15763 EXPR_WFL_LINECOL (wfl_operator) = location;
15764 if (DECL_FINIT_P (current_function_decl))
15765 parse_error_context
15766 (wfl_operator, "Exception `%s' can't be thrown in initializer",
15767 lang_printable_name (TREE_VALUE (throws), 0));
15770 parse_error_context
15771 (wfl_operator, "Exception `%s' must be caught, or it must be declared in the `throws' clause of `%s'",
15772 lang_printable_name (TREE_VALUE (throws), 0),
15773 (DECL_INIT_P (current_function_decl) ?
15774 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
15775 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
15780 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
15781 try-catch blocks, OR is listed in the `throws' clause of the
15785 check_thrown_exceptions_do (tree exception)
15787 tree list = currently_caught_type_list;
15788 resolve_and_layout (exception, NULL_TREE);
15789 /* First, all the nested try-catch-finally at that stage. The
15790 last element contains `throws' clause exceptions, if any. */
15791 if (IS_UNCHECKED_EXCEPTION_P (exception))
15796 for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
15797 if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
15799 list = TREE_CHAIN (list);
15805 purge_unchecked_exceptions (tree mdecl)
15807 tree throws = DECL_FUNCTION_THROWS (mdecl);
15808 tree new = NULL_TREE;
15812 tree next = TREE_CHAIN (throws);
15813 if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
15815 TREE_CHAIN (throws) = new;
15820 /* List is inverted here, but it doesn't matter */
15821 DECL_FUNCTION_THROWS (mdecl) = new;
15824 /* This function goes over all of CLASS_TYPE ctors and checks whether
15825 each of them features at least one unchecked exception in its
15826 `throws' clause. If it's the case, it returns `true', `false'
15830 ctors_unchecked_throws_clause_p (tree class_type)
15834 for (current = TYPE_METHODS (class_type); current;
15835 current = TREE_CHAIN (current))
15837 bool ctu = false; /* Ctor Throws Unchecked */
15838 if (DECL_CONSTRUCTOR_P (current))
15841 for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
15842 throws = TREE_CHAIN (throws))
15843 if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
15846 /* We return false as we found one ctor that is unfit. */
15847 if (!ctu && DECL_CONSTRUCTOR_P (current))
15850 /* All ctors feature at least one unchecked exception in their
15851 `throws' clause. */
15855 /* 15.24 Conditional Operator ?: */
15858 patch_conditional_expr (tree node, tree wfl_cond, tree wfl_op1)
15860 tree cond = TREE_OPERAND (node, 0);
15861 tree op1 = TREE_OPERAND (node, 1);
15862 tree op2 = TREE_OPERAND (node, 2);
15863 tree resulting_type = NULL_TREE;
15864 tree t1, t2, patched;
15865 int error_found = 0;
15867 /* Operands of ?: might be StringBuffers crafted as a result of a
15868 string concatenation. Obtain a descent operand here. */
15869 if ((patched = patch_string (op1)))
15870 TREE_OPERAND (node, 1) = op1 = patched;
15871 if ((patched = patch_string (op2)))
15872 TREE_OPERAND (node, 2) = op2 = patched;
15874 t1 = TREE_TYPE (op1);
15875 t2 = TREE_TYPE (op2);
15877 /* The first expression must be a boolean */
15878 if (TREE_TYPE (cond) != boolean_type_node)
15880 SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
15881 parse_error_context (wfl_operator,
15882 "Incompatible type for `?:'. Can't convert `%s' to `boolean'",
15883 lang_printable_name (TREE_TYPE (cond), 0));
15887 /* Second and third can be numeric, boolean (i.e. primitive),
15888 references or null. Anything else results in an error */
15889 if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
15890 || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
15891 && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
15892 || (t1 == boolean_type_node && t2 == boolean_type_node)))
15895 /* Determine the type of the conditional expression. Same types are
15896 easy to deal with */
15898 resulting_type = t1;
15900 /* There are different rules for numeric types */
15901 else if (JNUMERIC_TYPE_P (t1))
15903 /* if byte/short found, the resulting type is short */
15904 if ((t1 == byte_type_node && t2 == short_type_node)
15905 || (t1 == short_type_node && t2 == byte_type_node))
15906 resulting_type = short_type_node;
15908 /* If t1 is a constant int and t2 is of type byte, short or char
15909 and t1's value fits in t2, then the resulting type is t2 */
15910 else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
15911 && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
15912 resulting_type = t2;
15914 /* If t2 is a constant int and t1 is of type byte, short or char
15915 and t2's value fits in t1, then the resulting type is t1 */
15916 else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
15917 && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
15918 resulting_type = t1;
15920 /* Otherwise, binary numeric promotion is applied and the
15921 resulting type is the promoted type of operand 1 and 2 */
15923 resulting_type = binary_numeric_promotion (t1, t2,
15924 &TREE_OPERAND (node, 1),
15925 &TREE_OPERAND (node, 2));
15928 /* Cases of a reference and a null type */
15929 else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
15930 resulting_type = t1;
15932 else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
15933 resulting_type = t2;
15935 /* Last case: different reference types. If a type can be converted
15936 into the other one by assignment conversion, the latter
15937 determines the type of the expression */
15938 else if ((resulting_type = try_reference_assignconv (t1, op2)))
15939 resulting_type = promote_type (t1);
15941 else if ((resulting_type = try_reference_assignconv (t2, op1)))
15942 resulting_type = promote_type (t2);
15944 /* If we don't have any resulting type, we're in trouble */
15945 if (!resulting_type)
15947 char *t = xstrdup (lang_printable_name (t1, 0));
15948 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15949 parse_error_context (wfl_operator,
15950 "Incompatible type for `?:'. Can't convert `%s' to `%s'",
15951 t, lang_printable_name (t2, 0));
15958 TREE_TYPE (node) = error_mark_node;
15959 return error_mark_node;
15962 TREE_TYPE (node) = resulting_type;
15963 TREE_SET_CODE (node, COND_EXPR);
15964 CAN_COMPLETE_NORMALLY (node) = 1;
15968 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
15971 maybe_build_class_init_for_field (tree decl, tree expr)
15973 tree clas = DECL_CONTEXT (decl);
15974 if (flag_emit_class_files || flag_emit_xref)
15977 if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
15978 && FIELD_FINAL (decl))
15980 tree init = DECL_INITIAL (decl);
15981 if (init != NULL_TREE)
15982 init = fold_constant_for_init (init, decl);
15983 if (init != NULL_TREE && CONSTANT_VALUE_P (init))
15987 return build_class_init (clas, expr);
15990 /* Try to constant fold NODE.
15991 If NODE is not a constant expression, return NULL_EXPR.
15992 CONTEXT is a static final VAR_DECL whose initializer we are folding. */
15995 fold_constant_for_init (tree node, tree context)
15997 tree op0, op1, val;
15998 enum tree_code code = TREE_CODE (node);
16003 if (node == null_pointer_node)
16012 case TRUNC_MOD_EXPR:
16020 case TRUTH_ANDIF_EXPR:
16021 case TRUTH_ORIF_EXPR:
16028 op0 = TREE_OPERAND (node, 0);
16029 op1 = TREE_OPERAND (node, 1);
16030 val = fold_constant_for_init (op0, context);
16031 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16033 TREE_OPERAND (node, 0) = val;
16034 val = fold_constant_for_init (op1, context);
16035 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16037 TREE_OPERAND (node, 1) = val;
16038 return patch_binop (node, op0, op1);
16040 case UNARY_PLUS_EXPR:
16042 case TRUTH_NOT_EXPR:
16045 op0 = TREE_OPERAND (node, 0);
16046 val = fold_constant_for_init (op0, context);
16047 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16049 TREE_OPERAND (node, 0) = val;
16050 val = patch_unaryop (node, op0);
16051 if (! TREE_CONSTANT (val))
16058 val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
16059 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16061 TREE_OPERAND (node, 0) = val;
16062 val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
16063 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16065 TREE_OPERAND (node, 1) = val;
16066 val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
16067 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16069 TREE_OPERAND (node, 2) = val;
16070 return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
16071 : TREE_OPERAND (node, 2);
16075 if (! FIELD_FINAL (node)
16076 || DECL_INITIAL (node) == NULL_TREE)
16078 val = DECL_INITIAL (node);
16079 /* Guard against infinite recursion. */
16080 DECL_INITIAL (node) = NULL_TREE;
16081 val = fold_constant_for_init (val, node);
16082 if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
16083 val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
16084 DECL_INITIAL (node) = val;
16087 case EXPR_WITH_FILE_LOCATION:
16088 /* Compare java_complete_tree and resolve_expression_name. */
16089 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
16090 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
16092 tree name = EXPR_WFL_NODE (node);
16094 if (PRIMARY_P (node))
16096 else if (! QUALIFIED_P (name))
16098 decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
16099 if (decl == NULL_TREE
16100 || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
16102 return fold_constant_for_init (decl, decl);
16106 /* Install the proper context for the field resolution.
16107 The prior context is restored once the name is
16108 properly qualified. */
16109 tree saved_current_class = current_class;
16110 /* Wait until the USE_COMPONENT_REF re-write. FIXME. */
16111 current_class = DECL_CONTEXT (context);
16112 qualify_ambiguous_name (node);
16113 current_class = saved_current_class;
16114 if (resolve_field_access (node, &decl, NULL)
16115 && decl != NULL_TREE)
16116 return fold_constant_for_init (decl, decl);
16122 op0 = TREE_OPERAND (node, 0);
16123 val = fold_constant_for_init (op0, context);
16124 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16126 TREE_OPERAND (node, 0) = val;
16130 #ifdef USE_COMPONENT_REF
16132 case COMPONENT_REF:
16141 #ifdef USE_COMPONENT_REF
16142 /* Context is 'T' for TypeName, 'P' for PackageName,
16143 'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16146 resolve_simple_name (tree name, int context)
16151 resolve_qualified_name (tree name, int context)
16157 init_src_parse (void)
16159 /* Sanity check; we've been bit by this before. */
16160 if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
16166 /* This section deals with the functions that are called when tables
16167 recording class initialization information are traversed. */
16169 /* Attach to PTR (a block) the declaration found in ENTRY. */
16172 attach_init_test_initialization_flags (void **entry, void *ptr)
16174 tree block = (tree)ptr;
16175 struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
16177 if (block != error_mark_node)
16179 TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
16180 BLOCK_EXPR_DECLS (block) = ite->value;
16185 /* This function is called for each class that is known definitely
16186 initialized when a given static method was called. This function
16187 augments a compound expression (INFO) storing all assignment to
16188 initialized static class flags if a flag already existed, otherwise
16189 a new one is created. */
16192 emit_test_initialization (void **entry_p, void *info)
16194 tree l = (tree) info;
16196 tree key = (tree) *entry_p;
16198 htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
16200 /* If we haven't found a flag and we're dealing with self registered
16201 with current_function_decl, then don't do anything. Self is
16202 always added as definitely initialized but this information is
16203 valid only if used outside the current function. */
16204 if (current_function_decl == TREE_PURPOSE (l)
16205 && java_treetreehash_find (cf_ht, key) == NULL)
16208 ite = java_treetreehash_new (cf_ht, key);
16210 /* If we don't have a variable, create one and install it. */
16215 decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
16216 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
16217 LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
16218 DECL_CONTEXT (decl) = current_function_decl;
16219 DECL_INITIAL (decl) = boolean_true_node;
16220 /* Don't emit any symbolic debugging info for this decl. */
16221 DECL_IGNORED_P (decl) = 1;
16223 /* The trick is to find the right context for it. */
16224 block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
16225 TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
16226 BLOCK_EXPR_DECLS (block) = decl;
16232 /* Now simply augment the compound that holds all the assignments
16233 pertaining to this method invocation. */
16234 init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
16235 TREE_SIDE_EFFECTS (init) = 1;
16236 TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
16237 TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
16242 #include "gt-java-parse.h"
16243 #include "gtype-java.h"