Merge from mainline
[official-gcc.git] / gcc / java / parse.y
blob4ba158171b0fad1cb2cd5fa1f04eba42e9d8fc7d
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, 2005
4 Free Software Foundation, Inc.
5 Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to
21 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA.
24 Java and all Java-based marks are trademarks or registered trademarks
25 of Sun Microsystems, Inc. in the United States and other countries.
26 The Free Software Foundation is independent of Sun Microsystems, Inc. */
28 /* This file parses java source code and issues a tree node image
29 suitable for code generation (byte code and targeted CPU assembly
30 language).
32 The grammar conforms to the Java grammar described in "The Java(TM)
33 Language Specification. J. Gosling, B. Joy, G. Steele. Addison Wesley
34 1996, ISBN 0-201-63451-1"
36 The following modifications were brought to the original grammar:
38 method_body: added the rule '| block SC_TK'
39 static_initializer: added the rule 'static block SC_TK'.
41 Note: All the extra rules described above should go away when the
42 empty_statement rule will work.
44 statement_nsi: 'nsi' should be read no_short_if.
46 Some rules have been modified to support JDK1.1 inner classes
47 definitions and other extensions. */
50 #include "config.h"
51 #include "system.h"
52 #include "coretypes.h"
53 #include "tm.h"
54 #include <dirent.h>
55 #include "tree.h"
56 #include "rtl.h"
57 #include "real.h"
58 #include "obstack.h"
59 #include "toplev.h"
60 #include "pretty-print.h"
61 #include "diagnostic.h"
62 #include "flags.h"
63 #include "java-tree.h"
64 #include "jcf.h"
65 #include "lex.h"
66 #include "parse.h"
67 #include "zipfile.h"
68 #include "convert.h"
69 #include "buffer.h"
70 #include "function.h"
71 #include "except.h"
72 #include "ggc.h"
73 #include "debug.h"
74 #include "tree-inline.h"
75 #include "tree-dump.h"
76 #include "cgraph.h"
77 #include "target.h"
79 /* Local function prototypes */
80 static char *java_accstring_lookup (int);
81 static const char *accessibility_string (int);
82 static void classitf_redefinition_error (const char *,tree, tree, tree);
83 static void variable_redefinition_error (tree, tree, tree, int);
84 static tree create_class (int, tree, tree, tree);
85 static tree create_interface (int, tree, tree);
86 static void end_class_declaration (int);
87 static tree find_field (tree, tree);
88 static tree lookup_field_wrapper (tree, tree);
89 static int duplicate_declaration_error_p (tree, tree, tree);
90 static void register_fields (int, tree, tree);
91 static tree parser_qualified_classname (tree);
92 static int parser_check_super (tree, tree, tree);
93 static int parser_check_super_interface (tree, tree, tree);
94 static void check_modifiers_consistency (int);
95 static tree lookup_cl (tree);
96 static tree lookup_java_method2 (tree, tree, int);
97 static tree method_header (int, tree, tree, tree);
98 static void fix_method_argument_names (tree ,tree);
99 static tree method_declarator (tree, tree);
100 static void parse_warning_context (tree cl, const char *gmsgid, ...) ATTRIBUTE_GCC_DIAG(2,3);
101 #ifdef USE_MAPPED_LOCATION
102 static void issue_warning_error_from_context
103 (source_location, const char *gmsgid, va_list *);
104 #else
105 static void issue_warning_error_from_context
106 (tree, const char *gmsgid, va_list *);
107 #endif
108 static void parse_ctor_invocation_error (void);
109 static tree parse_jdk1_1_error (const char *);
110 static void complete_class_report_errors (jdep *);
111 static int process_imports (void);
112 static void read_import_dir (tree);
113 static int find_in_imports_on_demand (tree, tree);
114 static void find_in_imports (tree, tree);
115 static bool inner_class_accessible (tree, tree);
116 static void check_inner_class_access (tree, tree, tree);
117 static int check_pkg_class_access (tree, tree, bool, tree);
118 static tree resolve_package (tree, tree *, tree *);
119 static tree resolve_class (tree, tree, tree, tree);
120 static void declare_local_variables (int, tree, tree);
121 static void dump_java_tree (enum tree_dump_index, tree);
122 static void source_start_java_method (tree);
123 static void source_end_java_method (void);
124 static tree find_name_in_single_imports (tree);
125 static void check_abstract_method_header (tree);
126 static tree lookup_java_interface_method2 (tree, tree);
127 static tree resolve_expression_name (tree, tree *);
128 static tree maybe_create_class_interface_decl (tree, tree, tree, tree);
129 static int check_class_interface_creation (int, int, tree, tree, tree, tree);
130 static tree patch_method_invocation (tree, tree, tree, int, int *, tree *);
131 static tree resolve_and_layout (tree, tree);
132 static tree qualify_and_find (tree, tree, tree);
133 static tree resolve_no_layout (tree, tree);
134 static int invocation_mode (tree, int);
135 static tree find_applicable_accessible_methods_list (int, tree, tree, tree);
136 static void search_applicable_methods_list (int, tree, tree, tree, tree *, tree *);
137 static tree find_most_specific_methods_list (tree);
138 static int argument_types_convertible (tree, tree);
139 static tree patch_invoke (tree, tree, tree);
140 static int maybe_use_access_method (int, tree *, tree *);
141 static tree lookup_method_invoke (int, tree, tree, tree, tree);
142 static tree register_incomplete_type (int, tree, tree, tree);
143 static tree check_inner_circular_reference (tree, tree);
144 static tree check_circular_reference (tree);
145 static tree obtain_incomplete_type (tree);
146 static tree java_complete_lhs (tree);
147 static tree java_complete_tree (tree);
148 static tree maybe_generate_pre_expand_clinit (tree);
149 static int analyze_clinit_body (tree, tree);
150 static int maybe_yank_clinit (tree);
151 static void start_complete_expand_method (tree);
152 static void java_complete_expand_method (tree);
153 static void java_expand_method_bodies (tree);
154 static int unresolved_type_p (tree, tree *);
155 static void create_jdep_list (struct parser_ctxt *);
156 static tree build_expr_block (tree, tree);
157 static tree enter_block (void);
158 static tree exit_block (void);
159 static tree lookup_name_in_blocks (tree);
160 static void maybe_absorb_scoping_blocks (void);
161 static tree build_method_invocation (tree, tree);
162 static tree build_new_invocation (tree, tree);
163 static tree build_assignment (int, int, tree, tree);
164 static tree build_binop (enum tree_code, int, tree, tree);
165 static tree patch_assignment (tree, tree);
166 static tree patch_binop (tree, tree, tree, int);
167 static tree build_unaryop (int, int, tree);
168 static tree build_incdec (int, int, tree, int);
169 static tree patch_unaryop (tree, tree);
170 static tree build_cast (int, tree, tree);
171 static tree build_null_of_type (tree);
172 static tree patch_cast (tree, tree);
173 static int valid_ref_assignconv_cast_p (tree, tree, int);
174 static int valid_builtin_assignconv_identity_widening_p (tree, tree);
175 static int valid_cast_to_p (tree, tree);
176 static int valid_method_invocation_conversion_p (tree, tree);
177 static tree try_builtin_assignconv (tree, tree, tree);
178 static tree try_reference_assignconv (tree, tree);
179 static tree build_unresolved_array_type (tree);
180 static int build_type_name_from_array_name (tree, tree *);
181 static tree build_array_from_name (tree, tree, tree, tree *);
182 static tree build_array_ref (int, tree, tree);
183 static tree patch_array_ref (tree);
184 #ifdef USE_MAPPED_LOCATION
185 static tree make_qualified_name (tree, tree, source_location);
186 #else
187 static tree make_qualified_name (tree, tree, int);
188 #endif
189 static tree merge_qualified_name (tree, tree);
190 static tree make_qualified_primary (tree, tree, int);
191 static int resolve_qualified_expression_name (tree, tree *, tree *, tree *);
192 static void qualify_ambiguous_name (tree);
193 static tree resolve_field_access (tree, tree *, tree *);
194 static tree build_newarray_node (tree, tree, int);
195 static tree patch_newarray (tree);
196 static tree resolve_type_during_patch (tree);
197 static tree build_this (int);
198 static tree build_wfl_wrap (tree, int);
199 static tree build_return (int, tree);
200 static tree patch_return (tree);
201 static tree maybe_access_field (tree, tree, tree);
202 static int complete_function_arguments (tree);
203 static int check_for_static_method_reference (tree, tree, tree, tree, tree);
204 static int not_accessible_p (tree, tree, tree, int);
205 static void check_deprecation (tree, tree);
206 static int class_in_current_package (tree);
207 static tree build_if_else_statement (int, tree, tree, tree);
208 static tree patch_if_else_statement (tree);
209 static tree add_stmt_to_block (tree, tree, tree);
210 static tree patch_exit_expr (tree);
211 static tree build_labeled_block (int, tree);
212 static tree finish_labeled_statement (tree, tree);
213 static tree build_bc_statement (int, int, tree);
214 static tree patch_bc_statement (tree);
215 static tree patch_loop_statement (tree);
216 static tree build_new_loop (tree);
217 static tree build_loop_body (int, tree, int);
218 static tree finish_loop_body (int, tree, tree, int);
219 static tree build_debugable_stmt (int, tree);
220 static tree finish_for_loop (int, tree, tree, tree);
221 static tree patch_switch_statement (tree);
222 static tree string_constant_concatenation (tree, tree);
223 static tree build_string_concatenation (tree, tree);
224 static tree patch_string_cst (tree);
225 static tree patch_string (tree);
226 static tree encapsulate_with_try_catch (int, tree, tree, tree);
227 #ifdef USE_MAPPED_LOCATION
228 static tree build_assertion (source_location, tree, tree);
229 #else
230 static tree build_assertion (int, tree, tree);
231 #endif
232 static tree build_try_statement (int, tree, tree);
233 static tree build_try_finally_statement (int, tree, tree);
234 static tree patch_try_statement (tree);
235 static tree patch_synchronized_statement (tree, tree);
236 static tree patch_throw_statement (tree, tree);
237 static void add_exception_to_throws (tree, tree);
238 #ifdef USE_MAPPED_LOCATION
239 static void check_thrown_exceptions (source_location, tree, tree);
240 #else
241 static void check_thrown_exceptions (int, tree, tree);
242 #endif
243 static int check_thrown_exceptions_do (tree);
244 static bool ctors_unchecked_throws_clause_p (tree);
245 static void check_concrete_throws_clauses (tree, tree, tree, tree);
246 static void check_throws_clauses (tree, tree, tree);
247 static void finish_method_declaration (tree);
248 static tree build_super_invocation (tree);
249 static int verify_constructor_circularity (tree, tree);
250 static char *constructor_circularity_msg (tree, tree);
251 static tree build_this_super_qualified_invocation (int, tree, tree, int, int);
252 static const char *get_printable_method_name (tree);
253 static tree patch_conditional_expr (tree, tree, tree);
254 static tree generate_finit (tree);
255 static tree generate_instinit (tree);
256 static tree build_instinit_invocation (tree);
257 static void fix_constructors (tree);
258 static tree build_alias_initializer_parameter_list (int, tree, tree, int *);
259 static tree craft_constructor (tree, tree);
260 static tree get_constructor_super (tree);
261 static tree create_artificial_method (tree, int, tree, tree, tree);
262 static void start_artificial_method_body (tree);
263 static void end_artificial_method_body (tree);
264 static int check_method_redefinition (tree, tree);
265 static int check_method_types_complete (tree);
266 static bool hack_is_accessible_p (tree, tree);
267 static void java_check_regular_methods (tree);
268 static void check_interface_throws_clauses (tree, tree);
269 static void java_check_abstract_methods (tree);
270 static void unreachable_stmt_error (tree);
271 static int not_accessible_field_error (tree, tree);
272 static tree find_expr_with_wfl (tree);
273 static void missing_return_error (tree);
274 static tree build_new_array_init (int, tree);
275 static tree patch_new_array_init (tree, tree);
276 static tree maybe_build_array_element_wfl (tree);
277 static int array_constructor_check_entry (tree, constructor_elt *);
278 static const char *purify_type_name (const char *);
279 static tree fold_constant_for_init (tree, tree);
280 static jdeplist *reverse_jdep_list (struct parser_ctxt *);
281 static void static_ref_err (tree, tree, tree);
282 static void parser_add_interface (tree, tree, tree);
283 static void add_superinterfaces (tree, tree);
284 static tree jdep_resolve_class (jdep *);
285 static int note_possible_classname (const char *, int);
286 static void java_complete_expand_classes (void);
287 static void java_complete_expand_class (tree);
288 static void java_complete_expand_methods (tree);
289 static tree cut_identifier_in_qualified (tree);
290 static tree java_stabilize_reference (tree);
291 static tree do_unary_numeric_promotion (tree);
292 static char * operator_string (tree);
293 static tree do_merge_string_cste (tree, const char *, int, int);
294 static tree merge_string_cste (tree, tree, int);
295 static tree java_refold (tree);
296 static int java_decl_equiv (tree, tree);
297 static int binop_compound_p (enum tree_code);
298 static tree search_loop (tree);
299 static int labeled_block_contains_loop_p (tree, tree);
300 static int check_abstract_method_definitions (int, tree, tree);
301 static void java_check_abstract_method_definitions (tree);
302 static void java_debug_context_do (int);
303 static void java_parser_context_push_initialized_field (void);
304 static void java_parser_context_pop_initialized_field (void);
305 static tree reorder_static_initialized (tree);
306 static void java_parser_context_suspend (void);
307 static void java_parser_context_resume (void);
308 static int pop_current_osb (struct parser_ctxt *);
310 /* JDK 1.1 work. FIXME */
312 static tree maybe_make_nested_class_name (tree);
313 static int make_nested_class_name (tree);
314 static void link_nested_class_to_enclosing (void);
315 static tree resolve_inner_class (tree, tree, tree, tree);
316 static tree find_as_inner_class (tree, tree, tree);
317 static tree find_as_inner_class_do (tree, tree);
318 static int check_inner_class_redefinition (tree, tree);
320 static tree build_thisn_assign (void);
321 static tree build_current_thisn (tree);
322 static tree build_access_to_thisn (tree, tree, int);
323 static tree maybe_build_thisn_access_method (tree);
325 static tree build_nested_field_access (tree, tree);
326 static tree build_nested_field_access_methods (tree);
327 static tree build_nested_field_access_method (tree, tree, tree, tree, tree);
328 static tree build_nested_field_access_expr (int, tree, tree, tree, tree);
329 static tree build_nested_method_access_method (tree);
330 static tree build_new_access_id (void);
332 static int nested_member_access_p (tree, tree);
333 static int nested_field_expanded_access_p (tree, tree *, tree *, tree *);
334 static tree nested_field_access_fix (tree, tree, tree);
336 static tree build_incomplete_class_ref (int, tree);
337 static tree patch_incomplete_class_ref (tree);
338 static tree create_anonymous_class (tree);
339 static void patch_anonymous_class (tree, tree, tree);
340 static void add_inner_class_fields (tree, tree);
342 static tree build_dot_class_method (tree);
343 static tree build_dot_class_method_invocation (tree, tree);
344 static void create_new_parser_context (int);
345 static tree maybe_build_class_init_for_field (tree, tree);
347 static int emit_test_initialization (void **, void *);
349 static char *string_convert_int_cst (tree);
351 /* Number of error found so far. */
352 int java_error_count;
353 /* Number of warning found so far. */
354 int java_warning_count;
355 /* Cyclic inheritance report, as it can be set by layout_class */
356 const char *cyclic_inheritance_report;
358 /* The current parser context */
359 struct parser_ctxt *ctxp;
361 /* List of things that were analyzed for which code will be generated */
362 struct parser_ctxt *ctxp_for_generation = NULL;
363 struct parser_ctxt *ctxp_for_generation_last = NULL;
365 /* binop_lookup maps token to tree_code. It is used where binary
366 operations are involved and required by the parser. RDIV_EXPR
367 covers both integral/floating point division. The code is changed
368 once the type of both operator is worked out. */
370 static const enum tree_code binop_lookup[19] =
372 PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR,
373 LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR,
374 BIT_AND_EXPR, BIT_XOR_EXPR, BIT_IOR_EXPR,
375 TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR,
376 EQ_EXPR, NE_EXPR, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR,
378 #define BINOP_LOOKUP(VALUE) \
379 binop_lookup [((VALUE) - PLUS_TK) % ARRAY_SIZE (binop_lookup)]
381 /* This is the end index for binary operators that can also be used
382 in compound assignments. */
383 #define BINOP_COMPOUND_CANDIDATES 11
385 /* The "$L" identifier we use to create labels. */
386 static GTY(()) tree label_id;
388 /* The "StringBuffer" identifier used for the String `+' operator. */
389 static GTY(()) tree wfl_string_buffer;
391 /* The "append" identifier used for String `+' operator. */
392 static GTY(()) tree wfl_append;
394 /* The "toString" identifier used for String `+' operator. */
395 static GTY(()) tree wfl_to_string;
397 /* The "java.lang" import qualified name. */
398 static GTY(()) tree java_lang_id;
400 /* The generated `inst$' identifier used for generated enclosing
401 instance/field access functions. */
402 static GTY(()) tree inst_id;
404 /* Context and flag for static blocks */
405 static GTY(()) tree current_static_block;
407 /* The generated `write_parm_value$' identifier. */
408 static GTY(()) tree wpv_id;
410 /* Hold THIS for the scope of the current method decl. */
411 static GTY(()) tree current_this;
413 /* Hold a list of catch clauses list. The first element of this list is
414 the list of the catch clauses of the currently analyzed try block. */
415 static GTY(()) tree currently_caught_type_list;
417 /* This holds a linked list of all the case labels for the current
418 switch statement. It is only used when checking to see if there
419 are duplicate labels. FIXME: probably this should just be attached
420 to the switch itself; then it could be referenced via
421 `ctxp->current_loop'. */
422 static GTY(()) tree case_label_list;
424 /* Anonymous class counter. Will be reset to 1 every time a non
425 anonymous class gets created. */
426 static int anonymous_class_counter = 1;
428 static GTY(()) tree src_parse_roots[1];
430 /* All classes seen from source code */
431 #define gclass_list src_parse_roots[0]
433 /* Check modifiers. If one doesn't fit, retrieve it in its declaration
434 line and point it out. */
435 /* Should point out the one that don't fit. ASCII/unicode, going
436 backward. FIXME */
438 #define check_modifiers(__message, __value, __mask) do { \
439 if ((__value) & ~(__mask)) \
441 size_t i, remainder = (__value) & ~(__mask); \
442 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++) \
443 if ((1 << i) & remainder) \
444 parse_error_context (ctxp->modifier_ctx [i], (__message), \
445 java_accstring_lookup (1 << i)); \
447 } while (0)
451 %union {
452 tree node;
453 int sub_token;
454 struct {
455 int token;
456 #ifdef USE_MAPPED_LOCATION
457 source_location location;
458 #else
459 int location;
460 #endif
461 } operator;
462 int value;
466 #ifdef USE_MAPPED_LOCATION
467 #define SET_EXPR_LOCATION_FROM_TOKEN(EXPR, TOKEN) \
468 SET_EXPR_LOCATION(EXPR, (TOKEN).location)
469 #else
470 #define SET_EXPR_LOCATION_FROM_TOKEN(EXPR, TOKEN) \
471 (EXPR_WFL_LINECOL (EXPR) = (TOKEN).location)
472 #endif
474 #include "lex.c"
477 %pure_parser
479 /* Things defined here have to match the order of what's in the
480 binop_lookup table. */
482 %token PLUS_TK MINUS_TK MULT_TK DIV_TK REM_TK
483 %token LS_TK SRS_TK ZRS_TK
484 %token AND_TK XOR_TK OR_TK
485 %token BOOL_AND_TK BOOL_OR_TK
486 %token EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
488 /* This maps to the same binop_lookup entry than the token above */
490 %token PLUS_ASSIGN_TK MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
491 %token REM_ASSIGN_TK
492 %token LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
493 %token AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
496 /* Modifier TOKEN have to be kept in this order. Don't scramble it */
498 %token PUBLIC_TK PRIVATE_TK PROTECTED_TK
499 %token STATIC_TK FINAL_TK SYNCHRONIZED_TK
500 %token VOLATILE_TK TRANSIENT_TK NATIVE_TK
501 %token PAD_TK ABSTRACT_TK STRICT_TK
502 %token MODIFIER_TK
504 /* Keep those two in order, too */
505 %token DECR_TK INCR_TK
507 /* From now one, things can be in any order */
509 %token DEFAULT_TK IF_TK THROW_TK
510 %token BOOLEAN_TK DO_TK IMPLEMENTS_TK
511 %token THROWS_TK BREAK_TK IMPORT_TK
512 %token ELSE_TK INSTANCEOF_TK RETURN_TK
513 %token VOID_TK CATCH_TK INTERFACE_TK
514 %token CASE_TK EXTENDS_TK FINALLY_TK
515 %token SUPER_TK WHILE_TK CLASS_TK
516 %token SWITCH_TK CONST_TK TRY_TK
517 %token FOR_TK NEW_TK CONTINUE_TK
518 %token GOTO_TK PACKAGE_TK THIS_TK
519 %token ASSERT_TK
521 %token BYTE_TK SHORT_TK INT_TK LONG_TK
522 %token CHAR_TK INTEGRAL_TK
524 %token FLOAT_TK DOUBLE_TK FP_TK
526 %token ID_TK
528 %token REL_QM_TK REL_CL_TK NOT_TK NEG_TK
530 %token ASSIGN_ANY_TK ASSIGN_TK
531 %token OP_TK CP_TK OCB_TK CCB_TK OSB_TK CSB_TK SC_TK C_TK DOT_TK
533 %token STRING_LIT_TK CHAR_LIT_TK INT_LIT_TK FP_LIT_TK
534 %token TRUE_TK FALSE_TK BOOL_LIT_TK NULL_TK
536 %type <value> modifiers MODIFIER_TK final synchronized
538 %type <node> super ID_TK identifier
539 %type <node> name simple_name qualified_name
540 %type <node> type_declaration compilation_unit
541 field_declaration method_declaration extends_interfaces
542 interfaces interface_type_list
543 import_declarations package_declaration
544 type_declarations interface_body
545 interface_member_declaration constant_declaration
546 interface_member_declarations interface_type
547 abstract_method_declaration
548 %type <node> class_body_declaration class_member_declaration
549 static_initializer constructor_declaration block
550 %type <node> class_body_declarations constructor_header
551 %type <node> class_or_interface_type class_type class_type_list
552 constructor_declarator explicit_constructor_invocation
553 %type <node> dim_expr dim_exprs this_or_super throws
555 %type <node> variable_declarator_id variable_declarator
556 variable_declarators variable_initializer
557 variable_initializers constructor_body
558 array_initializer
560 %type <node> class_body block_end constructor_block_end
561 %type <node> statement statement_without_trailing_substatement
562 labeled_statement if_then_statement label_decl
563 if_then_else_statement while_statement for_statement
564 statement_nsi labeled_statement_nsi do_statement
565 if_then_else_statement_nsi while_statement_nsi
566 for_statement_nsi statement_expression_list for_init
567 for_update statement_expression expression_statement
568 primary_no_new_array expression primary array_type
569 array_creation_initialized array_creation_uninitialized
570 class_instance_creation_expression field_access
571 method_invocation array_access something_dot_new
572 argument_list postfix_expression while_expression
573 post_increment_expression post_decrement_expression
574 unary_expression_not_plus_minus unary_expression
575 pre_increment_expression pre_decrement_expression
576 cast_expression
577 multiplicative_expression additive_expression
578 shift_expression relational_expression
579 equality_expression and_expression
580 exclusive_or_expression inclusive_or_expression
581 conditional_and_expression conditional_or_expression
582 conditional_expression assignment_expression
583 left_hand_side assignment for_header for_begin
584 constant_expression do_statement_begin empty_statement
585 switch_statement synchronized_statement throw_statement
586 try_statement assert_statement
587 switch_expression switch_block
588 catches catch_clause catch_clause_parameter finally
589 anonymous_class_creation trap_overflow_corner_case
590 %type <node> return_statement break_statement continue_statement
592 %type <operator> ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
593 %type <operator> REM_ASSIGN_TK PLUS_ASSIGN_TK MINUS_ASSIGN_TK
594 %type <operator> LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
595 %type <operator> AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
596 %type <operator> ASSIGN_ANY_TK assignment_operator
597 %token <operator> EQ_TK GTE_TK ZRS_TK SRS_TK GT_TK LTE_TK LS_TK
598 %token <operator> BOOL_AND_TK AND_TK BOOL_OR_TK OR_TK INCR_TK PLUS_TK
599 %token <operator> DECR_TK MINUS_TK MULT_TK DIV_TK XOR_TK REM_TK NEQ_TK
600 %token <operator> NEG_TK REL_QM_TK REL_CL_TK NOT_TK LT_TK OCB_TK CCB_TK
601 %token <operator> OP_TK OSB_TK DOT_TK THROW_TK INSTANCEOF_TK
602 %type <operator> THIS_TK SUPER_TK RETURN_TK BREAK_TK CONTINUE_TK
603 %type <operator> CASE_TK DEFAULT_TK TRY_TK CATCH_TK SYNCHRONIZED_TK
604 %type <operator> NEW_TK ASSERT_TK
606 %type <node> method_body
608 %type <node> literal INT_LIT_TK FP_LIT_TK BOOL_LIT_TK CHAR_LIT_TK
609 STRING_LIT_TK NULL_TK VOID_TK
611 %type <node> IF_TK WHILE_TK FOR_TK
613 %type <node> formal_parameter_list formal_parameter
614 method_declarator method_header
616 %type <node> primitive_type reference_type type
617 BOOLEAN_TK INTEGRAL_TK FP_TK
619 /* Added or modified JDK 1.1 rule types */
620 %type <node> type_literals
623 /* 19.2 Production from 2.3: The Syntactic Grammar */
624 goal: compilation_unit
628 /* 19.3 Productions from 3: Lexical structure */
629 literal:
630 INT_LIT_TK
631 | FP_LIT_TK
632 | BOOL_LIT_TK
633 | CHAR_LIT_TK
634 | STRING_LIT_TK
635 | NULL_TK
638 /* 19.4 Productions from 4: Types, Values and Variables */
639 type:
640 primitive_type
641 | reference_type
644 primitive_type:
645 INTEGRAL_TK
646 | FP_TK
647 | BOOLEAN_TK
650 reference_type:
651 class_or_interface_type
652 | array_type
655 class_or_interface_type:
656 name
659 class_type:
660 class_or_interface_type /* Default rule */
663 interface_type:
664 class_or_interface_type
667 array_type:
668 primitive_type dims
670 int osb = pop_current_osb (ctxp);
671 tree t = build_java_array_type (($1), -1);
672 while (--osb)
673 t = build_unresolved_array_type (t);
674 $$ = t;
676 | name dims
678 int osb = pop_current_osb (ctxp);
679 tree t = $1;
680 while (osb--)
681 t = build_unresolved_array_type (t);
682 $$ = t;
686 /* 19.5 Productions from 6: Names */
687 name:
688 simple_name /* Default rule */
689 | qualified_name /* Default rule */
692 simple_name:
693 identifier /* Default rule */
696 qualified_name:
697 name DOT_TK identifier
698 { $$ = make_qualified_name ($1, $3, $2.location); }
701 identifier:
702 ID_TK
705 /* 19.6: Production from 7: Packages */
706 compilation_unit:
707 {$$ = NULL;}
708 | package_declaration
709 | import_declarations
710 | type_declarations
711 | package_declaration import_declarations
712 | package_declaration type_declarations
713 | import_declarations type_declarations
714 | package_declaration import_declarations type_declarations
717 import_declarations:
718 import_declaration
720 $$ = NULL;
722 | import_declarations import_declaration
724 $$ = NULL;
728 type_declarations:
729 type_declaration
730 | type_declarations type_declaration
733 package_declaration:
734 PACKAGE_TK name SC_TK
736 ctxp->package = EXPR_WFL_NODE ($2);
738 | PACKAGE_TK error
739 {yyerror ("Missing name"); RECOVER;}
740 | PACKAGE_TK name error
741 {yyerror ("';' expected"); RECOVER;}
744 import_declaration:
745 single_type_import_declaration
746 | type_import_on_demand_declaration
749 single_type_import_declaration:
750 IMPORT_TK name SC_TK
752 tree name = EXPR_WFL_NODE ($2), last_name;
753 int i = IDENTIFIER_LENGTH (name)-1;
754 const char *last = &IDENTIFIER_POINTER (name)[i];
755 while (last != IDENTIFIER_POINTER (name))
757 if (last [0] == '.')
758 break;
759 last--;
761 last_name = get_identifier (++last);
762 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (last_name))
764 tree err = find_name_in_single_imports (last_name);
765 if (err && err != name)
766 parse_error_context
767 ($2, "Ambiguous class: %qs and %qs",
768 IDENTIFIER_POINTER (name),
769 IDENTIFIER_POINTER (err));
770 else
771 REGISTER_IMPORT ($2, last_name);
773 else
774 REGISTER_IMPORT ($2, last_name);
776 | IMPORT_TK error
777 {yyerror ("Missing name"); RECOVER;}
778 | IMPORT_TK name error
779 {yyerror ("';' expected"); RECOVER;}
782 type_import_on_demand_declaration:
783 IMPORT_TK name DOT_TK MULT_TK SC_TK
785 tree name = EXPR_WFL_NODE ($2);
786 tree it;
787 /* Search for duplicates. */
788 for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it))
789 if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name)
790 break;
791 /* Don't import the same thing more than once, just ignore
792 duplicates (7.5.2) */
793 if (! it)
795 read_import_dir ($2);
796 ctxp->import_demand_list =
797 chainon (ctxp->import_demand_list,
798 build_tree_list ($2, NULL_TREE));
801 | IMPORT_TK name DOT_TK error
802 {yyerror ("'*' expected"); RECOVER;}
803 | IMPORT_TK name DOT_TK MULT_TK error
804 {yyerror ("';' expected"); RECOVER;}
807 type_declaration:
808 class_declaration
809 { end_class_declaration (0); }
810 | interface_declaration
811 { end_class_declaration (0); }
812 | empty_statement
813 | error
815 YYERROR_NOW;
816 yyerror ("Class or interface declaration expected");
820 /* 19.7 Shortened from the original:
821 modifiers: modifier | modifiers modifier
822 modifier: any of public... */
823 modifiers:
824 MODIFIER_TK
826 $$ = (1 << $1);
828 | modifiers MODIFIER_TK
830 int acc = (1 << $2);
831 if ($$ & acc)
832 parse_error_context
833 (ctxp->modifier_ctx [$2], "Modifier %qs declared twice",
834 java_accstring_lookup (acc));
835 else
837 $$ |= acc;
842 /* 19.8.1 Production from $8.1: Class Declaration */
843 class_declaration:
844 modifiers CLASS_TK identifier super interfaces
845 { create_class ($1, $3, $4, $5); }
846 class_body
848 | CLASS_TK identifier super interfaces
849 { create_class (0, $2, $3, $4); }
850 class_body
852 | modifiers CLASS_TK error
853 { yyerror ("Missing class name"); RECOVER; }
854 | CLASS_TK error
855 { yyerror ("Missing class name"); RECOVER; }
856 | CLASS_TK identifier error
858 if (!ctxp->class_err) yyerror ("'{' expected");
859 DRECOVER(class1);
861 | modifiers CLASS_TK identifier error
862 { if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER; }
865 super:
866 { $$ = NULL; }
867 | EXTENDS_TK class_type
868 { $$ = $2; }
869 | EXTENDS_TK class_type error
870 {yyerror ("'{' expected"); ctxp->class_err=1;}
871 | EXTENDS_TK error
872 {yyerror ("Missing super class name"); ctxp->class_err=1;}
875 interfaces:
876 { $$ = NULL_TREE; }
877 | IMPLEMENTS_TK interface_type_list
878 { $$ = $2; }
879 | IMPLEMENTS_TK error
881 ctxp->class_err=1;
882 yyerror ("Missing interface name");
886 interface_type_list:
887 interface_type
889 ctxp->interface_number = 1;
890 $$ = build_tree_list ($1, NULL_TREE);
892 | interface_type_list C_TK interface_type
894 ctxp->interface_number++;
895 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
897 | interface_type_list C_TK error
898 {yyerror ("Missing interface name"); RECOVER;}
901 class_body:
902 OCB_TK CCB_TK
904 $$ = GET_CPC ();
906 | OCB_TK class_body_declarations CCB_TK
908 $$ = GET_CPC ();
912 class_body_declarations:
913 class_body_declaration
914 | class_body_declarations class_body_declaration
917 class_body_declaration:
918 class_member_declaration
919 | static_initializer
920 | constructor_declaration
921 | block /* Added, JDK1.1, instance initializer */
923 if (!IS_EMPTY_STMT ($1))
925 TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
926 SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
931 class_member_declaration:
932 field_declaration
933 | method_declaration
934 | class_declaration /* Added, JDK1.1 inner classes */
935 { end_class_declaration (1); }
936 | interface_declaration /* Added, JDK1.1 inner interfaces */
937 { end_class_declaration (1); }
938 | empty_statement
941 /* 19.8.2 Productions from 8.3: Field Declarations */
942 field_declaration:
943 type variable_declarators SC_TK
944 { register_fields (0, $1, $2); }
945 | modifiers type variable_declarators SC_TK
947 check_modifiers
948 ("Illegal modifier %qs for field declaration",
949 $1, FIELD_MODIFIERS);
950 check_modifiers_consistency ($1);
951 register_fields ($1, $2, $3);
955 variable_declarators:
956 /* Should we use build_decl_list () instead ? FIXME */
957 variable_declarator /* Default rule */
958 | variable_declarators C_TK variable_declarator
959 { $$ = chainon ($1, $3); }
960 | variable_declarators C_TK error
961 {yyerror ("Missing term"); RECOVER;}
964 variable_declarator:
965 variable_declarator_id
966 { $$ = build_tree_list ($1, NULL_TREE); }
967 | variable_declarator_id ASSIGN_TK variable_initializer
969 if (java_error_count)
970 $3 = NULL_TREE;
971 $$ = build_tree_list
972 ($1, build_assignment ($2.token, $2.location, $1, $3));
974 | variable_declarator_id ASSIGN_TK error
976 yyerror ("Missing variable initializer");
977 $$ = build_tree_list ($1, NULL_TREE);
978 RECOVER;
980 | variable_declarator_id ASSIGN_TK variable_initializer error
982 yyerror ("';' expected");
983 $$ = build_tree_list ($1, NULL_TREE);
984 RECOVER;
988 variable_declarator_id:
989 identifier
990 | variable_declarator_id OSB_TK CSB_TK
991 { $$ = build_unresolved_array_type ($1); }
992 | identifier error
993 {yyerror ("Invalid declaration"); DRECOVER(vdi);}
994 | variable_declarator_id OSB_TK error
996 yyerror ("']' expected");
997 DRECOVER(vdi);
999 | variable_declarator_id CSB_TK error
1000 {yyerror ("Unbalanced ']'"); DRECOVER(vdi);}
1003 variable_initializer:
1004 expression
1005 | array_initializer
1008 /* 19.8.3 Productions from 8.4: Method Declarations */
1009 method_declaration:
1010 method_header
1012 current_function_decl = $1;
1013 if (current_function_decl
1014 && TREE_CODE (current_function_decl) == FUNCTION_DECL)
1015 source_start_java_method (current_function_decl);
1016 else
1017 current_function_decl = NULL_TREE;
1019 method_body
1020 { finish_method_declaration ($3); }
1021 | method_header error
1022 {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;}
1025 method_header:
1026 type method_declarator throws
1027 { $$ = method_header (0, $1, $2, $3); }
1028 | VOID_TK method_declarator throws
1029 { $$ = method_header (0, void_type_node, $2, $3); }
1030 | modifiers type method_declarator throws
1031 { $$ = method_header ($1, $2, $3, $4); }
1032 | modifiers VOID_TK method_declarator throws
1033 { $$ = method_header ($1, void_type_node, $3, $4); }
1034 | type error
1036 yyerror ("Invalid method declaration, method name required");
1037 $$ = NULL_TREE;
1038 RECOVER;
1040 | modifiers type error
1042 yyerror ("Identifier expected");
1043 $$ = NULL_TREE;
1044 RECOVER;
1046 | VOID_TK error
1048 yyerror ("Identifier expected");
1049 $$ = NULL_TREE;
1050 RECOVER;
1052 | modifiers VOID_TK error
1054 yyerror ("Identifier expected");
1055 $$ = NULL_TREE;
1056 RECOVER;
1058 | modifiers error
1060 yyerror ("Invalid method declaration, return type required");
1061 $$ = NULL_TREE;
1062 RECOVER;
1066 method_declarator:
1067 identifier OP_TK CP_TK
1069 ctxp->formal_parameter_number = 0;
1070 $$ = method_declarator ($1, NULL_TREE);
1072 | identifier OP_TK formal_parameter_list CP_TK
1073 { $$ = method_declarator ($1, $3); }
1074 | method_declarator OSB_TK CSB_TK
1076 SET_EXPR_LOCATION_FROM_TOKEN (wfl_operator, $2);
1077 TREE_PURPOSE ($1) =
1078 build_unresolved_array_type (TREE_PURPOSE ($1));
1079 parse_warning_context
1080 (wfl_operator,
1081 "Discouraged form of returned type specification");
1083 | identifier OP_TK error
1084 {yyerror ("')' expected"); DRECOVER(method_declarator);}
1085 | method_declarator OSB_TK error
1086 {yyerror ("']' expected"); RECOVER;}
1089 formal_parameter_list:
1090 formal_parameter
1092 ctxp->formal_parameter_number = 1;
1094 | formal_parameter_list C_TK formal_parameter
1096 ctxp->formal_parameter_number += 1;
1097 $$ = chainon ($1, $3);
1099 | formal_parameter_list C_TK error
1100 { yyerror ("Missing formal parameter term"); RECOVER; }
1103 formal_parameter:
1104 type variable_declarator_id
1106 $$ = build_tree_list ($2, $1);
1108 | final type variable_declarator_id /* Added, JDK1.1 final parms */
1110 $$ = build_tree_list ($3, $2);
1111 ARG_FINAL_P ($$) = 1;
1113 | type error
1115 yyerror ("Missing identifier"); RECOVER;
1116 $$ = NULL_TREE;
1118 | final type error
1120 yyerror ("Missing identifier"); RECOVER;
1121 $$ = NULL_TREE;
1125 final:
1126 modifiers
1128 check_modifiers ("Illegal modifier %qs. Only %<final%> was expected here",
1129 $1, ACC_FINAL);
1130 if ($1 != ACC_FINAL)
1131 MODIFIER_WFL (FINAL_TK) = build_wfl_node (NULL_TREE);
1135 throws:
1136 { $$ = NULL_TREE; }
1137 | THROWS_TK class_type_list
1138 { $$ = $2; }
1139 | THROWS_TK error
1140 {yyerror ("Missing class type term"); RECOVER;}
1143 class_type_list:
1144 class_type
1145 { $$ = build_tree_list ($1, $1); }
1146 | class_type_list C_TK class_type
1147 { $$ = tree_cons ($3, $3, $1); }
1148 | class_type_list C_TK error
1149 {yyerror ("Missing class type term"); RECOVER;}
1152 method_body:
1153 block
1154 | SC_TK { $$ = NULL_TREE; }
1157 /* 19.8.4 Productions from 8.5: Static Initializers */
1158 static_initializer:
1159 static block
1161 TREE_CHAIN ($2) = CPC_STATIC_INITIALIZER_STMT (ctxp);
1162 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, $2);
1163 current_static_block = NULL_TREE;
1167 static: /* Test lval.sub_token here */
1168 modifiers
1170 check_modifiers ("Illegal modifier %qs for static initializer", $1, ACC_STATIC);
1171 /* Can't have a static initializer in an innerclass */
1172 if ($1 | ACC_STATIC &&
1173 GET_CPC_LIST () && !TOPLEVEL_CLASS_DECL_P (GET_CPC ()))
1174 parse_error_context
1175 (MODIFIER_WFL (STATIC_TK),
1176 "Can't define static initializer in class %qs. Static initializer can only be defined in top-level classes",
1177 IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())));
1178 SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
1182 /* 19.8.5 Productions from 8.6: Constructor Declarations */
1183 constructor_declaration:
1184 constructor_header
1186 current_function_decl = $1;
1187 source_start_java_method (current_function_decl);
1189 constructor_body
1190 { finish_method_declaration ($3); }
1193 constructor_header:
1194 constructor_declarator throws
1195 { $$ = method_header (0, NULL_TREE, $1, $2); }
1196 | modifiers constructor_declarator throws
1197 { $$ = method_header ($1, NULL_TREE, $2, $3); }
1200 constructor_declarator:
1201 simple_name OP_TK CP_TK
1203 ctxp->formal_parameter_number = 0;
1204 $$ = method_declarator ($1, NULL_TREE);
1206 | simple_name OP_TK formal_parameter_list CP_TK
1207 { $$ = method_declarator ($1, $3); }
1210 constructor_body:
1211 /* Unlike regular method, we always need a complete (empty)
1212 body so we can safely perform all the required code
1213 addition (super invocation and field initialization) */
1214 block_begin constructor_block_end
1216 BLOCK_EXPR_BODY ($2) = build_java_empty_stmt ();
1217 $$ = $2;
1219 | block_begin explicit_constructor_invocation constructor_block_end
1220 { $$ = $3; }
1221 | block_begin block_statements constructor_block_end
1222 { $$ = $3; }
1223 | block_begin explicit_constructor_invocation block_statements constructor_block_end
1224 { $$ = $4; }
1227 constructor_block_end:
1228 block_end
1231 /* Error recovery for that rule moved down expression_statement: rule. */
1232 explicit_constructor_invocation:
1233 this_or_super OP_TK CP_TK SC_TK
1235 $$ = build_method_invocation ($1, NULL_TREE);
1236 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1237 $$ = java_method_add_stmt (current_function_decl, $$);
1239 | this_or_super OP_TK argument_list CP_TK SC_TK
1241 $$ = build_method_invocation ($1, $3);
1242 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1243 $$ = java_method_add_stmt (current_function_decl, $$);
1245 /* Added, JDK1.1 inner classes. Modified because the rule
1246 'primary' couldn't work. */
1247 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
1248 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1249 | name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
1250 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1253 this_or_super: /* Added, simplifies error diagnostics */
1254 THIS_TK
1256 tree wfl = build_wfl_node (this_identifier_node);
1257 SET_EXPR_LOCATION_FROM_TOKEN (wfl, $1);
1258 $$ = wfl;
1260 | SUPER_TK
1262 tree wfl = build_wfl_node (super_identifier_node);
1263 SET_EXPR_LOCATION_FROM_TOKEN (wfl, $1);
1264 $$ = wfl;
1268 /* 19.9 Productions from 9: Interfaces */
1269 /* 19.9.1 Productions from 9.1: Interfaces Declarations */
1270 interface_declaration:
1271 INTERFACE_TK identifier
1272 { create_interface (0, $2, NULL_TREE); }
1273 interface_body
1274 { ; }
1275 | modifiers INTERFACE_TK identifier
1276 { create_interface ($1, $3, NULL_TREE); }
1277 interface_body
1278 { ; }
1279 | INTERFACE_TK identifier extends_interfaces
1280 { create_interface (0, $2, $3); }
1281 interface_body
1282 { ; }
1283 | modifiers INTERFACE_TK identifier extends_interfaces
1284 { create_interface ($1, $3, $4); }
1285 interface_body
1286 { ; }
1287 | INTERFACE_TK identifier error
1288 { yyerror ("'{' expected"); RECOVER; }
1289 | modifiers INTERFACE_TK identifier error
1290 { yyerror ("'{' expected"); RECOVER; }
1293 extends_interfaces:
1294 EXTENDS_TK interface_type
1296 ctxp->interface_number = 1;
1297 $$ = build_tree_list ($2, NULL_TREE);
1299 | extends_interfaces C_TK interface_type
1301 ctxp->interface_number++;
1302 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
1304 | EXTENDS_TK error
1305 {yyerror ("Invalid interface type"); RECOVER;}
1306 | extends_interfaces C_TK error
1307 {yyerror ("Missing term"); RECOVER;}
1310 interface_body:
1311 OCB_TK CCB_TK
1312 { $$ = NULL_TREE; }
1313 | OCB_TK interface_member_declarations CCB_TK
1314 { $$ = NULL_TREE; }
1317 interface_member_declarations:
1318 interface_member_declaration
1319 | interface_member_declarations interface_member_declaration
1322 interface_member_declaration:
1323 constant_declaration
1324 | abstract_method_declaration
1325 | class_declaration /* Added, JDK1.1 inner classes */
1326 { end_class_declaration (1); }
1327 | interface_declaration /* Added, JDK1.1 inner interfaces */
1328 { end_class_declaration (1); }
1329 | empty_statement
1332 constant_declaration:
1333 field_declaration
1336 abstract_method_declaration:
1337 method_header SC_TK
1339 check_abstract_method_header ($1);
1340 current_function_decl = NULL_TREE; /* FIXME ? */
1342 | method_header error
1343 {yyerror ("';' expected"); RECOVER;}
1346 /* 19.10 Productions from 10: Arrays */
1347 array_initializer:
1348 OCB_TK CCB_TK
1349 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1350 | OCB_TK C_TK CCB_TK
1351 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1352 | OCB_TK variable_initializers CCB_TK
1353 { $$ = build_new_array_init ($1.location, $2); }
1354 | OCB_TK variable_initializers C_TK CCB_TK
1355 { $$ = build_new_array_init ($1.location, $2); }
1358 variable_initializers:
1359 variable_initializer
1361 $$ = tree_cons (maybe_build_array_element_wfl ($1),
1362 $1, NULL_TREE);
1364 | variable_initializers C_TK variable_initializer
1366 $$ = tree_cons (maybe_build_array_element_wfl ($3), $3, $1);
1368 | variable_initializers C_TK error
1369 {yyerror ("Missing term"); RECOVER;}
1372 /* 19.11 Production from 14: Blocks and Statements */
1373 block:
1374 block_begin block_end
1375 { $$ = $2; }
1376 | block_begin block_statements block_end
1377 { $$ = $3; }
1380 block_begin:
1381 OCB_TK
1382 { enter_block (); }
1385 block_end:
1386 CCB_TK
1388 maybe_absorb_scoping_blocks ();
1389 $$ = exit_block ();
1390 if (!BLOCK_SUBBLOCKS ($$))
1391 BLOCK_SUBBLOCKS ($$) = build_java_empty_stmt ();
1395 block_statements:
1396 block_statement
1397 | block_statements block_statement
1400 block_statement:
1401 local_variable_declaration_statement
1402 | statement
1403 { java_method_add_stmt (current_function_decl, $1); }
1404 | class_declaration /* Added, JDK1.1 local classes */
1406 LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1;
1407 end_class_declaration (1);
1411 local_variable_declaration_statement:
1412 local_variable_declaration SC_TK /* Can't catch missing ';' here */
1415 local_variable_declaration:
1416 type variable_declarators
1417 { declare_local_variables (0, $1, $2); }
1418 | final type variable_declarators /* Added, JDK1.1 final locals */
1419 { declare_local_variables ($1, $2, $3); }
1422 statement:
1423 statement_without_trailing_substatement
1424 | labeled_statement
1425 | if_then_statement
1426 | if_then_else_statement
1427 | while_statement
1428 | for_statement
1429 { $$ = exit_block (); }
1432 statement_nsi:
1433 statement_without_trailing_substatement
1434 | labeled_statement_nsi
1435 | if_then_else_statement_nsi
1436 | while_statement_nsi
1437 | for_statement_nsi
1438 { $$ = exit_block (); }
1441 statement_without_trailing_substatement:
1442 block
1443 | empty_statement
1444 | expression_statement
1445 | switch_statement
1446 | do_statement
1447 | break_statement
1448 | continue_statement
1449 | return_statement
1450 | synchronized_statement
1451 | throw_statement
1452 | try_statement
1453 | assert_statement
1456 empty_statement:
1457 SC_TK
1459 if (flag_extraneous_semicolon
1460 && ! current_static_block
1461 && (! current_function_decl ||
1462 /* Verify we're not in a inner class declaration */
1463 (GET_CPC () != TYPE_NAME
1464 (DECL_CONTEXT (current_function_decl)))))
1467 #ifdef USE_MAPPED_LOCATION
1468 SET_EXPR_LOCATION (wfl_operator, input_location);
1469 #else
1470 EXPR_WFL_SET_LINECOL (wfl_operator, input_line, -1);
1471 #endif
1472 parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used");
1474 $$ = build_java_empty_stmt ();
1478 label_decl:
1479 identifier REL_CL_TK
1481 $$ = build_labeled_block (EXPR_WFL_LINECOL ($1),
1482 EXPR_WFL_NODE ($1));
1483 pushlevel (2);
1484 push_labeled_block ($$);
1485 PUSH_LABELED_BLOCK ($$);
1489 labeled_statement:
1490 label_decl statement
1491 { $$ = finish_labeled_statement ($1, $2); }
1492 | identifier error
1493 {yyerror ("':' expected"); RECOVER;}
1496 labeled_statement_nsi:
1497 label_decl statement_nsi
1498 { $$ = finish_labeled_statement ($1, $2); }
1501 /* We concentrate here a bunch of error handling rules that we couldn't write
1502 earlier, because expression_statement catches a missing ';'. */
1503 expression_statement:
1504 statement_expression SC_TK
1506 /* We have a statement. Generate a WFL around it so
1507 we can debug it */
1508 #ifdef USE_MAPPED_LOCATION
1509 $$ = expr_add_location ($1, input_location, 1);
1510 #else
1511 $$ = build_expr_wfl ($1, input_filename, input_line, 0);
1512 JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
1513 #endif
1514 /* We know we have a statement, so set the debug
1515 info to be eventually generate here. */
1517 | error SC_TK
1519 YYNOT_TWICE yyerror ("Invalid expression statement");
1520 DRECOVER (expr_stmt);
1522 | error OCB_TK
1524 YYNOT_TWICE yyerror ("Invalid expression statement");
1525 DRECOVER (expr_stmt);
1527 | error CCB_TK
1529 YYNOT_TWICE yyerror ("Invalid expression statement");
1530 DRECOVER (expr_stmt);
1532 | this_or_super OP_TK error
1533 {yyerror ("')' expected"); RECOVER;}
1534 | this_or_super OP_TK CP_TK error
1536 parse_ctor_invocation_error ();
1537 RECOVER;
1539 | this_or_super OP_TK argument_list error
1540 {yyerror ("')' expected"); RECOVER;}
1541 | this_or_super OP_TK argument_list CP_TK error
1543 parse_ctor_invocation_error ();
1544 RECOVER;
1546 | name DOT_TK SUPER_TK error
1547 {yyerror ("'(' expected"); RECOVER;}
1548 | name DOT_TK SUPER_TK OP_TK error
1549 {yyerror ("')' expected"); RECOVER;}
1550 | name DOT_TK SUPER_TK OP_TK argument_list error
1551 {yyerror ("')' expected"); RECOVER;}
1552 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK error
1553 {yyerror ("';' expected"); RECOVER;}
1554 | name DOT_TK SUPER_TK OP_TK CP_TK error
1555 {yyerror ("';' expected"); RECOVER;}
1558 statement_expression:
1559 assignment
1560 | pre_increment_expression
1561 | pre_decrement_expression
1562 | post_increment_expression
1563 | post_decrement_expression
1564 | method_invocation
1565 | class_instance_creation_expression
1568 if_then_statement:
1569 IF_TK OP_TK expression CP_TK statement
1571 $$ = build_if_else_statement ($2.location, $3,
1572 $5, NULL_TREE);
1574 | IF_TK error
1575 {yyerror ("'(' expected"); RECOVER;}
1576 | IF_TK OP_TK error
1577 {yyerror ("Missing term"); RECOVER;}
1578 | IF_TK OP_TK expression error
1579 {yyerror ("')' expected"); RECOVER;}
1582 if_then_else_statement:
1583 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
1584 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1587 if_then_else_statement_nsi:
1588 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
1589 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1592 switch_statement:
1593 switch_expression
1595 enter_block ();
1597 switch_block
1599 /* Make into "proper list" of COMPOUND_EXPRs.
1600 I.e. make the last statement also have its own
1601 COMPOUND_EXPR. */
1602 maybe_absorb_scoping_blocks ();
1603 TREE_OPERAND ($1, 1) = exit_block ();
1604 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $1);
1608 switch_expression:
1609 SWITCH_TK OP_TK expression CP_TK
1611 $$ = build3 (SWITCH_EXPR, NULL_TREE, $3,
1612 NULL_TREE, NULL_TREE);
1613 SET_EXPR_LOCATION_FROM_TOKEN ($$, $2);
1615 | SWITCH_TK error
1616 {yyerror ("'(' expected"); RECOVER;}
1617 | SWITCH_TK OP_TK error
1618 {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);}
1619 | SWITCH_TK OP_TK expression CP_TK error
1620 {yyerror ("'{' expected"); RECOVER;}
1623 /* Default assignment is there to avoid type node on switch_block
1624 node. */
1626 switch_block:
1627 OCB_TK CCB_TK
1628 { $$ = NULL_TREE; }
1629 | OCB_TK switch_labels CCB_TK
1630 { $$ = NULL_TREE; }
1631 | OCB_TK switch_block_statement_groups CCB_TK
1632 { $$ = NULL_TREE; }
1633 | OCB_TK switch_block_statement_groups switch_labels CCB_TK
1634 { $$ = NULL_TREE; }
1637 switch_block_statement_groups:
1638 switch_block_statement_group
1639 | switch_block_statement_groups switch_block_statement_group
1642 switch_block_statement_group:
1643 switch_labels block_statements
1646 switch_labels:
1647 switch_label
1648 | switch_labels switch_label
1651 switch_label:
1652 CASE_TK constant_expression REL_CL_TK
1654 tree lab = build1 (CASE_EXPR, NULL_TREE, $2);
1655 SET_EXPR_LOCATION_FROM_TOKEN (lab, $1);
1656 java_method_add_stmt (current_function_decl, lab);
1658 | DEFAULT_TK REL_CL_TK
1660 tree lab = make_node (DEFAULT_EXPR);
1661 SET_EXPR_LOCATION_FROM_TOKEN (lab, $1);
1662 java_method_add_stmt (current_function_decl, lab);
1664 | CASE_TK error
1665 {yyerror ("Missing or invalid constant expression"); RECOVER;}
1666 | CASE_TK constant_expression error
1667 {yyerror ("':' expected"); RECOVER;}
1668 | DEFAULT_TK error
1669 {yyerror ("':' expected"); RECOVER;}
1672 while_expression:
1673 WHILE_TK OP_TK expression CP_TK
1675 tree body = build_loop_body ($2.location, $3, 0);
1676 $$ = build_new_loop (body);
1680 while_statement:
1681 while_expression statement
1682 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1683 | WHILE_TK error
1684 {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;}
1685 | WHILE_TK OP_TK error
1686 {yyerror ("Missing term and ')' expected"); RECOVER;}
1687 | WHILE_TK OP_TK expression error
1688 {yyerror ("')' expected"); RECOVER;}
1691 while_statement_nsi:
1692 while_expression statement_nsi
1693 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1696 do_statement_begin:
1697 DO_TK
1699 tree body = build_loop_body (0, NULL_TREE, 1);
1700 $$ = build_new_loop (body);
1702 /* Need error handing here. FIXME */
1705 do_statement:
1706 do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1707 { $$ = finish_loop_body ($4.location, $5, $2, 1); }
1710 for_statement:
1711 for_begin SC_TK expression SC_TK for_update CP_TK statement
1713 if (CONSTANT_CLASS_P ($3))
1714 $3 = build_wfl_node ($3);
1715 $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);
1717 | for_begin SC_TK SC_TK for_update CP_TK statement
1719 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1720 /* We have not condition, so we get rid of the EXIT_EXPR */
1721 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1722 build_java_empty_stmt ();
1724 | for_begin SC_TK error
1725 {yyerror ("Invalid control expression"); RECOVER;}
1726 | for_begin SC_TK expression SC_TK error
1727 {yyerror ("Invalid update expression"); RECOVER;}
1728 | for_begin SC_TK SC_TK error
1729 {yyerror ("Invalid update expression"); RECOVER;}
1732 for_statement_nsi:
1733 for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
1734 { $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);}
1735 | for_begin SC_TK SC_TK for_update CP_TK statement_nsi
1737 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1738 /* We have not condition, so we get rid of the EXIT_EXPR */
1739 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1740 build_java_empty_stmt ();
1744 for_header:
1745 FOR_TK OP_TK
1747 /* This scope defined for local variable that may be
1748 defined within the scope of the for loop */
1749 enter_block ();
1751 | FOR_TK error
1752 {yyerror ("'(' expected"); DRECOVER(for_1);}
1753 | FOR_TK OP_TK error
1754 {yyerror ("Invalid init statement"); RECOVER;}
1757 for_begin:
1758 for_header for_init
1760 /* We now declare the loop body. The loop is
1761 declared as a for loop. */
1762 tree body = build_loop_body (0, NULL_TREE, 0);
1763 $$ = build_new_loop (body);
1764 FOR_LOOP_P ($$) = 1;
1765 /* The loop is added to the current block the for
1766 statement is defined within */
1767 java_method_add_stmt (current_function_decl, $$);
1770 for_init: /* Can be empty */
1771 { $$ = build_java_empty_stmt (); }
1772 | statement_expression_list
1774 /* Init statement recorded within the previously
1775 defined block scope */
1776 $$ = java_method_add_stmt (current_function_decl, $1);
1778 | local_variable_declaration
1780 /* Local variable are recorded within the previously
1781 defined block scope */
1782 $$ = NULL_TREE;
1784 | statement_expression_list error
1785 {yyerror ("';' expected"); DRECOVER(for_init_1);}
1788 for_update: /* Can be empty */
1789 {$$ = build_java_empty_stmt ();}
1790 | statement_expression_list
1791 { $$ = build_debugable_stmt (BUILD_LOCATION (), $1); }
1794 statement_expression_list:
1795 statement_expression
1796 { $$ = add_stmt_to_compound (NULL_TREE, NULL_TREE, $1); }
1797 | statement_expression_list C_TK statement_expression
1798 { $$ = add_stmt_to_compound ($1, NULL_TREE, $3); }
1799 | statement_expression_list C_TK error
1800 {yyerror ("Missing term"); RECOVER;}
1803 break_statement:
1804 BREAK_TK SC_TK
1805 { $$ = build_bc_statement ($1.location, 1, NULL_TREE); }
1806 | BREAK_TK identifier SC_TK
1807 { $$ = build_bc_statement ($1.location, 1, $2); }
1808 | BREAK_TK error
1809 {yyerror ("Missing term"); RECOVER;}
1810 | BREAK_TK identifier error
1811 {yyerror ("';' expected"); RECOVER;}
1814 continue_statement:
1815 CONTINUE_TK SC_TK
1816 { $$ = build_bc_statement ($1.location, 0, NULL_TREE); }
1817 | CONTINUE_TK identifier SC_TK
1818 { $$ = build_bc_statement ($1.location, 0, $2); }
1819 | CONTINUE_TK error
1820 {yyerror ("Missing term"); RECOVER;}
1821 | CONTINUE_TK identifier error
1822 {yyerror ("';' expected"); RECOVER;}
1825 return_statement:
1826 RETURN_TK SC_TK
1827 { $$ = build_return ($1.location, NULL_TREE); }
1828 | RETURN_TK expression SC_TK
1829 { $$ = build_return ($1.location, $2); }
1830 | RETURN_TK error
1831 {yyerror ("Missing term"); RECOVER;}
1832 | RETURN_TK expression error
1833 {yyerror ("';' expected"); RECOVER;}
1836 throw_statement:
1837 THROW_TK expression SC_TK
1839 $$ = build1 (THROW_EXPR, NULL_TREE, $2);
1840 SET_EXPR_LOCATION_FROM_TOKEN ($$, $1);
1842 | THROW_TK error
1843 {yyerror ("Missing term"); RECOVER;}
1844 | THROW_TK expression error
1845 {yyerror ("';' expected"); RECOVER;}
1848 assert_statement:
1849 ASSERT_TK expression REL_CL_TK expression SC_TK
1851 $$ = build_assertion ($1.location, $2, $4);
1853 | ASSERT_TK expression SC_TK
1855 $$ = build_assertion ($1.location, $2, NULL_TREE);
1857 | ASSERT_TK error
1858 {yyerror ("Missing term"); RECOVER;}
1859 | ASSERT_TK expression error
1860 {yyerror ("';' expected"); RECOVER;}
1863 synchronized_statement:
1864 synchronized OP_TK expression CP_TK block
1866 $$ = build2 (SYNCHRONIZED_EXPR, NULL_TREE, $3, $5);
1867 EXPR_WFL_LINECOL ($$) =
1868 EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK));
1870 | synchronized OP_TK expression CP_TK error
1871 {yyerror ("'{' expected"); RECOVER;}
1872 | synchronized error
1873 {yyerror ("'(' expected"); RECOVER;}
1874 | synchronized OP_TK error CP_TK
1875 {yyerror ("Missing term"); RECOVER;}
1876 | synchronized OP_TK error
1877 {yyerror ("Missing term"); RECOVER;}
1880 synchronized:
1881 modifiers
1883 check_modifiers (
1884 "Illegal modifier %qs. Only %<synchronized%> was expected here",
1885 $1, ACC_SYNCHRONIZED);
1886 if ($1 != ACC_SYNCHRONIZED)
1887 MODIFIER_WFL (SYNCHRONIZED_TK) =
1888 build_wfl_node (NULL_TREE);
1892 try_statement:
1893 TRY_TK block catches
1894 { $$ = build_try_statement ($1.location, $2, $3); }
1895 | TRY_TK block finally
1896 { $$ = build_try_finally_statement ($1.location, $2, $3); }
1897 | TRY_TK block catches finally
1898 { $$ = build_try_finally_statement
1899 ($1.location, build_try_statement ($1.location,
1900 $2, $3), $4);
1902 | TRY_TK error
1903 {yyerror ("'{' expected"); DRECOVER (try_statement);}
1906 catches:
1907 catch_clause
1908 | catches catch_clause
1910 TREE_CHAIN ($2) = $1;
1911 $$ = $2;
1915 catch_clause:
1916 catch_clause_parameter block
1918 java_method_add_stmt (current_function_decl, $2);
1919 exit_block ();
1920 $$ = $1;
1924 catch_clause_parameter:
1925 CATCH_TK OP_TK formal_parameter CP_TK
1927 /* We add a block to define a scope for
1928 formal_parameter (CCBP). The formal parameter is
1929 declared initialized by the appropriate function
1930 call */
1931 tree ccpb;
1932 tree init;
1933 if ($3)
1935 ccpb = enter_block ();
1936 init = build_assignment
1937 (ASSIGN_TK, $2.location, TREE_PURPOSE ($3),
1938 build0 (JAVA_EXC_OBJ_EXPR, ptr_type_node));
1939 declare_local_variables (0, TREE_VALUE ($3),
1940 build_tree_list
1941 (TREE_PURPOSE ($3), init));
1942 $$ = build1 (JAVA_CATCH_EXPR, NULL_TREE, ccpb);
1943 SET_EXPR_LOCATION_FROM_TOKEN ($$, $1);
1945 else
1947 $$ = error_mark_node;
1950 | CATCH_TK error
1951 {yyerror ("'(' expected"); RECOVER; $$ = NULL_TREE;}
1952 | CATCH_TK OP_TK error
1954 yyerror ("Missing term or ')' expected");
1955 RECOVER; $$ = NULL_TREE;
1957 | CATCH_TK OP_TK error CP_TK /* That's for () */
1958 {yyerror ("Missing term"); RECOVER; $$ = NULL_TREE;}
1961 finally:
1962 FINALLY_TK block
1963 { $$ = $2; }
1964 | FINALLY_TK error
1965 {yyerror ("'{' expected"); RECOVER; }
1968 /* 19.12 Production from 15: Expressions */
1969 primary:
1970 primary_no_new_array
1971 | array_creation_uninitialized
1972 | array_creation_initialized
1975 primary_no_new_array:
1976 literal
1977 | THIS_TK
1978 { $$ = build_this ($1.location); }
1979 | OP_TK expression CP_TK
1980 {$$ = $2;}
1981 | class_instance_creation_expression
1982 | field_access
1983 | method_invocation
1984 | array_access
1985 | type_literals
1986 /* Added, JDK1.1 inner classes. Documentation is wrong
1987 referring to a 'ClassName' (class_name) rule that doesn't
1988 exist. Used name: instead. */
1989 | name DOT_TK THIS_TK
1991 tree wfl = build_wfl_node (this_identifier_node);
1992 $$ = make_qualified_primary ($1, wfl, EXPR_WFL_LINECOL ($1));
1994 | OP_TK expression error
1995 {yyerror ("')' expected"); RECOVER;}
1996 | name DOT_TK error
1997 {yyerror ("'class' or 'this' expected" ); RECOVER;}
1998 | primitive_type DOT_TK error
1999 {yyerror ("'class' expected" ); RECOVER;}
2000 | VOID_TK DOT_TK error
2001 {yyerror ("'class' expected" ); RECOVER;}
2004 type_literals:
2005 name DOT_TK CLASS_TK
2006 { $$ = build_incomplete_class_ref ($2.location, $1); }
2007 | array_type DOT_TK CLASS_TK
2008 { $$ = build_incomplete_class_ref ($2.location, $1); }
2009 | primitive_type DOT_TK CLASS_TK
2010 { $$ = build_incomplete_class_ref ($2.location, $1); }
2011 | VOID_TK DOT_TK CLASS_TK
2013 $$ = build_incomplete_class_ref ($2.location,
2014 void_type_node);
2018 class_instance_creation_expression:
2019 NEW_TK class_type OP_TK argument_list CP_TK
2020 { $$ = build_new_invocation ($2, $4); }
2021 | NEW_TK class_type OP_TK CP_TK
2022 { $$ = build_new_invocation ($2, NULL_TREE); }
2023 | anonymous_class_creation
2024 /* Added, JDK1.1 inner classes, modified to use name or
2025 primary instead of primary solely which couldn't work in
2026 all situations. */
2027 | something_dot_new identifier OP_TK CP_TK
2029 tree ctor = build_new_invocation ($2, NULL_TREE);
2030 $$ = make_qualified_primary ($1, ctor,
2031 EXPR_WFL_LINECOL ($1));
2033 | something_dot_new identifier OP_TK CP_TK class_body
2034 | something_dot_new identifier OP_TK argument_list CP_TK
2036 tree ctor = build_new_invocation ($2, $4);
2037 $$ = make_qualified_primary ($1, ctor,
2038 EXPR_WFL_LINECOL ($1));
2040 | something_dot_new identifier OP_TK argument_list CP_TK class_body
2041 | NEW_TK error SC_TK
2042 {$$ = NULL_TREE; yyerror ("'(' expected"); DRECOVER(new_1);}
2043 | NEW_TK class_type error
2044 {$$ = NULL_TREE; yyerror ("'(' expected"); RECOVER;}
2045 | NEW_TK class_type OP_TK error
2046 {$$ = NULL_TREE; yyerror ("')' or term expected"); RECOVER;}
2047 | NEW_TK class_type OP_TK argument_list error
2048 {$$ = NULL_TREE; yyerror ("')' expected"); RECOVER;}
2049 | something_dot_new error
2051 $$ = NULL_TREE;
2052 YYERROR_NOW;
2053 yyerror ("Identifier expected");
2054 RECOVER;
2056 | something_dot_new identifier error
2057 {$$ = NULL_TREE; yyerror ("'(' expected"); RECOVER;}
2060 /* Created after JDK1.1 rules originally added to
2061 class_instance_creation_expression, but modified to use
2062 'class_type' instead of 'TypeName' (type_name) which is mentioned
2063 in the documentation but doesn't exist. */
2065 anonymous_class_creation:
2066 NEW_TK class_type OP_TK argument_list CP_TK
2067 { create_anonymous_class ($2); }
2068 class_body
2070 tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2071 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2073 end_class_declaration (1);
2075 /* Now we can craft the new expression */
2076 $$ = build_new_invocation (id, $4);
2078 /* Note that we can't possibly be here if
2079 `class_type' is an interface (in which case the
2080 anonymous class extends Object and implements
2081 `class_type', hence its constructor can't have
2082 arguments.) */
2084 /* Otherwise, the innerclass must feature a
2085 constructor matching `argument_list'. Anonymous
2086 classes are a bit special: it's impossible to
2087 define constructor for them, hence constructors
2088 must be generated following the hints provided by
2089 the `new' expression. Whether a super constructor
2090 of that nature exists or not is to be verified
2091 later on in get_constructor_super.
2093 It's during the expansion of a `new' statement
2094 referring to an anonymous class that a ctor will
2095 be generated for the anonymous class, with the
2096 right arguments. */
2099 | NEW_TK class_type OP_TK CP_TK
2100 { create_anonymous_class ($2); }
2101 class_body
2103 tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2104 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2106 end_class_declaration (1);
2108 /* Now we can craft the new expression. The
2109 statement doesn't need to be remember so that a
2110 constructor can be generated, since its signature
2111 is already known. */
2112 $$ = build_new_invocation (id, NULL_TREE);
2116 something_dot_new: /* Added, not part of the specs. */
2117 name DOT_TK NEW_TK
2118 { $$ = $1; }
2119 | primary DOT_TK NEW_TK
2120 { $$ = $1; }
2123 argument_list:
2124 expression
2126 $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
2127 ctxp->formal_parameter_number = 1;
2129 | argument_list C_TK expression
2131 ctxp->formal_parameter_number += 1;
2132 $$ = tree_cons (NULL_TREE, $3, $1);
2134 | argument_list C_TK error
2135 {yyerror ("Missing term"); RECOVER;}
2138 array_creation_uninitialized:
2139 NEW_TK primitive_type dim_exprs
2140 { $$ = build_newarray_node ($2, $3, 0); }
2141 | NEW_TK class_or_interface_type dim_exprs
2142 { $$ = build_newarray_node ($2, $3, 0); }
2143 | NEW_TK primitive_type dim_exprs dims
2144 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2145 | NEW_TK class_or_interface_type dim_exprs dims
2146 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2147 | NEW_TK error CSB_TK
2148 {yyerror ("'[' expected"); DRECOVER ("]");}
2149 | NEW_TK error OSB_TK
2150 {yyerror ("']' expected"); RECOVER;}
2153 array_creation_initialized:
2154 /* Added, JDK1.1 anonymous array. Initial documentation rule
2155 modified */
2156 NEW_TK class_or_interface_type dims array_initializer
2158 char *sig;
2159 int osb = pop_current_osb (ctxp);
2160 while (osb--)
2161 obstack_grow (&temporary_obstack, "[]", 2);
2162 obstack_1grow (&temporary_obstack, '\0');
2163 sig = obstack_finish (&temporary_obstack);
2164 $$ = build3 (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2165 $2, get_identifier (sig), $4);
2167 | NEW_TK primitive_type dims array_initializer
2169 int osb = pop_current_osb (ctxp);
2170 tree type = $2;
2171 while (osb--)
2172 type = build_java_array_type (type, -1);
2173 $$ = build3 (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2174 build_pointer_type (type), NULL_TREE, $4);
2176 | NEW_TK error CSB_TK
2177 {yyerror ("'[' expected"); DRECOVER ("]");}
2178 | NEW_TK error OSB_TK
2179 {yyerror ("']' expected"); RECOVER;}
2182 dim_exprs:
2183 dim_expr
2184 { $$ = build_tree_list (NULL_TREE, $1); }
2185 | dim_exprs dim_expr
2186 { $$ = tree_cons (NULL_TREE, $2, $$); }
2189 dim_expr:
2190 OSB_TK expression CSB_TK
2192 if (JNUMERIC_TYPE_P (TREE_TYPE ($2)))
2194 $2 = build_wfl_node ($2);
2195 TREE_TYPE ($2) = NULL_TREE;
2197 EXPR_WFL_LINECOL ($2) = $1.location;
2198 $$ = $2;
2200 | OSB_TK expression error
2201 {yyerror ("']' expected"); RECOVER;}
2202 | OSB_TK error
2204 yyerror ("Missing term");
2205 yyerror ("']' expected");
2206 RECOVER;
2210 dims:
2211 OSB_TK CSB_TK
2213 int allocate = 0;
2214 /* If not initialized, allocate memory for the osb
2215 numbers stack */
2216 if (!ctxp->osb_limit)
2218 allocate = ctxp->osb_limit = 32;
2219 ctxp->osb_depth = -1;
2221 /* If capacity overflown, reallocate a bigger chunk */
2222 else if (ctxp->osb_depth+1 == ctxp->osb_limit)
2223 allocate = ctxp->osb_limit << 1;
2225 if (allocate)
2227 allocate *= sizeof (int);
2228 if (ctxp->osb_number)
2229 ctxp->osb_number = xrealloc (ctxp->osb_number,
2230 allocate);
2231 else
2232 ctxp->osb_number = xmalloc (allocate);
2234 ctxp->osb_depth++;
2235 CURRENT_OSB (ctxp) = 1;
2237 | dims OSB_TK CSB_TK
2238 { CURRENT_OSB (ctxp)++; }
2239 | dims OSB_TK error
2240 { yyerror ("']' expected"); RECOVER;}
2243 field_access:
2244 primary DOT_TK identifier
2245 { $$ = make_qualified_primary ($1, $3, $2.location); }
2246 /* FIXME - REWRITE TO:
2247 { $$ = build_binop (COMPONENT_REF, $2.location, $1, $3); } */
2248 | SUPER_TK DOT_TK identifier
2250 tree super_wfl = build_wfl_node (super_identifier_node);
2251 SET_EXPR_LOCATION_FROM_TOKEN (super_wfl, $1);
2252 $$ = make_qualified_name (super_wfl, $3, $2.location);
2254 | SUPER_TK error
2255 {yyerror ("Field expected"); DRECOVER (super_field_acces);}
2258 method_invocation:
2259 name OP_TK CP_TK
2260 { $$ = build_method_invocation ($1, NULL_TREE); }
2261 | name OP_TK argument_list CP_TK
2262 { $$ = build_method_invocation ($1, $3); }
2263 | primary DOT_TK identifier OP_TK CP_TK
2265 if (TREE_CODE ($1) == THIS_EXPR)
2266 $$ = build_this_super_qualified_invocation
2267 (1, $3, NULL_TREE, 0, $2.location);
2268 else
2270 tree invok = build_method_invocation ($3, NULL_TREE);
2271 $$ = make_qualified_primary ($1, invok, $2.location);
2274 | primary DOT_TK identifier OP_TK argument_list CP_TK
2276 if (TREE_CODE ($1) == THIS_EXPR)
2277 $$ = build_this_super_qualified_invocation
2278 (1, $3, $5, 0, $2.location);
2279 else
2281 tree invok = build_method_invocation ($3, $5);
2282 $$ = make_qualified_primary ($1, invok, $2.location);
2285 | SUPER_TK DOT_TK identifier OP_TK CP_TK
2287 $$ = build_this_super_qualified_invocation
2288 (0, $3, NULL_TREE, $1.location, $2.location);
2290 | SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
2292 $$ = build_this_super_qualified_invocation
2293 (0, $3, $5, $1.location, $2.location);
2295 /* Screws up thing. I let it here until I'm convinced it can
2296 be removed. FIXME
2297 | primary DOT_TK error
2298 {yyerror ("'(' expected"); DRECOVER(bad);} */
2299 | SUPER_TK DOT_TK error CP_TK
2300 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2301 | SUPER_TK DOT_TK error DOT_TK
2302 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2305 array_access:
2306 name OSB_TK expression CSB_TK
2307 { $$ = build_array_ref ($2.location, $1, $3); }
2308 | primary_no_new_array OSB_TK expression CSB_TK
2309 { $$ = build_array_ref ($2.location, $1, $3); }
2310 | array_creation_initialized OSB_TK expression CSB_TK
2311 { $$ = build_array_ref ($2.location, $1, $3); }
2312 | name OSB_TK error
2314 yyerror ("Missing term and ']' expected");
2315 DRECOVER(array_access);
2317 | name OSB_TK expression error
2319 yyerror ("']' expected");
2320 DRECOVER(array_access);
2322 | primary_no_new_array OSB_TK error
2324 yyerror ("Missing term and ']' expected");
2325 DRECOVER(array_access);
2327 | primary_no_new_array OSB_TK expression error
2329 yyerror ("']' expected");
2330 DRECOVER(array_access);
2332 | array_creation_initialized OSB_TK error
2334 yyerror ("Missing term and ']' expected");
2335 DRECOVER(array_access);
2337 | array_creation_initialized OSB_TK expression error
2339 yyerror ("']' expected");
2340 DRECOVER(array_access);
2344 postfix_expression:
2345 primary
2346 | name
2347 | post_increment_expression
2348 | post_decrement_expression
2351 post_increment_expression:
2352 postfix_expression INCR_TK
2353 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2356 post_decrement_expression:
2357 postfix_expression DECR_TK
2358 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2361 trap_overflow_corner_case:
2362 pre_increment_expression
2363 | pre_decrement_expression
2364 | PLUS_TK unary_expression
2365 {$$ = build_unaryop ($1.token, $1.location, $2); }
2366 | unary_expression_not_plus_minus
2367 | PLUS_TK error
2368 {yyerror ("Missing term"); RECOVER}
2371 unary_expression:
2372 trap_overflow_corner_case
2374 if ($1)
2375 error_if_numeric_overflow ($1);
2376 $$ = $1;
2378 | MINUS_TK trap_overflow_corner_case
2379 {$$ = build_unaryop ($1.token, $1.location, $2); }
2380 | MINUS_TK error
2381 {yyerror ("Missing term"); RECOVER}
2384 pre_increment_expression:
2385 INCR_TK unary_expression
2386 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2387 | INCR_TK error
2388 {yyerror ("Missing term"); RECOVER}
2391 pre_decrement_expression:
2392 DECR_TK unary_expression
2393 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2394 | DECR_TK error
2395 {yyerror ("Missing term"); RECOVER}
2398 unary_expression_not_plus_minus:
2399 postfix_expression
2400 | NOT_TK unary_expression
2401 {$$ = build_unaryop ($1.token, $1.location, $2); }
2402 | NEG_TK unary_expression
2403 {$$ = build_unaryop ($1.token, $1.location, $2); }
2404 | cast_expression
2405 | NOT_TK error
2406 {yyerror ("Missing term"); RECOVER}
2407 | NEG_TK error
2408 {yyerror ("Missing term"); RECOVER}
2411 cast_expression: /* Error handling here is potentially weak */
2412 OP_TK primitive_type dims CP_TK unary_expression
2414 tree type = $2;
2415 int osb = pop_current_osb (ctxp);
2416 while (osb--)
2417 type = build_java_array_type (type, -1);
2418 $$ = build_cast ($1.location, type, $5);
2420 | OP_TK primitive_type CP_TK unary_expression
2421 { $$ = build_cast ($1.location, $2, $4); }
2422 | OP_TK expression CP_TK unary_expression_not_plus_minus
2423 { $$ = build_cast ($1.location, $2, $4); }
2424 | OP_TK name dims CP_TK unary_expression_not_plus_minus
2426 const char *ptr;
2427 int osb = pop_current_osb (ctxp);
2428 obstack_grow (&temporary_obstack,
2429 IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)),
2430 IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2)));
2431 while (osb--)
2432 obstack_grow (&temporary_obstack, "[]", 2);
2433 obstack_1grow (&temporary_obstack, '\0');
2434 ptr = obstack_finish (&temporary_obstack);
2435 EXPR_WFL_NODE ($2) = get_identifier (ptr);
2436 $$ = build_cast ($1.location, $2, $5);
2438 | OP_TK primitive_type OSB_TK error
2439 {yyerror ("']' expected, invalid type expression");}
2440 | OP_TK error
2442 YYNOT_TWICE yyerror ("Invalid type expression"); RECOVER;
2443 RECOVER;
2445 | OP_TK primitive_type dims CP_TK error
2446 {yyerror ("Missing term"); RECOVER;}
2447 | OP_TK primitive_type CP_TK error
2448 {yyerror ("Missing term"); RECOVER;}
2449 | OP_TK name dims CP_TK error
2450 {yyerror ("Missing term"); RECOVER;}
2453 multiplicative_expression:
2454 unary_expression
2455 | multiplicative_expression MULT_TK unary_expression
2457 $$ = build_binop (BINOP_LOOKUP ($2.token),
2458 $2.location, $1, $3);
2460 | multiplicative_expression DIV_TK unary_expression
2462 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2463 $1, $3);
2465 | multiplicative_expression REM_TK unary_expression
2467 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2468 $1, $3);
2470 | multiplicative_expression MULT_TK error
2471 {yyerror ("Missing term"); RECOVER;}
2472 | multiplicative_expression DIV_TK error
2473 {yyerror ("Missing term"); RECOVER;}
2474 | multiplicative_expression REM_TK error
2475 {yyerror ("Missing term"); RECOVER;}
2478 additive_expression:
2479 multiplicative_expression
2480 | additive_expression PLUS_TK multiplicative_expression
2482 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2483 $1, $3);
2485 | additive_expression MINUS_TK multiplicative_expression
2487 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2488 $1, $3);
2490 | additive_expression PLUS_TK error
2491 {yyerror ("Missing term"); RECOVER;}
2492 | additive_expression MINUS_TK error
2493 {yyerror ("Missing term"); RECOVER;}
2496 shift_expression:
2497 additive_expression
2498 | shift_expression LS_TK additive_expression
2500 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2501 $1, $3);
2503 | shift_expression SRS_TK additive_expression
2505 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2506 $1, $3);
2508 | shift_expression ZRS_TK additive_expression
2510 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2511 $1, $3);
2513 | shift_expression LS_TK error
2514 {yyerror ("Missing term"); RECOVER;}
2515 | shift_expression SRS_TK error
2516 {yyerror ("Missing term"); RECOVER;}
2517 | shift_expression ZRS_TK error
2518 {yyerror ("Missing term"); RECOVER;}
2521 relational_expression:
2522 shift_expression
2523 | relational_expression LT_TK shift_expression
2525 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2526 $1, $3);
2528 | relational_expression GT_TK shift_expression
2530 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2531 $1, $3);
2533 | relational_expression LTE_TK shift_expression
2535 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2536 $1, $3);
2538 | relational_expression GTE_TK shift_expression
2540 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2541 $1, $3);
2543 | relational_expression INSTANCEOF_TK reference_type
2544 { $$ = build_binop (INSTANCEOF_EXPR, $2.location, $1, $3); }
2545 | relational_expression LT_TK error
2546 {yyerror ("Missing term"); RECOVER;}
2547 | relational_expression GT_TK error
2548 {yyerror ("Missing term"); RECOVER;}
2549 | relational_expression LTE_TK error
2550 {yyerror ("Missing term"); RECOVER;}
2551 | relational_expression GTE_TK error
2552 {yyerror ("Missing term"); RECOVER;}
2553 | relational_expression INSTANCEOF_TK error
2554 {yyerror ("Invalid reference type"); RECOVER;}
2557 equality_expression:
2558 relational_expression
2559 | equality_expression EQ_TK relational_expression
2561 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2562 $1, $3);
2564 | equality_expression NEQ_TK relational_expression
2566 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2567 $1, $3);
2569 | equality_expression EQ_TK error
2570 {yyerror ("Missing term"); RECOVER;}
2571 | equality_expression NEQ_TK error
2572 {yyerror ("Missing term"); RECOVER;}
2575 and_expression:
2576 equality_expression
2577 | and_expression AND_TK equality_expression
2579 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2580 $1, $3);
2582 | and_expression AND_TK error
2583 {yyerror ("Missing term"); RECOVER;}
2586 exclusive_or_expression:
2587 and_expression
2588 | exclusive_or_expression XOR_TK and_expression
2590 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2591 $1, $3);
2593 | exclusive_or_expression XOR_TK error
2594 {yyerror ("Missing term"); RECOVER;}
2597 inclusive_or_expression:
2598 exclusive_or_expression
2599 | inclusive_or_expression OR_TK exclusive_or_expression
2601 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2602 $1, $3);
2604 | inclusive_or_expression OR_TK error
2605 {yyerror ("Missing term"); RECOVER;}
2608 conditional_and_expression:
2609 inclusive_or_expression
2610 | conditional_and_expression BOOL_AND_TK inclusive_or_expression
2612 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2613 $1, $3);
2615 | conditional_and_expression BOOL_AND_TK error
2616 {yyerror ("Missing term"); RECOVER;}
2619 conditional_or_expression:
2620 conditional_and_expression
2621 | conditional_or_expression BOOL_OR_TK conditional_and_expression
2623 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2624 $1, $3);
2626 | conditional_or_expression BOOL_OR_TK error
2627 {yyerror ("Missing term"); RECOVER;}
2630 conditional_expression: /* Error handling here is weak */
2631 conditional_or_expression
2632 | conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
2634 $$ = build3 (CONDITIONAL_EXPR, NULL_TREE, $1, $3, $5);
2635 SET_EXPR_LOCATION_FROM_TOKEN ($$, $2);
2637 | conditional_or_expression REL_QM_TK REL_CL_TK error
2639 YYERROR_NOW;
2640 yyerror ("Missing term");
2641 DRECOVER (1);
2643 | conditional_or_expression REL_QM_TK error
2644 {yyerror ("Missing term"); DRECOVER (2);}
2645 | conditional_or_expression REL_QM_TK expression REL_CL_TK error
2646 {yyerror ("Missing term"); DRECOVER (3);}
2649 assignment_expression:
2650 conditional_expression
2651 | assignment
2654 assignment:
2655 left_hand_side assignment_operator assignment_expression
2656 { $$ = build_assignment ($2.token, $2.location, $1, $3); }
2657 | left_hand_side assignment_operator error
2659 YYNOT_TWICE yyerror ("Missing term");
2660 DRECOVER (assign);
2664 left_hand_side:
2665 name
2666 | field_access
2667 | array_access
2670 assignment_operator:
2671 ASSIGN_ANY_TK
2672 | ASSIGN_TK
2675 expression:
2676 assignment_expression
2679 constant_expression:
2680 expression
2685 /* Helper function to retrieve an OSB count. Should be used when the
2686 `dims:' rule is being used. */
2688 static int
2689 pop_current_osb (struct parser_ctxt *ctxp)
2691 int to_return;
2693 if (ctxp->osb_depth < 0)
2694 abort ();
2696 to_return = CURRENT_OSB (ctxp);
2697 ctxp->osb_depth--;
2699 return to_return;
2704 /* This section of the code deal with save/restoring parser contexts.
2705 Add mode documentation here. FIXME */
2707 /* Helper function. Create a new parser context. With
2708 COPY_FROM_PREVIOUS set to a nonzero value, content of the previous
2709 context is copied, otherwise, the new context is zeroed. The newly
2710 created context becomes the current one. */
2712 static void
2713 create_new_parser_context (int copy_from_previous)
2715 struct parser_ctxt *new;
2717 new = ggc_alloc (sizeof (struct parser_ctxt));
2718 if (copy_from_previous)
2720 memcpy (new, ctxp, sizeof (struct parser_ctxt));
2721 /* This flag, indicating the context saves global values,
2722 should only be set by java_parser_context_save_global. */
2723 new->saved_data_ctx = 0;
2725 else
2726 memset (new, 0, sizeof (struct parser_ctxt));
2728 new->next = ctxp;
2729 ctxp = new;
2732 /* Create a new parser context and make it the current one. */
2734 void
2735 java_push_parser_context (void)
2737 create_new_parser_context (0);
2740 void
2741 java_pop_parser_context (int generate)
2743 tree current;
2744 struct parser_ctxt *next;
2746 if (!ctxp)
2747 return;
2749 next = ctxp->next;
2750 if (next)
2752 input_location = ctxp->save_location;
2753 current_class = ctxp->class_type;
2756 /* If the old and new lexers differ, then free the old one. */
2757 if (ctxp->lexer && next && ctxp->lexer != next->lexer)
2758 java_destroy_lexer (ctxp->lexer);
2760 /* Set the single import class file flag to 0 for the current list
2761 of imported things */
2762 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2763 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 0;
2765 /* If we pushed a context to parse a class intended to be generated,
2766 we keep it so we can remember the class. What we could actually
2767 do is to just update a list of class names. */
2768 if (generate)
2770 if (ctxp_for_generation_last == NULL)
2771 ctxp_for_generation = ctxp;
2772 else
2773 ctxp_for_generation_last->next = ctxp;
2774 ctxp->next = NULL;
2775 ctxp_for_generation_last = ctxp;
2778 /* And restore those of the previous context */
2779 if ((ctxp = next)) /* Assignment is really meant here */
2780 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2781 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 1;
2784 /* Create a parser context for the use of saving some global
2785 variables. */
2787 void
2788 java_parser_context_save_global (void)
2790 if (!ctxp)
2792 java_push_parser_context ();
2793 ctxp->saved_data_ctx = 1;
2796 /* If this context already stores data, create a new one suitable
2797 for data storage. */
2798 else if (ctxp->saved_data)
2800 create_new_parser_context (1);
2801 ctxp->saved_data_ctx = 1;
2804 ctxp->save_location = input_location;
2805 ctxp->class_type = current_class;
2806 ctxp->function_decl = current_function_decl;
2807 ctxp->saved_data = 1;
2810 /* Restore some global variables from the previous context. Make the
2811 previous context the current one. */
2813 void
2814 java_parser_context_restore_global (void)
2816 input_location = ctxp->save_location;
2817 current_class = ctxp->class_type;
2818 if (wfl_operator)
2819 #ifdef USE_MAPPED_LOCATION
2820 SET_EXPR_LOCATION (wfl_operator, ctxp->save_location);
2821 #else
2822 EXPR_WFL_FILENAME_NODE (wfl_operator) = get_identifier (input_filename);
2823 #endif
2824 current_function_decl = ctxp->function_decl;
2825 ctxp->saved_data = 0;
2826 if (ctxp->saved_data_ctx)
2827 java_pop_parser_context (0);
2830 /* Suspend vital data for the current class/function being parsed so
2831 that an other class can be parsed. Used to let local/anonymous
2832 classes be parsed. */
2834 static void
2835 java_parser_context_suspend (void)
2837 /* This makes debugging through java_debug_context easier */
2838 static const char *const name = "<inner buffer context>";
2840 /* Duplicate the previous context, use it to save the globals we're
2841 interested in */
2842 create_new_parser_context (1);
2843 ctxp->function_decl = current_function_decl;
2844 ctxp->class_type = current_class;
2846 /* Then create a new context which inherits all data from the
2847 previous one. This will be the new current context */
2848 create_new_parser_context (1);
2850 /* Help debugging */
2851 ctxp->next->filename = name;
2854 /* Resume vital data for the current class/function being parsed so
2855 that an other class can be parsed. Used to let local/anonymous
2856 classes be parsed. The trick is the data storing file position
2857 informations must be restored to their current value, so parsing
2858 can resume as if no context was ever saved. */
2860 static void
2861 java_parser_context_resume (void)
2863 struct parser_ctxt *old = ctxp; /* This one is to be discarded */
2864 struct parser_ctxt *saver = old->next; /* This one contain saved info */
2865 struct parser_ctxt *restored = saver->next; /* This one is the old current */
2867 /* We need to inherit the list of classes to complete/generate */
2868 restored->classd_list = old->classd_list;
2869 restored->class_list = old->class_list;
2871 /* Restore the current class and function from the saver */
2872 current_class = saver->class_type;
2873 current_function_decl = saver->function_decl;
2875 /* Retrieve the restored context */
2876 ctxp = restored;
2878 /* Re-installed the data for the parsing to carry on */
2879 memcpy (&ctxp->marker_begining, &old->marker_begining,
2880 (size_t)(&ctxp->marker_end - &ctxp->marker_begining));
2883 /* Add a new anchor node to which all statement(s) initializing static
2884 and non static initialized upon declaration field(s) will be
2885 linked. */
2887 static void
2888 java_parser_context_push_initialized_field (void)
2890 tree node;
2892 node = build_tree_list (NULL_TREE, NULL_TREE);
2893 TREE_CHAIN (node) = CPC_STATIC_INITIALIZER_LIST (ctxp);
2894 CPC_STATIC_INITIALIZER_LIST (ctxp) = node;
2896 node = build_tree_list (NULL_TREE, NULL_TREE);
2897 TREE_CHAIN (node) = CPC_INITIALIZER_LIST (ctxp);
2898 CPC_INITIALIZER_LIST (ctxp) = node;
2900 node = build_tree_list (NULL_TREE, NULL_TREE);
2901 TREE_CHAIN (node) = CPC_INSTANCE_INITIALIZER_LIST (ctxp);
2902 CPC_INSTANCE_INITIALIZER_LIST (ctxp) = node;
2905 /* Pop the lists of initialized field. If this lists aren't empty,
2906 remember them so we can use it to create and populate the finit$
2907 or <clinit> functions. */
2909 static void
2910 java_parser_context_pop_initialized_field (void)
2912 tree stmts;
2913 tree class_type = TREE_TYPE (GET_CPC ());
2915 if (CPC_INITIALIZER_LIST (ctxp))
2917 stmts = CPC_INITIALIZER_STMT (ctxp);
2918 CPC_INITIALIZER_LIST (ctxp) = TREE_CHAIN (CPC_INITIALIZER_LIST (ctxp));
2919 if (stmts && !java_error_count)
2920 TYPE_FINIT_STMT_LIST (class_type) = reorder_static_initialized (stmts);
2923 if (CPC_STATIC_INITIALIZER_LIST (ctxp))
2925 stmts = CPC_STATIC_INITIALIZER_STMT (ctxp);
2926 CPC_STATIC_INITIALIZER_LIST (ctxp) =
2927 TREE_CHAIN (CPC_STATIC_INITIALIZER_LIST (ctxp));
2928 /* Keep initialization in order to enforce 8.5 */
2929 if (stmts && !java_error_count)
2930 TYPE_CLINIT_STMT_LIST (class_type) = nreverse (stmts);
2933 /* JDK 1.1 instance initializers */
2934 if (CPC_INSTANCE_INITIALIZER_LIST (ctxp))
2936 stmts = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
2937 CPC_INSTANCE_INITIALIZER_LIST (ctxp) =
2938 TREE_CHAIN (CPC_INSTANCE_INITIALIZER_LIST (ctxp));
2939 if (stmts && !java_error_count)
2940 TYPE_II_STMT_LIST (class_type) = nreverse (stmts);
2944 static tree
2945 reorder_static_initialized (tree list)
2947 /* We have to keep things in order. The alias initializer have to
2948 come first, then the initialized regular field, in reverse to
2949 keep them in lexical order. */
2950 tree marker, previous = NULL_TREE;
2951 for (marker = list; marker; previous = marker, marker = TREE_CHAIN (marker))
2952 if (TREE_CODE (marker) == TREE_LIST
2953 && !TREE_VALUE (marker) && !TREE_PURPOSE (marker))
2954 break;
2956 /* No static initialized, the list is fine as is */
2957 if (!previous)
2958 list = TREE_CHAIN (marker);
2960 /* No marker? reverse the whole list */
2961 else if (!marker)
2962 list = nreverse (list);
2964 /* Otherwise, reverse what's after the marker and the new reordered
2965 sublist will replace the marker. */
2966 else
2968 TREE_CHAIN (previous) = NULL_TREE;
2969 list = nreverse (list);
2970 list = chainon (TREE_CHAIN (marker), list);
2972 return list;
2975 /* Helper functions to dump the parser context stack. */
2977 #define TAB_CONTEXT(C) \
2978 {int i; for (i = 0; i < (C); i++) fputc (' ', stderr);}
2980 static void
2981 java_debug_context_do (int tab)
2983 struct parser_ctxt *copy = ctxp;
2984 while (copy)
2986 TAB_CONTEXT (tab);
2987 fprintf (stderr, "ctxt: 0x%0lX\n", (unsigned long)copy);
2988 TAB_CONTEXT (tab);
2989 fprintf (stderr, "filename: %s\n", copy->filename);
2990 TAB_CONTEXT (tab);
2991 fprintf (stderr, "package: %s\n",
2992 (copy->package ?
2993 IDENTIFIER_POINTER (copy->package) : "<none>"));
2994 TAB_CONTEXT (tab);
2995 fprintf (stderr, "context for saving: %d\n", copy->saved_data_ctx);
2996 TAB_CONTEXT (tab);
2997 fprintf (stderr, "saved data: %d\n", copy->saved_data);
2998 copy = copy->next;
2999 tab += 2;
3003 /* Dump the stacked up parser contexts. Intended to be called from a
3004 debugger. */
3006 void
3007 java_debug_context (void)
3009 java_debug_context_do (0);
3014 /* Flag for the error report routine to issue the error the first time
3015 it's called (overriding the default behavior which is to drop the
3016 first invocation and honor the second one, taking advantage of a
3017 richer context. */
3018 static int force_error = 0;
3020 /* Reporting an constructor invocation error. */
3021 static void
3022 parse_ctor_invocation_error (void)
3024 if (DECL_CONSTRUCTOR_P (current_function_decl))
3025 yyerror ("Constructor invocation must be first thing in a constructor");
3026 else
3027 yyerror ("Only constructors can invoke constructors");
3030 /* Reporting JDK1.1 features not implemented. */
3032 static tree
3033 parse_jdk1_1_error (const char *msg)
3035 sorry (": %qs JDK1.1(TM) feature", msg);
3036 java_error_count++;
3037 return build_java_empty_stmt ();
3040 static int do_warning = 0;
3042 void
3043 yyerror (const char *msgid)
3045 #ifdef USE_MAPPED_LOCATION
3046 static source_location elc;
3047 expanded_location xloc = expand_location (input_location);
3048 int current_line = xloc.line;
3049 #else
3050 static java_lc elc;
3051 int save_lineno;
3052 int current_line = input_line;
3053 #endif
3054 static int prev_lineno;
3055 static const char *prev_msg;
3057 char *remainder, *code_from_source;
3059 if (!force_error && prev_lineno == current_line)
3060 return;
3061 #ifndef USE_MAPPED_LOCATION
3062 current_line = ctxp->lexer->token_start.line;
3063 #endif
3065 /* Save current error location but report latter, when the context is
3066 richer. */
3067 if (ctxp->java_error_flag == 0)
3069 ctxp->java_error_flag = 1;
3070 #ifdef USE_MAPPED_LOCATION
3071 elc = input_location;
3072 #else
3073 elc = ctxp->lexer->token_start;
3074 #endif
3075 /* Do something to use the previous line if we're reaching the
3076 end of the file... */
3077 #ifdef VERBOSE_SKELETON
3078 printf ("* Error detected (%s)\n", (msgid ? msgid : "(null)"));
3079 #endif
3080 return;
3083 /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
3084 if (!force_error && msgid == prev_msg && prev_lineno == current_line)
3085 return;
3087 ctxp->java_error_flag = 0;
3088 if (do_warning)
3089 java_warning_count++;
3090 else
3091 java_error_count++;
3093 #if 0 /* FIXME */
3094 if (elc.col == 0 && msgid && msgid[1] == ';')
3095 elc = ctxp->prev_line_end;
3096 #endif
3098 prev_msg = msgid;
3100 #ifdef USE_MAPPED_LOCATION
3101 prev_lineno = current_line;
3102 code_from_source = java_get_line_col (xloc.file, current_line, xloc.column);
3103 #else
3104 save_lineno = input_line;
3105 prev_lineno = input_line = current_line;
3106 code_from_source = java_get_line_col (input_filename, current_line,
3107 ctxp->lexer->token_start.col);
3108 #endif
3111 obstack_grow0 (&temporary_obstack,
3112 code_from_source, strlen (code_from_source));
3113 remainder = obstack_finish (&temporary_obstack);
3114 if (do_warning)
3115 warning (0, "%s.\n%s", msgid, remainder);
3116 else
3117 error ("%s.\n%s", msgid, remainder);
3119 /* This allow us to cheaply avoid an extra 'Invalid expression
3120 statement' error report when errors have been already reported on
3121 the same line. This occurs when we report an error but don't have
3122 a synchronization point other than ';', which
3123 expression_statement is the only one to take care of. */
3124 #ifndef USE_MAPPED_LOCATION
3125 input_line = save_lineno;
3126 #endif
3127 ctxp->prevent_ese = input_line;
3130 static void
3131 issue_warning_error_from_context (
3132 #ifdef USE_MAPPED_LOCATION
3133 source_location cl,
3134 #else
3135 tree cl,
3136 #endif
3137 const char *gmsgid, va_list *ap)
3139 #ifdef USE_MAPPED_LOCATION
3140 source_location saved_location = input_location;
3141 expanded_location xloc = expand_location (cl);
3142 #else
3143 java_lc save_lc = ctxp->lexer->token_start;
3144 const char *saved = ctxp->filename, *saved_input_filename;
3145 #endif
3146 char buffer [4096];
3147 text_info text;
3149 text.err_no = errno;
3150 text.args_ptr = ap;
3151 text.format_spec = gmsgid;
3152 pp_format (global_dc->printer, &text);
3153 pp_output_formatted_text (global_dc->printer);
3154 strncpy (buffer, pp_formatted_text (global_dc->printer), sizeof (buffer) - 1);
3155 buffer[sizeof (buffer) - 1] = '\0';
3156 pp_clear_output_area (global_dc->printer);
3158 force_error = 1;
3160 #ifdef USE_MAPPED_LOCATION
3161 if (xloc.file != NULL)
3163 ctxp->filename = xloc.file;
3164 input_location = cl;
3166 #else
3167 ctxp->lexer->token_start.line = EXPR_WFL_LINENO (cl);
3168 ctxp->lexer->token_start.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1
3169 : EXPR_WFL_COLNO (cl) == 0xffe ? -2
3170 : EXPR_WFL_COLNO (cl));
3172 /* We have a CL, that's a good reason for using it if it contains data */
3173 if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
3174 ctxp->filename = EXPR_WFL_FILENAME (cl);
3175 saved_input_filename = input_filename;
3176 input_filename = ctxp->filename;
3177 #endif
3178 java_error (NULL);
3179 java_error (buffer);
3180 #ifdef USE_MAPPED_LOCATION
3181 input_location = saved_location;
3182 #else
3183 ctxp->filename = saved;
3184 input_filename = saved_input_filename;
3185 ctxp->lexer->token_start = save_lc;
3186 #endif
3187 force_error = 0;
3190 /* Issue an error message at a current source line CL.
3191 FUTURE/FIXME: change cl to be a source_location. */
3193 void
3194 parse_error_context (tree cl, const char *gmsgid, ...)
3196 va_list ap;
3197 va_start (ap, gmsgid);
3198 #ifdef USE_MAPPED_LOCATION
3199 issue_warning_error_from_context (EXPR_LOCATION (cl), gmsgid, &ap);
3200 #else
3201 issue_warning_error_from_context (cl, gmsgid, &ap);
3202 #endif
3203 va_end (ap);
3206 /* Issue a warning at a current source line CL.
3207 FUTURE/FIXME: change cl to be a source_location. */
3209 static void
3210 parse_warning_context (tree cl, const char *gmsgid, ...)
3212 va_list ap;
3213 va_start (ap, gmsgid);
3215 do_warning = 1;
3216 #ifdef USE_MAPPED_LOCATION
3217 issue_warning_error_from_context (EXPR_LOCATION (cl), gmsgid, &ap);
3218 #else
3219 issue_warning_error_from_context (cl, gmsgid, &ap);
3220 #endif
3221 do_warning = 0;
3222 va_end (ap);
3225 static tree
3226 find_expr_with_wfl (tree node)
3228 while (node)
3230 enum tree_code_class code;
3231 tree to_return;
3233 switch (TREE_CODE (node))
3235 case BLOCK:
3236 node = BLOCK_EXPR_BODY (node);
3237 continue;
3239 case COMPOUND_EXPR:
3240 to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
3241 if (to_return)
3242 return to_return;
3243 node = TREE_OPERAND (node, 1);
3244 continue;
3246 case LOOP_EXPR:
3247 node = TREE_OPERAND (node, 0);
3248 continue;
3250 case LABELED_BLOCK_EXPR:
3251 node = LABELED_BLOCK_BODY (node);
3252 continue;
3254 default:
3255 code = TREE_CODE_CLASS (TREE_CODE (node));
3256 if (((code == tcc_unary) || (code == tcc_binary)
3257 || (code == tcc_expression))
3258 && EXPR_WFL_LINECOL (node))
3259 return node;
3260 return NULL_TREE;
3263 return NULL_TREE;
3266 /* Issue a missing return statement error. Uses METHOD to figure the
3267 last line of the method the error occurs in. */
3269 static void
3270 missing_return_error (tree method)
3272 #ifdef USE_MAPPED_LOCATION
3273 SET_EXPR_LOCATION (wfl_operator, DECL_FUNCTION_LAST_LINE (method));
3274 #else
3275 EXPR_WFL_SET_LINECOL (wfl_operator, DECL_FUNCTION_LAST_LINE (method), -2);
3276 #endif
3277 parse_error_context (wfl_operator, "Missing return statement");
3280 /* Issue an unreachable statement error. From NODE, find the next
3281 statement to report appropriately. */
3282 static void
3283 unreachable_stmt_error (tree node)
3285 /* Browse node to find the next expression node that has a WFL. Use
3286 the location to report the error */
3287 if (TREE_CODE (node) == COMPOUND_EXPR)
3288 node = find_expr_with_wfl (TREE_OPERAND (node, 1));
3289 else
3290 node = find_expr_with_wfl (node);
3292 if (node)
3294 #ifdef USE_MAPPED_LOCATION
3295 SET_EXPR_LOCATION (wfl_operator, EXPR_LOCATION (node));
3296 #else
3297 EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
3298 #endif
3299 parse_error_context (wfl_operator, "Unreachable statement");
3301 else
3302 abort ();
3305 static int
3306 not_accessible_field_error (tree wfl, tree decl)
3308 parse_error_context
3309 (wfl, "Can't access %s field %<%s.%s%> from %qs",
3310 accessibility_string (get_access_flags_from_decl (decl)),
3311 GET_TYPE_NAME (DECL_CONTEXT (decl)),
3312 IDENTIFIER_POINTER (DECL_NAME (decl)),
3313 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
3314 return 1;
3318 java_report_errors (void)
3320 if (java_error_count)
3321 fprintf (stderr, "%d error%s",
3322 java_error_count, (java_error_count == 1 ? "" : "s"));
3323 if (java_warning_count)
3324 fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
3325 java_warning_count, (java_warning_count == 1 ? "" : "s"));
3326 if (java_error_count || java_warning_count)
3327 putc ('\n', stderr);
3328 return java_error_count;
3331 static char *
3332 java_accstring_lookup (int flags)
3334 static char buffer [80];
3335 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
3337 /* Access modifier looked-up first for easier report on forbidden
3338 access. */
3339 if (flags & ACC_PUBLIC) COPY_RETURN ("public");
3340 if (flags & ACC_PRIVATE) COPY_RETURN ("private");
3341 if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
3342 if (flags & ACC_STATIC) COPY_RETURN ("static");
3343 if (flags & ACC_FINAL) COPY_RETURN ("final");
3344 if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
3345 if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
3346 if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
3347 if (flags & ACC_NATIVE) COPY_RETURN ("native");
3348 if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
3349 if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
3351 buffer [0] = '\0';
3352 return buffer;
3353 #undef COPY_RETURN
3356 /* Returns a string denoting the accessibility of a class or a member as
3357 indicated by FLAGS. We need a separate function from
3358 java_accstring_lookup, as the latter can return spurious "static", etc.
3359 if package-private access is defined (in which case none of the
3360 relevant access control bits in FLAGS is set). */
3362 static const char *
3363 accessibility_string (int flags)
3365 if (flags & ACC_PRIVATE) return "private";
3366 if (flags & ACC_PROTECTED) return "protected";
3367 if (flags & ACC_PUBLIC) return "public";
3369 return "package-private";
3372 /* Issuing error messages upon redefinition of classes, interfaces or
3373 variables. */
3375 static void
3376 classitf_redefinition_error (const char *context, tree id, tree decl, tree cl)
3378 parse_error_context (cl, "%s %qs already defined in %s:%d",
3379 context, IDENTIFIER_POINTER (id),
3380 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3381 /* Here we should point out where its redefined. It's a unicode. FIXME */
3384 static void
3385 variable_redefinition_error (tree context, tree name, tree type, int line)
3387 const char *type_name;
3389 /* Figure a proper name for type. We might haven't resolved it */
3390 if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
3391 type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
3392 else
3393 type_name = lang_printable_name (type, 0);
3395 parse_error_context (context,
3396 "Variable %qs is already defined in this method and was declared %<%s %s%> at line %d",
3397 IDENTIFIER_POINTER (name),
3398 type_name, IDENTIFIER_POINTER (name), line);
3401 /* If ANAME is terminated with `[]', it indicates an array. This
3402 function returns the number of `[]' found and if this number is
3403 greater than zero, it extracts the array type name and places it in
3404 the node pointed to by TRIMMED unless TRIMMED is null. */
3406 static int
3407 build_type_name_from_array_name (tree aname, tree *trimmed)
3409 const char *name = IDENTIFIER_POINTER (aname);
3410 int len = IDENTIFIER_LENGTH (aname);
3411 int array_dims;
3413 STRING_STRIP_BRACKETS (name, len, array_dims);
3415 if (array_dims && trimmed)
3416 *trimmed = get_identifier_with_length (name, len);
3418 return array_dims;
3421 static tree
3422 build_array_from_name (tree type, tree type_wfl, tree name, tree *ret_name)
3424 int more_dims = 0;
3426 /* Eventually get more dims */
3427 more_dims = build_type_name_from_array_name (name, &name);
3429 /* If we have, then craft a new type for this variable */
3430 if (more_dims)
3432 tree save = type;
3434 /* If we have a pointer, use its type */
3435 if (TREE_CODE (type) == POINTER_TYPE)
3436 type = TREE_TYPE (type);
3438 /* Building the first dimension of a primitive type uses this
3439 function */
3440 if (JPRIMITIVE_TYPE_P (type))
3442 type = build_java_array_type (type, -1);
3443 more_dims--;
3445 /* Otherwise, if we have a WFL for this type, use it (the type
3446 is already an array on an unresolved type, and we just keep
3447 on adding dimensions) */
3448 else if (type_wfl)
3450 type = type_wfl;
3451 more_dims += build_type_name_from_array_name (TYPE_NAME (save),
3452 NULL);
3455 /* Add all the dimensions */
3456 while (more_dims--)
3457 type = build_unresolved_array_type (type);
3459 /* The type may have been incomplete in the first place */
3460 if (type_wfl)
3461 type = obtain_incomplete_type (type);
3464 if (ret_name)
3465 *ret_name = name;
3466 return type;
3469 /* Build something that the type identifier resolver will identify as
3470 being an array to an unresolved type. TYPE_WFL is a WFL on a
3471 identifier. */
3473 static tree
3474 build_unresolved_array_type (tree type_or_wfl)
3476 const char *ptr;
3477 tree wfl;
3479 /* TYPE_OR_WFL might be an array on a resolved type. In this case,
3480 just create a array type */
3481 if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
3482 return build_java_array_type (type_or_wfl, -1);
3484 obstack_grow (&temporary_obstack,
3485 IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
3486 IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
3487 obstack_grow0 (&temporary_obstack, "[]", 2);
3488 ptr = obstack_finish (&temporary_obstack);
3489 #ifdef USE_MAPPED_LOCATION
3490 wfl = build_expr_wfl (get_identifier (ptr), EXPR_LOCATION (type_or_wfl));
3491 #else
3492 wfl = build_expr_wfl (get_identifier (ptr),
3493 EXPR_WFL_FILENAME (type_or_wfl),
3494 EXPR_WFL_LINENO (type_or_wfl),
3495 EXPR_WFL_COLNO (type_or_wfl));
3496 #endif
3497 /* Re-install the existing qualifications so that the type can be
3498 resolved properly. */
3499 EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl);
3500 return wfl;
3503 static void
3504 parser_add_interface (tree class_decl, tree interface_decl, tree wfl)
3506 if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
3507 parse_error_context (wfl, "Interface %qs repeated",
3508 IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
3511 /* Bulk of common class/interface checks. Return 1 if an error was
3512 encountered. TAG is 0 for a class, 1 for an interface. */
3514 static int
3515 check_class_interface_creation (int is_interface, int flags, tree raw_name,
3516 tree qualified_name, tree decl, tree cl)
3518 tree node;
3519 int sca = 0; /* Static class allowed */
3520 int icaf = 0; /* Inner class allowed flags */
3521 int uaaf = CLASS_MODIFIERS; /* Usually allowed access flags */
3523 if (!quiet_flag)
3524 fprintf (stderr, " %s%s %s",
3525 (CPC_INNER_P () ? "inner" : ""),
3526 (is_interface ? "interface" : "class"),
3527 IDENTIFIER_POINTER (qualified_name));
3529 /* Scope of an interface/class type name:
3530 - Can't be imported by a single type import
3531 - Can't already exists in the package */
3532 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
3533 && (node = find_name_in_single_imports (raw_name))
3534 && !CPC_INNER_P ())
3536 parse_error_context
3537 (cl, "%s name %qs clashes with imported type %qs",
3538 (is_interface ? "Interface" : "Class"),
3539 IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
3540 return 1;
3542 if (decl && CLASS_COMPLETE_P (decl))
3544 classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
3545 qualified_name, decl, cl);
3546 return 1;
3549 if (check_inner_class_redefinition (raw_name, cl))
3550 return 1;
3552 /* If public, file name should match class/interface name, except
3553 when dealing with an inner class */
3554 if (!CPC_INNER_P () && (flags & ACC_PUBLIC ))
3556 const char *fname = input_filename;
3557 const char *f;
3559 for (f = fname + strlen (fname);
3560 f != fname && ! IS_DIR_SEPARATOR (*f);
3561 f--)
3563 if (IS_DIR_SEPARATOR (*f))
3564 f++;
3565 if (strncmp (IDENTIFIER_POINTER (raw_name),
3566 f , IDENTIFIER_LENGTH (raw_name)) ||
3567 f [IDENTIFIER_LENGTH (raw_name)] != '.')
3568 parse_error_context
3569 (cl, "Public %s %qs must be defined in a file called %<%s.java%>",
3570 (is_interface ? "interface" : "class"),
3571 IDENTIFIER_POINTER (qualified_name),
3572 IDENTIFIER_POINTER (raw_name));
3575 /* Static classes can be declared only in top level classes. Note:
3576 once static, a inner class is a top level class. */
3577 if (flags & ACC_STATIC)
3579 /* Catch the specific error of declaring an class inner class
3580 with no toplevel enclosing class. Prevent check_modifiers from
3581 complaining a second time */
3582 if (CPC_INNER_P () && !TOPLEVEL_CLASS_DECL_P (GET_CPC()))
3584 parse_error_context (cl, "Inner class %qs can't be static. Static classes can only occur in interfaces and top-level classes",
3585 IDENTIFIER_POINTER (qualified_name));
3586 sca = ACC_STATIC;
3588 /* Else, in the context of a top-level class declaration, let
3589 `check_modifiers' do its job, otherwise, give it a go */
3590 else
3591 sca = (GET_CPC_LIST () ? ACC_STATIC : 0);
3594 /* Inner classes can be declared private or protected
3595 within their enclosing classes. */
3596 if (CPC_INNER_P ())
3598 /* A class which is local to a block can't be public, private,
3599 protected or static. But it is created final, so allow this
3600 one. */
3601 if (current_function_decl)
3602 icaf = sca = uaaf = ACC_FINAL;
3603 else
3605 check_modifiers_consistency (flags);
3606 icaf = ACC_PROTECTED;
3607 if (! CLASS_INTERFACE (GET_CPC ()))
3608 icaf |= ACC_PRIVATE;
3612 if (is_interface)
3614 if (CPC_INNER_P ())
3615 uaaf = INTERFACE_INNER_MODIFIERS;
3616 else
3617 uaaf = INTERFACE_MODIFIERS;
3619 check_modifiers ("Illegal modifier %qs for interface declaration",
3620 flags, uaaf);
3622 else
3623 check_modifiers ((current_function_decl ?
3624 "Illegal modifier %qs for local class declaration" :
3625 "Illegal modifier %qs for class declaration"),
3626 flags, uaaf|sca|icaf);
3627 return 0;
3630 /* Construct a nested class name. If the final component starts with
3631 a digit, return true. Otherwise return false. */
3632 static int
3633 make_nested_class_name (tree cpc_list)
3635 tree name;
3637 if (!cpc_list)
3638 return 0;
3640 make_nested_class_name (TREE_CHAIN (cpc_list));
3642 /* Pick the qualified name when dealing with the first upmost
3643 enclosing class */
3644 name = (TREE_CHAIN (cpc_list)
3645 ? TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list)));
3646 obstack_grow (&temporary_obstack,
3647 IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name));
3648 obstack_1grow (&temporary_obstack, '$');
3650 return ISDIGIT (IDENTIFIER_POINTER (name)[0]);
3653 /* Can't redefine a class already defined in an earlier scope. */
3655 static int
3656 check_inner_class_redefinition (tree raw_name, tree cl)
3658 tree scope_list;
3660 for (scope_list = GET_CPC_LIST (); scope_list;
3661 scope_list = GET_NEXT_ENCLOSING_CPC (scope_list))
3662 if (raw_name == GET_CPC_UN_NODE (scope_list))
3664 parse_error_context
3665 (cl, "The class name %qs is already defined in this scope. An inner class may not have the same simple name as any of its enclosing classes",
3666 IDENTIFIER_POINTER (raw_name));
3667 return 1;
3669 return 0;
3672 /* Tries to find a decl for CLASS_TYPE within ENCLOSING. May return an
3673 invisible/non-accessible matching decl when an accessible one could not be
3674 found, in order to give a better error message when accessibility is
3675 checked later. */
3677 static tree
3678 resolve_inner_class (tree context, tree cl, tree enclosing, tree class_type)
3680 tree local_super = NULL_TREE;
3681 tree candidate = NULL_TREE;
3683 /* This hash table is used to register the classes we're going
3684 through when searching the current class as an inner class, in
3685 order to detect circular references. */
3686 htab_t circularity_hash = htab_create (20, htab_hash_pointer, htab_eq_pointer,
3687 NULL);
3689 while (enclosing)
3691 tree decl;
3693 *htab_find_slot (circularity_hash, enclosing, INSERT) = enclosing;
3695 if ((decl = find_as_inner_class (enclosing, class_type, cl)))
3697 if (inner_class_accessible (decl, context))
3699 candidate = decl;
3700 break;
3702 else
3703 if (candidate == NULL_TREE)
3704 candidate = decl;
3707 /* Now go to the upper classes, bail out if necessary. We will
3708 analyze the returned SUPER and act accordingly (see
3709 do_resolve_class). */
3710 if (JPRIMITIVE_TYPE_P (TREE_TYPE (enclosing))
3711 || TREE_TYPE (enclosing) == void_type_node)
3713 parse_error_context (cl, "Qualifier must be a reference");
3714 enclosing = NULL_TREE;
3715 break;
3717 local_super = CLASSTYPE_SUPER (TREE_TYPE (enclosing));
3718 if (!local_super || local_super == object_type_node)
3719 break;
3721 if (TREE_CODE (local_super) == POINTER_TYPE)
3722 local_super = do_resolve_class (NULL, NULL, local_super, NULL, NULL);
3723 else
3724 local_super = TYPE_NAME (local_super);
3726 /* We may not have checked for circular inheritance yet, so do so
3727 here to prevent an infinite loop. */
3728 if (htab_find (circularity_hash, local_super) != NULL)
3730 if (!cl)
3731 cl = lookup_cl (enclosing);
3733 parse_error_context
3734 (cl, "Cyclic inheritance involving %s",
3735 IDENTIFIER_POINTER (DECL_NAME (enclosing)));
3736 enclosing = NULL_TREE;
3738 else
3739 enclosing = local_super;
3742 htab_delete (circularity_hash);
3744 /* We failed, but we might have found a matching class that wasn't
3745 accessible. Return that to get a better error message. */
3746 return candidate;
3749 /* Within ENCLOSING, find a decl for NAME and return it. NAME can be
3750 qualified. */
3752 static tree
3753 find_as_inner_class (tree enclosing, tree name, tree cl)
3755 tree qual, to_return;
3756 if (!enclosing)
3757 return NULL_TREE;
3759 name = TYPE_NAME (name);
3761 /* First search: within the scope of `enclosing', search for name */
3762 if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3763 qual = EXPR_WFL_QUALIFICATION (cl);
3764 else if (cl)
3765 qual = build_tree_list (cl, NULL_TREE);
3766 else
3767 qual = build_tree_list (build_unknown_wfl (name), NULL_TREE);
3769 if ((to_return = find_as_inner_class_do (qual, enclosing)))
3770 return to_return;
3772 /* We're dealing with a qualified name. Try to resolve thing until
3773 we get something that is an enclosing class. */
3774 if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3776 tree acc = NULL_TREE, decl = NULL_TREE, ptr;
3778 for (qual = EXPR_WFL_QUALIFICATION (cl); qual && !decl;
3779 qual = TREE_CHAIN (qual))
3781 acc = merge_qualified_name (acc,
3782 EXPR_WFL_NODE (TREE_PURPOSE (qual)));
3783 BUILD_PTR_FROM_NAME (ptr, acc);
3784 decl = do_resolve_class (NULL_TREE, NULL_TREE, ptr, NULL_TREE, cl);
3787 /* A NULL qual and a decl means that the search ended
3788 successfully?!? We have to do something then. FIXME */
3790 if (decl)
3791 enclosing = decl;
3792 else
3793 qual = EXPR_WFL_QUALIFICATION (cl);
3795 /* Otherwise, create a qual for the other part of the resolution. */
3796 else
3797 qual = build_tree_list (build_unknown_wfl (name), NULL_TREE);
3799 return find_as_inner_class_do (qual, enclosing);
3802 /* We go inside the list of sub classes and try to find a way
3803 through. */
3805 static tree
3806 find_as_inner_class_do (tree qual, tree enclosing)
3808 if (!qual)
3809 return NULL_TREE;
3811 for (; qual && enclosing; qual = TREE_CHAIN (qual))
3813 tree name_to_match = EXPR_WFL_NODE (TREE_PURPOSE (qual));
3814 tree next_enclosing = NULL_TREE;
3815 tree inner_list;
3817 for (inner_list = DECL_INNER_CLASS_LIST (enclosing);
3818 inner_list; inner_list = TREE_CHAIN (inner_list))
3820 if (TREE_VALUE (inner_list) == name_to_match)
3822 next_enclosing = TREE_PURPOSE (inner_list);
3823 break;
3826 enclosing = next_enclosing;
3829 return (!qual && enclosing ? enclosing : NULL_TREE);
3832 static void
3833 link_nested_class_to_enclosing (void)
3835 if (GET_ENCLOSING_CPC ())
3837 tree enclosing = GET_ENCLOSING_CPC_CONTEXT ();
3838 DECL_INNER_CLASS_LIST (enclosing) =
3839 tree_cons (GET_CPC (), GET_CPC_UN (),
3840 DECL_INNER_CLASS_LIST (enclosing));
3844 static tree
3845 maybe_make_nested_class_name (tree name)
3847 tree id = NULL_TREE;
3849 if (CPC_INNER_P ())
3851 /* If we're in a function, we must append a number to create the
3852 nested class name. However, we don't do this if the class we
3853 are constructing is anonymous, because in that case we'll
3854 already have a number as the class name. */
3855 if (! make_nested_class_name (GET_CPC_LIST ())
3856 && current_function_decl != NULL_TREE
3857 && ! ISDIGIT (IDENTIFIER_POINTER (name)[0]))
3859 char buf[10];
3860 sprintf (buf, "%d", anonymous_class_counter);
3861 ++anonymous_class_counter;
3862 obstack_grow (&temporary_obstack, buf, strlen (buf));
3863 obstack_1grow (&temporary_obstack, '$');
3865 obstack_grow0 (&temporary_obstack,
3866 IDENTIFIER_POINTER (name),
3867 IDENTIFIER_LENGTH (name));
3868 id = get_identifier (obstack_finish (&temporary_obstack));
3869 if (ctxp->package)
3870 QUALIFIED_P (id) = 1;
3872 return id;
3875 /* If DECL is NULL, create and push a new DECL, record the current
3876 line CL and do other maintenance things. */
3878 static tree
3879 maybe_create_class_interface_decl (tree decl, tree raw_name,
3880 tree qualified_name, tree cl)
3882 if (!decl)
3883 decl = push_class (make_class (), qualified_name);
3885 /* Take care of the file and line business */
3886 #ifdef USE_MAPPED_LOCATION
3887 DECL_SOURCE_LOCATION (decl) = EXPR_LOCATION (cl);
3888 #else
3889 DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
3890 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
3891 #endif
3892 CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
3893 CLASS_PARSED_P (TREE_TYPE (decl)) = 1;
3894 #ifdef USE_MAPPED_LOCATION
3896 tree tmp = maybe_get_identifier (EXPR_FILENAME (cl));
3897 CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
3898 tmp && IS_A_COMMAND_LINE_FILENAME_P (tmp);
3900 #else
3901 CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
3902 IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
3903 #endif
3905 PUSH_CPC (decl, raw_name);
3906 DECL_CONTEXT (decl) = GET_ENCLOSING_CPC_CONTEXT ();
3908 /* Link the declaration to the already seen ones */
3909 TREE_CHAIN (decl) = ctxp->class_list;
3910 ctxp->class_list = decl;
3912 /* Create a new nodes in the global lists */
3913 gclass_list = tree_cons (NULL_TREE, decl, gclass_list);
3914 all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
3916 /* Install a new dependency list element */
3917 create_jdep_list (ctxp);
3919 /* We keep the compilation unit imports in the class so that
3920 they can be used later to resolve type dependencies that
3921 aren't necessary to solve now. */
3922 TYPE_IMPORT_LIST (TREE_TYPE (decl)) = ctxp->import_list;
3923 TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (decl)) = ctxp->import_demand_list;
3925 TYPE_PACKAGE (TREE_TYPE (decl)) = ctxp->package;
3927 SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
3928 IDENTIFIER_POINTER (qualified_name)));
3929 return decl;
3932 static void
3933 add_superinterfaces (tree decl, tree interface_list)
3935 tree node;
3936 /* Superinterface(s): if present and defined, parser_check_super_interface ()
3937 takes care of ensuring that:
3938 - This is an accessible interface type,
3939 - Circularity detection.
3940 parser_add_interface is then called. If present but not defined,
3941 the check operation is delayed until the super interface gets
3942 defined. */
3943 for (node = interface_list; node; node = TREE_CHAIN (node))
3945 tree current = TREE_PURPOSE (node);
3946 tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
3947 if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
3949 if (!parser_check_super_interface (idecl, decl, current))
3950 parser_add_interface (decl, idecl, current);
3952 else
3953 register_incomplete_type (JDEP_INTERFACE,
3954 current, decl, NULL_TREE);
3958 /* Create an interface in pass1 and return its decl. Return the
3959 interface's decl in pass 2. */
3961 static tree
3962 create_interface (int flags, tree id, tree super)
3964 tree raw_name = EXPR_WFL_NODE (id);
3965 tree q_name = parser_qualified_classname (raw_name);
3966 tree decl = IDENTIFIER_CLASS_VALUE (q_name);
3968 /* Certain syntax errors are making SUPER be like ID. Avoid this
3969 case. */
3970 if (ctxp->class_err && id == super)
3971 super = NULL;
3973 EXPR_WFL_NODE (id) = q_name; /* Keep source location, even if refined. */
3975 /* Basic checks: scope, redefinition, modifiers */
3976 if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
3978 PUSH_ERROR ();
3979 return NULL_TREE;
3982 /* Suspend the current parsing context if we're parsing an inner
3983 interface */
3984 if (CPC_INNER_P ())
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 /* Interface modifiers check
3996 - public/abstract allowed (already done at that point)
3997 - abstract is obsolete (comes first, it's a warning, or should be)
3998 - Can't use twice the same (checked in the modifier rule) */
3999 if ((flags & ACC_ABSTRACT) && flag_redundant)
4000 parse_warning_context
4001 (MODIFIER_WFL (ABSTRACT_TK),
4002 "Redundant use of %<abstract%> modifier. Interface %qs is implicitly abstract", 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, q_name, id);
4007 /* Interfaces are always abstract. */
4008 flags |= ACC_ABSTRACT;
4010 /* Inner interfaces are always static. */
4011 if (INNER_CLASS_DECL_P (decl))
4012 flags |= ACC_STATIC;
4014 /* Set super info and mark the class a complete */
4015 set_super_info (ACC_INTERFACE | flags, TREE_TYPE (decl),
4016 object_type_node, ctxp->interface_number);
4017 ctxp->interface_number = 0;
4018 CLASS_COMPLETE_P (decl) = 1;
4019 add_superinterfaces (decl, super);
4021 /* Eventually sets the @deprecated tag flag */
4022 CHECK_DEPRECATED (decl);
4024 return decl;
4027 /* Patch anonymous class CLASS, by either extending or implementing
4028 DEP. */
4030 static void
4031 patch_anonymous_class (tree type_decl, tree class_decl, tree wfl)
4033 tree class = TREE_TYPE (class_decl);
4034 tree type = TREE_TYPE (type_decl);
4035 tree binfo = TYPE_BINFO (class);
4037 /* If it's an interface, implement it */
4038 if (CLASS_INTERFACE (type_decl))
4040 if (parser_check_super_interface (type_decl, class_decl, wfl))
4041 return;
4043 if (!VEC_space (tree, BINFO_BASE_BINFOS (binfo), 1))
4045 /* Extend the binfo - by reallocating and copying it. */
4046 tree new_binfo;
4047 tree base_binfo;
4048 int i;
4050 new_binfo = make_tree_binfo ((BINFO_N_BASE_BINFOS (binfo) + 1) * 2);
4051 for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
4052 BINFO_BASE_APPEND (new_binfo, base_binfo);
4053 CLASS_HAS_SUPER_FLAG (new_binfo) = CLASS_HAS_SUPER_FLAG (binfo);
4054 BINFO_VTABLE (new_binfo) = BINFO_VTABLE (binfo);
4055 TYPE_BINFO (class) = new_binfo;
4058 /* And add the interface */
4059 parser_add_interface (class_decl, type_decl, wfl);
4061 /* Otherwise, it's a type we want to extend */
4062 else
4064 if (parser_check_super (type_decl, class_decl, wfl))
4065 return;
4066 BINFO_TYPE (BINFO_BASE_BINFO (binfo, 0)) = type;
4070 /* Create an anonymous class which extends/implements TYPE_NAME, and return
4071 its decl. */
4073 static tree
4074 create_anonymous_class (tree type_name)
4076 char buffer [80];
4077 tree super = NULL_TREE, itf = NULL_TREE;
4078 tree id, type_decl, class;
4080 /* The unqualified name of the anonymous class. It's just a number. */
4081 sprintf (buffer, "%d", anonymous_class_counter++);
4082 id = build_wfl_node (get_identifier (buffer));
4083 EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (type_name);
4085 /* We know about the type to extend/implement. We go ahead */
4086 if ((type_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (type_name))))
4088 /* Create a class which either implements on extends the designated
4089 class. The class bears an inaccessible name. */
4090 if (CLASS_INTERFACE (type_decl))
4092 /* It's OK to modify it here. It's been already used and
4093 shouldn't be reused */
4094 ctxp->interface_number = 1;
4095 /* Interfaces should presented as a list of WFLs */
4096 itf = build_tree_list (type_name, NULL_TREE);
4098 else
4099 super = type_name;
4102 class = create_class (ACC_FINAL, id, super, itf);
4104 /* We didn't know anything about the stuff. We register a dependence. */
4105 if (!type_decl)
4106 register_incomplete_type (JDEP_ANONYMOUS, type_name, class, NULL_TREE);
4108 ANONYMOUS_CLASS_P (TREE_TYPE (class)) = 1;
4109 return class;
4112 /* Create a class in pass1 and return its decl. Return class
4113 interface's decl in pass 2. */
4115 static tree
4116 create_class (int flags, tree id, tree super, tree interfaces)
4118 tree raw_name = EXPR_WFL_NODE (id);
4119 tree class_id, decl;
4120 tree super_decl_type;
4122 /* Certain syntax errors are making SUPER be like ID. Avoid this
4123 case. */
4124 if (ctxp->class_err && id == super)
4125 super = NULL;
4127 class_id = parser_qualified_classname (raw_name);
4128 decl = IDENTIFIER_CLASS_VALUE (class_id);
4129 EXPR_WFL_NODE (id) = class_id;
4131 /* Basic check: scope, redefinition, modifiers */
4132 if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
4134 PUSH_ERROR ();
4135 return NULL_TREE;
4138 /* Suspend the current parsing context if we're parsing an inner
4139 class or an anonymous class. */
4140 if (CPC_INNER_P ())
4142 java_parser_context_suspend ();
4143 /* Interface members are public. */
4144 if (CLASS_INTERFACE (GET_CPC ()))
4145 flags |= ACC_PUBLIC;
4148 /* Push a new context for (static) initialized upon declaration fields */
4149 java_parser_context_push_initialized_field ();
4151 /* Class modifier check:
4152 - Allowed modifier (already done at that point)
4153 - abstract AND final forbidden
4154 - Public classes defined in the correct file */
4155 if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
4156 parse_error_context
4157 (id, "Class %qs can't be declared both abstract and final",
4158 IDENTIFIER_POINTER (raw_name));
4160 /* Create a new decl if DECL is NULL, otherwise fix it */
4161 decl = maybe_create_class_interface_decl (decl, raw_name, class_id, id);
4163 /* If SUPER exists, use it, otherwise use Object */
4164 if (super)
4166 /* java.lang.Object can't extend anything. */
4167 if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
4169 parse_error_context (id, "%<java.lang.Object%> can't extend anything");
4170 return NULL_TREE;
4173 super_decl_type =
4174 register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
4176 else if (TREE_TYPE (decl) != object_type_node)
4177 super_decl_type = object_type_node;
4178 /* We're defining java.lang.Object */
4179 else
4180 super_decl_type = NULL_TREE;
4182 /* A class nested in an interface is implicitly static. */
4183 if (INNER_CLASS_DECL_P (decl)
4184 && CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (DECL_CONTEXT (decl)))))
4186 flags |= ACC_STATIC;
4189 /* Set super info and mark the class as complete. */
4190 set_super_info (flags, TREE_TYPE (decl), super_decl_type,
4191 ctxp->interface_number);
4192 ctxp->interface_number = 0;
4193 CLASS_COMPLETE_P (decl) = 1;
4194 add_superinterfaces (decl, interfaces);
4196 /* TYPE_VFIELD' is a compiler-generated field used to point to
4197 virtual function tables. In gcj, every class has a common base
4198 virtual function table in java.lang.object. */
4199 TYPE_VFIELD (TREE_TYPE (decl)) = TYPE_VFIELD (object_type_node);
4201 /* Add the private this$<n> field, Replicate final locals still in
4202 scope as private final fields mangled like val$<local_name>.
4203 This does not occur for top level (static) inner classes. */
4204 if (PURE_INNER_CLASS_DECL_P (decl))
4205 add_inner_class_fields (decl, current_function_decl);
4207 /* Eventually sets the @deprecated tag flag */
4208 CHECK_DEPRECATED (decl);
4210 /* Reset the anonymous class counter when declaring non inner classes */
4211 if (!INNER_CLASS_DECL_P (decl))
4212 anonymous_class_counter = 1;
4214 return decl;
4217 /* End a class declaration: register the statements used to create
4218 finit$ and <clinit>, pop the current class and resume the prior
4219 parser context if necessary. */
4221 static void
4222 end_class_declaration (int resume)
4224 /* If an error occurred, context weren't pushed and won't need to be
4225 popped by a resume. */
4226 int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node;
4228 if (GET_CPC () != error_mark_node)
4229 dump_java_tree (TDI_class, GET_CPC ());
4231 java_parser_context_pop_initialized_field ();
4232 POP_CPC ();
4233 if (resume && no_error_occurred)
4234 java_parser_context_resume ();
4236 /* We're ending a class declaration, this is a good time to reset
4237 the interface cout. Note that might have been already done in
4238 create_interface, but if at that time an inner class was being
4239 dealt with, the interface count was reset in a context created
4240 for the sake of handling inner classes declaration. */
4241 ctxp->interface_number = 0;
4244 static void
4245 add_inner_class_fields (tree class_decl, tree fct_decl)
4247 tree block, marker, f;
4249 f = add_field (TREE_TYPE (class_decl),
4250 build_current_thisn (TREE_TYPE (class_decl)),
4251 build_pointer_type (TREE_TYPE (DECL_CONTEXT (class_decl))),
4252 ACC_PRIVATE);
4253 FIELD_THISN (f) = 1;
4255 if (!fct_decl)
4256 return;
4258 for (block = GET_CURRENT_BLOCK (fct_decl);
4259 block && TREE_CODE (block) == BLOCK; block = BLOCK_SUPERCONTEXT (block))
4261 tree decl;
4262 for (decl = BLOCK_EXPR_DECLS (block); decl; decl = TREE_CHAIN (decl))
4264 tree name, pname;
4265 tree wfl, init, list;
4267 /* Avoid non final arguments. */
4268 if (!LOCAL_FINAL_P (decl))
4269 continue;
4271 MANGLE_OUTER_LOCAL_VARIABLE_NAME (name, DECL_NAME (decl));
4272 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID (pname, DECL_NAME (decl));
4273 wfl = build_wfl_node (name);
4274 init = build_wfl_node (pname);
4275 /* Build an initialization for the field: it will be
4276 initialized by a parameter added to finit$, bearing a
4277 mangled name of the field itself (param$<n>.) The
4278 parameter is provided to finit$ by the constructor
4279 invoking it (hence the constructor will also feature a
4280 hidden parameter, set to the value of the outer context
4281 local at the time the inner class is created.)
4283 Note: we take into account all possible locals that can
4284 be accessed by the inner class. It's actually not trivial
4285 to minimize these aliases down to the ones really
4286 used. One way to do that would be to expand all regular
4287 methods first, then finit$ to get a picture of what's
4288 used. It works with the exception that we would have to
4289 go back on all constructor invoked in regular methods to
4290 have their invocation reworked (to include the right amount
4291 of alias initializer parameters.)
4293 The only real way around, I think, is a first pass to
4294 identify locals really used in the inner class. We leave
4295 the flag FIELD_LOCAL_ALIAS_USED around for that future
4296 use.
4298 On the other hand, it only affect local inner classes,
4299 whose constructors (and finit$ call) will be featuring
4300 unnecessary arguments. It's easy for a developer to keep
4301 this number of parameter down by using the `final'
4302 keyword only when necessary. For the time being, we can
4303 issue a warning on unnecessary finals. FIXME */
4304 init = build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (wfl),
4305 wfl, init);
4307 /* Register the field. The TREE_LIST holding the part
4308 initialized/initializer will be marked ARG_FINAL_P so
4309 that the created field can be marked
4310 FIELD_LOCAL_ALIAS. */
4311 list = build_tree_list (wfl, init);
4312 ARG_FINAL_P (list) = 1;
4313 register_fields (ACC_PRIVATE | ACC_FINAL, TREE_TYPE (decl), list);
4317 if (!CPC_INITIALIZER_STMT (ctxp))
4318 return;
4320 /* If we ever registered an alias field, insert and marker to
4321 remember where the list ends. The second part of the list (the one
4322 featuring initialized fields) so it can be later reversed to
4323 enforce 8.5. The marker will be removed during that operation. */
4324 marker = build_tree_list (NULL_TREE, NULL_TREE);
4325 TREE_CHAIN (marker) = CPC_INITIALIZER_STMT (ctxp);
4326 SET_CPC_INITIALIZER_STMT (ctxp, marker);
4329 /* Can't use lookup_field () since we don't want to load the class and
4330 can't set the CLASS_LOADED_P flag */
4332 static tree
4333 find_field (tree class, tree name)
4335 tree decl;
4336 for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
4338 if (DECL_NAME (decl) == name)
4339 return decl;
4341 return NULL_TREE;
4344 /* Wrap around lookup_field that doesn't potentially upset the value
4345 of CLASS */
4347 static tree
4348 lookup_field_wrapper (tree class, tree name)
4350 tree type = class;
4351 tree decl = NULL_TREE;
4352 java_parser_context_save_global ();
4354 /* Last chance: if we're within the context of an inner class, we
4355 might be trying to access a local variable defined in an outer
4356 context. We try to look for it now. */
4357 if (INNER_CLASS_TYPE_P (class) && TREE_CODE (name) == IDENTIFIER_NODE)
4359 tree new_name;
4360 MANGLE_OUTER_LOCAL_VARIABLE_NAME (new_name, name);
4361 decl = lookup_field (&type, new_name);
4362 if (decl && decl != error_mark_node)
4363 FIELD_LOCAL_ALIAS_USED (decl) = 1;
4365 if (!decl || decl == error_mark_node)
4367 type = class;
4368 decl = lookup_field (&type, name);
4371 /* If the field still hasn't been found, try the next enclosing context. */
4372 if (!decl && INNER_CLASS_TYPE_P (class))
4374 tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class)));
4375 decl = lookup_field_wrapper (outer_type, name);
4378 java_parser_context_restore_global ();
4379 return decl == error_mark_node ? NULL : decl;
4382 /* Find duplicate field within the same class declarations and report
4383 the error. Returns 1 if a duplicated field was found, 0
4384 otherwise. */
4386 static int
4387 duplicate_declaration_error_p (tree new_field_name, tree new_type, tree cl)
4389 /* This might be modified to work with method decl as well */
4390 tree decl = find_field (TREE_TYPE (GET_CPC ()), new_field_name);
4391 if (decl)
4393 char *t1 = xstrdup (purify_type_name
4394 ((TREE_CODE (new_type) == POINTER_TYPE
4395 && TREE_TYPE (new_type) == NULL_TREE) ?
4396 IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
4397 lang_printable_name (new_type, 1)));
4398 /* The type may not have been completed by the time we report
4399 the error */
4400 char *t2 = xstrdup (purify_type_name
4401 ((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
4402 && TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
4403 IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
4404 lang_printable_name (TREE_TYPE (decl), 1)));
4405 parse_error_context
4406 (cl, "Duplicate variable declaration: %<%s %s%> was %<%s %s%> (%s:%d)",
4407 t1, IDENTIFIER_POINTER (new_field_name),
4408 t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
4409 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4410 free (t1);
4411 free (t2);
4412 return 1;
4414 return 0;
4417 /* Field registration routine. If TYPE doesn't exist, field
4418 declarations are linked to the undefined TYPE dependency list, to
4419 be later resolved in java_complete_class () */
4421 static void
4422 register_fields (int flags, tree type, tree variable_list)
4424 tree current, saved_type;
4425 tree class_type = NULL_TREE;
4426 location_t saved_location = input_location;
4427 int must_chain = 0;
4428 tree wfl = NULL_TREE;
4430 if (GET_CPC ())
4431 class_type = TREE_TYPE (GET_CPC ());
4433 if (!class_type || class_type == error_mark_node)
4434 return;
4436 /* If we're adding fields to interfaces, those fields are public,
4437 static, final */
4438 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
4440 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
4441 flags, ACC_PUBLIC, "interface field(s)");
4442 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
4443 flags, ACC_STATIC, "interface field(s)");
4444 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
4445 flags, ACC_FINAL, "interface field(s)");
4446 check_modifiers ("Illegal interface member modifier %qs", flags,
4447 INTERFACE_FIELD_MODIFIERS);
4448 flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
4451 /* Obtain a suitable type for resolution, if necessary */
4452 SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
4454 /* If TYPE is fully resolved and we don't have a reference, make one */
4455 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4457 for (current = variable_list, saved_type = type; current;
4458 current = TREE_CHAIN (current), type = saved_type)
4460 tree real_type;
4461 tree field_decl;
4462 tree cl = TREE_PURPOSE (current);
4463 tree init = TREE_VALUE (current);
4464 tree current_name = EXPR_WFL_NODE (cl);
4466 /* Can't declare non-final static fields in inner classes */
4467 if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (class_type)
4468 && !(flags & ACC_FINAL))
4469 parse_error_context
4470 (cl, "Field %qs can't be static in inner class %qs unless it is final",
4471 IDENTIFIER_POINTER (EXPR_WFL_NODE (cl)),
4472 lang_printable_name (class_type, 0));
4474 /* Process NAME, as it may specify extra dimension(s) for it */
4475 type = build_array_from_name (type, wfl, current_name, &current_name);
4477 /* Type adjustment. We may have just readjusted TYPE because
4478 the variable specified more dimensions. Make sure we have
4479 a reference if we can and don't have one already. Also
4480 change the name if we have an init. */
4481 if (type != saved_type)
4483 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4484 if (init)
4485 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
4488 real_type = GET_REAL_TYPE (type);
4489 /* Check for redeclarations */
4490 if (duplicate_declaration_error_p (current_name, real_type, cl))
4491 continue;
4493 /* Set input_line to the line the field was found and create a
4494 declaration for it. Eventually sets the @deprecated tag flag. */
4495 #ifdef USE_MAPPED_LOCATION
4496 input_location = EXPR_LOCATION (cl);
4497 #else
4498 input_line = EXPR_WFL_LINENO (cl);
4499 #endif
4500 field_decl = add_field (class_type, current_name, real_type, flags);
4501 CHECK_DEPRECATED_NO_RESET (field_decl);
4503 /* If the field denotes a final instance variable, then we
4504 allocate a LANG_DECL_SPECIFIC part to keep track of its
4505 initialization. We also mark whether the field was
4506 initialized upon its declaration. We don't do that if the
4507 created field is an alias to a final local. */
4508 if (!ARG_FINAL_P (current) && (flags & ACC_FINAL))
4510 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl);
4511 DECL_FIELD_FINAL_WFL (field_decl) = cl;
4514 /* If the couple initializer/initialized is marked ARG_FINAL_P,
4515 we mark the created field FIELD_LOCAL_ALIAS, so that we can
4516 hide parameters to this inner class finit$ and
4517 constructors. It also means that the field isn't final per
4518 say. */
4519 if (ARG_FINAL_P (current))
4521 FIELD_LOCAL_ALIAS (field_decl) = 1;
4522 FIELD_FINAL (field_decl) = 0;
4525 /* Check if we must chain. */
4526 if (must_chain)
4527 register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
4529 /* If we have an initialization value tied to the field */
4530 if (init)
4532 /* The field is declared static */
4533 if (flags & ACC_STATIC)
4535 /* We include the field and its initialization part into
4536 a list used to generate <clinit>. After <clinit> is
4537 walked, field initializations will be processed and
4538 fields initialized with known constants will be taken
4539 out of <clinit> and have their DECL_INITIAL set
4540 appropriately. */
4541 TREE_CHAIN (init) = CPC_STATIC_INITIALIZER_STMT (ctxp);
4542 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, init);
4543 if (TREE_OPERAND (init, 1)
4544 && TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
4545 TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
4547 /* A non-static field declared with an immediate initialization is
4548 to be initialized in <init>, if any. This field is remembered
4549 to be processed at the time of the generation of <init>. */
4550 else
4552 TREE_CHAIN (init) = CPC_INITIALIZER_STMT (ctxp);
4553 SET_CPC_INITIALIZER_STMT (ctxp, init);
4555 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
4556 DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
4560 CLEAR_DEPRECATED;
4561 input_location = saved_location;
4564 /* Generate finit$, using the list of initialized fields to populate
4565 its body. finit$'s parameter(s) list is adjusted to include the
4566 one(s) used to initialized the field(s) caching outer context
4567 local(s). */
4569 static tree
4570 generate_finit (tree class_type)
4572 int count = 0;
4573 tree list = TYPE_FINIT_STMT_LIST (class_type);
4574 tree mdecl, current, parms;
4576 parms = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
4577 class_type, NULL_TREE,
4578 &count);
4579 CRAFTED_PARAM_LIST_FIXUP (parms);
4580 mdecl = create_artificial_method (class_type, ACC_PRIVATE, void_type_node,
4581 finit_identifier_node, parms);
4582 fix_method_argument_names (parms, mdecl);
4583 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4584 mdecl, NULL_TREE);
4585 DECL_FUNCTION_NAP (mdecl) = count;
4586 start_artificial_method_body (mdecl);
4588 for (current = list; current; current = TREE_CHAIN (current))
4589 java_method_add_stmt (mdecl,
4590 build_debugable_stmt (EXPR_WFL_LINECOL (current),
4591 current));
4592 end_artificial_method_body (mdecl);
4593 return mdecl;
4596 /* Generate a function to run the instance initialization code. The
4597 private method is called `instinit$'. Unless we're dealing with an
4598 anonymous class, we determine whether all ctors of CLASS_TYPE
4599 declare a checked exception in their `throws' clause in order to
4600 see whether it's necessary to encapsulate the instance initializer
4601 statements in a try/catch/rethrow sequence. */
4603 static tree
4604 generate_instinit (tree class_type)
4606 tree current;
4607 tree compound = NULL_TREE;
4608 tree parms = tree_cons (this_identifier_node,
4609 build_pointer_type (class_type), end_params_node);
4610 tree mdecl = create_artificial_method (class_type, ACC_PRIVATE,
4611 void_type_node,
4612 instinit_identifier_node, parms);
4614 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4615 mdecl, NULL_TREE);
4617 /* Gather all the statements in a compound */
4618 for (current = TYPE_II_STMT_LIST (class_type);
4619 current; current = TREE_CHAIN (current))
4620 compound = add_stmt_to_compound (compound, NULL_TREE, current);
4622 /* We need to encapsulate COMPOUND by a try/catch statement to
4623 rethrow exceptions that might occur in the instance initializer.
4624 We do that only if all ctors of CLASS_TYPE are set to catch a
4625 checked exception. This doesn't apply to anonymous classes (since
4626 they don't have declared ctors.) */
4627 if (!ANONYMOUS_CLASS_P (class_type) &&
4628 ctors_unchecked_throws_clause_p (class_type))
4630 compound = encapsulate_with_try_catch (0, exception_type_node, compound,
4631 build1 (THROW_EXPR, NULL_TREE,
4632 build_wfl_node (wpv_id)));
4633 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE,
4634 exception_type_node);
4637 start_artificial_method_body (mdecl);
4638 java_method_add_stmt (mdecl, compound);
4639 end_artificial_method_body (mdecl);
4641 return mdecl;
4644 /* FIXME */
4645 static tree
4646 build_instinit_invocation (tree class_type)
4648 tree to_return = NULL_TREE;
4650 if (TYPE_II_STMT_LIST (class_type))
4652 tree parm = build_tree_list (NULL_TREE,
4653 build_wfl_node (this_identifier_node));
4654 to_return =
4655 build_method_invocation (build_wfl_node (instinit_identifier_node),
4656 parm);
4658 return to_return;
4661 /* Shared across method_declarator and method_header to remember the
4662 patch stage that was reached during the declaration of the method.
4663 A method DECL is built differently is there is no patch
4664 (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
4665 pending on the currently defined method. */
4667 static int patch_stage;
4669 /* Check the method declaration and add the method to its current
4670 class. If the argument list is known to contain incomplete types,
4671 the method is partially added and the registration will be resume
4672 once the method arguments resolved. If TYPE is NULL, we're dealing
4673 with a constructor. */
4675 static tree
4676 method_header (int flags, tree type, tree mdecl, tree throws)
4678 tree type_wfl = NULL_TREE;
4679 tree meth_name = NULL_TREE;
4680 tree current, orig_arg, this_class = NULL;
4681 tree id, meth;
4682 location_t saved_location;
4683 int constructor_ok = 0, must_chain;
4684 int count;
4686 if (mdecl == error_mark_node)
4687 return error_mark_node;
4688 meth = TREE_VALUE (mdecl);
4689 id = TREE_PURPOSE (mdecl);
4691 check_modifiers_consistency (flags);
4693 if (GET_CPC ())
4694 this_class = TREE_TYPE (GET_CPC ());
4696 if (!this_class || this_class == error_mark_node)
4697 return NULL_TREE;
4699 /* There are some forbidden modifiers for an abstract method and its
4700 class must be abstract as well. */
4701 if (type && (flags & ACC_ABSTRACT))
4703 ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
4704 ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
4705 ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
4706 ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
4707 ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized");
4708 ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp");
4709 if (!CLASS_ABSTRACT (TYPE_NAME (this_class))
4710 && !CLASS_INTERFACE (TYPE_NAME (this_class)))
4711 parse_error_context
4712 (id,
4713 "Class %qs must be declared abstract to define abstract method %qs",
4714 IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())),
4715 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4718 /* A native method can't be strictfp. */
4719 if ((flags & ACC_NATIVE) && (flags & ACC_STRICT))
4720 parse_error_context (id, "native method %qs can't be strictfp",
4721 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4722 /* No such thing as a transient or volatile method. */
4723 if ((flags & ACC_TRANSIENT))
4724 parse_error_context (id, "method %qs can't be transient",
4725 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4726 if ((flags & ACC_VOLATILE))
4727 parse_error_context (id, "method %qs can't be volatile",
4728 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4730 /* Things to be checked when declaring a constructor */
4731 if (!type)
4733 int ec = java_error_count;
4734 /* 8.6: Constructor declarations: we might be trying to define a
4735 method without specifying a return type. */
4736 if (EXPR_WFL_NODE (id) != GET_CPC_UN ())
4737 parse_error_context
4738 (id, "Invalid method declaration, return type required");
4739 /* 8.6.3: Constructor modifiers */
4740 else
4742 JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
4743 JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
4744 JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
4745 JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
4746 JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
4747 JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp");
4749 /* If we found error here, we don't consider it's OK to tread
4750 the method definition as a constructor, for the rest of this
4751 function */
4752 if (ec == java_error_count)
4753 constructor_ok = 1;
4756 /* Method declared within the scope of an interface are implicitly
4757 abstract and public. Conflicts with other erroneously provided
4758 modifiers are checked right after. */
4760 if (CLASS_INTERFACE (TYPE_NAME (this_class)))
4762 /* If FLAGS isn't set because of a modifier, turn the
4763 corresponding modifier WFL to NULL so we issue a warning on
4764 the obsolete use of the modifier */
4765 if (!(flags & ACC_PUBLIC))
4766 MODIFIER_WFL (PUBLIC_TK) = NULL;
4767 if (!(flags & ACC_ABSTRACT))
4768 MODIFIER_WFL (ABSTRACT_TK) = NULL;
4769 flags |= ACC_PUBLIC;
4770 flags |= ACC_ABSTRACT;
4773 /* Inner class can't declare static methods */
4774 if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (this_class))
4776 parse_error_context
4777 (id, "Method %qs can't be static in inner class %qs. Only members of interfaces and top-level classes can be static",
4778 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)),
4779 lang_printable_name (this_class, 0));
4782 /* Modifiers context reset moved up, so abstract method declaration
4783 modifiers can be later checked. */
4785 /* Set constructor returned type to void and method name to <init>,
4786 unless we found an error identifier the constructor (in which
4787 case we retain the original name) */
4788 if (!type)
4790 type = void_type_node;
4791 if (constructor_ok)
4792 meth_name = init_identifier_node;
4794 else
4795 meth_name = EXPR_WFL_NODE (id);
4797 /* Do the returned type resolution and registration if necessary */
4798 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4800 if (meth_name)
4801 type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
4802 EXPR_WFL_NODE (id) = meth_name;
4803 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4805 if (must_chain)
4807 patch_stage = JDEP_METHOD_RETURN;
4808 register_incomplete_type (patch_stage, type_wfl, id, type);
4809 TREE_TYPE (meth) = GET_REAL_TYPE (type);
4811 else
4812 TREE_TYPE (meth) = type;
4814 saved_location = input_location;
4815 /* When defining an abstract or interface method, the curly
4816 bracket at level 1 doesn't exist because there is no function
4817 body */
4818 #ifdef USE_MAPPED_LOCATION
4819 input_location = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
4820 EXPR_LOCATION (id));
4821 #else
4822 input_line = (ctxp->first_ccb_indent1 ? (int) ctxp->first_ccb_indent1 :
4823 EXPR_WFL_LINENO (id));
4824 #endif
4826 /* Remember the original argument list */
4827 orig_arg = TYPE_ARG_TYPES (meth);
4829 if (patch_stage) /* includes ret type and/or all args */
4831 jdep *jdep;
4832 meth = add_method_1 (this_class, flags, meth_name, meth);
4833 /* Patch for the return type */
4834 if (patch_stage == JDEP_METHOD_RETURN)
4836 jdep = CLASSD_LAST (ctxp->classd_list);
4837 JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
4839 /* This is the stop JDEP. METH allows the function's signature
4840 to be computed. */
4841 register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
4843 else
4844 meth = add_method (this_class, flags, meth_name,
4845 build_java_signature (meth));
4847 /* Remember final parameters */
4848 MARK_FINAL_PARMS (meth, orig_arg);
4850 /* Fix the method argument list so we have the argument name
4851 information */
4852 fix_method_argument_names (orig_arg, meth);
4854 /* Register the parameter number and re-install the current line
4855 number */
4856 DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
4857 input_location = saved_location;
4859 /* Register exception specified by the `throws' keyword for
4860 resolution and set the method decl appropriate field to the list.
4861 Note: the grammar ensures that what we get here are class
4862 types. */
4863 if (throws)
4865 throws = nreverse (throws);
4866 for (current = throws; current; current = TREE_CHAIN (current))
4868 register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
4869 NULL_TREE, NULL_TREE);
4870 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
4871 &TREE_VALUE (current);
4873 DECL_FUNCTION_THROWS (meth) = throws;
4876 if (TREE_TYPE (GET_CPC ()) != object_type_node)
4877 DECL_FUNCTION_WFL (meth) = id;
4879 /* Set the flag if we correctly processed a constructor */
4880 if (constructor_ok)
4882 DECL_CONSTRUCTOR_P (meth) = 1;
4883 /* Compute and store the number of artificial parameters declared
4884 for this constructor */
4885 for (count = 0, current = TYPE_FIELDS (this_class); current;
4886 current = TREE_CHAIN (current))
4887 if (FIELD_LOCAL_ALIAS (current))
4888 count++;
4889 DECL_FUNCTION_NAP (meth) = count;
4892 /* Eventually set the @deprecated tag flag */
4893 CHECK_DEPRECATED (meth);
4895 return meth;
4898 static void
4899 fix_method_argument_names (tree orig_arg, tree meth)
4901 tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
4902 if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
4904 TREE_PURPOSE (arg) = this_identifier_node;
4905 arg = TREE_CHAIN (arg);
4907 while (orig_arg != end_params_node)
4909 TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
4910 orig_arg = TREE_CHAIN (orig_arg);
4911 arg = TREE_CHAIN (arg);
4915 /* Complete the method declaration with METHOD_BODY. */
4917 static void
4918 finish_method_declaration (tree method_body)
4920 int flags;
4922 if (!current_function_decl)
4923 return;
4925 flags = get_access_flags_from_decl (current_function_decl);
4927 /* 8.4.5 Method Body */
4928 if ((flags & ACC_ABSTRACT || flags & ACC_NATIVE) && method_body)
4930 tree name = DECL_NAME (current_function_decl);
4931 parse_error_context (DECL_FUNCTION_WFL (current_function_decl),
4932 "%s method %qs can't have a body defined",
4933 (METHOD_NATIVE (current_function_decl) ?
4934 "Native" : "Abstract"),
4935 IDENTIFIER_POINTER (name));
4936 method_body = NULL_TREE;
4938 else if (!(flags & ACC_ABSTRACT) && !(flags & ACC_NATIVE) && !method_body)
4940 tree name = DECL_NAME (current_function_decl);
4941 parse_error_context
4942 (DECL_FUNCTION_WFL (current_function_decl),
4943 "Non native and non abstract method %qs must have a body defined",
4944 IDENTIFIER_POINTER (name));
4945 method_body = NULL_TREE;
4948 if (flag_emit_class_files && method_body
4949 && TREE_CODE (method_body) == NOP_EXPR
4950 && TREE_TYPE (current_function_decl)
4951 && TREE_TYPE (TREE_TYPE (current_function_decl)) == void_type_node)
4952 method_body = build1 (RETURN_EXPR, void_type_node, NULL);
4954 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
4955 maybe_absorb_scoping_blocks ();
4956 /* Exit function's body */
4957 exit_block ();
4958 /* Merge last line of the function with first line, directly in the
4959 function decl. It will be used to emit correct debug info. */
4960 DECL_FUNCTION_LAST_LINE (current_function_decl) = ctxp->last_ccb_indent1;
4962 /* Since function's argument's list are shared, reset the
4963 ARG_FINAL_P parameter that might have been set on some of this
4964 function parameters. */
4965 UNMARK_FINAL_PARMS (current_function_decl);
4967 /* So we don't have an irrelevant function declaration context for
4968 the next static block we'll see. */
4969 current_function_decl = NULL_TREE;
4972 /* Build a an error message for constructor circularity errors. */
4974 static char *
4975 constructor_circularity_msg (tree from, tree to)
4977 static char string [4096];
4978 char *t = xstrdup (lang_printable_name (from, 2));
4979 sprintf (string, "'%s' invokes '%s'", t, lang_printable_name (to, 2));
4980 free (t);
4981 return string;
4984 /* Verify a circular call to METH. Return 1 if an error is found, 0
4985 otherwise. */
4987 static GTY(()) tree vcc_list;
4988 static int
4989 verify_constructor_circularity (tree meth, tree current)
4991 tree c;
4993 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4995 if (TREE_VALUE (c) == meth)
4997 char *t;
4998 if (vcc_list)
5000 tree liste;
5001 vcc_list = nreverse (vcc_list);
5002 for (liste = vcc_list; liste; liste = TREE_CHAIN (liste))
5004 parse_error_context
5005 (TREE_PURPOSE (TREE_PURPOSE (liste)), "%s",
5006 constructor_circularity_msg
5007 (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
5008 java_error_count--;
5011 t = xstrdup (lang_printable_name (meth, 2));
5012 parse_error_context (TREE_PURPOSE (c),
5013 "%s: recursive invocation of constructor %qs",
5014 constructor_circularity_msg (current, meth), t);
5015 free (t);
5016 vcc_list = NULL_TREE;
5017 return 1;
5020 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
5022 vcc_list = tree_cons (c, current, vcc_list);
5023 if (verify_constructor_circularity (meth, TREE_VALUE (c)))
5024 return 1;
5025 vcc_list = TREE_CHAIN (vcc_list);
5027 return 0;
5030 /* Check modifiers that can be declared but exclusively */
5032 static void
5033 check_modifiers_consistency (int flags)
5035 int acc_count = 0;
5036 tree cl = NULL_TREE;
5038 THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, PUBLIC_TK, acc_count, cl);
5039 THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, PRIVATE_TK, acc_count, cl);
5040 THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, PROTECTED_TK, acc_count, cl);
5041 if (acc_count > 1)
5042 parse_error_context
5043 (cl, "Inconsistent member declaration. At most one of %<public%>, %<private%>, or %<protected%> may be specified");
5045 acc_count = 0;
5046 cl = NULL_TREE;
5047 THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK, acc_count, cl);
5048 THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK, acc_count, cl);
5049 if (acc_count > 1)
5050 parse_error_context (cl,
5051 "Inconsistent member declaration. At most one of %<final%> or %<volatile%> may be specified");
5054 /* Check the methode header METH for abstract specifics features */
5056 static void
5057 check_abstract_method_header (tree meth)
5059 int flags = get_access_flags_from_decl (meth);
5061 OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (ABSTRACT_TK), flags,
5062 ACC_ABSTRACT, "abstract method",
5063 IDENTIFIER_POINTER (DECL_NAME (meth)));
5064 OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (PUBLIC_TK), flags,
5065 ACC_PUBLIC, "abstract method",
5066 IDENTIFIER_POINTER (DECL_NAME (meth)));
5068 check_modifiers ("Illegal modifier %qs for interface method",
5069 flags, INTERFACE_METHOD_MODIFIERS);
5072 /* Create a FUNCTION_TYPE node and start augmenting it with the
5073 declared function arguments. Arguments type that can't be resolved
5074 are left as they are, but the returned node is marked as containing
5075 incomplete types. */
5077 static tree
5078 method_declarator (tree id, tree list)
5080 tree arg_types = NULL_TREE, current, node;
5081 tree meth = make_node (FUNCTION_TYPE);
5082 jdep *jdep;
5084 patch_stage = JDEP_NO_PATCH;
5086 if (GET_CPC () == error_mark_node)
5087 return error_mark_node;
5089 /* If we're dealing with an inner class constructor, we hide the
5090 this$<n> decl in the name field of its parameter declaration. We
5091 also might have to hide the outer context local alias
5092 initializers. Not done when the class is a toplevel class. */
5093 if (PURE_INNER_CLASS_DECL_P (GET_CPC ())
5094 && EXPR_WFL_NODE (id) == GET_CPC_UN ())
5096 tree aliases_list, type, thisn;
5097 /* First the aliases, linked to the regular parameters */
5098 aliases_list =
5099 build_alias_initializer_parameter_list (AIPL_FUNCTION_DECLARATION,
5100 TREE_TYPE (GET_CPC ()),
5101 NULL_TREE, NULL);
5102 list = chainon (nreverse (aliases_list), list);
5104 /* Then this$<n> */
5105 type = TREE_TYPE (DECL_CONTEXT (GET_CPC ()));
5106 thisn = build_current_thisn (TREE_TYPE (GET_CPC ()));
5107 list = tree_cons (build_wfl_node (thisn), build_pointer_type (type),
5108 list);
5111 for (current = list; current; current = TREE_CHAIN (current))
5113 int must_chain = 0;
5114 tree wfl_name = TREE_PURPOSE (current);
5115 tree type = TREE_VALUE (current);
5116 tree name = EXPR_WFL_NODE (wfl_name);
5117 tree already, arg_node;
5118 tree type_wfl = NULL_TREE;
5119 tree real_type;
5121 /* Obtain a suitable type for resolution, if necessary */
5122 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
5124 /* Process NAME, as it may specify extra dimension(s) for it */
5125 type = build_array_from_name (type, type_wfl, name, &name);
5126 EXPR_WFL_NODE (wfl_name) = name;
5128 real_type = GET_REAL_TYPE (type);
5129 if (TREE_CODE (real_type) == RECORD_TYPE)
5131 real_type = promote_type (real_type);
5132 if (TREE_CODE (type) == TREE_LIST)
5133 TREE_PURPOSE (type) = real_type;
5136 /* Check redefinition */
5137 for (already = arg_types; already; already = TREE_CHAIN (already))
5138 if (TREE_PURPOSE (already) == name)
5140 parse_error_context
5141 (wfl_name, "Variable %qs is used more than once in the argument list of method %qs",
5142 IDENTIFIER_POINTER (name),
5143 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
5144 break;
5147 /* If we've an incomplete argument type, we know there is a location
5148 to patch when the type get resolved, later. */
5149 jdep = NULL;
5150 if (must_chain)
5152 patch_stage = JDEP_METHOD;
5153 type = register_incomplete_type (patch_stage,
5154 type_wfl, wfl_name, type);
5155 jdep = CLASSD_LAST (ctxp->classd_list);
5156 JDEP_MISC (jdep) = id;
5159 /* The argument node: a name and a (possibly) incomplete type. */
5160 arg_node = build_tree_list (name, real_type);
5161 /* Remember arguments declared final. */
5162 ARG_FINAL_P (arg_node) = ARG_FINAL_P (current);
5164 if (jdep)
5165 JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
5166 TREE_CHAIN (arg_node) = arg_types;
5167 arg_types = arg_node;
5169 TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
5170 node = build_tree_list (id, meth);
5171 return node;
5174 static int
5175 unresolved_type_p (tree wfl, tree *returned)
5177 if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
5179 if (returned)
5181 tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
5182 if (decl && current_class && (decl == TYPE_NAME (current_class)))
5183 *returned = TREE_TYPE (decl);
5184 else if (GET_CPC_UN () == EXPR_WFL_NODE (wfl))
5185 *returned = TREE_TYPE (GET_CPC ());
5186 else
5187 *returned = NULL_TREE;
5189 return 1;
5191 if (returned)
5192 *returned = wfl;
5193 return 0;
5196 /* From NAME, build a qualified identifier node using the
5197 qualification from the current package definition. */
5199 static tree
5200 parser_qualified_classname (tree name)
5202 tree nested_class_name;
5204 if ((nested_class_name = maybe_make_nested_class_name (name)))
5205 return nested_class_name;
5207 if (ctxp->package)
5208 return merge_qualified_name (ctxp->package, name);
5209 else
5210 return name;
5213 /* Called once the type a interface extends is resolved. Returns 0 if
5214 everything is OK. */
5216 static int
5217 parser_check_super_interface (tree super_decl, tree this_decl, tree this_wfl)
5219 tree super_type = TREE_TYPE (super_decl);
5221 /* Has to be an interface */
5222 if (!CLASS_INTERFACE (super_decl))
5224 parse_error_context
5225 (this_wfl, "%s %qs can't implement/extend %s %qs",
5226 (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
5227 "Interface" : "Class"),
5228 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5229 (TYPE_ARRAY_P (super_type) ? "array" : "class"),
5230 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5231 return 1;
5234 /* Check top-level interface access. Inner classes are subject to member
5235 access rules (6.6.1). */
5236 if (! INNER_CLASS_P (super_type)
5237 && check_pkg_class_access (DECL_NAME (super_decl),
5238 NULL_TREE, true, this_decl))
5239 return 1;
5241 SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
5242 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5243 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5244 return 0;
5247 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
5248 0 if everything is OK. */
5250 static int
5251 parser_check_super (tree super_decl, tree this_decl, tree wfl)
5253 tree super_type = TREE_TYPE (super_decl);
5255 /* SUPER should be a CLASS (neither an array nor an interface) */
5256 if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
5258 parse_error_context
5259 (wfl, "Class %qs can't subclass %s %qs",
5260 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5261 (CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
5262 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5263 return 1;
5266 if (CLASS_FINAL (TYPE_NAME (super_type)))
5268 parse_error_context (wfl, "Can't subclass final classes: %s",
5269 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5270 return 1;
5273 /* Check top-level class scope. Inner classes are subject to member access
5274 rules (6.6.1). */
5275 if (! INNER_CLASS_P (super_type)
5276 && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true, NULL_TREE)))
5277 return 1;
5279 SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
5280 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5281 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5282 return 0;
5285 /* Create a new dependency list and link it (in a LIFO manner) to the
5286 CTXP list of type dependency list. */
5288 static void
5289 create_jdep_list (struct parser_ctxt *ctxp)
5291 jdeplist *new = xmalloc (sizeof (jdeplist));
5292 new->first = new->last = NULL;
5293 new->next = ctxp->classd_list;
5294 ctxp->classd_list = new;
5297 static jdeplist *
5298 reverse_jdep_list (struct parser_ctxt *ctxp)
5300 jdeplist *prev = NULL, *current, *next;
5301 for (current = ctxp->classd_list; current; current = next)
5303 next = current->next;
5304 current->next = prev;
5305 prev = current;
5307 return prev;
5310 /* Create a fake pointer based on the ID stored in
5311 TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
5312 registered again. */
5314 static tree
5315 obtain_incomplete_type (tree type_name)
5317 tree ptr = NULL_TREE, name;
5319 if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
5320 name = EXPR_WFL_NODE (type_name);
5321 else if (INCOMPLETE_TYPE_P (type_name))
5322 name = TYPE_NAME (type_name);
5323 else
5324 abort ();
5326 /* Workaround from build_pointer_type for incomplete types. */
5327 BUILD_PTR_FROM_NAME (ptr, name);
5328 TYPE_MODE (ptr) = ptr_mode;
5329 layout_type (ptr);
5331 return ptr;
5334 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
5335 non NULL instead of computing a new fake type based on WFL. The new
5336 dependency is inserted in the current type dependency list, in FIFO
5337 manner. */
5339 static tree
5340 register_incomplete_type (int kind, tree wfl, tree decl, tree ptr)
5342 jdep *new = xmalloc (sizeof (jdep));
5344 if (!ptr && kind != JDEP_METHOD_END) /* JDEP_METHOD_END is a mere marker */
5345 ptr = obtain_incomplete_type (wfl);
5347 JDEP_KIND (new) = kind;
5348 JDEP_DECL (new) = decl;
5349 JDEP_TO_RESOLVE (new) = ptr;
5350 JDEP_WFL (new) = wfl;
5351 JDEP_CHAIN (new) = NULL;
5352 JDEP_MISC (new) = NULL_TREE;
5353 /* For some dependencies, set the enclosing class of the current
5354 class to be the enclosing context */
5355 if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS || kind == JDEP_SUPER)
5356 && GET_ENCLOSING_CPC ())
5357 JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ());
5358 else
5359 JDEP_ENCLOSING (new) = GET_CPC ();
5360 JDEP_GET_PATCH (new) = (tree *)NULL;
5362 JDEP_INSERT (ctxp->classd_list, new);
5364 return ptr;
5367 /* This checks for circular references with innerclasses. We start
5368 from SOURCE and should never reach TARGET. Extended/implemented
5369 types in SOURCE have their enclosing context checked not to reach
5370 TARGET. When the last enclosing context of SOURCE is reached, its
5371 extended/implemented types are also checked not to reach TARGET.
5372 In case of error, WFL of the offending type is returned; NULL_TREE
5373 otherwise. */
5375 static tree
5376 check_inner_circular_reference (tree source, tree target)
5378 tree base_binfo;
5379 tree ctx, cl;
5380 int i;
5382 for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (source), i, base_binfo); i++)
5384 tree su;
5386 /* We can end up with a NULL_TREE or an incomplete type here if
5387 we encountered previous type resolution errors. It's safe to
5388 simply ignore these cases. */
5389 su = BINFO_TYPE (base_binfo);
5390 if (INCOMPLETE_TYPE_P (su))
5391 continue;
5393 if (inherits_from_p (su, target))
5394 return lookup_cl (TYPE_NAME (su));
5396 for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx))
5398 /* An enclosing context shouldn't be TARGET */
5399 if (ctx == TYPE_NAME (target))
5400 return lookup_cl (TYPE_NAME (su));
5402 /* When we reach the enclosing last context, start a check
5403 on it, with the same target */
5404 if (! DECL_CONTEXT (ctx) &&
5405 (cl = check_inner_circular_reference (TREE_TYPE (ctx), target)))
5406 return cl;
5409 return NULL_TREE;
5412 /* Explore TYPE's `extends' clause member(s) and return the WFL of the
5413 offending type if a circularity is detected. NULL_TREE is returned
5414 otherwise. TYPE can be an interface or a class. */
5416 static tree
5417 check_circular_reference (tree type)
5419 tree base_binfo;
5420 int i;
5422 if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
5423 return NULL_TREE;
5425 if (! CLASS_INTERFACE (TYPE_NAME (type)))
5427 if (inherits_from_p (CLASSTYPE_SUPER (type), type))
5428 return lookup_cl (TYPE_NAME (type));
5429 return NULL_TREE;
5432 for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (type), i, base_binfo); i++)
5434 if (BINFO_TYPE (base_binfo) != object_type_node
5435 && interface_of_p (type, BINFO_TYPE (base_binfo)))
5436 return lookup_cl (TYPE_NAME (BINFO_TYPE (base_binfo)));
5438 return NULL_TREE;
5441 void
5442 java_check_circular_reference (void)
5444 tree current;
5445 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5447 tree type = TREE_TYPE (current);
5448 tree cl;
5450 cl = check_circular_reference (type);
5451 if (! cl)
5452 cl = check_inner_circular_reference (type, type);
5453 if (cl)
5454 parse_error_context (cl, "Cyclic class inheritance%s",
5455 (cyclic_inheritance_report ?
5456 cyclic_inheritance_report : ""));
5460 /* Augment the parameter list PARM with parameters crafted to
5461 initialize outer context locals aliases. Through ARTIFICIAL, a
5462 count is kept of the number of crafted parameters. MODE governs
5463 what eventually gets created: something suitable for a function
5464 creation or a function invocation, either the constructor or
5465 finit$. */
5467 static tree
5468 build_alias_initializer_parameter_list (int mode, tree class_type, tree parm,
5469 int *artificial)
5471 tree field;
5472 tree additional_parms = NULL_TREE;
5474 for (field = TYPE_FIELDS (class_type); field; field = TREE_CHAIN (field))
5475 if (FIELD_LOCAL_ALIAS (field))
5477 const char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
5478 tree purpose = NULL_TREE, value = NULL_TREE, name = NULL_TREE;
5479 tree mangled_id;
5481 switch (mode)
5483 case AIPL_FUNCTION_DECLARATION:
5484 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5485 &buffer [4]);
5486 purpose = build_wfl_node (mangled_id);
5487 if (TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE)
5488 value = build_wfl_node (TYPE_NAME (TREE_TYPE (field)));
5489 else
5490 value = TREE_TYPE (field);
5491 break;
5493 case AIPL_FUNCTION_CREATION:
5494 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (purpose,
5495 &buffer [4]);
5496 value = TREE_TYPE (field);
5497 break;
5499 case AIPL_FUNCTION_FINIT_INVOCATION:
5500 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5501 &buffer [4]);
5502 /* Now, this is wrong. purpose should always be the NAME
5503 of something and value its matching value (decl, type,
5504 etc...) FIXME -- but there is a lot to fix. */
5506 /* When invoked for this kind of operation, we already
5507 know whether a field is used or not. */
5508 purpose = TREE_TYPE (field);
5509 value = build_wfl_node (mangled_id);
5510 break;
5512 case AIPL_FUNCTION_CTOR_INVOCATION:
5513 /* There are two case: the constructor invocation happens
5514 outside the local inner, in which case, locales from the outer
5515 context are directly used.
5517 Otherwise, we fold to using the alias directly. */
5518 if (class_type == current_class)
5519 value = field;
5520 else
5522 name = get_identifier (&buffer[4]);
5523 value = IDENTIFIER_LOCAL_VALUE (name);
5525 break;
5527 additional_parms = tree_cons (purpose, value, additional_parms);
5528 if (artificial)
5529 *artificial +=1;
5531 if (additional_parms)
5533 if (ANONYMOUS_CLASS_P (class_type)
5534 && mode == AIPL_FUNCTION_CTOR_INVOCATION)
5535 additional_parms = nreverse (additional_parms);
5536 parm = chainon (additional_parms, parm);
5539 return parm;
5542 /* Craft a constructor for CLASS_DECL -- what we should do when none
5543 where found. ARGS is non NULL when a special signature must be
5544 enforced. This is the case for anonymous classes. */
5546 static tree
5547 craft_constructor (tree class_decl, tree args)
5549 tree class_type = TREE_TYPE (class_decl);
5550 tree parm = NULL_TREE;
5551 /* Inherit access flags for the constructor from its enclosing class. */
5552 int valid_ctor_flags = ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE;
5553 int flags = (get_access_flags_from_decl (class_decl) & valid_ctor_flags);
5554 int i = 0, artificial = 0;
5555 tree decl, ctor_name;
5556 char buffer [80];
5558 ctor_name = init_identifier_node;
5560 /* If we're dealing with an inner class constructor, we hide the
5561 this$<n> decl in the name field of its parameter declaration. */
5562 if (PURE_INNER_CLASS_TYPE_P (class_type))
5564 tree type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_type)));
5565 parm = tree_cons (build_current_thisn (class_type),
5566 build_pointer_type (type), parm);
5568 /* Some more arguments to be hidden here. The values of the local
5569 variables of the outer context that the inner class needs to see. */
5570 parm = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
5571 class_type, parm,
5572 &artificial);
5575 /* Then if there are any args to be enforced, enforce them now */
5576 for (; args && args != end_params_node; args = TREE_CHAIN (args))
5578 /* If we see a `void *', we need to change it to Object. */
5579 if (TREE_VALUE (args) == TREE_TYPE (null_pointer_node))
5580 TREE_VALUE (args) = object_ptr_type_node;
5582 sprintf (buffer, "parm%d", i++);
5583 parm = tree_cons (get_identifier (buffer), TREE_VALUE (args), parm);
5586 CRAFTED_PARAM_LIST_FIXUP (parm);
5587 decl = create_artificial_method (class_type, flags, void_type_node,
5588 ctor_name, parm);
5589 fix_method_argument_names (parm, decl);
5590 /* Now, mark the artificial parameters. */
5591 DECL_FUNCTION_NAP (decl) = artificial;
5592 DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1;
5593 DECL_INLINE (decl) = 1;
5594 return decl;
5598 /* Fix the constructors. This will be called right after circular
5599 references have been checked. It is necessary to fix constructors
5600 early even if no code generation will take place for that class:
5601 some generated constructor might be required by the class whose
5602 compilation triggered this one to be simply loaded. */
5604 void
5605 java_fix_constructors (void)
5607 tree current;
5609 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5611 tree class_type = TREE_TYPE (current);
5612 int saw_ctor = 0;
5613 tree decl;
5615 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
5616 continue;
5618 output_class = current_class = class_type;
5619 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
5621 if (DECL_CONSTRUCTOR_P (decl))
5623 fix_constructors (decl);
5624 saw_ctor = 1;
5628 /* Anonymous class constructor can't be generated that early. */
5629 if (!saw_ctor && !ANONYMOUS_CLASS_P (class_type))
5630 craft_constructor (current, NULL_TREE);
5634 /* safe_layout_class just makes sure that we can load a class without
5635 disrupting the current_class, input_file, input_line, etc, information
5636 about the class processed currently. */
5638 void
5639 safe_layout_class (tree class)
5641 tree save_current_class = current_class;
5642 location_t save_location = input_location;
5644 layout_class (class);
5646 current_class = save_current_class;
5647 input_location = save_location;
5650 static tree
5651 jdep_resolve_class (jdep *dep)
5653 tree decl;
5655 /* Set the correct context for class resolution. */
5656 current_class = TREE_TYPE (JDEP_ENCLOSING (dep));
5658 if (JDEP_RESOLVED_P (dep))
5659 decl = JDEP_RESOLVED_DECL (dep);
5660 else
5662 decl = resolve_class (JDEP_ENCLOSING (dep), JDEP_TO_RESOLVE (dep),
5663 JDEP_DECL (dep), JDEP_WFL (dep));
5664 JDEP_RESOLVED (dep, decl);
5665 /* If there is no WFL, that's ok. We generate this warning
5666 elsewhere. */
5667 if (decl && JDEP_WFL (dep) != NULL_TREE)
5668 check_deprecation (JDEP_WFL (dep), decl);
5671 if (!decl)
5672 complete_class_report_errors (dep);
5673 else if (INNER_CLASS_DECL_P (decl))
5675 tree inner = TREE_TYPE (decl);
5676 if (! CLASS_LOADED_P (inner))
5678 safe_layout_class (inner);
5679 if (TYPE_SIZE (inner) == error_mark_node)
5680 TYPE_SIZE (inner) = NULL_TREE;
5682 check_inner_class_access (decl, JDEP_ENCLOSING (dep), JDEP_WFL (dep));
5684 return decl;
5687 /* Complete unsatisfied class declaration and their dependencies */
5689 void
5690 java_complete_class (void)
5692 tree cclass;
5693 jdeplist *cclassd;
5694 int error_found;
5695 tree type;
5697 /* Process imports */
5698 process_imports ();
5700 /* Reverse things so we have the right order */
5701 ctxp->class_list = nreverse (ctxp->class_list);
5702 ctxp->classd_list = reverse_jdep_list (ctxp);
5704 for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
5705 cclass && cclassd;
5706 cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
5708 jdep *dep;
5710 for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
5712 tree decl;
5713 if (!(decl = jdep_resolve_class (dep)))
5714 continue;
5716 /* Now it's time to patch */
5717 switch (JDEP_KIND (dep))
5719 case JDEP_SUPER:
5720 /* Simply patch super */
5721 if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
5722 continue;
5723 BINFO_TYPE (BINFO_BASE_BINFO
5724 (TYPE_BINFO (TREE_TYPE (JDEP_DECL (dep))), 0))
5725 = TREE_TYPE (decl);
5726 break;
5728 case JDEP_FIELD:
5730 /* We do part of the job done in add_field */
5731 tree field_decl = JDEP_DECL (dep);
5732 tree field_type = TREE_TYPE (decl);
5733 if (TREE_CODE (field_type) == RECORD_TYPE)
5734 field_type = promote_type (field_type);
5735 TREE_TYPE (field_decl) = field_type;
5736 DECL_ALIGN (field_decl) = 0;
5737 DECL_USER_ALIGN (field_decl) = 0;
5738 layout_decl (field_decl, 0);
5739 SOURCE_FRONTEND_DEBUG
5740 (("Completed field/var decl '%s' with '%s'",
5741 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
5742 IDENTIFIER_POINTER (DECL_NAME (decl))));
5743 break;
5745 case JDEP_METHOD: /* We start patching a method */
5746 case JDEP_METHOD_RETURN:
5747 error_found = 0;
5748 while (1)
5750 if (decl)
5752 type = TREE_TYPE(decl);
5753 if (TREE_CODE (type) == RECORD_TYPE)
5754 type = promote_type (type);
5755 JDEP_APPLY_PATCH (dep, type);
5756 SOURCE_FRONTEND_DEBUG
5757 (((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
5758 "Completing fct '%s' with ret type '%s'":
5759 "Completing arg '%s' with type '%s'"),
5760 IDENTIFIER_POINTER (EXPR_WFL_NODE
5761 (JDEP_DECL_WFL (dep))),
5762 IDENTIFIER_POINTER (DECL_NAME (decl))));
5764 else
5765 error_found = 1;
5766 dep = JDEP_CHAIN (dep);
5767 if (JDEP_KIND (dep) == JDEP_METHOD_END)
5768 break;
5769 else
5770 decl = jdep_resolve_class (dep);
5772 if (!error_found)
5774 tree mdecl = JDEP_DECL (dep), signature;
5775 /* Recompute and reset the signature, check first that
5776 all types are now defined. If they're not,
5777 don't build the signature. */
5778 if (check_method_types_complete (mdecl))
5780 signature = build_java_signature (TREE_TYPE (mdecl));
5781 set_java_signature (TREE_TYPE (mdecl), signature);
5784 else
5785 continue;
5786 break;
5788 case JDEP_INTERFACE:
5789 if (parser_check_super_interface (decl, JDEP_DECL (dep),
5790 JDEP_WFL (dep)))
5791 continue;
5792 parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
5793 break;
5795 case JDEP_PARM:
5796 case JDEP_VARIABLE:
5797 type = TREE_TYPE(decl);
5798 if (TREE_CODE (type) == RECORD_TYPE)
5799 type = promote_type (type);
5800 JDEP_APPLY_PATCH (dep, type);
5801 break;
5803 case JDEP_TYPE:
5804 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5805 SOURCE_FRONTEND_DEBUG
5806 (("Completing a random type dependency on a '%s' node",
5807 tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
5808 break;
5810 case JDEP_EXCEPTION:
5811 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5812 SOURCE_FRONTEND_DEBUG
5813 (("Completing '%s' 'throws' argument node",
5814 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
5815 break;
5817 case JDEP_ANONYMOUS:
5818 patch_anonymous_class (decl, JDEP_DECL (dep), JDEP_WFL (dep));
5819 break;
5821 default:
5822 abort ();
5826 return;
5829 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
5830 array. */
5832 static tree
5833 resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5835 tree tname = TYPE_NAME (class_type);
5836 tree resolved_type = TREE_TYPE (class_type);
5837 int array_dims = 0;
5838 tree resolved_type_decl;
5840 if (resolved_type != NULL_TREE)
5842 tree resolved_type_decl = TYPE_NAME (resolved_type);
5843 if (resolved_type_decl == NULL_TREE
5844 || TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
5846 resolved_type_decl = build_decl (TYPE_DECL,
5847 TYPE_NAME (class_type),
5848 resolved_type);
5850 return resolved_type_decl;
5853 /* 1- Check to see if we have an array. If true, find what we really
5854 want to resolve */
5855 if ((array_dims = build_type_name_from_array_name (tname,
5856 &TYPE_NAME (class_type))))
5857 WFL_STRIP_BRACKET (cl, cl);
5859 /* 2- Resolve the bare type */
5860 if (!(resolved_type_decl = do_resolve_class (enclosing, NULL_TREE, class_type,
5861 decl, cl)))
5862 return NULL_TREE;
5863 resolved_type = TREE_TYPE (resolved_type_decl);
5865 /* 3- If we have an array, reconstruct the array down to its nesting */
5866 if (array_dims)
5868 for (; array_dims; array_dims--)
5869 resolved_type = build_java_array_type (resolved_type, -1);
5870 resolved_type_decl = TYPE_NAME (resolved_type);
5872 TREE_TYPE (class_type) = resolved_type;
5873 return resolved_type_decl;
5876 /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL
5877 are used to report error messages; CL must either be NULL_TREE or a
5878 WFL wrapping a class. Do not try to replace TYPE_NAME (class_type)
5879 by a variable, since it is changed by find_in_imports{_on_demand}
5880 and (but it doesn't really matter) qualify_and_find. */
5882 tree
5883 do_resolve_class (tree enclosing, tree import_type, tree class_type, tree decl,
5884 tree cl)
5886 tree new_class_decl = NULL_TREE;
5887 tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
5888 tree candidate = NULL_TREE;
5889 tree decl_result;
5891 if (QUALIFIED_P (TYPE_NAME (class_type)))
5893 /* If the type name is of the form `Q . Id', then Q is either a
5894 package name or a class name. First we try to find Q as a
5895 class and then treat Id as a member type. If we can't find Q
5896 as a class then we fall through. */
5897 tree q, left, left_type, right;
5898 if (split_qualified_name (&left, &right, TYPE_NAME (class_type)) == 0)
5900 BUILD_PTR_FROM_NAME (left_type, left);
5901 q = do_resolve_class (enclosing, import_type, left_type, decl, cl);
5902 if (q)
5904 enclosing = q;
5905 saved_enclosing_type = TREE_TYPE (q);
5906 BUILD_PTR_FROM_NAME (class_type, right);
5911 if (enclosing)
5913 tree context = enclosing;
5915 /* 0- Search in the current class as an inner class.
5916 Maybe some code here should be added to load the class or
5917 something, at least if the class isn't an inner class and ended
5918 being loaded from class file. FIXME. */
5919 while (enclosing)
5921 new_class_decl = resolve_inner_class (context, cl, enclosing, class_type);
5923 if (new_class_decl)
5925 if (inner_class_accessible (new_class_decl, context))
5926 break;
5927 else
5928 if (candidate == NULL_TREE)
5929 candidate = new_class_decl;
5930 new_class_decl = NULL_TREE;
5933 /* Now that we've looked through all superclasses, try the enclosing
5934 context. */
5935 enclosing = DECL_CONTEXT (enclosing);
5938 if (new_class_decl)
5939 return new_class_decl;
5942 /* 1- Check for the type in single imports. Look at enclosing classes and,
5943 if we're laying out a superclass, at the import list for the subclass.
5944 This will change TYPE_NAME() if something relevant is found. */
5945 if (import_type && TYPE_IMPORT_LIST (import_type))
5946 find_in_imports (import_type, class_type);
5947 find_in_imports (saved_enclosing_type, class_type);
5949 /* 2- And check for the type in the current compilation unit */
5950 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5952 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)))
5953 load_class (TYPE_NAME (class_type), 0);
5954 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5957 /* 3- Search according to the current package definition */
5958 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5960 if ((new_class_decl = qualify_and_find (class_type,
5961 TYPE_PACKAGE (current_class), TYPE_NAME (class_type))))
5962 return new_class_decl;
5965 /* 4- Check the import on demands. Don't allow bar.baz to be
5966 imported from foo.* */
5967 if (!QUALIFIED_P (TYPE_NAME (class_type)))
5969 if (import_type
5970 && TYPE_IMPORT_DEMAND_LIST (import_type)
5971 && find_in_imports_on_demand (import_type, class_type))
5972 return NULL_TREE;
5973 if (find_in_imports_on_demand (saved_enclosing_type, class_type))
5974 return NULL_TREE;
5977 /* If found in find_in_imports_on_demand, the type has already been
5978 loaded. */
5979 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5980 return new_class_decl;
5982 /* 5- Check another compilation unit that bears the name of type */
5983 load_class (TYPE_NAME (class_type), 0);
5985 if (!cl)
5986 cl = lookup_cl (decl);
5988 /* If we don't have a value for CL, then we're being called recursively.
5989 We can't check package access just yet, but it will be taken care of
5990 by the caller. */
5991 if (cl)
5993 if (check_pkg_class_access (TYPE_NAME (class_type), cl, true, NULL_TREE))
5994 return NULL_TREE;
5997 /* 6- Last call for a resolution */
5998 decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
6000 /* The final lookup might have registered a.b.c into a.b$c If we
6001 failed at the first lookup, progressively change the name if
6002 applicable and use the matching DECL instead. */
6003 if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
6005 char *separator;
6006 tree name = TYPE_NAME (class_type);
6007 char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1);
6009 strcpy (namebuffer, IDENTIFIER_POINTER (name));
6011 do {
6013 /* Reach the last '.', and if applicable, replace it by a `$' and
6014 see if this exists as a type. */
6015 if ((separator = strrchr (namebuffer, '.')))
6017 *separator = '$';
6018 name = get_identifier (namebuffer);
6019 decl_result = IDENTIFIER_CLASS_VALUE (name);
6021 } while (!decl_result && separator);
6023 if (decl_result)
6024 return decl_result;
6025 else
6026 return candidate;
6029 static tree
6030 qualify_and_find (tree class_type, tree package, tree name)
6032 tree new_qualified = merge_qualified_name (package, name);
6033 tree new_class_decl;
6035 if (!IDENTIFIER_CLASS_VALUE (new_qualified))
6036 load_class (new_qualified, 0);
6037 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_qualified)))
6039 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)))
6040 load_class (TREE_TYPE (new_class_decl), 0);
6041 TYPE_NAME (class_type) = new_qualified;
6042 return IDENTIFIER_CLASS_VALUE (new_qualified);
6044 return NULL_TREE;
6047 /* Resolve NAME and lay it out (if not done and if not the current
6048 parsed class). Return a decl node. This function is meant to be
6049 called when type resolution is necessary during the walk pass. */
6051 static tree
6052 resolve_and_layout (tree something, tree cl)
6054 tree decl, decl_type;
6056 /* Don't do that on the current class */
6057 if (something == current_class)
6058 return TYPE_NAME (current_class);
6060 /* Don't do anything for void and other primitive types */
6061 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
6062 return NULL_TREE;
6064 /* Pointer types can be reall pointer types or fake pointers. When
6065 finding a real pointer, recheck for primitive types */
6066 if (TREE_CODE (something) == POINTER_TYPE)
6068 if (TREE_TYPE (something))
6070 something = TREE_TYPE (something);
6071 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
6072 return NULL_TREE;
6074 else
6075 something = TYPE_NAME (something);
6078 /* Don't do anything for arrays of primitive types */
6079 if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
6080 && JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
6081 return NULL_TREE;
6083 /* Something might be a WFL */
6084 if (TREE_CODE (something) == EXPR_WITH_FILE_LOCATION)
6085 something = EXPR_WFL_NODE (something);
6087 /* Otherwise, if something is not and IDENTIFIER_NODE, it can be a
6088 TYPE_DECL or a real TYPE. */
6089 else if (TREE_CODE (something) != IDENTIFIER_NODE)
6090 something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
6091 DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
6093 if (!(decl = resolve_no_layout (something, cl)))
6094 return NULL_TREE;
6096 /* Resolve and layout if necessary */
6097 decl_type = TREE_TYPE (decl);
6098 layout_class_methods (decl_type);
6099 /* Check methods */
6100 if (CLASS_FROM_SOURCE_P (decl_type))
6101 java_check_methods (decl);
6102 /* Layout the type if necessary */
6103 if (decl_type != current_class && !CLASS_LOADED_P (decl_type))
6104 safe_layout_class (decl_type);
6106 return decl;
6109 /* Resolve a class, returns its decl but doesn't perform any
6110 layout. The current parsing context is saved and restored */
6112 static tree
6113 resolve_no_layout (tree name, tree cl)
6115 tree ptr, decl;
6116 BUILD_PTR_FROM_NAME (ptr, name);
6117 java_parser_context_save_global ();
6118 decl = resolve_class (TYPE_NAME (current_class), ptr, NULL_TREE, cl);
6119 java_parser_context_restore_global ();
6121 return decl;
6124 /* Called when reporting errors. Skip the '[]'s in a complex array
6125 type description that failed to be resolved. purify_type_name can't
6126 use an identifier tree. */
6128 static const char *
6129 purify_type_name (const char *name)
6131 int len = strlen (name);
6132 int bracket_found;
6134 STRING_STRIP_BRACKETS (name, len, bracket_found);
6135 if (bracket_found)
6137 char *stripped_name = xmemdup (name, len, len+1);
6138 stripped_name [len] = '\0';
6139 return stripped_name;
6141 return name;
6144 /* The type CURRENT refers to can't be found. We print error messages. */
6146 static void
6147 complete_class_report_errors (jdep *dep)
6149 const char *name;
6151 if (!JDEP_WFL (dep))
6152 return;
6154 name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
6155 switch (JDEP_KIND (dep))
6157 case JDEP_SUPER:
6158 parse_error_context
6159 (JDEP_WFL (dep), "Superclass %qs of class %qs not found",
6160 purify_type_name (name),
6161 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6162 break;
6163 case JDEP_FIELD:
6164 parse_error_context
6165 (JDEP_WFL (dep), "Type %qs not found in declaration of field %qs",
6166 purify_type_name (name),
6167 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6168 break;
6169 case JDEP_METHOD: /* Covers arguments */
6170 parse_error_context
6171 (JDEP_WFL (dep), "Type %qs not found in the declaration of the argument %qs of method %qs",
6172 purify_type_name (name),
6173 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
6174 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
6175 break;
6176 case JDEP_METHOD_RETURN: /* Covers return type */
6177 parse_error_context
6178 (JDEP_WFL (dep), "Type %qs not found in the declaration of the return type of method %qs",
6179 purify_type_name (name),
6180 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
6181 break;
6182 case JDEP_INTERFACE:
6183 parse_error_context
6184 (JDEP_WFL (dep), "Superinterface %qs of %s %qs not found",
6185 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
6186 (CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
6187 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6188 break;
6189 case JDEP_VARIABLE:
6190 parse_error_context
6191 (JDEP_WFL (dep), "Type %qs not found in the declaration of the local variable %qs",
6192 purify_type_name (IDENTIFIER_POINTER
6193 (EXPR_WFL_NODE (JDEP_WFL (dep)))),
6194 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6195 break;
6196 case JDEP_EXCEPTION: /* As specified by `throws' */
6197 parse_error_context
6198 (JDEP_WFL (dep), "Class %qs not found in %<throws%>",
6199 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
6200 break;
6201 default:
6202 /* Fix for -Wall. Just break doing nothing. The error will be
6203 caught later */
6204 break;
6208 /* Return a static string containing the DECL prototype string. If
6209 DECL is a constructor, use the class name instead of the form
6210 <init> */
6212 static const char *
6213 get_printable_method_name (tree decl)
6215 const char *to_return;
6216 tree name = NULL_TREE;
6218 if (DECL_CONSTRUCTOR_P (decl))
6220 name = DECL_NAME (decl);
6221 DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
6224 to_return = lang_printable_name (decl, 2);
6225 if (DECL_CONSTRUCTOR_P (decl))
6226 DECL_NAME (decl) = name;
6228 return to_return;
6231 /* Track method being redefined inside the same class. As a side
6232 effect, set DECL_NAME to an IDENTIFIER (prior entering this
6233 function it's a FWL, so we can track errors more accurately.) */
6235 static int
6236 check_method_redefinition (tree class, tree method)
6238 tree redef, sig;
6240 /* There's no need to verify <clinit> and finit$ and instinit$ */
6241 if (DECL_CLINIT_P (method)
6242 || DECL_FINIT_P (method) || DECL_INSTINIT_P (method))
6243 return 0;
6245 sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
6246 for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
6248 if (redef == method)
6249 break;
6250 if (DECL_NAME (redef) == DECL_NAME (method)
6251 && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))
6252 && !DECL_ARTIFICIAL (method))
6254 parse_error_context
6255 (DECL_FUNCTION_WFL (method), "Duplicate %s declaration %qs",
6256 (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
6257 get_printable_method_name (redef));
6258 return 1;
6261 return 0;
6264 /* Return 1 if check went ok, 0 otherwise. */
6265 static int
6266 check_abstract_method_definitions (int do_interface, tree class_decl,
6267 tree type)
6269 tree class = TREE_TYPE (class_decl);
6270 tree method, end_type;
6271 int ok = 1;
6273 end_type = (do_interface ? object_type_node : type);
6274 for (method = TYPE_METHODS (type); method; method = TREE_CHAIN (method))
6276 tree other_super, other_method, method_sig, method_name;
6277 int found = 0;
6278 int end_type_reached = 0;
6280 if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
6281 continue;
6283 /* Now verify that somewhere in between TYPE and CLASS,
6284 abstract method METHOD gets a non abstract definition
6285 that is inherited by CLASS. */
6287 method_sig = build_java_signature (TREE_TYPE (method));
6288 method_name = DECL_NAME (method);
6289 if (TREE_CODE (method_name) == EXPR_WITH_FILE_LOCATION)
6290 method_name = EXPR_WFL_NODE (method_name);
6292 other_super = class;
6293 do {
6294 if (other_super == end_type)
6295 end_type_reached = 1;
6297 /* Method search */
6298 for (other_method = TYPE_METHODS (other_super); other_method;
6299 other_method = TREE_CHAIN (other_method))
6301 tree s = build_java_signature (TREE_TYPE (other_method));
6302 tree other_name = DECL_NAME (other_method);
6304 if (TREE_CODE (other_name) == EXPR_WITH_FILE_LOCATION)
6305 other_name = EXPR_WFL_NODE (other_name);
6306 if (!DECL_CLINIT_P (other_method)
6307 && !DECL_CONSTRUCTOR_P (other_method)
6308 && method_name == other_name
6309 && method_sig == s
6310 && !METHOD_ABSTRACT (other_method))
6312 found = 1;
6313 break;
6316 other_super = CLASSTYPE_SUPER (other_super);
6317 } while (!end_type_reached);
6319 /* Report that abstract METHOD didn't find an implementation
6320 that CLASS can use. */
6321 if (!found)
6323 char *t = xstrdup (lang_printable_name
6324 (TREE_TYPE (TREE_TYPE (method)), 0));
6325 tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
6327 parse_error_context
6328 (lookup_cl (class_decl),
6329 "Class %qs doesn't define the abstract method %<%s %s%> from %s %<%s%>. This method must be defined or %s %qs must be declared abstract",
6330 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6331 t, lang_printable_name (method, 2),
6332 (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))) ?
6333 "interface" : "class"),
6334 IDENTIFIER_POINTER (ccn),
6335 (CLASS_INTERFACE (class_decl) ? "interface" : "class"),
6336 IDENTIFIER_POINTER (DECL_NAME (class_decl)));
6337 ok = 0;
6338 free (t);
6342 if (ok && do_interface)
6344 /* Check for implemented interfaces. */
6345 int i;
6346 tree base_binfo;
6348 for (i = 1;
6349 ok && BINFO_BASE_ITERATE (TYPE_BINFO (type), i, base_binfo);
6350 i++)
6351 ok = check_abstract_method_definitions (1, class_decl,
6352 BINFO_TYPE (base_binfo));
6355 return ok;
6358 /* Check that CLASS_DECL somehow implements all inherited abstract
6359 methods. */
6361 static void
6362 java_check_abstract_method_definitions (tree class_decl)
6364 tree class = TREE_TYPE (class_decl);
6365 tree super, base_binfo;
6366 int i;
6368 if (CLASS_ABSTRACT (class_decl))
6369 return;
6371 /* Check for inherited types */
6372 super = class;
6373 do {
6374 super = CLASSTYPE_SUPER (super);
6375 check_abstract_method_definitions (0, class_decl, super);
6376 } while (super != object_type_node);
6378 /* Check for implemented interfaces. */
6379 for (i = 1; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
6380 check_abstract_method_definitions (1, class_decl, BINFO_TYPE (base_binfo));
6383 /* Check all the types method DECL uses and return 1 if all of them
6384 are now complete, 0 otherwise. This is used to check whether its
6385 safe to build a method signature or not. */
6387 static int
6388 check_method_types_complete (tree decl)
6390 tree type = TREE_TYPE (decl);
6391 tree args;
6393 if (!INCOMPLETE_TYPE_P (TREE_TYPE (type)))
6394 return 0;
6396 args = TYPE_ARG_TYPES (type);
6397 if (TREE_CODE (type) == METHOD_TYPE)
6398 args = TREE_CHAIN (args);
6399 for (; args != end_params_node; args = TREE_CHAIN (args))
6400 if (INCOMPLETE_TYPE_P (TREE_VALUE (args)))
6401 return 0;
6403 return 1;
6406 /* Visible interface to check methods contained in CLASS_DECL */
6408 void
6409 java_check_methods (tree class_decl)
6411 if (CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)))
6412 return;
6414 if (CLASS_INTERFACE (class_decl))
6415 java_check_abstract_methods (class_decl);
6416 else
6417 java_check_regular_methods (class_decl);
6419 CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)) = 1;
6422 /* Like not_accessible_p, but doesn't refer to the current class at
6423 all. */
6424 static bool
6425 hack_is_accessible_p (tree member, tree from_where)
6427 int flags = get_access_flags_from_decl (member);
6429 if (from_where == DECL_CONTEXT (member)
6430 || (flags & ACC_PUBLIC))
6431 return true;
6433 if ((flags & ACC_PROTECTED))
6435 if (inherits_from_p (from_where, DECL_CONTEXT (member)))
6436 return true;
6439 if ((flags & ACC_PRIVATE))
6440 return false;
6442 /* Package private, or protected. */
6443 return in_same_package (TYPE_NAME (from_where),
6444 TYPE_NAME (DECL_CONTEXT (member)));
6447 /* Check all the methods of CLASS_DECL. Methods are first completed
6448 then checked according to regular method existence rules. If no
6449 constructor for CLASS_DECL were encountered, then build its
6450 declaration. */
6451 static void
6452 java_check_regular_methods (tree class_decl)
6454 int saw_constructor = ANONYMOUS_CLASS_P (TREE_TYPE (class_decl));
6455 tree method;
6456 tree class = TREE_TYPE (class_decl);
6457 tree found = NULL_TREE;
6458 tree mthrows;
6460 /* It is not necessary to check methods defined in java.lang.Object */
6461 if (class == object_type_node)
6462 return;
6464 if (!TYPE_NVIRTUALS (class))
6465 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6467 /* Should take interfaces into account. FIXME */
6468 for (method = TYPE_METHODS (class); method; method = TREE_CHAIN (method))
6470 tree sig;
6471 tree method_wfl = DECL_FUNCTION_WFL (method);
6472 int aflags;
6474 /* Check for redefinitions */
6475 if (check_method_redefinition (class, method))
6476 continue;
6478 /* We verify things thrown by the method. They must inherit from
6479 java.lang.Throwable. */
6480 for (mthrows = DECL_FUNCTION_THROWS (method);
6481 mthrows; mthrows = TREE_CHAIN (mthrows))
6483 if (!inherits_from_p (TREE_VALUE (mthrows), throwable_type_node))
6484 parse_error_context
6485 (TREE_PURPOSE (mthrows), "Class %qs in %<throws%> clause must be a subclass of class %<java.lang.Throwable%>",
6486 IDENTIFIER_POINTER
6487 (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))));
6490 /* If we see one constructor a mark so we don't generate the
6491 default one. Also skip other verifications: constructors
6492 can't be inherited hence hidden or overridden. */
6493 if (DECL_CONSTRUCTOR_P (method))
6495 saw_constructor = 1;
6496 continue;
6499 sig = build_java_argument_signature (TREE_TYPE (method));
6500 found = lookup_argument_method_generic (class, DECL_NAME (method), sig,
6501 SEARCH_SUPER | SEARCH_INTERFACE);
6503 /* Inner class can't declare static methods */
6504 if (METHOD_STATIC (method) && !TOPLEVEL_CLASS_DECL_P (class_decl))
6506 char *t = xstrdup (lang_printable_name (class, 0));
6507 parse_error_context
6508 (method_wfl, "Method %qs can't be static in inner class %qs. Only members of interfaces and top-level classes can be static",
6509 lang_printable_name (method, 2), t);
6510 free (t);
6513 /* Nothing overrides or it's a private method. */
6514 if (!found)
6515 continue;
6516 if (METHOD_PRIVATE (found))
6518 found = NULL_TREE;
6519 continue;
6522 /* If `found' is declared in an interface, make sure the
6523 modifier matches. */
6524 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6525 && clinit_identifier_node != DECL_NAME (found)
6526 && !METHOD_PUBLIC (method))
6528 tree found_decl = TYPE_NAME (DECL_CONTEXT (found));
6529 parse_error_context (method_wfl, "Class %qs must override %qs with a public method in order to implement interface %qs",
6530 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6531 lang_printable_name (found, 0),
6532 IDENTIFIER_POINTER (DECL_NAME (found_decl)));
6535 /* Can't override a method with the same name and different return
6536 types. */
6537 if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
6539 char *t = xstrdup
6540 (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 2));
6541 parse_error_context
6542 (method_wfl,
6543 "Method %qs was defined with return type %qs in class %qs",
6544 lang_printable_name (found, 2), t,
6545 IDENTIFIER_POINTER
6546 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6547 free (t);
6550 aflags = get_access_flags_from_decl (found);
6552 /* Can't override final. Can't override static. */
6553 if (METHOD_FINAL (found) || METHOD_STATIC (found))
6555 /* Static *can* override static */
6556 if (METHOD_STATIC (found) && METHOD_STATIC (method))
6557 continue;
6558 parse_error_context
6559 (method_wfl,
6560 "%s methods can't be overridden. Method %qs is %s in class %qs",
6561 (METHOD_FINAL (found) ? "Final" : "Static"),
6562 lang_printable_name (found, 2),
6563 (METHOD_FINAL (found) ? "final" : "static"),
6564 IDENTIFIER_POINTER
6565 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6566 continue;
6569 /* Static method can't override instance method. */
6570 if (METHOD_STATIC (method))
6572 parse_error_context
6573 (method_wfl,
6574 "Instance methods can't be overridden by a static method. Method %qs is an instance method in class %qs",
6575 lang_printable_name (found, 2),
6576 IDENTIFIER_POINTER
6577 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6578 continue;
6581 /* - Overriding/hiding public must be public
6582 - Overriding/hiding protected must be protected or public
6583 - If the overridden or hidden method has default (package)
6584 access, then the overriding or hiding method must not be
6585 private; otherwise, a compile-time error occurs. If
6586 `found' belongs to an interface, things have been already
6587 taken care of. */
6588 if (!CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6589 && ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
6590 || (METHOD_PROTECTED (found)
6591 && !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
6592 || (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
6593 && METHOD_PRIVATE (method))))
6595 parse_error_context
6596 (method_wfl,
6597 "Methods can't be overridden to be more private. Method %qs is not %s in class %qs", lang_printable_name (method, 2),
6598 (METHOD_PUBLIC (method) ? "public" :
6599 (METHOD_PRIVATE (method) ? "private" : "protected")),
6600 IDENTIFIER_POINTER (DECL_NAME
6601 (TYPE_NAME (DECL_CONTEXT (found)))));
6602 continue;
6605 /* Check this method against all the other implementations it
6606 overrides. Here we only check the class hierarchy; the rest
6607 of the checking is done later. If this method is just a
6608 Miranda method, we can skip the check. */
6609 if (! METHOD_INVISIBLE (method))
6610 check_concrete_throws_clauses (class, method, DECL_NAME (method), sig);
6613 /* The above throws clause check only looked at superclasses. Now
6614 we must also make sure that all methods declared in interfaces
6615 have compatible throws clauses. FIXME: there are more efficient
6616 ways to organize this checking; we should implement one. */
6617 check_interface_throws_clauses (class, class);
6619 if (!TYPE_NVIRTUALS (class))
6620 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6622 /* Search for inherited abstract method not yet implemented in this
6623 class. */
6624 java_check_abstract_method_definitions (class_decl);
6626 if (!saw_constructor)
6627 abort ();
6630 /* Check to make sure that all the methods in all the interfaces
6631 implemented by CLASS_DECL are compatible with the concrete
6632 implementations available in CHECK_CLASS_DECL. */
6633 static void
6634 check_interface_throws_clauses (tree check_class_decl, tree class_decl)
6636 for (; class_decl != NULL_TREE; class_decl = CLASSTYPE_SUPER (class_decl))
6638 int i;
6640 if (! CLASS_LOADED_P (class_decl))
6642 if (CLASS_FROM_SOURCE_P (class_decl))
6643 safe_layout_class (class_decl);
6644 else
6645 load_class (class_decl, 1);
6648 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (class_decl)) - 1; i > 0; --i)
6650 tree interface
6651 = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (class_decl), i));
6652 tree iface_method;
6654 for (iface_method = TYPE_METHODS (interface);
6655 iface_method != NULL_TREE;
6656 iface_method = TREE_CHAIN (iface_method))
6658 tree sig, method;
6660 /* First look for a concrete method implemented or
6661 inherited by this class. No need to search
6662 interfaces here, since we're already looking through
6663 all of them. */
6664 sig = build_java_argument_signature (TREE_TYPE (iface_method));
6665 method
6666 = lookup_argument_method_generic (check_class_decl,
6667 DECL_NAME (iface_method),
6668 sig, SEARCH_VISIBLE);
6669 /* If we don't find an implementation, that is ok. Any
6670 potential errors from that are diagnosed elsewhere.
6671 Also, multiple inheritance with conflicting throws
6672 clauses is fine in the absence of a concrete
6673 implementation. */
6674 if (method != NULL_TREE && !METHOD_ABSTRACT (method)
6675 && !METHOD_INVISIBLE (iface_method))
6677 tree method_wfl = DECL_FUNCTION_WFL (method);
6678 check_throws_clauses (method, method_wfl, iface_method);
6682 /* Now check superinterfaces. */
6683 check_interface_throws_clauses (check_class_decl, interface);
6688 /* Check throws clauses of a method against the clauses of all the
6689 methods it overrides. We do this by searching up the class
6690 hierarchy, examining all matching accessible methods. */
6691 static void
6692 check_concrete_throws_clauses (tree class, tree self_method,
6693 tree name, tree signature)
6695 tree method = lookup_argument_method_generic (class, name, signature,
6696 SEARCH_SUPER | SEARCH_VISIBLE);
6697 while (method != NULL_TREE)
6699 if (! METHOD_INVISIBLE (method) && hack_is_accessible_p (method, class))
6700 check_throws_clauses (self_method, DECL_FUNCTION_WFL (self_method),
6701 method);
6703 method = lookup_argument_method_generic (DECL_CONTEXT (method),
6704 name, signature,
6705 SEARCH_SUPER | SEARCH_VISIBLE);
6709 /* Generate an error if the `throws' clause of METHOD (if any) is
6710 incompatible with the `throws' clause of FOUND (if any). */
6711 static void
6712 check_throws_clauses (tree method, tree method_wfl, tree found)
6714 tree mthrows;
6716 for (mthrows = DECL_FUNCTION_THROWS (method);
6717 mthrows; mthrows = TREE_CHAIN (mthrows))
6719 tree fthrows;
6721 /* We don't verify unchecked expressions */
6722 if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
6723 continue;
6724 /* Checked expression must be compatible */
6725 for (fthrows = DECL_FUNCTION_THROWS (found);
6726 fthrows; fthrows = TREE_CHAIN (fthrows))
6728 if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
6729 break;
6731 if (!fthrows)
6733 parse_error_context
6734 (method_wfl, "Invalid checked exception class %qs in %<throws%> clause. The exception must be a subclass of an exception thrown by %qs from class %qs",
6735 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
6736 lang_printable_name (found, 2),
6737 IDENTIFIER_POINTER
6738 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6743 /* Check abstract method of interface INTERFACE */
6744 static void
6745 java_check_abstract_methods (tree interface_decl)
6747 int i;
6748 tree method, found;
6749 tree interface = TREE_TYPE (interface_decl);
6750 tree base_binfo;
6752 for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
6754 /* 2- Check for double definition inside the defining interface */
6755 if (check_method_redefinition (interface, method))
6756 continue;
6758 /* 3- Overriding is OK as far as we preserve the return type. */
6759 found = lookup_java_interface_method2 (interface, method);
6760 if (found)
6762 char *t;
6763 t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 2));
6764 parse_error_context
6765 (DECL_FUNCTION_WFL (found),
6766 "Method %qs was defined with return type %qs in class %qs",
6767 lang_printable_name (found, 2), t,
6768 IDENTIFIER_POINTER
6769 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6770 free (t);
6771 continue;
6775 /* 4- Inherited methods can't differ by their returned types */
6776 for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (interface), i, base_binfo); i++)
6778 tree sub_interface_method, sub_interface;
6780 sub_interface = BINFO_TYPE (base_binfo);
6781 for (sub_interface_method = TYPE_METHODS (sub_interface);
6782 sub_interface_method;
6783 sub_interface_method = TREE_CHAIN (sub_interface_method))
6785 found = lookup_java_interface_method2 (interface,
6786 sub_interface_method);
6787 if (found && (found != sub_interface_method))
6789 parse_error_context
6790 (lookup_cl (sub_interface_method),
6791 "Interface %qs inherits method %qs from interface %qs. This method is redefined with a different return type in interface %qs",
6792 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
6793 lang_printable_name (found, 2),
6794 IDENTIFIER_POINTER
6795 (DECL_NAME (TYPE_NAME
6796 (DECL_CONTEXT (sub_interface_method)))),
6797 IDENTIFIER_POINTER
6798 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6804 /* Lookup methods in interfaces using their name and partial
6805 signature. Return a matching method only if their types differ. */
6807 static tree
6808 lookup_java_interface_method2 (tree class, tree method_decl)
6810 int i;
6811 tree base_binfo;
6812 tree to_return;
6814 for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
6816 if ((BINFO_TYPE (base_binfo) != object_type_node)
6817 && (to_return =
6818 lookup_java_method2 (BINFO_TYPE (base_binfo), method_decl, 1)))
6819 return to_return;
6821 for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
6823 to_return = lookup_java_interface_method2
6824 (BINFO_TYPE (base_binfo), method_decl);
6825 if (to_return)
6826 return to_return;
6829 return NULL_TREE;
6832 /* Lookup method using their name and partial signature. Return a
6833 matching method only if their types differ. */
6835 static tree
6836 lookup_java_method2 (tree clas, tree method_decl, int do_interface)
6838 tree method, method_signature, method_name, method_type, name;
6840 method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
6841 name = DECL_NAME (method_decl);
6842 method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6843 EXPR_WFL_NODE (name) : name);
6844 method_type = TREE_TYPE (TREE_TYPE (method_decl));
6846 while (clas != NULL_TREE)
6848 for (method = TYPE_METHODS (clas);
6849 method != NULL_TREE; method = TREE_CHAIN (method))
6851 tree method_sig = build_java_argument_signature (TREE_TYPE (method));
6852 tree name = DECL_NAME (method);
6853 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6854 EXPR_WFL_NODE (name) : name) == method_name
6855 && method_sig == method_signature
6856 && TREE_TYPE (TREE_TYPE (method)) != method_type)
6857 return method;
6859 clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
6861 return NULL_TREE;
6864 /* Return the line that matches DECL line number, and try its best to
6865 position the column number. Used during error reports.
6866 FUTURE/FIXME: return source_location instead of node. */
6868 static GTY(()) tree cl_v;
6869 static tree
6870 lookup_cl (tree decl)
6872 #ifndef USE_MAPPED_LOCATION
6873 char *line, *found;
6874 #endif
6876 if (!decl)
6877 return NULL_TREE;
6879 if (cl_v == NULL_TREE)
6881 cl_v = build_unknown_wfl (NULL_TREE);
6884 #ifdef USE_MAPPED_LOCATION
6885 SET_EXPR_LOCATION (cl_v, DECL_SOURCE_LOCATION (decl));
6886 #else
6887 EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
6888 EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE (decl), -1);
6890 line = java_get_line_col (EXPR_WFL_FILENAME (cl_v),
6891 EXPR_WFL_LINENO (cl_v), EXPR_WFL_COLNO (cl_v));
6893 found = strstr ((const char *)line,
6894 (const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
6895 if (found)
6896 EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
6897 #endif
6899 return cl_v;
6902 /* Look for a simple name in the single-type import list */
6904 static tree
6905 find_name_in_single_imports (tree name)
6907 tree node;
6909 for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
6910 if (TREE_VALUE (node) == name)
6911 return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
6913 return NULL_TREE;
6916 /* Process all single-type import. */
6918 static int
6919 process_imports (void)
6921 tree import;
6922 int error_found;
6924 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
6926 tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
6927 char *original_name;
6929 /* Don't load twice something already defined. */
6930 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6931 continue;
6933 original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
6934 IDENTIFIER_LENGTH (to_be_found),
6935 IDENTIFIER_LENGTH (to_be_found) + 1);
6937 while (1)
6939 tree left;
6941 QUALIFIED_P (to_be_found) = 1;
6942 load_class (to_be_found, 0);
6943 error_found =
6944 check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true, NULL_TREE);
6946 /* We found it, we can bail out */
6947 if (IDENTIFIER_CLASS_VALUE (to_be_found))
6949 check_deprecation (TREE_PURPOSE (import),
6950 IDENTIFIER_CLASS_VALUE (to_be_found));
6951 break;
6954 /* We haven't found it. Maybe we're trying to access an
6955 inner class. The only way for us to know is to try again
6956 after having dropped a qualifier. If we can't break it further,
6957 we have an error. */
6958 if (split_qualified_name (&left, NULL, to_be_found))
6959 break;
6961 to_be_found = left;
6963 if (!IDENTIFIER_CLASS_VALUE (to_be_found))
6965 parse_error_context (TREE_PURPOSE (import),
6966 "Class or interface %qs not found in import",
6967 original_name);
6968 error_found = 1;
6971 free (original_name);
6972 if (error_found)
6973 return 1;
6975 return 0;
6978 /* Possibly find and mark a class imported by a single-type import
6979 statement. */
6981 static void
6982 find_in_imports (tree enclosing_type, tree class_type)
6984 tree import;
6985 if (enclosing_type && TYPE_IMPORT_LIST (enclosing_type))
6986 import = TYPE_IMPORT_LIST (enclosing_type);
6987 else
6988 import = ctxp->import_list;
6990 while (import)
6992 if (TREE_VALUE (import) == TYPE_NAME (class_type))
6994 TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
6995 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
6996 return;
6998 import = TREE_CHAIN (import);
7002 static int
7003 note_possible_classname (const char *name, int len)
7005 tree node;
7006 if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
7007 len = len - 5;
7008 else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
7009 len = len - 6;
7010 else
7011 return 0;
7012 node = ident_subst (name, len, "", '/', '.', "");
7013 IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
7014 QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
7015 return 1;
7018 /* Read a import directory, gathering potential match for further type
7019 references. Indifferently reads a filesystem or a ZIP archive
7020 directory. */
7022 static void
7023 read_import_dir (tree wfl)
7025 tree package_id = EXPR_WFL_NODE (wfl);
7026 const char *package_name = IDENTIFIER_POINTER (package_id);
7027 int package_length = IDENTIFIER_LENGTH (package_id);
7028 DIR *dirp = NULL;
7029 JCF *saved_jcf = current_jcf;
7031 int found = 0;
7032 int k;
7033 void *entry;
7034 struct buffer filename[1];
7036 if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
7037 return;
7038 IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
7040 BUFFER_INIT (filename);
7041 buffer_grow (filename, package_length + 100);
7043 for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
7045 const char *entry_name = jcf_path_name (entry);
7046 int entry_length = strlen (entry_name);
7047 if (jcf_path_is_zipfile (entry))
7049 ZipFile *zipf;
7050 buffer_grow (filename, entry_length);
7051 memcpy (filename->data, entry_name, entry_length - 1);
7052 filename->data[entry_length-1] = '\0';
7053 zipf = opendir_in_zip ((const char *) filename->data, jcf_path_is_system (entry));
7054 if (zipf == NULL)
7055 error ("malformed .zip archive in CLASSPATH: %s", entry_name);
7056 else
7058 ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
7059 BUFFER_RESET (filename);
7060 for (k = 0; k < package_length; k++)
7062 char ch = package_name[k];
7063 *filename->ptr++ = ch == '.' ? '/' : ch;
7065 *filename->ptr++ = '/';
7067 for (k = 0; k < zipf->count; k++, zipd = ZIPDIR_NEXT (zipd))
7069 const char *current_entry = ZIPDIR_FILENAME (zipd);
7070 int current_entry_len = zipd->filename_length;
7072 if (current_entry_len >= BUFFER_LENGTH (filename)
7073 && strncmp ((const char *) filename->data, current_entry,
7074 BUFFER_LENGTH (filename)) != 0)
7075 continue;
7076 found |= note_possible_classname (current_entry,
7077 current_entry_len);
7081 else
7083 BUFFER_RESET (filename);
7084 buffer_grow (filename, entry_length + package_length + 4);
7085 strcpy ((char *) filename->data, entry_name);
7086 filename->ptr = filename->data + entry_length;
7087 for (k = 0; k < package_length; k++)
7089 char ch = package_name[k];
7090 *filename->ptr++ = ch == '.' ? '/' : ch;
7092 *filename->ptr = '\0';
7094 dirp = opendir ((const char *) filename->data);
7095 if (dirp == NULL)
7096 continue;
7097 *filename->ptr++ = '/';
7098 for (;;)
7100 int len;
7101 const char *d_name;
7102 struct dirent *direntp = readdir (dirp);
7103 if (!direntp)
7104 break;
7105 d_name = direntp->d_name;
7106 len = strlen (direntp->d_name);
7107 buffer_grow (filename, len+1);
7108 strcpy ((char *) filename->ptr, d_name);
7109 found |= note_possible_classname ((const char *) filename->data + entry_length,
7110 package_length+len+1);
7112 if (dirp)
7113 closedir (dirp);
7117 free (filename->data);
7119 /* Here we should have a unified way of retrieving an entry, to be
7120 indexed. */
7121 if (!found)
7123 static int first = 1;
7124 if (first)
7126 error ("Can't find default package %qs. Check the CLASSPATH environment variable and the access to the archives", package_name);
7127 java_error_count++;
7128 first = 0;
7130 else
7131 parse_error_context (wfl, "Package %qs not found in import",
7132 package_name);
7133 current_jcf = saved_jcf;
7134 return;
7136 current_jcf = saved_jcf;
7139 /* Possibly find a type in the import on demands specified
7140 types. Returns 1 if an error occurred, 0 otherwise. Run through the
7141 entire list, to detected potential double definitions. */
7143 static int
7144 find_in_imports_on_demand (tree enclosing_type, tree class_type)
7146 tree class_type_name = TYPE_NAME (class_type);
7147 tree cl = NULL_TREE;
7148 int seen_once = -1; /* -1 when not set, 1 if seen once, >1 otherwise. */
7149 int to_return = -1; /* -1 when not set, 0 or 1 otherwise */
7150 tree node;
7151 tree import;
7153 if (enclosing_type && TYPE_IMPORT_DEMAND_LIST (enclosing_type))
7154 import = TYPE_IMPORT_DEMAND_LIST (enclosing_type);
7155 else
7156 import = ctxp->import_demand_list;
7158 for (; import; import = TREE_CHAIN (import))
7160 location_t saved_location = input_location;
7161 int access_check;
7162 const char *id_name;
7163 tree decl, type_name_copy;
7165 obstack_grow (&temporary_obstack,
7166 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
7167 IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
7168 obstack_1grow (&temporary_obstack, '.');
7169 obstack_grow0 (&temporary_obstack,
7170 IDENTIFIER_POINTER (class_type_name),
7171 IDENTIFIER_LENGTH (class_type_name));
7172 id_name = obstack_finish (&temporary_obstack);
7174 if (! (node = maybe_get_identifier (id_name)))
7175 continue;
7177 /* Setup input_line so that it refers to the line of the import (in
7178 case we parse a class file and encounter errors */
7179 #ifdef USE_MAPPED_LOCATION
7180 input_location = EXPR_LOCATION (TREE_PURPOSE (import));
7181 #else
7182 input_line = EXPR_WFL_LINENO (TREE_PURPOSE (import));
7183 #endif
7185 type_name_copy = TYPE_NAME (class_type);
7186 TYPE_NAME (class_type) = node;
7187 QUALIFIED_P (node) = 1;
7188 decl = IDENTIFIER_CLASS_VALUE (node);
7189 access_check = -1;
7190 /* If there is no DECL set for the class or if the class isn't
7191 loaded and not seen in source yet, then load */
7192 if (!decl || ! CLASS_LOADED_P (TREE_TYPE (decl)))
7194 load_class (node, 0);
7195 decl = IDENTIFIER_CLASS_VALUE (node);
7197 if (decl && ! INNER_CLASS_P (TREE_TYPE (decl)))
7198 access_check = check_pkg_class_access (node, TREE_PURPOSE (import),
7199 false, NULL_TREE);
7200 else
7201 /* 6.6.1: Inner classes are subject to member access rules. */
7202 access_check = 0;
7204 input_location = saved_location;
7206 /* If the loaded class is not accessible or couldn't be loaded,
7207 we restore the original TYPE_NAME and process the next
7208 import. */
7209 if (access_check || !decl)
7211 TYPE_NAME (class_type) = type_name_copy;
7212 continue;
7215 /* If the loaded class is accessible, we keep a tab on it to
7216 detect and report multiple inclusions. */
7217 if (IS_A_CLASSFILE_NAME (node))
7219 if (seen_once < 0)
7221 cl = TREE_PURPOSE (import);
7222 seen_once = 1;
7224 else if (seen_once >= 0)
7226 tree location = (cl ? cl : TREE_PURPOSE (import));
7227 tree package = (cl ? EXPR_WFL_NODE (cl) :
7228 EXPR_WFL_NODE (TREE_PURPOSE (import)));
7229 seen_once++;
7230 parse_error_context
7231 (location,
7232 "Type %qs also potentially defined in package %qs",
7233 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
7234 IDENTIFIER_POINTER (package));
7237 to_return = access_check;
7240 if (seen_once == 1)
7241 return to_return;
7242 else
7243 return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
7246 static tree
7247 resolve_package (tree pkg, tree *next, tree *type_name)
7249 tree current;
7250 tree decl = NULL_TREE;
7251 *type_name = NULL_TREE;
7253 /* The trick is to determine when the package name stops and were
7254 the name of something contained in the package starts. Then we
7255 return a fully qualified name of what we want to get. */
7257 *next = EXPR_WFL_QUALIFICATION (pkg);
7259 /* Try to progressively construct a type name */
7260 if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION)
7261 for (current = EXPR_WFL_QUALIFICATION (pkg);
7262 current; current = TREE_CHAIN (current))
7264 /* If we don't have what we're expecting, exit now. TYPE_NAME
7265 will be null and the error caught later. */
7266 if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION)
7267 break;
7268 *type_name =
7269 merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current)));
7270 if ((decl = resolve_no_layout (*type_name, NULL_TREE)))
7272 /* resolve_package should be used in a loop, hence we
7273 point at this one to naturally process the next one at
7274 the next iteration. */
7275 *next = current;
7276 break;
7279 return decl;
7282 /* Check accessibility of inner class DECL, from the context ENCLOSING_DECL,
7283 according to member access rules. */
7285 static bool
7286 inner_class_accessible (tree decl, tree enclosing_decl)
7288 tree enclosing_decl_type;
7290 enclosing_decl_type = TREE_TYPE (enclosing_decl);
7292 if (CLASS_PRIVATE (decl))
7294 /* Access is permitted only within the body of the top-level
7295 class in which DECL is declared. */
7296 tree top_level = decl;
7297 while (DECL_CONTEXT (top_level))
7298 top_level = DECL_CONTEXT (top_level);
7299 while (DECL_CONTEXT (enclosing_decl))
7300 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7301 if (top_level == enclosing_decl)
7302 return true;
7304 else if (CLASS_PROTECTED (decl))
7306 tree decl_context;
7307 /* Access is permitted from within the same package... */
7308 if (in_same_package (decl, enclosing_decl))
7309 return true;
7311 /* ... or from within the body of a subtype of the context in which
7312 DECL is declared. */
7313 decl_context = DECL_CONTEXT (decl);
7314 while (enclosing_decl)
7316 if (CLASS_INTERFACE (decl))
7318 if (interface_of_p (TREE_TYPE (decl_context),
7319 enclosing_decl_type))
7320 return true;
7322 else
7324 /* Eww. The order of the arguments is different!! */
7325 if (inherits_from_p (enclosing_decl_type,
7326 TREE_TYPE (decl_context)))
7327 return true;
7329 enclosing_decl = DECL_CONTEXT (enclosing_decl);
7332 else if (! CLASS_PUBLIC (decl))
7334 /* Access is permitted only from within the same package as DECL. */
7335 if (in_same_package (decl, enclosing_decl))
7336 return true;
7338 else
7339 /* Class is public. */
7340 return true;
7342 return false;
7345 /* Check accessibility of inner classes according to member access rules.
7346 DECL is the inner class, ENCLOSING_DECL is the class from which the
7347 access is being attempted. */
7349 static void
7350 check_inner_class_access (tree decl, tree enclosing_decl, tree cl)
7352 const char *access;
7354 /* We don't issue an error message when CL is null. CL can be null
7355 as a result of processing a JDEP crafted by source_start_java_method
7356 for the purpose of patching its parm decl. But the error would
7357 have been already trapped when fixing the method's signature.
7358 DECL can also be NULL in case of earlier errors. */
7359 if (!decl || !cl)
7360 return;
7362 if (inner_class_accessible (decl, enclosing_decl))
7363 return;
7365 if (CLASS_PRIVATE (decl))
7366 access = "private";
7367 else if (CLASS_PROTECTED (decl))
7368 access = "protected";
7369 else
7370 access = "non-public";
7372 parse_error_context (cl, "Nested %s %s is %s; cannot be accessed from here",
7373 (CLASS_INTERFACE (decl) ? "interface" : "class"),
7374 lang_printable_name (decl, 2), access);
7377 /* Accessibility check for top-level classes. If CLASS_NAME is in a
7378 foreign package, it must be PUBLIC. Return 0 if no access
7379 violations were found, 1 otherwise. If VERBOSE is true and an error
7380 was found, it is reported and accounted for. If CL is NULL then
7381 look it up with THIS_DECL. */
7383 static int
7384 check_pkg_class_access (tree class_name, tree cl, bool verbose, tree this_decl)
7386 tree type;
7388 if (!IDENTIFIER_CLASS_VALUE (class_name))
7389 return 0;
7391 if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
7392 return 0;
7394 if (!CLASS_PUBLIC (TYPE_NAME (type)))
7396 /* Access to a private class within the same package is
7397 allowed. */
7398 tree l, r;
7399 split_qualified_name (&l, &r, class_name);
7400 if (!QUALIFIED_P (class_name) && !ctxp->package)
7401 /* Both in the empty package. */
7402 return 0;
7403 if (l == ctxp->package)
7404 /* Both in the same package. */
7405 return 0;
7407 if (verbose)
7408 parse_error_context
7409 (cl == NULL ? lookup_cl (this_decl): cl,
7410 "Can't access %s %qs. Only public classes and interfaces in other packages can be accessed",
7411 (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
7412 IDENTIFIER_POINTER (class_name));
7413 return 1;
7415 return 0;
7418 /* Local variable declaration. */
7420 static void
7421 declare_local_variables (int modifier, tree type, tree vlist)
7423 tree decl, current, saved_type;
7424 tree type_wfl = NULL_TREE;
7425 int must_chain = 0;
7426 int final_p = 0;
7428 /* Push a new block if statements were seen between the last time we
7429 pushed a block and now. Keep a count of blocks to close */
7430 if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
7432 tree b = enter_block ();
7433 BLOCK_IS_IMPLICIT (b) = 1;
7436 if (modifier)
7438 size_t i;
7439 for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)
7440 if (1 << i & modifier)
7441 break;
7442 if (modifier == ACC_FINAL)
7443 final_p = 1;
7444 else
7446 parse_error_context
7447 (ctxp->modifier_ctx [i],
7448 "Only %<final%> is allowed as a local variables modifier");
7449 return;
7453 /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
7454 hold the TYPE value if a new incomplete has to be created (as
7455 opposed to being found already existing and reused). */
7456 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
7458 /* If TYPE is fully resolved and we don't have a reference, make one */
7459 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7461 /* Go through all the declared variables */
7462 for (current = vlist, saved_type = type; current;
7463 current = TREE_CHAIN (current), type = saved_type)
7465 tree other, real_type;
7466 tree wfl = TREE_PURPOSE (current);
7467 tree name = EXPR_WFL_NODE (wfl);
7468 tree init = TREE_VALUE (current);
7470 /* Process NAME, as it may specify extra dimension(s) for it */
7471 type = build_array_from_name (type, type_wfl, name, &name);
7473 /* Variable redefinition check */
7474 if ((other = lookup_name_in_blocks (name)))
7476 variable_redefinition_error (wfl, name, TREE_TYPE (other),
7477 DECL_SOURCE_LINE (other));
7478 continue;
7481 /* Type adjustment. We may have just readjusted TYPE because
7482 the variable specified more dimensions. Make sure we have
7483 a reference if we can and don't have one already. */
7484 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7486 real_type = GET_REAL_TYPE (type);
7487 /* Never layout this decl. This will be done when its scope
7488 will be entered */
7489 decl = build_decl (VAR_DECL, name, real_type);
7490 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
7491 DECL_FINAL (decl) = final_p;
7492 BLOCK_CHAIN_DECL (decl);
7494 /* Don't try to use an INIT statement when an error was found */
7495 if (init && java_error_count)
7496 init = NULL_TREE;
7498 /* Remember it if this is an initialized-upon-declaration final
7499 variable. */
7500 if (init && final_p)
7502 DECL_LOCAL_FINAL_IUD (decl) = 1;
7505 /* Add the initialization function to the current function's code */
7506 if (init)
7508 /* Name might have been readjusted */
7509 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
7510 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
7511 java_method_add_stmt (current_function_decl,
7512 build_debugable_stmt (EXPR_WFL_LINECOL (init),
7513 init));
7516 /* Setup dependency the type of the decl */
7517 if (must_chain)
7519 jdep *dep;
7520 register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
7521 dep = CLASSD_LAST (ctxp->classd_list);
7522 JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
7525 SOURCE_FRONTEND_DEBUG (("Defined locals"));
7528 /* Called during parsing. Build decls from argument list. */
7530 static void
7531 source_start_java_method (tree fndecl)
7533 tree tem;
7534 tree parm_decl;
7535 int i;
7537 if (!fndecl)
7538 return;
7540 current_function_decl = fndecl;
7542 /* New scope for the function */
7543 enter_block ();
7544 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
7545 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
7547 tree type = TREE_VALUE (tem);
7548 tree name = TREE_PURPOSE (tem);
7550 /* If type is incomplete. Create an incomplete decl and ask for
7551 the decl to be patched later */
7552 if (INCOMPLETE_TYPE_P (type))
7554 jdep *jdep;
7555 tree real_type = GET_REAL_TYPE (type);
7556 parm_decl = build_decl (PARM_DECL, name, real_type);
7557 type = obtain_incomplete_type (type);
7558 register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
7559 jdep = CLASSD_LAST (ctxp->classd_list);
7560 JDEP_MISC (jdep) = name;
7561 JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
7563 else
7564 parm_decl = build_decl (PARM_DECL, name, type);
7566 /* Remember if a local variable was declared final (via its
7567 TREE_LIST of type/name.) Set DECL_FINAL accordingly. */
7568 if (ARG_FINAL_P (tem))
7570 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl);
7571 DECL_FINAL (parm_decl) = 1;
7574 if (name == this_identifier_node)
7575 DECL_ARTIFICIAL (parm_decl) = 1;
7577 BLOCK_CHAIN_DECL (parm_decl);
7579 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7580 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
7581 nreverse (tem);
7582 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
7583 DECL_MAX_LOCALS (current_function_decl) = i;
7586 /* Called during parsing. Creates an artificial method declaration. */
7588 static tree
7589 create_artificial_method (tree class, int flags, tree type,
7590 tree name, tree args)
7592 tree mdecl;
7593 location_t save_location = input_location;
7595 input_location = DECL_SOURCE_LOCATION (TYPE_NAME (class));
7596 mdecl = make_node (FUNCTION_TYPE);
7597 TREE_TYPE (mdecl) = type;
7598 TYPE_ARG_TYPES (mdecl) = args;
7599 /* We used to compute the signature of MDECL here and then use
7600 add_method(), but that failed because our caller might modify
7601 the type of the returned method, which trashes the cache in
7602 get_type_from_signature(). */
7603 mdecl = add_method_1 (class, flags, name, mdecl);
7604 input_location = save_location;
7605 DECL_ARTIFICIAL (mdecl) = 1;
7606 return mdecl;
7609 /* Starts the body if an artificial method. */
7611 static void
7612 start_artificial_method_body (tree mdecl)
7614 #ifdef USE_MAPPED_LOCATION
7615 DECL_SOURCE_LOCATION (mdecl) = ctxp->file_start_location;
7616 DECL_FUNCTION_LAST_LINE (mdecl) = ctxp->file_start_location;
7617 #else
7618 DECL_SOURCE_LINE (mdecl) = 1;
7619 DECL_FUNCTION_LAST_LINE (mdecl) = 1;
7620 #endif
7621 source_start_java_method (mdecl);
7622 enter_block ();
7625 static void
7626 end_artificial_method_body (tree mdecl)
7628 /* exit_block modifies DECL_FUNCTION_BODY (current_function_decl).
7629 It has to be evaluated first. (if mdecl is current_function_decl,
7630 we have an undefined behavior if no temporary variable is used.) */
7631 tree b = exit_block ();
7632 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = b;
7633 exit_block ();
7636 /* Dump a tree of some kind. This is a convenience wrapper for the
7637 dump_* functions in tree-dump.c. */
7638 static void
7639 dump_java_tree (enum tree_dump_index phase, tree t)
7641 FILE *stream;
7642 int flags;
7644 stream = dump_begin (phase, &flags);
7645 flags |= TDF_SLIM;
7646 if (stream)
7648 dump_node (t, flags, stream);
7649 dump_end (phase, stream);
7653 /* Terminate a function and expand its body. */
7655 static void
7656 source_end_java_method (void)
7658 tree fndecl = current_function_decl;
7660 if (!fndecl)
7661 return;
7663 java_parser_context_save_global ();
7664 #ifdef USE_MAPPED_LOCATION
7665 input_location = ctxp->last_ccb_indent1;
7666 #else
7667 input_line = ctxp->last_ccb_indent1;
7668 #endif
7670 /* Turn function bodies with only a NOP expr null, so they don't get
7671 generated at all and we won't get warnings when using the -W
7672 -Wall flags. */
7673 if (IS_EMPTY_STMT (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))))
7674 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
7676 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))
7677 && ! flag_emit_class_files)
7678 finish_method (fndecl);
7680 current_function_decl = NULL_TREE;
7681 java_parser_context_restore_global ();
7682 current_function_decl = NULL_TREE;
7685 /* Record EXPR in the current function block. Complements compound
7686 expression second operand if necessary. */
7688 tree
7689 java_method_add_stmt (tree fndecl, tree expr)
7691 if (!GET_CURRENT_BLOCK (fndecl))
7692 return NULL_TREE;
7693 return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
7696 static tree
7697 add_stmt_to_block (tree b, tree type, tree stmt)
7699 tree body = BLOCK_EXPR_BODY (b), c;
7701 if (java_error_count)
7702 return body;
7704 if ((c = add_stmt_to_compound (body, type, stmt)) == body)
7705 return body;
7707 BLOCK_EXPR_BODY (b) = c;
7708 TREE_SIDE_EFFECTS (c) = 1;
7709 return c;
7712 /* Lays out the methods for the classes seen so far. */
7714 void
7715 java_layout_seen_class_methods (void)
7717 tree previous_list = all_class_list;
7718 tree end = NULL_TREE;
7719 tree current;
7721 while (1)
7723 for (current = previous_list;
7724 current != end; current = TREE_CHAIN (current))
7726 tree decl = TREE_VALUE (current);
7727 tree cls = TREE_TYPE (decl);
7729 input_location = DECL_SOURCE_LOCATION (decl);
7731 if (! CLASS_LOADED_P (cls))
7732 load_class (cls, 0);
7734 layout_class_methods (cls);
7737 /* Note that new classes might have been added while laying out
7738 methods, changing the value of all_class_list. */
7740 if (previous_list != all_class_list)
7742 end = previous_list;
7743 previous_list = all_class_list;
7745 else
7746 break;
7750 static GTY(()) tree stop_reordering;
7751 void
7752 java_reorder_fields (void)
7754 tree current;
7756 for (current = gclass_list; current; current = TREE_CHAIN (current))
7758 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7760 if (current_class == stop_reordering)
7761 break;
7763 /* Reverse the fields, but leave the dummy field in front.
7764 Fields are already ordered for Object and Class */
7765 if (TYPE_FIELDS (current_class) && current_class != object_type_node
7766 && current_class != class_type_node)
7768 /* If the dummy field is there, reverse the right fields and
7769 just layout the type for proper fields offset */
7770 if (!DECL_NAME (TYPE_FIELDS (current_class)))
7772 tree fields = TYPE_FIELDS (current_class);
7773 TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
7774 TYPE_SIZE (current_class) = NULL_TREE;
7776 /* We don't have a dummy field, we need to layout the class,
7777 after having reversed the fields */
7778 else
7780 TYPE_FIELDS (current_class) =
7781 nreverse (TYPE_FIELDS (current_class));
7782 TYPE_SIZE (current_class) = NULL_TREE;
7786 /* There are cases were gclass_list will be empty. */
7787 if (gclass_list)
7788 stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list));
7791 /* Layout the methods of all classes loaded in one way or another.
7792 Check methods of source parsed classes. Then reorder the
7793 fields and layout the classes or the type of all source parsed
7794 classes */
7796 void
7797 java_layout_classes (void)
7799 tree current;
7800 int save_error_count = java_error_count;
7802 /* Layout the methods of all classes seen so far */
7803 java_layout_seen_class_methods ();
7804 java_parse_abort_on_error ();
7805 all_class_list = NULL_TREE;
7807 /* Then check the methods of all parsed classes */
7808 for (current = gclass_list; current; current = TREE_CHAIN (current))
7809 if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
7810 java_check_methods (TREE_VALUE (current));
7811 java_parse_abort_on_error ();
7813 for (current = gclass_list; current; current = TREE_CHAIN (current))
7815 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7816 layout_class (current_class);
7818 /* Error reported by the caller */
7819 if (java_error_count)
7820 return;
7823 /* We might have reloaded classes durign the process of laying out
7824 classes for code generation. We must layout the methods of those
7825 late additions, as constructor checks might use them */
7826 java_layout_seen_class_methods ();
7827 java_parse_abort_on_error ();
7830 /* Expand methods in the current set of classes remembered for
7831 generation. */
7833 static void
7834 java_complete_expand_classes (void)
7836 tree current;
7838 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
7839 if (!INNER_CLASS_DECL_P (current))
7840 java_complete_expand_class (current);
7843 /* Expand the methods found in OUTER, starting first by OUTER's inner
7844 classes, if any. */
7846 static void
7847 java_complete_expand_class (tree outer)
7849 tree inner_list;
7851 /* We need to go after all inner classes and start expanding them,
7852 starting with most nested ones. We have to do that because nested
7853 classes might add functions to outer classes */
7855 for (inner_list = DECL_INNER_CLASS_LIST (outer);
7856 inner_list; inner_list = TREE_CHAIN (inner_list))
7857 java_complete_expand_class (TREE_PURPOSE (inner_list));
7859 java_complete_expand_methods (outer);
7862 /* Expand methods registered in CLASS_DECL. The general idea is that
7863 we expand regular methods first. This allows us get an estimate on
7864 how outer context local alias fields are really used so we can add
7865 to the constructor just enough code to initialize them properly (it
7866 also lets us generate finit$ correctly.) Then we expand the
7867 constructors and then <clinit>. */
7869 static void
7870 java_complete_expand_methods (tree class_decl)
7872 tree clinit, decl, first_decl;
7874 output_class = current_class = TREE_TYPE (class_decl);
7876 /* Pre-expand <clinit> to figure whether we really need it or
7877 not. If we do need it, we pre-expand the static fields so they're
7878 ready to be used somewhere else. <clinit> will be fully expanded
7879 after we processed the constructors. */
7880 first_decl = TYPE_METHODS (current_class);
7881 clinit = maybe_generate_pre_expand_clinit (current_class);
7883 /* Then generate finit$ (if we need to) because constructors will
7884 try to use it.*/
7885 if (TYPE_FINIT_STMT_LIST (current_class))
7886 java_complete_expand_method (generate_finit (current_class));
7888 /* Then generate instinit$ (if we need to) because constructors will
7889 try to use it. */
7890 if (TYPE_II_STMT_LIST (current_class))
7891 java_complete_expand_method (generate_instinit (current_class));
7893 /* Now do the constructors */
7894 for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl))
7896 if (!DECL_CONSTRUCTOR_P (decl))
7897 continue;
7898 java_complete_expand_method (decl);
7901 /* First, do the ordinary methods. */
7902 for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
7904 /* Ctors aren't part of this batch. */
7905 if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
7906 continue;
7908 /* Skip abstract or native methods -- but do handle native
7909 methods when generating JNI stubs. */
7910 if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl)))
7912 DECL_FUNCTION_BODY (decl) = NULL_TREE;
7913 continue;
7916 if (METHOD_NATIVE (decl))
7918 tree body;
7919 current_function_decl = decl;
7920 body = build_jni_stub (decl);
7921 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
7924 java_complete_expand_method (decl);
7927 /* If there is indeed a <clinit>, fully expand it now */
7928 if (clinit)
7930 /* Prevent the use of `this' inside <clinit> */
7931 ctxp->explicit_constructor_p = 1;
7932 java_complete_expand_method (clinit);
7933 ctxp->explicit_constructor_p = 0;
7936 /* We might have generated a class$ that we now want to expand */
7937 if (TYPE_DOT_CLASS (current_class))
7938 java_complete_expand_method (TYPE_DOT_CLASS (current_class));
7940 /* Now verify constructor circularity (stop after the first one we
7941 prove wrong.) */
7942 if (!CLASS_INTERFACE (class_decl))
7943 for (decl = TYPE_METHODS (current_class); decl; decl = TREE_CHAIN (decl))
7944 if (DECL_CONSTRUCTOR_P (decl)
7945 && verify_constructor_circularity (decl, decl))
7946 break;
7949 /* Attempt to create <clinit>. Pre-expand static fields so they can be
7950 safely used in some other methods/constructors. */
7952 static tree
7953 maybe_generate_pre_expand_clinit (tree class_type)
7955 tree current, mdecl;
7957 if (!TYPE_CLINIT_STMT_LIST (class_type))
7958 return NULL_TREE;
7960 /* Go through all static fields and pre expand them */
7961 for (current = TYPE_FIELDS (class_type); current;
7962 current = TREE_CHAIN (current))
7963 if (FIELD_STATIC (current))
7964 build_field_ref (NULL_TREE, class_type, DECL_NAME (current));
7966 /* Then build the <clinit> method */
7967 mdecl = create_artificial_method (class_type, ACC_STATIC, void_type_node,
7968 clinit_identifier_node, end_params_node);
7969 layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
7970 mdecl, NULL_TREE);
7971 start_artificial_method_body (mdecl);
7973 /* We process the list of assignment we produced as the result of
7974 the declaration of initialized static field and add them as
7975 statement to the <clinit> method. */
7976 for (current = TYPE_CLINIT_STMT_LIST (class_type); current;
7977 current = TREE_CHAIN (current))
7979 tree stmt = current;
7980 /* We build the assignment expression that will initialize the
7981 field to its value. There are strict rules on static
7982 initializers (8.5). FIXME */
7983 if (TREE_CODE (stmt) != BLOCK && !IS_EMPTY_STMT (stmt))
7984 stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt);
7985 java_method_add_stmt (mdecl, stmt);
7988 end_artificial_method_body (mdecl);
7990 /* Now we want to place <clinit> as the last method (because we need
7991 it at least for interface so that it doesn't interfere with the
7992 dispatch table based lookup. */
7993 if (TREE_CHAIN (TYPE_METHODS (class_type)))
7995 current = TREE_CHAIN (TYPE_METHODS (class_type));
7996 TYPE_METHODS (class_type) = current;
7998 while (TREE_CHAIN (current))
7999 current = TREE_CHAIN (current);
8001 TREE_CHAIN (current) = mdecl;
8002 TREE_CHAIN (mdecl) = NULL_TREE;
8005 return mdecl;
8008 /* Analyzes a method body and look for something that isn't a
8009 MODIFY_EXPR with a constant value. */
8011 static int
8012 analyze_clinit_body (tree this_class, tree bbody)
8014 while (bbody)
8015 switch (TREE_CODE (bbody))
8017 case BLOCK:
8018 bbody = BLOCK_EXPR_BODY (bbody);
8019 break;
8021 case EXPR_WITH_FILE_LOCATION:
8022 bbody = EXPR_WFL_NODE (bbody);
8023 break;
8025 case COMPOUND_EXPR:
8026 if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0)))
8027 return 1;
8028 bbody = TREE_OPERAND (bbody, 1);
8029 break;
8031 case MODIFY_EXPR:
8032 /* If we're generating to class file and we're dealing with an
8033 array initialization, we return 1 to keep <clinit> */
8034 if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT
8035 && flag_emit_class_files)
8036 return 1;
8038 /* There are a few cases where we're required to keep
8039 <clinit>:
8040 - If this is an assignment whose operand is not constant,
8041 - If this is an assignment to a non-initialized field,
8042 - If this field is not a member of the current class.
8044 return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1))
8045 || ! DECL_INITIAL (TREE_OPERAND (bbody, 0))
8046 || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class);
8048 default:
8049 return 1;
8051 return 0;
8055 /* See whether we could get rid of <clinit>. Criteria are: all static
8056 final fields have constant initial values and the body of <clinit>
8057 is empty. Return 1 if <clinit> was discarded, 0 otherwise. */
8059 static int
8060 maybe_yank_clinit (tree mdecl)
8062 tree type, current;
8063 tree fbody, bbody;
8065 if (!DECL_CLINIT_P (mdecl))
8066 return 0;
8068 /* If the body isn't empty, then we keep <clinit>. Note that if
8069 we're emitting classfiles, this isn't enough not to rule it
8070 out. */
8071 fbody = DECL_FUNCTION_BODY (mdecl);
8072 bbody = BLOCK_EXPR_BODY (fbody);
8073 if (bbody && bbody != error_mark_node)
8074 bbody = BLOCK_EXPR_BODY (bbody);
8075 else
8076 return 0;
8077 if (bbody && ! flag_emit_class_files && !IS_EMPTY_STMT (bbody))
8078 return 0;
8080 type = DECL_CONTEXT (mdecl);
8081 current = TYPE_FIELDS (type);
8083 for (current = (current ? TREE_CHAIN (current) : current);
8084 current; current = TREE_CHAIN (current))
8086 tree f_init;
8088 /* We're not interested in non-static fields. */
8089 if (!FIELD_STATIC (current))
8090 continue;
8092 /* Nor in fields without initializers. */
8093 f_init = DECL_INITIAL (current);
8094 if (f_init == NULL_TREE)
8095 continue;
8097 /* Anything that isn't String or a basic type is ruled out -- or
8098 if we know how to deal with it (when doing things natively) we
8099 should generated an empty <clinit> so that SUID are computed
8100 correctly. */
8101 if (! JSTRING_TYPE_P (TREE_TYPE (current))
8102 && ! JNUMERIC_TYPE_P (TREE_TYPE (current)))
8103 return 0;
8105 if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init))
8106 return 0;
8109 /* Now we analyze the method body and look for something that
8110 isn't a MODIFY_EXPR */
8111 if (bbody && !IS_EMPTY_STMT (bbody) && analyze_clinit_body (type, bbody))
8112 return 0;
8114 /* Get rid of <clinit> in the class' list of methods */
8115 if (TYPE_METHODS (type) == mdecl)
8116 TYPE_METHODS (type) = TREE_CHAIN (mdecl);
8117 else
8118 for (current = TYPE_METHODS (type); current;
8119 current = TREE_CHAIN (current))
8120 if (TREE_CHAIN (current) == mdecl)
8122 TREE_CHAIN (current) = TREE_CHAIN (mdecl);
8123 break;
8126 return 1;
8129 /* Install the argument from MDECL. Suitable to completion and
8130 expansion of mdecl's body. */
8132 void
8133 start_complete_expand_method (tree mdecl)
8135 tree tem;
8137 pushlevel (1); /* Prepare for a parameter push */
8138 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
8139 DECL_ARGUMENTS (mdecl) = tem;
8141 for (; tem; tem = TREE_CHAIN (tem))
8143 /* TREE_CHAIN (tem) will change after pushdecl. */
8144 tree next = TREE_CHAIN (tem);
8145 tree type = TREE_TYPE (tem);
8146 if (targetm.calls.promote_prototypes (type)
8147 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
8148 && INTEGRAL_TYPE_P (type))
8149 type = integer_type_node;
8150 DECL_ARG_TYPE (tem) = type;
8151 layout_decl (tem, 0);
8152 pushdecl (tem);
8153 /* Re-install the next so that the list is kept and the loop
8154 advances. */
8155 TREE_CHAIN (tem) = next;
8157 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8158 input_location = DECL_SOURCE_LOCATION (mdecl);
8159 build_result_decl (mdecl);
8163 /* Complete and expand a method. */
8165 static void
8166 java_complete_expand_method (tree mdecl)
8168 tree fbody, block_body, exception_copy;
8170 current_function_decl = mdecl;
8171 /* Fix constructors before expanding them */
8172 if (DECL_CONSTRUCTOR_P (mdecl))
8173 fix_constructors (mdecl);
8175 /* Expand functions that have a body */
8176 if (!DECL_FUNCTION_BODY (mdecl))
8177 return;
8179 fbody = DECL_FUNCTION_BODY (mdecl);
8180 block_body = BLOCK_EXPR_BODY (fbody);
8181 exception_copy = NULL_TREE;
8183 current_function_decl = mdecl;
8185 if (! quiet_flag)
8186 fprintf (stderr, " [%s.",
8187 lang_printable_name (DECL_CONTEXT (mdecl), 0));
8188 announce_function (mdecl);
8189 if (! quiet_flag)
8190 fprintf (stderr, "]");
8192 /* Prepare the function for tree completion */
8193 start_complete_expand_method (mdecl);
8195 /* Install the current this */
8196 current_this = (!METHOD_STATIC (mdecl) ?
8197 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
8199 /* Install exceptions thrown with `throws' */
8200 PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
8202 if (block_body != NULL_TREE)
8204 block_body = java_complete_tree (block_body);
8206 /* Before we check initialization, attached all class initialization
8207 variable to the block_body */
8208 htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (mdecl),
8209 attach_init_test_initialization_flags, block_body);
8211 if (! METHOD_NATIVE (mdecl))
8213 check_for_initialization (block_body, mdecl);
8215 /* Go through all the flags marking the initialization of
8216 static variables and see whether they're definitively
8217 assigned, in which case the type is remembered as
8218 definitively initialized in MDECL. */
8219 if (STATIC_CLASS_INIT_OPT_P ())
8221 /* Always register the context as properly initialized in
8222 MDECL. This used with caution helps removing extra
8223 initialization of self. */
8224 if (METHOD_STATIC (mdecl))
8226 *(htab_find_slot
8227 (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl),
8228 DECL_CONTEXT (mdecl), INSERT)) = DECL_CONTEXT (mdecl);
8232 ctxp->explicit_constructor_p = 0;
8235 BLOCK_EXPR_BODY (fbody) = block_body;
8237 /* If we saw a return but couldn't evaluate it properly, we'll have
8238 an error_mark_node here. */
8239 if (block_body != error_mark_node
8240 && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
8241 && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE)
8242 missing_return_error (current_function_decl);
8244 /* See if we can get rid of <clinit> if MDECL happens to be <clinit> */
8245 maybe_yank_clinit (mdecl);
8247 /* Pop the current level, with special measures if we found errors. */
8248 if (java_error_count)
8249 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8250 poplevel (1, 0, 1);
8252 /* Pop the exceptions and sanity check */
8253 POP_EXCEPTIONS();
8254 if (currently_caught_type_list)
8255 abort ();
8258 /* For with each class for which there's code to generate. */
8260 static void
8261 java_expand_method_bodies (tree class)
8263 tree decl;
8264 for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl))
8266 tree block;
8268 if (! DECL_FUNCTION_BODY (decl))
8269 continue;
8271 current_function_decl = decl;
8273 block = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
8275 /* Save the function body for gimplify and inlining. */
8276 DECL_SAVED_TREE (decl) = block;
8278 /* It's time to assign the variable flagging static class
8279 initialization based on which classes invoked static methods
8280 are definitely initializing. This should be flagged. */
8281 if (STATIC_CLASS_INIT_OPT_P ())
8283 tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl);
8284 for (; list != NULL_TREE; list = TREE_CHAIN (list))
8286 /* Executed for each statement calling a static function.
8287 LIST is a TREE_LIST whose PURPOSE is the called function
8288 and VALUE is a compound whose second operand can be patched
8289 with static class initialization flag assignments. */
8291 tree called_method = TREE_PURPOSE (list);
8292 tree compound = TREE_VALUE (list);
8293 tree assignment_compound_list
8294 = build_tree_list (called_method, NULL);
8296 /* For each class definitely initialized in
8297 CALLED_METHOD, fill ASSIGNMENT_COMPOUND with
8298 assignment to the class initialization flag. */
8299 htab_traverse (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method),
8300 emit_test_initialization,
8301 assignment_compound_list);
8303 if (TREE_VALUE (assignment_compound_list))
8304 TREE_OPERAND (compound, 1)
8305 = TREE_VALUE (assignment_compound_list);
8309 /* Expand the function body. */
8310 source_end_java_method ();
8316 /* This section of the code deals with accessing enclosing context
8317 fields either directly by using the relevant access to this$<n> or
8318 by invoking an access method crafted for that purpose. */
8320 /* Build the necessary access across nested class boundaries.
8321 This routine could be optimized to cache previous result
8322 (decl, current_class and returned access). When an access method
8323 needs to be generated, it always takes the form of a read. It might
8324 be later turned into a write by calling nested_field_access_fix. */
8326 static tree
8327 build_nested_field_access (tree id, tree decl)
8329 tree access = NULL_TREE;
8330 tree ctx = NULL_TREE;
8331 tree decl_ctx = DECL_CONTEXT (decl);
8332 bool is_static = FIELD_STATIC (decl);
8334 if (DECL_CONTEXT (TYPE_NAME (current_class)))
8335 ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
8337 /* For non-static fields, if the immediate enclosing context of the
8338 current class is the field decl's class or inherits from it,
8339 build the access as `this$<n>.<field>'. Note that we will break
8340 the `private' barrier if we're not emitting bytecodes. */
8341 if (!is_static
8342 && ctx
8343 && (ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
8344 && (!FIELD_PRIVATE (decl) || !flag_emit_class_files))
8346 tree thisn = build_current_thisn (current_class);
8347 access = make_qualified_primary (build_wfl_node (thisn),
8348 id, EXPR_WFL_LINECOL (id));
8350 /* Otherwise, generate and use accessor methods for the field as
8351 needed. */
8352 else
8354 int lc = EXPR_WFL_LINECOL (id);
8356 /* Now we chain the required number of calls to the access$0 to
8357 get a hold to the enclosing instance we need for a non-static
8358 field, and then we build the field access. */
8359 if (!is_static)
8360 access = build_access_to_thisn (current_class, decl_ctx, lc);
8362 /* If the field is private and we're generating bytecode, then
8363 we generate an access method. */
8364 if (FIELD_PRIVATE (decl) && flag_emit_class_files)
8366 tree name = build_nested_field_access_methods (decl);
8367 access = build_nested_field_access_expr (lc, decl_ctx,
8368 name, access, NULL_TREE);
8370 /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'
8371 for non-static fields.
8372 Once again we break the `private' access rule from a foreign
8373 class. */
8374 else if (is_static)
8376 tree class_name = DECL_NAME (TYPE_NAME (decl_ctx));
8377 access
8378 = make_qualified_primary (build_wfl_node (class_name), id, lc);
8380 else
8381 access = make_qualified_primary (access, id, lc);
8384 return resolve_expression_name (access, NULL);
8387 /* Return a nonzero value if DECL describes a member access across nested
8388 class boundaries. That is, DECL is in a class that either encloses,
8389 is enclosed by or shares a common enclosing class with the class
8390 TYPE. */
8392 static int
8393 nested_member_access_p (tree type, tree decl)
8395 bool is_static = false;
8396 tree decl_type = DECL_CONTEXT (decl);
8397 tree type_root, decl_type_root;
8399 if (decl_type == type
8400 || (TREE_CODE (decl) != FIELD_DECL
8401 && TREE_CODE (decl) != VAR_DECL
8402 && TREE_CODE (decl) != FUNCTION_DECL))
8403 return 0;
8405 if (!INNER_CLASS_TYPE_P (type)
8406 && !(TREE_CODE (decl_type) == RECORD_TYPE
8407 && INNER_CLASS_TYPE_P (decl_type)))
8408 return 0;
8410 is_static = (TREE_CODE (decl) == FUNCTION_DECL)
8411 ? METHOD_STATIC (decl)
8412 : FIELD_STATIC (decl);
8414 /* If TYPE extends the declaration context of the non-static
8415 member we're trying to access, then this isn't a nested member
8416 access we need to worry about. */
8417 if (!is_static && inherits_from_p (type, decl_type))
8418 return 0;
8420 for (type_root = type;
8421 DECL_CONTEXT (TYPE_NAME (type_root));
8422 type_root = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type_root))))
8424 if (type_root == decl_type)
8425 return 1;
8428 if (TREE_CODE (decl_type) == RECORD_TYPE
8429 && INNER_CLASS_TYPE_P (decl_type))
8431 for (decl_type_root = decl_type;
8432 DECL_CONTEXT (TYPE_NAME (decl_type_root));
8433 decl_type_root
8434 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (decl_type_root))))
8436 if (decl_type_root == type)
8437 return 1;
8440 else
8441 decl_type_root = decl_type;
8443 if (type_root == decl_type_root)
8444 return 1;
8446 /* Before we give up, see whether it is a non-static field
8447 inherited from the enclosing context we are considering. */
8448 if (!DECL_CONTEXT (TYPE_NAME (type_root))
8449 && !is_static
8450 && inherits_from_p (type_root, decl_type))
8451 return 1;
8453 return 0;
8456 /* Return a nonzero value if NODE represents a cross-nested-class
8457 access that has already been expanded. As a side effect, it returns
8458 the name of the field being accessed and the argument passed to the
8459 access function, suitable for a regeneration of the access method
8460 call if necessary. */
8462 static int
8463 nested_field_expanded_access_p (tree node, tree *name, tree *arg_type,
8464 tree *arg)
8466 int identified = 0;
8468 if (TREE_CODE (node) != CALL_EXPR)
8469 return 0;
8471 /* Well, GCJ generates slightly different tree nodes when compiling
8472 to native or bytecodes. It's the case for function calls. */
8474 if (flag_emit_class_files
8475 && TREE_CODE (node) == CALL_EXPR
8476 && NESTED_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
8477 identified = 1;
8478 else if (!flag_emit_class_files)
8480 node = TREE_OPERAND (node, 0);
8482 if (node && TREE_OPERAND (node, 0)
8483 && TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)
8485 node = TREE_OPERAND (node, 0);
8486 if (TREE_OPERAND (node, 0)
8487 && TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
8488 && (NESTED_FIELD_ACCESS_IDENTIFIER_P
8489 (DECL_NAME (TREE_OPERAND (node, 0)))))
8490 identified = 1;
8494 if (identified && name && arg_type && arg)
8496 tree argument = TREE_OPERAND (node, 1);
8497 *name = DECL_NAME (TREE_OPERAND (node, 0));
8499 /* The accessors for static fields do not take in a this$<n> argument,
8500 so we take the class name from the accessor's context instead. */
8501 if (argument)
8503 *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
8504 *arg = TREE_VALUE (argument);
8506 else
8508 *arg_type = DECL_CONTEXT (TREE_OPERAND (node, 0));
8509 *arg = NULL_TREE;
8512 return identified;
8515 /* Detect in NODE cross-nested-class field read access and
8516 transform it into a write with RHS as an argument. This function
8517 is called from the java_complete_lhs when an assignment to a LHS can
8518 be identified. */
8520 static tree
8521 nested_field_access_fix (tree wfl, tree node, tree rhs)
8523 tree name, arg_type, arg;
8525 if (nested_field_expanded_access_p (node, &name, &arg_type, &arg))
8527 node = build_nested_field_access_expr (EXPR_WFL_LINECOL (wfl),
8528 arg_type, name, arg, rhs);
8529 return java_complete_tree (node);
8531 return NULL_TREE;
8534 /* Construct the expression that calls an access method:
8535 <type>.access$<n>(<arg1> [, <arg2>]);
8537 ARG2 can be NULL and will be omitted in that case. It will denote a
8538 read access. */
8540 static tree
8541 build_nested_field_access_expr (int lc, tree type, tree access_method_name,
8542 tree arg1, tree arg2)
8544 tree args, cn, access;
8546 if (arg1)
8547 args = build_tree_list (NULL_TREE, arg1);
8548 else
8549 args = NULL_TREE;
8551 if (arg2)
8553 if (args)
8554 args = tree_cons (NULL_TREE, arg2, args);
8555 else
8556 args = build_tree_list (NULL_TREE, arg2);
8559 access
8560 = build_method_invocation (build_wfl_node (access_method_name), args);
8561 cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
8563 return make_qualified_primary (cn, access, lc);
8566 /* Build the name of a synthetic accessor used to access class members
8567 across nested class boundaries. */
8569 static tree
8570 build_new_access_id (void)
8572 static int access_n_counter = 1;
8573 char buffer [128];
8575 sprintf (buffer, "access$%d", access_n_counter++);
8576 return get_identifier (buffer);
8579 /* Create the static access functions for the cross-nested-class field DECL.
8580 We define a read:
8581 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
8582 return inst$.field;
8584 and a write access:
8585 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$,
8586 TREE_TYPE (<field>) value$) {
8587 return inst$.field = value$;
8589 For static fields, these methods are generated without the instance
8590 parameter.
8591 We should have a usage flag on the DECL so we can lazily turn the ones
8592 we're using for code generation. FIXME.
8595 static tree
8596 build_nested_field_access_methods (tree decl)
8598 tree id, args, stmt, mdecl, class_name = NULL_TREE;
8599 bool is_static = FIELD_STATIC (decl);
8601 if (FIELD_NESTED_ACCESS_P (decl))
8602 return FIELD_NESTED_ACCESS (decl);
8604 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
8606 /* Create the identifier and a function named after it. */
8607 id = build_new_access_id ();
8609 /* The identifier is marked as bearing the name of a generated write
8610 access function for outer field accessed from inner classes. */
8611 NESTED_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8613 /* Create the read access. */
8614 if (!is_static)
8616 args = build_tree_list (inst_id,
8617 build_pointer_type (DECL_CONTEXT (decl)));
8618 TREE_CHAIN (args) = end_params_node;
8619 stmt = make_qualified_primary (build_wfl_node (inst_id),
8620 build_wfl_node (DECL_NAME (decl)), 0);
8622 else
8624 args = end_params_node;
8625 class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
8626 stmt = make_qualified_primary (build_wfl_node (class_name),
8627 build_wfl_node (DECL_NAME (decl)), 0);
8629 stmt = build_return (0, stmt);
8630 mdecl = build_nested_field_access_method (DECL_CONTEXT (decl),
8631 TREE_TYPE (decl), id, args, stmt);
8632 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8634 /* Create the write access method. No write access for final variable */
8635 if (!FIELD_FINAL (decl))
8637 if (!is_static)
8639 args = build_tree_list (inst_id,
8640 build_pointer_type (DECL_CONTEXT (decl)));
8641 TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
8642 TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
8643 stmt = make_qualified_primary (build_wfl_node (inst_id),
8644 build_wfl_node (DECL_NAME (decl)),
8647 else
8649 args = build_tree_list (wpv_id, TREE_TYPE (decl));
8650 TREE_CHAIN (args) = end_params_node;
8651 stmt = make_qualified_primary (build_wfl_node (class_name),
8652 build_wfl_node (DECL_NAME (decl)),
8655 stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
8656 build_wfl_node (wpv_id)));
8657 mdecl = build_nested_field_access_method (DECL_CONTEXT (decl),
8658 TREE_TYPE (decl), id,
8659 args, stmt);
8661 DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8663 /* Return the access name */
8664 return FIELD_NESTED_ACCESS (decl) = id;
8667 /* Build a field access method NAME. */
8669 static tree
8670 build_nested_field_access_method (tree class, tree type, tree name,
8671 tree args, tree body)
8673 tree saved_current_function_decl, mdecl;
8675 /* Create the method */
8676 mdecl = create_artificial_method (class, ACC_STATIC, type, name, args);
8677 fix_method_argument_names (args, mdecl);
8678 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8680 /* Attach the method body. */
8681 saved_current_function_decl = current_function_decl;
8682 start_artificial_method_body (mdecl);
8683 java_method_add_stmt (mdecl, body);
8684 end_artificial_method_body (mdecl);
8685 current_function_decl = saved_current_function_decl;
8687 return mdecl;
8691 /* This section deals with building access function necessary for
8692 certain kinds of method invocation across nested class boundaries. */
8694 static tree
8695 build_nested_method_access_method (tree decl)
8697 tree saved_current_function_decl, mdecl;
8698 tree args = NULL_TREE, call_args = NULL_TREE;
8699 tree carg, id, body, class;
8700 char buffer [80];
8701 int parm_id_count = 0;
8703 /* Test this abort with an access to a private field */
8704 if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "access$"))
8705 abort ();
8707 /* Check the cache first */
8708 if (DECL_FUNCTION_INNER_ACCESS (decl))
8709 return DECL_FUNCTION_INNER_ACCESS (decl);
8711 class = DECL_CONTEXT (decl);
8713 /* Obtain an access identifier and mark it */
8714 id = build_new_access_id ();
8715 NESTED_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8717 carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
8718 /* Create the arguments, as much as the original */
8719 for (; carg && carg != end_params_node;
8720 carg = TREE_CHAIN (carg))
8722 sprintf (buffer, "write_parm_value$%d", parm_id_count++);
8723 args = chainon (args, build_tree_list (get_identifier (buffer),
8724 TREE_VALUE (carg)));
8726 args = chainon (args, end_params_node);
8728 /* Create the method */
8729 mdecl = create_artificial_method (class, ACC_STATIC,
8730 TREE_TYPE (TREE_TYPE (decl)), id, args);
8731 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8732 /* There is a potential bug here. We should be able to use
8733 fix_method_argument_names, but then arg names get mixed up and
8734 eventually a constructor will have its this$0 altered and the
8735 outer context won't be assignment properly. The testcase is
8736 stub.java FIXME */
8737 TYPE_ARG_TYPES (TREE_TYPE (mdecl)) = args;
8739 /* Attach the method body. */
8740 saved_current_function_decl = current_function_decl;
8741 start_artificial_method_body (mdecl);
8743 /* The actual method invocation uses the same args. When invoking a
8744 static methods that way, we don't want to skip the first argument. */
8745 carg = args;
8746 if (!METHOD_STATIC (decl))
8747 carg = TREE_CHAIN (carg);
8748 for (; carg && carg != end_params_node; carg = TREE_CHAIN (carg))
8749 call_args = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (carg)),
8750 call_args);
8752 body = build_method_invocation (build_wfl_node (DECL_NAME (decl)),
8753 call_args);
8754 if (!METHOD_STATIC (decl))
8755 body = make_qualified_primary (build_wfl_node (TREE_PURPOSE (args)),
8756 body, 0);
8757 if (TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
8758 body = build_return (0, body);
8759 java_method_add_stmt (mdecl,body);
8760 end_artificial_method_body (mdecl);
8761 current_function_decl = saved_current_function_decl;
8763 /* Back tag the access function so it know what it accesses. */
8764 DECL_FUNCTION_ACCESS_DECL (decl) = mdecl;
8766 /* Tag the current method so it knows it has an access generated. */
8767 return DECL_FUNCTION_INNER_ACCESS (decl) = mdecl;
8771 /* This section of the code deals with building expressions to access
8772 the enclosing instance of an inner class. The enclosing instance is
8773 kept in a generated field called this$<n>, with <n> being the
8774 inner class nesting level (starting from 0.) */
8776 /* Build an access to a given this$<n>, always chaining access call to
8777 others. Access methods to this$<n> are build on the fly if
8778 necessary. This CAN'T be used to solely access this$<n-1> from
8779 this$<n> (which alway yield to special cases and optimization, see
8780 for example build_nested_field_access). */
8782 static tree
8783 build_access_to_thisn (tree from, tree to, int lc)
8785 tree access = NULL_TREE;
8787 while (from != to && PURE_INNER_CLASS_TYPE_P (from))
8789 if (!access)
8791 access = build_current_thisn (from);
8792 access = build_wfl_node (access);
8794 else
8796 tree access0_wfl, cn;
8798 maybe_build_thisn_access_method (from);
8799 access0_wfl = build_wfl_node (access0_identifier_node);
8800 cn = build_wfl_node (DECL_NAME (TYPE_NAME (from)));
8801 EXPR_WFL_LINECOL (access0_wfl) = lc;
8802 access = build_tree_list (NULL_TREE, access);
8803 access = build_method_invocation (access0_wfl, access);
8804 access = make_qualified_primary (cn, access, lc);
8807 /* If FROM isn't an inner class, that's fine, we've done enough.
8808 What we're looking for can be accessed from there. */
8809 from = DECL_CONTEXT (TYPE_NAME (from));
8810 if (!from)
8811 break;
8812 from = TREE_TYPE (from);
8814 return access;
8817 /* Build an access function to the this$<n> local to TYPE. NULL_TREE
8818 is returned if nothing needs to be generated. Otherwise, the method
8819 generated and a method decl is returned.
8821 NOTE: These generated methods should be declared in a class file
8822 attribute so that they can't be referred to directly. */
8824 static tree
8825 maybe_build_thisn_access_method (tree type)
8827 tree mdecl, args, stmt, rtype;
8828 tree saved_current_function_decl;
8830 /* If TYPE is a top-level class, no access method is required.
8831 If there already is such an access method, bail out. */
8832 if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type))
8833 return NULL_TREE;
8835 /* We generate the method. The method looks like:
8836 static <outer_of_type> access$0 (<type> inst$) { return inst$.this$<n>; }
8838 args = build_tree_list (inst_id, build_pointer_type (type));
8839 TREE_CHAIN (args) = end_params_node;
8840 rtype = build_pointer_type (TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))));
8841 mdecl = create_artificial_method (type, ACC_STATIC, rtype,
8842 access0_identifier_node, args);
8843 fix_method_argument_names (args, mdecl);
8844 layout_class_method (type, NULL_TREE, mdecl, NULL_TREE);
8845 stmt = build_current_thisn (type);
8846 stmt = make_qualified_primary (build_wfl_node (inst_id),
8847 build_wfl_node (stmt), 0);
8848 stmt = build_return (0, stmt);
8850 saved_current_function_decl = current_function_decl;
8851 start_artificial_method_body (mdecl);
8852 java_method_add_stmt (mdecl, stmt);
8853 end_artificial_method_body (mdecl);
8854 current_function_decl = saved_current_function_decl;
8856 CLASS_ACCESS0_GENERATED_P (type) = 1;
8858 return mdecl;
8861 /* Craft an correctly numbered `this$<n>'string. this$0 is used for
8862 the first level of innerclassing. this$1 for the next one, etc...
8863 This function can be invoked with TYPE to NULL, available and then
8864 has to count the parser context. */
8866 static GTY(()) tree saved_thisn;
8867 static GTY(()) tree saved_type;
8869 static tree
8870 build_current_thisn (tree type)
8872 static int saved_i = -1;
8873 static int saved_type_i = 0;
8874 tree decl;
8875 char buffer [24];
8876 int i = 0;
8878 if (type)
8880 if (type == saved_type)
8881 i = saved_type_i;
8882 else
8884 for (i = -1, decl = DECL_CONTEXT (TYPE_NAME (type));
8885 decl; decl = DECL_CONTEXT (decl), i++)
8888 saved_type = type;
8889 saved_type_i = i;
8892 else
8893 i = list_length (GET_CPC_LIST ())-2;
8895 if (i == saved_i)
8896 return saved_thisn;
8898 sprintf (buffer, "this$%d", i);
8899 saved_i = i;
8900 saved_thisn = get_identifier (buffer);
8901 return saved_thisn;
8904 /* Return the assignment to the hidden enclosing context `this$<n>'
8905 by the second incoming parameter to the innerclass constructor. The
8906 form used is `this.this$<n> = this$<n>;'. */
8908 static tree
8909 build_thisn_assign (void)
8911 if (current_class && PURE_INNER_CLASS_TYPE_P (current_class))
8913 tree thisn = build_current_thisn (current_class);
8914 tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
8915 build_wfl_node (thisn), 0);
8916 tree rhs = build_wfl_node (thisn);
8917 #ifdef USE_MAPPED_LOCATION
8918 SET_EXPR_LOCATION (lhs, input_location);
8919 #else
8920 EXPR_WFL_SET_LINECOL (lhs, input_line, 0);
8921 #endif
8922 return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
8924 return NULL_TREE;
8928 /* Building the synthetic `class$' used to implement the `.class' 1.1
8929 extension for non primitive types. This method looks like:
8931 static Class class$(String type) throws NoClassDefFoundError
8933 try {return (java.lang.Class.forName (String));}
8934 catch (ClassNotFoundException e) {
8935 throw new NoClassDefFoundError(e.getMessage());}
8936 } */
8938 static GTY(()) tree get_message_wfl;
8939 static GTY(()) tree type_parm_wfl;
8941 static tree
8942 build_dot_class_method (tree class)
8944 #define BWF(S) build_wfl_node (get_identifier ((S)))
8945 #ifdef USE_MAPPED_LOCATION
8946 #define MQN(X,Y) make_qualified_name ((X), (Y), UNKNOWN_LOCATION)
8947 #else
8948 #define MQN(X,Y) make_qualified_name ((X), (Y), 0)
8949 #endif
8950 tree args, tmp, saved_current_function_decl, mdecl, qual_name;
8951 tree stmt, throw_stmt;
8953 if (!get_message_wfl)
8955 get_message_wfl = build_wfl_node (get_identifier ("getMessage"));
8956 type_parm_wfl = build_wfl_node (get_identifier ("type$"));
8959 /* Build the arguments */
8960 args = build_tree_list (get_identifier ("type$"),
8961 build_pointer_type (string_type_node));
8962 TREE_CHAIN (args) = end_params_node;
8964 /* Build the qualified name java.lang.Class.forName */
8965 tmp = MQN (MQN (MQN (BWF ("java"),
8966 BWF ("lang")), BWF ("Class")), BWF ("forName"));
8968 /* Create the "class$" function */
8969 mdecl = create_artificial_method (class, ACC_STATIC,
8970 build_pointer_type (class_type_node),
8971 classdollar_identifier_node, args);
8972 qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8973 BWF ("NoClassDefFoundError"));
8974 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, qual_name);
8975 register_incomplete_type (JDEP_EXCEPTION, qual_name, NULL_TREE, NULL_TREE);
8976 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
8977 &TREE_VALUE (DECL_FUNCTION_THROWS (mdecl));
8979 /* We start by building the try block. We need to build:
8980 return (java.lang.Class.forName (type)); */
8981 stmt = build_method_invocation (tmp,
8982 build_tree_list (NULL_TREE, type_parm_wfl));
8983 stmt = build_return (0, stmt);
8985 /* Now onto the catch block. We start by building the expression
8986 throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
8987 #ifdef USE_MAPPED_LOCATION
8988 throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
8989 get_message_wfl, UNKNOWN_LOCATION);
8990 #else
8991 throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
8992 get_message_wfl, 0);
8993 #endif
8994 throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
8996 /* Build new NoClassDefFoundError (_.getMessage) */
8997 throw_stmt = build_new_invocation
8998 (build_wfl_node (get_identifier ("NoClassDefFoundError")),
8999 build_tree_list (build_pointer_type (string_type_node), throw_stmt));
9001 /* Build the throw, (it's too early to use BUILD_THROW) */
9002 throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt);
9004 /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */
9005 qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
9006 BWF ("ClassNotFoundException"));
9007 stmt = encapsulate_with_try_catch (0, qual_name, stmt, throw_stmt);
9009 fix_method_argument_names (args, mdecl);
9010 layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
9011 saved_current_function_decl = current_function_decl;
9012 start_artificial_method_body (mdecl);
9013 java_method_add_stmt (mdecl, stmt);
9014 end_artificial_method_body (mdecl);
9015 current_function_decl = saved_current_function_decl;
9016 TYPE_DOT_CLASS (class) = mdecl;
9018 return mdecl;
9021 static tree
9022 build_dot_class_method_invocation (tree this_class, tree type)
9024 tree dot_class_method = TYPE_DOT_CLASS (this_class);
9025 tree sig_id, s, t;
9027 if (TYPE_ARRAY_P (type))
9028 sig_id = build_java_signature (type);
9029 else
9030 sig_id = DECL_NAME (TYPE_NAME (type));
9032 /* Ensure that the proper name separator is used */
9033 sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id),
9034 IDENTIFIER_LENGTH (sig_id));
9036 s = build_string (IDENTIFIER_LENGTH (sig_id),
9037 IDENTIFIER_POINTER (sig_id));
9038 t = build_method_invocation (build_wfl_node (DECL_NAME (dot_class_method)),
9039 build_tree_list (NULL_TREE, s));
9040 if (DECL_CONTEXT (dot_class_method) != this_class)
9042 tree class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (dot_class_method)));
9043 t = make_qualified_primary (build_wfl_node (class_name), t, 0);
9045 return t;
9048 /* This section of the code deals with constructor. */
9050 /* Craft a body for default constructor. Patch existing constructor
9051 bodies with call to super() and field initialization statements if
9052 necessary. */
9054 static void
9055 fix_constructors (tree mdecl)
9057 tree iii; /* Instance Initializer Invocation */
9058 tree *bodyp = &DECL_FUNCTION_BODY (mdecl);
9059 tree thisn_assign, compound = NULL_TREE;
9060 tree class_type = DECL_CONTEXT (mdecl);
9062 if (DECL_FIXED_CONSTRUCTOR_P (mdecl))
9063 return;
9064 DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
9066 if (!*bodyp)
9068 /* It is an error for the compiler to generate a default
9069 constructor if the superclass doesn't have a constructor that
9070 takes no argument, or the same args for an anonymous class */
9071 tree sdecl = get_constructor_super (mdecl);
9072 if (sdecl == NULL_TREE)
9074 tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (class_type));
9075 tree save = DECL_NAME (mdecl);
9076 const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
9077 DECL_NAME (mdecl) = DECL_NAME (sclass_decl);
9078 parse_error_context
9079 (lookup_cl (TYPE_NAME (class_type)),
9080 "No constructor matching %qs found in class %qs",
9081 lang_printable_name (mdecl, 2), n);
9082 DECL_NAME (mdecl) = save;
9085 if (ANONYMOUS_CLASS_P (class_type))
9087 /* Copy throws clause from the super constructor. */
9088 tree throws = DECL_FUNCTION_THROWS (sdecl);
9089 DECL_FUNCTION_THROWS (mdecl) = copy_list (throws);
9092 /* The constructor body must be crafted by hand. It's the
9093 constructor we defined when we realize we didn't have the
9094 CLASSNAME() constructor */
9095 start_artificial_method_body (mdecl);
9097 /* Insert an assignment to the this$<n> hidden field, if
9098 necessary */
9099 if ((thisn_assign = build_thisn_assign ()))
9100 java_method_add_stmt (mdecl, thisn_assign);
9102 /* We don't generate a super constructor invocation if we're
9103 compiling java.lang.Object. build_super_invocation takes care
9104 of that. */
9105 java_method_add_stmt (mdecl, build_super_invocation (mdecl));
9107 /* FIXME */
9108 if ((iii = build_instinit_invocation (class_type)))
9109 java_method_add_stmt (mdecl, iii);
9111 end_artificial_method_body (mdecl);
9113 /* Search for an explicit constructor invocation */
9114 else
9116 int found = 0;
9117 int invokes_this = 0;
9118 tree main_block = BLOCK_EXPR_BODY (*bodyp);
9120 while (*bodyp)
9122 tree body = *bodyp;
9123 switch (TREE_CODE (body))
9125 case CALL_EXPR:
9126 found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
9127 if (CALL_THIS_CONSTRUCTOR_P (body))
9128 invokes_this = 1;
9129 break;
9130 case COMPOUND_EXPR:
9131 case EXPR_WITH_FILE_LOCATION:
9132 bodyp = &TREE_OPERAND (body, 0);
9133 continue;
9134 case BLOCK:
9135 bodyp = &BLOCK_EXPR_BODY (body);
9136 continue;
9137 default:
9138 break;
9140 break;
9143 /* Generate the assignment to this$<n>, if necessary */
9144 if ((thisn_assign = build_thisn_assign ()))
9145 compound = add_stmt_to_compound (compound, NULL_TREE, thisn_assign);
9147 /* The constructor is missing an invocation of super() */
9148 if (!found)
9149 compound = add_stmt_to_compound (compound, NULL_TREE,
9150 build_super_invocation (mdecl));
9151 /* Explicit super() invocation should take place before the
9152 instance initializer blocks. */
9153 else
9155 compound = add_stmt_to_compound (compound, NULL_TREE, *bodyp);
9156 *bodyp = build_java_empty_stmt ();
9159 DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
9161 /* Insert the instance initializer block right after. */
9162 if (!invokes_this && (iii = build_instinit_invocation (class_type)))
9163 compound = add_stmt_to_compound (compound, NULL_TREE, iii);
9165 /* Fix the constructor main block if we're adding extra stmts */
9166 if (compound)
9168 compound = add_stmt_to_compound (compound, NULL_TREE,
9169 BLOCK_EXPR_BODY (main_block));
9170 BLOCK_EXPR_BODY (main_block) = compound;
9175 /* Browse constructors in the super class, searching for a constructor
9176 that doesn't take any argument. Return the constructor if one is found,
9177 NULL_TREE otherwise. If the current class is an anonymous inner class,
9178 look for something that has the same signature. */
9179 static tree
9180 get_constructor_super (tree mdecl)
9182 tree class = CLASSTYPE_SUPER (current_class);
9183 int super_inner = PURE_INNER_CLASS_TYPE_P (class);
9184 tree sdecl;
9186 if (!class)
9187 return NULL_TREE;
9189 if (ANONYMOUS_CLASS_P (current_class))
9191 tree mdecl_arg_type;
9192 SKIP_THIS_AND_ARTIFICIAL_PARMS (mdecl_arg_type, mdecl);
9193 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
9194 if (DECL_CONSTRUCTOR_P (sdecl))
9196 tree m_arg_type;
9197 tree arg_type = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
9198 if (super_inner)
9199 arg_type = TREE_CHAIN (arg_type);
9200 for (m_arg_type = mdecl_arg_type;
9201 (arg_type != end_params_node
9202 && m_arg_type != end_params_node);
9203 arg_type = TREE_CHAIN (arg_type),
9204 m_arg_type = TREE_CHAIN (m_arg_type))
9205 if (!valid_method_invocation_conversion_p
9206 (TREE_VALUE (arg_type),
9207 TREE_VALUE (m_arg_type)))
9208 break;
9210 if (arg_type == end_params_node && m_arg_type == end_params_node)
9211 return sdecl;
9214 else
9216 for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
9218 tree arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
9219 if (super_inner)
9220 arg = TREE_CHAIN (arg);
9221 if (DECL_CONSTRUCTOR_P (sdecl) && arg == end_params_node)
9222 return sdecl;
9225 return NULL_TREE;
9228 /* Generate code for all context remembered for code generation. */
9230 static GTY(()) tree reversed_class_list;
9231 void
9232 java_expand_classes (void)
9234 int save_error_count = 0;
9235 static struct parser_ctxt *cur_ctxp = NULL;
9236 location_t save_location;
9238 java_parse_abort_on_error ();
9239 if (!(ctxp = ctxp_for_generation))
9240 return;
9241 java_layout_classes ();
9242 java_parse_abort_on_error ();
9243 save_location = input_location;
9245 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9247 tree current;
9248 for (current = cur_ctxp->class_list;
9249 current;
9250 current = TREE_CHAIN (current))
9251 gen_indirect_dispatch_tables (TREE_TYPE (current));
9254 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9256 ctxp = cur_ctxp;
9257 input_location = ctxp->file_start_location;
9258 lang_init_source (2); /* Error msgs have method prototypes */
9259 java_complete_expand_classes (); /* Complete and expand classes */
9260 java_parse_abort_on_error ();
9262 input_location = save_location;
9264 /* Find anonymous classes and expand their constructor. This extra pass is
9265 necessary because the constructor itself is only generated when the
9266 method in which it is defined is expanded. */
9267 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9269 tree current;
9270 ctxp = cur_ctxp;
9271 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9273 output_class = current_class = TREE_TYPE (current);
9274 if (ANONYMOUS_CLASS_P (current_class))
9276 tree d;
9277 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9279 if (DECL_CONSTRUCTOR_P (d))
9281 java_complete_expand_method (d);
9282 break; /* There is only one constructor. */
9289 /* Expanding the constructors of anonymous classes generates access
9290 methods. Scan all the methods looking for null DECL_RESULTs --
9291 this will be the case if a method hasn't been expanded. */
9292 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9294 tree current;
9295 ctxp = cur_ctxp;
9296 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9298 tree d;
9299 output_class = current_class = TREE_TYPE (current);
9300 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9302 if (DECL_RESULT (d) == NULL_TREE)
9303 java_complete_expand_method (d);
9308 /* ??? Instead of all this we could iterate around the list of
9309 classes until there were no more un-expanded methods. It would
9310 take a little longer -- one pass over the whole list of methods
9311 -- but it would be simpler. Like this: */
9312 #if 0
9314 int something_changed;
9318 something_changed = 0;
9319 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9321 tree current;
9322 ctxp = cur_ctxp;
9323 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9325 tree d;
9326 output_class = current_class = TREE_TYPE (current);
9327 for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9329 if (DECL_RESULT (d) == NULL_TREE)
9331 something_changed = 1;
9332 java_complete_expand_method (d);
9338 while (something_changed);
9340 #endif
9342 /* If we've found error at that stage, don't try to generate
9343 anything, unless we're checking the syntax only
9344 (but not using -fsyntax-only for the purpose of generating
9345 bytecode). */
9346 if (java_error_count
9347 && (!flag_syntax_only && !flag_emit_class_files))
9348 return;
9350 /* Now things are stable, go for generation of the class data. */
9352 /* We pessimistically marked all methods and fields external until
9353 we knew what set of classes we were planning to compile. Now mark
9354 those that will be generated locally as not external. */
9355 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9357 tree current;
9358 ctxp = cur_ctxp;
9359 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9360 java_mark_class_local (TREE_TYPE (current));
9363 /* Compile the classes. */
9364 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9366 tree current;
9367 reversed_class_list = NULL;
9369 ctxp = cur_ctxp;
9371 /* We write out the classes in reverse order. This ensures that
9372 inner classes are written before their containing classes,
9373 which is important for parallel builds. Otherwise, the
9374 class file for the outer class may be found, but the class
9375 file for the inner class may not be present. In that
9376 situation, the compiler cannot fall back to the original
9377 source, having already read the outer class, so we must
9378 prevent that situation. */
9379 for (current = ctxp->class_list;
9380 current;
9381 current = TREE_CHAIN (current))
9382 reversed_class_list
9383 = tree_cons (NULL_TREE, current, reversed_class_list);
9385 for (current = reversed_class_list;
9386 current;
9387 current = TREE_CHAIN (current))
9389 output_class = current_class = TREE_TYPE (TREE_VALUE (current));
9390 if (flag_emit_class_files)
9391 write_classfile (current_class);
9392 else if (! flag_syntax_only)
9393 java_expand_method_bodies (current_class);
9398 void
9399 java_finish_classes (void)
9401 static struct parser_ctxt *cur_ctxp = NULL;
9402 for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9404 tree current;
9405 ctxp = cur_ctxp;
9406 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9408 output_class = current_class = TREE_TYPE (current);
9409 finish_class ();
9414 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
9415 a tree list node containing RIGHT. Fore coming RIGHTs will be
9416 chained to this hook. LOCATION contains the location of the
9417 separating `.' operator. */
9419 static tree
9420 make_qualified_primary (tree primary, tree right, int location)
9422 tree wfl;
9424 if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
9425 wfl = build_wfl_wrap (primary, location);
9426 else
9428 wfl = primary;
9429 /* If wfl wasn't qualified, we build a first anchor */
9430 if (!EXPR_WFL_QUALIFICATION (wfl))
9431 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (wfl, NULL_TREE);
9434 /* And chain them */
9435 EXPR_WFL_LINECOL (right) = location;
9436 chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
9437 PRIMARY_P (wfl) = 1;
9438 return wfl;
9441 /* Simple merge of two name separated by a `.' */
9443 static tree
9444 merge_qualified_name (tree left, tree right)
9446 tree node;
9447 if (!left && !right)
9448 return NULL_TREE;
9450 if (!left)
9451 return right;
9453 if (!right)
9454 return left;
9456 obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
9457 IDENTIFIER_LENGTH (left));
9458 obstack_1grow (&temporary_obstack, '.');
9459 obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
9460 IDENTIFIER_LENGTH (right));
9461 node = get_identifier (obstack_base (&temporary_obstack));
9462 obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
9463 QUALIFIED_P (node) = 1;
9464 return node;
9467 /* Merge the two parts of a qualified name into LEFT. Set the
9468 location information of the resulting node to LOCATION, usually
9469 inherited from the location information of the `.' operator. */
9471 static tree
9472 make_qualified_name (tree left, tree right,
9473 #ifdef USE_MAPPED_LOCATION
9474 source_location location
9475 #else
9476 int location
9477 #endif
9480 #ifdef USE_COMPONENT_REF
9481 tree node = build3 (COMPONENT_REF, NULL_TREE, left, right, NULL_TREE);
9482 SET_EXPR_LOCATION (node, location);
9483 return node;
9484 #else
9485 tree left_id = EXPR_WFL_NODE (left);
9486 tree right_id = EXPR_WFL_NODE (right);
9487 tree wfl, merge;
9489 merge = merge_qualified_name (left_id, right_id);
9491 /* Left wasn't qualified and is now qualified */
9492 #ifdef USE_MAPPED_LOCATION
9493 if (!QUALIFIED_P (left_id))
9495 tree wfl = build_expr_wfl (left_id, EXPR_LOCATION (left));
9496 EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
9499 wfl = build_expr_wfl (right_id, location);
9500 #else
9501 if (!QUALIFIED_P (left_id))
9503 tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
9504 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
9505 EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
9508 wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
9509 EXPR_WFL_LINECOL (wfl) = location;
9510 #endif
9511 chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
9512 EXPR_WFL_NODE (left) = merge;
9513 return left;
9514 #endif
9517 /* Extract the last identifier component of the qualified in WFL. The
9518 last identifier is removed from the linked list */
9520 static tree
9521 cut_identifier_in_qualified (tree wfl)
9523 tree q;
9524 tree previous = NULL_TREE;
9525 for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
9526 if (!TREE_CHAIN (q))
9528 if (!previous)
9529 /* Operating on a non qualified qualified WFL. */
9530 abort ();
9532 TREE_CHAIN (previous) = NULL_TREE;
9533 return TREE_PURPOSE (q);
9537 /* Resolve the expression name NAME. Return its decl. */
9539 static tree
9540 resolve_expression_name (tree id, tree *orig)
9542 tree name = EXPR_WFL_NODE (id);
9543 tree decl;
9545 /* 6.5.5.1: Simple expression names */
9546 if (!PRIMARY_P (id) && !QUALIFIED_P (name))
9548 /* 15.13.1: NAME can appear within the scope of a local variable
9549 declaration */
9550 if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
9551 return decl;
9553 /* 15.13.1: NAME can appear within a class declaration */
9554 else
9556 decl = lookup_field_wrapper (current_class, name);
9557 if (decl)
9559 tree access = NULL_TREE;
9560 int fs = FIELD_STATIC (decl);
9562 /* If we're accessing an outer scope local alias, make
9563 sure we change the name of the field we're going to
9564 build access to. */
9565 if (FIELD_LOCAL_ALIAS_USED (decl))
9566 name = DECL_NAME (decl);
9568 check_deprecation (id, decl);
9570 /* Instance variable (8.3.1.1) can't appear within
9571 static method, static initializer or initializer for
9572 a static variable. */
9573 if (!fs && METHOD_STATIC (current_function_decl))
9575 static_ref_err (id, name, current_class);
9576 return error_mark_node;
9578 /* Instance variables can't appear as an argument of
9579 an explicit constructor invocation */
9580 if (!fs && ctxp->explicit_constructor_p
9581 && !enclosing_context_p (DECL_CONTEXT (decl), current_class))
9583 parse_error_context
9584 (id, "Can't reference %qs before the superclass constructor has been called", IDENTIFIER_POINTER (name));
9585 return error_mark_node;
9588 /* If we're processing an inner class and we're trying
9589 to access a field belonging to an outer class, build
9590 the access to the field.
9591 As usual, we have to treat initialized static final
9592 variables as a special case. */
9593 if (nested_member_access_p (current_class, decl)
9594 && ! (JDECL_P (decl) && CLASS_FINAL_VARIABLE_P (decl)
9595 && DECL_INITIAL (decl) != NULL_TREE
9596 && (JSTRING_TYPE_P (TREE_TYPE (decl))
9597 || JNUMERIC_TYPE_P (TREE_TYPE (decl)))
9598 && TREE_CONSTANT (DECL_INITIAL (decl))))
9600 if (!fs && CLASS_STATIC (TYPE_NAME (current_class)))
9602 static_ref_err (id, DECL_NAME (decl), current_class);
9603 return error_mark_node;
9605 access = build_nested_field_access (id, decl);
9606 if (orig)
9607 *orig = access;
9608 return access;
9611 /* Otherwise build what it takes to access the field */
9612 access = build_field_ref ((fs ? NULL_TREE : current_this),
9613 DECL_CONTEXT (decl), name);
9614 if (fs)
9615 access = maybe_build_class_init_for_field (decl, access);
9616 /* We may be asked to save the real field access node */
9617 if (orig)
9618 *orig = access;
9619 /* Last check: can we access the field? */
9620 if (not_accessible_p (current_class, decl, NULL_TREE, 0))
9622 not_accessible_field_error (id, decl);
9623 return error_mark_node;
9625 /* And we return what we got */
9626 return access;
9628 /* Fall down to error report on undefined variable */
9631 /* 6.5.5.2 Qualified Expression Names */
9632 else
9634 if (orig)
9635 *orig = NULL_TREE;
9636 qualify_ambiguous_name (id);
9637 /* 15.10.1 Field Access Using a Primary and/or Expression Name */
9638 /* 15.10.2: Accessing Superclass Members using super */
9639 return resolve_field_access (id, orig, NULL);
9642 /* We've got an error here */
9643 if (INNER_CLASS_TYPE_P (current_class))
9644 parse_error_context (id,
9645 "Local variable %qs can't be accessed from within the inner class %qs unless it is declared final",
9646 IDENTIFIER_POINTER (name),
9647 IDENTIFIER_POINTER (DECL_NAME
9648 (TYPE_NAME (current_class))));
9649 else
9650 parse_error_context (id, "Undefined variable %qs",
9651 IDENTIFIER_POINTER (name));
9653 return error_mark_node;
9656 static void
9657 static_ref_err (tree wfl, tree field_id, tree class_type)
9659 parse_error_context
9660 (wfl,
9661 "Can't make a static reference to nonstatic variable %qs in class %qs",
9662 IDENTIFIER_POINTER (field_id),
9663 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
9666 /* 15.10.1 Field Access Using a Primary and/or Expression Name.
9667 We return something suitable to generate the field access. We also
9668 return the field decl in FIELD_DECL and its type in FIELD_TYPE. If
9669 recipient's address can be null. */
9671 static tree
9672 resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
9674 int is_static = 0;
9675 tree field_ref;
9676 tree decl = NULL_TREE, where_found, type_found;
9678 if (resolve_qualified_expression_name (qual_wfl, &decl,
9679 &where_found, &type_found))
9680 return error_mark_node;
9682 /* Resolve the LENGTH field of an array here */
9683 if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node
9684 && type_found && TYPE_ARRAY_P (type_found)
9685 && ! flag_emit_class_files)
9687 tree length = build_java_array_length_access (where_found);
9688 field_ref = length;
9690 /* In case we're dealing with a static array, we need to
9691 initialize its class before the array length can be fetched. */
9692 if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
9694 build_static_field_ref (where_found);
9695 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9698 /* We might have been trying to resolve field.method(). In which
9699 case, the resolution is over and decl is the answer */
9700 else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
9701 field_ref = decl;
9702 else if (JDECL_P (decl))
9704 if (!type_found)
9705 type_found = DECL_CONTEXT (decl);
9706 is_static = FIELD_STATIC (decl);
9707 field_ref = build_field_ref ((is_static ?
9708 NULL_TREE : where_found),
9709 type_found, DECL_NAME (decl));
9710 if (field_ref == error_mark_node)
9711 return error_mark_node;
9712 if (is_static)
9713 field_ref = maybe_build_class_init_for_field (decl, field_ref);
9715 /* If we're looking at a static field, we may need to generate a
9716 class initialization for it. This can happen when the access
9717 looks like `field.ref', where `field' is a static field in an
9718 interface we implement. */
9719 if (!flag_emit_class_files
9720 && TREE_CODE (where_found) == VAR_DECL
9721 && FIELD_STATIC (where_found))
9723 build_static_field_ref (where_found);
9724 field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9727 else
9728 field_ref = decl;
9730 if (field_decl)
9731 *field_decl = decl;
9732 if (field_type)
9733 *field_type = (QUAL_DECL_TYPE (decl) ?
9734 QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
9735 return field_ref;
9738 /* If NODE is an access to a static field, strip out the class
9739 initialization part and return the field decl, otherwise, return
9740 NODE. */
9742 tree
9743 extract_field_decl (tree node)
9745 if (TREE_CODE (node) == COMPOUND_EXPR)
9747 tree op1 = TREE_OPERAND (node, 1);
9748 if (TREE_CODE (op1) == COMPOUND_EXPR)
9750 tree call = TREE_OPERAND (op1, 0);
9751 if (TREE_CODE (call) == CALL_EXPR
9752 && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
9753 && (TREE_OPERAND (TREE_OPERAND (call, 0), 0)
9754 == soft_initclass_node))
9755 return TREE_OPERAND (op1, 1);
9757 else if (JDECL_P (op1))
9758 return op1;
9760 return node;
9763 /* 6.5.5.2: Qualified Expression Names */
9765 static int
9766 resolve_qualified_expression_name (tree wfl, tree *found_decl,
9767 tree *where_found, tree *type_found)
9769 int from_type = 0; /* Field search initiated from a type */
9770 int from_super = 0, from_cast = 0, from_qualified_this = 0;
9771 int previous_call_static = 0;
9772 int is_static;
9773 tree decl = NULL_TREE, type = NULL_TREE, q;
9774 /* For certain for of inner class instantiation */
9775 tree saved_current, saved_this;
9776 #define RESTORE_THIS_AND_CURRENT_CLASS \
9777 { current_class = saved_current; current_this = saved_this;}
9779 *type_found = *where_found = NULL_TREE;
9781 for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
9783 tree qual_wfl = QUAL_WFL (q);
9784 tree ret_decl; /* for EH checking */
9785 #ifdef USE_MAPPED_LOCATION
9786 source_location location; /* for EH checking */
9787 #else
9788 int location; /* for EH checking */
9789 #endif
9791 /* 15.10.1 Field Access Using a Primary */
9792 switch (TREE_CODE (qual_wfl))
9794 case CALL_EXPR:
9795 case NEW_CLASS_EXPR:
9796 /* If the access to the function call is a non static field,
9797 build the code to access it. */
9798 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9800 decl = maybe_access_field (decl, *where_found,
9801 DECL_CONTEXT (decl));
9802 if (decl == error_mark_node)
9803 return 1;
9806 /* And code for the function call */
9807 if (complete_function_arguments (qual_wfl))
9808 return 1;
9810 /* We might have to setup a new current class and a new this
9811 for the search of an inner class, relative to the type of
9812 a expression resolved as `decl'. The current values are
9813 saved and restored shortly after */
9814 saved_current = current_class;
9815 saved_this = current_this;
9816 if (decl
9817 && (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9818 || from_qualified_this))
9820 /* If we still have `from_qualified_this', we have the form
9821 <T>.this.f() and we need to build <T>.this */
9822 if (from_qualified_this)
9824 decl = build_access_to_thisn (current_class, type, 0);
9825 decl = java_complete_tree (decl);
9826 type = TREE_TYPE (TREE_TYPE (decl));
9828 current_class = type;
9829 current_this = decl;
9830 from_qualified_this = 0;
9833 if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
9834 CALL_USING_SUPER (qual_wfl) = 1;
9835 #ifdef USE_MAPPED_LOCATION
9836 location = (TREE_CODE (qual_wfl) == CALL_EXPR
9837 ? EXPR_LOCATION (TREE_OPERAND (qual_wfl, 0))
9838 : UNKNOWN_LOCATION);
9839 #else
9840 location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
9841 EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
9842 #endif
9843 *where_found = patch_method_invocation (qual_wfl, decl, type,
9844 from_super,
9845 &is_static, &ret_decl);
9846 from_super = 0;
9847 if (*where_found == error_mark_node)
9849 RESTORE_THIS_AND_CURRENT_CLASS;
9850 return 1;
9852 *type_found = type = QUAL_DECL_TYPE (*where_found);
9854 *where_found = force_evaluation_order (*where_found);
9856 /* If we're creating an inner class instance, check for that
9857 an enclosing instance is in scope */
9858 if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9859 && INNER_ENCLOSING_SCOPE_CHECK (type))
9861 parse_error_context
9862 (qual_wfl, "No enclosing instance for inner class %qs is in scope%s",
9863 lang_printable_name (type, 0),
9864 (!current_this ? "" :
9865 "; an explicit one must be provided when creating this inner class"));
9866 RESTORE_THIS_AND_CURRENT_CLASS;
9867 return 1;
9870 /* In case we had to change then to resolve a inner class
9871 instantiation using a primary qualified by a `new' */
9872 RESTORE_THIS_AND_CURRENT_CLASS;
9874 #ifdef USE_MAPPED_LOCATION
9875 if (location != UNKNOWN_LOCATION)
9876 #else
9877 if (location)
9878 #endif
9880 tree arguments = NULL_TREE;
9881 if (TREE_CODE (qual_wfl) == CALL_EXPR
9882 && TREE_OPERAND (qual_wfl, 1) != NULL_TREE)
9883 arguments = TREE_VALUE (TREE_OPERAND (qual_wfl, 1));
9884 check_thrown_exceptions (location, ret_decl, arguments);
9887 /* If the previous call was static and this one is too,
9888 build a compound expression to hold the two (because in
9889 that case, previous function calls aren't transported as
9890 forcoming function's argument. */
9891 if (previous_call_static && is_static)
9893 /* We must set CAN_COMPLETE_NORMALLY for the first call
9894 since it is done nowhere else. */
9895 CAN_COMPLETE_NORMALLY (decl) = 1;
9896 decl = build2 (COMPOUND_EXPR, TREE_TYPE (*where_found),
9897 decl, *where_found);
9898 TREE_SIDE_EFFECTS (decl) = 1;
9900 else
9902 previous_call_static = is_static;
9903 decl = *where_found;
9905 from_type = 0;
9906 continue;
9908 case NEW_ARRAY_EXPR:
9909 case NEW_ANONYMOUS_ARRAY_EXPR:
9910 *where_found = decl = java_complete_tree (qual_wfl);
9911 if (decl == error_mark_node)
9912 return 1;
9913 *type_found = type = QUAL_DECL_TYPE (decl);
9914 continue;
9916 case CONVERT_EXPR:
9917 *where_found = decl = java_complete_tree (qual_wfl);
9918 if (decl == error_mark_node)
9919 return 1;
9920 *type_found = type = QUAL_DECL_TYPE (decl);
9921 from_cast = 1;
9922 continue;
9924 case CONDITIONAL_EXPR:
9925 case STRING_CST:
9926 case MODIFY_EXPR:
9927 *where_found = decl = java_complete_tree (qual_wfl);
9928 if (decl == error_mark_node)
9929 return 1;
9930 *type_found = type = QUAL_DECL_TYPE (decl);
9931 continue;
9933 case ARRAY_REF:
9934 /* If the access to the function call is a non static field,
9935 build the code to access it. */
9936 if (JDECL_P (decl) && !FIELD_STATIC (decl))
9938 decl = maybe_access_field (decl, *where_found, type);
9939 if (decl == error_mark_node)
9940 return 1;
9942 /* And code for the array reference expression */
9943 decl = java_complete_tree (qual_wfl);
9944 if (decl == error_mark_node)
9945 return 1;
9946 type = QUAL_DECL_TYPE (decl);
9947 continue;
9949 case PLUS_EXPR:
9950 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9951 return 1;
9952 if ((type = patch_string (decl)))
9953 decl = type;
9954 *where_found = QUAL_RESOLUTION (q) = decl;
9955 *type_found = type = TREE_TYPE (decl);
9956 break;
9958 case CLASS_LITERAL:
9959 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9960 return 1;
9961 *where_found = QUAL_RESOLUTION (q) = decl;
9962 *type_found = type = TREE_TYPE (decl);
9963 break;
9965 default:
9966 /* Fix for -Wall Just go to the next statement. Don't
9967 continue */
9968 break;
9971 /* If we fall here, we weren't processing a (static) function call. */
9972 previous_call_static = 0;
9974 /* It can be the keyword THIS */
9975 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9976 && EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
9978 if (!current_this)
9980 parse_error_context
9981 (wfl, "Keyword %<this%> used outside allowed context");
9982 return 1;
9984 if (ctxp->explicit_constructor_p
9985 && type == current_class)
9987 parse_error_context (wfl, "Can't reference %<this%> before the superclass constructor has been called");
9988 return 1;
9990 /* We have to generate code for intermediate access */
9991 if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type)
9993 *where_found = decl = current_this;
9994 *type_found = type = QUAL_DECL_TYPE (decl);
9996 /* We're trying to access the this from somewhere else. Make sure
9997 it's allowed before doing so. */
9998 else
10000 if (!enclosing_context_p (type, current_class))
10002 char *p = xstrdup (lang_printable_name (type, 0));
10003 parse_error_context (qual_wfl, "Can't use variable %<%s.this%>: type %qs isn't an outer type of type %qs",
10004 p, p,
10005 lang_printable_name (current_class, 0));
10006 free (p);
10007 return 1;
10009 from_qualified_this = 1;
10010 /* If there's nothing else after that, we need to
10011 produce something now, otherwise, the section of the
10012 code that needs to produce <T>.this will generate
10013 what is necessary. */
10014 if (!TREE_CHAIN (q))
10016 decl = build_access_to_thisn (current_class, type, 0);
10017 *where_found = decl = java_complete_tree (decl);
10018 *type_found = type = TREE_TYPE (decl);
10022 from_type = 0;
10023 continue;
10026 /* 15.10.2 Accessing Superclass Members using SUPER */
10027 if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
10028 && EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
10030 tree node;
10031 /* Check on the restricted use of SUPER */
10032 if (METHOD_STATIC (current_function_decl)
10033 || current_class == object_type_node)
10035 parse_error_context
10036 (wfl, "Keyword %<super%> used outside allowed context");
10037 return 1;
10039 /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
10040 node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
10041 CLASSTYPE_SUPER (current_class),
10042 build_this (EXPR_WFL_LINECOL (qual_wfl)));
10043 *where_found = decl = java_complete_tree (node);
10044 if (decl == error_mark_node)
10045 return 1;
10046 *type_found = type = QUAL_DECL_TYPE (decl);
10047 from_super = from_type = 1;
10048 continue;
10051 /* 15.13.1: Can't search for field name in packages, so we
10052 assume a variable/class name was meant. */
10053 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
10055 tree name;
10056 if ((decl = resolve_package (wfl, &q, &name)))
10058 tree list;
10059 *where_found = decl;
10061 check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
10063 /* We want to be absolutely sure that the class is laid
10064 out. We're going to search something inside it. */
10065 *type_found = type = TREE_TYPE (decl);
10066 layout_class (type);
10067 from_type = 1;
10069 /* Fix them all the way down, if any are left. */
10070 if (q)
10072 list = TREE_CHAIN (q);
10073 while (list)
10075 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (list)) = 0;
10076 list = TREE_CHAIN (list);
10080 else
10082 if (from_super || from_cast)
10083 parse_error_context
10084 ((from_cast ? qual_wfl : wfl),
10085 "No variable %qs defined in class %qs",
10086 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
10087 lang_printable_name (type, 0));
10088 else
10089 parse_error_context
10090 (qual_wfl, "Undefined variable or class name: %qs",
10091 IDENTIFIER_POINTER (name));
10092 return 1;
10096 /* We have a type name. It's been already resolved when the
10097 expression was qualified. */
10098 else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q))
10100 decl = QUAL_RESOLUTION (q);
10102 /* Sneak preview. If next we see a `new', we're facing a
10103 qualification which resulted in a type being selected
10104 instead of a field. Report the error. */
10105 if(TREE_CHAIN (q)
10106 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR)
10108 parse_error_context (qual_wfl, "Undefined variable %qs",
10109 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10110 return 1;
10113 check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
10115 check_deprecation (qual_wfl, decl);
10117 type = TREE_TYPE (decl);
10118 from_type = 1;
10120 /* We resolve an expression name */
10121 else
10123 tree field_decl = NULL_TREE;
10125 /* If there exists an early resolution, use it. That occurs
10126 only once and we know that there are more things to
10127 come. Don't do that when processing something after SUPER
10128 (we need more thing to be put in place below */
10129 if (!from_super && QUAL_RESOLUTION (q))
10131 decl = QUAL_RESOLUTION (q);
10132 if (!type)
10134 if (TREE_CODE (decl) == FIELD_DECL
10135 || TREE_CODE (decl) == VAR_DECL)
10137 if (TREE_CODE (decl) == FIELD_DECL
10138 && !FIELD_STATIC (decl))
10140 if (current_this)
10141 *where_found = current_this;
10142 else
10144 static_ref_err (qual_wfl, DECL_NAME (decl),
10145 current_class);
10146 return 1;
10149 else
10151 *where_found = TREE_TYPE (decl);
10152 if (TREE_CODE (*where_found) == POINTER_TYPE)
10153 *where_found = TREE_TYPE (*where_found);
10155 if (nested_member_access_p (current_class, decl))
10156 decl = build_nested_field_access (qual_wfl, decl);
10158 else
10160 *where_found = TREE_TYPE (decl);
10161 if (TREE_CODE (*where_found) == POINTER_TYPE)
10162 *where_found = TREE_TYPE (*where_found);
10167 /* Report and error if we're using a numerical literal as a
10168 qualifier. It can only be an INTEGER_CST. */
10169 else if (TREE_CODE (qual_wfl) == INTEGER_CST)
10171 parse_error_context
10172 (wfl, "Can't use type %qs as a qualifier",
10173 lang_printable_name (TREE_TYPE (qual_wfl), 0));
10174 return 1;
10177 /* We have to search for a field, knowing the type of its
10178 container. The flag FROM_TYPE indicates that we resolved
10179 the last member of the expression as a type name, which
10180 means that for the resolution of this field, we'll look
10181 for other errors than if it was resolved as a member of
10182 an other field. */
10183 else
10185 int is_static;
10186 tree field_decl_type; /* For layout */
10188 if (!from_type && !JREFERENCE_TYPE_P (type))
10190 parse_error_context
10191 (qual_wfl, "Attempt to reference field %qs in %<%s %s%>",
10192 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
10193 lang_printable_name (type, 0),
10194 IDENTIFIER_POINTER (DECL_NAME (decl)));
10195 return 1;
10198 field_decl = lookup_field_wrapper (type,
10199 EXPR_WFL_NODE (qual_wfl));
10201 /* Maybe what we're trying to access to is an inner
10202 class, only if decl is a TYPE_DECL. */
10203 if (!field_decl && TREE_CODE (decl) == TYPE_DECL)
10205 tree ptr, inner_decl;
10207 BUILD_PTR_FROM_NAME (ptr, EXPR_WFL_NODE (qual_wfl));
10208 inner_decl = resolve_class (decl, ptr, NULL_TREE, qual_wfl);
10209 if (inner_decl)
10211 check_inner_class_access (inner_decl, decl, qual_wfl);
10212 type = TREE_TYPE (inner_decl);
10213 decl = inner_decl;
10214 from_type = 1;
10215 continue;
10219 if (field_decl == NULL_TREE)
10221 parse_error_context
10222 (qual_wfl, "No variable %qs defined in type %qs",
10223 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
10224 GET_TYPE_NAME (type));
10225 return 1;
10227 if (field_decl == error_mark_node)
10228 return 1;
10230 /* Layout the type of field_decl, since we may need
10231 it. Don't do primitive types or loaded classes. The
10232 situation of non primitive arrays may not handled
10233 properly here. FIXME */
10234 if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
10235 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
10236 else
10237 field_decl_type = TREE_TYPE (field_decl);
10238 if (!JPRIMITIVE_TYPE_P (field_decl_type)
10239 && !CLASS_LOADED_P (field_decl_type)
10240 && !TYPE_ARRAY_P (field_decl_type))
10241 resolve_and_layout (field_decl_type, NULL_TREE);
10243 /* Check on accessibility here */
10244 if (not_accessible_p (current_class, field_decl,
10245 *type_found, from_super))
10246 return not_accessible_field_error (qual_wfl,field_decl);
10247 check_deprecation (qual_wfl, field_decl);
10249 /* There are things to check when fields are accessed
10250 from type. There are no restrictions on a static
10251 declaration of the field when it is accessed from an
10252 interface */
10253 is_static = FIELD_STATIC (field_decl);
10254 if (!from_super && from_type
10255 && !TYPE_INTERFACE_P (type)
10256 && !is_static
10257 && (current_function_decl
10258 && METHOD_STATIC (current_function_decl)))
10260 static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
10261 return 1;
10263 from_cast = from_super = 0;
10265 /* If it's an access from a type but isn't static, we
10266 make it relative to `this'. */
10267 if (!is_static && from_type)
10268 decl = current_this;
10270 /* If we need to generate something to get a proper
10271 handle on what this field is accessed from, do it
10272 now. */
10273 if (!is_static)
10275 decl = maybe_access_field (decl, *where_found, *type_found);
10276 if (decl == error_mark_node)
10277 return 1;
10280 /* We want to keep the location where we found it, and the
10281 type we found. */
10282 *where_found = decl;
10283 *type_found = type;
10285 /* Generate the correct expression for field access from
10286 qualified this */
10287 if (from_qualified_this)
10289 field_decl
10290 = build_nested_field_access (qual_wfl, field_decl);
10291 from_qualified_this = 0;
10294 /* If needed, generate accessors for static field access. */
10295 if (is_static
10296 && FIELD_PRIVATE (field_decl)
10297 && flag_emit_class_files
10298 && nested_member_access_p (current_class, field_decl))
10299 field_decl = build_nested_field_access (qual_wfl, field_decl);
10301 /* This is the decl found and eventually the next one to
10302 search from */
10303 decl = field_decl;
10305 from_type = 0;
10306 type = QUAL_DECL_TYPE (decl);
10308 /* Sneak preview. If decl is qualified by a `new', report
10309 the error here to be accurate on the peculiar construct */
10310 if (TREE_CHAIN (q)
10311 && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR
10312 && !JREFERENCE_TYPE_P (type))
10314 parse_error_context (qual_wfl, "Attempt to reference field %<new%> in a %qs",
10315 lang_printable_name (type, 0));
10316 return 1;
10319 /* `q' might have changed due to a after package resolution
10320 re-qualification */
10321 if (!q)
10322 break;
10324 *found_decl = decl;
10325 return 0;
10328 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
10329 can't be accessed from REFERENCE (a record type). If MEMBER
10330 features a protected access, we then use WHERE which, if non null,
10331 holds the type of MEMBER's access that is checked against
10332 6.6.2.1. This function should be used when decl is a field or a
10333 method. */
10335 static int
10336 not_accessible_p (tree reference, tree member, tree where, int from_super)
10338 int access_flag = get_access_flags_from_decl (member);
10339 bool is_static = false;
10341 if (TREE_CODE (member) == FIELD_DECL ||
10342 TREE_CODE (member) == VAR_DECL)
10343 is_static = FIELD_STATIC (member);
10344 else
10345 is_static = METHOD_STATIC (member);
10347 /* Access always granted for members declared public */
10348 if (access_flag & ACC_PUBLIC)
10349 return 0;
10351 /* Check access on protected members */
10352 if (access_flag & ACC_PROTECTED)
10354 /* Access granted if it occurs from within the package
10355 containing the class in which the protected member is
10356 declared */
10357 if (class_in_current_package (DECL_CONTEXT (member)))
10358 return 0;
10360 /* If accessed with the form `super.member', then access is granted */
10361 if (from_super)
10362 return 0;
10364 /* If WHERE is active, access was made through a qualifier. For
10365 non-static members, access is granted if the type of the qualifier
10366 is or is a sublass of the type the access is made from (6.6.2.1.) */
10367 if (where && !is_static)
10369 while (reference)
10371 if (inherits_from_p (where, reference))
10372 return 0;
10373 if (INNER_CLASS_TYPE_P (reference))
10374 reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10375 else
10376 break;
10378 return 1;
10381 /* Otherwise, access is granted if occurring from within the class
10382 where member is declared, or a subclass of it. */
10383 while (reference)
10385 if (inherits_from_p (reference, DECL_CONTEXT (member)))
10386 return 0;
10387 if (INNER_CLASS_TYPE_P (reference))
10388 reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10389 else
10390 break;
10392 return 1;
10395 /* Check access on private members. Access is granted only if it
10396 occurs from within the class in which it is declared -- that does
10397 it for innerclasses too. */
10398 if (access_flag & ACC_PRIVATE)
10400 if (reference == DECL_CONTEXT (member) ||
10401 common_enclosing_context_p (DECL_CONTEXT (member), reference))
10402 return 0;
10403 return 1;
10406 /* Default access is permitted only when occurring from within the
10407 package in which the context (MEMBER) is declared. */
10408 return !class_in_current_package (DECL_CONTEXT (member));
10411 /* Test deprecated decl access. */
10412 static void
10413 check_deprecation (tree wfl, tree decl)
10415 const char *file;
10416 tree elt;
10418 if (! warn_deprecated)
10419 return;
10421 /* We want to look at the element type of arrays here, so we strip
10422 all surrounding array types. */
10423 if (TYPE_ARRAY_P (TREE_TYPE (decl)))
10425 elt = TREE_TYPE (decl);
10426 while (TYPE_ARRAY_P (elt))
10427 elt = TYPE_ARRAY_ELEMENT (elt);
10428 /* We'll end up with a pointer type, so we use TREE_TYPE to go
10429 to the record. */
10430 decl = TYPE_NAME (TREE_TYPE (elt));
10432 file = DECL_SOURCE_FILE (decl);
10434 /* Complain if the field is deprecated and the file it was defined
10435 in isn't compiled at the same time the file which contains its
10436 use is */
10437 if (DECL_DEPRECATED (decl)
10438 && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
10440 const char *the;
10441 switch (TREE_CODE (decl))
10443 case FUNCTION_DECL:
10444 the = "method";
10445 break;
10446 case FIELD_DECL:
10447 case VAR_DECL:
10448 the = "field";
10449 break;
10450 case TYPE_DECL:
10451 parse_warning_context (wfl, "The class %qs has been deprecated",
10452 IDENTIFIER_POINTER (DECL_NAME (decl)));
10453 return;
10454 default:
10455 abort ();
10457 /* Don't issue a message if the context as been deprecated as a
10458 whole. */
10459 if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl))))
10460 parse_warning_context
10461 (wfl, "The %s %qs in class %qs has been deprecated",
10462 the, lang_printable_name (decl, 0),
10463 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
10467 /* Returns 1 if class was declared in the current package, 0 otherwise */
10469 static int
10470 class_in_current_package (tree class)
10472 if (TYPE_PACKAGE (current_class) == TYPE_PACKAGE (class))
10473 return 1;
10474 return 0;
10477 /* This function may generate code to access DECL from WHERE. This is
10478 done only if certain conditions meet. */
10480 static tree
10481 maybe_access_field (tree decl, tree where, tree type)
10483 if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
10484 && !FIELD_STATIC (decl))
10485 decl = build_field_ref (where ? where : current_this,
10486 (type ? type : DECL_CONTEXT (decl)),
10487 DECL_NAME (decl));
10488 return decl;
10491 /* Build a method invocation, by patching PATCH. If non NULL
10492 and according to the situation, PRIMARY and WHERE may be
10493 used. IS_STATIC is set to 1 if the invoked function is static. */
10495 static tree
10496 patch_method_invocation (tree patch, tree primary, tree where, int from_super,
10497 int *is_static, tree *ret_decl)
10499 tree wfl = TREE_OPERAND (patch, 0);
10500 tree args = TREE_OPERAND (patch, 1);
10501 tree name = EXPR_WFL_NODE (wfl);
10502 tree list;
10503 int is_static_flag = 0;
10504 int is_super_init = 0;
10505 tree this_arg = NULL_TREE;
10506 int is_array_clone_call = 0;
10508 /* Should be overridden if everything goes well. Otherwise, if
10509 something fails, it should keep this value. It stop the
10510 evaluation of a bogus assignment. See java_complete_tree,
10511 MODIFY_EXPR: for the reasons why we sometimes want to keep on
10512 evaluating an assignment */
10513 TREE_TYPE (patch) = error_mark_node;
10515 /* Since lookup functions are messing with line numbers, save the
10516 context now. */
10517 java_parser_context_save_global ();
10519 /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
10521 /* Resolution of qualified name, excluding constructors */
10522 if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
10524 tree identifier, identifier_wfl, type, resolved;
10525 /* Extract the last IDENTIFIER of the qualified
10526 expression. This is a wfl and we will use it's location
10527 data during error report. */
10528 identifier_wfl = cut_identifier_in_qualified (wfl);
10529 identifier = EXPR_WFL_NODE (identifier_wfl);
10531 /* Given the context, IDENTIFIER is syntactically qualified
10532 as a MethodName. We need to qualify what's before */
10533 qualify_ambiguous_name (wfl);
10534 resolved = resolve_field_access (wfl, NULL, NULL);
10536 if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved)
10537 && FIELD_FINAL (resolved)
10538 && !inherits_from_p (DECL_CONTEXT (resolved), current_class)
10539 && !flag_emit_class_files)
10540 resolved = build_class_init (DECL_CONTEXT (resolved), resolved);
10542 if (resolved == error_mark_node)
10543 PATCH_METHOD_RETURN_ERROR ();
10545 type = GET_SKIP_TYPE (resolved);
10546 resolve_and_layout (type, NULL_TREE);
10548 if (JPRIMITIVE_TYPE_P (type))
10550 parse_error_context
10551 (identifier_wfl,
10552 "Can't invoke a method on primitive type %qs",
10553 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10554 PATCH_METHOD_RETURN_ERROR ();
10557 list = lookup_method_invoke (0, identifier_wfl, type, identifier, args);
10558 args = nreverse (args);
10560 /* We're resolving a call from a type */
10561 if (TREE_CODE (resolved) == TYPE_DECL)
10563 if (CLASS_INTERFACE (resolved))
10565 parse_error_context
10566 (identifier_wfl,
10567 "Can't make static reference to method %qs in interface %qs",
10568 IDENTIFIER_POINTER (identifier),
10569 IDENTIFIER_POINTER (name));
10570 PATCH_METHOD_RETURN_ERROR ();
10572 if (list)
10574 if (METHOD_STATIC (list))
10575 maybe_use_access_method (0, &list, NULL);
10576 else
10578 char *fct_name = xstrdup (lang_printable_name (list, 2));
10579 parse_error_context
10580 (identifier_wfl,
10581 "Can't make static reference to method %<%s %s%> in class %qs",
10582 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
10583 fct_name,
10584 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10585 free (fct_name);
10586 PATCH_METHOD_RETURN_ERROR ();
10590 else
10591 this_arg = primary = resolved;
10593 if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
10594 is_array_clone_call = 1;
10596 /* IDENTIFIER_WFL will be used to report any problem further */
10597 wfl = identifier_wfl;
10599 /* Resolution of simple names, names generated after a primary: or
10600 constructors */
10601 else
10603 tree class_to_search = NULL_TREE;
10604 int lc; /* Looking for Constructor */
10606 /* We search constructor in their target class */
10607 if (CALL_CONSTRUCTOR_P (patch))
10609 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10610 class_to_search = EXPR_WFL_NODE (wfl);
10611 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10612 this_identifier_node)
10613 class_to_search = NULL_TREE;
10614 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10615 super_identifier_node)
10617 is_super_init = 1;
10618 if (CLASSTYPE_SUPER (current_class))
10619 class_to_search =
10620 DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
10621 else
10623 parse_error_context (wfl, "Can't invoke super constructor on java.lang.Object");
10624 PATCH_METHOD_RETURN_ERROR ();
10628 /* Class to search is NULL if we're searching the current one */
10629 if (class_to_search)
10631 class_to_search = resolve_and_layout (class_to_search, wfl);
10633 if (!class_to_search)
10635 parse_error_context
10636 (wfl, "Class %qs not found in type declaration",
10637 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10638 PATCH_METHOD_RETURN_ERROR ();
10641 /* Can't instantiate an abstract class, but we can
10642 invoke it's constructor. It's use within the `new'
10643 context is denied here. */
10644 if (CLASS_ABSTRACT (class_to_search)
10645 && TREE_CODE (patch) == NEW_CLASS_EXPR)
10647 parse_error_context
10648 (wfl, "Class %qs is an abstract class. It can't be instantiated",
10649 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10650 PATCH_METHOD_RETURN_ERROR ();
10653 class_to_search = TREE_TYPE (class_to_search);
10655 else
10656 class_to_search = current_class;
10657 lc = 1;
10659 /* This is a regular search in the local class, unless an
10660 alternate class is specified. */
10661 else
10663 if (where != NULL_TREE)
10664 class_to_search = where;
10665 else if (QUALIFIED_P (name))
10666 class_to_search = current_class;
10667 else
10669 class_to_search = current_class;
10671 for (;;)
10673 if (has_method (class_to_search, name))
10674 break;
10675 if (! INNER_CLASS_TYPE_P (class_to_search))
10677 parse_error_context (wfl,
10678 "No method named %qs in scope",
10679 IDENTIFIER_POINTER (name));
10680 PATCH_METHOD_RETURN_ERROR ();
10682 class_to_search
10683 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
10686 lc = 0;
10689 /* NAME is a simple identifier or comes from a primary. Search
10690 in the class whose declaration contain the method being
10691 invoked. */
10692 resolve_and_layout (class_to_search, NULL_TREE);
10694 list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
10695 /* Don't continue if no method were found, as the next statement
10696 can't be executed then. */
10697 if (!list)
10698 PATCH_METHOD_RETURN_ERROR ();
10700 if (TYPE_ARRAY_P (class_to_search)
10701 && DECL_NAME (list) == get_identifier ("clone"))
10702 is_array_clone_call = 1;
10704 /* Check for static reference of non static methods. */
10705 if (check_for_static_method_reference (wfl, patch, list,
10706 class_to_search, primary))
10707 PATCH_METHOD_RETURN_ERROR ();
10709 /* Check for inner classes creation from illegal contexts */
10710 if (lc && (INNER_CLASS_TYPE_P (class_to_search)
10711 && !CLASS_STATIC (TYPE_NAME (class_to_search)))
10712 && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)
10713 && !DECL_INIT_P (current_function_decl))
10715 parse_error_context
10716 (wfl, "No enclosing instance for inner class %qs is in scope%s",
10717 lang_printable_name (class_to_search, 0),
10718 (!current_this ? "" :
10719 "; an explicit one must be provided when creating this inner class"));
10720 PATCH_METHOD_RETURN_ERROR ();
10723 /* Non static methods are called with the current object extra
10724 argument. If PATCH is a `new TYPE()', the argument is the value
10725 returned by the object allocator. If method is resolved as a
10726 primary, use the primary otherwise use the current THIS. */
10727 args = nreverse (args);
10728 if (TREE_CODE (patch) != NEW_CLASS_EXPR)
10730 this_arg = primary ? primary : current_this;
10732 /* If we're using an access method, things are different.
10733 There are two family of cases:
10735 1) We're not generating bytecodes:
10737 - LIST is non-static. Its invocation is transformed from
10738 x(a1,...,an) into this$<n>.x(a1,....an).
10739 - LIST is static. Its invocation is transformed from
10740 x(a1,...,an) into TYPE_OF(this$<n>).x(a1,....an)
10742 2) We're generating bytecodes:
10744 - LIST is non-static. Its invocation is transformed from
10745 x(a1,....,an) into access$<n>(this$<n>,a1,...,an).
10746 - LIST is static. Its invocation is transformed from
10747 x(a1,....,an) into TYPE_OF(this$<n>).x(a1,....an).
10749 Of course, this$<n> can be arbitrarily complex, ranging from
10750 this$0 (the immediate outer context) to
10751 access$0(access$0(...(this$0))).
10753 maybe_use_access_method returns a nonzero value if the
10754 this_arg has to be moved into the (then generated) stub
10755 argument list. In the meantime, the selected function
10756 might have been replaced by a generated stub. */
10757 if (METHOD_STATIC (list))
10758 maybe_use_access_method (0, &list, NULL);
10759 else if (!primary &&
10760 maybe_use_access_method (is_super_init, &list, &this_arg))
10762 args = tree_cons (NULL_TREE, this_arg, args);
10763 this_arg = NULL_TREE; /* So it doesn't get chained twice */
10768 /* Merge point of all resolution schemes. If we have nothing, this
10769 is an error, already signaled */
10770 if (!list)
10771 PATCH_METHOD_RETURN_ERROR ();
10773 /* Check accessibility, position the is_static flag, build and
10774 return the call */
10775 if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
10776 (primary ? TREE_TYPE (TREE_TYPE (primary)) :
10777 NULL_TREE), from_super)
10778 /* Calls to clone() on array types are permitted as a special-case. */
10779 && !is_array_clone_call)
10781 const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list));
10782 const char *const access =
10783 accessibility_string (get_access_flags_from_decl (list));
10784 const char *const klass =
10785 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list))));
10786 const char *const refklass =
10787 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
10788 const char *const what = (DECL_CONSTRUCTOR_P (list)
10789 ? "constructor" : "method");
10790 parse_error_context (wfl,
10791 "Can't access %s %s %<%s.%s%> from %qs",
10792 access, what, klass, fct_name, refklass);
10793 PATCH_METHOD_RETURN_ERROR ();
10796 /* Deprecation check: check whether the method being invoked or the
10797 instance-being-created's type are deprecated. */
10798 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10799 check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list)));
10800 check_deprecation (wfl, list);
10802 /* If invoking a innerclass constructor, there are hidden parameters
10803 to pass */
10804 if (TREE_CODE (patch) == NEW_CLASS_EXPR
10805 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10807 /* And make sure we add the accessed local variables to be saved
10808 in field aliases. */
10809 args = build_alias_initializer_parameter_list
10810 (AIPL_FUNCTION_CTOR_INVOCATION, DECL_CONTEXT (list), args, NULL);
10812 /* Secretly pass the current_this/primary as a second argument */
10813 if (primary || current_this)
10815 tree extra_arg;
10816 tree this_type = (current_this ?
10817 TREE_TYPE (TREE_TYPE (current_this)) : NULL_TREE);
10818 /* Method's (list) enclosing context */
10819 tree mec = DECL_CONTEXT (TYPE_NAME (DECL_CONTEXT (list)));
10820 /* If we have a primary, use it. */
10821 if (primary)
10822 extra_arg = primary;
10823 /* The current `this' is an inner class but isn't a direct
10824 enclosing context for the inner class we're trying to
10825 create. Build an access to the proper enclosing context
10826 and use it. */
10827 else if (current_this && PURE_INNER_CLASS_TYPE_P (this_type)
10828 && this_type != TREE_TYPE (mec))
10831 extra_arg = build_access_to_thisn (current_class,
10832 TREE_TYPE (mec), 0);
10833 extra_arg = java_complete_tree (extra_arg);
10835 /* Otherwise, just use the current `this' as an enclosing
10836 context. */
10837 else
10838 extra_arg = current_this;
10839 args = tree_cons (NULL_TREE, extra_arg, args);
10841 else
10842 args = tree_cons (NULL_TREE, integer_zero_node, args);
10845 /* This handles the situation where a constructor invocation needs
10846 to have an enclosing context passed as a second parameter (the
10847 constructor is one of an inner class). */
10848 if ((is_super_init ||
10849 (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node))
10850 && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10852 tree dest = TYPE_NAME (DECL_CONTEXT (list));
10853 tree extra_arg =
10854 build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0);
10855 extra_arg = java_complete_tree (extra_arg);
10856 args = tree_cons (NULL_TREE, extra_arg, args);
10859 is_static_flag = METHOD_STATIC (list);
10860 if (! is_static_flag && this_arg != NULL_TREE)
10861 args = tree_cons (NULL_TREE, this_arg, args);
10863 /* In the context of an explicit constructor invocation, we can't
10864 invoke any method relying on `this'. Exceptions are: we're
10865 invoking a static function, primary exists and is not the current
10866 this, we're creating a new object. */
10867 if (ctxp->explicit_constructor_p
10868 && !is_static_flag
10869 && (!primary || primary == current_this)
10870 && (TREE_CODE (patch) != NEW_CLASS_EXPR))
10872 parse_error_context (wfl, "Can't reference %<this%> before the superclass constructor has been called");
10873 PATCH_METHOD_RETURN_ERROR ();
10875 java_parser_context_restore_global ();
10876 if (is_static)
10877 *is_static = is_static_flag;
10878 /* Sometimes, we want the decl of the selected method. Such as for
10879 EH checking */
10880 if (ret_decl)
10881 *ret_decl = list;
10882 patch = patch_invoke (patch, list, args);
10884 /* Now is a good time to insert the call to finit$ */
10885 if (is_super_init && CLASS_HAS_FINIT_P (current_class))
10887 tree finit_parms, finit_call;
10889 /* Prepare to pass hidden parameters to finit$, if any. */
10890 finit_parms = build_alias_initializer_parameter_list
10891 (AIPL_FUNCTION_FINIT_INVOCATION, current_class, NULL_TREE, NULL);
10893 finit_call =
10894 build_method_invocation (build_wfl_node (finit_identifier_node),
10895 finit_parms);
10897 /* Generate the code used to initialize fields declared with an
10898 initialization statement and build a compound statement along
10899 with the super constructor invocation. */
10900 CAN_COMPLETE_NORMALLY (patch) = 1;
10901 patch = build2 (COMPOUND_EXPR, void_type_node, patch,
10902 java_complete_tree (finit_call));
10904 return patch;
10907 /* Check that we're not trying to do a static reference to a method in
10908 non static method. Return 1 if it's the case, 0 otherwise. */
10910 static int
10911 check_for_static_method_reference (tree wfl, tree node, tree method,
10912 tree where, tree primary)
10914 if (METHOD_STATIC (current_function_decl)
10915 && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
10917 char *fct_name = xstrdup (lang_printable_name (method, 0));
10918 parse_error_context
10919 (wfl, "Can't make static reference to method %<%s %s%> in class %qs",
10920 lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
10921 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
10922 free (fct_name);
10923 return 1;
10925 return 0;
10928 /* Fix the invocation of *MDECL if necessary in the case of an
10929 invocation across a nested class. *THIS_ARG might be modified
10930 appropriately and an alternative access to *MDECL might be
10931 returned. */
10933 static int
10934 maybe_use_access_method (int is_super_init, tree *mdecl, tree *this_arg)
10936 tree ctx;
10937 tree md = *mdecl, ta = NULL_TREE;
10938 int to_return = 0;
10939 int non_static_context = !METHOD_STATIC (md);
10941 if (is_super_init
10942 || DECL_FINIT_P (md)
10943 || DECL_INSTINIT_P (md)
10944 || !nested_member_access_p (current_class, md))
10945 return 0;
10947 /* If we're calling a method found in an enclosing class, generate
10948 what it takes to retrieve the right `this'. Don't do that if we're
10949 invoking a static method. Note that if MD's type is unrelated to
10950 CURRENT_CLASS, then the current this can be used. */
10952 if (non_static_context
10953 && !inherits_from_p (current_class, DECL_CONTEXT (md))
10954 && DECL_CONTEXT (TYPE_NAME (current_class)))
10956 ta = *this_arg;
10957 ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
10958 if (inherits_from_p (ctx, DECL_CONTEXT (md)))
10960 ta = build_current_thisn (current_class);
10961 ta = build_wfl_node (ta);
10963 else
10965 tree type = ctx;
10966 while (type)
10968 maybe_build_thisn_access_method (type);
10969 if (inherits_from_p (type, DECL_CONTEXT (md)))
10971 ta = build_access_to_thisn (ctx, type, 0);
10972 break;
10974 type = (DECL_CONTEXT (TYPE_NAME (type)) ?
10975 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))) : NULL_TREE);
10978 ta = java_complete_tree (ta);
10981 /* We might have to use an access method to get to MD. We can
10982 break the method access rule as long as we're not generating
10983 bytecode. */
10984 if (METHOD_PRIVATE (md) && flag_emit_class_files)
10986 md = build_nested_method_access_method (md);
10987 to_return = 1;
10990 *mdecl = md;
10991 if (this_arg)
10992 *this_arg = ta;
10994 /* Returning a nonzero value indicates we were doing a non static
10995 method invocation that is now a static invocation. It will have
10996 callee displace `this' to insert it in the regular argument
10997 list. */
10998 return (non_static_context && to_return);
11001 /* Patch an invoke expression METHOD and ARGS, based on its invocation
11002 mode. */
11004 static tree
11005 patch_invoke (tree patch, tree method, tree args)
11007 tree dtable, func;
11008 tree original_call, t, ta;
11009 tree check = NULL_TREE;
11011 /* Last step for args: convert build-in types. If we're dealing with
11012 a new TYPE() type call, the first argument to the constructor
11013 isn't found in the incoming argument list, but delivered by
11014 `new' */
11015 t = TYPE_ARG_TYPES (TREE_TYPE (method));
11016 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
11017 t = TREE_CHAIN (t);
11018 for (ta = args; t != end_params_node && ta;
11019 t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
11020 if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
11021 TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
11022 TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
11024 /* Resolve unresolved returned type issues */
11025 t = TREE_TYPE (TREE_TYPE (method));
11026 if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
11027 resolve_and_layout (TREE_TYPE (t), NULL);
11029 if (flag_emit_class_files)
11030 func = method;
11031 else
11033 switch (invocation_mode (method, CALL_USING_SUPER (patch)))
11035 case INVOKE_VIRTUAL:
11036 dtable = invoke_build_dtable (0, args);
11037 func = build_invokevirtual (dtable, method);
11038 break;
11040 case INVOKE_NONVIRTUAL:
11041 /* If the object for the method call is null, we throw an
11042 exception. We don't do this if the object is the current
11043 method's `this'. In other cases we just rely on an
11044 optimization pass to eliminate redundant checks. */
11045 if (TREE_VALUE (args) != current_this)
11047 /* We use a save_expr here to make sure we only evaluate
11048 the new `self' expression once. */
11049 tree save_arg = save_expr (TREE_VALUE (args));
11050 TREE_VALUE (args) = save_arg;
11051 check = java_check_reference (save_arg, 1);
11053 /* Fall through. */
11055 case INVOKE_SUPER:
11056 case INVOKE_STATIC:
11058 tree signature = build_java_signature (TREE_TYPE (method));
11059 func = build_known_method_ref (method, TREE_TYPE (method),
11060 DECL_CONTEXT (method),
11061 signature, args);
11063 break;
11065 case INVOKE_INTERFACE:
11066 dtable = invoke_build_dtable (1, args);
11067 func = build_invokeinterface (dtable, method);
11068 break;
11070 default:
11071 abort ();
11074 /* Ensure self_type is initialized, (invokestatic). FIXME */
11075 func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
11078 TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
11079 TREE_OPERAND (patch, 0) = func;
11080 TREE_OPERAND (patch, 1) = args;
11081 patch = check_for_builtin (method, patch);
11082 original_call = patch;
11084 /* We're processing a `new TYPE ()' form. New is called and its
11085 returned value is the first argument to the constructor. We build
11086 a COMPOUND_EXPR and use saved expression so that the overall NEW
11087 expression value is a pointer to a newly created and initialized
11088 class. */
11089 if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
11091 tree class = DECL_CONTEXT (method);
11092 tree c1, saved_new, new;
11093 tree alloc_node;
11095 if (flag_emit_class_files)
11097 TREE_TYPE (patch) = build_pointer_type (class);
11098 return patch;
11100 if (!TYPE_SIZE (class))
11101 safe_layout_class (class);
11102 alloc_node =
11103 (class_has_finalize_method (class) ? alloc_object_node
11104 : alloc_no_finalizer_node);
11105 new = build3 (CALL_EXPR, promote_type (class),
11106 build_address_of (alloc_node),
11107 build_tree_list (NULL_TREE, build_class_ref (class)),
11108 NULL_TREE);
11109 saved_new = save_expr (new);
11110 c1 = build_tree_list (NULL_TREE, saved_new);
11111 TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
11112 TREE_OPERAND (original_call, 1) = c1;
11113 TREE_SET_CODE (original_call, CALL_EXPR);
11114 patch = build2 (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
11117 /* If CHECK is set, then we are building a check to see if the object
11118 is NULL. */
11119 if (check != NULL_TREE)
11121 /* We have to call force_evaluation_order now because creating a
11122 COMPOUND_EXPR wraps the arg list in a way that makes it
11123 unrecognizable by force_evaluation_order later. Yuk. */
11124 patch = build2 (COMPOUND_EXPR, TREE_TYPE (patch), check,
11125 force_evaluation_order (patch));
11126 TREE_SIDE_EFFECTS (patch) = 1;
11129 /* In order to be able to modify PATCH later, we SAVE_EXPR it and
11130 put it as the first expression of a COMPOUND_EXPR. The second
11131 expression being an empty statement to be later patched if
11132 necessary. We remember a TREE_LIST (the PURPOSE is the method,
11133 the VALUE is the compound) in a hashtable and return a
11134 COMPOUND_EXPR built so that the result of the evaluation of the
11135 original PATCH node is returned. */
11136 if (STATIC_CLASS_INIT_OPT_P ()
11137 && current_function_decl && METHOD_STATIC (method))
11139 tree list;
11140 tree fndecl = current_function_decl;
11141 /* We have to call force_evaluation_order now because creating a
11142 COMPOUND_EXPR wraps the arg list in a way that makes it
11143 unrecognizable by force_evaluation_order later. Yuk. */
11144 tree save = force_evaluation_order (patch);
11145 tree type = TREE_TYPE (patch);
11147 patch = build2 (COMPOUND_EXPR, type, save, build_java_empty_stmt ());
11148 list = tree_cons (method, patch,
11149 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl));
11151 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list;
11153 patch = build2 (COMPOUND_EXPR, type, patch, save);
11156 return patch;
11159 static int
11160 invocation_mode (tree method, int super)
11162 int access = get_access_flags_from_decl (method);
11164 if (super)
11165 return INVOKE_SUPER;
11167 if (access & ACC_STATIC)
11168 return INVOKE_STATIC;
11170 /* We have to look for a constructor before we handle nonvirtual
11171 calls; otherwise the constructor will look nonvirtual. */
11172 if (DECL_CONSTRUCTOR_P (method))
11173 return INVOKE_STATIC;
11175 if (access & ACC_PRIVATE)
11176 return INVOKE_NONVIRTUAL;
11178 /* Binary compatibility: just because it's final today, that doesn't
11179 mean it'll be final tomorrow. */
11180 if (! flag_indirect_dispatch
11181 || DECL_CONTEXT (method) == object_type_node)
11183 if (access & ACC_FINAL)
11184 return INVOKE_NONVIRTUAL;
11186 if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
11187 return INVOKE_NONVIRTUAL;
11190 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
11191 return INVOKE_INTERFACE;
11193 return INVOKE_VIRTUAL;
11196 /* Retrieve a refined list of matching methods. It covers the step
11197 15.11.2 (Compile-Time Step 2) */
11199 static tree
11200 lookup_method_invoke (int lc, tree cl, tree class, tree name, tree arg_list)
11202 tree atl = end_params_node; /* Arg Type List */
11203 tree method, signature, list, node;
11204 const char *candidates; /* Used for error report */
11205 char *dup;
11207 /* Fix the arguments */
11208 for (node = arg_list; node; node = TREE_CHAIN (node))
11210 tree current_arg = TREE_TYPE (TREE_VALUE (node));
11211 /* Non primitive type may have to be resolved */
11212 if (!JPRIMITIVE_TYPE_P (current_arg))
11213 resolve_and_layout (current_arg, NULL_TREE);
11214 /* And promoted */
11215 if (TREE_CODE (current_arg) == RECORD_TYPE)
11216 current_arg = promote_type (current_arg);
11217 /* If we're building an anonymous constructor call, and one of
11218 the arguments has array type, cast it to a size-less array
11219 type. This prevents us from getting a strange gcj-specific
11220 "sized array" signature in the constructor's signature. */
11221 if (lc && ANONYMOUS_CLASS_P (class)
11222 && TREE_CODE (current_arg) == POINTER_TYPE
11223 && TYPE_ARRAY_P (TREE_TYPE (current_arg)))
11225 tree elt = TYPE_ARRAY_ELEMENT (TREE_TYPE (current_arg));
11226 current_arg = build_pointer_type (build_java_array_type (elt, -1));
11228 atl = tree_cons (NULL_TREE, current_arg, atl);
11231 /* Presto. If we're dealing with an anonymous class and a
11232 constructor call, generate the right constructor now, since we
11233 know the arguments' types. */
11235 if (lc && ANONYMOUS_CLASS_P (class))
11237 tree mdecl = craft_constructor (TYPE_NAME (class), atl);
11238 /* The anonymous class may have already been laid out, so make sure
11239 the new constructor is laid out here. */
11240 layout_class_method (class, CLASSTYPE_SUPER (class), mdecl, NULL_TREE);
11243 /* Find all candidates and then refine the list, searching for the
11244 most specific method. */
11245 list = find_applicable_accessible_methods_list (lc, class, name, atl);
11246 list = find_most_specific_methods_list (list);
11247 if (list && !TREE_CHAIN (list))
11248 return TREE_VALUE (list);
11250 /* Issue an error. List candidates if any. Candidates are listed
11251 only if accessible (non accessible methods may end-up here for
11252 the sake of a better error report). */
11253 candidates = NULL;
11254 if (list)
11256 tree current;
11257 obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
11258 for (current = list; current; current = TREE_CHAIN (current))
11260 tree cm = TREE_VALUE (current);
11261 char string [4096];
11262 if (!cm || not_accessible_p (class, cm, NULL_TREE, 0))
11263 continue;
11264 sprintf
11265 (string, " '%s' in '%s'%s",
11266 get_printable_method_name (cm),
11267 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
11268 (TREE_CHAIN (current) ? "\n" : ""));
11269 obstack_grow (&temporary_obstack, string, strlen (string));
11271 obstack_1grow (&temporary_obstack, '\0');
11272 candidates = obstack_finish (&temporary_obstack);
11274 /* Issue the error message */
11275 method = make_node (FUNCTION_TYPE);
11276 TYPE_ARG_TYPES (method) = atl;
11277 signature = build_java_argument_signature (method);
11278 dup = xstrdup (lang_printable_name (class, 0));
11279 parse_error_context (cl, "Can't find %s %<%s(%s)%> in type %qs%s",
11280 (lc ? "constructor" : "method"),
11281 (lc ? dup : IDENTIFIER_POINTER (name)),
11282 IDENTIFIER_POINTER (signature), dup,
11283 (candidates ? candidates : ""));
11284 free (dup);
11285 return NULL_TREE;
11288 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
11289 when we're looking for a constructor. */
11291 static tree
11292 find_applicable_accessible_methods_list (int lc, tree class, tree name,
11293 tree arglist)
11295 static htab_t searched_classes;
11296 static int search_not_done = 0;
11297 tree list = NULL_TREE, all_list = NULL_TREE;
11298 tree base_binfo;
11299 int i;
11301 /* Check the hash table to determine if this class has been searched
11302 already. */
11303 if (searched_classes)
11305 if (htab_find (searched_classes, class) != NULL)
11306 return NULL;
11308 else
11310 searched_classes = htab_create (10, htab_hash_pointer,
11311 htab_eq_pointer, NULL);
11314 search_not_done++;
11315 *htab_find_slot (searched_classes, class, INSERT) = class;
11317 if (!CLASS_LOADED_P (class))
11319 load_class (class, 1);
11320 safe_layout_class (class);
11323 /* Search interfaces */
11324 if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL
11325 && CLASS_INTERFACE (TYPE_NAME (class)))
11327 search_applicable_methods_list (lc, TYPE_METHODS (class),
11328 name, arglist, &list, &all_list);
11329 for (i = 1; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
11331 tree t = BINFO_TYPE (base_binfo);
11332 tree rlist;
11334 rlist = find_applicable_accessible_methods_list (lc, t, name,
11335 arglist);
11336 list = chainon (rlist, list);
11339 /* Search classes */
11340 else
11342 search_applicable_methods_list (lc, TYPE_METHODS (class),
11343 name, arglist, &list, &all_list);
11345 /* When looking finit$, class$ or instinit$, we turn LC to 1 so
11346 that we only search in class. Note that we should have found
11347 something at this point. */
11348 if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name))
11350 lc = 1;
11351 if (!list)
11352 abort ();
11355 /* We must search all interfaces of this class */
11356 if (!lc)
11358 for (i = 1;
11359 BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
11361 tree t = BINFO_TYPE (base_binfo);
11362 if (t != object_type_node)
11364 tree rlist
11365 = find_applicable_accessible_methods_list (lc, t,
11366 name, arglist);
11367 list = chainon (rlist, list);
11372 /* Search superclass */
11373 if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
11375 tree rlist;
11376 class = CLASSTYPE_SUPER (class);
11377 rlist = find_applicable_accessible_methods_list (lc, class,
11378 name, arglist);
11379 list = chainon (rlist, list);
11383 search_not_done--;
11385 /* We're done. Reset the searched classes list and finally search
11386 java.lang.Object if it wasn't searched already. */
11387 if (!search_not_done)
11389 if (!lc
11390 && TYPE_METHODS (object_type_node)
11391 && htab_find (searched_classes, object_type_node) == NULL)
11393 search_applicable_methods_list (lc,
11394 TYPE_METHODS (object_type_node),
11395 name, arglist, &list, &all_list);
11397 htab_delete (searched_classes);
11398 searched_classes = NULL;
11401 /* Either return the list obtained or all selected (but
11402 inaccessible) methods for better error report. */
11403 return (!list ? all_list : list);
11406 /* Effectively search for the appropriate method in method */
11408 static void
11409 search_applicable_methods_list (int lc, tree method, tree name, tree arglist,
11410 tree *list, tree *all_list)
11412 for (; method; method = TREE_CHAIN (method))
11414 /* When dealing with constructor, stop here, otherwise search
11415 other classes */
11416 if (lc && !DECL_CONSTRUCTOR_P (method))
11417 continue;
11418 else if (!lc && (DECL_CONSTRUCTOR_P (method)
11419 || (DECL_NAME (method) != name)))
11420 continue;
11422 if (argument_types_convertible (method, arglist))
11424 /* Retain accessible methods only */
11425 if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
11426 method, NULL_TREE, 0))
11427 *list = tree_cons (NULL_TREE, method, *list);
11428 else
11429 /* Also retain all selected method here */
11430 *all_list = tree_cons (NULL_TREE, method, *list);
11435 /* 15.11.2.2 Choose the Most Specific Method */
11437 static tree
11438 find_most_specific_methods_list (tree list)
11440 int max = 0;
11441 int abstract, candidates;
11442 tree current, new_list = NULL_TREE;
11443 for (current = list; current; current = TREE_CHAIN (current))
11445 tree method;
11446 DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
11448 for (method = list; method; method = TREE_CHAIN (method))
11450 tree method_v, current_v;
11451 /* Don't test a method against itself */
11452 if (method == current)
11453 continue;
11455 method_v = TREE_VALUE (method);
11456 current_v = TREE_VALUE (current);
11458 /* Compare arguments and location where methods where declared */
11459 if (argument_types_convertible (method_v, current_v))
11461 if (valid_method_invocation_conversion_p
11462 (DECL_CONTEXT (method_v), DECL_CONTEXT (current_v)))
11464 int v = (DECL_SPECIFIC_COUNT (current_v) += 1);
11465 max = (v > max ? v : max);
11471 /* Review the list and select the maximally specific methods */
11472 for (current = list, abstract = -1, candidates = -1;
11473 current; current = TREE_CHAIN (current))
11474 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11476 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11477 abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0);
11478 candidates++;
11481 /* If we have several and they're all abstract, just pick the
11482 closest one. */
11483 if (candidates > 0 && candidates == abstract)
11485 /* FIXME: merge the throws clauses. There is no convenient way
11486 to do this in gcj right now, since ideally we'd like to
11487 introduce a new METHOD_DECL here, but that is really not
11488 possible. */
11489 new_list = nreverse (new_list);
11490 TREE_CHAIN (new_list) = NULL_TREE;
11491 return new_list;
11494 /* We have several (we couldn't find a most specific), all but one
11495 are abstract, we pick the only non abstract one. */
11496 if (candidates > 0 && (candidates == abstract+1))
11498 for (current = new_list; current; current = TREE_CHAIN (current))
11499 if (!METHOD_ABSTRACT (TREE_VALUE (current)))
11501 TREE_CHAIN (current) = NULL_TREE;
11502 new_list = current;
11506 /* If we can't find one, lower expectations and try to gather multiple
11507 maximally specific methods */
11508 while (!new_list && max)
11510 while (--max > 0)
11512 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11513 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11517 return new_list;
11520 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
11521 converted by method invocation conversion (5.3) to the type of the
11522 corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
11523 to change less often than M1. */
11525 static GTY(()) tree m2_arg_value;
11526 static GTY(()) tree m2_arg_cache;
11528 static int
11529 argument_types_convertible (tree m1, tree m2_or_arglist)
11531 tree m1_arg, m2_arg;
11533 SKIP_THIS_AND_ARTIFICIAL_PARMS (m1_arg, m1)
11535 if (m2_arg_value == m2_or_arglist)
11536 m2_arg = m2_arg_cache;
11537 else
11539 /* M2_OR_ARGLIST can be a function DECL or a raw list of
11540 argument types */
11541 if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
11543 m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
11544 if (!METHOD_STATIC (m2_or_arglist))
11545 m2_arg = TREE_CHAIN (m2_arg);
11547 else
11548 m2_arg = m2_or_arglist;
11550 m2_arg_value = m2_or_arglist;
11551 m2_arg_cache = m2_arg;
11554 while (m1_arg != end_params_node && m2_arg != end_params_node)
11556 resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
11557 if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
11558 TREE_VALUE (m2_arg)))
11559 break;
11560 m1_arg = TREE_CHAIN (m1_arg);
11561 m2_arg = TREE_CHAIN (m2_arg);
11563 return m1_arg == end_params_node && m2_arg == end_params_node;
11566 /* Qualification routines */
11568 /* Given a name x.y.z, look up x locally. If it's found, save the
11569 decl. If it's not found, mark the name as RESOLVE_PACKAGE_NAME_P,
11570 so that we later try and load the appropriate classes. */
11571 static void
11572 qualify_ambiguous_name (tree id)
11574 tree name, decl;
11576 /* We inspect the first item of the qualification list. As a sanity
11577 check, make sure that it is an identfier node. */
11578 tree qual = EXPR_WFL_QUALIFICATION (id);
11579 tree qual_wfl = QUAL_WFL (qual);
11581 if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
11582 return;
11584 name = EXPR_WFL_NODE (qual_wfl);
11586 /* If we don't have an identifier, or we have a 'this' or 'super',
11587 then field access processing is all we need : there is nothing
11588 for us to do. */
11589 if (!name || TREE_CODE (name) != IDENTIFIER_NODE ||
11590 name == this_identifier_node ||
11591 name == super_identifier_node)
11592 return;
11594 /* If name appears within the scope of a local variable declaration
11595 or parameter declaration, or is a field within an enclosing
11596 class, then it is an expression name. Save the decl and let
11597 resolve_field_access do it's work. */
11598 if ((decl = IDENTIFIER_LOCAL_VALUE (name)) ||
11599 (decl = lookup_field_wrapper (current_class, name)))
11601 QUAL_RESOLUTION (qual) = decl;
11602 return;
11605 /* If name is a known class name (either declared or imported), mark
11606 us as a type name. */
11607 if ((decl = resolve_and_layout (name, NULL_TREE)))
11609 RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
11610 QUAL_RESOLUTION (qual) = decl;
11613 /* Check here that NAME isn't declared by more than one
11614 type-import-on-demand declaration of the compilation unit
11615 containing NAME. FIXME */
11617 /* We couldn't find a declaration for the name. Assume for now that
11618 we have a qualified class name that needs to be loaded from an
11619 external class file. */
11620 else
11621 RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
11623 /* Propagate the qualification across other components of the
11624 qualified name */
11625 for (qual = TREE_CHAIN (qual); qual;
11626 qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
11628 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11629 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
11632 /* Store the global qualification for the ambiguous part of ID back
11633 into ID fields */
11634 if (RESOLVE_TYPE_NAME_P (qual_wfl))
11635 RESOLVE_TYPE_NAME_P (id) = 1;
11636 else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11637 RESOLVE_PACKAGE_NAME_P (id) = 1;
11640 /* Patch tree nodes in a function body. When a BLOCK is found, push
11641 local variable decls if present.
11642 Same as java_complete_lhs, but does resolve static finals to values. */
11644 static tree
11645 java_complete_tree (tree node)
11647 node = java_complete_lhs (node);
11648 if (JDECL_P (node) && CLASS_FINAL_VARIABLE_P (node)
11649 && DECL_INITIAL (node) != NULL_TREE)
11651 tree value = fold_constant_for_init (node, node);
11652 if (value != NULL_TREE)
11653 return value;
11655 return node;
11658 static tree
11659 java_stabilize_reference (tree node)
11661 if (TREE_CODE (node) == COMPOUND_EXPR)
11663 tree op0 = TREE_OPERAND (node, 0);
11664 tree op1 = TREE_OPERAND (node, 1);
11665 TREE_OPERAND (node, 0) = save_expr (op0);
11666 TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
11667 return node;
11669 return stabilize_reference (node);
11672 /* Patch tree nodes in a function body. When a BLOCK is found, push
11673 local variable decls if present.
11674 Same as java_complete_tree, but does not resolve static finals to values. */
11676 static tree
11677 java_complete_lhs (tree node)
11679 tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
11680 int flag;
11682 /* CONVERT_EXPR always has its type set, even though it needs to be
11683 worked out. */
11684 if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
11685 return node;
11687 /* The switch block implements cases processing container nodes
11688 first. Contained nodes are always written back. Leaves come
11689 next and return a value. */
11690 switch (TREE_CODE (node))
11692 case BLOCK:
11694 /* 1- Block section.
11695 Set the local values on decl names so we can identify them
11696 faster when they're referenced. At that stage, identifiers
11697 are legal so we don't check for declaration errors. */
11698 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11700 DECL_CONTEXT (cn) = current_function_decl;
11701 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
11703 if (BLOCK_EXPR_BODY (node) == NULL_TREE)
11704 CAN_COMPLETE_NORMALLY (node) = 1;
11705 else
11707 tree stmt = BLOCK_EXPR_BODY (node);
11708 tree *ptr;
11709 int error_seen = 0;
11710 if (TREE_CODE (stmt) == COMPOUND_EXPR)
11712 /* Re-order from (((A; B); C); ...; Z) to
11713 (A; (B; (C ; (...; Z)))).
11714 This makes it easier to scan the statements left-to-right
11715 without using recursion (which might overflow the stack
11716 if the block has many statements. */
11717 for (;;)
11719 tree left = TREE_OPERAND (stmt, 0);
11720 if (TREE_CODE (left) != COMPOUND_EXPR)
11721 break;
11722 TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
11723 TREE_OPERAND (left, 1) = stmt;
11724 stmt = left;
11726 BLOCK_EXPR_BODY (node) = stmt;
11729 /* Now do the actual complete, without deep recursion for
11730 long blocks. */
11731 ptr = &BLOCK_EXPR_BODY (node);
11732 while (TREE_CODE (*ptr) == COMPOUND_EXPR
11733 && !IS_EMPTY_STMT (TREE_OPERAND (*ptr, 1)))
11735 tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
11736 tree *next = &TREE_OPERAND (*ptr, 1);
11737 TREE_OPERAND (*ptr, 0) = cur;
11738 if (IS_EMPTY_STMT (cur))
11740 /* Optimization; makes it easier to detect empty bodies.
11741 Most useful for <clinit> with all-constant initializer. */
11742 *ptr = *next;
11743 continue;
11745 if (TREE_CODE (cur) == ERROR_MARK)
11746 error_seen++;
11747 else if (! CAN_COMPLETE_NORMALLY (cur))
11749 wfl_op2 = *next;
11750 for (;;)
11752 if (TREE_CODE (wfl_op2) == BLOCK)
11753 wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
11754 else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
11755 wfl_op2 = TREE_OPERAND (wfl_op2, 0);
11756 else
11757 break;
11759 if (TREE_CODE (wfl_op2) != CASE_EXPR
11760 && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
11761 unreachable_stmt_error (*ptr);
11763 if (TREE_TYPE (*ptr) == NULL_TREE)
11764 TREE_TYPE (*ptr) = void_type_node;
11765 ptr = next;
11767 *ptr = java_complete_tree (*ptr);
11769 if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
11770 return error_mark_node;
11771 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
11773 /* Turn local bindings to null */
11774 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11775 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
11777 TREE_TYPE (node) = void_type_node;
11778 break;
11780 /* 2- They are expressions but ultimately deal with statements */
11782 case THROW_EXPR:
11783 wfl_op1 = TREE_OPERAND (node, 0);
11784 COMPLETE_CHECK_OP_0 (node);
11785 /* 14.19 A throw statement cannot complete normally. */
11786 CAN_COMPLETE_NORMALLY (node) = 0;
11787 return patch_throw_statement (node, wfl_op1);
11789 case SYNCHRONIZED_EXPR:
11790 wfl_op1 = TREE_OPERAND (node, 0);
11791 return patch_synchronized_statement (node, wfl_op1);
11793 case TRY_EXPR:
11794 return patch_try_statement (node);
11796 case TRY_FINALLY_EXPR:
11797 COMPLETE_CHECK_OP_0 (node);
11798 COMPLETE_CHECK_OP_1 (node);
11799 if (IS_EMPTY_STMT (TREE_OPERAND (node, 0)))
11800 /* Reduce try/finally nodes with an empty try block. */
11801 return TREE_OPERAND (node, 1);
11802 if (IS_EMPTY_STMT (TREE_OPERAND (node, 1)))
11803 /* Likewise for an empty finally block. */
11804 return TREE_OPERAND (node, 0);
11805 CAN_COMPLETE_NORMALLY (node)
11806 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11807 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11808 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
11809 return node;
11811 case LABELED_BLOCK_EXPR:
11812 PUSH_LABELED_BLOCK (node);
11813 if (LABELED_BLOCK_BODY (node))
11814 COMPLETE_CHECK_OP_1 (node);
11815 TREE_TYPE (node) = void_type_node;
11816 POP_LABELED_BLOCK ();
11818 if (IS_EMPTY_STMT (LABELED_BLOCK_BODY (node)))
11820 LABELED_BLOCK_BODY (node) = NULL_TREE;
11821 CAN_COMPLETE_NORMALLY (node) = 1;
11823 else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
11824 CAN_COMPLETE_NORMALLY (node) = 1;
11825 return node;
11827 case EXIT_BLOCK_EXPR:
11828 return patch_bc_statement (node);
11830 case CASE_EXPR:
11831 cn = java_complete_tree (TREE_OPERAND (node, 0));
11832 if (cn == error_mark_node)
11833 return cn;
11835 /* First, the case expression must be constant. Values of final
11836 fields are accepted. */
11837 nn = fold_constant_for_init (cn, NULL_TREE);
11838 if (nn != NULL_TREE)
11839 cn = nn;
11841 cn = fold (cn);
11842 if ((TREE_CODE (cn) == COMPOUND_EXPR
11843 || TREE_CODE (cn) == COMPONENT_REF)
11844 && JDECL_P (TREE_OPERAND (cn, 1))
11845 && FIELD_FINAL (TREE_OPERAND (cn, 1))
11846 && DECL_INITIAL (TREE_OPERAND (cn, 1)))
11848 cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
11849 TREE_OPERAND (cn, 1));
11851 /* Accept final locals too. */
11852 else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn)
11853 && DECL_INITIAL (cn))
11854 cn = fold_constant_for_init (DECL_INITIAL (cn), cn);
11856 if (!TREE_CONSTANT (cn))
11858 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11859 parse_error_context (node, "Constant expression required");
11860 return error_mark_node;
11863 nn = ctxp->current_loop;
11865 /* It must be assignable to the type of the switch expression. */
11866 if (!try_builtin_assignconv (NULL_TREE,
11867 TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
11869 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11870 parse_error_context
11871 (wfl_operator,
11872 "Incompatible type for case. Can't convert %qs to %<int%>",
11873 lang_printable_name (TREE_TYPE (cn), 0));
11874 return error_mark_node;
11877 cn = fold (convert (int_type_node, cn));
11878 TREE_CONSTANT_OVERFLOW (cn) = 0;
11879 CAN_COMPLETE_NORMALLY (cn) = 1;
11881 /* Save the label on a list so that we can later check for
11882 duplicates. */
11883 case_label_list = tree_cons (node, cn, case_label_list);
11885 /* Multiple instance of a case label bearing the same value is
11886 checked later. The case expression is all right so far. */
11887 if (TREE_CODE (cn) == VAR_DECL)
11888 cn = DECL_INITIAL (cn);
11889 TREE_OPERAND (node, 0) = cn;
11890 TREE_TYPE (node) = void_type_node;
11891 CAN_COMPLETE_NORMALLY (node) = 1;
11892 TREE_SIDE_EFFECTS (node) = 1;
11893 break;
11895 case DEFAULT_EXPR:
11896 nn = ctxp->current_loop;
11897 /* Only one default label is allowed per switch statement */
11898 if (SWITCH_HAS_DEFAULT (nn))
11900 #ifdef USE_MAPPED_LOCATION
11901 SET_EXPR_LOCATION (wfl_operator, EXPR_LOCATION (node));
11902 #else
11903 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11904 #endif
11905 parse_error_context (wfl_operator,
11906 "Duplicate case label: %<default%>");
11907 return error_mark_node;
11909 else
11910 SWITCH_HAS_DEFAULT (nn) = 1;
11911 TREE_TYPE (node) = void_type_node;
11912 TREE_SIDE_EFFECTS (node) = 1;
11913 CAN_COMPLETE_NORMALLY (node) = 1;
11914 break;
11916 case SWITCH_EXPR:
11917 case LOOP_EXPR:
11918 PUSH_LOOP (node);
11919 /* Check whether the loop was enclosed in a labeled
11920 statement. If not, create one, insert the loop in it and
11921 return the node */
11922 nn = patch_loop_statement (node);
11924 /* Anyways, walk the body of the loop */
11925 if (TREE_CODE (node) == LOOP_EXPR)
11926 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11927 /* Switch statement: walk the switch expression and the cases */
11928 else
11929 node = patch_switch_statement (node);
11931 if (node == error_mark_node || TREE_OPERAND (node, 0) == error_mark_node)
11932 nn = error_mark_node;
11933 else
11935 TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
11936 /* If we returned something different, that's because we
11937 inserted a label. Pop the label too. */
11938 if (nn != node)
11940 if (CAN_COMPLETE_NORMALLY (node))
11941 CAN_COMPLETE_NORMALLY (nn) = 1;
11942 POP_LABELED_BLOCK ();
11945 POP_LOOP ();
11946 return nn;
11948 case EXIT_EXPR:
11949 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11950 return patch_exit_expr (node);
11952 case COND_EXPR:
11953 /* Condition */
11954 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11955 if (TREE_OPERAND (node, 0) == error_mark_node)
11956 return error_mark_node;
11957 /* then-else branches */
11958 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11959 if (TREE_OPERAND (node, 1) == error_mark_node)
11960 return error_mark_node;
11962 /* This is a special case due to build_assertion(). When
11963 assertions are disabled we build a COND_EXPR in which
11964 Operand 1 is the body of the assertion. If that happens to
11965 be a string concatenation we'll need to patch it here. */
11966 tree patched = patch_string (TREE_OPERAND (node, 1));
11967 if (patched)
11968 TREE_OPERAND (node, 1) = patched;
11970 TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
11971 if (TREE_OPERAND (node, 2) == error_mark_node)
11972 return error_mark_node;
11973 return patch_if_else_statement (node);
11974 break;
11976 case CONDITIONAL_EXPR:
11977 /* Condition */
11978 wfl_op1 = TREE_OPERAND (node, 0);
11979 COMPLETE_CHECK_OP_0 (node);
11980 wfl_op2 = TREE_OPERAND (node, 1);
11981 COMPLETE_CHECK_OP_1 (node);
11982 wfl_op3 = TREE_OPERAND (node, 2);
11983 COMPLETE_CHECK_OP_2 (node);
11984 return patch_conditional_expr (node, wfl_op1, wfl_op2);
11986 /* 3- Expression section */
11987 case COMPOUND_EXPR:
11988 wfl_op2 = TREE_OPERAND (node, 1);
11989 TREE_OPERAND (node, 0) = nn =
11990 java_complete_tree (TREE_OPERAND (node, 0));
11991 if (IS_EMPTY_STMT (wfl_op2))
11992 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
11993 else
11995 if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
11997 /* An unreachable condition in a do-while statement
11998 is *not* (technically) an unreachable statement. */
11999 nn = wfl_op2;
12000 if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
12001 nn = EXPR_WFL_NODE (nn);
12002 /* NN can be NULL_TREE exactly when UPDATE is, in
12003 finish_for_loop. */
12004 if (nn != NULL_TREE && TREE_CODE (nn) != EXIT_EXPR)
12006 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
12007 if (SUPPRESS_UNREACHABLE_ERROR (nn))
12009 /* Perhaps this warning should have an
12010 associated flag. The code being compiled is
12011 pedantically correct, but useless. */
12012 parse_warning_context (wfl_operator,
12013 "Unreachable statement");
12015 else
12016 parse_error_context (wfl_operator,
12017 "Unreachable statement");
12020 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
12021 if (TREE_OPERAND (node, 1) == error_mark_node)
12022 return error_mark_node;
12023 /* Even though we might allow the case where the first
12024 operand doesn't return normally, we still should compute
12025 CAN_COMPLETE_NORMALLY correctly. */
12026 CAN_COMPLETE_NORMALLY (node)
12027 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
12028 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
12030 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
12031 break;
12033 case RETURN_EXPR:
12034 /* CAN_COMPLETE_NORMALLY (node) = 0; */
12035 return patch_return (node);
12037 case EXPR_WITH_FILE_LOCATION:
12038 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
12039 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
12041 node = resolve_expression_name (node, NULL);
12042 if (node == error_mark_node)
12043 return node;
12044 CAN_COMPLETE_NORMALLY (node) = 1;
12046 else
12048 tree body;
12049 location_t save_location = input_location;
12050 #ifdef USE_MAPPED_LOCATION
12051 input_location = EXPR_LOCATION (node);
12052 if (input_location == UNKNOWN_LOCATION)
12053 input_location = save_location;
12054 #else
12055 input_line = EXPR_WFL_LINENO (node);
12056 #endif
12057 body = java_complete_tree (EXPR_WFL_NODE (node));
12058 input_location = save_location;
12059 EXPR_WFL_NODE (node) = body;
12060 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
12061 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
12062 if (IS_EMPTY_STMT (body) || TREE_CONSTANT (body))
12064 /* Makes it easier to constant fold, detect empty bodies. */
12065 return body;
12067 if (body == error_mark_node)
12069 /* Its important for the evaluation of assignment that
12070 this mark on the TREE_TYPE is propagated. */
12071 TREE_TYPE (node) = error_mark_node;
12072 return error_mark_node;
12074 else
12075 TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
12078 break;
12080 case NEW_ARRAY_EXPR:
12081 /* Patch all the dimensions */
12082 flag = 0;
12083 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
12085 int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
12086 tree dim = convert (int_type_node,
12087 java_complete_tree (TREE_VALUE (cn)));
12088 if (dim == error_mark_node)
12090 flag = 1;
12091 continue;
12093 else
12095 TREE_VALUE (cn) = dim;
12096 /* Setup the location of the current dimension, for
12097 later error report. */
12098 #ifdef USE_MAPPED_LOCATION
12099 TREE_PURPOSE (cn) = expr_add_location (NULL_TREE, location, 0);
12100 #else
12101 TREE_PURPOSE (cn) =
12102 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
12103 EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
12104 #endif
12107 /* They complete the array creation expression, if no errors
12108 were found. */
12109 CAN_COMPLETE_NORMALLY (node) = 1;
12110 return (flag ? error_mark_node
12111 : force_evaluation_order (patch_newarray (node)));
12113 case NEW_ANONYMOUS_ARRAY_EXPR:
12114 /* Create the array type if necessary. */
12115 if (ANONYMOUS_ARRAY_DIMS_SIG (node))
12117 tree type = ANONYMOUS_ARRAY_BASE_TYPE (node);
12118 if (!(type = resolve_type_during_patch (type)))
12119 return error_mark_node;
12120 type = build_array_from_name (type, NULL_TREE,
12121 ANONYMOUS_ARRAY_DIMS_SIG (node), NULL);
12122 ANONYMOUS_ARRAY_BASE_TYPE (node) = build_pointer_type (type);
12124 node = patch_new_array_init (ANONYMOUS_ARRAY_BASE_TYPE (node),
12125 ANONYMOUS_ARRAY_INITIALIZER (node));
12126 if (node == error_mark_node)
12127 return error_mark_node;
12128 CAN_COMPLETE_NORMALLY (node) = 1;
12129 return node;
12131 case NEW_CLASS_EXPR:
12132 case CALL_EXPR:
12133 /* Complete function's argument(s) first */
12134 if (complete_function_arguments (node))
12135 return error_mark_node;
12136 else
12138 tree decl, wfl = TREE_OPERAND (node, 0);
12139 int in_this = CALL_THIS_CONSTRUCTOR_P (node);
12140 int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
12141 super_identifier_node);
12142 tree arguments;
12143 #ifdef USE_MAPPED_LOCATION
12144 source_location location = EXPR_LOCATION (node);
12145 #else
12146 int location = EXPR_WFL_LINECOL (node);
12147 #endif
12149 node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
12150 from_super, 0, &decl);
12151 if (node == error_mark_node)
12152 return error_mark_node;
12154 if (TREE_CODE (node) == CALL_EXPR
12155 && TREE_OPERAND (node, 1) != NULL_TREE)
12156 arguments = TREE_VALUE (TREE_OPERAND (node, 1));
12157 else
12158 arguments = NULL_TREE;
12159 check_thrown_exceptions (location, decl, arguments);
12160 /* If we call this(...), register signature and positions */
12161 if (in_this)
12162 DECL_CONSTRUCTOR_CALLS (current_function_decl) =
12163 tree_cons (wfl, decl,
12164 DECL_CONSTRUCTOR_CALLS (current_function_decl));
12165 CAN_COMPLETE_NORMALLY (node) = 1;
12166 return force_evaluation_order (node);
12169 case MODIFY_EXPR:
12170 /* Save potential wfls */
12171 wfl_op1 = TREE_OPERAND (node, 0);
12172 TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
12174 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
12175 && TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
12176 && DECL_INITIAL (nn) != NULL_TREE)
12178 tree value;
12180 value = fold_constant_for_init (nn, nn);
12182 /* When we have a primitype type, or a string and we're not
12183 emitting a class file, we actually don't want to generate
12184 anything for the assignment. */
12185 if (value != NULL_TREE &&
12186 (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) ||
12187 (TREE_TYPE (value) == string_ptr_type_node &&
12188 ! flag_emit_class_files)))
12190 /* Prepare node for patch_assignment */
12191 TREE_OPERAND (node, 1) = value;
12192 /* Call patch assignment to verify the assignment */
12193 if (patch_assignment (node, wfl_op1) == error_mark_node)
12194 return error_mark_node;
12195 /* Set DECL_INITIAL properly (a conversion might have
12196 been decided by patch_assignment) and return the
12197 empty statement. */
12198 else
12200 tree patched = patch_string (TREE_OPERAND (node, 1));
12201 if (patched)
12202 DECL_INITIAL (nn) = patched;
12203 else
12204 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
12205 DECL_FIELD_FINAL_IUD (nn) = 1;
12206 return build_java_empty_stmt ();
12209 if (! flag_emit_class_files)
12210 DECL_INITIAL (nn) = NULL_TREE;
12212 wfl_op2 = TREE_OPERAND (node, 1);
12214 if (TREE_OPERAND (node, 0) == error_mark_node)
12215 return error_mark_node;
12217 flag = COMPOUND_ASSIGN_P (wfl_op2);
12218 if (flag)
12220 /* This might break when accessing outer field from inner
12221 class. TESTME, FIXME */
12222 tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
12224 /* Hand stabilize the lhs on both places */
12225 TREE_OPERAND (node, 0) = lvalue;
12226 TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
12227 (flag_emit_class_files ? lvalue : save_expr (lvalue));
12229 /* 15.25.2.a: Left hand is not an array access. FIXME */
12230 /* Now complete the RHS. We write it back later on. */
12231 nn = java_complete_tree (TREE_OPERAND (node, 1));
12233 if ((cn = patch_string (nn)))
12234 nn = cn;
12236 /* The last part of the rewrite for E1 op= E2 is to have
12237 E1 = (T)(E1 op E2), with T being the type of E1. */
12238 nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
12239 TREE_TYPE (lvalue), nn));
12241 /* If the assignment is compound and has reference type,
12242 then ensure the LHS has type String and nothing else. */
12243 if (JREFERENCE_TYPE_P (TREE_TYPE (lvalue))
12244 && ! JSTRING_TYPE_P (TREE_TYPE (lvalue)))
12245 parse_error_context (wfl_op2,
12246 "Incompatible type for %<+=%>. Can't convert %qs to %<java.lang.String%>",
12247 lang_printable_name (TREE_TYPE (lvalue), 0));
12249 /* 15.25.2.b: Left hand is an array access. FIXME */
12252 /* If we're about to patch a NEW_ARRAY_INIT, we call a special
12253 function to complete this RHS. Note that a NEW_ARRAY_INIT
12254 might have been already fully expanded if created as a result
12255 of processing an anonymous array initializer. We avoid doing
12256 the operation twice by testing whether the node already bears
12257 a type. */
12258 else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT && !TREE_TYPE (wfl_op2))
12259 nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
12260 TREE_OPERAND (node, 1));
12261 /* Otherwise we simply complete the RHS */
12262 else
12263 nn = java_complete_tree (TREE_OPERAND (node, 1));
12265 if (nn == error_mark_node)
12266 return error_mark_node;
12268 /* Write back the RHS as we evaluated it. */
12269 TREE_OPERAND (node, 1) = nn;
12271 /* In case we're handling = with a String as a RHS, we need to
12272 produce a String out of the RHS (it might still be a
12273 STRING_CST or a StringBuffer at this stage */
12274 if ((nn = patch_string (TREE_OPERAND (node, 1))))
12275 TREE_OPERAND (node, 1) = nn;
12277 if ((nn = nested_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
12278 TREE_OPERAND (node, 1))))
12280 /* We return error_mark_node if nested_field_access_fix
12281 detects we write into a final. */
12282 if (nn == error_mark_node)
12283 return error_mark_node;
12284 node = nn;
12286 else
12288 node = patch_assignment (node, wfl_op1);
12289 if (node == error_mark_node)
12290 return error_mark_node;
12291 /* Reorganize the tree if necessary. */
12292 if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
12293 || JSTRING_P (TREE_TYPE (node))))
12294 node = java_refold (node);
12297 /* Seek to set DECL_INITIAL to a proper value, since it might have
12298 undergone a conversion in patch_assignment. We do that only when
12299 it's necessary to have DECL_INITIAL properly set. */
12300 nn = TREE_OPERAND (node, 0);
12301 if (TREE_CODE (nn) == VAR_DECL
12302 && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn))
12303 && FIELD_STATIC (nn) && FIELD_FINAL (nn)
12304 && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn))
12305 || TREE_TYPE (nn) == string_ptr_type_node))
12306 DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
12308 CAN_COMPLETE_NORMALLY (node) = 1;
12309 return node;
12311 case MULT_EXPR:
12312 case PLUS_EXPR:
12313 case MINUS_EXPR:
12314 case LSHIFT_EXPR:
12315 case RSHIFT_EXPR:
12316 case URSHIFT_EXPR:
12317 case BIT_AND_EXPR:
12318 case BIT_XOR_EXPR:
12319 case BIT_IOR_EXPR:
12320 case TRUNC_MOD_EXPR:
12321 case TRUNC_DIV_EXPR:
12322 case RDIV_EXPR:
12323 case TRUTH_ANDIF_EXPR:
12324 case TRUTH_ORIF_EXPR:
12325 case EQ_EXPR:
12326 case NE_EXPR:
12327 case GT_EXPR:
12328 case GE_EXPR:
12329 case LT_EXPR:
12330 case LE_EXPR:
12331 /* Operands 0 and 1 are WFL in certain cases only. patch_binop
12332 knows how to handle those cases. */
12333 wfl_op1 = TREE_OPERAND (node, 0);
12334 wfl_op2 = TREE_OPERAND (node, 1);
12336 CAN_COMPLETE_NORMALLY (node) = 1;
12337 /* Don't complete string nodes if dealing with the PLUS operand. */
12338 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
12340 nn = java_complete_tree (wfl_op1);
12341 if (nn == error_mark_node)
12342 return error_mark_node;
12344 TREE_OPERAND (node, 0) = nn;
12346 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
12348 nn = java_complete_tree (wfl_op2);
12349 if (nn == error_mark_node)
12350 return error_mark_node;
12352 TREE_OPERAND (node, 1) = nn;
12354 return patch_binop (node, wfl_op1, wfl_op2, 0);
12356 case INSTANCEOF_EXPR:
12357 wfl_op1 = TREE_OPERAND (node, 0);
12358 COMPLETE_CHECK_OP_0 (node);
12359 return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1), 0);
12361 case UNARY_PLUS_EXPR:
12362 case NEGATE_EXPR:
12363 case TRUTH_NOT_EXPR:
12364 case BIT_NOT_EXPR:
12365 case PREDECREMENT_EXPR:
12366 case PREINCREMENT_EXPR:
12367 case POSTDECREMENT_EXPR:
12368 case POSTINCREMENT_EXPR:
12369 case CONVERT_EXPR:
12370 /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
12371 how to handle those cases. */
12372 wfl_op1 = TREE_OPERAND (node, 0);
12373 CAN_COMPLETE_NORMALLY (node) = 1;
12374 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12375 if (TREE_OPERAND (node, 0) == error_mark_node)
12376 return error_mark_node;
12377 node = patch_unaryop (node, wfl_op1);
12378 CAN_COMPLETE_NORMALLY (node) = 1;
12379 break;
12381 case ARRAY_REF:
12382 /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
12383 how to handle those cases. */
12384 wfl_op1 = TREE_OPERAND (node, 0);
12385 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12386 if (TREE_OPERAND (node, 0) == error_mark_node)
12387 return error_mark_node;
12388 if (!flag_emit_class_files)
12389 TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
12390 /* The same applies to wfl_op2 */
12391 wfl_op2 = TREE_OPERAND (node, 1);
12392 TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
12393 if (TREE_OPERAND (node, 1) == error_mark_node)
12394 return error_mark_node;
12395 if (!flag_emit_class_files)
12396 TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
12397 return patch_array_ref (node);
12399 case RECORD_TYPE:
12400 return node;;
12402 case COMPONENT_REF:
12403 /* The first step in the re-write of qualified name handling. FIXME.
12404 So far, this is only to support PRIMTYPE.class ->
12405 PRIMCLASS.TYPE. */
12407 tree prim_class = TREE_OPERAND (node, 0);
12408 tree name = TREE_OPERAND (node, 1);
12409 tree field;
12411 gcc_assert (TREE_CODE (prim_class) == NOP_EXPR);
12412 prim_class = java_complete_tree (TREE_TYPE (prim_class));
12413 gcc_assert (TREE_CODE (prim_class) == RECORD_TYPE);
12414 field = lookup_field_wrapper (prim_class, name);
12416 if (field == NULL_TREE)
12418 error ("missing static field %qs", IDENTIFIER_POINTER (name));
12419 return error_mark_node;
12421 if (! FIELD_STATIC (field))
12423 error ("not a static field %qs", IDENTIFIER_POINTER (name));
12424 return error_mark_node;
12426 return field;
12428 break;
12430 case THIS_EXPR:
12431 /* Can't use THIS in a static environment */
12432 if (!current_this)
12434 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12435 parse_error_context (wfl_operator,
12436 "Keyword %<this%> used outside allowed context");
12437 TREE_TYPE (node) = error_mark_node;
12438 return error_mark_node;
12440 if (ctxp->explicit_constructor_p)
12442 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12443 parse_error_context
12444 (wfl_operator, "Can't reference %<this%> or %<super%> before the superclass constructor has been called");
12445 TREE_TYPE (node) = error_mark_node;
12446 return error_mark_node;
12448 return current_this;
12450 case CLASS_LITERAL:
12451 CAN_COMPLETE_NORMALLY (node) = 1;
12452 node = patch_incomplete_class_ref (node);
12453 if (node == error_mark_node)
12454 return error_mark_node;
12455 break;
12457 default:
12458 CAN_COMPLETE_NORMALLY (node) = 1;
12459 /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
12460 and it's time to turn it into the appropriate String object */
12461 if ((nn = patch_string (node)))
12462 node = nn;
12463 else
12464 internal_error ("No case for %s", tree_code_name [TREE_CODE (node)]);
12466 return node;
12469 /* Complete function call's argument. Return a nonzero value is an
12470 error was found. */
12472 static int
12473 complete_function_arguments (tree node)
12475 int flag = 0;
12476 tree cn;
12478 ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12479 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
12481 tree wfl = TREE_VALUE (cn), parm, temp;
12482 parm = java_complete_tree (wfl);
12484 if (parm == error_mark_node)
12486 flag = 1;
12487 continue;
12489 /* If we have a string literal that we haven't transformed yet or a
12490 crafted string buffer, as a result of the use of the String
12491 `+' operator. Build `parm.toString()' and expand it. */
12492 if ((temp = patch_string (parm)))
12493 parm = temp;
12495 TREE_VALUE (cn) = parm;
12497 ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12498 return flag;
12501 /* Sometimes (for loops and variable initialized during their
12502 declaration), we want to wrap a statement around a WFL and turn it
12503 debugable. */
12505 static tree
12506 build_debugable_stmt (int location, tree stmt)
12508 if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
12510 #ifdef USE_MAPPED_LOCATION
12511 stmt = expr_add_location (stmt, location, 1);
12512 #else
12513 stmt = build_expr_wfl (stmt, input_filename, 0, 0);
12514 EXPR_WFL_LINECOL (stmt) = location;
12515 JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
12516 #endif
12518 return stmt;
12521 static tree
12522 build_expr_block (tree body, tree decls)
12524 tree node = make_node (BLOCK);
12525 BLOCK_EXPR_DECLS (node) = decls;
12526 BLOCK_EXPR_BODY (node) = body;
12527 if (body)
12528 TREE_TYPE (node) = TREE_TYPE (body);
12529 TREE_SIDE_EFFECTS (node) = 1;
12530 return node;
12533 /* Create a new function block and link it appropriately to current
12534 function block chain */
12536 static tree
12537 enter_block (void)
12539 tree b = build_expr_block (NULL_TREE, NULL_TREE);
12541 /* Link block B supercontext to the previous block. The current
12542 function DECL is used as supercontext when enter_a_block is called
12543 for the first time for a given function. The current function body
12544 (DECL_FUNCTION_BODY) is set to be block B. */
12546 tree fndecl = current_function_decl;
12548 if (!fndecl) {
12549 BLOCK_SUPERCONTEXT (b) = current_static_block;
12550 current_static_block = b;
12553 else if (!DECL_FUNCTION_BODY (fndecl))
12555 BLOCK_SUPERCONTEXT (b) = fndecl;
12556 DECL_FUNCTION_BODY (fndecl) = b;
12558 else
12560 BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
12561 DECL_FUNCTION_BODY (fndecl) = b;
12563 return b;
12566 /* Exit a block by changing the current function body
12567 (DECL_FUNCTION_BODY) to the current block super context, only if
12568 the block being exited isn't the method's top level one. */
12570 static tree
12571 exit_block (void)
12573 tree b;
12574 if (current_function_decl)
12576 b = DECL_FUNCTION_BODY (current_function_decl);
12577 if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
12578 DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
12580 else
12582 b = current_static_block;
12584 if (BLOCK_SUPERCONTEXT (b))
12585 current_static_block = BLOCK_SUPERCONTEXT (b);
12587 return b;
12590 /* Lookup for NAME in the nested function's blocks, all the way up to
12591 the current toplevel one. It complies with Java's local variable
12592 scoping rules. */
12594 static tree
12595 lookup_name_in_blocks (tree name)
12597 tree b = GET_CURRENT_BLOCK (current_function_decl);
12599 while (b != current_function_decl)
12601 tree current;
12603 /* Paranoid sanity check. To be removed */
12604 if (TREE_CODE (b) != BLOCK)
12605 abort ();
12607 for (current = BLOCK_EXPR_DECLS (b); current;
12608 current = TREE_CHAIN (current))
12609 if (DECL_NAME (current) == name)
12610 return current;
12611 b = BLOCK_SUPERCONTEXT (b);
12613 return NULL_TREE;
12616 static void
12617 maybe_absorb_scoping_blocks (void)
12619 while (BLOCK_IS_IMPLICIT (GET_CURRENT_BLOCK (current_function_decl)))
12621 tree b = exit_block ();
12622 java_method_add_stmt (current_function_decl, b);
12623 SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", input_line));
12628 /* This section of the source is reserved to build_* functions that
12629 are building incomplete tree nodes and the patch_* functions that
12630 are completing them. */
12632 /* Wrap a non WFL node around a WFL. */
12634 static tree
12635 build_wfl_wrap (tree node, int location)
12637 tree wfl, node_to_insert = node;
12639 /* We want to process THIS . xxx symbolically, to keep it consistent
12640 with the way we're processing SUPER. A THIS from a primary as a
12641 different form than a SUPER. Turn THIS into something symbolic */
12642 if (TREE_CODE (node) == THIS_EXPR)
12643 node_to_insert = wfl = build_wfl_node (this_identifier_node);
12644 else
12645 #ifdef USE_MAPPED_LOCATION
12646 wfl = build_unknown_wfl (NULL_TREE);
12648 SET_EXPR_LOCATION (wfl, location);
12649 #else
12650 wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
12652 EXPR_WFL_LINECOL (wfl) = location;
12653 #endif
12654 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
12655 return wfl;
12658 /* Build a super() constructor invocation. Returns an empty statement if
12659 we're currently dealing with the class java.lang.Object. */
12661 static tree
12662 build_super_invocation (tree mdecl)
12664 if (DECL_CONTEXT (mdecl) == object_type_node)
12665 return build_java_empty_stmt ();
12666 else
12668 tree super_wfl = build_wfl_node (super_identifier_node);
12669 tree a = NULL_TREE, t;
12671 /* This is called after parsing is done, so the parser context
12672 won't be accurate. Set location info from current_class decl. */
12673 tree class_wfl = lookup_cl (TYPE_NAME (current_class));
12674 EXPR_WFL_LINECOL (super_wfl) = EXPR_WFL_LINECOL (class_wfl);
12676 /* If we're dealing with an anonymous class, pass the arguments
12677 of the crafted constructor along. */
12678 if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
12680 SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
12681 for (; t != end_params_node; t = TREE_CHAIN (t))
12682 a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
12684 return build_method_invocation (super_wfl, a);
12688 /* Build a SUPER/THIS qualified method invocation. */
12690 static tree
12691 build_this_super_qualified_invocation (int use_this, tree name, tree args,
12692 int lloc, int rloc)
12694 tree invok;
12695 tree wfl =
12696 build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
12697 EXPR_WFL_LINECOL (wfl) = lloc;
12698 invok = build_method_invocation (name, args);
12699 return make_qualified_primary (wfl, invok, rloc);
12702 /* Build an incomplete CALL_EXPR node. */
12704 static tree
12705 build_method_invocation (tree name, tree args)
12707 tree call = build3 (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
12708 TREE_SIDE_EFFECTS (call) = 1;
12709 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12710 return call;
12713 /* Build an incomplete new xxx(...) node. */
12715 static tree
12716 build_new_invocation (tree name, tree args)
12718 tree call = build3 (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
12719 TREE_SIDE_EFFECTS (call) = 1;
12720 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12721 return call;
12724 /* Build an incomplete assignment expression. */
12726 static tree
12727 build_assignment (int op, int op_location, tree lhs, tree rhs)
12729 tree assignment;
12730 /* Build the corresponding binop if we deal with a Compound
12731 Assignment operator. Mark the binop sub-tree as part of a
12732 Compound Assignment expression */
12733 if (op != ASSIGN_TK)
12735 rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
12736 COMPOUND_ASSIGN_P (rhs) = 1;
12738 assignment = build2 (MODIFY_EXPR, NULL_TREE, lhs, rhs);
12739 TREE_SIDE_EFFECTS (assignment) = 1;
12740 EXPR_WFL_LINECOL (assignment) = op_location;
12741 return assignment;
12744 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12745 the buffer. This is used only for string conversion. */
12746 static char *
12747 string_convert_int_cst (tree node)
12749 /* Long.MIN_VALUE is -9223372036854775808, 20 characters. */
12750 static char buffer[21];
12752 unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
12753 unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
12754 char *p = buffer + sizeof (buffer);
12755 int neg = 0;
12757 unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
12758 << (HOST_BITS_PER_WIDE_INT - 1));
12760 *--p = '\0';
12762 /* If negative, note the fact and negate the value. */
12763 if ((hi & hibit))
12765 lo = ~lo;
12766 hi = ~hi;
12767 if (++lo == 0)
12768 ++hi;
12769 neg = 1;
12772 /* Divide by 10 until there are no bits left. */
12775 unsigned HOST_WIDE_INT acc = 0;
12776 unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
12777 unsigned int i;
12779 /* Use long division to compute the result and the remainder. */
12780 for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
12782 /* Shift a bit into accumulator. */
12783 acc <<= 1;
12784 if ((hi & hibit))
12785 acc |= 1;
12787 /* Shift the value. */
12788 hi <<= 1;
12789 if ((lo & hibit))
12790 hi |= 1;
12791 lo <<= 1;
12793 /* Shift the correct bit into the result. */
12794 outhi <<= 1;
12795 if ((outlo & hibit))
12796 outhi |= 1;
12797 outlo <<= 1;
12798 if (acc >= 10)
12800 acc -= 10;
12801 outlo |= 1;
12805 /* '0' == 060 in Java, but might not be here (think EBCDIC). */
12806 *--p = '\060' + acc;
12808 hi = outhi;
12809 lo = outlo;
12811 while (hi || lo);
12813 if (neg)
12814 *--p = '\055'; /* '-' == 055 in Java, but might not be here. */
12816 return p;
12819 /* Print an INTEGER_CST node in a static buffer, and return the
12820 buffer. This is used only for error handling. */
12821 char *
12822 print_int_node (tree node)
12824 static char buffer [80];
12825 if (TREE_CONSTANT_OVERFLOW (node))
12826 sprintf (buffer, "<overflow>");
12828 if (TREE_INT_CST_HIGH (node) == 0)
12829 sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
12830 TREE_INT_CST_LOW (node));
12831 else if (TREE_INT_CST_HIGH (node) == -1
12832 && TREE_INT_CST_LOW (node) != 0)
12833 sprintf (buffer, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
12834 -TREE_INT_CST_LOW (node));
12835 else
12836 sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
12837 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
12839 return buffer;
12843 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12844 context. */
12846 /* 15.25 Assignment operators. */
12848 static tree
12849 patch_assignment (tree node, tree wfl_op1)
12851 tree rhs = TREE_OPERAND (node, 1);
12852 tree lvalue = TREE_OPERAND (node, 0), llvalue;
12853 tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
12854 int error_found = 0;
12855 int lvalue_from_array = 0;
12856 int is_return = 0;
12858 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12860 /* Lhs can be a named variable */
12861 if (JDECL_P (lvalue))
12863 lhs_type = TREE_TYPE (lvalue);
12865 /* Or Lhs can be an array access. */
12866 else if (TREE_CODE (lvalue) == ARRAY_REF)
12868 lhs_type = TREE_TYPE (lvalue);
12869 lvalue_from_array = 1;
12871 /* Or a field access */
12872 else if (TREE_CODE (lvalue) == COMPONENT_REF)
12873 lhs_type = TREE_TYPE (lvalue);
12874 /* Or a function return slot */
12875 else if (TREE_CODE (lvalue) == RESULT_DECL)
12877 /* If the return type is an integral type, then we create the
12878 RESULT_DECL with a promoted type, but we need to do these
12879 checks against the unpromoted type to ensure type safety. So
12880 here we look at the real type, not the type of the decl we
12881 are modifying. */
12882 lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
12883 is_return = 1;
12885 /* Otherwise, we might want to try to write into an optimized static
12886 final, this is an of a different nature, reported further on. */
12887 else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
12888 && resolve_expression_name (wfl_op1, &llvalue))
12890 lhs_type = TREE_TYPE (lvalue);
12892 else
12894 parse_error_context (wfl_op1, "Invalid left hand side of assignment");
12895 error_found = 1;
12898 rhs_type = TREE_TYPE (rhs);
12900 /* 5.1 Try the assignment conversion for builtin type. */
12901 new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
12903 /* 5.2 If it failed, try a reference conversion */
12904 if (!new_rhs)
12905 new_rhs = try_reference_assignconv (lhs_type, rhs);
12907 /* 15.25.2 If we have a compound assignment, convert RHS into the
12908 type of the LHS */
12909 else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12910 new_rhs = convert (lhs_type, rhs);
12912 /* Explicit cast required. This is an error */
12913 if (!new_rhs)
12915 char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
12916 char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
12917 tree wfl;
12918 char operation [32]; /* Max size known */
12920 /* If the assignment is part of a declaration, we use the WFL of
12921 the declared variable to point out the error and call it a
12922 declaration problem. If the assignment is a genuine =
12923 operator, we call is a operator `=' problem, otherwise we
12924 call it an assignment problem. In both of these last cases,
12925 we use the WFL of the operator to indicate the error. */
12927 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
12929 wfl = wfl_op1;
12930 strcpy (operation, "declaration");
12932 else
12934 wfl = wfl_operator;
12935 if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12936 strcpy (operation, "assignment");
12937 else if (is_return)
12938 strcpy (operation, "'return'");
12939 else
12940 strcpy (operation, "'='");
12943 if (!valid_cast_to_p (rhs_type, lhs_type))
12944 parse_error_context
12945 (wfl, "Incompatible type for %s. Can't convert %qs to %qs",
12946 operation, t1, t2);
12947 else
12948 parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert %qs to %qs",
12949 operation, t1, t2);
12950 free (t1); free (t2);
12951 error_found = 1;
12954 if (error_found)
12955 return error_mark_node;
12957 /* If we're processing a `return' statement, promote the actual type
12958 to the promoted type. */
12959 if (is_return)
12960 new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
12962 /* 10.10: Array Store Exception runtime check */
12963 if (!flag_emit_class_files
12964 && lvalue_from_array
12965 && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
12967 tree array, store_check, base, index_expr;
12969 /* Save RHS so that it doesn't get re-evaluated by the store check. */
12970 new_rhs = save_expr (new_rhs);
12972 /* Get the INDIRECT_REF. */
12973 array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
12974 /* Get the array pointer expr. */
12975 array = TREE_OPERAND (array, 0);
12976 store_check = build_java_arraystore_check (array, new_rhs);
12978 index_expr = TREE_OPERAND (lvalue, 1);
12980 if (TREE_CODE (index_expr) == COMPOUND_EXPR)
12982 /* A COMPOUND_EXPR here is a bounds check. The bounds check must
12983 happen before the store check, so prepare to insert the store
12984 check within the second operand of the existing COMPOUND_EXPR. */
12985 base = index_expr;
12987 else
12988 base = lvalue;
12990 index_expr = TREE_OPERAND (base, 1);
12991 TREE_OPERAND (base, 1) = build2 (COMPOUND_EXPR, TREE_TYPE (index_expr),
12992 store_check, index_expr);
12995 /* Final locals can be used as case values in switch
12996 statement. Prepare them for this eventuality. */
12997 if (TREE_CODE (lvalue) == VAR_DECL
12998 && DECL_FINAL (lvalue)
12999 && TREE_CONSTANT (new_rhs)
13000 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
13001 && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
13004 TREE_CONSTANT (lvalue) = 1;
13005 TREE_INVARIANT (lvalue) = 1;
13006 DECL_INITIAL (lvalue) = new_rhs;
13009 /* Copy the rhs if it's a reference. */
13010 if (! flag_check_references && ! flag_emit_class_files && optimize > 0)
13012 switch (TREE_CODE (new_rhs))
13014 case ARRAY_REF:
13015 case INDIRECT_REF:
13016 case COMPONENT_REF:
13017 /* Transform a = foo.bar
13018 into a = ({int tmp; tmp = foo.bar;}).
13019 We need to ensure that if a read from memory fails
13020 because of a NullPointerException, a destination variable
13021 will remain unchanged. An explicit temporary does what
13022 we need.
13024 If flag_check_references is set, this is unnecessary
13025 because we'll check each reference before doing any
13026 reads. If optimize is not set the result will never be
13027 written to a stack slot that contains the LHS. */
13029 tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"),
13030 TREE_TYPE (new_rhs));
13031 tree block = make_node (BLOCK);
13032 tree assignment
13033 = build2 (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
13034 DECL_CONTEXT (tmp) = current_function_decl;
13035 TREE_TYPE (block) = TREE_TYPE (new_rhs);
13036 BLOCK_VARS (block) = tmp;
13037 BLOCK_EXPR_BODY (block) = assignment;
13038 TREE_SIDE_EFFECTS (block) = 1;
13039 new_rhs = block;
13041 break;
13042 default:
13043 break;
13047 TREE_OPERAND (node, 0) = lvalue;
13048 TREE_OPERAND (node, 1) = new_rhs;
13049 TREE_TYPE (node) = lhs_type;
13050 return node;
13053 /* Check that type SOURCE can be cast into type DEST. If the cast
13054 can't occur at all, return NULL; otherwise, return a possibly
13055 modified rhs. */
13057 static tree
13058 try_reference_assignconv (tree lhs_type, tree rhs)
13060 tree new_rhs = NULL_TREE;
13061 tree rhs_type = TREE_TYPE (rhs);
13063 if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
13065 /* `null' may be assigned to any reference type */
13066 if (rhs == null_pointer_node)
13067 new_rhs = null_pointer_node;
13068 /* Try the reference assignment conversion */
13069 else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
13070 new_rhs = rhs;
13071 /* This is a magic assignment that we process differently */
13072 else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
13073 new_rhs = rhs;
13075 return new_rhs;
13078 /* Check that RHS can be converted into LHS_TYPE by the assignment
13079 conversion (5.2), for the cases of RHS being a builtin type. Return
13080 NULL_TREE if the conversion fails or if because RHS isn't of a
13081 builtin type. Return a converted RHS if the conversion is possible. */
13083 static tree
13084 try_builtin_assignconv (tree wfl_op1, tree lhs_type, tree rhs)
13086 tree new_rhs = NULL_TREE;
13087 tree rhs_type = TREE_TYPE (rhs);
13089 /* Handle boolean specially. */
13090 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
13091 || TREE_CODE (lhs_type) == BOOLEAN_TYPE)
13093 if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
13094 && TREE_CODE (lhs_type) == BOOLEAN_TYPE)
13095 new_rhs = rhs;
13098 /* 5.1.1 Try Identity Conversion,
13099 5.1.2 Try Widening Primitive Conversion */
13100 else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
13101 new_rhs = convert (lhs_type, rhs);
13103 /* Try a narrowing primitive conversion (5.1.3):
13104 - expression is a constant expression of type byte, short, char,
13105 or int, AND
13106 - variable is byte, short or char AND
13107 - The value of the expression is representable in the type of the
13108 variable */
13109 else if ((rhs_type == byte_type_node || rhs_type == short_type_node
13110 || rhs_type == char_type_node || rhs_type == int_type_node)
13111 && TREE_CONSTANT (rhs)
13112 && (lhs_type == byte_type_node || lhs_type == char_type_node
13113 || lhs_type == short_type_node))
13115 if (int_fits_type_p (rhs, lhs_type))
13116 new_rhs = convert (lhs_type, rhs);
13117 else if (wfl_op1) /* Might be called with a NULL */
13118 parse_warning_context
13119 (wfl_op1,
13120 "Constant expression %qs too wide for narrowing primitive conversion to %qs",
13121 print_int_node (rhs), lang_printable_name (lhs_type, 0));
13122 /* Reported a warning that will turn into an error further
13123 down, so we don't return */
13126 return new_rhs;
13129 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
13130 conversion (5.1.1) or widening primitive conversion (5.1.2). Return
13131 0 is the conversion test fails. This implements parts the method
13132 invocation conversion (5.3). */
13134 static int
13135 valid_builtin_assignconv_identity_widening_p (tree lhs_type, tree rhs_type)
13137 /* 5.1.1: This is the identity conversion part. */
13138 if (lhs_type == rhs_type)
13139 return 1;
13141 /* Reject non primitive types and boolean conversions. */
13142 if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
13143 return 0;
13145 /* 5.1.2: widening primitive conversion. byte, even if it's smaller
13146 than a char can't be converted into a char. Short can't too, but
13147 the < test below takes care of that */
13148 if (lhs_type == char_type_node && rhs_type == byte_type_node)
13149 return 0;
13151 /* Accept all promoted type here. Note, we can't use <= in the test
13152 below, because we still need to bounce out assignments of short
13153 to char and the likes */
13154 if (lhs_type == int_type_node
13155 && (rhs_type == promoted_byte_type_node
13156 || rhs_type == promoted_short_type_node
13157 || rhs_type == promoted_char_type_node
13158 || rhs_type == promoted_boolean_type_node))
13159 return 1;
13161 /* From here, an integral is widened if its precision is smaller
13162 than the precision of the LHS or if the LHS is a floating point
13163 type, or the RHS is a float and the RHS a double. */
13164 if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
13165 && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
13166 || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
13167 || (rhs_type == float_type_node && lhs_type == double_type_node))
13168 return 1;
13170 return 0;
13173 /* Check that something of SOURCE type can be assigned or cast to
13174 something of DEST type at runtime. Return 1 if the operation is
13175 valid, 0 otherwise. If CAST is set to 1, we're treating the case
13176 were SOURCE is cast into DEST, which borrows a lot of the
13177 assignment check. */
13179 static int
13180 valid_ref_assignconv_cast_p (tree source, tree dest, int cast)
13182 /* SOURCE or DEST might be null if not from a declared entity. */
13183 if (!source || !dest)
13184 return 0;
13185 if (JNULLP_TYPE_P (source))
13186 return 1;
13187 if (TREE_CODE (source) == POINTER_TYPE)
13188 source = TREE_TYPE (source);
13189 if (TREE_CODE (dest) == POINTER_TYPE)
13190 dest = TREE_TYPE (dest);
13192 /* If source and dest are being compiled from bytecode, they may need to
13193 be loaded. */
13194 if (CLASS_P (source) && !CLASS_LOADED_P (source))
13196 load_class (source, 1);
13197 safe_layout_class (source);
13199 if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
13201 load_class (dest, 1);
13202 safe_layout_class (dest);
13205 /* Case where SOURCE is a class type */
13206 if (TYPE_CLASS_P (source))
13208 if (TYPE_CLASS_P (dest))
13209 return (source == dest
13210 || inherits_from_p (source, dest)
13211 || (cast && inherits_from_p (dest, source)));
13212 if (TYPE_INTERFACE_P (dest))
13214 /* If doing a cast and SOURCE is final, the operation is
13215 always correct a compile time (because even if SOURCE
13216 does not implement DEST, a subclass of SOURCE might). */
13217 if (cast && !CLASS_FINAL (TYPE_NAME (source)))
13218 return 1;
13219 /* Otherwise, SOURCE must implement DEST */
13220 return interface_of_p (dest, source);
13222 /* DEST is an array, cast permitted if SOURCE is of Object type */
13223 return (cast && source == object_type_node ? 1 : 0);
13225 if (TYPE_INTERFACE_P (source))
13227 if (TYPE_CLASS_P (dest))
13229 /* If not casting, DEST must be the Object type */
13230 if (!cast)
13231 return dest == object_type_node;
13232 /* We're doing a cast. The cast is always valid is class
13233 DEST is not final, otherwise, DEST must implement SOURCE */
13234 else if (!CLASS_FINAL (TYPE_NAME (dest)))
13235 return 1;
13236 else
13237 return interface_of_p (source, dest);
13239 if (TYPE_INTERFACE_P (dest))
13241 /* If doing a cast, then if SOURCE and DEST contain method
13242 with the same signature but different return type, then
13243 this is a (compile time) error */
13244 if (cast)
13246 tree method_source, method_dest;
13247 tree source_type;
13248 tree source_sig;
13249 tree source_name;
13250 for (method_source = TYPE_METHODS (source); method_source;
13251 method_source = TREE_CHAIN (method_source))
13253 source_sig =
13254 build_java_argument_signature (TREE_TYPE (method_source));
13255 source_type = TREE_TYPE (TREE_TYPE (method_source));
13256 source_name = DECL_NAME (method_source);
13257 for (method_dest = TYPE_METHODS (dest);
13258 method_dest; method_dest = TREE_CHAIN (method_dest))
13259 if (source_sig ==
13260 build_java_argument_signature (TREE_TYPE (method_dest))
13261 && source_name == DECL_NAME (method_dest)
13262 && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
13263 return 0;
13265 return 1;
13267 else
13268 return source == dest || interface_of_p (dest, source);
13270 else
13272 /* Array */
13273 return (cast
13274 && (DECL_NAME (TYPE_NAME (source))
13275 == java_lang_cloneable_identifier_node
13276 || (DECL_NAME (TYPE_NAME (source))
13277 == java_io_serializable_identifier_node)));
13280 if (TYPE_ARRAY_P (source))
13282 if (TYPE_CLASS_P (dest))
13283 return dest == object_type_node;
13284 /* Can't cast an array to an interface unless the interface is
13285 java.lang.Cloneable or java.io.Serializable. */
13286 if (TYPE_INTERFACE_P (dest))
13287 return (DECL_NAME (TYPE_NAME (dest))
13288 == java_lang_cloneable_identifier_node
13289 || (DECL_NAME (TYPE_NAME (dest))
13290 == java_io_serializable_identifier_node));
13291 else /* Arrays */
13293 tree source_element_type = TYPE_ARRAY_ELEMENT (source);
13294 tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
13296 /* In case of severe errors, they turn out null */
13297 if (!dest_element_type || !source_element_type)
13298 return 0;
13299 if (source_element_type == dest_element_type)
13300 return 1;
13301 return valid_ref_assignconv_cast_p (source_element_type,
13302 dest_element_type, cast);
13304 return 0;
13306 return 0;
13309 static int
13310 valid_cast_to_p (tree source, tree dest)
13312 if (TREE_CODE (source) == POINTER_TYPE)
13313 source = TREE_TYPE (source);
13314 if (TREE_CODE (dest) == POINTER_TYPE)
13315 dest = TREE_TYPE (dest);
13317 if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
13318 return valid_ref_assignconv_cast_p (source, dest, 1);
13320 else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
13321 return 1;
13323 else if (TREE_CODE (source) == BOOLEAN_TYPE
13324 && TREE_CODE (dest) == BOOLEAN_TYPE)
13325 return 1;
13327 return 0;
13330 static tree
13331 do_unary_numeric_promotion (tree arg)
13333 tree type = TREE_TYPE (arg);
13334 if (TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
13335 arg = convert (int_type_node, arg);
13336 return arg;
13339 /* Return a nonzero value if SOURCE can be converted into DEST using
13340 the method invocation conversion rule (5.3). */
13341 static int
13342 valid_method_invocation_conversion_p (tree dest, tree source)
13344 return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
13345 && valid_builtin_assignconv_identity_widening_p (dest, source))
13346 || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
13347 && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
13348 && valid_ref_assignconv_cast_p (source, dest, 0)));
13351 /* Build an incomplete binop expression. */
13353 static tree
13354 build_binop (enum tree_code op, int op_location, tree op1, tree op2)
13356 tree binop = build2 (op, NULL_TREE, op1, op2);
13357 TREE_SIDE_EFFECTS (binop) = 1;
13358 /* Store the location of the operator, for better error report. The
13359 string of the operator will be rebuild based on the OP value. */
13360 EXPR_WFL_LINECOL (binop) = op_location;
13361 return binop;
13364 /* Build the string of the operator retained by NODE. If NODE is part
13365 of a compound expression, add an '=' at the end of the string. This
13366 function is called when an error needs to be reported on an
13367 operator. The string is returned as a pointer to a static character
13368 buffer. */
13370 static char *
13371 operator_string (tree node)
13373 #define BUILD_OPERATOR_STRING(S) \
13375 sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
13376 return buffer; \
13379 static char buffer [10];
13380 switch (TREE_CODE (node))
13382 case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
13383 case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
13384 case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
13385 case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13386 case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
13387 case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
13388 case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
13389 case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
13390 case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
13391 case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
13392 case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
13393 case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
13394 case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
13395 case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
13396 case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
13397 case GT_EXPR: BUILD_OPERATOR_STRING (">");
13398 case GE_EXPR: BUILD_OPERATOR_STRING (">=");
13399 case LT_EXPR: BUILD_OPERATOR_STRING ("<");
13400 case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
13401 case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13402 case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
13403 case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
13404 case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
13405 case PREINCREMENT_EXPR: /* Fall through */
13406 case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
13407 case PREDECREMENT_EXPR: /* Fall through */
13408 case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
13409 default:
13410 internal_error ("unregistered operator %s",
13411 tree_code_name [TREE_CODE (node)]);
13413 return NULL;
13414 #undef BUILD_OPERATOR_STRING
13417 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2. */
13419 static int
13420 java_decl_equiv (tree var_acc1, tree var_acc2)
13422 if (JDECL_P (var_acc1))
13423 return (var_acc1 == var_acc2);
13425 return (TREE_CODE (var_acc1) == COMPONENT_REF
13426 && TREE_CODE (var_acc2) == COMPONENT_REF
13427 && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
13428 == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
13429 && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
13432 /* Return a nonzero value if CODE is one of the operators that can be
13433 used in conjunction with the `=' operator in a compound assignment. */
13435 static int
13436 binop_compound_p (enum tree_code code)
13438 int i;
13439 for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
13440 if (binop_lookup [i] == code)
13441 break;
13443 return i < BINOP_COMPOUND_CANDIDATES;
13446 /* Reorganize after a fold to get SAVE_EXPR to generate what we want. */
13448 static tree
13449 java_refold (tree t)
13451 tree c, b, ns, decl;
13453 if (TREE_CODE (t) != MODIFY_EXPR)
13454 return t;
13456 c = TREE_OPERAND (t, 1);
13457 if (! (c && TREE_CODE (c) == COMPOUND_EXPR
13458 && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
13459 && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
13460 return t;
13462 /* Now the left branch of the binary operator. */
13463 b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
13464 if (! (b && TREE_CODE (b) == NOP_EXPR
13465 && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
13466 return t;
13468 ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
13469 if (! (ns && TREE_CODE (ns) == NOP_EXPR
13470 && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
13471 return t;
13473 decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
13474 if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
13475 /* It's got to be the an equivalent decl */
13476 && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
13478 /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13479 TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
13480 /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13481 TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
13482 /* Change the right part of the BINOP_EXPR */
13483 TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
13486 return t;
13489 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13490 errors but we modify NODE so that it contains the type computed
13491 according to the expression, when it's fixed. Otherwise, we write
13492 error_mark_node as the type. It allows us to further the analysis
13493 of remaining nodes and detects more errors in certain cases. */
13495 static tree
13496 patch_binop (tree node, tree wfl_op1, tree wfl_op2, int folding)
13498 tree op1 = TREE_OPERAND (node, 0);
13499 tree op2 = TREE_OPERAND (node, 1);
13500 tree op1_type = TREE_TYPE (op1);
13501 tree op2_type = TREE_TYPE (op2);
13502 tree prom_type = NULL_TREE, cn;
13503 enum tree_code code = TREE_CODE (node);
13505 /* If 1, tell the routine that we have to return error_mark_node
13506 after checking for the initialization of the RHS */
13507 int error_found = 0;
13509 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13511 /* If either op<n>_type are NULL, this might be early signs of an
13512 error situation, unless it's too early to tell (in case we're
13513 handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13514 correctly so the error can be later on reported accurately. */
13515 if (! (code == PLUS_EXPR || code == NE_EXPR
13516 || code == EQ_EXPR || code == INSTANCEOF_EXPR))
13518 tree n;
13519 if (! op1_type)
13521 n = java_complete_tree (op1);
13522 op1_type = TREE_TYPE (n);
13524 if (! op2_type)
13526 n = java_complete_tree (op2);
13527 op2_type = TREE_TYPE (n);
13531 switch (code)
13533 /* 15.16 Multiplicative operators */
13534 case MULT_EXPR: /* 15.16.1 Multiplication Operator * */
13535 case RDIV_EXPR: /* 15.16.2 Division Operator / */
13536 case TRUNC_DIV_EXPR: /* 15.16.2 Integral type Division Operator / */
13537 case TRUNC_MOD_EXPR: /* 15.16.3 Remainder operator % */
13538 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13540 if (!JNUMERIC_TYPE_P (op1_type))
13541 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13542 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13543 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13544 TREE_TYPE (node) = error_mark_node;
13545 error_found = 1;
13546 break;
13548 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13550 /* Detect integral division by zero */
13551 if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
13552 && TREE_CODE (prom_type) == INTEGER_TYPE
13553 && (op2 == integer_zero_node || op2 == long_zero_node ||
13554 (TREE_CODE (op2) == INTEGER_CST &&
13555 ! TREE_INT_CST_LOW (op2) && ! TREE_INT_CST_HIGH (op2))))
13557 parse_warning_context
13558 (wfl_operator,
13559 "Evaluating this expression will result in an arithmetic exception being thrown");
13560 TREE_CONSTANT (node) = 0;
13561 TREE_INVARIANT (node) = 0;
13564 /* Change the division operator if necessary */
13565 if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
13566 TREE_SET_CODE (node, TRUNC_DIV_EXPR);
13568 /* Before divisions as is disappear, try to simplify and bail if
13569 applicable, otherwise we won't perform even simple
13570 simplifications like (1-1)/3. We can't do that with floating
13571 point number, folds can't handle them at this stage. */
13572 if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
13573 && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
13575 TREE_TYPE (node) = prom_type;
13576 node = fold (node);
13577 if (TREE_CODE (node) != code)
13578 return node;
13581 if (TREE_CODE (prom_type) == INTEGER_TYPE
13582 && flag_use_divide_subroutine
13583 && ! flag_emit_class_files
13584 && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
13585 return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
13587 /* This one is more complicated. FLOATs are processed by a
13588 function call to soft_fmod. Duplicate the value of the
13589 COMPOUND_ASSIGN_P flag. */
13590 if (code == TRUNC_MOD_EXPR)
13592 tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
13593 COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
13594 return mod;
13596 break;
13598 /* 15.17 Additive Operators */
13599 case PLUS_EXPR: /* 15.17.1 String Concatenation Operator + */
13601 /* Operation is valid if either one argument is a string
13602 constant, a String object or a StringBuffer crafted for the
13603 purpose of the a previous usage of the String concatenation
13604 operator */
13606 if (TREE_CODE (op1) == STRING_CST
13607 || TREE_CODE (op2) == STRING_CST
13608 || JSTRING_TYPE_P (op1_type)
13609 || JSTRING_TYPE_P (op2_type)
13610 || IS_CRAFTED_STRING_BUFFER_P (op1)
13611 || IS_CRAFTED_STRING_BUFFER_P (op2))
13612 return build_string_concatenation (op1, op2);
13614 case MINUS_EXPR: /* 15.17.2 Additive Operators (+ and -) for
13615 Numeric Types */
13616 if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13618 if (!JNUMERIC_TYPE_P (op1_type))
13619 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13620 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13621 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13622 TREE_TYPE (node) = error_mark_node;
13623 error_found = 1;
13624 break;
13626 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13627 break;
13629 /* 15.18 Shift Operators */
13630 case LSHIFT_EXPR:
13631 case RSHIFT_EXPR:
13632 case URSHIFT_EXPR:
13633 if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
13635 if (!JINTEGRAL_TYPE_P (op1_type))
13636 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13637 else
13639 if (JNUMERIC_TYPE_P (op2_type))
13640 parse_error_context (wfl_operator,
13641 "Incompatible type for %qs. Explicit cast needed to convert shift distance from %qs to integral",
13642 operator_string (node),
13643 lang_printable_name (op2_type, 0));
13644 else
13645 parse_error_context (wfl_operator,
13646 "Incompatible type for %qs. Can't convert shift distance from %qs to integral",
13647 operator_string (node),
13648 lang_printable_name (op2_type, 0));
13650 TREE_TYPE (node) = error_mark_node;
13651 error_found = 1;
13652 break;
13655 /* Unary numeric promotion (5.6.1) is performed on each operand
13656 separately */
13657 op1 = do_unary_numeric_promotion (op1);
13658 op2 = do_unary_numeric_promotion (op2);
13660 /* If the right hand side is of type `long', first cast it to
13661 `int'. */
13662 if (TREE_TYPE (op2) == long_type_node)
13663 op2 = build1 (CONVERT_EXPR, int_type_node, op2);
13665 /* The type of the shift expression is the type of the promoted
13666 type of the left-hand operand */
13667 prom_type = TREE_TYPE (op1);
13669 /* Shift int only up to 0x1f and long up to 0x3f */
13670 if (prom_type == int_type_node)
13671 op2 = fold_build2 (BIT_AND_EXPR, int_type_node, op2,
13672 build_int_cst (NULL_TREE, 0x1f));
13673 else
13674 op2 = fold_build2 (BIT_AND_EXPR, int_type_node, op2,
13675 build_int_cst (NULL_TREE, 0x3f));
13677 /* The >>> operator is a >> operating on unsigned quantities */
13678 if (code == URSHIFT_EXPR && (folding || ! flag_emit_class_files))
13680 tree to_return;
13681 tree utype = java_unsigned_type (prom_type);
13682 op1 = convert (utype, op1);
13684 to_return = fold_build2 (RSHIFT_EXPR, utype, op1, op2);
13685 to_return = convert (prom_type, to_return);
13686 /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13687 COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
13688 TREE_SIDE_EFFECTS (to_return)
13689 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13690 return to_return;
13692 break;
13694 /* 15.19.1 Type Comparison Operator instanceof */
13695 case INSTANCEOF_EXPR:
13697 TREE_TYPE (node) = boolean_type_node;
13699 /* OP1_TYPE might be NULL when OP1 is a string constant. */
13700 if ((cn = patch_string (op1)))
13702 op1 = cn;
13703 op1_type = TREE_TYPE (op1);
13705 if (op1_type == NULL_TREE)
13706 abort ();
13708 if (!(op2_type = resolve_type_during_patch (op2)))
13709 return error_mark_node;
13711 /* The first operand must be a reference type or the null type */
13712 if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
13713 error_found = 1; /* Error reported further below */
13715 /* The second operand must be a reference type */
13716 if (!JREFERENCE_TYPE_P (op2_type))
13718 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
13719 parse_error_context
13720 (wfl_operator, "Invalid argument %qs for %<instanceof%>",
13721 lang_printable_name (op2_type, 0));
13722 error_found = 1;
13725 if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
13727 /* If the first operand is null, the result is always false */
13728 if (op1 == null_pointer_node)
13729 return boolean_false_node;
13730 else if (flag_emit_class_files)
13732 TREE_OPERAND (node, 1) = op2_type;
13733 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
13734 return node;
13736 /* Otherwise we have to invoke instance of to figure it out */
13737 else
13738 return build_instanceof (op1, op2_type);
13740 /* There is no way the expression operand can be an instance of
13741 the type operand. This is a compile time error. */
13742 else
13744 char *t1 = xstrdup (lang_printable_name (op1_type, 0));
13745 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
13746 parse_error_context
13747 (wfl_operator, "Impossible for %qs to be instance of %qs",
13748 t1, lang_printable_name (op2_type, 0));
13749 free (t1);
13750 error_found = 1;
13753 break;
13755 /* 15.21 Bitwise and Logical Operators */
13756 case BIT_AND_EXPR:
13757 case BIT_XOR_EXPR:
13758 case BIT_IOR_EXPR:
13759 if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
13760 /* Binary numeric promotion is performed on both operand and the
13761 expression retain that type */
13762 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13764 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
13765 && TREE_CODE (op1_type) == BOOLEAN_TYPE)
13766 /* The type of the bitwise operator expression is BOOLEAN */
13767 prom_type = boolean_type_node;
13768 else
13770 if (!JINTEGRAL_TYPE_P (op1_type))
13771 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13772 if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
13773 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
13774 TREE_TYPE (node) = error_mark_node;
13775 error_found = 1;
13776 /* Insert a break here if adding thing before the switch's
13777 break for this case */
13779 break;
13781 /* 15.22 Conditional-And Operator */
13782 case TRUTH_ANDIF_EXPR:
13783 /* 15.23 Conditional-Or Operator */
13784 case TRUTH_ORIF_EXPR:
13785 /* Operands must be of BOOLEAN type */
13786 if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
13787 TREE_CODE (op2_type) != BOOLEAN_TYPE)
13789 if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
13790 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
13791 if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
13792 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
13793 TREE_TYPE (node) = boolean_type_node;
13794 error_found = 1;
13795 break;
13797 else if (integer_zerop (op1))
13799 return code == TRUTH_ANDIF_EXPR ? op1 : op2;
13801 else if (integer_onep (op1))
13803 return code == TRUTH_ANDIF_EXPR ? op2 : op1;
13805 /* The type of the conditional operators is BOOLEAN */
13806 prom_type = boolean_type_node;
13807 break;
13809 /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13810 case LT_EXPR:
13811 case GT_EXPR:
13812 case LE_EXPR:
13813 case GE_EXPR:
13814 /* The type of each of the operands must be a primitive numeric
13815 type */
13816 if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
13818 if (!JNUMERIC_TYPE_P (op1_type))
13819 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13820 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13821 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13822 TREE_TYPE (node) = boolean_type_node;
13823 error_found = 1;
13824 break;
13826 /* Binary numeric promotion is performed on the operands */
13827 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13828 /* The type of the relation expression is always BOOLEAN */
13829 prom_type = boolean_type_node;
13830 break;
13832 /* 15.20 Equality Operator */
13833 case EQ_EXPR:
13834 case NE_EXPR:
13835 /* It's time for us to patch the strings. */
13836 if ((cn = patch_string (op1)))
13838 op1 = cn;
13839 op1_type = TREE_TYPE (op1);
13841 if ((cn = patch_string (op2)))
13843 op2 = cn;
13844 op2_type = TREE_TYPE (op2);
13847 /* 15.20.1 Numerical Equality Operators == and != */
13848 /* Binary numeric promotion is performed on the operands */
13849 if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
13850 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13852 /* 15.20.2 Boolean Equality Operators == and != */
13853 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
13854 TREE_CODE (op2_type) == BOOLEAN_TYPE)
13855 ; /* Nothing to do here */
13857 /* 15.20.3 Reference Equality Operators == and != */
13858 /* Types have to be either references or the null type. If
13859 they're references, it must be possible to convert either
13860 type to the other by casting conversion. */
13861 else if ((op1 == null_pointer_node && op2 == null_pointer_node)
13862 || (op1 == null_pointer_node && JREFERENCE_TYPE_P (op2_type))
13863 || (JREFERENCE_TYPE_P (op1_type) && op2 == null_pointer_node)
13864 || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
13865 && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
13866 || valid_ref_assignconv_cast_p (op2_type,
13867 op1_type, 1))))
13868 ; /* Nothing to do here */
13870 /* Else we have an error figure what can't be converted into
13871 what and report the error */
13872 else
13874 char *t1;
13875 t1 = xstrdup (lang_printable_name (op1_type, 0));
13876 parse_error_context
13877 (wfl_operator,
13878 "Incompatible type for %qs. Can't convert %qs to %qs",
13879 operator_string (node), t1,
13880 lang_printable_name (op2_type, 0));
13881 free (t1);
13882 TREE_TYPE (node) = boolean_type_node;
13883 error_found = 1;
13884 break;
13886 prom_type = boolean_type_node;
13887 break;
13888 default:
13889 abort ();
13892 if (error_found)
13893 return error_mark_node;
13895 TREE_OPERAND (node, 0) = op1;
13896 TREE_OPERAND (node, 1) = op2;
13897 TREE_TYPE (node) = prom_type;
13898 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13900 /* fold does not respect side-effect order as required for Java but not C.
13901 * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13902 * bytecode.
13904 if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
13905 : ! TREE_SIDE_EFFECTS (node))
13906 node = fold (node);
13907 return node;
13910 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13911 zero value, the value of CSTE comes after the valude of STRING */
13913 static tree
13914 do_merge_string_cste (tree cste, const char *string, int string_len, int after)
13916 const char *old = TREE_STRING_POINTER (cste);
13917 int old_len = TREE_STRING_LENGTH (cste);
13918 int len = old_len + string_len;
13919 char *new = alloca (len+1);
13921 if (after)
13923 memcpy (new, string, string_len);
13924 memcpy (&new [string_len], old, old_len);
13926 else
13928 memcpy (new, old, old_len);
13929 memcpy (&new [old_len], string, string_len);
13931 new [len] = '\0';
13932 return build_string (len, new);
13935 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13936 new STRING_CST on success, NULL_TREE on failure. */
13938 static tree
13939 merge_string_cste (tree op1, tree op2, int after)
13941 /* Handle two string constants right away. */
13942 if (TREE_CODE (op2) == STRING_CST)
13943 return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
13944 TREE_STRING_LENGTH (op2), after);
13946 /* Reasonable integer constant can be treated right away. */
13947 if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
13949 static const char *const boolean_true = "true";
13950 static const char *const boolean_false = "false";
13951 static const char *const null_pointer = "null";
13952 char ch[4];
13953 const char *string;
13955 if (op2 == boolean_true_node)
13956 string = boolean_true;
13957 else if (op2 == boolean_false_node)
13958 string = boolean_false;
13959 else if (op2 == null_pointer_node
13960 || (integer_zerop (op2)
13961 && TREE_CODE (TREE_TYPE (op2)) == POINTER_TYPE))
13962 /* FIXME: null is not a compile-time constant, so it is only safe to
13963 merge if the overall expression is non-constant. However, this
13964 code always merges without checking the overall expression. */
13965 string = null_pointer;
13966 else if (TREE_TYPE (op2) == char_type_node)
13968 /* Convert the character into UTF-8. */
13969 unsigned int c = (unsigned int) TREE_INT_CST_LOW (op2);
13970 unsigned char *p = (unsigned char *) ch;
13971 if (0x01 <= c && c <= 0x7f)
13972 *p++ = (unsigned char) c;
13973 else if (c < 0x7ff)
13975 *p++ = (unsigned char) (c >> 6 | 0xc0);
13976 *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13978 else
13980 *p++ = (unsigned char) (c >> 12 | 0xe0);
13981 *p++ = (unsigned char) (((c >> 6) & 0x3f) | 0x80);
13982 *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13984 *p = '\0';
13986 string = ch;
13988 else
13989 string = string_convert_int_cst (op2);
13991 return do_merge_string_cste (op1, string, strlen (string), after);
13993 return NULL_TREE;
13996 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
13997 has to be a STRING_CST and the other part must be a STRING_CST or a
13998 INTEGRAL constant. Return a new STRING_CST if the operation
13999 succeed, NULL_TREE otherwise.
14001 If the case we want to optimize for space, we might want to return
14002 NULL_TREE for each invocation of this routine. FIXME */
14004 static tree
14005 string_constant_concatenation (tree op1, tree op2)
14007 if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
14009 tree string, rest;
14010 int invert;
14012 string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
14013 rest = (string == op1 ? op2 : op1);
14014 invert = (string == op1 ? 0 : 1 );
14016 /* Walk REST, only if it looks reasonable */
14017 if (TREE_CODE (rest) != STRING_CST
14018 && !IS_CRAFTED_STRING_BUFFER_P (rest)
14019 && !JSTRING_TYPE_P (TREE_TYPE (rest))
14020 && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
14022 rest = java_complete_tree (rest);
14023 if (rest == error_mark_node)
14024 return error_mark_node;
14025 rest = fold (rest);
14027 return merge_string_cste (string, rest, invert);
14029 return NULL_TREE;
14032 /* Implement the `+' operator. Does static optimization if possible,
14033 otherwise create (if necessary) and append elements to a
14034 StringBuffer. The StringBuffer will be carried around until it is
14035 used for a function call or an assignment. Then toString() will be
14036 called on it to turn it into a String object. */
14038 static tree
14039 build_string_concatenation (tree op1, tree op2)
14041 tree result;
14042 int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
14044 /* Try to do some static optimization */
14045 if ((result = string_constant_concatenation (op1, op2)))
14046 return result;
14048 /* Discard empty strings on either side of the expression */
14049 if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
14051 op1 = op2;
14052 op2 = NULL_TREE;
14054 else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
14055 op2 = NULL_TREE;
14057 /* If operands are string constant, turn then into object references */
14058 if (TREE_CODE (op1) == STRING_CST)
14059 op1 = patch_string_cst (op1);
14060 if (op2 && TREE_CODE (op2) == STRING_CST)
14061 op2 = patch_string_cst (op2);
14063 /* If either one of the constant is null and the other non null
14064 operand is a String constant, return it. */
14065 if ((TREE_CODE (op1) == STRING_CST) && !op2)
14066 return op1;
14068 /* If OP1 isn't already a StringBuffer, create and
14069 initialize a new one */
14070 if (!IS_CRAFTED_STRING_BUFFER_P (op1))
14072 /* Two solutions here:
14073 1) OP1 is a constant string reference, we call new StringBuffer(OP1)
14074 2) OP1 is something else, we call new StringBuffer().append(OP1). */
14075 if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
14076 op1 = BUILD_STRING_BUFFER (op1);
14077 else
14079 tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
14080 op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
14084 if (op2)
14086 /* OP1 is no longer the last node holding a crafted StringBuffer */
14087 IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
14088 /* Create a node for `{new...,xxx}.append (op2)' */
14089 op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
14092 /* Mark the last node holding a crafted StringBuffer */
14093 IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
14095 TREE_SIDE_EFFECTS (op1) = side_effects;
14096 return op1;
14099 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
14100 StringBuffer. If no string were found to be patched, return
14101 NULL. */
14103 static tree
14104 patch_string (tree node)
14106 if (node == error_mark_node)
14107 return error_mark_node;
14108 if (TREE_CODE (node) == STRING_CST)
14109 return patch_string_cst (node);
14110 else if (IS_CRAFTED_STRING_BUFFER_P (node))
14112 int saved = ctxp->explicit_constructor_p;
14113 tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
14114 tree ret;
14115 /* Temporary disable forbid the use of `this'. */
14116 ctxp->explicit_constructor_p = 0;
14117 ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
14118 /* String concatenation arguments must be evaluated in order too. */
14119 ret = force_evaluation_order (ret);
14120 /* Restore it at its previous value */
14121 ctxp->explicit_constructor_p = saved;
14122 return ret;
14124 return NULL_TREE;
14127 /* Build the internal representation of a string constant. */
14129 static tree
14130 patch_string_cst (tree node)
14132 int location;
14133 if (! flag_emit_class_files)
14135 node = get_identifier (TREE_STRING_POINTER (node));
14136 location = alloc_name_constant (CONSTANT_String, node);
14137 node = build_ref_from_constant_pool (location);
14139 TREE_CONSTANT (node) = 1;
14140 TREE_INVARIANT (node) = 1;
14142 /* ??? Guessing that the class file code can't handle casts. */
14143 if (! flag_emit_class_files)
14144 node = convert (string_ptr_type_node, node);
14145 else
14146 TREE_TYPE (node) = string_ptr_type_node;
14148 return node;
14151 /* Build an incomplete unary operator expression. */
14153 static tree
14154 build_unaryop (int op_token, int op_location, tree op1)
14156 enum tree_code op;
14157 tree unaryop;
14158 switch (op_token)
14160 case PLUS_TK: op = UNARY_PLUS_EXPR; break;
14161 case MINUS_TK: op = NEGATE_EXPR; break;
14162 case NEG_TK: op = TRUTH_NOT_EXPR; break;
14163 case NOT_TK: op = BIT_NOT_EXPR; break;
14164 default: abort ();
14167 unaryop = build1 (op, NULL_TREE, op1);
14168 TREE_SIDE_EFFECTS (unaryop) = 1;
14169 /* Store the location of the operator, for better error report. The
14170 string of the operator will be rebuild based on the OP value. */
14171 EXPR_WFL_LINECOL (unaryop) = op_location;
14172 return unaryop;
14175 /* Special case for the ++/-- operators, since they require an extra
14176 argument to build, which is set to NULL and patched
14177 later. IS_POST_P is 1 if the operator, 0 otherwise. */
14179 static tree
14180 build_incdec (int op_token, int op_location, tree op1, int is_post_p)
14182 static const enum tree_code lookup [2][2] =
14184 { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
14185 { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
14187 tree node = build2 (lookup [is_post_p][(op_token - DECR_TK)],
14188 NULL_TREE, op1, NULL_TREE);
14189 TREE_SIDE_EFFECTS (node) = 1;
14190 /* Store the location of the operator, for better error report. The
14191 string of the operator will be rebuild based on the OP value. */
14192 EXPR_WFL_LINECOL (node) = op_location;
14193 return node;
14196 /* Build an incomplete cast operator, based on the use of the
14197 CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
14198 set. java_complete_tree is trained to walk a CONVERT_EXPR even
14199 though its type is already set. */
14201 static tree
14202 build_cast (int location, tree type, tree exp)
14204 tree node = build1 (CONVERT_EXPR, type, exp);
14205 EXPR_WFL_LINECOL (node) = location;
14206 return node;
14209 /* Build an incomplete class reference operator. */
14210 static tree
14211 build_incomplete_class_ref (int location, tree class_name)
14213 tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
14214 tree class_decl = GET_CPC ();
14215 tree this_class = TREE_TYPE (class_decl);
14217 /* Generate the synthetic static method `class$'. (Previously we
14218 deferred this, causing different method tables to be emitted
14219 for native code and bytecode.) */
14220 if (!TYPE_DOT_CLASS (this_class)
14221 && !JPRIMITIVE_TYPE_P (class_name)
14222 && !(TREE_CODE (class_name) == VOID_TYPE))
14224 tree cpc_list = GET_CPC_LIST();
14225 tree cpc = cpc_list;
14226 tree target_class;
14228 /* For inner classes, add a 'class$' method to their outermost
14229 context, creating it if necessary. */
14231 while (GET_NEXT_ENCLOSING_CPC(cpc))
14232 cpc = GET_NEXT_ENCLOSING_CPC(cpc);
14233 class_decl = TREE_VALUE (cpc);
14235 target_class = TREE_TYPE (class_decl);
14237 if (CLASS_INTERFACE (TYPE_NAME (target_class)))
14239 /* For interfaces, adding a static 'class$' method directly
14240 is illegal. So create an inner class to contain the new
14241 method. Empirically this matches the behavior of javac. */
14242 tree t, inner;
14243 /* We want the generated inner class inside the outermost class. */
14244 GET_CPC_LIST() = cpc;
14245 t = build_wfl_node (DECL_NAME (TYPE_NAME (object_type_node)));
14246 inner = create_anonymous_class (t);
14247 target_class = TREE_TYPE (inner);
14248 end_class_declaration (1);
14249 GET_CPC_LIST() = cpc_list;
14252 if (TYPE_DOT_CLASS (target_class) == NULL_TREE)
14253 build_dot_class_method (target_class);
14255 if (this_class != target_class)
14256 TYPE_DOT_CLASS (this_class) = TYPE_DOT_CLASS (target_class);
14259 EXPR_WFL_LINECOL (node) = location;
14260 return node;
14263 /* Complete an incomplete class reference operator. */
14264 static tree
14265 patch_incomplete_class_ref (tree node)
14267 tree type = TREE_OPERAND (node, 0);
14268 tree ref_type;
14270 if (!(ref_type = resolve_type_during_patch (type)))
14271 return error_mark_node;
14273 /* If we're not emitting class files and we know ref_type is a
14274 compiled class, build a direct reference. */
14275 if ((! flag_emit_class_files && is_compiled_class (ref_type))
14276 || JPRIMITIVE_TYPE_P (ref_type)
14277 || TREE_CODE (ref_type) == VOID_TYPE)
14279 tree dot = build_class_ref (ref_type);
14280 /* A class referenced by `foo.class' is initialized. */
14281 if (!flag_emit_class_files)
14282 dot = build_class_init (ref_type, dot);
14283 return java_complete_tree (dot);
14286 /* If we're emitting class files and we have to deal with non
14287 primitive types, we invoke the synthetic static method `class$'. */
14288 ref_type = build_dot_class_method_invocation (current_class, ref_type);
14289 return java_complete_tree (ref_type);
14292 /* 15.14 Unary operators. We return error_mark_node in case of error,
14293 but preserve the type of NODE if the type is fixed. */
14295 static tree
14296 patch_unaryop (tree node, tree wfl_op)
14298 tree op = TREE_OPERAND (node, 0);
14299 tree op_type = TREE_TYPE (op);
14300 tree prom_type = NULL_TREE, value, decl;
14301 int nested_field_flag = 0;
14302 int code = TREE_CODE (node);
14303 int error_found = 0;
14305 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14307 switch (code)
14309 /* 15.13.2 Postfix Increment Operator ++ */
14310 case POSTINCREMENT_EXPR:
14311 /* 15.13.3 Postfix Increment Operator -- */
14312 case POSTDECREMENT_EXPR:
14313 /* 15.14.1 Prefix Increment Operator ++ */
14314 case PREINCREMENT_EXPR:
14315 /* 15.14.2 Prefix Decrement Operator -- */
14316 case PREDECREMENT_EXPR:
14317 op = decl = extract_field_decl (op);
14318 nested_field_flag
14319 = nested_field_expanded_access_p (op, NULL, NULL, NULL);
14320 /* We might be trying to change an outer field accessed using
14321 access method. */
14322 if (nested_field_flag)
14324 /* Retrieve the decl of the field we're trying to access. We
14325 do that by first retrieving the function we would call to
14326 access the field. It has been already verified that this
14327 field isn't final */
14328 if (flag_emit_class_files)
14329 decl = TREE_OPERAND (op, 0);
14330 else
14331 decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
14332 decl = DECL_FUNCTION_ACCESS_DECL (decl);
14334 /* We really should have a JAVA_ARRAY_EXPR to avoid this */
14335 else if (!JDECL_P (decl)
14336 && TREE_CODE (decl) != COMPONENT_REF
14337 && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
14338 && TREE_CODE (decl) != INDIRECT_REF
14339 && !(TREE_CODE (decl) == COMPOUND_EXPR
14340 && TREE_OPERAND (decl, 1)
14341 && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
14343 TREE_TYPE (node) = error_mark_node;
14344 error_found = 1;
14347 /* From now on, we know that op if a variable and that it has a
14348 valid wfl. We use wfl_op to locate errors related to the
14349 ++/-- operand. */
14350 if (!JNUMERIC_TYPE_P (op_type))
14352 parse_error_context
14353 (wfl_op, "Invalid argument type %qs to %qs",
14354 lang_printable_name (op_type, 0), operator_string (node));
14355 TREE_TYPE (node) = error_mark_node;
14356 error_found = 1;
14358 else
14360 /* Before the addition, binary numeric promotion is performed on
14361 both operands, if really necessary */
14362 if (JINTEGRAL_TYPE_P (op_type))
14364 value = build_int_cst (op_type, 1);
14365 TREE_TYPE (node) = op_type;
14367 else
14369 value = build_int_cst (NULL_TREE, 1);
14370 TREE_TYPE (node) =
14371 binary_numeric_promotion (op_type,
14372 TREE_TYPE (value), &op, &value);
14375 /* We remember we might be accessing an outer field */
14376 if (nested_field_flag)
14378 /* We re-generate an access to the field */
14379 value = build2 (PLUS_EXPR, TREE_TYPE (op),
14380 build_nested_field_access (wfl_op, decl), value);
14382 /* And we patch the original access$() into a write
14383 with plus_op as a rhs */
14384 return nested_field_access_fix (node, op, value);
14387 /* And write back into the node. */
14388 TREE_OPERAND (node, 0) = op;
14389 TREE_OPERAND (node, 1) = value;
14390 /* Convert the overall back into its original type, if
14391 necessary, and return */
14392 if (JINTEGRAL_TYPE_P (op_type))
14393 return fold (node);
14394 else
14395 return fold (convert (op_type, node));
14397 break;
14399 /* 15.14.3 Unary Plus Operator + */
14400 case UNARY_PLUS_EXPR:
14401 /* 15.14.4 Unary Minus Operator - */
14402 case NEGATE_EXPR:
14403 if (!JNUMERIC_TYPE_P (op_type))
14405 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
14406 TREE_TYPE (node) = error_mark_node;
14407 error_found = 1;
14409 /* Unary numeric promotion is performed on operand */
14410 else
14412 op = do_unary_numeric_promotion (op);
14413 prom_type = TREE_TYPE (op);
14414 if (code == UNARY_PLUS_EXPR)
14415 return fold (op);
14417 break;
14419 /* 15.14.5 Bitwise Complement Operator ~ */
14420 case BIT_NOT_EXPR:
14421 if (!JINTEGRAL_TYPE_P (op_type))
14423 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
14424 TREE_TYPE (node) = error_mark_node;
14425 error_found = 1;
14427 else
14429 op = do_unary_numeric_promotion (op);
14430 prom_type = TREE_TYPE (op);
14432 break;
14434 /* 15.14.6 Logical Complement Operator ! */
14435 case TRUTH_NOT_EXPR:
14436 if (TREE_CODE (op_type) != BOOLEAN_TYPE)
14438 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
14439 /* But the type is known. We will report an error if further
14440 attempt of a assignment is made with this rhs */
14441 TREE_TYPE (node) = boolean_type_node;
14442 error_found = 1;
14444 else
14445 prom_type = boolean_type_node;
14446 break;
14448 /* 15.15 Cast Expression */
14449 case CONVERT_EXPR:
14450 value = patch_cast (node, wfl_operator);
14451 if (value == error_mark_node)
14453 /* If this cast is part of an assignment, we tell the code
14454 that deals with it not to complain about a mismatch,
14455 because things have been cast, anyways */
14456 TREE_TYPE (node) = error_mark_node;
14457 error_found = 1;
14459 else
14461 value = fold (value);
14462 return value;
14464 break;
14466 case NOP_EXPR:
14467 /* This can only happen when the type is already known. */
14468 gcc_assert (TREE_TYPE (node) != NULL_TREE);
14469 prom_type = TREE_TYPE (node);
14470 break;
14473 if (error_found)
14474 return error_mark_node;
14476 /* There are cases where node has been replaced by something else
14477 and we don't end up returning here: UNARY_PLUS_EXPR,
14478 CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14479 TREE_OPERAND (node, 0) = fold (op);
14480 TREE_TYPE (node) = prom_type;
14481 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
14482 return fold (node);
14485 /* Generic type resolution that sometimes takes place during node
14486 patching. Returned the resolved type or generate an error
14487 message. Return the resolved type or NULL_TREE. */
14489 static tree
14490 resolve_type_during_patch (tree type)
14492 if (unresolved_type_p (type, NULL))
14494 tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
14495 if (!type_decl)
14497 parse_error_context (type,
14498 "Class %qs not found in type declaration",
14499 IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
14500 return NULL_TREE;
14503 check_deprecation (type, type_decl);
14505 return TREE_TYPE (type_decl);
14507 return type;
14510 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14511 found. Otherwise NODE or something meant to replace it is returned. */
14513 static tree
14514 patch_cast (tree node, tree wfl_op)
14516 tree op = TREE_OPERAND (node, 0);
14517 tree cast_type = TREE_TYPE (node);
14518 tree patched, op_type;
14519 char *t1;
14521 /* Some string patching might be necessary at this stage */
14522 if ((patched = patch_string (op)))
14523 TREE_OPERAND (node, 0) = op = patched;
14524 op_type = TREE_TYPE (op);
14526 /* First resolve OP_TYPE if unresolved */
14527 if (!(cast_type = resolve_type_during_patch (cast_type)))
14528 return error_mark_node;
14530 /* Check on cast that are proven correct at compile time */
14531 if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
14533 /* Same type */
14534 if (cast_type == op_type)
14535 return node;
14537 /* A narrowing conversion from a floating-point number to an
14538 integral type requires special handling (5.1.3). */
14539 if (JFLOAT_TYPE_P (op_type) && JINTEGRAL_TYPE_P (cast_type))
14540 if (cast_type != long_type_node)
14541 op = convert (integer_type_node, op);
14543 /* Try widening/narrowing conversion. Potentially, things need
14544 to be worked out in gcc so we implement the extreme cases
14545 correctly. fold_convert() needs to be fixed. */
14546 return convert (cast_type, op);
14549 /* It's also valid to cast a boolean into a boolean */
14550 if (op_type == boolean_type_node && cast_type == boolean_type_node)
14551 return node;
14553 /* null can be casted to references */
14554 if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
14555 return build_null_of_type (cast_type);
14557 /* The remaining legal casts involve conversion between reference
14558 types. Check for their compile time correctness. */
14559 if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
14560 && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
14562 TREE_TYPE (node) = promote_type (cast_type);
14563 /* Now, the case can be determined correct at compile time if
14564 OP_TYPE can be converted into CAST_TYPE by assignment
14565 conversion (5.2) */
14567 if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
14569 TREE_SET_CODE (node, NOP_EXPR);
14570 return node;
14573 if (flag_emit_class_files)
14575 TREE_SET_CODE (node, CONVERT_EXPR);
14576 return node;
14579 /* The cast requires a run-time check */
14580 return build3 (CALL_EXPR, promote_type (cast_type),
14581 build_address_of (soft_checkcast_node),
14582 tree_cons (NULL_TREE, build_class_ref (cast_type),
14583 build_tree_list (NULL_TREE, op)),
14584 NULL_TREE);
14587 /* Any other casts are proven incorrect at compile time */
14588 t1 = xstrdup (lang_printable_name (op_type, 0));
14589 parse_error_context (wfl_op, "Invalid cast from %qs to %qs",
14590 t1, lang_printable_name (cast_type, 0));
14591 free (t1);
14592 return error_mark_node;
14595 /* Build a null constant and give it the type TYPE. */
14597 static tree
14598 build_null_of_type (tree type)
14600 tree node = build_int_cst (promote_type (type), 0);
14601 return node;
14604 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14605 a list of indices. */
14606 static tree
14607 build_array_ref (int location, tree array, tree index)
14609 tree node = build4 (ARRAY_REF, NULL_TREE, array, index,
14610 NULL_TREE, NULL_TREE);
14611 EXPR_WFL_LINECOL (node) = location;
14612 return node;
14615 /* 15.12 Array Access Expression */
14617 static tree
14618 patch_array_ref (tree node)
14620 tree array = TREE_OPERAND (node, 0);
14621 tree array_type = TREE_TYPE (array);
14622 tree index = TREE_OPERAND (node, 1);
14623 tree index_type = TREE_TYPE (index);
14624 int error_found = 0;
14626 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14628 if (TREE_CODE (array_type) == POINTER_TYPE)
14629 array_type = TREE_TYPE (array_type);
14631 /* The array reference must be an array */
14632 if (!TYPE_ARRAY_P (array_type))
14634 parse_error_context
14635 (wfl_operator,
14636 "%<[]%> can only be applied to arrays. It can't be applied to %qs",
14637 lang_printable_name (array_type, 0));
14638 TREE_TYPE (node) = error_mark_node;
14639 error_found = 1;
14642 /* The array index undergoes unary numeric promotion. The promoted
14643 type must be int */
14644 index = do_unary_numeric_promotion (index);
14645 if (TREE_TYPE (index) != int_type_node)
14647 if (valid_cast_to_p (index_type, int_type_node))
14648 parse_error_context (wfl_operator,
14649 "Incompatible type for %<[]%>. Explicit cast needed to convert %qs to %<int%>",
14650 lang_printable_name (index_type, 0));
14651 else
14652 parse_error_context (wfl_operator,
14653 "Incompatible type for %<[]%>. Can't convert %qs to %<int%>",
14654 lang_printable_name (index_type, 0));
14655 TREE_TYPE (node) = error_mark_node;
14656 error_found = 1;
14659 if (error_found)
14660 return error_mark_node;
14662 array_type = TYPE_ARRAY_ELEMENT (array_type);
14664 if (flag_emit_class_files)
14666 TREE_OPERAND (node, 0) = array;
14667 TREE_OPERAND (node, 1) = index;
14669 else
14670 node = build_java_arrayaccess (array, array_type, index);
14671 TREE_TYPE (node) = array_type;
14672 return node;
14675 /* 15.9 Array Creation Expressions */
14677 static tree
14678 build_newarray_node (tree type, tree dims, int extra_dims)
14680 tree node = build3 (NEW_ARRAY_EXPR, NULL_TREE, type,
14681 nreverse (dims),
14682 build_int_cst (NULL_TREE, extra_dims));
14683 return node;
14686 static tree
14687 patch_newarray (tree node)
14689 tree type = TREE_OPERAND (node, 0);
14690 tree dims = TREE_OPERAND (node, 1);
14691 tree cdim, array_type;
14692 int error_found = 0;
14693 int ndims = 0;
14694 int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
14696 /* Dimension types are verified. It's better for the types to be
14697 verified in order. */
14698 for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
14700 int dim_error = 0;
14701 tree dim = TREE_VALUE (cdim);
14703 /* Dim might have been saved during its evaluation */
14704 dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
14706 /* The type of each specified dimension must be an integral type. */
14707 if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
14708 dim_error = 1;
14710 /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14711 promoted type must be int. */
14712 else
14714 dim = do_unary_numeric_promotion (dim);
14715 if (TREE_TYPE (dim) != int_type_node)
14716 dim_error = 1;
14719 /* Report errors on types here */
14720 if (dim_error)
14722 parse_error_context
14723 (TREE_PURPOSE (cdim),
14724 "Incompatible type for dimension in array creation expression. %s convert %qs to %<int%>",
14725 (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
14726 "Explicit cast needed to" : "Can't"),
14727 lang_printable_name (TREE_TYPE (dim), 0));
14728 error_found = 1;
14731 TREE_PURPOSE (cdim) = NULL_TREE;
14734 /* Resolve array base type if unresolved */
14735 if (!(type = resolve_type_during_patch (type)))
14736 error_found = 1;
14738 if (error_found)
14740 /* We don't want further evaluation of this bogus array creation
14741 operation */
14742 TREE_TYPE (node) = error_mark_node;
14743 return error_mark_node;
14746 /* Set array_type to the actual (promoted) array type of the result. */
14747 if (TREE_CODE (type) == RECORD_TYPE)
14748 type = build_pointer_type (type);
14749 while (--xdims >= 0)
14751 type = promote_type (build_java_array_type (type, -1));
14753 dims = nreverse (dims);
14754 array_type = type;
14755 for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
14757 type = array_type;
14758 array_type
14759 = build_java_array_type (type,
14760 TREE_CODE (cdim) == INTEGER_CST
14761 ? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
14762 : -1);
14763 array_type = promote_type (array_type);
14765 dims = nreverse (dims);
14767 /* The node is transformed into a function call. Things are done
14768 differently according to the number of dimensions. If the number
14769 of dimension is equal to 1, then the nature of the base type
14770 (primitive or not) matters. */
14771 if (ndims == 1)
14772 return build_new_array (type, TREE_VALUE (dims));
14774 /* Can't reuse what's already written in expr.c because it uses the
14775 JVM stack representation. Provide a build_multianewarray. FIXME */
14776 return build3 (CALL_EXPR, array_type,
14777 build_address_of (soft_multianewarray_node),
14778 tree_cons (NULL_TREE,
14779 build_class_ref (TREE_TYPE (array_type)),
14780 tree_cons (NULL_TREE,
14781 build_int_cst (NULL_TREE, ndims),
14782 dims)),
14783 NULL_TREE);
14786 /* 10.6 Array initializer. */
14788 /* Build a wfl for array element that don't have one, so we can
14789 pin-point errors. */
14791 static tree
14792 maybe_build_array_element_wfl (tree node)
14794 if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
14796 /* FIXME - old code used "prev_lc.line" and "elc.prev_col */
14797 return build_expr_wfl (NULL_TREE,
14798 #ifdef USE_MAPPED_LOCATION
14799 input_location
14800 #else
14801 ctxp->filename,
14802 ctxp->lexer->token_start.line,
14803 ctxp->lexer->token_start.col
14804 #endif
14807 else
14808 return NULL_TREE;
14811 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14812 identification of initialized arrays easier to detect during walk
14813 and expansion. */
14815 static tree
14816 build_new_array_init (int location, tree values)
14818 tree constructor = build_constructor_from_list (NULL_TREE,
14819 nreverse (values));
14820 tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
14821 EXPR_WFL_LINECOL (to_return) = location;
14822 return to_return;
14825 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14826 occurred. Otherwise return NODE after having set its type
14827 appropriately. */
14829 static tree
14830 patch_new_array_init (tree type, tree node)
14832 int error_seen = 0;
14833 tree element_type;
14834 unsigned HOST_WIDE_INT length;
14835 constructor_elt *current;
14836 int all_constant = 1;
14837 tree init = TREE_OPERAND (node, 0);
14839 if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
14841 parse_error_context (node,
14842 "Invalid array initializer for non-array type %qs",
14843 lang_printable_name (type, 1));
14844 return error_mark_node;
14846 type = TREE_TYPE (type);
14847 element_type = TYPE_ARRAY_ELEMENT (type);
14849 for (length = 0;
14850 VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (init),
14851 length, current);
14852 length++)
14854 tree elt = current->value;
14855 if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
14857 error_seen |= array_constructor_check_entry (element_type, current);
14858 elt = current->value;
14859 /* When compiling to native code, STRING_CST is converted to
14860 INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14861 if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
14862 all_constant = 0;
14864 else
14866 current->value = patch_new_array_init (element_type, elt);
14867 current->index = NULL_TREE;
14868 all_constant = 0;
14870 if (elt && TREE_CODE (elt) == TREE_LIST
14871 && TREE_VALUE (elt) == error_mark_node)
14872 error_seen = 1;
14875 if (error_seen)
14876 return error_mark_node;
14878 /* Create a new type. We can't reuse the one we have here by
14879 patching its dimension because it originally is of dimension -1
14880 hence reused by gcc. This would prevent triangular arrays. */
14881 type = build_java_array_type (element_type, length);
14882 TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
14883 TREE_TYPE (node) = promote_type (type);
14884 TREE_CONSTANT (init) = all_constant;
14885 TREE_INVARIANT (init) = all_constant;
14886 TREE_CONSTANT (node) = all_constant;
14887 TREE_INVARIANT (node) = all_constant;
14888 return node;
14891 /* Verify that one entry of the initializer element list can be
14892 assigned to the array base type. Report 1 if an error occurred, 0
14893 otherwise. */
14895 static int
14896 array_constructor_check_entry (tree type, constructor_elt *entry)
14898 char *array_type_string = NULL; /* For error reports */
14899 tree value, type_value, new_value, wfl_value, patched;
14900 int error_seen = 0;
14902 new_value = NULL_TREE;
14903 wfl_value = entry->value;
14905 value = java_complete_tree (entry->value);
14906 /* patch_string return error_mark_node if arg is error_mark_node */
14907 if ((patched = patch_string (value)))
14908 value = patched;
14909 if (value == error_mark_node)
14910 return 1;
14912 type_value = TREE_TYPE (value);
14914 /* At anytime, try_builtin_assignconv can report a warning on
14915 constant overflow during narrowing. */
14916 SET_WFL_OPERATOR (wfl_operator, entry->index, wfl_value);
14917 new_value = try_builtin_assignconv (wfl_operator, type, value);
14918 if (!new_value && (new_value = try_reference_assignconv (type, value)))
14919 type_value = promote_type (type);
14921 /* Check and report errors */
14922 if (!new_value)
14924 const char *const msg = (!valid_cast_to_p (type_value, type) ?
14925 "Can't" : "Explicit cast needed to");
14926 if (!array_type_string)
14927 array_type_string = xstrdup (lang_printable_name (type, 1));
14928 parse_error_context
14929 (wfl_operator, "Incompatible type for array. %s convert %qs to %qs",
14930 msg, lang_printable_name (type_value, 1), array_type_string);
14931 error_seen = 1;
14934 if (new_value)
14935 entry->value = new_value;
14937 if (array_type_string)
14938 free (array_type_string);
14940 entry->index = NULL_TREE;
14941 return error_seen;
14944 static tree
14945 build_this (int location)
14947 tree node = build_wfl_node (this_identifier_node);
14948 TREE_SET_CODE (node, THIS_EXPR);
14949 EXPR_WFL_LINECOL (node) = location;
14950 return node;
14953 /* 14.15 The return statement. It builds a modify expression that
14954 assigns the returned value to the RESULT_DECL that hold the value
14955 to be returned. */
14957 static tree
14958 build_return (int location, tree op)
14960 tree node = build1 (RETURN_EXPR, NULL_TREE, op);
14961 EXPR_WFL_LINECOL (node) = location;
14962 node = build_debugable_stmt (location, node);
14963 return node;
14966 static tree
14967 patch_return (tree node)
14969 tree return_exp = TREE_OPERAND (node, 0);
14970 tree meth = current_function_decl;
14971 tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
14972 int error_found = 0;
14974 TREE_TYPE (node) = error_mark_node;
14975 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14977 /* It's invalid to have a return value within a function that is
14978 declared with the keyword void or that is a constructor */
14979 if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
14980 error_found = 1;
14982 /* It's invalid to use a return statement in a static block */
14983 if (DECL_CLINIT_P (current_function_decl))
14984 error_found = 1;
14986 /* It's invalid to have a no return value within a function that
14987 isn't declared with the keyword `void' */
14988 if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
14989 error_found = 2;
14991 if (DECL_INSTINIT_P (current_function_decl))
14992 error_found = 1;
14994 if (error_found)
14996 if (DECL_INSTINIT_P (current_function_decl))
14997 parse_error_context (wfl_operator,
14998 "%<return%> inside instance initializer");
15000 else if (DECL_CLINIT_P (current_function_decl))
15001 parse_error_context (wfl_operator,
15002 "%<return%> inside static initializer");
15004 else if (!DECL_CONSTRUCTOR_P (meth))
15006 char *t = xstrdup (lang_printable_name (mtype, 0));
15007 parse_error_context (wfl_operator,
15008 "%<return%> with%s value from %<%s %s%>",
15009 (error_found == 1 ? "" : "out"),
15010 t, lang_printable_name (meth, 2));
15011 free (t);
15013 else
15014 parse_error_context (wfl_operator,
15015 "%<return%> with value from constructor %qs",
15016 lang_printable_name (meth, 2));
15017 return error_mark_node;
15020 /* If we have a return_exp, build a modify expression and expand
15021 it. Note: at that point, the assignment is declared valid, but we
15022 may want to carry some more hacks */
15023 if (return_exp)
15025 tree exp = java_complete_tree (return_exp);
15026 tree modify, patched;
15028 if ((patched = patch_string (exp)))
15029 exp = patched;
15031 modify = build2 (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
15032 EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
15033 modify = java_complete_tree (modify);
15035 if (modify != error_mark_node)
15037 TREE_SIDE_EFFECTS (modify) = 1;
15038 TREE_OPERAND (node, 0) = modify;
15040 else
15041 return error_mark_node;
15043 TREE_TYPE (node) = void_type_node;
15044 TREE_SIDE_EFFECTS (node) = 1;
15045 return node;
15048 /* 14.8 The if Statement */
15050 static tree
15051 build_if_else_statement (int location, tree expression, tree if_body,
15052 tree else_body)
15054 tree node;
15055 if (!else_body)
15056 else_body = build_java_empty_stmt ();
15057 node = build3 (COND_EXPR, NULL_TREE, expression, if_body, else_body);
15058 EXPR_WFL_LINECOL (node) = location;
15059 node = build_debugable_stmt (location, node);
15060 return node;
15063 static tree
15064 patch_if_else_statement (tree node)
15066 tree expression = TREE_OPERAND (node, 0);
15067 int can_complete_normally
15068 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15069 | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
15071 TREE_TYPE (node) = error_mark_node;
15072 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15074 /* The type of expression must be boolean */
15075 if (TREE_TYPE (expression) != boolean_type_node
15076 && TREE_TYPE (expression) != promoted_boolean_type_node)
15078 parse_error_context
15079 (wfl_operator,
15080 "Incompatible type for %<if%>. Can't convert %qs to %<boolean%>",
15081 lang_printable_name (TREE_TYPE (expression), 0));
15082 return error_mark_node;
15085 TREE_TYPE (node) = void_type_node;
15086 TREE_SIDE_EFFECTS (node) = 1;
15087 CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
15088 return node;
15091 /* 14.6 Labeled Statements */
15093 /* Action taken when a labeled statement is parsed. a new
15094 LABELED_BLOCK_EXPR is created. No statement is attached to the
15095 label, yet. LABEL can be NULL_TREE for artificially-generated blocks. */
15097 static tree
15098 build_labeled_block (int location, tree label)
15100 tree label_name ;
15101 tree label_decl, node;
15102 if (label == NULL_TREE || label == continue_identifier_node)
15103 label_name = label;
15104 else
15106 label_name = merge_qualified_name (label_id, label);
15107 /* Issue an error if we try to reuse a label that was previously
15108 declared */
15109 if (IDENTIFIER_LOCAL_VALUE (label_name))
15111 EXPR_WFL_LINECOL (wfl_operator) = location;
15112 parse_error_context (wfl_operator,
15113 "Declaration of %qs shadows a previous label declaration",
15114 IDENTIFIER_POINTER (label));
15115 EXPR_WFL_LINECOL (wfl_operator) =
15116 EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
15117 parse_error_context (wfl_operator,
15118 "This is the location of the previous declaration of label %qs",
15119 IDENTIFIER_POINTER (label));
15120 java_error_count--;
15124 label_decl = create_label_decl (label_name);
15125 node = build2 (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
15126 EXPR_WFL_LINECOL (node) = location;
15127 TREE_SIDE_EFFECTS (node) = 1;
15128 return node;
15131 /* A labeled statement LBE is attached a statement. */
15133 static tree
15134 finish_labeled_statement (tree lbe, /* Labeled block expr */
15135 tree statement)
15137 /* In anyways, tie the loop to its statement */
15138 LABELED_BLOCK_BODY (lbe) = statement;
15139 pop_labeled_block ();
15140 POP_LABELED_BLOCK ();
15141 return lbe;
15144 /* 14.10, 14.11, 14.12 Loop Statements */
15146 /* Create an empty LOOP_EXPR and make it the last in the nested loop
15147 list. */
15149 static tree
15150 build_new_loop (tree loop_body)
15152 tree loop = build1 (LOOP_EXPR, NULL_TREE, loop_body);
15153 TREE_SIDE_EFFECTS (loop) = 1;
15154 PUSH_LOOP (loop);
15155 return loop;
15158 /* Create a loop body according to the following structure:
15159 COMPOUND_EXPR
15160 COMPOUND_EXPR (loop main body)
15161 EXIT_EXPR (this order is for while/for loops.
15162 LABELED_BLOCK_EXPR the order is reversed for do loops)
15163 LABEL_DECL (a continue occurring here branches at the
15164 BODY end of this labeled block)
15165 INCREMENT (if any)
15167 REVERSED, if nonzero, tells that the loop condition expr comes
15168 after the body, like in the do-while loop.
15170 To obtain a loop, the loop body structure described above is
15171 encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
15173 LABELED_BLOCK_EXPR
15174 LABEL_DECL (use this label to exit the loop)
15175 LOOP_EXPR
15176 <structure described above> */
15178 static tree
15179 build_loop_body (int location, tree condition, int reversed)
15181 tree first, second, body;
15183 condition = build1 (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
15184 EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
15185 condition = build_debugable_stmt (location, condition);
15186 TREE_SIDE_EFFECTS (condition) = 1;
15188 body = build_labeled_block (0, continue_identifier_node);
15189 first = (reversed ? body : condition);
15190 second = (reversed ? condition : body);
15191 return build2 (COMPOUND_EXPR, NULL_TREE,
15192 build2 (COMPOUND_EXPR, NULL_TREE, first, second),
15193 build_java_empty_stmt ());
15196 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
15197 their order) on the current loop. Unlink the current loop from the
15198 loop list. */
15200 static tree
15201 finish_loop_body (int location, tree condition, tree body, int reversed)
15203 tree to_return = ctxp->current_loop;
15204 tree loop_body = LOOP_EXPR_BODY (to_return);
15205 if (condition)
15207 tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
15208 /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
15209 The real EXIT_EXPR is one operand further. */
15210 EXPR_WFL_LINECOL (cnode) = location;
15211 if (TREE_CODE (cnode) == EXPR_WITH_FILE_LOCATION)
15213 cnode = EXPR_WFL_NODE (cnode);
15214 /* This one is for accurate error reports */
15215 EXPR_WFL_LINECOL (cnode) = location;
15217 TREE_OPERAND (cnode, 0) = condition;
15219 LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
15220 POP_LOOP ();
15221 return to_return;
15224 /* Tailored version of finish_loop_body for FOR loops, when FOR
15225 loops feature the condition part */
15227 static tree
15228 finish_for_loop (int location, tree condition, tree update, tree body)
15230 /* Put the condition and the loop body in place */
15231 tree loop = finish_loop_body (location, condition, body, 0);
15232 /* LOOP is the current loop which has been now popped of the loop
15233 stack. Mark the update block as reachable and install it. We do
15234 this because the (current interpretation of the) JLS requires
15235 that the update expression be considered reachable even if the
15236 for loop's body doesn't complete normally. */
15237 if (update != NULL_TREE && !IS_EMPTY_STMT (update))
15239 tree up2 = update;
15240 if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
15241 up2 = EXPR_WFL_NODE (up2);
15242 /* It is possible for the update expression to be an
15243 EXPR_WFL_NODE wrapping nothing. */
15244 if (up2 != NULL_TREE && !IS_EMPTY_STMT (up2))
15246 /* Try to detect constraint violations. These would be
15247 programming errors somewhere. */
15248 if (! EXPR_P (up2) || TREE_CODE (up2) == LOOP_EXPR)
15249 abort ();
15250 SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
15253 LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
15254 return loop;
15257 /* Try to find the loop a block might be related to. This comprises
15258 the case where the LOOP_EXPR is found as the second operand of a
15259 COMPOUND_EXPR, because the loop happens to have an initialization
15260 part, then expressed as the first operand of the COMPOUND_EXPR. If
15261 the search finds something, 1 is returned. Otherwise, 0 is
15262 returned. The search is assumed to start from a
15263 LABELED_BLOCK_EXPR's block. */
15265 static tree
15266 search_loop (tree statement)
15268 if (TREE_CODE (statement) == LOOP_EXPR)
15269 return statement;
15271 if (TREE_CODE (statement) == BLOCK)
15272 statement = BLOCK_SUBBLOCKS (statement);
15273 else
15274 return NULL_TREE;
15276 if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15277 while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
15278 statement = TREE_OPERAND (statement, 1);
15280 return (TREE_CODE (statement) == LOOP_EXPR
15281 && FOR_LOOP_P (statement) ? statement : NULL_TREE);
15284 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
15285 returned otherwise. */
15287 static int
15288 labeled_block_contains_loop_p (tree block, tree loop)
15290 if (!block)
15291 return 0;
15293 if (LABELED_BLOCK_BODY (block) == loop)
15294 return 1;
15296 if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
15297 return 1;
15299 return 0;
15302 /* If the loop isn't surrounded by a labeled statement, create one and
15303 insert LOOP as its body. */
15305 static tree
15306 patch_loop_statement (tree loop)
15308 tree loop_label;
15310 TREE_TYPE (loop) = void_type_node;
15311 if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
15312 return loop;
15314 loop_label = build_labeled_block (0, NULL_TREE);
15315 /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
15316 that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
15317 LABELED_BLOCK_BODY (loop_label) = loop;
15318 PUSH_LABELED_BLOCK (loop_label);
15319 return loop_label;
15322 /* 14.13, 14.14: break and continue Statements */
15324 /* Build a break or a continue statement. a null NAME indicates an
15325 unlabeled break/continue statement. */
15327 static tree
15328 build_bc_statement (int location, int is_break, tree name)
15330 tree break_continue, label_block_expr = NULL_TREE;
15332 if (name)
15334 if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
15335 (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
15336 /* Null means that we don't have a target for this named
15337 break/continue. In this case, we make the target to be the
15338 label name, so that the error can be reported accurately in
15339 patch_bc_statement. */
15340 label_block_expr = EXPR_WFL_NODE (name);
15342 /* Unlabeled break/continue will be handled during the
15343 break/continue patch operation */
15344 break_continue = build1 (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr);
15346 IS_BREAK_STMT_P (break_continue) = is_break;
15347 TREE_SIDE_EFFECTS (break_continue) = 1;
15348 EXPR_WFL_LINECOL (break_continue) = location;
15349 break_continue = build_debugable_stmt (location, break_continue);
15350 return break_continue;
15353 /* Verification of a break/continue statement. */
15355 static tree
15356 patch_bc_statement (tree node)
15358 tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
15359 tree labeled_block = ctxp->current_labeled_block;
15360 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15362 /* Having an identifier here means that the target is unknown. */
15363 if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
15365 parse_error_context (wfl_operator, "No label definition found for %qs",
15366 IDENTIFIER_POINTER (bc_label));
15367 return error_mark_node;
15369 if (! IS_BREAK_STMT_P (node))
15371 /* It's a continue statement. */
15372 for (;; labeled_block = TREE_CHAIN (labeled_block))
15374 if (labeled_block == NULL_TREE)
15376 if (bc_label == NULL_TREE)
15377 parse_error_context (wfl_operator,
15378 "%<continue%> must be in loop");
15379 else
15380 parse_error_context
15381 (wfl_operator, "continue label %qs does not name a loop",
15382 IDENTIFIER_POINTER (bc_label));
15383 return error_mark_node;
15385 if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
15386 == continue_identifier_node)
15387 && (bc_label == NULL_TREE
15388 || TREE_CHAIN (labeled_block) == bc_label))
15390 bc_label = labeled_block;
15391 break;
15395 else if (!bc_label)
15397 for (;; labeled_block = TREE_CHAIN (labeled_block))
15399 if (labeled_block == NULL_TREE)
15401 parse_error_context (wfl_operator,
15402 "%<break%> must be in loop or switch");
15403 return error_mark_node;
15405 target_stmt = LABELED_BLOCK_BODY (labeled_block);
15406 if (TREE_CODE (target_stmt) == SWITCH_EXPR
15407 || search_loop (target_stmt))
15409 bc_label = labeled_block;
15410 break;
15415 EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
15416 CAN_COMPLETE_NORMALLY (bc_label) = 1;
15418 /* Our break/continue don't return values. */
15419 TREE_TYPE (node) = void_type_node;
15420 /* Encapsulate the break within a compound statement so that it's
15421 expanded all the times by expand_expr (and not clobbered
15422 sometimes, like after a if statement) */
15423 node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
15424 TREE_SIDE_EFFECTS (node) = 1;
15425 return node;
15428 /* Process the exit expression belonging to a loop. Its type must be
15429 boolean. */
15431 static tree
15432 patch_exit_expr (tree node)
15434 tree expression = TREE_OPERAND (node, 0);
15435 TREE_TYPE (node) = error_mark_node;
15436 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15438 /* The type of expression must be boolean */
15439 if (TREE_TYPE (expression) != boolean_type_node)
15441 parse_error_context
15442 (wfl_operator,
15443 "Incompatible type for loop conditional. Can't convert %qs to %<boolean%>",
15444 lang_printable_name (TREE_TYPE (expression), 0));
15445 return error_mark_node;
15447 /* Now we know things are allright, invert the condition, fold and
15448 return */
15449 TREE_OPERAND (node, 0) =
15450 fold_build1 (TRUTH_NOT_EXPR, boolean_type_node, expression);
15452 if (! integer_zerop (TREE_OPERAND (node, 0))
15453 && ctxp->current_loop != NULL_TREE
15454 && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
15455 CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
15456 if (! integer_onep (TREE_OPERAND (node, 0)))
15457 CAN_COMPLETE_NORMALLY (node) = 1;
15460 TREE_TYPE (node) = void_type_node;
15461 return node;
15464 /* 14.9 Switch statement */
15466 static tree
15467 patch_switch_statement (tree node)
15469 tree se = TREE_OPERAND (node, 0), se_type;
15470 tree save, iter;
15472 /* Complete the switch expression */
15473 se = TREE_OPERAND (node, 0) = java_complete_tree (se);
15474 se_type = TREE_TYPE (se);
15475 /* The type of the switch expression must be char, byte, short or
15476 int */
15477 if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
15479 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15480 parse_error_context (wfl_operator,
15481 "Incompatible type for %<switch%>. Can't convert %qs to %<int%>",
15482 lang_printable_name (se_type, 0));
15483 /* This is what java_complete_tree will check */
15484 TREE_OPERAND (node, 0) = error_mark_node;
15485 return error_mark_node;
15488 /* Save and restore the outer case label list. */
15489 save = case_label_list;
15490 case_label_list = NULL_TREE;
15492 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
15494 /* See if we've found a duplicate label. We can't leave this until
15495 code generation, because in `--syntax-only' and `-C' modes we
15496 don't do ordinary code generation. */
15497 for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
15499 HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
15500 tree subiter;
15501 for (subiter = TREE_CHAIN (iter);
15502 subiter != NULL_TREE;
15503 subiter = TREE_CHAIN (subiter))
15505 HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
15506 if (val == subval)
15508 EXPR_WFL_LINECOL (wfl_operator)
15509 = EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
15510 /* The case_label_list is in reverse order, so print the
15511 outer label first. */
15512 parse_error_context (wfl_operator, "duplicate case label: %<"
15513 HOST_WIDE_INT_PRINT_DEC "%>", subval);
15514 EXPR_WFL_LINECOL (wfl_operator)
15515 = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
15516 parse_error_context (wfl_operator, "original label is here");
15518 break;
15523 case_label_list = save;
15525 /* Ready to return */
15526 if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
15528 TREE_TYPE (node) = error_mark_node;
15529 return error_mark_node;
15531 TREE_TYPE (node) = void_type_node;
15532 TREE_SIDE_EFFECTS (node) = 1;
15533 CAN_COMPLETE_NORMALLY (node)
15534 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15535 || ! SWITCH_HAS_DEFAULT (node);
15536 return node;
15539 /* Assertions. */
15541 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15542 might be NULL_TREE. */
15543 static tree
15544 build_assertion (
15545 #ifdef USE_MAPPED_LOCATION
15546 source_location location,
15547 #else
15548 int location,
15549 #endif
15550 tree condition, tree value)
15552 tree node;
15553 tree klass = GET_CPC ();
15555 if (! enable_assertions (klass))
15557 condition = build2 (TRUTH_ANDIF_EXPR, NULL_TREE,
15558 boolean_false_node, condition);
15559 if (value == NULL_TREE)
15560 value = build_java_empty_stmt ();
15561 return build_if_else_statement (location, condition,
15562 value, NULL_TREE);
15565 if (! CLASS_USES_ASSERTIONS (klass))
15567 tree field, classdollar, id, call;
15568 tree class_type = TREE_TYPE (klass);
15570 field = add_field (class_type,
15571 get_identifier ("$assertionsDisabled"),
15572 boolean_type_node,
15573 ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
15574 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
15575 FIELD_SYNTHETIC (field) = 1;
15577 classdollar = build_incomplete_class_ref (location, class_type);
15579 /* Call CLASS.desiredAssertionStatus(). */
15580 id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
15581 call = build3 (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
15582 call = make_qualified_primary (classdollar, call, location);
15583 TREE_SIDE_EFFECTS (call) = 1;
15585 /* Invert to obtain !CLASS.desiredAssertionStatus(). This may
15586 seem odd, but we do it to generate code identical to that of
15587 the JDK. */
15588 call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
15589 TREE_SIDE_EFFECTS (call) = 1;
15590 DECL_INITIAL (field) = call;
15592 /* Record the initializer in the initializer statement list. */
15593 call = build2 (MODIFY_EXPR, NULL_TREE, field, call);
15594 TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
15595 SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
15596 MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
15598 CLASS_USES_ASSERTIONS (klass) = 1;
15601 if (value != NULL_TREE)
15602 value = tree_cons (NULL_TREE, value, NULL_TREE);
15604 node = build_wfl_node (get_identifier ("java"));
15605 node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
15606 location);
15607 node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
15608 location);
15610 node = build3 (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
15611 TREE_SIDE_EFFECTS (node) = 1;
15612 /* It is too early to use BUILD_THROW. */
15613 node = build1 (THROW_EXPR, NULL_TREE, node);
15614 TREE_SIDE_EFFECTS (node) = 1;
15616 /* We invert the condition; if we just put NODE as the `else' part
15617 then we generate weird-looking bytecode. */
15618 condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
15619 /* Check $assertionsDisabled. */
15620 condition
15621 = build2 (TRUTH_ANDIF_EXPR, NULL_TREE,
15622 build1 (TRUTH_NOT_EXPR, NULL_TREE,
15623 build_wfl_node (get_identifier ("$assertionsDisabled"))),
15624 condition);
15625 node = build_if_else_statement (location, condition, node, NULL_TREE);
15626 return node;
15629 /* 14.18 The try/catch statements */
15631 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15632 catches TYPE and executes CATCH_STMTS. */
15634 static tree
15635 encapsulate_with_try_catch (int location, tree type_or_name, tree try_stmts,
15636 tree catch_stmts)
15638 tree try_block, catch_clause_param, catch_block, catch;
15640 /* First build a try block */
15641 try_block = build_expr_block (try_stmts, NULL_TREE);
15643 /* Build a catch block: we need a catch clause parameter */
15644 if (TREE_CODE (type_or_name) == EXPR_WITH_FILE_LOCATION)
15646 tree catch_type = obtain_incomplete_type (type_or_name);
15647 jdep *dep;
15648 catch_clause_param = build_decl (VAR_DECL, wpv_id, catch_type);
15649 register_incomplete_type (JDEP_VARIABLE, type_or_name,
15650 catch_clause_param, catch_type);
15651 dep = CLASSD_LAST (ctxp->classd_list);
15652 JDEP_GET_PATCH (dep) = &TREE_TYPE (catch_clause_param);
15654 else
15655 catch_clause_param = build_decl (VAR_DECL, wpv_id,
15656 build_pointer_type (type_or_name));
15658 /* And a block */
15659 catch_block = build_expr_block (NULL_TREE, catch_clause_param);
15661 /* Initialize the variable and store in the block */
15662 catch = build2 (MODIFY_EXPR, NULL_TREE, catch_clause_param,
15663 build0 (JAVA_EXC_OBJ_EXPR, ptr_type_node));
15664 add_stmt_to_block (catch_block, NULL_TREE, catch);
15666 /* Add the catch statements */
15667 add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
15669 /* Now we can build a JAVA_CATCH_EXPR */
15670 catch_block = build1 (JAVA_CATCH_EXPR, NULL_TREE, catch_block);
15672 return build_try_statement (location, try_block, catch_block);
15675 static tree
15676 build_try_statement (int location, tree try_block, tree catches)
15678 tree node = build2 (TRY_EXPR, NULL_TREE, try_block, catches);
15679 EXPR_WFL_LINECOL (node) = location;
15680 return node;
15683 static tree
15684 build_try_finally_statement (int location, tree try_block, tree finally)
15686 tree node = build2 (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
15687 EXPR_WFL_LINECOL (node) = location;
15688 return node;
15691 static tree
15692 patch_try_statement (tree node)
15694 int error_found = 0;
15695 tree try = TREE_OPERAND (node, 0);
15696 /* Exception handlers are considered in left to right order */
15697 tree catch = nreverse (TREE_OPERAND (node, 1));
15698 tree current, caught_type_list = NULL_TREE;
15700 /* Check catch clauses, if any. Every time we find an error, we try
15701 to process the next catch clause. We process the catch clause before
15702 the try block so that when processing the try block we can check thrown
15703 exceptions against the caught type list. */
15704 for (current = catch; current; current = TREE_CHAIN (current))
15706 tree carg_decl, carg_type;
15707 tree sub_current, catch_block, catch_clause;
15708 int unreachable;
15710 /* At this point, the structure of the catch clause is
15711 JAVA_CATCH_EXPR (catch node)
15712 BLOCK (with the decl of the parameter)
15713 COMPOUND_EXPR
15714 MODIFY_EXPR (assignment of the catch parameter)
15715 BLOCK (catch clause block)
15717 catch_clause = TREE_OPERAND (current, 0);
15718 carg_decl = BLOCK_EXPR_DECLS (catch_clause);
15719 carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
15721 /* Catch clauses can't have more than one parameter declared,
15722 but it's already enforced by the grammar. Make sure that the
15723 only parameter of the clause statement in of class Throwable
15724 or a subclass of Throwable, but that was done earlier. The
15725 catch clause parameter type has also been resolved. */
15727 /* Just make sure that the catch clause parameter type inherits
15728 from java.lang.Throwable */
15729 if (!inherits_from_p (carg_type, throwable_type_node))
15731 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15732 parse_error_context (wfl_operator,
15733 "Can't catch class %qs. Catch clause parameter type must be a subclass of class %<java.lang.Throwable%>",
15734 lang_printable_name (carg_type, 0));
15735 error_found = 1;
15736 continue;
15739 /* Partial check for unreachable catch statement: The catch
15740 clause is reachable iff is no earlier catch block A in
15741 the try statement such that the type of the catch
15742 clause's parameter is the same as or a subclass of the
15743 type of A's parameter */
15744 unreachable = 0;
15745 for (sub_current = catch;
15746 sub_current != current; sub_current = TREE_CHAIN (sub_current))
15748 tree sub_catch_clause, decl;
15749 sub_catch_clause = TREE_OPERAND (sub_current, 0);
15750 decl = BLOCK_EXPR_DECLS (sub_catch_clause);
15752 if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
15754 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15755 parse_error_context
15756 (wfl_operator,
15757 "%<catch%> not reached because of the catch clause at line %d",
15758 EXPR_WFL_LINENO (sub_current));
15759 unreachable = error_found = 1;
15760 break;
15763 /* Complete the catch clause block */
15764 catch_block = java_complete_tree (TREE_OPERAND (current, 0));
15765 if (catch_block == error_mark_node)
15767 error_found = 1;
15768 continue;
15770 if (CAN_COMPLETE_NORMALLY (catch_block))
15771 CAN_COMPLETE_NORMALLY (node) = 1;
15772 TREE_OPERAND (current, 0) = catch_block;
15774 if (unreachable)
15775 continue;
15777 /* Things to do here: the exception must be thrown */
15779 /* Link this type to the caught type list */
15780 caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
15783 PUSH_EXCEPTIONS (caught_type_list);
15784 if ((try = java_complete_tree (try)) == error_mark_node)
15785 error_found = 1;
15786 if (CAN_COMPLETE_NORMALLY (try))
15787 CAN_COMPLETE_NORMALLY (node) = 1;
15788 POP_EXCEPTIONS ();
15790 /* Verification ends here */
15791 if (error_found)
15792 return error_mark_node;
15794 TREE_OPERAND (node, 0) = try;
15795 TREE_OPERAND (node, 1) = catch;
15796 TREE_TYPE (node) = void_type_node;
15797 return node;
15800 /* 14.17 The synchronized Statement */
15802 static tree
15803 patch_synchronized_statement (tree node, tree wfl_op1)
15805 tree expr = java_complete_tree (TREE_OPERAND (node, 0));
15806 tree block = TREE_OPERAND (node, 1);
15808 tree tmp, enter, exit, expr_decl, assignment;
15810 if (expr == error_mark_node)
15812 block = java_complete_tree (block);
15813 return expr;
15816 /* We might be trying to synchronize on a STRING_CST */
15817 if ((tmp = patch_string (expr)))
15818 expr = tmp;
15820 /* The TYPE of expr must be a reference type */
15821 if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
15823 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15824 parse_error_context (wfl_operator, "Incompatible type for %<synchronized%>. Can't convert %qs to %<java.lang.Object%>",
15825 lang_printable_name (TREE_TYPE (expr), 0));
15826 return error_mark_node;
15829 /* Generate a try-finally for the synchronized statement, except
15830 that the handler that catches all throw exception calls
15831 _Jv_MonitorExit and then rethrow the exception.
15832 The synchronized statement is then implemented as:
15835 _Jv_MonitorEnter (expression)
15836 synchronized_block
15837 _Jv_MonitorExit (expression)
15839 CATCH_ALL
15841 e = _Jv_exception_info ();
15842 _Jv_MonitorExit (expression)
15843 Throw (e);
15844 } */
15846 expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
15847 BUILD_MONITOR_ENTER (enter, expr_decl);
15848 BUILD_MONITOR_EXIT (exit, expr_decl);
15849 CAN_COMPLETE_NORMALLY (enter) = 1;
15850 CAN_COMPLETE_NORMALLY (exit) = 1;
15851 assignment = build2 (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
15852 TREE_SIDE_EFFECTS (assignment) = 1;
15853 node = build2 (COMPOUND_EXPR, NULL_TREE,
15854 build2 (COMPOUND_EXPR, NULL_TREE, assignment, enter),
15855 build2 (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
15856 node = build_expr_block (node, expr_decl);
15858 return java_complete_tree (node);
15861 /* 14.16 The throw Statement */
15863 static tree
15864 patch_throw_statement (tree node, tree wfl_op1)
15866 tree expr = TREE_OPERAND (node, 0);
15867 tree type = TREE_TYPE (expr);
15868 int unchecked_ok = 0, tryblock_throws_ok = 0;
15870 /* Thrown expression must be assignable to java.lang.Throwable */
15871 if (!try_reference_assignconv (throwable_type_node, expr))
15873 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15874 parse_error_context (wfl_operator,
15875 "Can't throw %qs; it must be a subclass of class %<java.lang.Throwable%>",
15876 lang_printable_name (type, 0));
15877 /* If the thrown expression was a reference, we further the
15878 compile-time check. */
15879 if (!JREFERENCE_TYPE_P (type))
15880 return error_mark_node;
15883 /* At least one of the following must be true */
15885 /* The type of the throw expression is a not checked exception,
15886 i.e. is a unchecked expression. */
15887 unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
15889 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15890 /* An instance can't throw a checked exception unless that exception
15891 is explicitly declared in the `throws' clause of each
15892 constructor. This doesn't apply to anonymous classes, since they
15893 don't have declared constructors. */
15894 if (!unchecked_ok
15895 && DECL_INSTINIT_P (current_function_decl)
15896 && !ANONYMOUS_CLASS_P (current_class))
15898 tree current;
15899 for (current = TYPE_METHODS (current_class); current;
15900 current = TREE_CHAIN (current))
15901 if (DECL_CONSTRUCTOR_P (current)
15902 && !check_thrown_exceptions_do (TREE_TYPE (expr)))
15904 parse_error_context (wfl_operator, "Checked exception %qs can't be thrown in instance initializer (not all declared constructor are declaring it in their %<throws%> clause)",
15905 lang_printable_name (TREE_TYPE (expr), 0));
15906 return error_mark_node;
15910 /* Throw is contained in a try statement and at least one catch
15911 clause can receive the thrown expression or the current method is
15912 declared to throw such an exception. Or, the throw statement is
15913 contained in a method or constructor declaration and the type of
15914 the Expression is assignable to at least one type listed in the
15915 throws clause the declaration. */
15916 if (!unchecked_ok)
15917 tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
15918 if (!(unchecked_ok || tryblock_throws_ok))
15920 /* If there is a surrounding try block that has no matching
15921 clatch clause, report it first. A surrounding try block exits
15922 only if there is something after the list of checked
15923 exception thrown by the current function (if any). */
15924 if (IN_TRY_BLOCK_P ())
15925 parse_error_context (wfl_operator, "Checked exception %qs can't be caught by any of the catch clause(s) of the surrounding %<try%> block",
15926 lang_printable_name (type, 0));
15927 /* If we have no surrounding try statement and the method doesn't have
15928 any throws, report it now. FIXME */
15930 /* We report that the exception can't be throw from a try block
15931 in all circumstances but when the `throw' is inside a static
15932 block. */
15933 else if (!EXCEPTIONS_P (currently_caught_type_list)
15934 && !tryblock_throws_ok)
15936 if (DECL_CLINIT_P (current_function_decl))
15937 parse_error_context (wfl_operator,
15938 "Checked exception %qs can't be thrown in initializer",
15939 lang_printable_name (type, 0));
15940 else
15941 parse_error_context (wfl_operator,
15942 "Checked exception %qs isn't thrown from a %<try%> block",
15943 lang_printable_name (type, 0));
15945 /* Otherwise, the current method doesn't have the appropriate
15946 throws declaration */
15947 else
15948 parse_error_context (wfl_operator, "Checked exception %qs doesn't match any of current method's %<throws%> declaration(s)",
15949 lang_printable_name (type, 0));
15950 return error_mark_node;
15953 if (! flag_emit_class_files)
15954 BUILD_THROW (node, expr);
15956 return node;
15959 /* Add EXCEPTION to the throws clause of MDECL. If MDECL already throws
15960 a super-class of EXCEPTION, keep the superclass instead. If MDECL already
15961 throws a sub-class of EXCEPTION, replace the sub-class with EXCEPTION. */
15962 static void
15963 add_exception_to_throws (tree mdecl, tree exception)
15965 tree mthrows;
15967 /* Ignore unchecked exceptions. */
15968 if (IS_UNCHECKED_EXCEPTION_P (exception))
15969 return;
15971 for (mthrows = DECL_FUNCTION_THROWS (mdecl);
15972 mthrows; mthrows = TREE_CHAIN (mthrows))
15974 if (inherits_from_p (exception, TREE_VALUE (mthrows)))
15975 return;
15976 if (inherits_from_p (TREE_VALUE (mthrows), exception))
15978 TREE_VALUE (mthrows) = exception;
15979 return;
15983 mthrows = DECL_FUNCTION_THROWS (mdecl);
15984 DECL_FUNCTION_THROWS (mdecl) = build_tree_list (mthrows, exception);
15987 /* Check that exception said to be thrown by method DECL can be
15988 effectively caught from where DECL is invoked. THIS_EXPR is the
15989 expression that computes `this' for the method call. */
15990 static void
15991 check_thrown_exceptions (
15992 #ifdef USE_MAPPED_LOCATION
15993 source_location location,
15994 #else
15996 int location,
15997 #endif
15998 tree decl, tree this_expr)
16000 tree throws;
16001 int is_array_call = 0;
16003 /* Skip check within generated methods, such as access$<n>. */
16004 if (NESTED_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
16005 return;
16007 if (this_expr != NULL_TREE
16008 && TREE_CODE (TREE_TYPE (this_expr)) == POINTER_TYPE
16009 && TYPE_ARRAY_P (TREE_TYPE (TREE_TYPE (this_expr))))
16010 is_array_call = 1;
16012 /* For all the unchecked exceptions thrown by DECL. */
16013 for (throws = DECL_FUNCTION_THROWS (decl); throws;
16014 throws = TREE_CHAIN (throws))
16015 if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
16017 /* Suppress errors about cloning arrays. */
16018 if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
16019 continue;
16021 #ifdef USE_MAPPED_LOCATION
16022 SET_EXPR_LOCATION (wfl_operator, location);
16023 #else
16024 EXPR_WFL_LINECOL (wfl_operator) = location;
16025 #endif
16026 if (ANONYMOUS_CLASS_P (DECL_CONTEXT (current_function_decl))
16027 && (DECL_FINIT_P (current_function_decl)
16028 || DECL_INIT_P (current_function_decl)
16029 || DECL_CONSTRUCTOR_P (current_function_decl)))
16031 /* Add "throws" to the initializer's exception list */
16032 tree exception = TREE_VALUE (throws);
16033 add_exception_to_throws (current_function_decl, exception);
16035 else if (DECL_FINIT_P (current_function_decl))
16037 parse_error_context
16038 (wfl_operator, "Exception %qs can't be thrown in initializer",
16039 lang_printable_name (TREE_VALUE (throws), 0));
16041 else
16043 parse_error_context
16044 (wfl_operator, "Exception %qs must be caught, or it must be declared in the %<throws%> clause of %qs",
16045 lang_printable_name (TREE_VALUE (throws), 0),
16046 (DECL_INIT_P (current_function_decl) ?
16047 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
16048 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
16053 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
16054 try-catch blocks, OR is listed in the `throws' clause of the
16055 current method. */
16057 static int
16058 check_thrown_exceptions_do (tree exception)
16060 tree list = currently_caught_type_list;
16061 resolve_and_layout (exception, NULL_TREE);
16062 /* First, all the nested try-catch-finally at that stage. The
16063 last element contains `throws' clause exceptions, if any. */
16064 if (IS_UNCHECKED_EXCEPTION_P (exception))
16065 return 1;
16066 while (list)
16068 tree caught;
16069 for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
16070 if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
16071 return 1;
16072 list = TREE_CHAIN (list);
16074 return 0;
16077 /* This function goes over all of CLASS_TYPE ctors and checks whether
16078 each of them features at least one unchecked exception in its
16079 `throws' clause. If it's the case, it returns `true', `false'
16080 otherwise. */
16082 static bool
16083 ctors_unchecked_throws_clause_p (tree class_type)
16085 tree current;
16087 for (current = TYPE_METHODS (class_type); current;
16088 current = TREE_CHAIN (current))
16090 bool ctu = false; /* Ctor Throws Unchecked */
16091 if (DECL_CONSTRUCTOR_P (current))
16093 tree throws;
16094 for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
16095 throws = TREE_CHAIN (throws))
16096 if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
16097 ctu = true;
16099 /* We return false as we found one ctor that is unfit. */
16100 if (!ctu && DECL_CONSTRUCTOR_P (current))
16101 return false;
16103 /* All ctors feature at least one unchecked exception in their
16104 `throws' clause. */
16105 return true;
16108 /* 15.24 Conditional Operator ?: */
16110 static tree
16111 patch_conditional_expr (tree node, tree wfl_cond, tree wfl_op1)
16113 tree cond = TREE_OPERAND (node, 0);
16114 tree op1 = TREE_OPERAND (node, 1);
16115 tree op2 = TREE_OPERAND (node, 2);
16116 tree resulting_type = NULL_TREE;
16117 tree t1, t2, patched;
16118 int error_found = 0;
16120 /* The condition and operands of ?: might be StringBuffers crafted
16121 as a result of a string concatenation. Obtain decent ones here. */
16122 if ((patched = patch_string (cond)))
16123 TREE_OPERAND (node, 0) = cond = patched;
16124 if ((patched = patch_string (op1)))
16125 TREE_OPERAND (node, 1) = op1 = patched;
16126 if ((patched = patch_string (op2)))
16127 TREE_OPERAND (node, 2) = op2 = patched;
16129 t1 = TREE_TYPE (op1);
16130 t2 = TREE_TYPE (op2);
16132 /* The first expression must be a boolean */
16133 if (TREE_TYPE (cond) != boolean_type_node)
16135 SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
16136 parse_error_context (wfl_operator,
16137 "Incompatible type for %<?:%>. Can't convert %qs to %<boolean%>",
16138 lang_printable_name (TREE_TYPE (cond), 0));
16139 error_found = 1;
16142 /* Second and third can be numeric, boolean (i.e. primitive),
16143 references or null. Anything else results in an error */
16144 if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
16145 || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
16146 && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
16147 || (t1 == boolean_type_node && t2 == boolean_type_node)))
16148 error_found = 1;
16150 /* Determine the type of the conditional expression. Same types are
16151 easy to deal with */
16152 else if (t1 == t2)
16153 resulting_type = t1;
16155 /* There are different rules for numeric types */
16156 else if (JNUMERIC_TYPE_P (t1))
16158 /* if byte/short found, the resulting type is short */
16159 if ((t1 == byte_type_node && t2 == short_type_node)
16160 || (t1 == short_type_node && t2 == byte_type_node))
16161 resulting_type = short_type_node;
16163 /* If t1 is a constant int and t2 is of type byte, short or char
16164 and t1's value fits in t2, then the resulting type is t2 */
16165 else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
16166 && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
16167 resulting_type = t2;
16169 /* If t2 is a constant int and t1 is of type byte, short or char
16170 and t2's value fits in t1, then the resulting type is t1 */
16171 else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
16172 && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
16173 resulting_type = t1;
16175 /* Otherwise, binary numeric promotion is applied and the
16176 resulting type is the promoted type of operand 1 and 2 */
16177 else
16178 resulting_type = binary_numeric_promotion (t1, t2,
16179 &TREE_OPERAND (node, 1),
16180 &TREE_OPERAND (node, 2));
16183 /* Cases of a reference and a null type */
16184 else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
16185 resulting_type = t1;
16187 else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
16188 resulting_type = t2;
16190 /* Last case: different reference types. If a type can be converted
16191 into the other one by assignment conversion, the latter
16192 determines the type of the expression */
16193 else if ((resulting_type = try_reference_assignconv (t1, op2)))
16194 resulting_type = promote_type (t1);
16196 else if ((resulting_type = try_reference_assignconv (t2, op1)))
16197 resulting_type = promote_type (t2);
16199 /* If we don't have any resulting type, we're in trouble */
16200 if (!resulting_type)
16202 char *t = xstrdup (lang_printable_name (t1, 0));
16203 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
16204 parse_error_context (wfl_operator,
16205 "Incompatible type for %<?:%>. Can't convert %qs to %qs",
16206 t, lang_printable_name (t2, 0));
16207 free (t);
16208 error_found = 1;
16211 if (error_found)
16213 TREE_TYPE (node) = error_mark_node;
16214 return error_mark_node;
16217 TREE_TYPE (node) = resulting_type;
16218 TREE_SET_CODE (node, COND_EXPR);
16219 CAN_COMPLETE_NORMALLY (node) = 1;
16220 return node;
16223 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
16225 static tree
16226 maybe_build_class_init_for_field (tree decl, tree expr)
16228 tree clas = DECL_CONTEXT (decl);
16229 if (flag_emit_class_files)
16230 return expr;
16232 if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
16233 && FIELD_FINAL (decl))
16235 tree init = DECL_INITIAL (decl);
16236 if (init != NULL_TREE)
16237 init = fold_constant_for_init (init, decl);
16238 if (init != NULL_TREE && CONSTANT_VALUE_P (init))
16239 return expr;
16242 return build_class_init (clas, expr);
16245 /* Try to constant fold NODE.
16246 If NODE is not a constant expression, return NULL_EXPR.
16247 CONTEXT is a static final VAR_DECL whose initializer we are folding. */
16249 static tree
16250 fold_constant_for_init (tree node, tree context)
16252 tree op0, op1, val;
16253 enum tree_code code = TREE_CODE (node);
16255 switch (code)
16257 case INTEGER_CST:
16258 if (node == null_pointer_node)
16259 return NULL_TREE;
16260 case STRING_CST:
16261 case REAL_CST:
16262 return node;
16264 case PLUS_EXPR:
16265 case MINUS_EXPR:
16266 case MULT_EXPR:
16267 case TRUNC_MOD_EXPR:
16268 case RDIV_EXPR:
16269 case LSHIFT_EXPR:
16270 case RSHIFT_EXPR:
16271 case URSHIFT_EXPR:
16272 case BIT_AND_EXPR:
16273 case BIT_XOR_EXPR:
16274 case BIT_IOR_EXPR:
16275 case TRUTH_ANDIF_EXPR:
16276 case TRUTH_ORIF_EXPR:
16277 case EQ_EXPR:
16278 case NE_EXPR:
16279 case GT_EXPR:
16280 case GE_EXPR:
16281 case LT_EXPR:
16282 case LE_EXPR:
16283 op0 = TREE_OPERAND (node, 0);
16284 op1 = TREE_OPERAND (node, 1);
16285 val = fold_constant_for_init (op0, context);
16286 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16287 return NULL_TREE;
16288 TREE_OPERAND (node, 0) = val;
16289 val = fold_constant_for_init (op1, context);
16290 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16291 return NULL_TREE;
16292 TREE_OPERAND (node, 1) = val;
16293 return patch_binop (node, op0, op1, 1);
16295 case UNARY_PLUS_EXPR:
16296 case NEGATE_EXPR:
16297 case TRUTH_NOT_EXPR:
16298 case BIT_NOT_EXPR:
16299 case CONVERT_EXPR:
16300 case NOP_EXPR:
16301 op0 = TREE_OPERAND (node, 0);
16302 val = fold_constant_for_init (op0, context);
16303 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16304 return NULL_TREE;
16305 TREE_OPERAND (node, 0) = val;
16306 val = patch_unaryop (node, op0);
16307 if (! TREE_CONSTANT (val))
16308 return NULL_TREE;
16309 return val;
16311 break;
16313 case COND_EXPR:
16314 val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
16315 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16316 return NULL_TREE;
16317 TREE_OPERAND (node, 0) = val;
16318 val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
16319 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16320 return NULL_TREE;
16321 TREE_OPERAND (node, 1) = val;
16322 val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
16323 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16324 return NULL_TREE;
16325 TREE_OPERAND (node, 2) = val;
16326 return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 2)
16327 : TREE_OPERAND (node, 1);
16329 case VAR_DECL:
16330 case FIELD_DECL:
16331 if (! FIELD_FINAL (node)
16332 || DECL_INITIAL (node) == NULL_TREE)
16333 return NULL_TREE;
16334 val = DECL_INITIAL (node);
16335 /* Guard against infinite recursion. */
16336 DECL_INITIAL (node) = NULL_TREE;
16337 val = fold_constant_for_init (val, node);
16338 if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
16339 val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
16340 DECL_INITIAL (node) = val;
16341 return val;
16343 case EXPR_WITH_FILE_LOCATION:
16344 /* Compare java_complete_tree and resolve_expression_name. */
16345 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
16346 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
16348 tree name = EXPR_WFL_NODE (node);
16349 tree decl;
16350 if (PRIMARY_P (node))
16351 return NULL_TREE;
16352 else if (! QUALIFIED_P (name))
16354 decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
16355 if (decl == NULL_TREE
16356 || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
16357 return NULL_TREE;
16358 return fold_constant_for_init (decl, decl);
16360 else
16362 tree r = NULL_TREE;
16363 /* Install the proper context for the field resolution. */
16364 tree saved_current_class = current_class;
16365 /* Wait until the USE_COMPONENT_REF re-write. FIXME. */
16366 current_class = DECL_CONTEXT (context);
16367 qualify_ambiguous_name (node);
16368 r = resolve_field_access (node, &decl, NULL);
16369 /* Restore prior context. */
16370 current_class = saved_current_class;
16371 if (r != error_mark_node && decl != NULL_TREE)
16372 return fold_constant_for_init (decl, decl);
16373 return NULL_TREE;
16376 else
16378 op0 = TREE_OPERAND (node, 0);
16379 val = fold_constant_for_init (op0, context);
16380 if (val == NULL_TREE || ! TREE_CONSTANT (val))
16381 return NULL_TREE;
16382 TREE_OPERAND (node, 0) = val;
16383 return val;
16386 #ifdef USE_COMPONENT_REF
16387 case IDENTIFIER:
16388 case COMPONENT_REF:
16390 #endif
16392 default:
16393 return NULL_TREE;
16397 #ifdef USE_COMPONENT_REF
16398 /* Context is 'T' for TypeName, 'P' for PackageName,
16399 'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16401 tree
16402 resolve_simple_name (tree name, int context)
16406 tree
16407 resolve_qualified_name (tree name, int context)
16410 #endif
16412 void
16413 init_src_parse (void)
16415 /* Sanity check; we've been bit by this before. */
16416 if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
16417 abort ();
16422 /* This section deals with the functions that are called when tables
16423 recording class initialization information are traversed. */
16425 /* This function is called for each class that is known definitely
16426 initialized when a given static method was called. This function
16427 augments a compound expression (INFO) storing all assignment to
16428 initialized static class flags if a flag already existed, otherwise
16429 a new one is created. */
16431 static int
16432 emit_test_initialization (void **entry_p, void *info)
16434 tree l = (tree) info;
16435 tree decl, init;
16436 tree key = (tree) *entry_p;
16437 tree *ite;
16438 htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
16440 /* If we haven't found a flag and we're dealing with self registered
16441 with current_function_decl, then don't do anything. Self is
16442 always added as definitely initialized but this information is
16443 valid only if used outside the current function. */
16444 if (current_function_decl == TREE_PURPOSE (l)
16445 && java_treetreehash_find (cf_ht, key) == NULL)
16446 return true;
16448 ite = java_treetreehash_new (cf_ht, key);
16450 /* If we don't have a variable, create one and install it. */
16451 if (*ite == NULL)
16453 tree block;
16455 decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
16456 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
16457 LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
16458 DECL_CONTEXT (decl) = current_function_decl;
16459 DECL_INITIAL (decl) = boolean_true_node;
16460 /* Don't emit any symbolic debugging info for this decl. */
16461 DECL_IGNORED_P (decl) = 1;
16463 /* The trick is to find the right context for it. */
16464 block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
16465 TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
16466 BLOCK_EXPR_DECLS (block) = decl;
16467 *ite = decl;
16469 else
16470 decl = *ite;
16472 /* Now simply augment the compound that holds all the assignments
16473 pertaining to this method invocation. */
16474 init = build2 (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
16475 TREE_SIDE_EFFECTS (init) = 1;
16476 TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
16477 TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
16479 return true;
16482 #ifdef __XGETTEXT__
16483 /* Depending on the version of Bison used to compile this grammar,
16484 it may issue generic diagnostics spelled "syntax error" or
16485 "parse error". To prevent this from changing the translation
16486 template randomly, we list all the variants of this particular
16487 diagnostic here. Translators: there is no fine distinction
16488 between diagnostics with "syntax error" in them, and diagnostics
16489 with "parse error" in them. It's okay to give them both the same
16490 translation. */
16491 const char d1[] = N_("syntax error");
16492 const char d2[] = N_("parse error");
16493 const char d3[] = N_("syntax error; also virtual memory exhausted");
16494 const char d4[] = N_("parse error; also virtual memory exhausted");
16495 const char d5[] = N_("syntax error: cannot back up");
16496 const char d6[] = N_("parse error: cannot back up");
16497 #endif
16499 #include "gt-java-parse.h"
16500 #include "gtype-java.h"