1 /* Source code parsing and tree node generation for the GNU compiler
2 for the Java(TM) language.
3 Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
4 Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.
23 Java and all Java-based marks are trademarks or registered trademarks
24 of Sun Microsystems, Inc. in the United States and other countries.
25 The Free Software Foundation is independent of Sun Microsystems, Inc. */
27 /* This file parses java source code and issues a tree node image
28 suitable for code generation (byte code and targeted CPU assembly
31 The grammar conforms to the Java grammar described in "The Java(TM)
32 Language Specification. J. Gosling, B. Joy, G. Steele. Addison Wesley
33 1996, ISBN 0-201-63451-1"
35 The following modifications were brought to the original grammar:
37 method_body: added the rule '| block SC_TK'
38 static_initializer: added the rule 'static block SC_TK'.
40 Note: All the extra rules described above should go away when the
41 empty_statement rule will work.
43 statement_nsi: 'nsi' should be read no_short_if.
45 Some rules have been modified to support JDK1.1 inner classes
46 definitions and other extensions. */
57 #include "java-tree.h"
70 #define DIR_SEPARATOR '/'
73 /* Local function prototypes */
74 static char *java_accstring_lookup PROTO ((int));
75 static void classitf_redefinition_error PROTO ((const char *,tree, tree, tree));
76 static void variable_redefinition_error PROTO ((tree, tree, tree, int));
77 static void check_modifiers PROTO ((const char *, int, int));
78 static tree create_class PROTO ((int, tree, tree, tree));
79 static tree create_interface PROTO ((int, tree, tree));
80 static tree find_field PROTO ((tree, tree));
81 static tree lookup_field_wrapper PROTO ((tree, tree));
82 static int duplicate_declaration_error_p PROTO ((tree, tree, tree));
83 static void register_fields PROTO ((int, tree, tree));
84 static tree parser_qualified_classname PROTO ((tree));
85 static int parser_check_super PROTO ((tree, tree, tree));
86 static int parser_check_super_interface PROTO ((tree, tree, tree));
87 static void check_modifiers_consistency PROTO ((int));
88 static tree lookup_cl PROTO ((tree));
89 static tree lookup_java_method2 PROTO ((tree, tree, int));
90 static tree method_header PROTO ((int, tree, tree, tree));
91 static void fix_method_argument_names PROTO ((tree ,tree));
92 static tree method_declarator PROTO ((tree, tree));
93 static void parse_warning_context PVPROTO ((tree cl, const char *msg, ...))
95 static void issue_warning_error_from_context PROTO ((tree, const char *msg, va_list));
96 static void parse_ctor_invocation_error PROTO ((void));
97 static tree parse_jdk1_1_error PROTO ((const char *));
98 static void complete_class_report_errors PROTO ((jdep *));
99 static int process_imports PROTO ((void));
100 static void read_import_dir PROTO ((tree));
101 static int find_in_imports_on_demand PROTO ((tree));
102 static int find_in_imports PROTO ((tree));
103 static int check_pkg_class_access PROTO ((tree, tree));
104 static tree resolve_package PROTO ((tree, tree *));
105 static tree lookup_package_type PROTO ((const char *, int));
106 static tree lookup_package_type_and_set_next PROTO ((const char *, int, tree *));
107 static tree resolve_class PROTO ((tree, tree, tree));
108 static void declare_local_variables PROTO ((int, tree, tree));
109 static void source_start_java_method PROTO ((tree));
110 static void source_end_java_method PROTO ((void));
111 static void expand_start_java_method PROTO ((tree));
112 static tree find_name_in_single_imports PROTO ((tree));
113 static void check_abstract_method_header PROTO ((tree));
114 static tree lookup_java_interface_method2 PROTO ((tree, tree));
115 static tree resolve_expression_name PROTO ((tree, tree *));
116 static tree maybe_create_class_interface_decl PROTO ((tree, tree, tree));
117 static int check_class_interface_creation PROTO ((int, int, tree,
119 static tree patch_method_invocation PROTO ((tree, tree, tree,
121 static int breakdown_qualified PROTO ((tree *, tree *, tree));
122 static tree resolve_and_layout PROTO ((tree, tree));
123 static tree resolve_no_layout PROTO ((tree, tree));
124 static int invocation_mode PROTO ((tree, int));
125 static tree find_applicable_accessible_methods_list PROTO ((int, tree,
127 static void search_applicable_methods_list PROTO ((int, tree, tree, tree,
129 static tree find_most_specific_methods_list PROTO ((tree));
130 static int argument_types_convertible PROTO ((tree, tree));
131 static tree patch_invoke PROTO ((tree, tree, tree));
132 static tree lookup_method_invoke PROTO ((int, tree, tree, tree, tree));
133 static tree register_incomplete_type PROTO ((int, tree, tree, tree));
134 static tree obtain_incomplete_type PROTO ((tree));
135 static tree java_complete_lhs PROTO ((tree));
136 static tree java_complete_tree PROTO ((tree));
137 static int java_pre_expand_clinit PROTO ((tree));
138 static void java_complete_expand_method PROTO ((tree));
139 static int unresolved_type_p PROTO ((tree, tree *));
140 static void create_jdep_list PROTO ((struct parser_ctxt *));
141 static tree build_expr_block PROTO ((tree, tree));
142 static tree enter_block PROTO ((void));
143 static tree enter_a_block PROTO ((tree));
144 static tree exit_block PROTO ((void));
145 static tree lookup_name_in_blocks PROTO ((tree));
146 static void maybe_absorb_scoping_blocks PROTO ((void));
147 static tree build_method_invocation PROTO ((tree, tree));
148 static tree build_new_invocation PROTO ((tree, tree));
149 static tree build_assignment PROTO ((int, int, tree, tree));
150 static tree build_binop PROTO ((enum tree_code, int, tree, tree));
151 static int check_final_assignment PROTO ((tree ,tree));
152 static tree patch_assignment PROTO ((tree, tree, tree ));
153 static tree patch_binop PROTO ((tree, tree, tree));
154 static tree build_unaryop PROTO ((int, int, tree));
155 static tree build_incdec PROTO ((int, int, tree, int));
156 static tree patch_unaryop PROTO ((tree, tree));
157 static tree build_cast PROTO ((int, tree, tree));
158 static tree build_null_of_type PROTO ((tree));
159 static tree patch_cast PROTO ((tree, tree));
160 static int valid_ref_assignconv_cast_p PROTO ((tree, tree, int));
161 static int valid_builtin_assignconv_identity_widening_p PROTO ((tree, tree));
162 static int valid_cast_to_p PROTO ((tree, tree));
163 static int valid_method_invocation_conversion_p PROTO ((tree, tree));
164 static tree try_builtin_assignconv PROTO ((tree, tree, tree));
165 static tree try_reference_assignconv PROTO ((tree, tree));
166 static tree build_unresolved_array_type PROTO ((tree));
167 static tree build_array_from_name PROTO ((tree, tree, tree, tree *));
168 static tree build_array_ref PROTO ((int, tree, tree));
169 static tree patch_array_ref PROTO ((tree));
170 static tree make_qualified_name PROTO ((tree, tree, int));
171 static tree merge_qualified_name PROTO ((tree, tree));
172 static tree make_qualified_primary PROTO ((tree, tree, int));
173 static int resolve_qualified_expression_name PROTO ((tree, tree *,
175 static void qualify_ambiguous_name PROTO ((tree));
176 static void maybe_generate_clinit PROTO ((void));
177 static tree resolve_field_access PROTO ((tree, tree *, tree *));
178 static tree build_newarray_node PROTO ((tree, tree, int));
179 static tree patch_newarray PROTO ((tree));
180 static tree resolve_type_during_patch PROTO ((tree));
181 static tree build_this PROTO ((int));
182 static tree build_return PROTO ((int, tree));
183 static tree patch_return PROTO ((tree));
184 static tree maybe_access_field PROTO ((tree, tree, tree));
185 static int complete_function_arguments PROTO ((tree));
186 static int check_for_static_method_reference PROTO ((tree, tree, tree, tree, tree));
187 static int not_accessible_p PROTO ((tree, tree, int));
188 static void check_deprecation PROTO ((tree, tree));
189 static int class_in_current_package PROTO ((tree));
190 static tree build_if_else_statement PROTO ((int, tree, tree, tree));
191 static tree patch_if_else_statement PROTO ((tree));
192 static tree add_stmt_to_compound PROTO ((tree, tree, tree));
193 static tree add_stmt_to_block PROTO ((tree, tree, tree));
194 static tree patch_exit_expr PROTO ((tree));
195 static tree build_labeled_block PROTO ((int, tree));
196 static tree finish_labeled_statement PROTO ((tree, tree));
197 static tree build_bc_statement PROTO ((int, int, tree));
198 static tree patch_bc_statement PROTO ((tree));
199 static tree patch_loop_statement PROTO ((tree));
200 static tree build_new_loop PROTO ((tree));
201 static tree build_loop_body PROTO ((int, tree, int));
202 static tree finish_loop_body PROTO ((int, tree, tree, int));
203 static tree build_debugable_stmt PROTO ((int, tree));
204 static tree finish_for_loop PROTO ((int, tree, tree, tree));
205 static tree patch_switch_statement PROTO ((tree));
206 static tree string_constant_concatenation PROTO ((tree, tree));
207 static tree build_string_concatenation PROTO ((tree, tree));
208 static tree patch_string_cst PROTO ((tree));
209 static tree patch_string PROTO ((tree));
210 static tree build_try_statement PROTO ((int, tree, tree));
211 static tree build_try_finally_statement PROTO ((int, tree, tree));
212 static tree patch_try_statement PROTO ((tree));
213 static tree patch_synchronized_statement PROTO ((tree, tree));
214 static tree patch_throw_statement PROTO ((tree, tree));
215 static void check_thrown_exceptions PROTO ((int, tree));
216 static int check_thrown_exceptions_do PROTO ((tree));
217 static void purge_unchecked_exceptions PROTO ((tree));
218 static void check_throws_clauses PROTO ((tree, tree, tree));
219 static void finish_method_declaration PROTO ((tree));
220 static tree build_super_invocation PROTO ((tree));
221 static int verify_constructor_circularity PROTO ((tree, tree));
222 static char *constructor_circularity_msg PROTO ((tree, tree));
223 static tree build_this_super_qualified_invocation PROTO ((int, tree, tree,
225 static const char *get_printable_method_name PROTO ((tree));
226 static tree patch_conditional_expr PROTO ((tree, tree, tree));
227 static void maybe_generate_finit PROTO ((void));
228 static void fix_constructors PROTO ((tree));
229 static int verify_constructor_super PROTO ((void));
230 static tree create_artificial_method PROTO ((tree, int, tree, tree, tree));
231 static void start_artificial_method_body PROTO ((tree));
232 static void end_artificial_method_body PROTO ((tree));
233 static int check_method_redefinition PROTO ((tree, tree));
234 static int reset_method_name PROTO ((tree));
235 static void java_check_regular_methods PROTO ((tree));
236 static void java_check_abstract_methods PROTO ((tree));
237 static tree maybe_build_primttype_type_ref PROTO ((tree, tree));
238 static void unreachable_stmt_error PROTO ((tree));
239 static tree find_expr_with_wfl PROTO ((tree));
240 static void missing_return_error PROTO ((tree));
241 static tree build_new_array_init PROTO ((int, tree));
242 static tree patch_new_array_init PROTO ((tree, tree));
243 static tree maybe_build_array_element_wfl PROTO ((tree));
244 static int array_constructor_check_entry PROTO ((tree, tree));
245 static const char *purify_type_name PROTO ((const char *));
246 static tree fold_constant_for_init PROTO ((tree, tree));
247 static tree strip_out_static_field_access_decl PROTO ((tree));
248 static jdeplist *reverse_jdep_list PROTO ((struct parser_ctxt *));
249 static void static_ref_err PROTO ((tree, tree, tree));
250 static void parser_add_interface PROTO ((tree, tree, tree));
251 static void add_superinterfaces PROTO ((tree, tree));
252 static tree jdep_resolve_class PROTO ((jdep *));
253 static int note_possible_classname PROTO ((const char *, int));
254 static void java_complete_expand_methods PROTO ((void));
255 static void java_expand_finals PROTO ((void));
256 static tree cut_identifier_in_qualified PROTO ((tree));
257 static tree java_stabilize_reference PROTO ((tree));
258 static tree do_unary_numeric_promotion PROTO ((tree));
259 static char * operator_string PROTO ((tree));
260 static tree do_merge_string_cste PROTO ((tree, const char *, int, int));
261 static tree merge_string_cste PROTO ((tree, tree, int));
262 static tree java_refold PROTO ((tree));
263 static int java_decl_equiv PROTO ((tree, tree));
264 static int binop_compound_p PROTO ((enum tree_code));
265 static tree search_loop PROTO ((tree));
266 static int labeled_block_contains_loop_p PROTO ((tree, tree));
267 static void check_abstract_method_definitions PROTO ((int, tree, tree));
268 static void java_check_abstract_method_definitions PROTO ((tree));
270 /* Number of error found so far. */
271 int java_error_count;
272 /* Number of warning found so far. */
273 int java_warning_count;
274 /* Tell when not to fold, when doing xrefs */
277 /* The current parser context */
278 struct parser_ctxt *ctxp;
280 /* List of things that were analyzed for which code will be generated */
281 static struct parser_ctxt *ctxp_for_generation = NULL;
283 /* binop_lookup maps token to tree_code. It is used where binary
284 operations are involved and required by the parser. RDIV_EXPR
285 covers both integral/floating point division. The code is changed
286 once the type of both operator is worked out. */
288 static enum tree_code binop_lookup[19] =
290 PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR,
291 LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR,
292 BIT_AND_EXPR, BIT_XOR_EXPR, BIT_IOR_EXPR,
293 TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR,
294 EQ_EXPR, NE_EXPR, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR,
296 #define BINOP_LOOKUP(VALUE) \
297 binop_lookup [((VALUE) - PLUS_TK)% \
298 (sizeof (binop_lookup) / sizeof (binop_lookup[0]))]
300 /* This is the end index for binary operators that can also be used
301 in compound assignements. */
302 #define BINOP_COMPOUND_CANDIDATES 11
304 /* Fake WFL used to report error message. It is initialized once if
305 needed and reused with it's location information is overriden. */
306 tree wfl_operator = NULL_TREE;
308 /* The "$L" identifier we use to create labels. */
309 static tree label_id = NULL_TREE;
311 /* The "StringBuffer" identifier used for the String `+' operator. */
312 static tree wfl_string_buffer = NULL_TREE;
314 /* The "append" identifier used for String `+' operator. */
315 static tree wfl_append = NULL_TREE;
317 /* The "toString" identifier used for String `+' operator. */
318 static tree wfl_to_string = NULL_TREE;
320 /* The "java.lang" import qualified name. */
321 static tree java_lang_id = NULL_TREE;
323 /* The "java.lang.Cloneable" qualified name. */
324 static tree java_lang_cloneable = NULL_TREE;
326 /* Context and flag for static blocks */
327 static tree current_static_block = NULL_TREE;
347 /* Things defined here have to match the order of what's in the
348 binop_lookup table. */
350 %token PLUS_TK MINUS_TK MULT_TK DIV_TK REM_TK
351 %token LS_TK SRS_TK ZRS_TK
352 %token AND_TK XOR_TK OR_TK
353 %token BOOL_AND_TK BOOL_OR_TK
354 %token EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
356 /* This maps to the same binop_lookup entry than the token above */
358 %token PLUS_ASSIGN_TK MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
360 %token LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
361 %token AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
364 /* Modifier TOKEN have to be kept in this order. Don't scramble it */
366 %token PUBLIC_TK PRIVATE_TK PROTECTED_TK
367 %token STATIC_TK FINAL_TK SYNCHRONIZED_TK
368 %token VOLATILE_TK TRANSIENT_TK NATIVE_TK
369 %token PAD_TK ABSTRACT_TK MODIFIER_TK
371 /* Keep those two in order, too */
372 %token DECR_TK INCR_TK
374 /* From now one, things can be in any order */
376 %token DEFAULT_TK IF_TK THROW_TK
377 %token BOOLEAN_TK DO_TK IMPLEMENTS_TK
378 %token THROWS_TK BREAK_TK IMPORT_TK
379 %token ELSE_TK INSTANCEOF_TK RETURN_TK
380 %token VOID_TK CATCH_TK INTERFACE_TK
381 %token CASE_TK EXTENDS_TK FINALLY_TK
382 %token SUPER_TK WHILE_TK CLASS_TK
383 %token SWITCH_TK CONST_TK TRY_TK
384 %token FOR_TK NEW_TK CONTINUE_TK
385 %token GOTO_TK PACKAGE_TK THIS_TK
387 %token BYTE_TK SHORT_TK INT_TK LONG_TK
388 %token CHAR_TK INTEGRAL_TK
390 %token FLOAT_TK DOUBLE_TK FP_TK
394 %token REL_QM_TK REL_CL_TK NOT_TK NEG_TK
396 %token ASSIGN_ANY_TK ASSIGN_TK
397 %token OP_TK CP_TK OCB_TK CCB_TK OSB_TK CSB_TK SC_TK C_TK DOT_TK
399 %token STRING_LIT_TK CHAR_LIT_TK INT_LIT_TK FP_LIT_TK
400 %token TRUE_TK FALSE_TK BOOL_LIT_TK NULL_TK
402 %type <value> modifiers MODIFIER_TK
404 %type <node> super ID_TK identifier
405 %type <node> name simple_name qualified_name
406 %type <node> class_declaration type_declaration compilation_unit
407 field_declaration method_declaration extends_interfaces
408 interfaces interface_type_list
409 interface_declaration class_member_declaration
410 import_declarations package_declaration
411 type_declarations interface_body
412 interface_member_declaration constant_declaration
413 interface_member_declarations interface_type
414 abstract_method_declaration interface_type_list
415 %type <node> class_body_declaration class_member_declaration
416 static_initializer constructor_declaration block
417 %type <node> class_body_declarations constructor_header
418 %type <node> class_or_interface_type class_type class_type_list
419 constructor_declarator explicit_constructor_invocation
420 %type <node> dim_expr dim_exprs this_or_super throws
422 %type <node> variable_declarator_id variable_declarator
423 variable_declarators variable_initializer
424 variable_initializers constructor_body
427 %type <node> class_body block_end constructor_block_end
428 %type <node> statement statement_without_trailing_substatement
429 labeled_statement if_then_statement label_decl
430 if_then_else_statement while_statement for_statement
431 statement_nsi labeled_statement_nsi do_statement
432 if_then_else_statement_nsi while_statement_nsi
433 for_statement_nsi statement_expression_list for_init
434 for_update statement_expression expression_statement
435 primary_no_new_array expression primary
436 array_creation_expression array_type
437 class_instance_creation_expression field_access
438 method_invocation array_access something_dot_new
439 argument_list postfix_expression while_expression
440 post_increment_expression post_decrement_expression
441 unary_expression_not_plus_minus unary_expression
442 pre_increment_expression pre_decrement_expression
443 unary_expression_not_plus_minus cast_expression
444 multiplicative_expression additive_expression
445 shift_expression relational_expression
446 equality_expression and_expression
447 exclusive_or_expression inclusive_or_expression
448 conditional_and_expression conditional_or_expression
449 conditional_expression assignment_expression
450 left_hand_side assignment for_header for_begin
451 constant_expression do_statement_begin empty_statement
452 switch_statement synchronized_statement throw_statement
453 try_statement switch_expression switch_block
454 catches catch_clause catch_clause_parameter finally
455 %type <node> return_statement break_statement continue_statement
457 %type <operator> ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
458 %type <operator> REM_ASSIGN_TK PLUS_ASSIGN_TK MINUS_ASSIGN_TK
459 %type <operator> LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
460 %type <operator> AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
461 %type <operator> ASSIGN_ANY_TK assignment_operator
462 %token <operator> EQ_TK GTE_TK ZRS_TK SRS_TK GT_TK LTE_TK LS_TK
463 %token <operator> BOOL_AND_TK AND_TK BOOL_OR_TK OR_TK INCR_TK PLUS_TK
464 %token <operator> DECR_TK MINUS_TK MULT_TK DIV_TK XOR_TK REM_TK NEQ_TK
465 %token <operator> NEG_TK REL_QM_TK REL_CL_TK NOT_TK LT_TK OCB_TK CCB_TK
466 %token <operator> OP_TK OSB_TK DOT_TK THROW_TK INSTANCEOF_TK
467 %type <operator> THIS_TK SUPER_TK RETURN_TK BREAK_TK CONTINUE_TK
468 %type <operator> CASE_TK DEFAULT_TK TRY_TK CATCH_TK SYNCHRONIZED_TK
470 %type <node> method_body
472 %type <node> literal INT_LIT_TK FP_LIT_TK BOOL_LIT_TK CHAR_LIT_TK
473 STRING_LIT_TK NULL_TK VOID_TK
475 %type <node> IF_TK WHILE_TK FOR_TK
477 %type <node> formal_parameter_list formal_parameter
478 method_declarator method_header
480 %type <node> primitive_type reference_type type
481 BOOLEAN_TK INTEGRAL_TK FP_TK
484 /* 19.2 Production from 2.3: The Syntactic Grammar */
490 /* 19.3 Productions from 3: Lexical structure */
500 /* 19.4 Productions from 4: Types, Values and Variables */
513 class_or_interface_type
517 class_or_interface_type:
522 class_or_interface_type /* Default rule */
526 class_or_interface_type
530 primitive_type OSB_TK CSB_TK
532 $$ = build_java_array_type ($1, -1);
533 CLASS_LOADED_P ($$) = 1;
536 { $$ = build_unresolved_array_type ($1); }
537 | array_type OSB_TK CSB_TK
538 { $$ = build_unresolved_array_type ($1); }
539 | primitive_type OSB_TK error
540 {RULE ("']' expected"); RECOVER;}
541 | array_type OSB_TK error
542 {RULE ("']' expected"); RECOVER;}
545 /* 19.5 Productions from 6: Names */
547 simple_name /* Default rule */
548 | qualified_name /* Default rule */
552 identifier /* Default rule */
556 name DOT_TK identifier
557 { $$ = make_qualified_name ($1, $3, $2.location); }
564 /* 19.6: Production from 7: Packages */
567 | package_declaration
568 | import_declarations
570 | package_declaration import_declarations
571 | package_declaration type_declarations
572 | import_declarations type_declarations
573 | package_declaration import_declarations type_declarations
581 | import_declarations import_declaration
589 | type_declarations type_declaration
593 PACKAGE_TK name SC_TK
594 { ctxp->package = EXPR_WFL_NODE ($2); }
596 {yyerror ("Missing name"); RECOVER;}
597 | PACKAGE_TK name error
598 {yyerror ("';' expected"); RECOVER;}
602 single_type_import_declaration
603 | type_import_on_demand_declaration
606 single_type_import_declaration:
609 tree name = EXPR_WFL_NODE ($2), node, last_name;
610 int i = IDENTIFIER_LENGTH (name)-1;
611 const char *last = &IDENTIFIER_POINTER (name)[i];
612 while (last != IDENTIFIER_POINTER (name))
618 last_name = get_identifier (++last);
619 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (last_name))
621 tree err = find_name_in_single_imports (last_name);
622 if (err && err != name)
624 ($2, "Ambiguous class: `%s' and `%s'",
625 IDENTIFIER_POINTER (name),
626 IDENTIFIER_POINTER (err));
628 REGISTER_IMPORT ($2, last_name)
631 REGISTER_IMPORT ($2, last_name);
634 {yyerror ("Missing name"); RECOVER;}
635 | IMPORT_TK name error
636 {yyerror ("';' expected"); RECOVER;}
639 type_import_on_demand_declaration:
640 IMPORT_TK name DOT_TK MULT_TK SC_TK
642 tree name = EXPR_WFL_NODE ($2);
643 /* Don't import java.lang.* twice. */
644 if (name != java_lang_id)
646 tree node = build_tree_list ($2, NULL_TREE);
647 read_import_dir ($2);
648 TREE_CHAIN (node) = ctxp->import_demand_list;
649 ctxp->import_demand_list = node;
652 | IMPORT_TK name DOT_TK error
653 {yyerror ("'*' expected"); RECOVER;}
654 | IMPORT_TK name DOT_TK MULT_TK error
655 {yyerror ("';' expected"); RECOVER;}
661 maybe_generate_finit ();
662 maybe_generate_clinit ();
665 | interface_declaration
667 maybe_generate_clinit ();
675 yyerror ("Class or interface declaration expected");
679 /* 19.7 Shortened from the original:
680 modifiers: modifier | modifiers modifier
681 modifier: any of public... */
687 | modifiers MODIFIER_TK
692 (ctxp->modifier_ctx [$2], "Modifier `%s' declared twice",
693 java_accstring_lookup (acc));
701 /* 19.8.1 Production from $8.1: Class Declaration */
703 modifiers CLASS_TK identifier super interfaces
704 { create_class ($1, $3, $4, $5); }
709 | CLASS_TK identifier super interfaces
710 { create_class (0, $2, $3, $4); }
715 | modifiers CLASS_TK error
716 {yyerror ("Missing class name"); RECOVER;}
718 {yyerror ("Missing class name"); RECOVER;}
719 | CLASS_TK identifier error
721 if (!ctxp->class_err) yyerror ("'{' expected");
724 | modifiers CLASS_TK identifier error
725 {if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER;}
730 | EXTENDS_TK class_type
732 | EXTENDS_TK class_type error
733 {yyerror ("'{' expected"); ctxp->class_err=1;}
735 {yyerror ("Missing super class name"); ctxp->class_err=1;}
740 | IMPLEMENTS_TK interface_type_list
742 | IMPLEMENTS_TK error
745 yyerror ("Missing interface name");
752 ctxp->interface_number = 1;
753 $$ = build_tree_list ($1, NULL_TREE);
755 | interface_type_list C_TK interface_type
757 ctxp->interface_number++;
758 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
760 | interface_type_list C_TK error
761 {yyerror ("Missing interface name"); RECOVER;}
767 /* Store the location of the `}' when doing xrefs */
769 DECL_END_SOURCE_LINE (ctxp->current_parsed_class) =
770 EXPR_WFL_ADD_COL ($2.location, 1);
771 $$ = ctxp->current_parsed_class;
773 | OCB_TK class_body_declarations CCB_TK
775 /* Store the location of the `}' when doing xrefs */
777 DECL_END_SOURCE_LINE (ctxp->current_parsed_class) =
778 EXPR_WFL_ADD_COL ($3.location, 1);
779 $$ = ctxp->current_parsed_class;
783 class_body_declarations:
784 class_body_declaration
785 | class_body_declarations class_body_declaration
788 class_body_declaration:
789 class_member_declaration
791 | constructor_declaration
792 | block /* Added, JDK1.1, instance initializer */
793 { $$ = parse_jdk1_1_error ("instance initializer"); }
796 class_member_declaration:
798 | field_declaration SC_TK
801 | class_declaration /* Added, JDK1.1 inner classes */
802 { $$ = parse_jdk1_1_error ("inner classe declaration"); }
803 | interface_declaration /* Added, JDK1.1 inner classes */
804 { $$ = parse_jdk1_1_error ("inner interface declaration"); }
807 /* 19.8.2 Productions from 8.3: Field Declarations */
809 type variable_declarators SC_TK
810 { register_fields (0, $1, $2); }
811 | modifiers type variable_declarators SC_TK
814 ("Illegal modifier `%s' for field declaration",
815 $1, FIELD_MODIFIERS);
816 check_modifiers_consistency ($1);
817 register_fields ($1, $2, $3);
821 variable_declarators:
822 /* Should we use build_decl_list () instead ? FIXME */
823 variable_declarator /* Default rule */
824 | variable_declarators C_TK variable_declarator
825 { $$ = chainon ($1, $3); }
826 | variable_declarators C_TK error
827 {yyerror ("Missing term"); RECOVER;}
831 variable_declarator_id
832 { $$ = build_tree_list ($1, NULL_TREE); }
833 | variable_declarator_id ASSIGN_TK variable_initializer
835 if (java_error_count)
838 ($1, build_assignment ($2.token, $2.location, $1, $3));
840 | variable_declarator_id ASSIGN_TK error
842 yyerror ("Missing variable initializer");
843 $$ = build_tree_list ($1, NULL_TREE);
846 | variable_declarator_id ASSIGN_TK variable_initializer error
848 yyerror ("';' expected");
849 $$ = build_tree_list ($1, NULL_TREE);
854 variable_declarator_id:
856 | variable_declarator_id OSB_TK CSB_TK
857 { $$ = build_unresolved_array_type ($1); }
859 {yyerror ("Invalid declaration"); DRECOVER(vdi);}
860 | variable_declarator_id OSB_TK error
861 {yyerror ("']' expected"); DRECOVER(vdi);}
862 | variable_declarator_id CSB_TK error
863 {yyerror ("Unbalanced ']'"); DRECOVER(vdi);}
866 variable_initializer:
871 /* 19.8.3 Productions from 8.4: Method Declarations */
875 current_function_decl = $1;
876 source_start_java_method (current_function_decl);
879 { finish_method_declaration ($3); }
880 | method_header error
881 {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;}
885 type method_declarator throws
886 { $$ = method_header (0, $1, $2, $3); }
887 | VOID_TK method_declarator throws
888 { $$ = method_header (0, void_type_node, $2, $3); }
889 | modifiers type method_declarator throws
890 { $$ = method_header ($1, $2, $3, $4); }
891 | modifiers VOID_TK method_declarator throws
892 { $$ = method_header ($1, void_type_node, $3, $4); }
895 yyerror ("Invalid method declaration, method name required");
898 | modifiers type error
901 {yyerror ("Identifier expected"); RECOVER;}
902 | modifiers VOID_TK error
903 {yyerror ("Identifier expected"); RECOVER;}
906 yyerror ("Invalid method declaration, return type required");
912 identifier OP_TK CP_TK
913 { $$ = method_declarator ($1, NULL_TREE); }
914 | identifier OP_TK formal_parameter_list CP_TK
915 { $$ = method_declarator ($1, $3); }
916 | method_declarator OSB_TK CSB_TK
918 EXPR_WFL_LINECOL (wfl_operator) = $2.location;
920 build_unresolved_array_type (TREE_PURPOSE ($1));
921 parse_warning_context
923 "Discouraged form of returned type specification");
925 | identifier OP_TK error
926 {yyerror ("')' expected"); DRECOVER(method_declarator);}
927 | method_declarator OSB_TK error
928 {yyerror ("']' expected"); RECOVER;}
931 formal_parameter_list:
934 ctxp->formal_parameter_number = 1;
936 | formal_parameter_list C_TK formal_parameter
938 ctxp->formal_parameter_number += 1;
939 $$ = chainon ($1, $3);
941 | formal_parameter_list C_TK error
942 {yyerror ("Missing formal parameter term"); RECOVER;}
946 type variable_declarator_id
948 $$ = build_tree_list ($2, $1);
950 | modifiers type variable_declarator_id /* Added, JDK1.1 final parms */
952 parse_jdk1_1_error ("final parameters");
953 $$ = build_tree_list ($3, $2);
956 {yyerror ("Missing identifier"); RECOVER;}
957 | modifiers type error
959 SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
960 yyerror ("Missing identifier"); RECOVER;
966 | THROWS_TK class_type_list
969 {yyerror ("Missing class type term"); RECOVER;}
974 { $$ = build_tree_list ($1, $1); }
975 | class_type_list C_TK class_type
976 { $$ = tree_cons ($3, $3, $1); }
977 | class_type_list C_TK error
978 {yyerror ("Missing class type term"); RECOVER;}
985 { $$ = NULL_TREE; } /* Probably not the right thing to do. */
988 /* 19.8.4 Productions from 8.5: Static Initializers */
992 TREE_CHAIN ($2) = ctxp->static_initialized;
993 ctxp->static_initialized = $2;
995 | static block SC_TK /* Shouldn't be here. FIXME */
997 TREE_CHAIN ($2) = ctxp->static_initialized;
998 ctxp->static_initialized = $2;
1002 static: /* Test lval.sub_token here */
1005 SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
1009 /* 19.8.5 Productions from 8.6: Constructor Declarations */
1010 constructor_declaration:
1013 current_function_decl = $1;
1014 source_start_java_method (current_function_decl);
1017 { finish_method_declaration ($3); }
1021 constructor_declarator throws
1022 { $$ = method_header (0, NULL_TREE, $1, $2); }
1023 | modifiers constructor_declarator throws
1024 { $$ = method_header ($1, NULL_TREE, $2, $3); }
1027 constructor_declarator:
1028 simple_name OP_TK CP_TK
1029 { $$ = method_declarator ($1, NULL_TREE); }
1030 | simple_name OP_TK formal_parameter_list CP_TK
1031 { $$ = method_declarator ($1, $3); }
1035 /* Unlike regular method, we always need a complete (empty)
1036 body so we can safely perform all the required code
1037 addition (super invocation and field initialization) */
1038 block_begin constructor_block_end
1040 BLOCK_EXPR_BODY ($2) = empty_stmt_node;
1043 | block_begin explicit_constructor_invocation constructor_block_end
1045 | block_begin block_statements constructor_block_end
1047 | block_begin explicit_constructor_invocation block_statements constructor_block_end
1051 constructor_block_end:
1055 /* Error recovery for that rule moved down expression_statement: rule. */
1056 explicit_constructor_invocation:
1057 this_or_super OP_TK CP_TK SC_TK
1059 $$ = build_method_invocation ($1, NULL_TREE);
1060 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1061 $$ = java_method_add_stmt (current_function_decl, $$);
1063 | this_or_super OP_TK argument_list CP_TK SC_TK
1065 $$ = build_method_invocation ($1, $3);
1066 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1067 $$ = java_method_add_stmt (current_function_decl, $$);
1069 /* Added, JDK1.1 inner classes. Modified because the rule
1070 'primary' couldn't work. */
1071 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
1072 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1073 | name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
1074 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1077 this_or_super: /* Added, simplifies error diagnostics */
1080 tree wfl = build_wfl_node (this_identifier_node);
1081 EXPR_WFL_LINECOL (wfl) = $1.location;
1086 tree wfl = build_wfl_node (super_identifier_node);
1087 EXPR_WFL_LINECOL (wfl) = $1.location;
1092 /* 19.9 Productions from 9: Interfaces */
1093 /* 19.9.1 Productions from 9.1: Interfaces Declarations */
1094 interface_declaration:
1095 INTERFACE_TK identifier
1096 { create_interface (0, $2, NULL_TREE); }
1101 | modifiers INTERFACE_TK identifier
1102 { create_interface ($1, $3, NULL_TREE); }
1107 | INTERFACE_TK identifier extends_interfaces
1108 { create_interface (0, $2, $3); }
1113 | modifiers INTERFACE_TK identifier extends_interfaces
1114 { create_interface ($1, $3, $4); }
1119 | INTERFACE_TK identifier error
1120 {yyerror ("'{' expected"); RECOVER;}
1121 | modifiers INTERFACE_TK identifier error
1122 {yyerror ("'{' expected"); RECOVER;}
1126 EXTENDS_TK interface_type
1128 ctxp->interface_number = 1;
1129 $$ = build_tree_list ($2, NULL_TREE);
1131 | extends_interfaces C_TK interface_type
1133 ctxp->interface_number++;
1134 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
1137 {yyerror ("Invalid interface type"); RECOVER;}
1138 | extends_interfaces C_TK error
1139 {yyerror ("Missing term"); RECOVER;}
1145 | OCB_TK interface_member_declarations CCB_TK
1149 interface_member_declarations:
1150 interface_member_declaration
1151 | interface_member_declarations interface_member_declaration
1154 interface_member_declaration:
1155 constant_declaration
1156 | abstract_method_declaration
1157 | class_declaration /* Added, JDK1.1 inner classes */
1158 { $$ = parse_jdk1_1_error ("inner class declaration"); }
1159 | interface_declaration /* Added, JDK1.1 inner classes */
1160 { $$ = parse_jdk1_1_error ("inner interface declaration"); }
1163 constant_declaration:
1167 abstract_method_declaration:
1170 check_abstract_method_header ($1);
1171 current_function_decl = NULL_TREE; /* FIXME ? */
1173 | method_header error
1174 {yyerror ("';' expected"); RECOVER;}
1177 /* 19.10 Productions from 10: Arrays */
1180 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1181 | OCB_TK variable_initializers CCB_TK
1182 { $$ = build_new_array_init ($1.location, $2); }
1183 | OCB_TK variable_initializers C_TK CCB_TK
1184 { $$ = build_new_array_init ($1.location, $2); }
1187 variable_initializers:
1188 variable_initializer
1190 $$ = tree_cons (maybe_build_array_element_wfl ($1),
1193 | variable_initializers C_TK variable_initializer
1195 $$ = tree_cons (maybe_build_array_element_wfl ($3), $3, $1);
1197 | variable_initializers C_TK error
1198 {yyerror ("Missing term"); RECOVER;}
1201 /* 19.11 Production from 14: Blocks and Statements */
1205 /* Store the location of the `}' when doing xrefs */
1206 if (current_function_decl && flag_emit_xref)
1207 DECL_END_SOURCE_LINE (current_function_decl) =
1208 EXPR_WFL_ADD_COL ($2.location, 1);
1209 $$ = empty_stmt_node;
1211 | block_begin block_statements block_end
1223 maybe_absorb_scoping_blocks ();
1224 /* Store the location of the `}' when doing xrefs */
1225 if (current_function_decl && flag_emit_xref)
1226 DECL_END_SOURCE_LINE (current_function_decl) =
1227 EXPR_WFL_ADD_COL ($1.location, 1);
1234 | block_statements block_statement
1238 local_variable_declaration_statement
1240 { java_method_add_stmt (current_function_decl, $1); }
1241 | class_declaration /* Added, JDK1.1 inner classes */
1242 { parse_jdk1_1_error ("inner class declaration"); }
1245 local_variable_declaration_statement:
1246 local_variable_declaration SC_TK /* Can't catch missing ';' here */
1249 local_variable_declaration:
1250 type variable_declarators
1251 { declare_local_variables (0, $1, $2); }
1252 | modifiers type variable_declarators /* Added, JDK1.1 final locals */
1253 { declare_local_variables ($1, $2, $3); }
1257 statement_without_trailing_substatement
1260 | if_then_else_statement
1263 { $$ = exit_block (); }
1267 statement_without_trailing_substatement
1268 | labeled_statement_nsi
1269 | if_then_else_statement_nsi
1270 | while_statement_nsi
1272 { $$ = exit_block (); }
1275 statement_without_trailing_substatement:
1278 | expression_statement
1282 | continue_statement
1284 | synchronized_statement
1291 { $$ = empty_stmt_node; }
1295 identifier REL_CL_TK
1297 $$ = build_labeled_block (EXPR_WFL_LINECOL ($1),
1298 EXPR_WFL_NODE ($1));
1300 push_labeled_block ($$);
1301 PUSH_LABELED_BLOCK ($$);
1306 label_decl statement
1307 { $$ = finish_labeled_statement ($1, $2); }
1309 {yyerror ("':' expected"); RECOVER;}
1312 labeled_statement_nsi:
1313 label_decl statement_nsi
1314 { $$ = finish_labeled_statement ($1, $2); }
1317 /* We concentrate here a bunch of error handling rules that we couldn't write
1318 earlier, because expression_statement catches a missing ';'. */
1319 expression_statement:
1320 statement_expression SC_TK
1322 /* We have a statement. Generate a WFL around it so
1324 $$ = build_expr_wfl ($1, input_filename, lineno, 0);
1325 /* We know we have a statement, so set the debug
1326 info to be eventually generate here. */
1327 $$ = JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
1331 if (ctxp->prevent_ese != lineno)
1332 yyerror ("Invalid expression statement");
1333 DRECOVER (expr_stmt);
1337 if (ctxp->prevent_ese != lineno)
1338 yyerror ("Invalid expression statement");
1339 DRECOVER (expr_stmt);
1343 if (ctxp->prevent_ese != lineno)
1344 yyerror ("Invalid expression statement");
1345 DRECOVER (expr_stmt);
1347 | this_or_super OP_TK error
1348 {yyerror ("')' expected"); RECOVER;}
1349 | this_or_super OP_TK CP_TK error
1351 parse_ctor_invocation_error ();
1354 | this_or_super OP_TK argument_list error
1355 {yyerror ("')' expected"); RECOVER;}
1356 | this_or_super OP_TK argument_list CP_TK error
1358 parse_ctor_invocation_error ();
1361 | name DOT_TK SUPER_TK error
1362 {yyerror ("'(' expected"); RECOVER;}
1363 | name DOT_TK SUPER_TK OP_TK error
1364 {yyerror ("')' expected"); RECOVER;}
1365 | name DOT_TK SUPER_TK OP_TK argument_list error
1366 {yyerror ("')' expected"); RECOVER;}
1367 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK error
1368 {yyerror ("';' expected"); RECOVER;}
1369 | name DOT_TK SUPER_TK OP_TK CP_TK error
1370 {yyerror ("';' expected"); RECOVER;}
1373 statement_expression:
1375 | pre_increment_expression
1376 | pre_decrement_expression
1377 | post_increment_expression
1378 | post_decrement_expression
1380 | class_instance_creation_expression
1384 IF_TK OP_TK expression CP_TK statement
1386 $$ = build_if_else_statement ($2.location, $3,
1390 {yyerror ("'(' expected"); RECOVER;}
1392 {yyerror ("Missing term"); RECOVER;}
1393 | IF_TK OP_TK expression error
1394 {yyerror ("')' expected"); RECOVER;}
1397 if_then_else_statement:
1398 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
1399 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1402 if_then_else_statement_nsi:
1403 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
1404 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1414 /* Make into "proper list" of COMPOUND_EXPRs.
1415 I.e. make the last statment also have its own
1417 maybe_absorb_scoping_blocks ();
1418 TREE_OPERAND ($1, 1) = exit_block ();
1419 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $1);
1424 SWITCH_TK OP_TK expression CP_TK
1426 $$ = build (SWITCH_EXPR, NULL_TREE, $3, NULL_TREE);
1427 EXPR_WFL_LINECOL ($$) = $2.location;
1430 {yyerror ("'(' expected"); RECOVER;}
1431 | SWITCH_TK OP_TK error
1432 {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);}
1433 | SWITCH_TK OP_TK expression CP_TK error
1434 {yyerror ("'{' expected"); RECOVER;}
1437 /* Default assignment is there to avoid type node on switch_block
1443 | OCB_TK switch_labels CCB_TK
1445 | OCB_TK switch_block_statement_groups CCB_TK
1447 | OCB_TK switch_block_statement_groups switch_labels CCB_TK
1451 switch_block_statement_groups:
1452 switch_block_statement_group
1453 | switch_block_statement_groups switch_block_statement_group
1456 switch_block_statement_group:
1457 switch_labels block_statements
1462 | switch_labels switch_label
1466 CASE_TK constant_expression REL_CL_TK
1468 tree lab = build1 (CASE_EXPR, NULL_TREE, $2);
1469 EXPR_WFL_LINECOL (lab) = $1.location;
1470 java_method_add_stmt (current_function_decl, lab);
1472 | DEFAULT_TK REL_CL_TK
1474 tree lab = build1 (DEFAULT_EXPR, NULL_TREE, NULL_TREE);
1475 EXPR_WFL_LINECOL (lab) = $1.location;
1476 java_method_add_stmt (current_function_decl, lab);
1479 {yyerror ("Missing or invalid constant expression"); RECOVER;}
1480 | CASE_TK constant_expression error
1481 {yyerror ("':' expected"); RECOVER;}
1483 {yyerror ("':' expected"); RECOVER;}
1487 WHILE_TK OP_TK expression CP_TK
1489 tree body = build_loop_body ($2.location, $3, 0);
1490 $$ = build_new_loop (body);
1495 while_expression statement
1496 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1498 {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;}
1499 | WHILE_TK OP_TK error
1500 {yyerror ("Missing term and ')' expected"); RECOVER;}
1501 | WHILE_TK OP_TK expression error
1502 {yyerror ("')' expected"); RECOVER;}
1505 while_statement_nsi:
1506 while_expression statement_nsi
1507 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1513 tree body = build_loop_body (0, NULL_TREE, 1);
1514 $$ = build_new_loop (body);
1516 /* Need error handing here. FIXME */
1520 do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1521 { $$ = finish_loop_body ($4.location, $5, $2, 1); }
1525 for_begin SC_TK expression SC_TK for_update CP_TK statement
1526 { $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7); }
1527 | for_begin SC_TK SC_TK for_update CP_TK statement
1529 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1530 /* We have not condition, so we get rid of the EXIT_EXPR */
1531 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1534 | for_begin SC_TK error
1535 {yyerror ("Invalid control expression"); RECOVER;}
1536 | for_begin SC_TK expression SC_TK error
1537 {yyerror ("Invalid update expression"); RECOVER;}
1538 | for_begin SC_TK SC_TK error
1539 {yyerror ("Invalid update expression"); RECOVER;}
1543 for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
1544 { $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);}
1545 | for_begin SC_TK SC_TK for_update CP_TK statement_nsi
1547 $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1548 /* We have not condition, so we get rid of the EXIT_EXPR */
1549 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1557 /* This scope defined for local variable that may be
1558 defined within the scope of the for loop */
1562 {yyerror ("'(' expected"); DRECOVER(for_1);}
1563 | FOR_TK OP_TK error
1564 {yyerror ("Invalid init statement"); RECOVER;}
1570 /* We now declare the loop body. The loop is
1571 declared as a for loop. */
1572 tree body = build_loop_body (0, NULL_TREE, 0);
1573 $$ = build_new_loop (body);
1574 IS_FOR_LOOP_P ($$) = 1;
1575 /* The loop is added to the current block the for
1576 statement is defined within */
1577 java_method_add_stmt (current_function_decl, $$);
1580 for_init: /* Can be empty */
1581 { $$ = empty_stmt_node; }
1582 | statement_expression_list
1584 /* Init statement recorded within the previously
1585 defined block scope */
1586 $$ = java_method_add_stmt (current_function_decl, $1);
1588 | local_variable_declaration
1590 /* Local variable are recorded within the previously
1591 defined block scope */
1594 | statement_expression_list error
1595 {yyerror ("';' expected"); DRECOVER(for_init_1);}
1598 for_update: /* Can be empty */
1599 {$$ = empty_stmt_node;}
1600 | statement_expression_list
1601 { $$ = build_debugable_stmt (BUILD_LOCATION (), $1); }
1604 statement_expression_list:
1605 statement_expression
1606 { $$ = add_stmt_to_compound (NULL_TREE, NULL_TREE, $1); }
1607 | statement_expression_list C_TK statement_expression
1608 { $$ = add_stmt_to_compound ($1, NULL_TREE, $3); }
1609 | statement_expression_list C_TK error
1610 {yyerror ("Missing term"); RECOVER;}
1615 { $$ = build_bc_statement ($1.location, 1, NULL_TREE); }
1616 | BREAK_TK identifier SC_TK
1617 { $$ = build_bc_statement ($1.location, 1, $2); }
1619 {yyerror ("Missing term"); RECOVER;}
1620 | BREAK_TK identifier error
1621 {yyerror ("';' expected"); RECOVER;}
1626 { $$ = build_bc_statement ($1.location, 0, NULL_TREE); }
1627 | CONTINUE_TK identifier SC_TK
1628 { $$ = build_bc_statement ($1.location, 0, $2); }
1630 {yyerror ("Missing term"); RECOVER;}
1631 | CONTINUE_TK identifier error
1632 {yyerror ("';' expected"); RECOVER;}
1637 { $$ = build_return ($1.location, NULL_TREE); }
1638 | RETURN_TK expression SC_TK
1639 { $$ = build_return ($1.location, $2); }
1641 {yyerror ("Missing term"); RECOVER;}
1642 | RETURN_TK expression error
1643 {yyerror ("';' expected"); RECOVER;}
1647 THROW_TK expression SC_TK
1649 $$ = build1 (THROW_EXPR, NULL_TREE, $2);
1650 EXPR_WFL_LINECOL ($$) = $1.location;
1653 {yyerror ("Missing term"); RECOVER;}
1654 | THROW_TK expression error
1655 {yyerror ("';' expected"); RECOVER;}
1658 synchronized_statement:
1659 synchronized OP_TK expression CP_TK block
1661 $$ = build (SYNCHRONIZED_EXPR, NULL_TREE, $3, $5);
1662 EXPR_WFL_LINECOL ($$) =
1663 EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK));
1665 | synchronized OP_TK expression CP_TK error
1666 {yyerror ("'{' expected"); RECOVER;}
1667 | synchronized error
1668 {yyerror ("'(' expected"); RECOVER;}
1669 | synchronized OP_TK error CP_TK
1670 {yyerror ("Missing term"); RECOVER;}
1671 | synchronized OP_TK error
1672 {yyerror ("Missing term"); RECOVER;}
1678 check_modifiers ("Illegal modifier `%s'. Only "
1679 "`synchronized' was expected here",
1680 $1, ACC_SYNCHRONIZED);
1681 if ($1 != ACC_SYNCHRONIZED)
1682 MODIFIER_WFL (SYNCHRONIZED_TK) =
1683 build_wfl_node (NULL_TREE);
1688 TRY_TK block catches
1689 { $$ = build_try_statement ($1.location, $2, $3); }
1690 | TRY_TK block finally
1691 { $$ = build_try_finally_statement ($1.location, $2, $3); }
1692 | TRY_TK block catches finally
1693 { $$ = build_try_finally_statement
1694 ($1.location, build_try_statement ($1.location,
1698 {yyerror ("'{' expected"); DRECOVER (try_statement);}
1703 | catches catch_clause
1705 TREE_CHAIN ($2) = $1;
1711 catch_clause_parameter block
1713 java_method_add_stmt (current_function_decl, $2);
1718 catch_clause_parameter:
1719 CATCH_TK OP_TK formal_parameter CP_TK
1721 /* We add a block to define a scope for
1722 formal_parameter (CCBP). The formal parameter is
1723 declared initialized by the appropriate function
1725 tree ccpb = enter_block ();
1726 tree init = build_assignment (ASSIGN_TK, $2.location,
1728 soft_exceptioninfo_call_node);
1729 declare_local_variables (0, TREE_VALUE ($3),
1730 build_tree_list (TREE_PURPOSE ($3),
1732 $$ = build1 (CATCH_EXPR, NULL_TREE, ccpb);
1733 EXPR_WFL_LINECOL ($$) = $1.location;
1736 {yyerror ("'(' expected"); RECOVER; $$ = NULL_TREE;}
1737 | CATCH_TK OP_TK error
1739 yyerror ("Missing term or ')' expected");
1740 RECOVER; $$ = NULL_TREE;
1742 | CATCH_TK OP_TK error CP_TK /* That's for () */
1743 {yyerror ("Missing term"); RECOVER; $$ = NULL_TREE;}
1750 {yyerror ("'{' expected"); RECOVER; }
1753 /* 19.12 Production from 15: Expressions */
1755 primary_no_new_array
1756 | array_creation_expression
1759 primary_no_new_array:
1762 { $$ = build_this ($1.location); }
1763 | OP_TK expression CP_TK
1765 | class_instance_creation_expression
1769 /* type DOT_TK CLASS_TK doens't work. So we split the rule
1770 'type' into its components. Missing is something for array,
1771 which will complete the reference_type part. FIXME */
1772 | name DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
1773 { $$ = parse_jdk1_1_error ("named class literals"); }
1774 | primitive_type DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
1775 { $$ = build_class_ref ($1); }
1776 | VOID_TK DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
1777 { $$ = build_class_ref (void_type_node); }
1778 /* Added, JDK1.1 inner classes. Documentation is wrong
1779 refering to a 'ClassName' (class_name) rule that doesn't
1780 exist. Used name instead. */
1781 | name DOT_TK THIS_TK
1782 { $$ = parse_jdk1_1_error ("class literals"); }
1783 | OP_TK expression error
1784 {yyerror ("')' expected"); RECOVER;}
1786 {yyerror ("'class' or 'this' expected" ); RECOVER;}
1787 | primitive_type DOT_TK error
1788 {yyerror ("'class' expected" ); RECOVER;}
1789 | VOID_TK DOT_TK error
1790 {yyerror ("'class' expected" ); RECOVER;}
1793 class_instance_creation_expression:
1794 NEW_TK class_type OP_TK argument_list CP_TK
1795 { $$ = build_new_invocation ($2, $4); }
1796 | NEW_TK class_type OP_TK CP_TK
1797 { $$ = build_new_invocation ($2, NULL_TREE); }
1798 /* Added, JDK1.1 inner classes but modified to use
1799 'class_type' instead of 'TypeName' (type_name) mentionned
1800 in the documentation but doesn't exist. */
1801 | NEW_TK class_type OP_TK argument_list CP_TK class_body
1802 { $$ = parse_jdk1_1_error ("inner class instance creation"); }
1803 | NEW_TK class_type OP_TK CP_TK class_body
1804 { $$ = parse_jdk1_1_error ("inner class instance creation"); }
1805 /* Added, JDK1.1 inner classes, modified to use name or
1806 primary instead of primary solely which couldn't work in
1808 | something_dot_new identifier OP_TK CP_TK
1809 | something_dot_new identifier OP_TK CP_TK class_body
1810 | something_dot_new identifier OP_TK argument_list CP_TK
1811 | something_dot_new identifier OP_TK argument_list CP_TK class_body
1812 | NEW_TK error SC_TK
1813 {yyerror ("'(' expected"); DRECOVER(new_1);}
1814 | NEW_TK class_type error
1815 {yyerror ("'(' expected"); RECOVER;}
1816 | NEW_TK class_type OP_TK error
1817 {yyerror ("')' or term expected"); RECOVER;}
1818 | NEW_TK class_type OP_TK argument_list error
1819 {yyerror ("')' expected"); RECOVER;}
1820 | something_dot_new error
1821 {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;}
1822 | something_dot_new identifier error
1823 {yyerror ("'(' expected"); RECOVER;}
1826 something_dot_new: /* Added, not part of the specs. */
1828 | primary DOT_TK NEW_TK
1834 $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
1835 ctxp->formal_parameter_number = 1;
1837 | argument_list C_TK expression
1839 ctxp->formal_parameter_number += 1;
1840 $$ = tree_cons (NULL_TREE, $3, $1);
1842 | argument_list C_TK error
1843 {yyerror ("Missing term"); RECOVER;}
1846 array_creation_expression:
1847 NEW_TK primitive_type dim_exprs
1848 { $$ = build_newarray_node ($2, $3, 0); }
1849 | NEW_TK class_or_interface_type dim_exprs
1850 { $$ = build_newarray_node ($2, $3, 0); }
1851 | NEW_TK primitive_type dim_exprs dims
1852 { $$ = build_newarray_node ($2, $3, CURRENT_OSB (ctxp));}
1853 | NEW_TK class_or_interface_type dim_exprs dims
1854 { $$ = build_newarray_node ($2, $3, CURRENT_OSB (ctxp));}
1855 /* Added, JDK1.1 anonymous array. Initial documentation rule
1857 | NEW_TK class_or_interface_type dims array_initializer
1858 { $$ = parse_jdk1_1_error ("anonymous array"); }
1859 | NEW_TK primitive_type dims array_initializer
1860 { $$ = parse_jdk1_1_error ("anonymous array"); }
1861 | NEW_TK error CSB_TK
1862 {yyerror ("'[' expected"); DRECOVER ("]");}
1863 | NEW_TK error OSB_TK
1864 {yyerror ("']' expected"); RECOVER;}
1869 { $$ = build_tree_list (NULL_TREE, $1); }
1870 | dim_exprs dim_expr
1871 { $$ = tree_cons (NULL_TREE, $2, $$); }
1875 OSB_TK expression CSB_TK
1877 EXPR_WFL_LINECOL ($2) = $1.location;
1880 | OSB_TK expression error
1881 {yyerror ("']' expected"); RECOVER;}
1884 yyerror ("Missing term");
1885 yyerror ("']' expected");
1894 /* If not initialized, allocate memory for the osb
1896 if (!ctxp->osb_limit)
1898 allocate = ctxp->osb_limit = 32;
1899 ctxp->osb_depth = -1;
1901 /* If capacity overflown, reallocate a bigger chuck */
1902 else if (ctxp->osb_depth+1 == ctxp->osb_limit)
1903 allocate = ctxp->osb_limit << 1;
1907 allocate *= sizeof (int);
1908 if (ctxp->osb_number)
1909 ctxp->osb_number = (int *)xrealloc (ctxp->osb_number,
1912 ctxp->osb_number = (int *)xmalloc (allocate);
1915 CURRENT_OSB (ctxp) = 1;
1917 | dims OSB_TK CSB_TK
1918 { CURRENT_OSB (ctxp)++; }
1920 { yyerror ("']' expected"); RECOVER;}
1924 primary DOT_TK identifier
1925 { $$ = make_qualified_primary ($1, $3, $2.location); }
1926 /* FIXME - REWRITE TO:
1927 { $$ = build_binop (COMPONENT_REF, $2.location, $1, $3); } */
1928 | SUPER_TK DOT_TK identifier
1931 build_wfl_node (super_identifier_node);
1932 EXPR_WFL_LINECOL (super_wfl) = $1.location;
1933 $$ = make_qualified_name (super_wfl, $3, $2.location);
1936 {yyerror ("Field expected"); DRECOVER (super_field_acces);}
1941 { $$ = build_method_invocation ($1, NULL_TREE); }
1942 | name OP_TK argument_list CP_TK
1943 { $$ = build_method_invocation ($1, $3); }
1944 | primary DOT_TK identifier OP_TK CP_TK
1946 if (TREE_CODE ($1) == THIS_EXPR)
1947 $$ = build_this_super_qualified_invocation
1948 (1, $3, NULL_TREE, 0, $2.location);
1951 tree invok = build_method_invocation ($3, NULL_TREE);
1952 $$ = make_qualified_primary ($1, invok, $2.location);
1955 | primary DOT_TK identifier OP_TK argument_list CP_TK
1957 if (TREE_CODE ($1) == THIS_EXPR)
1958 $$ = build_this_super_qualified_invocation
1959 (1, $3, $5, 0, $2.location);
1962 tree invok = build_method_invocation ($3, $5);
1963 $$ = make_qualified_primary ($1, invok, $2.location);
1966 | SUPER_TK DOT_TK identifier OP_TK CP_TK
1968 $$ = build_this_super_qualified_invocation
1969 (0, $3, NULL_TREE, $1.location, $2.location);
1971 | SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
1973 $$ = build_this_super_qualified_invocation
1974 (0, $3, $5, $1.location, $2.location);
1976 /* Screws up thing. I let it here until I'm convinced it can
1978 | primary DOT_TK error
1979 {yyerror ("'(' expected"); DRECOVER(bad);} */
1980 | SUPER_TK DOT_TK error CP_TK
1981 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
1982 | SUPER_TK DOT_TK error DOT_TK
1983 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
1987 name OSB_TK expression CSB_TK
1988 { $$ = build_array_ref ($2.location, $1, $3); }
1989 | primary_no_new_array OSB_TK expression CSB_TK
1990 { $$ = build_array_ref ($2.location, $1, $3); }
1993 yyerror ("Missing term and ']' expected");
1994 DRECOVER(array_access);
1996 | name OSB_TK expression error
1998 yyerror ("']' expected");
1999 DRECOVER(array_access);
2001 | primary_no_new_array OSB_TK error
2003 yyerror ("Missing term and ']' expected");
2004 DRECOVER(array_access);
2006 | primary_no_new_array OSB_TK expression error
2008 yyerror ("']' expected");
2009 DRECOVER(array_access);
2016 | post_increment_expression
2017 | post_decrement_expression
2020 post_increment_expression:
2021 postfix_expression INCR_TK
2022 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2025 post_decrement_expression:
2026 postfix_expression DECR_TK
2027 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2031 pre_increment_expression
2032 | pre_decrement_expression
2033 | PLUS_TK unary_expression
2034 {$$ = build_unaryop ($1.token, $1.location, $2); }
2035 | MINUS_TK unary_expression
2036 {$$ = build_unaryop ($1.token, $1.location, $2); }
2037 | unary_expression_not_plus_minus
2039 {yyerror ("Missing term"); RECOVER}
2041 {yyerror ("Missing term"); RECOVER}
2044 pre_increment_expression:
2045 INCR_TK unary_expression
2046 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2048 {yyerror ("Missing term"); RECOVER}
2051 pre_decrement_expression:
2052 DECR_TK unary_expression
2053 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2055 {yyerror ("Missing term"); RECOVER}
2058 unary_expression_not_plus_minus:
2060 | NOT_TK unary_expression
2061 {$$ = build_unaryop ($1.token, $1.location, $2); }
2062 | NEG_TK unary_expression
2063 {$$ = build_unaryop ($1.token, $1.location, $2); }
2066 {yyerror ("Missing term"); RECOVER}
2068 {yyerror ("Missing term"); RECOVER}
2071 cast_expression: /* Error handling here is potentially weak */
2072 OP_TK primitive_type dims CP_TK unary_expression
2075 while (CURRENT_OSB (ctxp)--)
2076 type = build_java_array_type (type, -1);
2078 $$ = build_cast ($1.location, type, $5);
2080 | OP_TK primitive_type CP_TK unary_expression
2081 { $$ = build_cast ($1.location, $2, $4); }
2082 | OP_TK expression CP_TK unary_expression_not_plus_minus
2083 { $$ = build_cast ($1.location, $2, $4); }
2084 | OP_TK name dims CP_TK unary_expression_not_plus_minus
2087 while (CURRENT_OSB (ctxp)--)
2088 obstack_1grow (&temporary_obstack, '[');
2090 obstack_grow0 (&temporary_obstack,
2091 IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)),
2092 IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2)));
2093 ptr = obstack_finish (&temporary_obstack);
2094 EXPR_WFL_NODE ($2) = get_identifier (ptr);
2095 $$ = build_cast ($1.location, $2, $5);
2097 | OP_TK primitive_type OSB_TK error
2098 {yyerror ("']' expected, invalid type expression");}
2101 if (ctxp->prevent_ese != lineno)
2102 yyerror ("Invalid type expression"); RECOVER;
2105 | OP_TK primitive_type dims CP_TK error
2106 {yyerror ("Missing term"); RECOVER;}
2107 | OP_TK primitive_type CP_TK error
2108 {yyerror ("Missing term"); RECOVER;}
2109 | OP_TK name dims CP_TK error
2110 {yyerror ("Missing term"); RECOVER;}
2113 multiplicative_expression:
2115 | multiplicative_expression MULT_TK unary_expression
2117 $$ = build_binop (BINOP_LOOKUP ($2.token),
2118 $2.location, $1, $3);
2120 | multiplicative_expression DIV_TK unary_expression
2122 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2125 | multiplicative_expression REM_TK unary_expression
2127 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2130 | multiplicative_expression MULT_TK error
2131 {yyerror ("Missing term"); RECOVER;}
2132 | multiplicative_expression DIV_TK error
2133 {yyerror ("Missing term"); RECOVER;}
2134 | multiplicative_expression REM_TK error
2135 {yyerror ("Missing term"); RECOVER;}
2138 additive_expression:
2139 multiplicative_expression
2140 | additive_expression PLUS_TK multiplicative_expression
2142 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2145 | additive_expression MINUS_TK multiplicative_expression
2147 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2150 | additive_expression PLUS_TK error
2151 {yyerror ("Missing term"); RECOVER;}
2152 | additive_expression MINUS_TK error
2153 {yyerror ("Missing term"); RECOVER;}
2158 | shift_expression LS_TK additive_expression
2160 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2163 | shift_expression SRS_TK additive_expression
2165 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2168 | shift_expression ZRS_TK additive_expression
2170 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2173 | shift_expression LS_TK error
2174 {yyerror ("Missing term"); RECOVER;}
2175 | shift_expression SRS_TK error
2176 {yyerror ("Missing term"); RECOVER;}
2177 | shift_expression ZRS_TK error
2178 {yyerror ("Missing term"); RECOVER;}
2181 relational_expression:
2183 | relational_expression LT_TK shift_expression
2185 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2188 | relational_expression GT_TK shift_expression
2190 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2193 | relational_expression LTE_TK shift_expression
2195 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2198 | relational_expression GTE_TK shift_expression
2200 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2203 | relational_expression INSTANCEOF_TK reference_type
2204 { $$ = build_binop (INSTANCEOF_EXPR, $2.location, $1, $3); }
2205 | relational_expression LT_TK error
2206 {yyerror ("Missing term"); RECOVER;}
2207 | relational_expression GT_TK error
2208 {yyerror ("Missing term"); RECOVER;}
2209 | relational_expression LTE_TK error
2210 {yyerror ("Missing term"); RECOVER;}
2211 | relational_expression GTE_TK error
2212 {yyerror ("Missing term"); RECOVER;}
2213 | relational_expression INSTANCEOF_TK error
2214 {yyerror ("Invalid reference type"); RECOVER;}
2217 equality_expression:
2218 relational_expression
2219 | equality_expression EQ_TK relational_expression
2221 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2224 | equality_expression NEQ_TK relational_expression
2226 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2229 | equality_expression EQ_TK error
2230 {yyerror ("Missing term"); RECOVER;}
2231 | equality_expression NEQ_TK error
2232 {yyerror ("Missing term"); RECOVER;}
2237 | and_expression AND_TK equality_expression
2239 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2242 | and_expression AND_TK error
2243 {yyerror ("Missing term"); RECOVER;}
2246 exclusive_or_expression:
2248 | exclusive_or_expression XOR_TK and_expression
2250 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2253 | exclusive_or_expression XOR_TK error
2254 {yyerror ("Missing term"); RECOVER;}
2257 inclusive_or_expression:
2258 exclusive_or_expression
2259 | inclusive_or_expression OR_TK exclusive_or_expression
2261 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2264 | inclusive_or_expression OR_TK error
2265 {yyerror ("Missing term"); RECOVER;}
2268 conditional_and_expression:
2269 inclusive_or_expression
2270 | conditional_and_expression BOOL_AND_TK inclusive_or_expression
2272 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2275 | conditional_and_expression BOOL_AND_TK error
2276 {yyerror ("Missing term"); RECOVER;}
2279 conditional_or_expression:
2280 conditional_and_expression
2281 | conditional_or_expression BOOL_OR_TK conditional_and_expression
2283 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2286 | conditional_or_expression BOOL_OR_TK error
2287 {yyerror ("Missing term"); RECOVER;}
2290 conditional_expression: /* Error handling here is weak */
2291 conditional_or_expression
2292 | conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
2294 $$ = build (CONDITIONAL_EXPR, NULL_TREE, $1, $3, $5);
2295 EXPR_WFL_LINECOL ($$) = $2.location;
2297 | conditional_or_expression REL_QM_TK REL_CL_TK error
2300 yyerror ("Missing term");
2303 | conditional_or_expression REL_QM_TK error
2304 {yyerror ("Missing term"); DRECOVER (2);}
2305 | conditional_or_expression REL_QM_TK expression REL_CL_TK error
2306 {yyerror ("Missing term"); DRECOVER (3);}
2309 assignment_expression:
2310 conditional_expression
2315 left_hand_side assignment_operator assignment_expression
2316 { $$ = build_assignment ($2.token, $2.location, $1, $3); }
2317 | left_hand_side assignment_operator error
2319 if (ctxp->prevent_ese != lineno)
2320 yyerror ("Missing term");
2331 assignment_operator:
2337 assignment_expression
2340 constant_expression:
2347 /* Flag for the error report routine to issue the error the first time
2348 it's called (overriding the default behavior which is to drop the
2349 first invocation and honor the second one, taking advantage of a
2351 static int force_error = 0;
2353 /* Create a new parser context and make it the current one. */
2356 java_push_parser_context ()
2358 struct parser_ctxt *new =
2359 (struct parser_ctxt *)xmalloc(sizeof (struct parser_ctxt));
2361 bzero ((PTR) new, sizeof (struct parser_ctxt));
2366 ctxp->incomplete_class = ctxp->next->incomplete_class;
2367 ctxp->gclass_list = ctxp->next->gclass_list;
2371 /* If the first file of a file list was a class file, no context
2372 exists for a source file to be parsed. This boolean remembers that
2373 java_parser_context_save_global might have created a dummy one, so
2374 that java_parser_context_restore_global can pop it. */
2375 static int extra_ctxp_pushed_p = 0;
2378 java_parser_context_save_global ()
2382 java_push_parser_context ();
2383 extra_ctxp_pushed_p = 1;
2385 ctxp->finput = finput;
2386 ctxp->lineno = lineno;
2387 ctxp->current_class = current_class;
2388 ctxp->filename = input_filename;
2389 ctxp->current_function_decl = current_function_decl;
2393 java_parser_context_restore_global ()
2395 finput = ctxp->finput;
2396 lineno = ctxp->lineno;
2397 current_class = ctxp->current_class;
2398 input_filename = ctxp->filename;
2399 current_function_decl = ctxp->current_function_decl;
2400 if (!ctxp->next && extra_ctxp_pushed_p)
2402 java_pop_parser_context (0);
2403 extra_ctxp_pushed_p = 0;
2408 java_pop_parser_context (generate)
2412 struct parser_ctxt *toFree, *next;
2421 next->incomplete_class = ctxp->incomplete_class;
2422 next->gclass_list = ctxp->gclass_list;
2423 lineno = ctxp->lineno;
2424 finput = ctxp->finput;
2425 current_class = ctxp->current_class;
2428 /* Set the single import class file flag to 0 for the current list
2429 of imported things */
2430 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2431 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_PURPOSE (current)) = 0;
2433 /* And restore those of the previous context */
2434 if ((ctxp = next)) /* Assignment is really meant here */
2435 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2436 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_PURPOSE (current)) = 1;
2440 toFree->next = ctxp_for_generation;
2441 ctxp_for_generation = toFree;
2447 /* Reporting an constructor invocation error. */
2449 parse_ctor_invocation_error ()
2451 if (DECL_CONSTRUCTOR_P (current_function_decl))
2452 yyerror ("Constructor invocation must be first thing in a constructor");
2454 yyerror ("Only constructors can invoke constructors");
2457 /* Reporting JDK1.1 features not implemented. */
2460 parse_jdk1_1_error (msg)
2463 sorry (": `%s' JDK1.1(TM) feature", msg);
2465 return empty_stmt_node;
2468 static int do_warning = 0;
2475 static int prev_lineno;
2476 static const char *prev_msg;
2479 char *remainder, *code_from_source;
2480 extern struct obstack temporary_obstack;
2482 if (!force_error && prev_lineno == lineno)
2485 /* Save current error location but report latter, when the context is
2487 if (ctxp->java_error_flag == 0)
2489 ctxp->java_error_flag = 1;
2491 /* Do something to use the previous line if we're reaching the
2492 end of the file... */
2493 #ifdef VERBOSE_SKELETON
2494 printf ("* Error detected (%s)\n", (msg ? msg : "(null)"));
2499 /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
2500 if (!force_error && msg == prev_msg && prev_lineno == elc.line)
2503 ctxp->java_error_flag = 0;
2505 java_warning_count++;
2509 if (elc.col == 0 && msg[1] == ';')
2511 elc.col = ctxp->p_line->char_col-1;
2512 elc.line = ctxp->p_line->lineno;
2515 save_lineno = lineno;
2516 prev_lineno = lineno = elc.line;
2519 code_from_source = java_get_line_col (ctxp->filename, elc.line, elc.col);
2520 obstack_grow0 (&temporary_obstack,
2521 code_from_source, strlen (code_from_source));
2522 remainder = obstack_finish (&temporary_obstack);
2524 warning ("%s.\n%s", msg, remainder);
2526 error ("%s.\n%s", msg, remainder);
2528 /* This allow us to cheaply avoid an extra 'Invalid expression
2529 statement' error report when errors have been already reported on
2530 the same line. This occurs when we report an error but don't have
2531 a synchronization point other than ';', which
2532 expression_statement is the only one to take care of. */
2533 ctxp->prevent_ese = lineno = save_lineno;
2537 issue_warning_error_from_context (cl, msg, ap)
2542 char *saved, *saved_input_filename;
2544 vsprintf (buffer, msg, ap);
2547 ctxp->elc.line = EXPR_WFL_LINENO (cl);
2548 ctxp->elc.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1 :
2549 (EXPR_WFL_COLNO (cl) == 0xffe ? -2 : EXPR_WFL_COLNO (cl)));
2551 /* We have a CL, that's a good reason for using it if it contains data */
2552 saved = ctxp->filename;
2553 if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
2554 ctxp->filename = EXPR_WFL_FILENAME (cl);
2555 saved_input_filename = input_filename;
2556 input_filename = ctxp->filename;
2558 java_error (buffer);
2559 ctxp->filename = saved;
2560 input_filename = saved_input_filename;
2564 /* Issue an error message at a current source line CL */
2567 parse_error_context VPROTO ((tree cl, const char *msg, ...))
2569 #ifndef ANSI_PROTOTYPES
2576 #ifndef ANSI_PROTOTYPES
2577 cl = va_arg (ap, tree);
2578 msg = va_arg (ap, const char *);
2580 issue_warning_error_from_context (cl, msg, ap);
2584 /* Issue a warning at a current source line CL */
2587 parse_warning_context VPROTO ((tree cl, const char *msg, ...))
2589 #ifndef ANSI_PROTOTYPES
2596 #ifndef ANSI_PROTOTYPES
2597 cl = va_arg (ap, tree);
2598 msg = va_arg (ap, const char *);
2601 force_error = do_warning = 1;
2602 issue_warning_error_from_context (cl, msg, ap);
2603 do_warning = force_error = 0;
2608 find_expr_with_wfl (node)
2616 switch (TREE_CODE (node))
2619 node = BLOCK_EXPR_BODY (node);
2623 to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
2626 node = TREE_OPERAND (node, 1);
2630 node = TREE_OPERAND (node, 0);
2633 case LABELED_BLOCK_EXPR:
2634 node = TREE_OPERAND (node, 1);
2638 code = TREE_CODE_CLASS (TREE_CODE (node));
2639 if (((code == '1') || (code == '2') || (code == 'e'))
2640 && EXPR_WFL_LINECOL (node))
2648 /* Issue a missing return statement error. Uses METHOD to figure the
2649 last line of the method the error occurs in. */
2652 missing_return_error (method)
2655 EXPR_WFL_SET_LINECOL (wfl_operator, DECL_SOURCE_LINE_LAST (method), -2);
2656 parse_error_context (wfl_operator, "Missing return statement");
2659 /* Issue an unreachable statement error. From NODE, find the next
2660 statement to report appropriately. */
2662 unreachable_stmt_error (node)
2665 /* Browse node to find the next expression node that has a WFL. Use
2666 the location to report the error */
2667 if (TREE_CODE (node) == COMPOUND_EXPR)
2668 node = find_expr_with_wfl (TREE_OPERAND (node, 1));
2670 node = find_expr_with_wfl (node);
2674 EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
2675 parse_error_context (wfl_operator, "Unreachable statement");
2678 fatal ("Can't get valid statement - unreachable_stmt_error");
2682 java_report_errors ()
2684 if (java_error_count)
2685 fprintf (stderr, "%d error%s",
2686 java_error_count, (java_error_count == 1 ? "" : "s"));
2687 if (java_warning_count)
2688 fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
2689 java_warning_count, (java_warning_count == 1 ? "" : "s"));
2690 if (java_error_count || java_warning_count)
2691 putc ('\n', stderr);
2692 return java_error_count;
2696 java_accstring_lookup (flags)
2699 static char buffer [80];
2700 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
2702 /* Access modifier looked-up first for easier report on forbidden
2704 if (flags & ACC_PUBLIC) COPY_RETURN ("public");
2705 if (flags & ACC_PRIVATE) COPY_RETURN ("private");
2706 if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
2707 if (flags & ACC_STATIC) COPY_RETURN ("static");
2708 if (flags & ACC_FINAL) COPY_RETURN ("final");
2709 if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
2710 if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
2711 if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
2712 if (flags & ACC_NATIVE) COPY_RETURN ("native");
2713 if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
2714 if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
2721 /* Issuing error messages upon redefinition of classes, interfaces or
2725 classitf_redefinition_error (context, id, decl, cl)
2726 const char *context;
2729 parse_error_context (cl, "%s `%s' already defined in %s:%d",
2730 context, IDENTIFIER_POINTER (id),
2731 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
2732 /* Here we should point out where its redefined. It's a unicode. FIXME */
2736 variable_redefinition_error (context, name, type, line)
2737 tree context, name, type;
2740 const char *type_name;
2742 /* Figure a proper name for type. We might haven't resolved it */
2743 if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
2744 type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
2746 type_name = lang_printable_name (type, 0);
2748 parse_error_context (context,
2749 "Variable `%s' is already defined in this method and "
2750 "was declared `%s %s' at line %d",
2751 IDENTIFIER_POINTER (name),
2752 type_name, IDENTIFIER_POINTER (name), line);
2756 build_array_from_name (type, type_wfl, name, ret_name)
2757 tree type, type_wfl, name, *ret_name;
2762 /* Eventually get more dims */
2763 string = IDENTIFIER_POINTER (name);
2764 while (string [more_dims] == '[')
2767 /* If we have, then craft a new type for this variable */
2770 name = get_identifier (&string [more_dims]);
2772 /* If we have a pointer, use its type */
2773 if (TREE_CODE (type) == POINTER_TYPE)
2774 type = TREE_TYPE (type);
2776 /* Building the first dimension of a primitive type uses this
2778 if (JPRIMITIVE_TYPE_P (type))
2780 type = build_java_array_type (type, -1);
2781 CLASS_LOADED_P (type) = 1;
2784 /* Otherwise, if we have a WFL for this type, use it (the type
2785 is already an array on an unresolved type, and we just keep
2786 on adding dimensions) */
2790 /* Add all the dimensions */
2792 type = build_unresolved_array_type (type);
2794 /* The type may have been incomplete in the first place */
2796 type = obtain_incomplete_type (type);
2803 /* Build something that the type identifier resolver will identify as
2804 being an array to an unresolved type. TYPE_WFL is a WFL on a
2808 build_unresolved_array_type (type_or_wfl)
2813 /* TYPE_OR_WFL might be an array on a resolved type. In this case,
2814 just create a array type */
2815 if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
2817 tree type = build_java_array_type (type_or_wfl, -1);
2818 CLASS_LOADED_P (type) = CLASS_LOADED_P (type_or_wfl);
2822 obstack_1grow (&temporary_obstack, '[');
2823 obstack_grow0 (&temporary_obstack,
2824 IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
2825 IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
2826 ptr = obstack_finish (&temporary_obstack);
2827 return build_expr_wfl (get_identifier (ptr),
2828 EXPR_WFL_FILENAME (type_or_wfl),
2829 EXPR_WFL_LINENO (type_or_wfl),
2830 EXPR_WFL_COLNO (type_or_wfl));
2833 /* Check modifiers. If one doesn't fit, retrieve it in its declaration line
2834 and point it out. */
2837 check_modifiers (message, value, mask)
2838 const char *message;
2842 /* Should point out the one that don't fit. ASCII/unicode,
2843 going backward. FIXME */
2846 int i, remainder = value & ~mask;
2847 for (i = 0; i <= 10; i++)
2848 if ((1 << i) & remainder)
2849 parse_error_context (ctxp->modifier_ctx [i], message,
2850 java_accstring_lookup (1 << i));
2855 parser_add_interface (class_decl, interface_decl, wfl)
2856 tree class_decl, interface_decl, wfl;
2858 if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
2859 parse_error_context (wfl, "Interface `%s' repeated",
2860 IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
2863 /* Bulk of common class/interface checks. Return 1 if an error was
2864 encountered. TAG is 0 for a class, 1 for an interface. */
2867 check_class_interface_creation (is_interface, flags, raw_name, qualified_name, decl, cl)
2868 int is_interface, flags;
2869 tree raw_name, qualified_name, decl, cl;
2874 fprintf (stderr, " %s %s", (is_interface ? "interface" : "class"),
2875 IDENTIFIER_POINTER (qualified_name));
2877 /* Scope of an interface/class type name:
2878 - Can't be imported by a single type import
2879 - Can't already exists in the package */
2880 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
2881 && (node = find_name_in_single_imports (raw_name)))
2884 (cl, "%s name `%s' clashes with imported type `%s'",
2885 (is_interface ? "Interface" : "Class"),
2886 IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
2889 if (decl && CLASS_COMPLETE_P (decl))
2891 classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
2892 qualified_name, decl, cl);
2896 /* If public, file name should match class/interface name */
2897 if (flags & ACC_PUBLIC)
2901 /* Contains OS dependent assumption on path separator. FIXME */
2902 for (f = &input_filename [strlen (input_filename)];
2903 f != input_filename && f[0] != '/' && f[0] != DIR_SEPARATOR;
2906 if (f[0] == '/' || f[0] == DIR_SEPARATOR)
2908 if (strncmp (IDENTIFIER_POINTER (raw_name),
2909 f , IDENTIFIER_LENGTH (raw_name)) ||
2910 f [IDENTIFIER_LENGTH (raw_name)] != '.')
2911 parse_error_context (cl, "Public %s `%s' must be defined in a file "
2913 (is_interface ? "interface" : "class"),
2914 IDENTIFIER_POINTER (qualified_name),
2915 IDENTIFIER_POINTER (raw_name));
2918 check_modifiers ((is_interface ?
2919 "Illegal modifier `%s' for interface declaration" :
2920 "Illegal modifier `%s' for class declaration"), flags,
2921 (is_interface ? INTERFACE_MODIFIERS : CLASS_MODIFIERS));
2925 /* If DECL is NULL, create and push a new DECL, record the current
2926 line CL and do other maintenance things. */
2929 maybe_create_class_interface_decl (decl, qualified_name, cl)
2930 tree decl, qualified_name, cl;
2933 decl = push_class (make_class (), qualified_name);
2935 /* Take care of the file and line business */
2936 DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
2937 /* If we're emiting xrefs, store the line/col number information */
2939 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
2941 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
2942 CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
2943 CLASS_FROM_CURRENTLY_COMPILED_SOURCE_P (TREE_TYPE (decl)) =
2944 IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
2946 ctxp->current_parsed_class = decl;
2948 /* Link the declaration to the already seen ones */
2949 TREE_CHAIN (decl) = ctxp->class_list;
2950 ctxp->class_list = decl;
2952 /* Create a new nodes in the global lists */
2953 ctxp->gclass_list = tree_cons (NULL_TREE, decl, ctxp->gclass_list);
2954 all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
2956 /* Install a new dependency list element */
2957 create_jdep_list (ctxp);
2959 SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
2960 IDENTIFIER_POINTER (qualified_name)));
2965 add_superinterfaces (decl, interface_list)
2966 tree decl, interface_list;
2969 /* Superinterface(s): if present and defined, parser_check_super_interface ()
2970 takes care of ensuring that:
2971 - This is an accessible interface type,
2972 - Circularity detection.
2973 parser_add_interface is then called. If present but not defined,
2974 the check operation is delayed until the super interface gets
2976 for (node = interface_list; node; node = TREE_CHAIN (node))
2978 tree current = TREE_PURPOSE (node);
2979 tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
2980 if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
2982 if (!parser_check_super_interface (idecl, decl, current))
2983 parser_add_interface (decl, idecl, current);
2986 register_incomplete_type (JDEP_INTERFACE,
2987 current, decl, NULL_TREE);
2991 /* Create an interface in pass1 and return its decl. Return the
2992 interface's decl in pass 2. */
2995 create_interface (flags, id, super)
2999 tree raw_name = EXPR_WFL_NODE (id);
3000 tree q_name = parser_qualified_classname (id);
3001 tree decl = IDENTIFIER_CLASS_VALUE (q_name);
3003 EXPR_WFL_NODE (id) = q_name; /* Keep source location, even if refined. */
3005 /* Basic checks: scope, redefinition, modifiers */
3006 if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
3009 /* Interface modifiers check
3010 - public/abstract allowed (already done at that point)
3011 - abstract is obsolete (comes first, it's a warning, or should be)
3012 - Can't use twice the same (checked in the modifier rule) */
3013 if ((flags & ACC_ABSTRACT) && flag_redundant)
3014 parse_warning_context
3015 (MODIFIER_WFL (ABSTRACT_TK),
3016 "Redundant use of `abstract' modifier. Interface `%s' is implicitely "
3017 "abstract", IDENTIFIER_POINTER (raw_name));
3019 /* Create a new decl if DECL is NULL, otherwise fix it */
3020 decl = maybe_create_class_interface_decl (decl, q_name, id);
3022 /* Set super info and mark the class a complete */
3023 set_super_info (ACC_INTERFACE | flags, TREE_TYPE (decl),
3024 object_type_node, ctxp->interface_number);
3025 ctxp->interface_number = 0;
3026 CLASS_COMPLETE_P (decl) = 1;
3027 add_superinterfaces (decl, super);
3032 /* Create an class in pass1 and return its decl. Return class
3033 interface's decl in pass 2. */
3036 create_class (flags, id, super, interfaces)
3038 tree id, super, interfaces;
3040 tree raw_name = EXPR_WFL_NODE (id);
3041 tree class_id, decl;
3042 tree super_decl_type;
3044 class_id = parser_qualified_classname (id);
3045 decl = IDENTIFIER_CLASS_VALUE (class_id);
3046 ctxp->current_parsed_class_un = EXPR_WFL_NODE (id);
3047 EXPR_WFL_NODE (id) = class_id;
3049 /* Basic check: scope, redefinition, modifiers */
3050 if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
3053 /* Class modifier check:
3054 - Allowed modifier (already done at that point)
3055 - abstract AND final forbidden
3056 - Public classes defined in the correct file */
3057 if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
3058 parse_error_context (id, "Class `%s' can't be declared both abstract "
3059 "and final", IDENTIFIER_POINTER (raw_name));
3061 /* Create a new decl if DECL is NULL, otherwise fix it */
3062 decl = maybe_create_class_interface_decl (decl, class_id, id);
3064 /* If SUPER exists, use it, otherwise use Object */
3067 /* Can't extend java.lang.Object */
3068 if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
3070 parse_error_context (id, "Can't extend `java.lang.Object'");
3075 register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
3077 else if (TREE_TYPE (decl) != object_type_node)
3078 super_decl_type = object_type_node;
3079 /* We're defining java.lang.Object */
3081 super_decl_type = NULL_TREE;
3083 /* Set super info and mark the class a complete */
3084 set_super_info (flags, TREE_TYPE (decl), super_decl_type,
3085 ctxp->interface_number);
3086 ctxp->interface_number = 0;
3087 CLASS_COMPLETE_P (decl) = 1;
3088 add_superinterfaces (decl, interfaces);
3090 /* If doing xref, store the location at which the inherited class
3091 (if any) was seen. */
3092 if (flag_emit_xref && super)
3093 DECL_INHERITED_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (super);
3095 /* Eventually sets the @deprecated tag flag */
3096 CHECK_DEPRECATED (decl);
3101 /* Can't use lookup_field () since we don't want to load the class and
3102 can't set the CLASS_LOADED_P flag */
3105 find_field (class, name)
3110 for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
3112 if (DECL_NAME (decl) == name)
3118 /* Wrap around lookup_field that doesn't potentially upset the value
3122 lookup_field_wrapper (class, name)
3127 java_parser_context_save_global ();
3128 decl = lookup_field (&type, name);
3129 java_parser_context_restore_global ();
3130 return decl == error_mark_node ? NULL : decl;
3133 /* Find duplicate field within the same class declarations and report
3134 the error. Returns 1 if a duplicated field was found, 0
3138 duplicate_declaration_error_p (new_field_name, new_type, cl)
3139 tree new_field_name, new_type, cl;
3141 /* This might be modified to work with method decl as well */
3142 tree decl = find_field (TREE_TYPE (ctxp->current_parsed_class),
3146 char *t1 = xstrdup (purify_type_name
3147 ((TREE_CODE (new_type) == POINTER_TYPE
3148 && TREE_TYPE (new_type) == NULL_TREE) ?
3149 IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
3150 lang_printable_name (new_type, 1)));
3151 /* The type may not have been completed by the time we report
3153 char *t2 = xstrdup (purify_type_name
3154 ((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
3155 && TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
3156 IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
3157 lang_printable_name (TREE_TYPE (decl), 1)));
3159 (cl , "Duplicate variable declaration: `%s %s' was `%s %s' (%s:%d)",
3160 t1, IDENTIFIER_POINTER (new_field_name),
3161 t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
3162 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3170 /* Field registration routine. If TYPE doesn't exist, field
3171 declarations are linked to the undefined TYPE dependency list, to
3172 be later resolved in java_complete_class () */
3175 register_fields (flags, type, variable_list)
3177 tree type, variable_list;
3179 tree current, saved_type;
3180 tree class_type = TREE_TYPE (ctxp->current_parsed_class);
3181 int saved_lineno = lineno;
3183 tree wfl = NULL_TREE;
3185 /* If we're adding fields to interfaces, those fields are public,
3187 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
3189 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
3191 "%s", "interface field(s)");
3192 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
3194 "%s", "interface field(s)");
3195 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
3196 flags, ACC_FINAL, "%s", "interface field(s)");
3197 check_modifiers ("Illegal interface member modifier `%s'", flags,
3198 INTERFACE_FIELD_MODIFIERS);
3199 flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
3202 /* Obtain a suitable type for resolution, if necessary */
3203 SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
3205 /* If TYPE is fully resolved and we don't have a reference, make one */
3206 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
3208 for (current = variable_list, saved_type = type; current;
3209 current = TREE_CHAIN (current), type = saved_type)
3213 tree cl = TREE_PURPOSE (current);
3214 tree init = TREE_VALUE (current);
3215 tree current_name = EXPR_WFL_NODE (cl);
3217 /* Process NAME, as it may specify extra dimension(s) for it */
3218 type = build_array_from_name (type, wfl, current_name, ¤t_name);
3220 /* Type adjustment. We may have just readjusted TYPE because
3221 the variable specified more dimensions. Make sure we have
3222 a reference if we can and don't have one already. Also
3223 change the name if we have an init. */
3224 if (type != saved_type)
3226 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
3228 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
3231 real_type = GET_REAL_TYPE (type);
3232 /* Check for redeclarations */
3233 if (duplicate_declaration_error_p (current_name, real_type, cl))
3236 /* Set lineno to the line the field was found and create a
3237 declaration for it. Eventually sets the @deprecated tag flag. */
3239 lineno = EXPR_WFL_LINECOL (cl);
3241 lineno = EXPR_WFL_LINENO (cl);
3242 field_decl = add_field (class_type, current_name, real_type, flags);
3243 CHECK_DEPRECATED (field_decl);
3245 /* Check if we must chain. */
3247 register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
3249 /* If we have an initialization value tied to the field */
3252 /* The field is declared static */
3253 if (flags & ACC_STATIC)
3255 /* We include the field and its initialization part into
3256 a list used to generate <clinit>. After <clinit> is
3257 walked, field initializations will be processed and
3258 fields initialized with known constants will be taken
3259 out of <clinit> and have their DECL_INITIAL set
3261 TREE_CHAIN (init) = ctxp->static_initialized;
3262 ctxp->static_initialized = init;
3263 if (TREE_OPERAND (init, 1)
3264 && TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
3265 TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
3267 /* A non-static field declared with an immediate initialization is
3268 to be initialized in <init>, if any. This field is remembered
3269 to be processed at the time of the generation of <init>. */
3272 TREE_CHAIN (init) = ctxp->non_static_initialized;
3273 ctxp->non_static_initialized = init;
3275 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
3276 DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
3279 lineno = saved_lineno;
3282 /* Generate the method $finit$ that initializes fields initialized
3283 upon declaration. */
3286 maybe_generate_finit ()
3288 tree mdecl, current;
3290 if (!ctxp->non_static_initialized || java_error_count)
3293 mdecl = create_artificial_method (TREE_TYPE (ctxp->current_parsed_class),
3294 ACC_PRIVATE, void_type_node,
3295 finit_identifier_node, end_params_node);
3296 start_artificial_method_body (mdecl);
3298 ctxp->non_static_initialized = nreverse (ctxp->non_static_initialized);
3299 for (current = ctxp->non_static_initialized; current;
3300 current = TREE_CHAIN (current))
3301 java_method_add_stmt (mdecl,
3302 build_debugable_stmt (EXPR_WFL_LINECOL (current),
3305 end_artificial_method_body (mdecl);
3306 CLASS_HAS_FINIT_P (TREE_TYPE (ctxp->current_parsed_class)) = 1;
3307 ctxp->non_static_initialized = NULL_TREE;
3310 /* Check whether it is necessary to generate a <clinit> for the class
3314 maybe_generate_clinit ()
3318 if (!ctxp->static_initialized || java_error_count)
3321 mdecl = create_artificial_method (TREE_TYPE (ctxp->current_parsed_class),
3322 ACC_STATIC, void_type_node,
3323 clinit_identifier_node, end_params_node);
3324 start_artificial_method_body (mdecl);
3326 /* Keep initialization in order to enforce 8.5 */
3327 ctxp->static_initialized = nreverse (ctxp->static_initialized);
3329 /* We process the list of assignment we produced as the result of
3330 the declaration of initialized static field and add them as
3331 statement to the <clinit> method. */
3332 for (c = ctxp->static_initialized; c; c = TREE_CHAIN (c))
3334 /* We build the assignment expression that will initialize the
3335 field to its value. There are strict rules on static
3336 initializers (8.5). FIXME */
3337 java_method_add_stmt (mdecl,
3338 build_debugable_stmt (EXPR_WFL_LINECOL (c), c));
3341 end_artificial_method_body (mdecl);
3342 ctxp->static_initialized = NULL_TREE;
3345 /* Shared accros method_declarator and method_header to remember the
3346 patch stage that was reached during the declaration of the method.
3347 A method DECL is built differently is there is no patch
3348 (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
3349 pending on the currently defined method. */
3351 static int patch_stage;
3353 /* Check the method declaration and add the method to its current
3354 class. If the argument list is known to contain incomplete types,
3355 the method is partially added and the registration will be resume
3356 once the method arguments resolved. If TYPE is NULL, we're dealing
3357 with a constructor. */
3360 method_header (flags, type, mdecl, throws)
3362 tree type, mdecl, throws;
3364 tree meth = TREE_VALUE (mdecl);
3365 tree id = TREE_PURPOSE (mdecl);
3366 tree type_wfl = NULL_TREE;
3367 tree meth_name = NULL_TREE;
3368 tree current, orig_arg, this_class;
3370 int constructor_ok = 0, must_chain;
3372 check_modifiers_consistency (flags);
3374 if (ctxp->current_parsed_class)
3375 this_class = TREE_TYPE (ctxp->current_parsed_class);
3379 /* There are some forbidden modifiers for an abstract method and its
3380 class must be abstract as well. */
3381 if (type && (flags & ACC_ABSTRACT))
3383 ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
3384 ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
3385 ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
3386 ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
3387 ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED,id, "Synchronized");
3388 if (!CLASS_ABSTRACT (TYPE_NAME (this_class))
3389 && !CLASS_INTERFACE (TYPE_NAME (this_class)))
3391 (id, "Class `%s' must be declared abstract to define abstract "
3393 IDENTIFIER_POINTER (DECL_NAME (ctxp->current_parsed_class)),
3394 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
3396 /* Things to be checked when declaring a constructor */
3399 int ec = java_error_count;
3400 /* 8.6: Constructor declarations: we might be trying to define a
3401 method without specifying a return type. */
3402 if (EXPR_WFL_NODE (id) != ctxp->current_parsed_class_un)
3404 (id, "Invalid method declaration, return type required");
3405 /* 8.6.3: Constructor modifiers */
3408 JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
3409 JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
3410 JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
3411 JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
3412 JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
3414 /* If we found error here, we don't consider it's OK to tread
3415 the method definition as a constructor, for the rest of this
3417 if (ec == java_error_count)
3421 /* Method declared within the scope of an interface are implicitly
3422 abstract and public. Conflicts with other erroneously provided
3423 modifiers are checked right after. */
3425 if (CLASS_INTERFACE (TYPE_NAME (this_class)))
3427 /* If FLAGS isn't set because of a modifier, turn the
3428 corresponding modifier WFL to NULL so we issue a warning on
3429 the obsolete use of the modifier */
3430 if (!(flags & ACC_PUBLIC))
3431 MODIFIER_WFL (PUBLIC_TK) = NULL;
3432 if (!(flags & ACC_ABSTRACT))
3433 MODIFIER_WFL (ABSTRACT_TK) = NULL;
3434 flags |= ACC_PUBLIC;
3435 flags |= ACC_ABSTRACT;
3438 /* Modifiers context reset moved up, so abstract method declaration
3439 modifiers can be later checked. */
3441 /* Set constructor returned type to void and method name to <init>,
3442 unless we found an error identifier the constructor (in which
3443 case we retain the original name) */
3446 type = void_type_node;
3448 meth_name = init_identifier_node;
3451 meth_name = EXPR_WFL_NODE (id);
3453 /* Do the returned type resolution and registration if necessary */
3454 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
3457 type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
3458 EXPR_WFL_NODE (id) = meth_name;
3459 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
3463 patch_stage = JDEP_METHOD_RETURN;
3464 register_incomplete_type (patch_stage, type_wfl, id, type);
3465 TREE_TYPE (meth) = GET_REAL_TYPE (type);
3468 TREE_TYPE (meth) = type;
3470 saved_lineno = lineno;
3471 /* When defining an abstract or interface method, the curly
3472 bracket at level 1 doesn't exist because there is no function
3474 lineno = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
3475 EXPR_WFL_LINENO (id));
3477 /* Remember the original argument list */
3478 orig_arg = TYPE_ARG_TYPES (meth);
3480 if (patch_stage) /* includes ret type and/or all args */
3483 meth = add_method_1 (this_class, flags, meth_name, meth);
3484 /* Patch for the return type */
3485 if (patch_stage == JDEP_METHOD_RETURN)
3487 jdep = CLASSD_LAST (ctxp->classd_list);
3488 JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
3490 /* This is the stop JDEP. METH allows the function's signature
3492 register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
3495 meth = add_method (this_class, flags, meth_name,
3496 build_java_signature (meth));
3498 /* Fix the method argument list so we have the argument name
3500 fix_method_argument_names (orig_arg, meth);
3502 /* Register the parameter number and re-install the current line
3504 DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
3505 lineno = saved_lineno;
3507 /* Register exception specified by the `throws' keyword for
3508 resolution and set the method decl appropriate field to the list.
3509 Note: the grammar ensures that what we get here are class
3513 throws = nreverse (throws);
3514 for (current = throws; current; current = TREE_CHAIN (current))
3516 register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
3517 NULL_TREE, NULL_TREE);
3518 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
3519 &TREE_VALUE (current);
3521 DECL_FUNCTION_THROWS (meth) = throws;
3524 /* We set the DECL_NAME to ID so we can track the location where
3525 the function was declared. This allow us to report
3526 redefinition error accurately. When method are verified,
3527 DECL_NAME is reinstalled properly (using the content of the
3528 WFL node ID) (see check_method_redefinition). We don't do that
3529 when Object is being defined. Constructor <init> names will be
3530 reinstalled the same way. */
3531 if (TREE_TYPE (ctxp->current_parsed_class) != object_type_node)
3532 DECL_NAME (meth) = id;
3534 /* Set the flag if we correctly processed a constructor */
3536 DECL_CONSTRUCTOR_P (meth) = 1;
3538 /* Eventually set the @deprecated tag flag */
3539 CHECK_DEPRECATED (meth);
3541 /* If doing xref, store column and line number information instead
3542 of the line number only. */
3544 DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
3550 fix_method_argument_names (orig_arg, meth)
3551 tree orig_arg, meth;
3553 tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
3554 if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
3556 TREE_PURPOSE (arg) = this_identifier_node;
3557 arg = TREE_CHAIN (arg);
3559 while (orig_arg != end_params_node)
3561 TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
3562 orig_arg = TREE_CHAIN (orig_arg);
3563 arg = TREE_CHAIN (arg);
3567 /* Complete the method declaration with METHOD_BODY. */
3570 finish_method_declaration (method_body)
3575 if (!current_function_decl)
3578 flags = get_access_flags_from_decl (current_function_decl);
3580 /* 8.4.5 Method Body */
3581 if ((flags & ACC_ABSTRACT || flags & ACC_NATIVE) && method_body)
3583 tree wfl = DECL_NAME (current_function_decl);
3584 parse_error_context (wfl,
3585 "%s method `%s' can't have a body defined",
3586 (METHOD_NATIVE (current_function_decl) ?
3587 "Native" : "Abstract"),
3588 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
3589 method_body = NULL_TREE;
3591 else if (!(flags & ACC_ABSTRACT) && !(flags & ACC_NATIVE) && !method_body)
3593 tree wfl = DECL_NAME (current_function_decl);
3594 parse_error_context (wfl,
3595 "Non native and non abstract method `%s' must "
3596 "have a body defined",
3597 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
3598 method_body = NULL_TREE;
3601 if (flag_emit_class_files && method_body
3602 && TREE_CODE (method_body) == NOP_EXPR
3603 && TREE_TYPE (current_function_decl)
3604 && TREE_TYPE (TREE_TYPE (current_function_decl)) == void_type_node)
3605 method_body = build1 (RETURN_EXPR, void_type_node, NULL);
3607 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
3608 maybe_absorb_scoping_blocks ();
3609 /* Exit function's body */
3611 /* Merge last line of the function with first line, directly in the
3612 function decl. It will be used to emit correct debug info. */
3613 if (!flag_emit_xref)
3614 DECL_SOURCE_LINE_MERGE (current_function_decl, ctxp->last_ccb_indent1);
3615 /* So we don't have an irrelevant function declaration context for
3616 the next static block we'll see. */
3617 current_function_decl = NULL_TREE;
3620 /* Build a an error message for constructor circularity errors. */
3623 constructor_circularity_msg (from, to)
3626 static char string [4096];
3627 char *t = xstrdup (lang_printable_name (from, 0));
3628 sprintf (string, "`%s' invokes `%s'", t, lang_printable_name (to, 0));
3633 /* Verify a circular call to METH. Return 1 if an error is found, 0
3637 verify_constructor_circularity (meth, current)
3640 static tree list = NULL_TREE;
3642 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
3644 if (TREE_VALUE (c) == meth)
3650 list = nreverse (list);
3651 for (liste = list; liste; liste = TREE_CHAIN (liste))
3654 (TREE_PURPOSE (TREE_PURPOSE (liste)),
3655 constructor_circularity_msg
3656 (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
3660 t = xstrdup (lang_printable_name (meth, 0));
3661 parse_error_context (TREE_PURPOSE (c),
3662 "%s: recursive invocation of constructor `%s'",
3663 constructor_circularity_msg (current, meth), t);
3669 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
3671 list = tree_cons (c, current, list);
3672 if (verify_constructor_circularity (meth, TREE_VALUE (c)))
3674 list = TREE_CHAIN (list);
3679 /* Check modifiers that can be declared but exclusively */
3682 check_modifiers_consistency (flags)
3686 tree cl = NULL_TREE;
3688 THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, 0, acc_count, cl);
3689 THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, 1, acc_count, cl);
3690 THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, 2, acc_count, cl);
3693 (cl, "Inconsistent member declaration. At most one of `public', "
3694 "`private', or `protected' may be specified");
3697 /* Check the methode header METH for abstract specifics features */
3700 check_abstract_method_header (meth)
3703 int flags = get_access_flags_from_decl (meth);
3704 /* DECL_NAME might still be a WFL node */
3705 tree name = GET_METHOD_NAME (meth);
3707 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (ABSTRACT_TK), flags,
3708 ACC_ABSTRACT, "abstract method `%s'",
3709 IDENTIFIER_POINTER (name));
3710 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK), flags,
3711 ACC_PUBLIC, "abstract method `%s'",
3712 IDENTIFIER_POINTER (name));
3714 check_modifiers ("Illegal modifier `%s' for interface method",
3715 flags, INTERFACE_METHOD_MODIFIERS);
3718 /* Create a FUNCTION_TYPE node and start augmenting it with the
3719 declared function arguments. Arguments type that can't be resolved
3720 are left as they are, but the returned node is marked as containing
3721 incomplete types. */
3724 method_declarator (id, list)
3727 tree arg_types = NULL_TREE, current, node;
3728 tree meth = make_node (FUNCTION_TYPE);
3731 patch_stage = JDEP_NO_PATCH;
3733 for (current = list; current; current = TREE_CHAIN (current))
3736 tree wfl_name = TREE_PURPOSE (current);
3737 tree type = TREE_VALUE (current);
3738 tree name = EXPR_WFL_NODE (wfl_name);
3739 tree already, arg_node;
3740 tree type_wfl = NULL_TREE;
3743 /* Obtain a suitable type for resolution, if necessary */
3744 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
3746 /* Process NAME, as it may specify extra dimension(s) for it */
3747 type = build_array_from_name (type, type_wfl, name, &name);
3748 EXPR_WFL_NODE (wfl_name) = name;
3750 real_type = GET_REAL_TYPE (type);
3751 if (TREE_CODE (real_type) == RECORD_TYPE)
3753 real_type = promote_type (real_type);
3754 if (TREE_CODE (type) == TREE_LIST)
3755 TREE_PURPOSE (type) = real_type;
3758 /* Check redefinition */
3759 for (already = arg_types; already; already = TREE_CHAIN (already))
3760 if (TREE_PURPOSE (already) == name)
3763 (wfl_name, "Variable `%s' is used more than once in the "
3764 "argument list of method `%s'", IDENTIFIER_POINTER (name),
3765 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
3769 /* If we've an incomplete argument type, we know there is a location
3770 to patch when the type get resolved, later. */
3774 patch_stage = JDEP_METHOD;
3775 type = register_incomplete_type (patch_stage,
3776 type_wfl, wfl_name, type);
3777 jdep = CLASSD_LAST (ctxp->classd_list);
3778 JDEP_MISC (jdep) = id;
3781 /* The argument node: a name and a (possibly) incomplete type */
3782 arg_node = build_tree_list (name, real_type);
3784 JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
3785 TREE_CHAIN (arg_node) = arg_types;
3786 arg_types = arg_node;
3788 TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
3789 node = build_tree_list (id, meth);
3794 unresolved_type_p (wfl, returned)
3799 if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
3801 tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
3803 *returned = (decl ? TREE_TYPE (decl) : NULL_TREE);
3811 /* From NAME, build a qualified identifier node using the
3812 qualification from the current package definition. */
3815 parser_qualified_classname (name)
3819 return merge_qualified_name (ctxp->package, EXPR_WFL_NODE (name));
3821 return EXPR_WFL_NODE (name);
3824 /* Called once the type a interface extends is resolved. Returns 0 if
3825 everything is OK. */
3828 parser_check_super_interface (super_decl, this_decl, this_wfl)
3829 tree super_decl, this_decl, this_wfl;
3831 tree super_type = TREE_TYPE (super_decl);
3833 /* Has to be an interface */
3834 if (!CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (super_decl))))
3837 (this_wfl, "Can't use %s `%s' to implement/extend %s `%s'",
3838 (TYPE_ARRAY_P (super_type) ? "array" : "class"),
3839 IDENTIFIER_POINTER (DECL_NAME (super_decl)),
3840 (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
3841 "interface" : "class"),
3842 IDENTIFIER_POINTER (DECL_NAME (this_decl)));
3846 /* Check scope: same package OK, other package: OK if public */
3847 if (check_pkg_class_access (DECL_NAME (super_decl), lookup_cl (this_decl)))
3850 SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
3851 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
3852 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
3856 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
3857 0 if everthing is OK. */
3860 parser_check_super (super_decl, this_decl, wfl)
3861 tree super_decl, this_decl, wfl;
3863 tree super_type = TREE_TYPE (super_decl);
3865 /* SUPER should be a CLASS (neither an array nor an interface) */
3866 if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
3869 (wfl, "Class `%s' can't subclass %s `%s'",
3870 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
3871 (CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
3872 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
3876 if (CLASS_FINAL (TYPE_NAME (super_type)))
3878 parse_error_context (wfl, "Can't subclass final classes: %s",
3879 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
3883 /* Check scope: same package OK, other package: OK if public */
3884 if (check_pkg_class_access (DECL_NAME (super_decl), wfl))
3887 SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
3888 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
3889 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
3893 /* Create a new dependency list and link it (in a LIFO manner) to the
3894 CTXP list of type dependency list. */
3897 create_jdep_list (ctxp)
3898 struct parser_ctxt *ctxp;
3900 jdeplist *new = (jdeplist *)xmalloc (sizeof (jdeplist));
3901 new->first = new->last = NULL;
3902 new->next = ctxp->classd_list;
3903 ctxp->classd_list = new;
3907 reverse_jdep_list (ctxp)
3908 struct parser_ctxt *ctxp;
3910 register jdeplist *prev = NULL, *current, *next;
3911 for (current = ctxp->classd_list; current; current = next)
3913 next = current->next;
3914 current->next = prev;
3920 /* Create a fake pointer based on the ID stored in
3921 TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
3922 registered again. */
3925 obtain_incomplete_type (type_name)
3930 if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
3931 name = EXPR_WFL_NODE (type_name);
3932 else if (INCOMPLETE_TYPE_P (type_name))
3933 name = TYPE_NAME (type_name);
3935 fatal ("invalid type name - obtain_incomplete_type");
3937 for (ptr = ctxp->incomplete_class; ptr; ptr = TREE_CHAIN (ptr))
3938 if (TYPE_NAME (ptr) == name)
3943 push_obstacks (&permanent_obstack, &permanent_obstack);
3944 BUILD_PTR_FROM_NAME (ptr, name);
3947 TREE_CHAIN (ptr) = ctxp->incomplete_class;
3948 ctxp->incomplete_class = ptr;
3954 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
3955 non NULL instead of computing a new fake type based on WFL. The new
3956 dependency is inserted in the current type dependency list, in FIFO
3960 register_incomplete_type (kind, wfl, decl, ptr)
3962 tree wfl, decl, ptr;
3964 jdep *new = (jdep *)xmalloc (sizeof (jdep));
3966 if (!ptr && kind != JDEP_METHOD_END) /* JDEP_METHOD_END is a mere marker */
3967 ptr = obtain_incomplete_type (wfl);
3969 JDEP_KIND (new) = kind;
3970 JDEP_DECL (new) = decl;
3971 JDEP_SOLV (new) = ptr;
3972 JDEP_WFL (new) = wfl;
3973 JDEP_CHAIN (new) = NULL;
3974 JDEP_MISC (new) = NULL_TREE;
3975 JDEP_GET_PATCH (new) = (tree *)NULL;
3977 JDEP_INSERT (ctxp->classd_list, new);
3983 java_check_circular_reference ()
3986 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
3988 tree type = TREE_TYPE (current);
3989 if (CLASS_INTERFACE (current))
3991 /* Check all interfaces this class extends */
3992 tree basetype_vec = TYPE_BINFO_BASETYPES (type);
3997 n = TREE_VEC_LENGTH (basetype_vec);
3998 for (i = 0; i < n; i++)
4000 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
4001 if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node
4002 && interface_of_p (type, BINFO_TYPE (vec_elt)))
4003 parse_error_context (lookup_cl (current),
4004 "Cyclic interface inheritance");
4008 if (inherits_from_p (CLASSTYPE_SUPER (type), type))
4009 parse_error_context (lookup_cl (current),
4010 "Cyclic class inheritance");
4014 /* Fix the constructors. This will be called right after circular
4015 references have been checked. It is necessary to fix constructors
4016 early even if no code generation will take place for that class:
4017 some generated constructor might be required by the class whose
4018 compilation triggered this one to be simply loaded. */
4021 java_fix_constructors ()
4025 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
4028 tree class_type = TREE_TYPE (current);
4031 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
4033 if (DECL_CONSTRUCTOR_P (decl))
4035 fix_constructors (decl);
4042 int flags = (get_access_flags_from_decl (current) & ACC_PUBLIC ?
4044 decl = create_artificial_method (class_type, flags, void_type_node,
4045 init_identifier_node,
4047 DECL_CONSTRUCTOR_P (decl) = 1;
4052 /* safe_layout_class just makes sure that we can load a class without
4053 disrupting the current_class, input_file, lineno, etc, information
4054 about the class processed currently. */
4057 safe_layout_class (class)
4060 tree save_current_class = current_class;
4061 char *save_input_filename = input_filename;
4062 int save_lineno = lineno;
4064 push_obstacks (&permanent_obstack, &permanent_obstack);
4066 layout_class (class);
4069 current_class = save_current_class;
4070 input_filename = save_input_filename;
4071 lineno = save_lineno;
4072 CLASS_LOADED_P (class) = 1;
4076 jdep_resolve_class (dep)
4081 if (JDEP_RESOLVED_P (dep))
4082 decl = JDEP_RESOLVED_DECL (dep);
4085 decl = resolve_class (JDEP_TO_RESOLVE (dep),
4086 JDEP_DECL (dep), JDEP_WFL (dep));
4087 JDEP_RESOLVED (dep, decl);
4091 complete_class_report_errors (dep);
4096 /* Complete unsatisfied class declaration and their dependencies */
4099 java_complete_class ()
4106 push_obstacks (&permanent_obstack, &permanent_obstack);
4108 /* Process imports and reverse the import on demand list */
4110 if (ctxp->import_demand_list)
4111 ctxp->import_demand_list = nreverse (ctxp->import_demand_list);
4113 /* Rever things so we have the right order */
4114 ctxp->class_list = nreverse (ctxp->class_list);
4115 ctxp->classd_list = reverse_jdep_list (ctxp);
4117 for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
4119 cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
4122 for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
4125 if (!(decl = jdep_resolve_class (dep)))
4128 /* Now it's time to patch */
4129 switch (JDEP_KIND (dep))
4132 /* Simply patch super */
4133 if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
4135 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO
4136 (TREE_TYPE (JDEP_DECL (dep)))), 0)) = TREE_TYPE (decl);
4141 /* We do part of the job done in add_field */
4142 tree field_decl = JDEP_DECL (dep);
4143 tree field_type = TREE_TYPE (decl);
4144 push_obstacks (&permanent_obstack, &permanent_obstack);
4145 if (TREE_CODE (field_type) == RECORD_TYPE)
4146 field_type = promote_type (field_type);
4148 TREE_TYPE (field_decl) = field_type;
4149 DECL_ALIGN (field_decl) = 0;
4150 layout_decl (field_decl, 0);
4151 SOURCE_FRONTEND_DEBUG
4152 (("Completed field/var decl `%s' with `%s'",
4153 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
4154 IDENTIFIER_POINTER (DECL_NAME (decl))));
4157 case JDEP_METHOD: /* We start patching a method */
4158 case JDEP_METHOD_RETURN:
4164 type = TREE_TYPE(decl);
4165 if (TREE_CODE (type) == RECORD_TYPE)
4166 type = promote_type (type);
4167 JDEP_APPLY_PATCH (dep, type);
4168 SOURCE_FRONTEND_DEBUG
4169 (((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
4170 "Completing fct `%s' with ret type `%s'":
4171 "Completing arg `%s' with type `%s'"),
4172 IDENTIFIER_POINTER (EXPR_WFL_NODE
4173 (JDEP_DECL_WFL (dep))),
4174 IDENTIFIER_POINTER (DECL_NAME (decl))));
4178 dep = JDEP_CHAIN (dep);
4179 if (JDEP_KIND (dep) == JDEP_METHOD_END)
4182 decl = jdep_resolve_class (dep);
4186 tree mdecl = JDEP_DECL (dep), signature;
4187 push_obstacks (&permanent_obstack, &permanent_obstack);
4188 /* Recompute and reset the signature */
4189 signature = build_java_signature (TREE_TYPE (mdecl));
4190 set_java_signature (TREE_TYPE (mdecl), signature);
4197 case JDEP_INTERFACE:
4198 if (parser_check_super_interface (decl, JDEP_DECL (dep),
4201 parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
4206 type = TREE_TYPE(decl);
4207 if (TREE_CODE (type) == RECORD_TYPE)
4208 type = promote_type (type);
4209 JDEP_APPLY_PATCH (dep, type);
4213 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
4214 SOURCE_FRONTEND_DEBUG
4215 (("Completing a random type dependency on a '%s' node",
4216 tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
4219 case JDEP_EXCEPTION:
4220 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
4221 SOURCE_FRONTEND_DEBUG
4222 (("Completing `%s' `throws' argument node",
4223 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
4227 fatal ("Can't handle patch code %d - java_complete_class",
4236 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
4240 resolve_class (class_type, decl, cl)
4241 tree class_type, decl, cl;
4243 const char *name = IDENTIFIER_POINTER (TYPE_NAME (class_type));
4244 const char *base = name;
4245 tree resolved_type = TREE_TYPE (class_type);
4246 tree resolved_type_decl;
4248 if (resolved_type != NULL_TREE)
4250 tree resolved_type_decl = TYPE_NAME (resolved_type);
4251 if (resolved_type_decl == NULL_TREE
4252 || TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
4254 resolved_type_decl = build_decl (TYPE_DECL,
4255 TYPE_NAME (class_type),
4258 return resolved_type_decl;
4261 /* 1- Check to see if we have an array. If true, find what we really
4263 while (name[0] == '[')
4266 TYPE_NAME (class_type) = get_identifier (name);
4268 /* 2- Resolve the bare type */
4269 if (!(resolved_type_decl = do_resolve_class (class_type, decl, cl)))
4271 resolved_type = TREE_TYPE (resolved_type_decl);
4273 /* 3- If we have and array, reconstruct the array down to its nesting */
4276 while (base != name)
4278 if (TREE_CODE (resolved_type) == RECORD_TYPE)
4279 resolved_type = promote_type (resolved_type);
4280 resolved_type = build_java_array_type (resolved_type, -1);
4281 CLASS_LOADED_P (resolved_type) = 1;
4284 /* Build a fake decl for this, since this is what is expected to
4286 resolved_type_decl =
4287 build_decl (TYPE_DECL, TYPE_NAME (resolved_type), resolved_type);
4288 /* Figure how those two things are important for error report. FIXME */
4289 DECL_SOURCE_LINE (resolved_type_decl) = 0;
4290 DECL_SOURCE_FILE (resolved_type_decl) = input_filename;
4291 TYPE_NAME (class_type) = TYPE_NAME (resolved_type);
4293 TREE_TYPE (class_type) = resolved_type;
4294 return resolved_type_decl;
4297 /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL
4298 are used to report error messages. */
4301 do_resolve_class (class_type, decl, cl)
4306 tree new_class_decl;
4307 tree original_name = NULL_TREE;
4309 /* Do not try to replace TYPE_NAME (class_type) by a variable, since
4310 its is changed by find_in_imports{_on_demand} */
4312 /* 1- Check for the type in single imports */
4313 if (find_in_imports (class_type))
4316 /* 2- And check for the type in the current compilation unit. If it fails,
4317 try with a name qualified with the package name if appropriate. */
4318 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
4320 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
4321 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
4322 load_class (TYPE_NAME (class_type), 0);
4323 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
4326 original_name = TYPE_NAME (class_type);
4327 if (!QUALIFIED_P (TYPE_NAME (class_type)) && ctxp->package)
4328 TYPE_NAME (class_type) = merge_qualified_name (ctxp->package,
4329 TYPE_NAME (class_type));
4331 if (!(new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
4332 load_class (TYPE_NAME (class_type), 0);
4333 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
4335 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
4336 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
4337 load_class (TYPE_NAME (class_type), 0);
4338 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
4341 new_name = TYPE_NAME (class_type);
4342 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_name)) != NULL_TREE)
4344 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
4345 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
4346 load_class (new_name, 0);
4347 return IDENTIFIER_CLASS_VALUE (new_name);
4351 tree class = read_class (new_name);
4352 if (class != NULL_TREE)
4354 tree decl = IDENTIFIER_CLASS_VALUE (new_name);
4355 if (decl == NULL_TREE)
4356 decl = push_class (class, new_name);
4361 TYPE_NAME (class_type) = original_name;
4363 /* 3- Check an other compilation unit that bears the name of type */
4364 load_class (TYPE_NAME (class_type), 0);
4365 if (check_pkg_class_access (TYPE_NAME (class_type),
4366 (cl ? cl : lookup_cl (decl))))
4369 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
4370 return new_class_decl;
4372 /* 4- Check the import on demands. Don't allow bar.baz to be
4373 imported from foo.* */
4374 if (!QUALIFIED_P (TYPE_NAME (class_type)))
4375 if (find_in_imports_on_demand (class_type))
4378 /* 5- Last call for a resolution */
4379 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
4382 /* Resolve NAME and lay it out (if not done and if not the current
4383 parsed class). Return a decl node. This function is meant to be
4384 called when type resolution is necessary during the walk pass. */
4387 resolve_and_layout (something, cl)
4393 /* Don't do that on the current class */
4394 if (something == current_class)
4395 return TYPE_NAME (current_class);
4397 /* Don't do anything for void and other primitive types */
4398 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
4401 /* Pointer types can be reall pointer types or fake pointers. When
4402 finding a real pointer, recheck for primitive types */
4403 if (TREE_CODE (something) == POINTER_TYPE)
4405 if (TREE_TYPE (something))
4407 something = TREE_TYPE (something);
4408 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
4412 something = TYPE_NAME (something);
4415 /* Don't do anything for arrays of primitive types */
4416 if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
4417 && JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
4420 /* If something is not and IDENTIFIER_NODE, it can be a a TYPE_DECL
4422 if (TREE_CODE (something) != IDENTIFIER_NODE)
4423 something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
4424 DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
4426 if (!(decl = resolve_no_layout (something, cl)))
4429 /* Resolve and layout if necessary */
4430 layout_class_methods (TREE_TYPE (decl));
4431 /* Check methods, but only once */
4432 if (CLASS_FROM_SOURCE_P (TREE_TYPE (decl))
4433 && !CLASS_LOADED_P (TREE_TYPE (decl)))
4434 CHECK_METHODS (decl);
4435 if (TREE_TYPE (decl) != current_class && !CLASS_LOADED_P (TREE_TYPE (decl)))
4436 safe_layout_class (TREE_TYPE (decl));
4441 /* Resolve a class, returns its decl but doesn't perform any
4442 layout. The current parsing context is saved and restored */
4445 resolve_no_layout (name, cl)
4449 BUILD_PTR_FROM_NAME (ptr, name);
4450 java_parser_context_save_global ();
4451 decl = resolve_class (ptr, NULL_TREE, cl);
4452 java_parser_context_restore_global ();
4457 /* Called when reporting errors. Skip leader '[' in a complex array
4458 type description that failed to be resolved. */
4461 purify_type_name (name)
4464 while (*name && *name == '[')
4469 /* The type CURRENT refers to can't be found. We print error messages. */
4472 complete_class_report_errors (dep)
4477 if (!JDEP_WFL (dep))
4480 name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
4481 switch (JDEP_KIND (dep))
4485 (JDEP_WFL (dep), "Superclass `%s' of class `%s' not found",
4486 purify_type_name (name),
4487 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
4491 (JDEP_WFL (dep), "Type `%s' not found in declaration of field `%s'",
4492 purify_type_name (name),
4493 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
4495 case JDEP_METHOD: /* Covers arguments */
4497 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the "
4498 "argument `%s' of method `%s'",
4499 purify_type_name (name),
4500 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
4501 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
4503 case JDEP_METHOD_RETURN: /* Covers return type */
4505 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the "
4506 "return type of method `%s'",
4507 purify_type_name (name),
4508 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
4510 case JDEP_INTERFACE:
4512 (JDEP_WFL (dep), "Superinterface `%s' of %s `%s' not found",
4513 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
4514 (CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
4515 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
4519 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the "
4520 "local variable `%s'",
4521 purify_type_name (IDENTIFIER_POINTER
4522 (EXPR_WFL_NODE (JDEP_WFL (dep)))),
4523 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
4525 case JDEP_EXCEPTION: /* As specified by `throws' */
4527 (JDEP_WFL (dep), "Class `%s' not found in `throws'",
4528 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
4531 /* Fix for -Wall. Just break doing nothing. The error will be
4537 /* Check uninitialized final. */
4544 /* Return a static string containing the DECL prototype string. If
4545 DECL is a constructor, use the class name instead of the form
4549 get_printable_method_name (decl)
4552 const char *to_return;
4553 tree name = NULL_TREE;
4555 if (DECL_CONSTRUCTOR_P (decl))
4557 name = DECL_NAME (decl);
4558 DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
4561 to_return = lang_printable_name (decl, 0);
4562 if (DECL_CONSTRUCTOR_P (decl))
4563 DECL_NAME (decl) = name;
4568 /* Reinstall the proper DECL_NAME on METHOD. Return 0 if the method
4569 nevertheless needs to be verfied, 1 otherwise. */
4572 reset_method_name (method)
4575 if (!IS_CLINIT (method) && DECL_NAME (method) != finit_identifier_node)
4577 /* NAME is just the plain name when Object is being defined */
4578 if (DECL_CONTEXT (method) != object_type_node)
4579 DECL_NAME (method) = (DECL_CONSTRUCTOR_P (method) ?
4580 init_identifier_node : GET_METHOD_NAME (method));
4587 /* Return the name of METHOD_DECL, when DECL_NAME is a WFL */
4590 java_get_real_method_name (method_decl)
4593 tree method_name = DECL_NAME (method_decl);
4594 if (DECL_CONSTRUCTOR_P (method_decl))
4595 return init_identifier_node;
4597 /* Explain here why METHOD_DECL doesn't have the DECL_CONSTRUCTUR_P
4598 and still can be a constructor. FIXME */
4600 /* Don't confuse method only bearing the name of their class as
4602 else if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (method_decl))
4604 && ctxp->current_parsed_class_un == EXPR_WFL_NODE (method_name)
4605 && get_access_flags_from_decl (method_decl) <= ACC_PROTECTED
4606 && TREE_TYPE (TREE_TYPE (method_decl)) == void_type_node)
4607 return init_identifier_node;
4609 return EXPR_WFL_NODE (method_name);
4612 /* Track method being redefined inside the same class. As a side
4613 effect, set DECL_NAME to an IDENTIFIER (prior entering this
4614 function it's a FWL, so we can track errors more accurately.) */
4617 check_method_redefinition (class, method)
4621 tree cl = DECL_NAME (method);
4622 tree sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
4623 /* decl name of artificial <clinit> and $finit$ doesn't need to be
4624 fixed and checked */
4626 /* Reset the method name before running the check. If it returns 1,
4627 the method doesn't need to be verified with respect to method
4628 redeclaration and we return 0 */
4629 if (reset_method_name (method))
4632 name = DECL_NAME (method);
4633 for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
4635 if (redef == method)
4637 if (DECL_NAME (redef) == name
4638 && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef)))
4641 (cl, "Duplicate %s declaration `%s'",
4642 (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
4643 get_printable_method_name (redef));
4651 check_abstract_method_definitions (do_interface, class_decl, type)
4653 tree class_decl, type;
4655 tree class = TREE_TYPE (class_decl);
4656 tree method, end_type;
4658 end_type = (do_interface ? object_type_node : type);
4659 for (method = TYPE_METHODS (type); method; method = TREE_CHAIN (method))
4661 tree other_super, other_method, method_sig, method_name;
4664 if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
4667 /* Now verify that somewhere in between TYPE and CLASS,
4668 abstract method METHOD gets a non abstract definition
4669 that is inherited by CLASS. */
4671 method_sig = build_java_signature (TREE_TYPE (method));
4672 method_name = DECL_NAME (method);
4673 if (TREE_CODE (method_name) == EXPR_WITH_FILE_LOCATION)
4674 method_name = EXPR_WFL_NODE (method_name);
4676 for (other_super = class; other_super != end_type;
4677 other_super = CLASSTYPE_SUPER (other_super))
4679 for (other_method = TYPE_METHODS (other_super); other_method;
4680 other_method = TREE_CHAIN (other_method))
4682 tree s = build_java_signature (TREE_TYPE (other_method));
4683 tree other_name = DECL_NAME (other_method);
4685 if (TREE_CODE (other_name) == EXPR_WITH_FILE_LOCATION)
4686 other_name = EXPR_WFL_NODE (other_name);
4687 if (!IS_CLINIT (other_method)
4688 && !DECL_CONSTRUCTOR_P (other_method)
4689 && method_name == other_name && method_sig == s)
4697 /* Report that abstract METHOD didn't find an implementation
4698 that CLASS can use. */
4701 char *t = xstrdup (lang_printable_name
4702 (TREE_TYPE (TREE_TYPE (method)), 0));
4703 tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
4704 tree saved_wfl = NULL_TREE;
4706 if (TREE_CODE (DECL_NAME (method)) == EXPR_WITH_FILE_LOCATION)
4708 saved_wfl = DECL_NAME (method);
4709 DECL_NAME (method) = EXPR_WFL_NODE (DECL_NAME (method));
4713 (lookup_cl (class_decl),
4714 "Class `%s' doesn't define the abstract method `%s %s' from "
4715 "%s `%s'. This method must be defined or %s `%s' must be "
4716 "declared abstract",
4717 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
4718 t, lang_printable_name (method, 0),
4719 (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))) ?
4720 "interface" : "class"),
4721 IDENTIFIER_POINTER (ccn),
4722 (CLASS_INTERFACE (class_decl) ? "interface" : "class"),
4723 IDENTIFIER_POINTER (DECL_NAME (class_decl)));
4728 DECL_NAME (method) = saved_wfl;
4733 /* Check that CLASS_DECL somehoow implements all inherited abstract
4737 java_check_abstract_method_definitions (class_decl)
4740 tree class = TREE_TYPE (class_decl);
4744 if (CLASS_ABSTRACT (class_decl))
4747 /* Check for inherited types */
4748 for (super = CLASSTYPE_SUPER (class); super != object_type_node;
4749 super = CLASSTYPE_SUPER (super))
4751 if (!CLASS_ABSTRACT (TYPE_NAME (super)))
4754 check_abstract_method_definitions (0, class_decl, super);
4757 /* Check for implemented interfaces. */
4758 vector = TYPE_BINFO_BASETYPES (class);
4759 for (i = 1; i < TREE_VEC_LENGTH (vector); i++)
4761 super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
4762 check_abstract_method_definitions (1, class_decl, super);
4766 /* Check all the methods of CLASS_DECL. Methods are first completed
4767 then checked according to regular method existance rules. If no
4768 constructor for CLASS_DECL were encountered, then build its
4772 java_check_regular_methods (class_decl)
4775 int saw_constructor = 0;
4777 tree class = CLASS_TO_HANDLE_TYPE (TREE_TYPE (class_decl));
4778 tree super_class = CLASSTYPE_SUPER (class);
4779 tree saved_found_wfl = NULL_TREE, found = NULL_TREE;
4782 /* It is not necessary to check methods defined in java.lang.Object */
4783 if (class == object_type_node)
4786 if (!TYPE_NVIRTUALS (class))
4787 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
4789 /* Should take interfaces into account. FIXME */
4790 for (method = TYPE_METHODS (class); method; method = TREE_CHAIN (method))
4793 tree method_wfl = DECL_NAME (method);
4796 /* If we previously found something and its name was saved,
4798 if (found && saved_found_wfl)
4800 DECL_NAME (found) = saved_found_wfl;
4801 saved_found_wfl = NULL_TREE;
4804 /* Check for redefinitions */
4805 if (check_method_redefinition (class, method))
4808 /* If we see one constructor a mark so we don't generate the
4809 default one. Also skip other verifications: constructors
4810 can't be inherited hence hiden or overriden */
4811 if (DECL_CONSTRUCTOR_P (method))
4813 saw_constructor = 1;
4817 /* We verify things thrown by the method. They must inherits from
4818 java.lang.Throwable */
4819 for (mthrows = DECL_FUNCTION_THROWS (method);
4820 mthrows; mthrows = TREE_CHAIN (mthrows))
4822 if (!inherits_from_p (TREE_VALUE (mthrows), throwable_type_node))
4824 (TREE_PURPOSE (mthrows), "Class `%s' in `throws' clause must be "
4825 "a subclass of class `java.lang.Throwable'",
4827 (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))));
4830 sig = build_java_argument_signature (TREE_TYPE (method));
4831 found = lookup_argument_method (super_class, DECL_NAME (method), sig);
4833 /* Nothing overrides or it's a private method. */
4836 if (METHOD_PRIVATE (found))
4842 /* If found wasn't verified, it's DECL_NAME won't be set properly.
4843 We set it temporarily for the sake of the error report. */
4844 saved_found_wfl = DECL_NAME (found);
4845 reset_method_name (found);
4847 /* Can't override a method with the same name and different return
4849 if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
4851 char *t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)),
4855 "Method `%s' was defined with return type `%s' in class `%s'",
4856 lang_printable_name (found, 0), t,
4858 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4862 aflags = get_access_flags_from_decl (found);
4863 /* If the method has default, access in an other package, then
4864 issue a warning that the current method doesn't override the
4865 one that was found elsewhere. Do not issue this warning when
4866 the match was found in java.lang.Object. */
4867 if (DECL_CONTEXT (found) != object_type_node
4868 && ((aflags & 0x7) == 0)
4869 && !class_in_current_package (DECL_CONTEXT (found))
4870 && DECL_NAME (found) != clinit_identifier_node
4871 && flag_not_overriding)
4873 parse_warning_context
4874 (method_wfl, "Method `%s' in class `%s' does not "
4875 "override the corresponding method in class `%s', which is "
4876 "private to a different package",
4877 lang_printable_name (found, 0),
4878 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
4879 IDENTIFIER_POINTER (DECL_NAME
4880 (TYPE_NAME (DECL_CONTEXT (found)))));
4884 /* Can't override final. Can't override static. */
4885 if (METHOD_FINAL (found) || METHOD_STATIC (found))
4887 /* Static *can* override static */
4888 if (METHOD_STATIC (found) && METHOD_STATIC (method))
4892 "%s methods can't be overriden. Method `%s' is %s in class `%s'",
4893 (METHOD_FINAL (found) ? "Final" : "Static"),
4894 lang_printable_name (found, 0),
4895 (METHOD_FINAL (found) ? "final" : "static"),
4897 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4901 /* Static method can't override instance method. */
4902 if (METHOD_STATIC (method))
4906 "Instance methods can't be overriden by a static method. Method "
4907 "`%s' is an instance method in class `%s'",
4908 lang_printable_name (found, 0),
4910 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4914 /* - Overriding/hiding public must be public
4915 - Overriding/hiding protected must be protected or public
4916 - If the overriden or hidden method has default (package)
4917 access, then the overriding or hiding method must not be
4918 private; otherwise, a compile-time error occurs */
4919 if ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
4920 || (METHOD_PROTECTED (found)
4921 && !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
4922 || (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
4923 && METHOD_PRIVATE (method)))
4927 "Methods can't be overridden to be more private. Method `%s' is "
4928 "not %s in class `%s'", lang_printable_name (method, 0),
4929 (METHOD_PUBLIC (method) ? "public" :
4930 (METHOD_PRIVATE (method) ? "private" : "protected")),
4931 IDENTIFIER_POINTER (DECL_NAME
4932 (TYPE_NAME (DECL_CONTEXT (found)))));
4936 /* Overriding methods must have compatible `throws' clauses on checked
4937 exceptions, if any */
4938 check_throws_clauses (method, method_wfl, found);
4940 /* Inheriting multiple methods with the same signature. FIXME */
4943 /* Don't forget eventual pending found and saved_found_wfl. Take
4944 into account that we might have exited because we saw an
4945 artificial method as the last entry. */
4947 if (found && !DECL_ARTIFICIAL (found) && saved_found_wfl)
4948 DECL_NAME (found) = saved_found_wfl;
4950 if (!TYPE_NVIRTUALS (class))
4951 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
4953 /* Search for inherited abstract method not yet implemented in this
4955 java_check_abstract_method_definitions (class_decl);
4957 if (!saw_constructor)
4958 fatal ("No constructor found");
4961 /* Return a non zero value if the `throws' clause of METHOD (if any)
4962 is incompatible with the `throws' clause of FOUND (if any). */
4965 check_throws_clauses (method, method_wfl, found)
4966 tree method, method_wfl, found;
4968 tree mthrows, fthrows;
4970 /* Can't check these things with class loaded from bytecode. FIXME */
4971 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
4974 for (mthrows = DECL_FUNCTION_THROWS (method);
4975 mthrows; mthrows = TREE_CHAIN (mthrows))
4977 /* We don't verify unchecked expressions */
4978 if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
4980 /* Checked expression must be compatible */
4981 for (fthrows = DECL_FUNCTION_THROWS (found);
4982 fthrows; fthrows = TREE_CHAIN (fthrows))
4983 if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
4988 (method_wfl, "Invalid checked exception class `%s' in "
4989 "`throws' clause. The exception must be a subclass of an "
4990 "exception thrown by `%s' from class `%s'",
4991 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
4992 lang_printable_name (found, 0),
4994 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4999 /* Check abstract method of interface INTERFACE */
5002 java_check_abstract_methods (interface_decl)
5003 tree interface_decl;
5006 tree method, basetype_vec, found;
5007 tree interface = TREE_TYPE (interface_decl);
5009 for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
5011 tree method_wfl = DECL_NAME (method);
5013 /* 2- Check for double definition inside the defining interface */
5014 if (check_method_redefinition (interface, method))
5017 /* 3- Overriding is OK as far as we preserve the return type and
5018 the thrown exceptions (FIXME) */
5019 found = lookup_java_interface_method2 (interface, method);
5023 tree saved_found_wfl = DECL_NAME (found);
5024 reset_method_name (found);
5025 t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
5028 "Method `%s' was defined with return type `%s' in class `%s'",
5029 lang_printable_name (found, 0), t,
5031 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
5035 DECL_NAME (found) = saved_found_wfl;
5039 /* 4- Inherited methods can't differ by their returned types */
5040 if (!(basetype_vec = TYPE_BINFO_BASETYPES (interface)))
5042 n = TREE_VEC_LENGTH (basetype_vec);
5043 for (i = 0; i < n; i++)
5045 tree sub_interface_method, sub_interface;
5046 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
5049 sub_interface = BINFO_TYPE (vec_elt);
5050 for (sub_interface_method = TYPE_METHODS (sub_interface);
5051 sub_interface_method;
5052 sub_interface_method = TREE_CHAIN (sub_interface_method))
5054 found = lookup_java_interface_method2 (interface,
5055 sub_interface_method);
5056 if (found && (found != sub_interface_method))
5058 tree saved_found_wfl = DECL_NAME (found);
5059 reset_method_name (found);
5061 (lookup_cl (sub_interface_method),
5062 "Interface `%s' inherits method `%s' from interface `%s'. "
5063 "This method is redefined with a different return type in "
5065 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
5066 lang_printable_name (found, 0),
5068 (DECL_NAME (TYPE_NAME
5069 (DECL_CONTEXT (sub_interface_method)))),
5071 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
5072 DECL_NAME (found) = saved_found_wfl;
5078 /* Lookup methods in interfaces using their name and partial
5079 signature. Return a matching method only if their types differ. */
5082 lookup_java_interface_method2 (class, method_decl)
5083 tree class, method_decl;
5086 tree basetype_vec = TYPE_BINFO_BASETYPES (class), to_return;
5091 n = TREE_VEC_LENGTH (basetype_vec);
5092 for (i = 0; i < n; i++)
5094 tree vec_elt = TREE_VEC_ELT (basetype_vec, i), to_return;
5095 if ((BINFO_TYPE (vec_elt) != object_type_node)
5097 lookup_java_method2 (BINFO_TYPE (vec_elt), method_decl, 1)))
5100 for (i = 0; i < n; i++)
5102 to_return = lookup_java_interface_method2
5103 (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)), method_decl);
5111 /* Lookup method using their name and partial signature. Return a
5112 matching method only if their types differ. */
5115 lookup_java_method2 (clas, method_decl, do_interface)
5116 tree clas, method_decl;
5119 tree method, method_signature, method_name, method_type, name;
5121 method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
5122 name = DECL_NAME (method_decl);
5123 method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
5124 EXPR_WFL_NODE (name) : name);
5125 method_type = TREE_TYPE (TREE_TYPE (method_decl));
5127 while (clas != NULL_TREE)
5129 for (method = TYPE_METHODS (clas);
5130 method != NULL_TREE; method = TREE_CHAIN (method))
5132 tree method_sig = build_java_argument_signature (TREE_TYPE (method));
5133 tree name = DECL_NAME (method);
5134 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
5135 EXPR_WFL_NODE (name) : name) == method_name
5136 && method_sig == method_signature
5137 && TREE_TYPE (TREE_TYPE (method)) != method_type)
5140 clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
5145 /* Return the line that matches DECL line number, and try its best to
5146 position the column number. Used during error reports. */
5152 static tree cl = NULL_TREE;
5158 if (cl == NULL_TREE)
5159 cl = build_expr_wfl (NULL_TREE, NULL, 0, 0);
5161 EXPR_WFL_FILENAME_NODE (cl) = get_identifier (DECL_SOURCE_FILE (decl));
5162 EXPR_WFL_SET_LINECOL (cl, DECL_SOURCE_LINE_FIRST (decl), -1);
5164 line = java_get_line_col (IDENTIFIER_POINTER (EXPR_WFL_FILENAME_NODE (cl)),
5165 EXPR_WFL_LINENO (cl), EXPR_WFL_COLNO (cl));
5167 found = strstr ((const char *)line,
5168 (const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
5170 EXPR_WFL_SET_LINECOL (cl, EXPR_WFL_LINENO (cl), found - line);
5175 /* Look for a simple name in the single-type import list */
5178 find_name_in_single_imports (name)
5183 for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
5184 if (TREE_VALUE (node) == name)
5185 return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
5190 /* Process all single-type import. */
5198 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
5200 tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
5202 /* Don't load twice something already defined. */
5203 if (IDENTIFIER_CLASS_VALUE (to_be_found))
5205 QUALIFIED_P (to_be_found) = 1;
5206 load_class (to_be_found, 0);
5208 check_pkg_class_access (to_be_found, TREE_PURPOSE (import));
5209 if (!IDENTIFIER_CLASS_VALUE (to_be_found))
5211 parse_error_context (TREE_PURPOSE (import),
5212 "Class or interface `%s' not found in import",
5213 IDENTIFIER_POINTER (to_be_found));
5222 /* Possibly find a class imported by a single-type import statement. Return
5223 1 if an error occured, 0 otherwise. */
5226 find_in_imports (class_type)
5231 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
5232 if (TREE_VALUE (import) == TYPE_NAME (class_type))
5234 TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
5235 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
5241 note_possible_classname (name, len)
5246 if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
5248 else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
5252 node = ident_subst (name, len, "", '/', '.', "");
5253 IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
5254 QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
5258 /* Read a import directory, gathering potential match for further type
5259 references. Indifferently reads a filesystem or a ZIP archive
5263 read_import_dir (wfl)
5266 tree package_id = EXPR_WFL_NODE (wfl);
5267 const char *package_name = IDENTIFIER_POINTER (package_id);
5268 int package_length = IDENTIFIER_LENGTH (package_id);
5270 JCF *saved_jcf = current_jcf;
5275 struct buffer filename[1];
5278 if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
5280 IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
5282 BUFFER_INIT (filename);
5283 buffer_grow (filename, package_length + 100);
5285 for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
5287 const char *entry_name = jcf_path_name (entry);
5288 int entry_length = strlen (entry_name);
5289 if (jcf_path_is_zipfile (entry))
5292 buffer_grow (filename, entry_length);
5293 memcpy (filename->data, entry_name, entry_length - 1);
5294 filename->data[entry_length-1] = '\0';
5295 zipf = opendir_in_zip (filename->data, jcf_path_is_system (entry));
5297 error ("malformed .zip archive in CLASSPATH: %s", entry_name);
5300 ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
5301 BUFFER_RESET (filename);
5302 for (k = 0; k < package_length; k++)
5304 char ch = package_name[k];
5305 *filename->ptr++ = ch == '.' ? '/' : ch;
5307 *filename->ptr++ = '/';
5309 for (k = 0; k < zipf->count; k++, zipd = ZIPDIR_NEXT (zipd))
5311 const char *current_entry = ZIPDIR_FILENAME (zipd);
5312 int current_entry_len = zipd->filename_length;
5314 if (current_entry_len >= BUFFER_LENGTH (filename)
5315 && strncmp (filename->data, current_entry,
5316 BUFFER_LENGTH (filename)) != 0)
5318 found |= note_possible_classname (current_entry,
5325 BUFFER_RESET (filename);
5326 buffer_grow (filename, entry_length + package_length + 4);
5327 strcpy (filename->data, entry_name);
5328 filename->ptr = filename->data + entry_length;
5329 for (k = 0; k < package_length; k++)
5331 char ch = package_name[k];
5332 *filename->ptr++ = ch == '.' ? '/' : ch;
5334 *filename->ptr = '\0';
5336 dirp = opendir (filename->data);
5339 *filename->ptr++ = '/';
5344 struct dirent *direntp = readdir (dirp);
5347 d_name = direntp->d_name;
5348 len = strlen (direntp->d_name);
5349 buffer_grow (filename, len+1);
5350 strcpy (filename->ptr, d_name);
5351 found |= note_possible_classname (filename->data + entry_length,
5352 package_length+len+1);
5359 free (filename->data);
5361 /* Here we should have a unified way of retrieving an entry, to be
5365 static int first = 1;
5368 error ("Can't find default package `%s'. Check "
5369 "the CLASSPATH environment variable and the access to the "
5370 "archives.", package_name);
5375 parse_error_context (wfl, "Package `%s' not found in import",
5377 current_jcf = saved_jcf;
5380 current_jcf = saved_jcf;
5383 /* Possibly find a type in the import on demands specified
5384 types. Returns 1 if an error occured, 0 otherwise. Run throught the
5385 entire list, to detected potential double definitions. */
5388 find_in_imports_on_demand (class_type)
5391 tree node, import, node_to_use = NULL_TREE;
5393 tree cl = NULL_TREE;
5395 for (import = ctxp->import_demand_list; import; import = TREE_CHAIN (import))
5397 const char *id_name;
5398 obstack_grow (&temporary_obstack,
5399 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
5400 IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
5401 obstack_1grow (&temporary_obstack, '.');
5402 obstack_grow0 (&temporary_obstack,
5403 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
5404 IDENTIFIER_LENGTH (TYPE_NAME (class_type)));
5405 id_name = obstack_finish (&temporary_obstack);
5407 node = maybe_get_identifier (id_name);
5408 if (node && IS_A_CLASSFILE_NAME (node))
5412 cl = TREE_PURPOSE (import);
5420 (import, "Type `%s' also potentially defined in package `%s'",
5421 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
5422 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))));
5429 /* Setup lineno so that it refers to the line of the import (in
5430 case we parse a class file and encounter errors */
5432 int saved_lineno = lineno;
5433 lineno = EXPR_WFL_LINENO (cl);
5434 TYPE_NAME (class_type) = node_to_use;
5435 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
5436 decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5437 /* If there is no DECL set for the class or if the class isn't
5438 loaded and not seen in source yet, the load */
5439 if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl))
5440 && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl))))
5441 load_class (node_to_use, 0);
5442 lineno = saved_lineno;
5443 return check_pkg_class_access (TYPE_NAME (class_type), cl);
5446 return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
5450 resolve_package (pkg, next)
5454 tree type_name = NULL_TREE;
5455 const char *name = IDENTIFIER_POINTER (EXPR_WFL_NODE (pkg));
5457 /* The trick is to determine when the package name stops and were
5458 the name of something contained in the package starts. Then we
5459 return a fully qualified name of what we want to get. */
5461 /* Do a quick search on well known package names */
5462 if (!strncmp (name, "java.lang.reflect", 17))
5465 TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (EXPR_WFL_QUALIFICATION (pkg))));
5466 type_name = lookup_package_type (name, 17);
5468 else if (!strncmp (name, "java.lang", 9))
5470 *next = TREE_CHAIN (TREE_CHAIN (EXPR_WFL_QUALIFICATION (pkg)));
5471 type_name = lookup_package_type (name, 9);
5474 /* If we found something here, return */
5478 *next = EXPR_WFL_QUALIFICATION (pkg);
5480 /* Try the current package. */
5481 if (ctxp->package && !strncmp (name, IDENTIFIER_POINTER (ctxp->package),
5482 IDENTIFIER_LENGTH (ctxp->package)))
5485 lookup_package_type_and_set_next (name,
5486 IDENTIFIER_LENGTH (ctxp->package),
5492 /* Search in imported package */
5493 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
5495 tree current_pkg_name = EXPR_WFL_NODE (TREE_PURPOSE (current));
5496 int len = IDENTIFIER_LENGTH (current_pkg_name);
5497 if (!strncmp (name, IDENTIFIER_POINTER (current_pkg_name), len))
5501 breakdown_qualified (&left, &dummy, current_pkg_name);
5502 len = IDENTIFIER_LENGTH (left);
5503 type_name = lookup_package_type_and_set_next (name, len, next);
5513 lookup_package_type_and_set_next (name, len, next)
5519 tree type_name = lookup_package_type (name, len);
5524 ptr = IDENTIFIER_POINTER (type_name);
5525 while (ptr && (ptr = strchr (ptr, '.')))
5527 *next = TREE_CHAIN (*next);
5534 lookup_package_type (name, from)
5539 const char *sub = &name[from+1];
5540 while (*sub != '.' && *sub)
5542 strncpy (subname, name, sub-name);
5543 subname [sub-name] = '\0';
5544 return get_identifier (subname);
5547 /* Check that CLASS_NAME refers to a PUBLIC class. Return 0 if no
5548 access violations were found, 1 otherwise. */
5551 check_pkg_class_access (class_name, cl)
5557 if (!QUALIFIED_P (class_name) || !IDENTIFIER_CLASS_VALUE (class_name))
5560 if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
5563 if (!CLASS_PUBLIC (TYPE_NAME (type)))
5565 /* Access to a private class within the same package is
5568 breakdown_qualified (&l, &r, class_name);
5569 if (l == ctxp->package)
5573 (cl, "Can't access %s `%s'. Only public classes and interfaces in "
5574 "other packages can be accessed",
5575 (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
5576 IDENTIFIER_POINTER (class_name));
5582 /* Local variable declaration. */
5585 declare_local_variables (modifier, type, vlist)
5590 tree decl, current, saved_type;
5591 tree type_wfl = NULL_TREE;
5594 /* Push a new block if statements were seen between the last time we
5595 pushed a block and now. Keep a cound of block to close */
5596 if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
5598 tree body = GET_CURRENT_BLOCK (current_function_decl);
5599 tree b = enter_block ();
5600 BLOCK_EXPR_ORIGIN (b) = body;
5606 for (i = 0; i <= 10; i++) if (1 << i & modifier) break;
5607 if (modifier == ACC_FINAL)
5609 if (flag_static_local_jdk1_1)
5610 parse_warning_context (ctxp->modifier_ctx [i],
5611 "Unsupported JDK1.1 `final' local variable "
5612 "(treated as non final)");
5617 (ctxp->modifier_ctx [i],
5618 "Only `final' is allowed as a local variables modifier");
5623 /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
5624 hold the TYPE value if a new incomplete has to be created (as
5625 opposed to being found already existing and reused). */
5626 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
5628 /* If TYPE is fully resolved and we don't have a reference, make one */
5629 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
5631 /* Go through all the declared variables */
5632 for (current = vlist, saved_type = type; current;
5633 current = TREE_CHAIN (current), type = saved_type)
5635 tree other, real_type;
5636 tree wfl = TREE_PURPOSE (current);
5637 tree name = EXPR_WFL_NODE (wfl);
5638 tree init = TREE_VALUE (current);
5640 /* Process NAME, as it may specify extra dimension(s) for it */
5641 type = build_array_from_name (type, type_wfl, name, &name);
5643 /* Variable redefinition check */
5644 if ((other = lookup_name_in_blocks (name)))
5646 variable_redefinition_error (wfl, name, TREE_TYPE (other),
5647 DECL_SOURCE_LINE (other));
5651 /* Type adjustment. We may have just readjusted TYPE because
5652 the variable specified more dimensions. Make sure we have
5653 a reference if we can and don't have one already. */
5654 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
5656 real_type = GET_REAL_TYPE (type);
5657 /* Never layout this decl. This will be done when its scope
5659 decl = build_decl (VAR_DECL, name, real_type);
5660 BLOCK_CHAIN_DECL (decl);
5662 /* If doing xreferencing, replace the line number with the WFL
5665 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
5667 /* Don't try to use an INIT statement when an error was found */
5668 if (init && java_error_count)
5671 /* Add the initialization function to the current function's code */
5674 /* Name might have been readjusted */
5675 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
5676 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
5677 java_method_add_stmt (current_function_decl,
5678 build_debugable_stmt (EXPR_WFL_LINECOL (init),
5682 /* Setup dependency the type of the decl */
5686 register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
5687 dep = CLASSD_LAST (ctxp->classd_list);
5688 JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
5691 SOURCE_FRONTEND_DEBUG (("Defined locals"));
5694 /* Called during parsing. Build decls from argument list. */
5697 source_start_java_method (fndecl)
5707 current_function_decl = fndecl;
5709 /* New scope for the function */
5711 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
5712 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
5714 tree type = TREE_VALUE (tem);
5715 tree name = TREE_PURPOSE (tem);
5717 /* If type is incomplete. Create an incomplete decl and ask for
5718 the decl to be patched later */
5719 if (INCOMPLETE_TYPE_P (type))
5722 tree real_type = GET_REAL_TYPE (type);
5723 parm_decl = build_decl (PARM_DECL, name, real_type);
5724 type = obtain_incomplete_type (type);
5725 register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
5726 jdep = CLASSD_LAST (ctxp->classd_list);
5727 JDEP_MISC (jdep) = name;
5728 JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
5731 parm_decl = build_decl (PARM_DECL, name, type);
5733 BLOCK_CHAIN_DECL (parm_decl);
5735 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
5736 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
5738 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
5741 /* Called during parsing. Creates an artificial method declaration. */
5744 create_artificial_method (class, flags, type, name, args)
5747 tree type, name, args;
5749 int saved_lineno = lineno;
5753 mdecl = make_node (FUNCTION_TYPE);
5754 TREE_TYPE (mdecl) = type;
5755 TYPE_ARG_TYPES (mdecl) = args;
5756 mdecl = add_method (class, flags, name, build_java_signature (mdecl));
5757 lineno = saved_lineno;
5758 DECL_ARTIFICIAL (mdecl) = 1;
5762 /* Starts the body if an artifical method. */
5765 start_artificial_method_body (mdecl)
5768 DECL_SOURCE_LINE (mdecl) = 1;
5769 DECL_SOURCE_LINE_MERGE (mdecl, 1);
5770 source_start_java_method (mdecl);
5775 end_artificial_method_body (mdecl)
5778 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = exit_block ();
5782 /* Called during expansion. Push decls formerly built from argument
5783 list so they're usable during expansion. */
5786 expand_start_java_method (fndecl)
5791 current_function_decl = fndecl;
5793 announce_function (fndecl);
5794 pushlevel (1); /* Push parameters */
5795 ptr = &DECL_ARGUMENTS (fndecl);
5796 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
5799 tree next = TREE_CHAIN (tem);
5800 tree type = TREE_TYPE (tem);
5801 if (PROMOTE_PROTOTYPES
5802 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
5803 && INTEGRAL_TYPE_P (type))
5804 type = integer_type_node;
5805 DECL_ARG_TYPE (tem) = type;
5806 layout_decl (tem, 0);
5809 ptr = &TREE_CHAIN (tem);
5813 pushdecl_force_head (DECL_ARGUMENTS (fndecl));
5814 lineno = DECL_SOURCE_LINE_FIRST (fndecl);
5817 /* Terminate a function and expand its body. */
5820 source_end_java_method ()
5822 tree fndecl = current_function_decl;
5823 int flag_asynchronous_exceptions = asynchronous_exceptions;
5828 java_parser_context_save_global ();
5829 lineno = ctxp->last_ccb_indent1;
5831 /* Set EH language codes */
5832 java_set_exception_lang_code ();
5834 /* Turn function bodies with only a NOP expr null, so they don't get
5835 generated at all and we won't get warnings when using the -W
5837 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) == empty_stmt_node)
5838 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
5840 /* Generate function's code */
5841 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))
5842 && ! flag_emit_class_files
5843 && ! flag_emit_xref)
5844 expand_expr_stmt (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)));
5846 /* pop out of its parameters */
5847 pushdecl_force_head (DECL_ARGUMENTS (fndecl));
5849 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5851 /* Generate rtl for function exit. */
5852 if (! flag_emit_class_files && ! flag_emit_xref)
5854 lineno = DECL_SOURCE_LINE_LAST (fndecl);
5855 /* Emit catch-finally clauses */
5857 expand_function_end (input_filename, lineno, 0);
5859 /* FIXME: If the current method contains any exception handlers,
5860 force asynchronous_exceptions: this is necessary because signal
5861 handlers in libjava may throw exceptions. This is far from being
5862 a perfect solution, but it's better than doing nothing at all.*/
5864 asynchronous_exceptions = 1;
5866 /* Run the optimizers and output assembler code for this function. */
5867 rest_of_compilation (fndecl);
5870 current_function_decl = NULL_TREE;
5871 permanent_allocation (1);
5872 java_parser_context_restore_global ();
5873 asynchronous_exceptions = flag_asynchronous_exceptions;
5876 /* Record EXPR in the current function block. Complements compound
5877 expression second operand if necessary. */
5880 java_method_add_stmt (fndecl, expr)
5883 if (!GET_CURRENT_BLOCK (fndecl))
5885 return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
5889 add_stmt_to_block (b, type, stmt)
5892 tree body = BLOCK_EXPR_BODY (b), c;
5894 if (java_error_count)
5897 if ((c = add_stmt_to_compound (body, type, stmt)) == body)
5900 BLOCK_EXPR_BODY (b) = c;
5901 TREE_SIDE_EFFECTS (c) = 1;
5905 /* Add STMT to EXISTING if possible, otherwise create a new
5906 COMPOUND_EXPR and add STMT to it. */
5909 add_stmt_to_compound (existing, type, stmt)
5910 tree existing, type, stmt;
5913 return build (COMPOUND_EXPR, type, existing, stmt);
5918 /* Hold THIS for the scope of the current public method decl. */
5919 static tree current_this;
5921 void java_layout_seen_class_methods ()
5923 tree previous_list = all_class_list;
5924 tree end = NULL_TREE;
5929 for (current = previous_list;
5930 current != end; current = TREE_CHAIN (current))
5931 layout_class_methods (TREE_TYPE (TREE_VALUE (current)));
5933 if (previous_list != all_class_list)
5935 end = previous_list;
5936 previous_list = all_class_list;
5943 /* Layout the methods of all classes loaded in one way on an
5944 other. Check methods of source parsed classes. Then reorder the
5945 fields and layout the classes or the type of all source parsed
5949 java_layout_classes ()
5952 int save_error_count = java_error_count;
5954 /* Layout the methods of all classes seen so far */
5955 java_layout_seen_class_methods ();
5956 java_parse_abort_on_error ();
5957 all_class_list = NULL_TREE;
5959 /* Then check the methods of all parsed classes */
5960 for (current = ctxp->gclass_list; current; current = TREE_CHAIN (current))
5961 if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
5962 CHECK_METHODS (TREE_VALUE (current));
5963 java_parse_abort_on_error ();
5965 for (current = ctxp->gclass_list; current; current = TREE_CHAIN (current))
5967 current_class = TREE_TYPE (TREE_VALUE (current));
5969 /* Reverse the fields, but leave the dummy field in front.
5970 Fields are already ordered for Object and Class */
5971 if (TYPE_FIELDS (current_class) && current_class != object_type_node
5972 && current_class != class_type_node)
5974 /* If the dummy field is there, reverse the right fields and
5975 just layout the type for proper fields offset */
5976 if (!DECL_NAME (TYPE_FIELDS (current_class)))
5978 tree fields = TYPE_FIELDS (current_class);
5979 TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
5980 TYPE_SIZE (current_class) = NULL_TREE;
5981 layout_type (current_class);
5983 /* We don't have a dummy field, we need to layout the class,
5984 after having reversed the fields */
5987 TYPE_FIELDS (current_class) =
5988 nreverse (TYPE_FIELDS (current_class));
5989 TYPE_SIZE (current_class) = NULL_TREE;
5990 layout_class (current_class);
5994 layout_class (current_class);
5996 /* From now on, the class is considered completely loaded */
5997 CLASS_LOADED_P (current_class) = 1;
5999 /* Error reported by the caller */
6000 if (java_error_count)
6004 /* We might have reloaded classes durign the process of laying out
6005 classes for code generation. We must layout the methods of those
6006 late additions, as constructor checks might use them */
6007 java_layout_seen_class_methods ();
6008 java_parse_abort_on_error ();
6011 /* Expand all methods in all registered classes. */
6014 java_complete_expand_methods ()
6018 do_not_fold = flag_emit_xref;
6020 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
6023 tree class_type = CLASS_TO_HANDLE_TYPE (TREE_TYPE (current));
6024 tree decl, prev_decl;
6026 current_class = TREE_TYPE (current);
6027 is_interface = CLASS_INTERFACE (TYPE_NAME (current_class));
6029 /* Initialize a new constant pool */
6030 init_outgoing_cpool ();
6032 /* We want <clinit> (if any) to be processed first. */
6033 for (prev_decl = NULL_TREE, decl = TYPE_METHODS (class_type);
6034 decl; prev_decl= decl, decl = TREE_CHAIN (decl))
6035 if (IS_CLINIT (decl))
6037 if (!java_pre_expand_clinit (decl))
6040 TREE_CHAIN (prev_decl) = TREE_CHAIN (decl);
6042 TYPE_METHODS (class_type) = TREE_CHAIN (decl);
6047 /* Now go on for regular business. */
6048 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
6050 current_function_decl = decl;
6051 /* Don't generate debug info on line zero when expanding a
6052 generated constructor. */
6053 if (DECL_CONSTRUCTOR_P (decl) && !DECL_FUNCTION_BODY (decl))
6055 /* If we found errors, it's too dangerous to try to
6056 generate and expand a constructor */
6057 if (!java_error_count)
6059 restore_line_number_status (1);
6060 java_complete_expand_method (decl);
6061 restore_line_number_status (0);
6064 else if (METHOD_ABSTRACT (decl) || METHOD_NATIVE (decl))
6067 java_complete_expand_method (decl);
6070 /* Now verify constructor circularity (stop after the first one
6073 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
6074 if (DECL_CONSTRUCTOR_P (decl) &&
6075 verify_constructor_circularity (decl, decl))
6078 /* Make the class data, register it and run the rest of decl
6079 compilation on it */
6080 if (!java_error_count)
6082 if (flag_emit_class_files)
6083 write_classfile (current_class);
6085 expand_xref (current_class);
6086 else if (! flag_syntax_only)
6092 /* Hold a list of catch clauses list. The first element of this list is
6093 the list of the catch clauses of the currently analysed try block. */
6094 static tree currently_caught_type_list;
6096 /* Complete and expand <clinit>. Return a non zero value if <clinit>
6097 is worth keeping. */
6100 java_pre_expand_clinit (decl)
6103 tree fbody = DECL_FUNCTION_BODY (decl);
6107 if (fbody != NULL_TREE)
6109 /* First check if we can ignore empty <clinit> */
6110 tree block_body = BLOCK_EXPR_BODY (fbody);
6112 current_this = NULL_TREE;
6113 current_function_decl = decl;
6114 if (block_body != NULL_TREE)
6116 /* Prevent the use of `this' inside <clinit> */
6117 ctxp->explicit_constructor_p = 1;
6118 block_body = java_complete_tree (block_body);
6119 ctxp->explicit_constructor_p = 0;
6121 BLOCK_EXPR_BODY (fbody) = block_body;
6122 if (block_body != NULL_TREE && TREE_CODE (block_body) == BLOCK
6123 && BLOCK_EXPR_BODY (block_body) == empty_stmt_node)
6130 /* Complete and expand a method. */
6133 java_complete_expand_method (mdecl)
6136 /* Fix constructors before expanding them */
6137 if (DECL_CONSTRUCTOR_P (mdecl))
6138 fix_constructors (mdecl);
6140 /* Expand functions that have a body */
6141 if (DECL_FUNCTION_BODY (mdecl))
6143 tree fbody = DECL_FUNCTION_BODY (mdecl);
6144 tree block_body = BLOCK_EXPR_BODY (fbody);
6145 tree exception_copy = NULL_TREE;
6146 expand_start_java_method (mdecl);
6147 build_result_decl (mdecl);
6150 = (!METHOD_STATIC (mdecl) ?
6151 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
6153 /* Purge the `throws' list of unchecked exceptions. If we're
6154 doing xref, save a copy of the list and re-install it
6157 exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl));
6159 purge_unchecked_exceptions (mdecl);
6161 /* Install exceptions thrown with `throws' */
6162 PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
6164 if (block_body != NULL_TREE)
6166 block_body = java_complete_tree (block_body);
6167 if (!flag_emit_xref)
6168 check_for_initialization (block_body);
6169 ctxp->explicit_constructor_p = 0;
6171 BLOCK_EXPR_BODY (fbody) = block_body;
6173 if ((block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
6174 && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE
6176 missing_return_error (current_function_decl);
6178 complete_start_java_method (mdecl);
6180 /* Don't go any further if we've found error(s) during the
6182 if (!java_error_count)
6183 source_end_java_method ();
6186 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
6190 /* Pop the exceptions and sanity check */
6192 if (currently_caught_type_list)
6193 fatal ("Exception list non empty - java_complete_expand_method");
6196 DECL_FUNCTION_THROWS (mdecl) = exception_copy;
6200 /* Craft a body for default constructor. Patch existing constructor
6201 bodies with call to super() and field initialization statements if
6205 fix_constructors (mdecl)
6208 tree body = DECL_FUNCTION_BODY (mdecl);
6212 /* The constructor body must be crafted by hand. It's the
6213 constructor we defined when we realize we didn't have the
6214 CLASSNAME() constructor */
6218 /* It is an error for the compiler to generate a default
6219 constructor if the superclass doesn't have a constructor that
6220 takes no argument */
6221 if (verify_constructor_super ())
6223 tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (current_class));
6224 const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
6225 parse_error_context (lookup_cl (TYPE_NAME (current_class)),
6226 "No constructor matching `%s()' found in "
6227 "class `%s'", n, n);
6230 start_artificial_method_body (mdecl);
6232 /* We don't generate a super constructor invocation if we're
6233 compiling java.lang.Object. build_super_invocation takes care
6235 compound = java_method_add_stmt (mdecl, build_super_invocation (mdecl));
6237 end_artificial_method_body (mdecl);
6239 /* Search for an explicit constructor invocation */
6243 tree main_block = BLOCK_EXPR_BODY (body);
6244 tree compound = NULL_TREE;
6247 switch (TREE_CODE (body))
6250 found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
6254 case EXPR_WITH_FILE_LOCATION:
6255 body = TREE_OPERAND (body, 0);
6258 body = BLOCK_EXPR_BODY (body);
6264 /* The constructor is missing an invocation of super() */
6266 compound = add_stmt_to_compound (compound, NULL_TREE,
6267 build_super_invocation (mdecl));
6269 /* Fix the constructor main block if we're adding extra stmts */
6272 compound = add_stmt_to_compound (compound, NULL_TREE,
6273 BLOCK_EXPR_BODY (main_block));
6274 BLOCK_EXPR_BODY (main_block) = compound;
6279 /* Browse constructors in the super class, searching for a constructor
6280 that doesn't take any argument. Return 0 if one is found, 1
6284 verify_constructor_super ()
6286 tree class = CLASSTYPE_SUPER (current_class);
6293 for (mdecl = TYPE_METHODS (class); mdecl; mdecl = TREE_CHAIN (mdecl))
6295 if (DECL_CONSTRUCTOR_P (mdecl)
6296 && TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (mdecl)))
6304 /* Expand finals. */
6307 java_expand_finals ()
6311 /* Generate code for all context remembered for code generation. */
6314 java_expand_classes ()
6316 int save_error_count = 0;
6317 java_parse_abort_on_error ();
6318 if (!(ctxp = ctxp_for_generation))
6320 java_layout_classes ();
6321 java_parse_abort_on_error ();
6323 for (; ctxp_for_generation; ctxp_for_generation = ctxp_for_generation->next)
6325 ctxp = ctxp_for_generation;
6326 lang_init_source (2); /* Error msgs have method prototypes */
6327 java_complete_expand_methods (); /* Complete and expand method bodies */
6328 java_parse_abort_on_error ();
6329 java_expand_finals (); /* Expand and check the finals */
6330 java_parse_abort_on_error ();
6331 java_check_final (); /* Check unitialized final */
6332 java_parse_abort_on_error ();
6336 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
6337 a tree list node containing RIGHT. Fore coming RIGHTs will be
6338 chained to this hook. LOCATION contains the location of the
6339 separating `.' operator. */
6342 make_qualified_primary (primary, right, location)
6343 tree primary, right;
6348 /* We want to process THIS . xxx symbolicaly, to keep it consistent
6349 with the way we're processing SUPER. A THIS from a primary as a
6350 different form than a SUPER. Turn THIS into something symbolic */
6351 if (TREE_CODE (primary) == THIS_EXPR)
6353 wfl = build_wfl_node (this_identifier_node);
6354 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (primary);
6355 wfl = make_qualified_name (wfl, right, location);
6356 PRIMARY_P (wfl) = 1;
6359 /* Other non WFL node are wrapped around a WFL */
6360 else if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
6362 wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
6363 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (primary);
6364 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (primary, NULL_TREE);
6369 if (!EXPR_WFL_QUALIFICATION (primary))
6370 EXPR_WFL_QUALIFICATION (primary) =
6371 build_tree_list (primary, NULL_TREE);
6374 EXPR_WFL_LINECOL (right) = location;
6375 chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
6376 PRIMARY_P (wfl) = 1;
6380 /* Simple merge of two name separated by a `.' */
6383 merge_qualified_name (left, right)
6387 obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
6388 IDENTIFIER_LENGTH (left));
6389 obstack_1grow (&temporary_obstack, '.');
6390 obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
6391 IDENTIFIER_LENGTH (right));
6392 node = get_identifier (obstack_base (&temporary_obstack));
6393 obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
6394 QUALIFIED_P (node) = 1;
6398 /* Merge the two parts of a qualified name into LEFT. Set the
6399 location information of the resulting node to LOCATION, usually
6400 inherited from the location information of the `.' operator. */
6403 make_qualified_name (left, right, location)
6407 #ifdef USE_COMPONENT_REF
6408 tree node = build (COMPONENT_REF, NULL_TREE, left, right);
6409 EXPR_WFL_LINECOL (node) = location;
6412 tree left_id = EXPR_WFL_NODE (left);
6413 tree right_id = EXPR_WFL_NODE (right);
6416 merge = merge_qualified_name (left_id, right_id);
6418 /* Left wasn't qualified and is now qualified */
6419 if (!QUALIFIED_P (left_id))
6421 tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
6422 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
6423 EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
6426 wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
6427 EXPR_WFL_LINECOL (wfl) = location;
6428 chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
6430 EXPR_WFL_NODE (left) = merge;
6435 /* Extract the last identifier component of the qualified in WFL. The
6436 last identifier is removed from the linked list */
6439 cut_identifier_in_qualified (wfl)
6443 tree previous = NULL_TREE;
6444 for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
6445 if (!TREE_CHAIN (q))
6448 fatal ("Operating on a non qualified qualified WFL - "
6449 "cut_identifier_in_qualified");
6450 TREE_CHAIN (previous) = NULL_TREE;
6451 return TREE_PURPOSE (q);
6455 /* Resolve the expression name NAME. Return its decl. */
6458 resolve_expression_name (id, orig)
6462 tree name = EXPR_WFL_NODE (id);
6465 /* 6.5.5.1: Simple expression names */
6466 if (!PRIMARY_P (id) && !QUALIFIED_P (name))
6468 /* 15.13.1: NAME can appear within the scope of a local variable
6470 if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
6473 /* 15.13.1: NAME can appear within a class declaration */
6476 decl = lookup_field_wrapper (current_class, name);
6479 int fs = FIELD_STATIC (decl);
6480 /* Instance variable (8.3.1.1) can't appear within
6481 static method, static initializer or initializer for
6482 a static variable. */
6483 if (!fs && METHOD_STATIC (current_function_decl))
6485 static_ref_err (id, name, current_class);
6486 return error_mark_node;
6488 /* Instance variables can't appear as an argument of
6489 an explicit constructor invocation */
6490 if (!fs && ctxp->explicit_constructor_p)
6493 (id, "Can't reference `%s' before the superclass "
6494 "constructor has been called", IDENTIFIER_POINTER (name));
6495 return error_mark_node;
6498 /* Otherwise build what it takes to access the field */
6499 decl = build_field_ref ((fs ? NULL_TREE : current_this),
6500 DECL_CONTEXT (decl), name);
6501 if (fs && !flag_emit_class_files && !flag_emit_xref)
6502 decl = build_class_init (DECL_CONTEXT (decl), decl);
6503 /* We may be asked to save the real field access node */
6506 /* And we return what we got */
6509 /* Fall down to error report on undefined variable */
6512 /* 6.5.5.2 Qualified Expression Names */
6517 qualify_ambiguous_name (id);
6518 /* 15.10.1 Field Access Using a Primary and/or Expression Name */
6519 /* 15.10.2: Accessing Superclass Members using super */
6520 return resolve_field_access (id, NULL, NULL);
6523 /* We've got an error here */
6524 parse_error_context (id, "Undefined variable `%s'",
6525 IDENTIFIER_POINTER (name));
6527 return error_mark_node;
6531 static_ref_err (wfl, field_id, class_type)
6532 tree wfl, field_id, class_type;
6536 "Can't make a static reference to nonstatic variable `%s' in class `%s'",
6537 IDENTIFIER_POINTER (field_id),
6538 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
6541 /* 15.10.1 Field Acess Using a Primary and/or Expression Name.
6542 We return something suitable to generate the field access. We also
6543 return the field decl in FIELD_DECL and its type in FIELD_TYPE. If
6544 recipient's address can be null. */
6547 resolve_field_access (qual_wfl, field_decl, field_type)
6549 tree *field_decl, *field_type;
6553 tree decl, where_found, type_found;
6555 if (resolve_qualified_expression_name (qual_wfl, &decl,
6556 &where_found, &type_found))
6557 return error_mark_node;
6559 /* Resolve the LENGTH field of an array here */
6560 if (DECL_NAME (decl) == length_identifier_node && TYPE_ARRAY_P (type_found)
6561 && ! flag_emit_class_files && ! flag_emit_xref)
6563 tree length = build_java_array_length_access (where_found);
6565 build_java_arraynull_check (type_found, length, int_type_node);
6567 /* We might have been trying to resolve field.method(). In which
6568 case, the resolution is over and decl is the answer */
6569 else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
6571 else if (JDECL_P (decl))
6573 int static_final_found = 0;
6575 type_found = DECL_CONTEXT (decl);
6576 is_static = JDECL_P (decl) && FIELD_STATIC (decl);
6577 if (FIELD_FINAL (decl)
6578 && JPRIMITIVE_TYPE_P (TREE_TYPE (decl))
6579 && DECL_LANG_SPECIFIC (decl)
6580 && DECL_INITIAL (decl))
6582 field_ref = DECL_INITIAL (decl);
6583 static_final_found = 1;
6586 field_ref = build_field_ref ((is_static && !flag_emit_xref?
6587 NULL_TREE : where_found),
6588 type_found, DECL_NAME (decl));
6589 if (field_ref == error_mark_node)
6590 return error_mark_node;
6591 if (is_static && !static_final_found
6592 && !flag_emit_class_files && !flag_emit_xref)
6594 field_ref = build_class_init (type_found, field_ref);
6595 /* If the static field was identified by an expression that
6596 needs to be generated, make the field access a compound
6597 expression whose first part is the evaluation of the
6598 field selector part. */
6599 if (where_found && TREE_CODE (where_found) != TYPE_DECL
6600 && TREE_CODE (where_found) != RECORD_TYPE)
6602 tree type = QUAL_DECL_TYPE (field_ref);
6603 if (TREE_CODE (type) == RECORD_TYPE)
6604 type = build_pointer_type (type);
6605 field_ref = build (COMPOUND_EXPR, type, where_found, field_ref);
6615 *field_type = (QUAL_DECL_TYPE (decl) ?
6616 QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
6620 /* If NODE is an access to f static field, strip out the class
6621 initialization part and return the field decl, otherwise, return
6625 strip_out_static_field_access_decl (node)
6628 if (TREE_CODE (node) == COMPOUND_EXPR)
6630 tree op1 = TREE_OPERAND (node, 1);
6631 if (TREE_CODE (op1) == COMPOUND_EXPR)
6633 tree call = TREE_OPERAND (op1, 0);
6634 if (TREE_CODE (call) == CALL_EXPR
6635 && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
6636 && TREE_OPERAND (TREE_OPERAND (call, 0), 0)
6637 == soft_initclass_node)
6638 return TREE_OPERAND (op1, 1);
6640 else if (JDECL_P (op1))
6646 /* 6.5.5.2: Qualified Expression Names */
6649 resolve_qualified_expression_name (wfl, found_decl, where_found, type_found)
6651 tree *found_decl, *type_found, *where_found;
6653 int from_type = 0; /* Field search initiated from a type */
6654 int from_super = 0, from_cast = 0;
6655 int previous_call_static = 0;
6657 tree decl = NULL_TREE, type = NULL_TREE, q;
6658 *type_found = *where_found = NULL_TREE;
6660 for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
6662 tree qual_wfl = QUAL_WFL (q);
6663 tree ret_decl; /* for EH checking */
6664 int location; /* for EH checking */
6666 /* 15.10.1 Field Access Using a Primary */
6667 switch (TREE_CODE (qual_wfl))
6670 case NEW_CLASS_EXPR:
6671 /* If the access to the function call is a non static field,
6672 build the code to access it. */
6673 if (JDECL_P (decl) && !FIELD_STATIC (decl))
6675 decl = maybe_access_field (decl, *where_found,
6676 DECL_CONTEXT (decl));
6677 if (decl == error_mark_node)
6680 /* And code for the function call */
6681 if (complete_function_arguments (qual_wfl))
6684 if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
6685 CALL_USING_SUPER (qual_wfl) = 1;
6686 location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
6687 EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
6688 *where_found = patch_method_invocation (qual_wfl, decl, type,
6689 &is_static, &ret_decl);
6690 if (*where_found == error_mark_node)
6692 *type_found = type = QUAL_DECL_TYPE (*where_found);
6696 check_thrown_exceptions (location, ret_decl);
6698 /* If the previous call was static and this one is too,
6699 build a compound expression to hold the two (because in
6700 that case, previous function calls aren't transported as
6701 forcoming function's argument. */
6702 if (previous_call_static && is_static)
6704 decl = build (COMPOUND_EXPR, type, decl, *where_found);
6705 TREE_SIDE_EFFECTS (decl) = 1;
6709 previous_call_static = is_static;
6710 decl = *where_found;
6714 case NEW_ARRAY_EXPR:
6715 *where_found = decl = java_complete_tree (qual_wfl);
6716 if (decl == error_mark_node)
6718 *type_found = type = QUAL_DECL_TYPE (decl);
6719 CLASS_LOADED_P (type) = 1;
6723 *where_found = decl = java_complete_tree (qual_wfl);
6724 if (decl == error_mark_node)
6726 *type_found = type = QUAL_DECL_TYPE (decl);
6730 case CONDITIONAL_EXPR:
6733 *where_found = decl = java_complete_tree (qual_wfl);
6734 if (decl == error_mark_node)
6736 *type_found = type = QUAL_DECL_TYPE (decl);
6740 /* If the access to the function call is a non static field,
6741 build the code to access it. */
6742 if (JDECL_P (decl) && !FIELD_STATIC (decl))
6744 decl = maybe_access_field (decl, *where_found, type);
6745 if (decl == error_mark_node)
6748 /* And code for the array reference expression */
6749 decl = java_complete_tree (qual_wfl);
6750 if (decl == error_mark_node)
6752 type = QUAL_DECL_TYPE (decl);
6756 if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
6758 if ((type = patch_string (decl)))
6760 *where_found = QUAL_RESOLUTION (q) = decl;
6761 *type_found = type = TREE_TYPE (decl);
6765 /* Fix for -Wall Just go to the next statement. Don't
6770 /* If we fall here, we weren't processing a (static) function call. */
6771 previous_call_static = 0;
6773 /* It can be the keyword THIS */
6774 if (EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
6779 (wfl, "Keyword `this' used outside allowed context");
6782 if (ctxp->explicit_constructor_p)
6784 parse_error_context (wfl, "Can't reference `this' before the "
6785 "superclass constructor has been called");
6788 /* We have to generate code for intermediate acess */
6789 *where_found = decl = current_this;
6790 *type_found = type = QUAL_DECL_TYPE (decl);
6794 /* 15.10.2 Accessing Superclass Members using SUPER */
6795 if (EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
6798 /* Check on the restricted use of SUPER */
6799 if (METHOD_STATIC (current_function_decl)
6800 || current_class == object_type_node)
6803 (wfl, "Keyword `super' used outside allowed context");
6806 /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
6807 node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
6808 CLASSTYPE_SUPER (current_class),
6809 build_this (EXPR_WFL_LINECOL (qual_wfl)));
6810 *where_found = decl = java_complete_tree (node);
6811 if (decl == error_mark_node)
6813 *type_found = type = QUAL_DECL_TYPE (decl);
6814 from_super = from_type = 1;
6818 /* 15.13.1: Can't search for field name in packages, so we
6819 assume a variable/class name was meant. */
6820 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
6822 tree name = resolve_package (wfl, &q);
6825 *where_found = decl = resolve_no_layout (name, qual_wfl);
6826 /* We wan't to be absolutely that the class is laid
6827 out. We're going to search something inside it. */
6828 *type_found = type = TREE_TYPE (decl);
6829 layout_class (type);
6831 /* Should be a list, really. FIXME */
6832 RESOLVE_EXPRESSION_NAME_P (QUAL_WFL (TREE_CHAIN (q))) = 1;
6833 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (TREE_CHAIN (q))) = 0;
6837 if (from_super || from_cast)
6839 ((from_cast ? qual_wfl : wfl),
6840 "No variable `%s' defined in class `%s'",
6841 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
6842 lang_printable_name (type, 0));
6845 (qual_wfl, "Undefined variable or class name: `%s'",
6846 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)));
6851 /* We have a type name. It's been already resolved when the
6852 expression was qualified. */
6853 else if (RESOLVE_TYPE_NAME_P (qual_wfl))
6855 if (!(decl = QUAL_RESOLUTION (q)))
6856 return 1; /* Error reported already */
6858 if (not_accessible_p (TREE_TYPE (decl), decl, 0))
6861 (qual_wfl, "Can't access %s field `%s.%s' from `%s'",
6862 java_accstring_lookup (get_access_flags_from_decl (decl)),
6863 GET_TYPE_NAME (type),
6864 IDENTIFIER_POINTER (DECL_NAME (decl)),
6865 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
6868 check_deprecation (qual_wfl, decl);
6870 type = TREE_TYPE (decl);
6873 /* We resolve and expression name */
6876 tree field_decl = NULL_TREE;
6878 /* If there exists an early resolution, use it. That occurs
6879 only once and we know that there are more things to
6880 come. Don't do that when processing something after SUPER
6881 (we need more thing to be put in place below */
6882 if (!from_super && QUAL_RESOLUTION (q))
6884 decl = QUAL_RESOLUTION (q);
6887 if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
6890 *where_found = current_this;
6893 static_ref_err (qual_wfl, DECL_NAME (decl),
6900 *where_found = TREE_TYPE (decl);
6901 if (TREE_CODE (*where_found) == POINTER_TYPE)
6902 *where_found = TREE_TYPE (*where_found);
6907 /* We have to search for a field, knowing the type of its
6908 container. The flag FROM_TYPE indicates that we resolved
6909 the last member of the expression as a type name, which
6910 means that for the resolution of this field, we'll look
6911 for other errors than if it was resolved as a member of
6916 tree field_decl_type; /* For layout */
6918 if (!from_type && !JREFERENCE_TYPE_P (type))
6921 (qual_wfl, "Attempt to reference field `%s' in `%s %s'",
6922 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
6923 lang_printable_name (type, 0),
6924 IDENTIFIER_POINTER (DECL_NAME (field_decl)));
6928 field_decl = lookup_field_wrapper (type,
6929 EXPR_WFL_NODE (qual_wfl));
6930 if (field_decl == NULL_TREE)
6933 (qual_wfl, "No variable `%s' defined in type `%s'",
6934 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
6935 GET_TYPE_NAME (type));
6938 if (field_decl == error_mark_node)
6941 /* Layout the type of field_decl, since we may need
6942 it. Don't do primitive types or loaded classes. The
6943 situation of non primitive arrays may not handled
6944 properly here. FIXME */
6945 if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
6946 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
6948 field_decl_type = TREE_TYPE (field_decl);
6949 if (!JPRIMITIVE_TYPE_P (field_decl_type)
6950 && !CLASS_LOADED_P (field_decl_type)
6951 && !TYPE_ARRAY_P (field_decl_type))
6952 resolve_and_layout (field_decl_type, NULL_TREE);
6953 if (TYPE_ARRAY_P (field_decl_type))
6954 CLASS_LOADED_P (field_decl_type) = 1;
6956 /* Check on accessibility here */
6957 if (not_accessible_p (type, field_decl, from_super))
6961 "Can't access %s field `%s.%s' from `%s'",
6962 java_accstring_lookup
6963 (get_access_flags_from_decl (field_decl)),
6964 GET_TYPE_NAME (type),
6965 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
6967 (DECL_NAME (TYPE_NAME (current_class))));
6970 check_deprecation (qual_wfl, field_decl);
6972 /* There are things to check when fields are accessed
6973 from type. There are no restrictions on a static
6974 declaration of the field when it is accessed from an
6976 is_static = FIELD_STATIC (field_decl);
6977 if (!from_super && from_type
6978 && !TYPE_INTERFACE_P (type) && !is_static)
6980 static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
6983 from_cast = from_super = 0;
6985 /* If we need to generate something to get a proper
6986 handle on what this field is accessed from, do it
6990 decl = maybe_access_field (decl, *where_found, *type_found);
6991 if (decl == error_mark_node)
6995 /* We want to keep the location were found it, and the type
6997 *where_found = decl;
7000 /* This is the decl found and eventually the next one to
7005 type = QUAL_DECL_TYPE (decl);
7012 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
7013 can't be accessed from REFERENCE (a record type). */
7016 not_accessible_p (reference, member, from_super)
7017 tree reference, member;
7020 int access_flag = get_access_flags_from_decl (member);
7022 /* Access always granted for members declared public */
7023 if (access_flag & ACC_PUBLIC)
7026 /* Check access on protected members */
7027 if (access_flag & ACC_PROTECTED)
7029 /* Access granted if it occurs from within the package
7030 containing the class in which the protected member is
7032 if (class_in_current_package (DECL_CONTEXT (member)))
7035 /* If accessed with the form `super.member', then access is granted */
7039 /* Otherwise, access is granted if occuring from the class where
7040 member is declared or a subclass of it */
7041 if (inherits_from_p (reference, current_class))
7046 /* Check access on private members. Access is granted only if it
7047 occurs from within the class in witch it is declared */
7048 if (access_flag & ACC_PRIVATE)
7049 return (current_class == DECL_CONTEXT (member) ? 0 : 1);
7051 /* Default access are permitted only when occuring within the
7052 package in which the type (REFERENCE) is declared. In other words,
7053 REFERENCE is defined in the current package */
7055 return !class_in_current_package (reference);
7057 /* Otherwise, access is granted */
7061 /* Test deprecated decl access. */
7063 check_deprecation (wfl, decl)
7066 const char *file = DECL_SOURCE_FILE (decl);
7067 /* Complain if the field is deprecated and the file it was defined
7068 in isn't compiled at the same time the file which contains its
7070 if (DECL_DEPRECATED (decl)
7071 && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
7074 switch (TREE_CODE (decl))
7077 strcpy (the, "method");
7080 strcpy (the, "field");
7083 strcpy (the, "class");
7086 fatal ("unexpected DECL code - check_deprecation");
7088 parse_warning_context
7089 (wfl, "The %s `%s' in class `%s' has been deprecated",
7090 the, lang_printable_name (decl, 0),
7091 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
7095 /* Returns 1 if class was declared in the current package, 0 otherwise */
7098 class_in_current_package (class)
7101 static tree cache = NULL_TREE;
7108 qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
7110 /* If the current package is empty and the name of CLASS is
7111 qualified, class isn't in the current package. If there is a
7112 current package and the name of the CLASS is not qualified, class
7113 isn't in the current package */
7114 if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
7117 /* If there is not package and the name of CLASS isn't qualified,
7118 they belong to the same unnamed package */
7119 if (!ctxp->package && !qualified_flag)
7122 /* Compare the left part of the name of CLASS with the package name */
7123 breakdown_qualified (&left, NULL, DECL_NAME (TYPE_NAME (class)));
7124 if (ctxp->package == left)
7132 /* This function may generate code to access DECL from WHERE. This is
7133 done only if certain conditions meet. */
7136 maybe_access_field (decl, where, type)
7137 tree decl, where, type;
7139 if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
7140 && !FIELD_STATIC (decl))
7141 decl = build_field_ref (where ? where : current_this,
7142 (type ? type : DECL_CONTEXT (decl)),
7147 /* Build a method invocation, by patching PATCH. If non NULL
7148 and according to the situation, PRIMARY and WHERE may be
7149 used. IS_STATIC is set to 1 if the invoked function is static. */
7152 patch_method_invocation (patch, primary, where, is_static, ret_decl)
7153 tree patch, primary, where;
7157 tree wfl = TREE_OPERAND (patch, 0);
7158 tree args = TREE_OPERAND (patch, 1);
7159 tree name = EXPR_WFL_NODE (wfl);
7161 int is_static_flag = 0;
7162 int is_super_init = 0;
7163 tree this_arg = NULL_TREE;
7165 /* Should be overriden if everything goes well. Otherwise, if
7166 something fails, it should keep this value. It stop the
7167 evaluation of a bogus assignment. See java_complete_tree,
7168 MODIFY_EXPR: for the reasons why we sometimes want to keep on
7169 evaluating an assignment */
7170 TREE_TYPE (patch) = error_mark_node;
7172 /* Since lookup functions are messing with line numbers, save the
7174 java_parser_context_save_global ();
7176 /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
7178 /* Resolution of qualified name, excluding constructors */
7179 if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
7181 tree class_decl, identifier, identifier_wfl;
7182 /* Extract the last IDENTIFIER of the qualified
7183 expression. This is a wfl and we will use it's location
7184 data during error report. */
7185 identifier_wfl = cut_identifier_in_qualified (wfl);
7186 identifier = EXPR_WFL_NODE (identifier_wfl);
7188 /* Given the context, IDENTIFIER is syntactically qualified
7189 as a MethodName. We need to qualify what's before */
7190 qualify_ambiguous_name (wfl);
7192 /* Package resolution */
7193 if (RESOLVE_PACKAGE_NAME_P (wfl))
7195 tree next, decl, name = resolve_package (wfl, &next);
7200 breakdown_qualified (&remainder, NULL, EXPR_WFL_NODE (wfl));
7201 parse_error_context (wfl, "Can't search method `%s' in package "
7202 "`%s'",IDENTIFIER_POINTER (identifier),
7203 IDENTIFIER_POINTER (remainder));
7204 PATCH_METHOD_RETURN_ERROR ();
7206 RESOLVE_PACKAGE_NAME_P (wfl) = 0;
7207 if ((decl = resolve_no_layout (name, QUAL_WFL (next))))
7209 QUAL_RESOLUTION (EXPR_WFL_QUALIFICATION (wfl)) = decl;
7210 RESOLVE_EXPRESSION_NAME_P (wfl) = 0;
7211 RESOLVE_TYPE_NAME_P (wfl) = 1;
7215 RESOLVE_EXPRESSION_NAME_P (wfl) = 1;
7216 RESOLVE_TYPE_NAME_P (wfl) = 0;
7220 /* We're resolving a call from a type */
7221 if (RESOLVE_TYPE_NAME_P (wfl))
7223 tree decl = QUAL_RESOLUTION (EXPR_WFL_QUALIFICATION (wfl));
7224 tree name = DECL_NAME (decl);
7227 class_decl = resolve_and_layout (name, wfl);
7228 if (CLASS_INTERFACE (decl))
7231 (identifier_wfl, "Can't make static reference to method "
7232 "`%s' in interface `%s'", IDENTIFIER_POINTER (identifier),
7233 IDENTIFIER_POINTER (name));
7234 PATCH_METHOD_RETURN_ERROR ();
7236 /* Look the method up in the type selector. The method ought
7238 type = TREE_TYPE (class_decl);
7239 list = lookup_method_invoke (0, wfl, type, identifier, args);
7240 if (list && !METHOD_STATIC (list))
7242 char *fct_name = xstrdup (lang_printable_name (list, 0));
7245 "Can't make static reference to method `%s %s' in class `%s'",
7246 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
7247 fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
7249 PATCH_METHOD_RETURN_ERROR ();
7251 args = nreverse (args);
7253 /* We're resolving an expression name */
7258 /* 1- Find the field to which the call applies */
7259 field = resolve_field_access (wfl, NULL, &type);
7260 if (field == error_mark_node)
7261 PATCH_METHOD_RETURN_ERROR ();
7262 /* field is used in lieu of a primary. It alows us not to
7263 report errors on erroneous use of `this' in
7267 /* 2- Do the layout of the class where the last field
7268 was found, so we can search it. */
7269 class_decl = resolve_and_layout (type, NULL_TREE);
7270 if (class_decl != NULL_TREE)
7271 type = TREE_TYPE (class_decl);
7273 /* 3- Retrieve a filtered list of method matches, Refine
7274 if necessary. In any cases, point out errors. */
7275 list = lookup_method_invoke (0, identifier_wfl, type,
7278 /* 4- Add the field as an argument */
7279 args = nreverse (args);
7283 /* IDENTIFIER_WFL will be used to report any problem further */
7284 wfl = identifier_wfl;
7286 /* Resolution of simple names, names generated after a primary: or
7290 tree class_to_search = NULL_TREE;
7291 int lc; /* Looking for Constructor */
7293 /* We search constructor in their target class */
7294 if (CALL_CONSTRUCTOR_P (patch))
7296 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
7297 class_to_search = EXPR_WFL_NODE (wfl);
7298 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
7299 this_identifier_node)
7300 class_to_search = NULL_TREE;
7301 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
7302 super_identifier_node)
7305 if (CLASSTYPE_SUPER (current_class))
7307 DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
7310 parse_error_context (wfl, "Can't invoke super constructor "
7311 "on java.lang.Object");
7312 PATCH_METHOD_RETURN_ERROR ();
7316 /* Class to search is NULL if we're searching the current one */
7317 if (class_to_search)
7319 class_to_search = resolve_and_layout (class_to_search,
7321 if (!class_to_search)
7324 (wfl, "Class `%s' not found in type declaration",
7325 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
7326 PATCH_METHOD_RETURN_ERROR ();
7329 /* Can't instantiate an abstract class, but we can
7330 invoke it's constructor. It's use within the `new'
7331 context is denied here. */
7332 if (CLASS_ABSTRACT (class_to_search)
7333 && TREE_CODE (patch) == NEW_CLASS_EXPR)
7336 (wfl, "Class `%s' is an abstract class. It can't be "
7337 "instantiated", IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
7338 PATCH_METHOD_RETURN_ERROR ();
7340 class_to_search = TREE_TYPE (class_to_search);
7343 class_to_search = current_class;
7346 /* This is a regular search in the local class, unless an
7347 alternate class is specified. */
7350 class_to_search = (where ? where : current_class);
7354 /* NAME is a simple identifier or comes from a primary. Search
7355 in the class whose declaration contain the method being
7357 resolve_and_layout (class_to_search, NULL_TREE);
7358 list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
7360 /* Don't continue if no method were found, as the next statement
7361 can't be executed then. */
7363 PATCH_METHOD_RETURN_ERROR ();
7365 /* Check for static reference if non static methods */
7366 if (check_for_static_method_reference (wfl, patch, list,
7367 class_to_search, primary))
7368 PATCH_METHOD_RETURN_ERROR ();
7370 /* Non static methods are called with the current object extra
7371 argument. If patch a `new TYPE()', the argument is the value
7372 returned by the object allocator. If method is resolved as a
7373 primary, use the primary otherwise use the current THIS. */
7374 args = nreverse (args);
7375 if (TREE_CODE (patch) != NEW_CLASS_EXPR)
7376 this_arg = primary ? primary : current_this;
7379 /* Merge point of all resolution schemes. If we have nothing, this
7380 is an error, already signaled */
7382 PATCH_METHOD_RETURN_ERROR ();
7384 /* Check accessibility, position the is_static flag, build and
7386 if (not_accessible_p (DECL_CONTEXT (current_function_decl), list, 0))
7388 char *fct_name = xstrdup (lang_printable_name (list, 0));
7390 (wfl, "Can't access %s method `%s %s.%s' from `%s'",
7391 java_accstring_lookup (get_access_flags_from_decl (list)),
7392 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
7393 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list)))),
7394 fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
7396 PATCH_METHOD_RETURN_ERROR ();
7398 check_deprecation (wfl, list);
7400 is_static_flag = METHOD_STATIC (list);
7401 if (! METHOD_STATIC (list) && this_arg != NULL_TREE)
7402 args = tree_cons (NULL_TREE, this_arg, args);
7404 /* In the context of an explicit constructor invocation, we can't
7405 invoke any method relying on `this'. Exceptions are: we're
7406 invoking a static function, primary exists and is not the current
7407 this, we're creating a new object. */
7408 if (ctxp->explicit_constructor_p
7410 && (!primary || primary == current_this)
7411 && (TREE_CODE (patch) != NEW_CLASS_EXPR))
7414 (wfl, "Can't reference `this' before the superclass constructor has "
7416 PATCH_METHOD_RETURN_ERROR ();
7418 java_parser_context_restore_global ();
7420 *is_static = is_static_flag;
7421 /* Sometimes, we want the decl of the selected method. Such as for
7425 patch = patch_invoke (patch, list, args);
7426 if (is_super_init && CLASS_HAS_FINIT_P (current_class))
7428 /* Generate the code used to initialize fields declared with an
7429 initialization statement. For now, it returns a call the the
7430 artificial function $finit$, if required. */
7433 build_method_invocation (build_expr_wfl (finit_identifier_node,
7434 input_filename, 0, 0),
7436 patch = build (COMPOUND_EXPR, void_type_node, patch,
7437 java_complete_tree (finit_call));
7438 CAN_COMPLETE_NORMALLY (patch) = 1;
7443 /* Check that we're not trying to do a static reference to a method in
7444 non static method. Return 1 if it's the case, 0 otherwise. */
7447 check_for_static_method_reference (wfl, node, method, where, primary)
7448 tree wfl, node, method, where, primary;
7450 if (METHOD_STATIC (current_function_decl)
7451 && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
7453 char *fct_name = xstrdup (lang_printable_name (method, 0));
7455 (wfl, "Can't make static reference to method `%s %s' in class `%s'",
7456 lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
7457 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
7464 /* Patch an invoke expression METHOD and ARGS, based on its invocation
7468 patch_invoke (patch, method, args)
7469 tree patch, method, args;
7472 tree original_call, t, ta;
7474 /* Last step for args: convert build-in types. If we're dealing with
7475 a new TYPE() type call, the first argument to the constructor
7476 isn't found in the incomming argument list, but delivered by
7478 t = TYPE_ARG_TYPES (TREE_TYPE (method));
7479 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
7481 for (ta = args; t != end_params_node && ta;
7482 t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
7483 if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
7484 TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
7485 TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
7487 /* Resolve unresolved returned type isses */
7488 t = TREE_TYPE (TREE_TYPE (method));
7489 if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
7490 resolve_and_layout (TREE_TYPE (t), NULL);
7492 if (flag_emit_class_files || flag_emit_xref)
7496 tree signature = build_java_signature (TREE_TYPE (method));
7497 switch (invocation_mode (method, CALL_USING_SUPER (patch)))
7499 case INVOKE_VIRTUAL:
7500 dtable = invoke_build_dtable (0, args);
7501 func = build_invokevirtual (dtable, method);
7506 func = build_known_method_ref (method, TREE_TYPE (method),
7507 DECL_CONTEXT (method),
7511 case INVOKE_INTERFACE:
7512 dtable = invoke_build_dtable (1, args);
7513 func = build_invokeinterface (dtable, DECL_NAME (method), signature);
7517 fatal ("internal error - unknown invocation_mode result");
7520 /* Ensure self_type is initialized, (invokestatic). FIXME */
7521 func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
7524 TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
7525 TREE_OPERAND (patch, 0) = func;
7526 TREE_OPERAND (patch, 1) = args;
7527 original_call = patch;
7529 /* We're processing a `new TYPE ()' form. New is called an its
7530 returned value is the first argument to the constructor. We build
7531 a COMPOUND_EXPR and use saved expression so that the overall NEW
7532 expression value is a pointer to a newly created and initialized
7534 if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
7536 tree class = DECL_CONTEXT (method);
7537 tree c1, saved_new, size, new;
7538 if (flag_emit_class_files || flag_emit_xref)
7540 TREE_TYPE (patch) = build_pointer_type (class);
7543 if (!TYPE_SIZE (class))
7544 safe_layout_class (class);
7545 size = size_in_bytes (class);
7546 new = build (CALL_EXPR, promote_type (class),
7547 build_address_of (alloc_object_node),
7548 tree_cons (NULL_TREE, build_class_ref (class),
7549 build_tree_list (NULL_TREE,
7550 size_in_bytes (class))),
7552 saved_new = save_expr (new);
7553 c1 = build_tree_list (NULL_TREE, saved_new);
7554 TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
7555 TREE_OPERAND (original_call, 1) = c1;
7556 TREE_SET_CODE (original_call, CALL_EXPR);
7557 patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
7563 invocation_mode (method, super)
7567 int access = get_access_flags_from_decl (method);
7570 return INVOKE_SUPER;
7572 if (access & ACC_STATIC || access & ACC_FINAL || access & ACC_PRIVATE)
7573 return INVOKE_STATIC;
7575 if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
7576 return INVOKE_STATIC;
7578 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
7579 return INVOKE_INTERFACE;
7581 if (DECL_CONSTRUCTOR_P (method))
7582 return INVOKE_STATIC;
7584 return INVOKE_VIRTUAL;
7587 /* Retrieve a refined list of matching methods. It covers the step
7588 15.11.2 (Compile-Time Step 2) */
7591 lookup_method_invoke (lc, cl, class, name, arg_list)
7594 tree class, name, arg_list;
7596 tree atl = end_params_node; /* Arg Type List */
7597 tree method, signature, list, node;
7598 const char *candidates; /* Used for error report */
7601 /* Fix the arguments */
7602 for (node = arg_list; node; node = TREE_CHAIN (node))
7604 tree current_arg = TREE_TYPE (TREE_VALUE (node));
7605 /* Non primitive type may have to be resolved */
7606 if (!JPRIMITIVE_TYPE_P (current_arg))
7607 resolve_and_layout (current_arg, NULL_TREE);
7609 if (TREE_CODE (current_arg) == RECORD_TYPE)
7610 current_arg = promote_type (current_arg);
7611 atl = tree_cons (NULL_TREE, current_arg, atl);
7614 /* Find all candidates and then refine the list, searching for the
7615 most specific method. */
7616 list = find_applicable_accessible_methods_list (lc, class, name, atl);
7617 list = find_most_specific_methods_list (list);
7618 if (list && !TREE_CHAIN (list))
7619 return TREE_VALUE (list);
7621 /* Issue an error. List candidates if any. Candidates are listed
7622 only if accessible (non accessible methods may end-up here for
7623 the sake of a better error report). */
7628 obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
7629 for (current = list; current; current = TREE_CHAIN (current))
7631 tree cm = TREE_VALUE (current);
7633 if (!cm || not_accessible_p (class, cm, 0))
7636 (string, " `%s' in `%s'%s",
7637 get_printable_method_name (cm),
7638 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
7639 (TREE_CHAIN (current) ? "\n" : ""));
7640 obstack_grow (&temporary_obstack, string, strlen (string));
7642 obstack_1grow (&temporary_obstack, '\0');
7643 candidates = obstack_finish (&temporary_obstack);
7645 /* Issue the error message */
7646 method = make_node (FUNCTION_TYPE);
7647 TYPE_ARG_TYPES (method) = atl;
7648 signature = build_java_argument_signature (method);
7649 dup = strdup (lang_printable_name (class, 0));
7650 parse_error_context (cl, "Can't find %s `%s(%s)' in type `%s'%s",
7651 (lc ? "constructor" : "method"),
7652 (lc ? dup : IDENTIFIER_POINTER (name)),
7653 IDENTIFIER_POINTER (signature), dup,
7654 (candidates ? candidates : ""));
7659 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
7660 when we're looking for a constructor. */
7663 find_applicable_accessible_methods_list (lc, class, name, arglist)
7665 tree class, name, arglist;
7667 tree list = NULL_TREE, all_list = NULL_TREE;
7669 /* Search interfaces */
7670 if (CLASS_INTERFACE (TYPE_NAME (class))
7671 || CLASS_ABSTRACT (TYPE_NAME (class)))
7673 static tree searched_interfaces = NULL_TREE;
7674 static int search_not_done = 0;
7676 tree basetype_vec = TYPE_BINFO_BASETYPES (class);
7678 /* Have we searched this interface already? */
7679 if (searched_interfaces)
7682 for (current = searched_interfaces;
7683 current; current = TREE_CHAIN (current))
7684 if (TREE_VALUE (current) == class)
7687 searched_interfaces = tree_cons (NULL_TREE, class, searched_interfaces);
7689 search_applicable_methods_list
7690 (lc, TYPE_METHODS (class), name, arglist, &list, &all_list);
7692 n = TREE_VEC_LENGTH (basetype_vec);
7693 for (i = 0; i < n; i++)
7695 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
7698 /* Skip java.lang.Object (we'll search it once later.) */
7699 if (t == object_type_node)
7703 rlist = find_applicable_accessible_methods_list (lc, t, name,
7705 all_list = chainon (rlist, (list ? list : all_list));
7709 /* We're done. Reset the searched interfaces list and finally search
7711 if (!search_not_done)
7713 searched_interfaces = NULL_TREE;
7714 search_applicable_methods_list (lc, TYPE_METHODS (object_type_node),
7715 name, arglist, &list, &all_list);
7718 /* Search classes */
7720 while (class != NULL_TREE)
7722 search_applicable_methods_list
7723 (lc, TYPE_METHODS (class), name, arglist, &list, &all_list);
7724 class = (lc ? NULL_TREE : CLASSTYPE_SUPER (class));
7727 /* Either return the list obtained or all selected (but
7728 inaccessible) methods for better error report. */
7729 return (!list ? all_list : list);
7732 /* Effectively search for the approriate method in method */
7735 search_applicable_methods_list(lc, method, name, arglist, list, all_list)
7737 tree method, name, arglist;
7738 tree *list, *all_list;
7740 for (; method; method = TREE_CHAIN (method))
7742 /* When dealing with constructor, stop here, otherwise search
7744 if (lc && !DECL_CONSTRUCTOR_P (method))
7746 else if (!lc && (DECL_CONSTRUCTOR_P (method)
7747 || (GET_METHOD_NAME (method) != name)))
7750 if (argument_types_convertible (method, arglist))
7752 /* Retain accessible methods only */
7753 if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
7755 *list = tree_cons (NULL_TREE, method, *list);
7757 /* Also retain all selected method here */
7758 *all_list = tree_cons (NULL_TREE, method, *list);
7763 /* 15.11.2.2 Choose the Most Specific Method */
7766 find_most_specific_methods_list (list)
7770 tree current, new_list = NULL_TREE;
7771 for (current = list; current; current = TREE_CHAIN (current))
7774 DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
7776 for (method = list; method; method = TREE_CHAIN (method))
7778 /* Don't test a method against itself */
7779 if (method == current)
7782 /* Compare arguments and location where method where declared */
7783 if (argument_types_convertible (TREE_VALUE (method),
7784 TREE_VALUE (current))
7785 && valid_method_invocation_conversion_p
7786 (DECL_CONTEXT (TREE_VALUE (method)),
7787 DECL_CONTEXT (TREE_VALUE (current))))
7789 int v = ++DECL_SPECIFIC_COUNT (TREE_VALUE (current));
7790 max = (v > max ? v : max);
7795 /* Review the list and select the maximally specific methods */
7796 for (current = list; current; current = TREE_CHAIN (current))
7797 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
7798 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
7800 /* If we can't find one, lower expectations and try to gather multiple
7801 maximally specific methods */
7806 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
7807 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
7815 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
7816 converted by method invocation conversion (5.3) to the type of the
7817 corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
7818 to change less often than M1. */
7821 argument_types_convertible (m1, m2_or_arglist)
7822 tree m1, m2_or_arglist;
7824 static tree m2_arg_value = NULL_TREE;
7825 static tree m2_arg_cache = NULL_TREE;
7827 register tree m1_arg, m2_arg;
7829 m1_arg = TYPE_ARG_TYPES (TREE_TYPE (m1));
7830 if (!METHOD_STATIC (m1))
7831 m1_arg = TREE_CHAIN (m1_arg);
7833 if (m2_arg_value == m2_or_arglist)
7834 m2_arg = m2_arg_cache;
7837 /* M2_OR_ARGLIST can be a function DECL or a raw list of
7839 if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
7841 m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
7842 if (!METHOD_STATIC (m2_or_arglist))
7843 m2_arg = TREE_CHAIN (m2_arg);
7846 m2_arg = m2_or_arglist;
7848 m2_arg_value = m2_or_arglist;
7849 m2_arg_cache = m2_arg;
7852 while (m1_arg != end_params_node && m2_arg != end_params_node)
7854 resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
7855 if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
7856 TREE_VALUE (m2_arg)))
7858 m1_arg = TREE_CHAIN (m1_arg);
7859 m2_arg = TREE_CHAIN (m2_arg);
7861 return m1_arg == end_params_node && m2_arg == end_params_node;
7864 /* Qualification routines */
7867 qualify_ambiguous_name (id)
7870 tree qual, qual_wfl, name = NULL_TREE, decl, ptr_type = NULL_TREE,
7871 saved_current_class;
7872 int again, super_found = 0, this_found = 0, new_array_found = 0;
7875 /* We first qualify the first element, then derive qualification of
7876 others based on the first one. If the first element is qualified
7877 by a resolution (field or type), this resolution is stored in the
7878 QUAL_RESOLUTION of the qual element being examined. We need to
7879 save the current_class since the use of SUPER might change the
7881 saved_current_class = current_class;
7882 qual = EXPR_WFL_QUALIFICATION (id);
7885 /* Simple qualified expression feature a qual_wfl that is a
7886 WFL. Expression derived from a primary feature more complicated
7887 things like a CALL_EXPR. Expression from primary need to be
7888 worked out to extract the part on which the qualification will
7890 qual_wfl = QUAL_WFL (qual);
7891 switch (TREE_CODE (qual_wfl))
7894 qual_wfl = TREE_OPERAND (qual_wfl, 0);
7895 if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
7897 qual = EXPR_WFL_QUALIFICATION (qual_wfl);
7898 qual_wfl = QUAL_WFL (qual);
7901 case NEW_ARRAY_EXPR:
7902 qual = TREE_CHAIN (qual);
7903 again = new_array_found = 1;
7905 case NEW_CLASS_EXPR:
7907 qual_wfl = TREE_OPERAND (qual_wfl, 0);
7910 while (TREE_CODE (qual_wfl) == ARRAY_REF)
7911 qual_wfl = TREE_OPERAND (qual_wfl, 0);
7914 qual = TREE_CHAIN (qual);
7915 qual_wfl = QUAL_WFL (qual);
7918 /* Fix for -Wall. Just break doing nothing */
7922 ptr_type = current_class;
7924 code = TREE_CODE (qual_wfl);
7926 /* Pos evaluation: non WFL leading expression nodes */
7927 if (code == CONVERT_EXPR
7928 && TREE_CODE (TREE_TYPE (qual_wfl)) == EXPR_WITH_FILE_LOCATION)
7929 name = EXPR_WFL_NODE (TREE_TYPE (qual_wfl));
7931 else if ((code == ARRAY_REF || code == CALL_EXPR || code == MODIFY_EXPR) &&
7932 TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION)
7933 name = EXPR_WFL_NODE (TREE_OPERAND (qual_wfl, 0));
7935 else if (code == STRING_CST || code == CONDITIONAL_EXPR
7936 || code == PLUS_EXPR)
7938 qual = TREE_CHAIN (qual);
7939 qual_wfl = QUAL_WFL (qual);
7944 name = EXPR_WFL_NODE (qual_wfl);
7947 qual = EXPR_WFL_QUALIFICATION (qual_wfl);
7952 /* If we have a THIS (from a primary), we set the context accordingly */
7953 if (name == this_identifier_node)
7955 qual = TREE_CHAIN (qual);
7956 qual_wfl = QUAL_WFL (qual);
7957 if (TREE_CODE (qual_wfl) == CALL_EXPR)
7960 name = EXPR_WFL_NODE (qual_wfl);
7963 /* If we have a SUPER, we set the context accordingly */
7964 if (name == super_identifier_node)
7966 current_class = CLASSTYPE_SUPER (ptr_type);
7967 /* Check that there is such a thing as a super class. If not,
7968 return. The error will be caught later on, during the
7972 current_class = saved_current_class;
7975 qual = TREE_CHAIN (qual);
7976 /* Do one more interation to set things up */
7977 super_found = again = 1;
7981 /* If name appears within the scope of a location variable
7982 declaration or parameter declaration, then it is an expression
7983 name. We don't carry this test out if we're in the context of the
7984 use of SUPER or THIS */
7985 if (!this_found && !super_found &&
7986 TREE_CODE (name) != STRING_CST && (decl = IDENTIFIER_LOCAL_VALUE (name)))
7988 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
7989 QUAL_RESOLUTION (qual) = decl;
7992 /* If within the class/interface NAME was found to be used there
7993 exists a (possibly inherited) field named NAME, then this is an
7994 expression name. If we saw a NEW_ARRAY_EXPR before and want to
7995 address length, it is OK. */
7996 else if ((decl = lookup_field_wrapper (ptr_type, name))
7997 || (new_array_found && name == length_identifier_node))
7999 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
8000 QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
8003 /* We reclassify NAME as yielding to a type name resolution if:
8004 - NAME is a class/interface declared within the compilation
8005 unit containing NAME,
8006 - NAME is imported via a single-type-import declaration,
8007 - NAME is declared in an another compilation unit of the package
8008 of the compilation unit containing NAME,
8009 - NAME is declared by exactly on type-import-on-demand declaration
8010 of the compilation unit containing NAME.
8011 - NAME is actually a STRING_CST. */
8012 else if (TREE_CODE (name) == STRING_CST ||
8013 (decl = resolve_and_layout (name, NULL_TREE)))
8015 RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
8016 QUAL_RESOLUTION (qual) = decl;
8019 /* Method call are expression name */
8020 else if (TREE_CODE (QUAL_WFL (qual)) == CALL_EXPR
8021 || TREE_CODE (QUAL_WFL (qual)) == ARRAY_REF
8022 || TREE_CODE (QUAL_WFL (qual)) == CONVERT_EXPR)
8023 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
8025 /* Check here that NAME isn't declared by more than one
8026 type-import-on-demand declaration of the compilation unit
8027 containing NAME. FIXME */
8029 /* Otherwise, NAME is reclassified as a package name */
8031 RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
8033 /* Propagate the qualification accross other components of the
8035 for (qual = TREE_CHAIN (qual); qual;
8036 qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
8038 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
8039 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
8041 RESOLVE_EXPRESSION_NAME_P (QUAL_WFL (qual)) = 1;
8044 /* Store the global qualification for the ambiguous part of ID back
8046 if (RESOLVE_EXPRESSION_NAME_P (qual_wfl))
8047 RESOLVE_EXPRESSION_NAME_P (id) = 1;
8048 else if (RESOLVE_TYPE_NAME_P (qual_wfl))
8049 RESOLVE_TYPE_NAME_P (id) = 1;
8050 else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
8051 RESOLVE_PACKAGE_NAME_P (id) = 1;
8053 /* Restore the current class */
8054 current_class = saved_current_class;
8058 breakdown_qualified (left, right, source)
8059 tree *left, *right, source;
8061 char *p = IDENTIFIER_POINTER (source), *base;
8062 int l = IDENTIFIER_LENGTH (source);
8064 /* Breakdown NAME into REMAINDER . IDENTIFIER */
8067 while (*p != '.' && p != base)
8070 /* We didn't find a '.'. Return an error */
8076 *right = get_identifier (p+1);
8077 *left = get_identifier (IDENTIFIER_POINTER (source));
8083 /* Patch tree nodes in a function body. When a BLOCK is found, push
8084 local variable decls if present.
8085 Same as java_complete_lhs, but does resolve static finals to values. */
8088 java_complete_tree (node)
8091 node = java_complete_lhs (node);
8092 if (TREE_CODE (node) == VAR_DECL && FIELD_STATIC (node)
8093 && FIELD_FINAL (node) && DECL_INITIAL (node) != NULL_TREE
8096 tree value = DECL_INITIAL (node);
8097 DECL_INITIAL (node) = NULL_TREE;
8098 push_obstacks (&permanent_obstack, &permanent_obstack);
8099 value = fold_constant_for_init (value, node);
8101 DECL_INITIAL (node) = value;
8102 if (value != NULL_TREE)
8109 java_stabilize_reference (node)
8112 if (TREE_CODE (node) == COMPOUND_EXPR)
8114 tree op0 = TREE_OPERAND (node, 0);
8115 tree op1 = TREE_OPERAND (node, 1);
8116 TREE_OPERAND (node, 0) = save_expr (op0);
8117 TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
8120 return stabilize_reference (node);
8123 /* Patch tree nodes in a function body. When a BLOCK is found, push
8124 local variable decls if present.
8125 Same as java_complete_tree, but does not resolve static finals to values. */
8128 java_complete_lhs (node)
8131 tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
8134 /* CONVERT_EXPR always has its type set, even though it needs to be
8136 if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
8139 /* The switch block implements cases processing container nodes
8140 first. Contained nodes are always written back. Leaves come
8141 next and return a value. */
8142 switch (TREE_CODE (node))
8146 /* 1- Block section.
8147 Set the local values on decl names so we can identify them
8148 faster when they're referenced. At that stage, identifiers
8149 are legal so we don't check for declaration errors. */
8150 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
8152 DECL_CONTEXT (cn) = current_function_decl;
8153 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
8155 if (BLOCK_EXPR_BODY (node) == NULL_TREE)
8156 CAN_COMPLETE_NORMALLY (node) = 1;
8159 tree stmt = BLOCK_EXPR_BODY (node);
8162 if (TREE_CODE (stmt) == COMPOUND_EXPR)
8164 /* Re-order from (((A; B); C); ...; Z) to
8165 (A; (B; (C ; (...; Z)))).
8166 This makes it easier to scan the statements left-to-right
8167 without using recursion (which might overflow the stack
8168 if the block has many statements. */
8171 tree left = TREE_OPERAND (stmt, 0);
8172 if (TREE_CODE (left) != COMPOUND_EXPR)
8174 TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
8175 TREE_OPERAND (left, 1) = stmt;
8178 BLOCK_EXPR_BODY (node) = stmt;
8181 /* Now do the actual complete, without deep recursion for
8183 ptr = &BLOCK_EXPR_BODY (node);
8184 while (TREE_CODE (*ptr) == COMPOUND_EXPR
8185 && TREE_OPERAND (*ptr, 1) != empty_stmt_node)
8187 tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
8188 tree *next = &TREE_OPERAND (*ptr, 1);
8189 TREE_OPERAND (*ptr, 0) = cur;
8190 if (cur == empty_stmt_node)
8192 /* Optimization; makes it easier to detect empty bodies.
8193 Most useful for <clinit> with all-constant initializer. */
8197 if (TREE_CODE (cur) == ERROR_MARK)
8199 else if (! CAN_COMPLETE_NORMALLY (cur))
8204 if (TREE_CODE (wfl_op2) == BLOCK)
8205 wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
8206 else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
8207 wfl_op2 = TREE_OPERAND (wfl_op2, 0);
8211 if (TREE_CODE (wfl_op2) != CASE_EXPR
8212 && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
8213 unreachable_stmt_error (*ptr);
8217 *ptr = java_complete_tree (*ptr);
8219 if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
8220 return error_mark_node;
8221 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
8223 /* Turn local bindings to null */
8224 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
8225 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
8227 TREE_TYPE (node) = void_type_node;
8230 /* 2- They are expressions but ultimately deal with statements */
8233 wfl_op1 = TREE_OPERAND (node, 0);
8234 COMPLETE_CHECK_OP_0 (node);
8235 /* CAN_COMPLETE_NORMALLY (node) = 0; */
8236 return patch_throw_statement (node, wfl_op1);
8238 case SYNCHRONIZED_EXPR:
8239 wfl_op1 = TREE_OPERAND (node, 0);
8240 return patch_synchronized_statement (node, wfl_op1);
8243 return patch_try_statement (node);
8245 case TRY_FINALLY_EXPR:
8246 COMPLETE_CHECK_OP_0 (node);
8247 COMPLETE_CHECK_OP_1 (node);
8248 CAN_COMPLETE_NORMALLY (node)
8249 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
8250 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
8251 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
8254 case CLEANUP_POINT_EXPR:
8255 COMPLETE_CHECK_OP_0 (node);
8256 TREE_TYPE (node) = void_type_node;
8257 CAN_COMPLETE_NORMALLY (node) =
8258 CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0));
8261 case WITH_CLEANUP_EXPR:
8262 COMPLETE_CHECK_OP_0 (node);
8263 COMPLETE_CHECK_OP_2 (node);
8264 CAN_COMPLETE_NORMALLY (node) =
8265 CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0));
8266 TREE_TYPE (node) = void_type_node;
8269 case LABELED_BLOCK_EXPR:
8270 PUSH_LABELED_BLOCK (node);
8271 if (LABELED_BLOCK_BODY (node))
8272 COMPLETE_CHECK_OP_1 (node);
8273 TREE_TYPE (node) = void_type_node;
8274 POP_LABELED_BLOCK ();
8276 if (LABELED_BLOCK_BODY (node) == empty_stmt_node)
8278 LABELED_BLOCK_BODY (node) = NULL_TREE;
8279 CAN_COMPLETE_NORMALLY (node) = 1;
8281 else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
8282 CAN_COMPLETE_NORMALLY (node) = 1;
8285 case EXIT_BLOCK_EXPR:
8286 /* We don't complete operand 1, because it's the return value of
8287 the EXIT_BLOCK_EXPR which doesn't exist it Java */
8288 return patch_bc_statement (node);
8291 cn = java_complete_tree (TREE_OPERAND (node, 0));
8292 if (cn == error_mark_node)
8295 /* First, the case expression must be constant. Values of final
8296 fields are accepted. */
8298 if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
8299 && JDECL_P (TREE_OPERAND (cn, 1))
8300 && FIELD_FINAL (TREE_OPERAND (cn, 1))
8301 && DECL_INITIAL (TREE_OPERAND (cn, 1)))
8303 push_obstacks (&permanent_obstack, &permanent_obstack);
8304 cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
8305 TREE_OPERAND (cn, 1));
8309 if (!TREE_CONSTANT (cn) && !flag_emit_xref)
8311 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8312 parse_error_context (node, "Constant expression required");
8313 return error_mark_node;
8316 nn = ctxp->current_loop;
8318 /* It must be assignable to the type of the switch expression. */
8319 if (!try_builtin_assignconv (NULL_TREE,
8320 TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
8322 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8325 "Incompatible type for case. Can't convert `%s' to `int'",
8326 lang_printable_name (TREE_TYPE (cn), 0));
8327 return error_mark_node;
8330 cn = fold (convert (int_type_node, cn));
8332 /* Multiple instance of a case label bearing the same
8333 value is checked during code generation. The case
8334 expression is allright so far. */
8335 TREE_OPERAND (node, 0) = cn;
8336 TREE_TYPE (node) = void_type_node;
8337 CAN_COMPLETE_NORMALLY (node) = 1;
8338 TREE_SIDE_EFFECTS (node) = 1;
8342 nn = ctxp->current_loop;
8343 /* Only one default label is allowed per switch statement */
8344 if (SWITCH_HAS_DEFAULT (nn))
8346 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8347 parse_error_context (wfl_operator,
8348 "Duplicate case label: `default'");
8349 return error_mark_node;
8352 SWITCH_HAS_DEFAULT (nn) = 1;
8353 TREE_TYPE (node) = void_type_node;
8354 TREE_SIDE_EFFECTS (node) = 1;
8355 CAN_COMPLETE_NORMALLY (node) = 1;
8361 /* Check whether the loop was enclosed in a labeled
8362 statement. If not, create one, insert the loop in it and
8364 nn = patch_loop_statement (node);
8366 /* Anyways, walk the body of the loop */
8367 if (TREE_CODE (node) == LOOP_EXPR)
8368 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
8369 /* Switch statement: walk the switch expression and the cases */
8371 node = patch_switch_statement (node);
8373 if (TREE_OPERAND (node, 0) == error_mark_node)
8374 nn = error_mark_node;
8377 TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
8378 /* If we returned something different, that's because we
8379 inserted a label. Pop the label too. */
8382 if (CAN_COMPLETE_NORMALLY (node))
8383 CAN_COMPLETE_NORMALLY (nn) = 1;
8384 POP_LABELED_BLOCK ();
8391 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
8392 return patch_exit_expr (node);
8396 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
8397 if (TREE_OPERAND (node, 0) == error_mark_node)
8398 return error_mark_node;
8399 /* then-else branches */
8400 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
8401 if (TREE_OPERAND (node, 1) == error_mark_node)
8402 return error_mark_node;
8403 TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
8404 if (TREE_OPERAND (node, 2) == error_mark_node)
8405 return error_mark_node;
8406 return patch_if_else_statement (node);
8409 case CONDITIONAL_EXPR:
8411 wfl_op1 = TREE_OPERAND (node, 0);
8412 COMPLETE_CHECK_OP_0 (node);
8413 wfl_op2 = TREE_OPERAND (node, 1);
8414 COMPLETE_CHECK_OP_1 (node);
8415 wfl_op3 = TREE_OPERAND (node, 2);
8416 COMPLETE_CHECK_OP_2 (node);
8417 return patch_conditional_expr (node, wfl_op1, wfl_op2);
8419 /* 3- Expression section */
8421 wfl_op2 = TREE_OPERAND (node, 1);
8422 TREE_OPERAND (node, 0) = nn =
8423 java_complete_tree (TREE_OPERAND (node, 0));
8424 if (wfl_op2 == empty_stmt_node)
8425 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
8428 if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
8430 /* An unreachable condition in a do-while statement
8431 is *not* (technically) an unreachable statement. */
8433 if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
8434 nn = EXPR_WFL_NODE (nn);
8435 if (TREE_CODE (nn) != EXIT_EXPR)
8437 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
8438 parse_error_context (wfl_operator, "Unreachable statement");
8441 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
8442 if (TREE_OPERAND (node, 1) == error_mark_node)
8443 return error_mark_node;
8444 CAN_COMPLETE_NORMALLY (node)
8445 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1));
8447 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
8451 /* CAN_COMPLETE_NORMALLY (node) = 0; */
8452 return patch_return (node);
8454 case EXPR_WITH_FILE_LOCATION:
8455 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
8456 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
8459 node = resolve_expression_name (node, NULL);
8460 if (node == error_mark_node)
8462 /* Keep line number information somewhere were it doesn't
8463 disrupt the completion process. */
8464 if (flag_emit_xref && TREE_CODE (node) != CALL_EXPR)
8466 EXPR_WFL_NODE (wfl) = TREE_OPERAND (node, 1);
8467 TREE_OPERAND (node, 1) = wfl;
8469 CAN_COMPLETE_NORMALLY (node) = 1;
8474 int save_lineno = lineno;
8475 lineno = EXPR_WFL_LINENO (node);
8476 body = java_complete_tree (EXPR_WFL_NODE (node));
8477 lineno = save_lineno;
8478 EXPR_WFL_NODE (node) = body;
8479 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
8480 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
8481 if (body == empty_stmt_node)
8483 /* Optimization; makes it easier to detect empty bodies. */
8486 if (body == error_mark_node)
8488 /* Its important for the evaluation of assignment that
8489 this mark on the TREE_TYPE is propagated. */
8490 TREE_TYPE (node) = error_mark_node;
8491 return error_mark_node;
8494 TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
8499 case NEW_ARRAY_EXPR:
8500 /* Patch all the dimensions */
8502 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
8504 int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
8505 tree dim = convert (int_type_node,
8506 java_complete_tree (TREE_VALUE (cn)));
8507 if (dim == error_mark_node)
8514 TREE_VALUE (cn) = dim;
8515 /* Setup the location of the current dimension, for
8516 later error report. */
8518 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
8519 EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
8522 /* They complete the array creation expression, if no errors
8524 CAN_COMPLETE_NORMALLY (node) = 1;
8525 return (flag ? error_mark_node
8526 : force_evaluation_order (patch_newarray (node)));
8528 case NEW_CLASS_EXPR:
8530 /* Complete function's argument(s) first */
8531 if (complete_function_arguments (node))
8532 return error_mark_node;
8535 tree decl, wfl = TREE_OPERAND (node, 0);
8536 int in_this = CALL_THIS_CONSTRUCTOR_P (node);
8538 node = patch_method_invocation (node, NULL_TREE,
8539 NULL_TREE, 0, &decl);
8540 if (node == error_mark_node)
8541 return error_mark_node;
8543 check_thrown_exceptions (EXPR_WFL_LINECOL (node), decl);
8544 /* If we call this(...), register signature and positions */
8546 DECL_CONSTRUCTOR_CALLS (current_function_decl) =
8547 tree_cons (wfl, decl,
8548 DECL_CONSTRUCTOR_CALLS (current_function_decl));
8549 CAN_COMPLETE_NORMALLY (node) = 1;
8550 return force_evaluation_order (node);
8554 /* Save potential wfls */
8555 wfl_op1 = TREE_OPERAND (node, 0);
8556 TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
8557 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
8558 && TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
8559 && DECL_INITIAL (nn) != NULL_TREE)
8563 push_obstacks (&permanent_obstack, &permanent_obstack);
8564 value = fold_constant_for_init (nn, nn);
8566 if (value != NULL_TREE)
8568 tree type = TREE_TYPE (value);
8569 if (JPRIMITIVE_TYPE_P (type) || type == string_ptr_type_node)
8570 return empty_stmt_node;
8572 DECL_INITIAL (nn) = NULL_TREE;
8574 wfl_op2 = TREE_OPERAND (node, 1);
8576 if (TREE_OPERAND (node, 0) == error_mark_node)
8577 return error_mark_node;
8579 flag = COMPOUND_ASSIGN_P (wfl_op2);
8582 tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
8584 /* Hand stablize the lhs on both places */
8585 TREE_OPERAND (node, 0) = lvalue;
8586 TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
8587 (flag_emit_class_files ? lvalue : save_expr (lvalue));
8589 /* 15.25.2.a: Left hand is not an array access. FIXME */
8590 /* Now complete the RHS. We write it back later on. */
8591 nn = java_complete_tree (TREE_OPERAND (node, 1));
8593 if ((cn = patch_string (nn)))
8596 /* The last part of the rewrite for E1 op= E2 is to have
8597 E1 = (T)(E1 op E2), with T being the type of E1. */
8598 nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
8599 TREE_TYPE (lvalue), nn));
8601 /* 15.25.2.b: Left hand is an array access. FIXME */
8604 /* If we're about to patch a NEW_ARRAY_INIT, we call a special
8605 function to complete this RHS */
8606 else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT)
8607 nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
8608 TREE_OPERAND (node, 1));
8609 /* Otherwise we simply complete the RHS */
8611 nn = java_complete_tree (TREE_OPERAND (node, 1));
8613 if (nn == error_mark_node)
8614 return error_mark_node;
8616 /* Write back the RHS as we evaluated it. */
8617 TREE_OPERAND (node, 1) = nn;
8619 /* In case we're handling = with a String as a RHS, we need to
8620 produce a String out of the RHS (it might still be a
8621 STRING_CST or a StringBuffer at this stage */
8622 if ((nn = patch_string (TREE_OPERAND (node, 1))))
8623 TREE_OPERAND (node, 1) = nn;
8624 node = patch_assignment (node, wfl_op1, wfl_op2);
8625 /* Reorganize the tree if necessary. */
8626 if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
8627 || JSTRING_P (TREE_TYPE (node))))
8628 node = java_refold (node);
8629 CAN_COMPLETE_NORMALLY (node) = 1;
8641 case TRUNC_MOD_EXPR:
8643 case TRUTH_ANDIF_EXPR:
8644 case TRUTH_ORIF_EXPR:
8651 /* Operands 0 and 1 are WFL in certain cases only. patch_binop
8652 knows how to handle those cases. */
8653 wfl_op1 = TREE_OPERAND (node, 0);
8654 wfl_op2 = TREE_OPERAND (node, 1);
8656 CAN_COMPLETE_NORMALLY (node) = 1;
8657 /* Don't complete string nodes if dealing with the PLUS operand. */
8658 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
8660 nn = java_complete_tree (wfl_op1);
8661 if (nn == error_mark_node)
8662 return error_mark_node;
8663 if ((cn = patch_string (nn)))
8665 TREE_OPERAND (node, 0) = nn;
8667 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
8669 nn = java_complete_tree (wfl_op2);
8670 if (nn == error_mark_node)
8671 return error_mark_node;
8672 if ((cn = patch_string (nn)))
8674 TREE_OPERAND (node, 1) = nn;
8676 return force_evaluation_order (patch_binop (node, wfl_op1, wfl_op2));
8678 case INSTANCEOF_EXPR:
8679 wfl_op1 = TREE_OPERAND (node, 0);
8680 COMPLETE_CHECK_OP_0 (node);
8683 TREE_TYPE (node) = boolean_type_node;
8686 return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
8688 case UNARY_PLUS_EXPR:
8690 case TRUTH_NOT_EXPR:
8692 case PREDECREMENT_EXPR:
8693 case PREINCREMENT_EXPR:
8694 case POSTDECREMENT_EXPR:
8695 case POSTINCREMENT_EXPR:
8697 /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
8698 how to handle those cases. */
8699 wfl_op1 = TREE_OPERAND (node, 0);
8700 CAN_COMPLETE_NORMALLY (node) = 1;
8701 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
8702 if (TREE_OPERAND (node, 0) == error_mark_node)
8703 return error_mark_node;
8704 node = patch_unaryop (node, wfl_op1);
8705 CAN_COMPLETE_NORMALLY (node) = 1;
8709 /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
8710 how to handle those cases. */
8711 wfl_op1 = TREE_OPERAND (node, 0);
8712 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
8713 if (TREE_OPERAND (node, 0) == error_mark_node)
8714 return error_mark_node;
8715 if (!flag_emit_class_files && !flag_emit_xref)
8716 TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
8717 /* The same applies to wfl_op2 */
8718 wfl_op2 = TREE_OPERAND (node, 1);
8719 TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
8720 if (TREE_OPERAND (node, 1) == error_mark_node)
8721 return error_mark_node;
8722 if (!flag_emit_class_files && !flag_emit_xref)
8723 TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
8724 return patch_array_ref (node);
8730 /* The first step in the re-write of qualified name handling. FIXME.
8731 So far, this is only to support PRIMTYPE.class -> PRIMCLASS.TYPE. */
8732 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
8733 if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
8735 tree name = TREE_OPERAND (node, 1);
8736 tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
8737 if (field == NULL_TREE)
8739 error ("missing static field `%s'", IDENTIFIER_POINTER (name));
8740 return error_mark_node;
8742 if (! FIELD_STATIC (field))
8744 error ("not a static field `%s'", IDENTIFIER_POINTER (name));
8745 return error_mark_node;
8750 fatal ("unimplemented java_complete_tree for COMPONENT_REF");
8754 /* Can't use THIS in a static environment */
8757 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8758 parse_error_context (wfl_operator, "Keyword `this' used outside "
8760 TREE_TYPE (node) = error_mark_node;
8761 return error_mark_node;
8763 if (ctxp->explicit_constructor_p)
8765 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8767 (wfl_operator, "Can't reference `this' or `super' before the "
8768 "superclass constructor has been called");
8769 TREE_TYPE (node) = error_mark_node;
8770 return error_mark_node;
8772 return current_this;
8775 CAN_COMPLETE_NORMALLY (node) = 1;
8776 /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
8777 and it's time to turn it into the appropriate String object
8779 if ((node = patch_string (node)))
8781 fatal ("No case for tree code `%s' - java_complete_tree\n",
8782 tree_code_name [TREE_CODE (node)]);
8787 /* Complete function call's argument. Return a non zero value is an
8791 complete_function_arguments (node)
8797 ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
8798 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
8800 tree wfl = TREE_VALUE (cn), parm, temp;
8801 parm = java_complete_tree (wfl);
8802 if (parm == error_mark_node)
8807 /* If have a string literal that we haven't transformed yet or a
8808 crafted string buffer, as a result of use of the the String
8809 `+' operator. Build `parm.toString()' and expand it. */
8810 if ((temp = patch_string (parm)))
8812 /* Inline PRIMTYPE.TYPE read access */
8813 parm = maybe_build_primttype_type_ref (parm, wfl);
8815 TREE_VALUE (cn) = parm;
8817 ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
8821 /* Sometimes (for loops and variable initialized during their
8822 declaration), we want to wrap a statement around a WFL and turn it
8826 build_debugable_stmt (location, stmt)
8830 if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
8832 stmt = build_expr_wfl (stmt, input_filename, 0, 0);
8833 EXPR_WFL_LINECOL (stmt) = location;
8835 JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
8840 build_expr_block (body, decls)
8843 tree node = make_node (BLOCK);
8844 BLOCK_EXPR_DECLS (node) = decls;
8845 BLOCK_EXPR_BODY (node) = body;
8847 TREE_TYPE (node) = TREE_TYPE (body);
8848 TREE_SIDE_EFFECTS (node) = 1;
8852 /* Create a new function block and link it approriately to current
8853 function block chain */
8858 return (enter_a_block (build_expr_block (NULL_TREE, NULL_TREE)));
8861 /* Link block B supercontext to the previous block. The current
8862 function DECL is used as supercontext when enter_a_block is called
8863 for the first time for a given function. The current function body
8864 (DECL_FUNCTION_BODY) is set to be block B. */
8870 tree fndecl = current_function_decl;
8873 BLOCK_SUPERCONTEXT (b) = current_static_block;
8874 current_static_block = b;
8877 else if (!DECL_FUNCTION_BODY (fndecl))
8879 BLOCK_SUPERCONTEXT (b) = fndecl;
8880 DECL_FUNCTION_BODY (fndecl) = b;
8884 BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
8885 DECL_FUNCTION_BODY (fndecl) = b;
8890 /* Exit a block by changing the current function body
8891 (DECL_FUNCTION_BODY) to the current block super context, only if
8892 the block being exited isn't the method's top level one. */
8898 if (current_function_decl)
8900 b = DECL_FUNCTION_BODY (current_function_decl);
8901 if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
8902 DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
8906 b = current_static_block;
8908 if (BLOCK_SUPERCONTEXT (b))
8909 current_static_block = BLOCK_SUPERCONTEXT (b);
8914 /* Lookup for NAME in the nested function's blocks, all the way up to
8915 the current toplevel one. It complies with Java's local variable
8919 lookup_name_in_blocks (name)
8922 tree b = GET_CURRENT_BLOCK (current_function_decl);
8924 while (b != current_function_decl)
8928 /* Paranoid sanity check. To be removed */
8929 if (TREE_CODE (b) != BLOCK)
8930 fatal ("non block expr function body - lookup_name_in_blocks");
8932 for (current = BLOCK_EXPR_DECLS (b); current;
8933 current = TREE_CHAIN (current))
8934 if (DECL_NAME (current) == name)
8936 b = BLOCK_SUPERCONTEXT (b);
8942 maybe_absorb_scoping_blocks ()
8944 while (BLOCK_EXPR_ORIGIN (GET_CURRENT_BLOCK (current_function_decl)))
8946 tree b = exit_block ();
8947 java_method_add_stmt (current_function_decl, b);
8948 SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", lineno));
8953 /* This section of the source is reserved to build_* functions that
8954 are building incomplete tree nodes and the patch_* functions that
8955 are completing them. */
8957 /* Build a super() constructor invocation. Returns empty_stmt_node if
8958 we're currently dealing with the class java.lang.Object. */
8961 build_super_invocation (mdecl)
8964 if (DECL_CONTEXT (mdecl) == object_type_node)
8965 return empty_stmt_node;
8968 tree super_wfl = build_wfl_node (super_identifier_node);
8969 return build_method_invocation (super_wfl, NULL_TREE);
8973 /* Build a SUPER/THIS qualified method invocation. */
8976 build_this_super_qualified_invocation (use_this, name, args, lloc, rloc)
8984 build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
8985 EXPR_WFL_LINECOL (wfl) = lloc;
8986 invok = build_method_invocation (name, args);
8987 return make_qualified_primary (wfl, invok, rloc);
8990 /* Build an incomplete CALL_EXPR node. */
8993 build_method_invocation (name, args)
8997 tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
8998 TREE_SIDE_EFFECTS (call) = 1;
8999 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
9003 /* Build an incomplete new xxx(...) node. */
9006 build_new_invocation (name, args)
9009 tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
9010 TREE_SIDE_EFFECTS (call) = 1;
9011 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
9015 /* Build an incomplete assignment expression. */
9018 build_assignment (op, op_location, lhs, rhs)
9019 int op, op_location;
9023 /* Build the corresponding binop if we deal with a Compound
9024 Assignment operator. Mark the binop sub-tree as part of a
9025 Compound Assignment expression */
9026 if (op != ASSIGN_TK)
9028 rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
9029 COMPOUND_ASSIGN_P (rhs) = 1;
9031 assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
9032 TREE_SIDE_EFFECTS (assignment) = 1;
9033 EXPR_WFL_LINECOL (assignment) = op_location;
9037 /* Print an INTEGER_CST node in a static buffer, and return the buffer. */
9040 print_int_node (node)
9043 static char buffer [80];
9044 if (TREE_CONSTANT_OVERFLOW (node))
9045 sprintf (buffer, "<overflow>");
9047 if (TREE_INT_CST_HIGH (node) == 0)
9048 sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
9049 TREE_INT_CST_LOW (node));
9050 else if (TREE_INT_CST_HIGH (node) == -1
9051 && TREE_INT_CST_LOW (node) != 0)
9054 sprintf (&buffer [1], HOST_WIDE_INT_PRINT_UNSIGNED,
9055 -TREE_INT_CST_LOW (node));
9058 sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
9059 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
9064 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
9068 check_final_assignment (lvalue, wfl)
9071 if (JDECL_P (lvalue)
9072 && FIELD_FINAL (lvalue) && !IS_CLINIT (current_function_decl))
9075 (wfl, "Can't assign a value to the final variable `%s'",
9076 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
9082 /* Inline references to java.lang.PRIMTYPE.TYPE when accessed in
9083 read. This is needed to avoid circularities in the implementation
9084 of these fields in libjava. */
9087 maybe_build_primttype_type_ref (rhs, wfl)
9090 tree to_return = NULL_TREE;
9091 tree rhs_type = TREE_TYPE (rhs);
9092 if (TREE_CODE (rhs) == COMPOUND_EXPR)
9094 tree n = TREE_OPERAND (rhs, 1);
9095 if (TREE_CODE (n) == VAR_DECL
9096 && DECL_NAME (n) == TYPE_identifier_node
9097 && rhs_type == class_ptr_type)
9099 const char *self_name = IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl));
9100 if (!strncmp (self_name, "java.lang.", 10))
9101 to_return = build_primtype_type_ref (self_name);
9104 return (to_return ? to_return : rhs );
9107 /* 15.25 Assignment operators. */
9110 patch_assignment (node, wfl_op1, wfl_op2)
9115 tree rhs = TREE_OPERAND (node, 1);
9116 tree lvalue = TREE_OPERAND (node, 0), llvalue;
9117 tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
9118 int error_found = 0;
9119 int lvalue_from_array = 0;
9121 /* Can't assign to a final. */
9122 if (check_final_assignment (lvalue, wfl_op1))
9125 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
9127 /* Lhs can be a named variable */
9128 if (JDECL_P (lvalue))
9130 lhs_type = TREE_TYPE (lvalue);
9132 /* Or Lhs can be a array acccess. Should that be lvalue ? FIXME +
9133 comment on reason why */
9134 else if (TREE_CODE (wfl_op1) == ARRAY_REF)
9136 lhs_type = TREE_TYPE (lvalue);
9137 lvalue_from_array = 1;
9139 /* Or a field access */
9140 else if (TREE_CODE (lvalue) == COMPONENT_REF)
9141 lhs_type = TREE_TYPE (lvalue);
9142 /* Or a function return slot */
9143 else if (TREE_CODE (lvalue) == RESULT_DECL)
9144 lhs_type = TREE_TYPE (lvalue);
9145 /* Otherwise, we might want to try to write into an optimized static
9146 final, this is an of a different nature, reported further on. */
9147 else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
9148 && resolve_expression_name (wfl_op1, &llvalue))
9150 if (check_final_assignment (llvalue, wfl_op1))
9152 /* What we should do instead is resetting the all the flags
9153 previously set, exchange lvalue for llvalue and continue. */
9155 return error_mark_node;
9158 lhs_type = TREE_TYPE (lvalue);
9162 parse_error_context (wfl_op1, "Invalid left hand side of assignment");
9166 rhs_type = TREE_TYPE (rhs);
9167 /* 5.1 Try the assignment conversion for builtin type. */
9168 new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
9170 /* 5.2 If it failed, try a reference conversion */
9171 if (!new_rhs && (new_rhs = try_reference_assignconv (lhs_type, rhs)))
9172 lhs_type = promote_type (rhs_type);
9174 /* 15.25.2 If we have a compound assignment, convert RHS into the
9176 else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
9177 new_rhs = convert (lhs_type, rhs);
9179 /* Explicit cast required. This is an error */
9182 char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
9183 char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
9185 char operation [32]; /* Max size known */
9187 /* If the assignment is part of a declaration, we use the WFL of
9188 the declared variable to point out the error and call it a
9189 declaration problem. If the assignment is a genuine =
9190 operator, we call is a operator `=' problem, otherwise we
9191 call it an assignment problem. In both of these last cases,
9192 we use the WFL of the operator to indicate the error. */
9194 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
9197 strcpy (operation, "declaration");
9202 if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
9203 strcpy (operation, "assignment");
9204 else if (TREE_CODE (TREE_OPERAND (node, 0)) == RESULT_DECL)
9205 strcpy (operation, "`return'");
9207 strcpy (operation, "`='");
9210 if (!valid_cast_to_p (rhs_type, lhs_type))
9211 parse_error_context (wfl, "Incompatible type for %s. "
9212 "Can't convert `%s' to `%s'",
9215 parse_error_context (wfl, "Incompatible type for %s. "
9216 "Explicit cast needed to convert `%s' to `%s'",
9218 free (t1); free (t2);
9222 /* Inline read access to java.lang.PRIMTYPE.TYPE */
9224 new_rhs = maybe_build_primttype_type_ref (new_rhs, wfl_op2);
9227 return error_mark_node;
9229 /* 10.10: Array Store Exception runtime check */
9230 if (!flag_emit_class_files
9232 && lvalue_from_array
9233 && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
9238 /* We need to retrieve the right argument for _Jv_CheckArrayStore */
9239 if (TREE_CODE (lvalue) == COMPOUND_EXPR)
9240 base = TREE_OPERAND (lvalue, 0);
9243 if (flag_bounds_check)
9244 base = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (base, 0), 1), 0);
9246 base = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
9249 /* Build the invocation of _Jv_CheckArrayStore */
9250 new_rhs = save_expr (new_rhs);
9251 check = build (CALL_EXPR, void_type_node,
9252 build_address_of (soft_checkarraystore_node),
9253 tree_cons (NULL_TREE, base,
9254 build_tree_list (NULL_TREE, new_rhs)),
9256 TREE_SIDE_EFFECTS (check) = 1;
9258 /* We have to decide on an insertion point */
9259 if (TREE_CODE (lvalue) == COMPOUND_EXPR)
9262 if (flag_bounds_check)
9264 t = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (lvalue, 1), 0), 0);
9265 TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (lvalue, 1), 0), 0) =
9266 build (COMPOUND_EXPR, void_type_node, t, check);
9269 TREE_OPERAND (lvalue, 1) = build (COMPOUND_EXPR, lhs_type,
9270 check, TREE_OPERAND (lvalue, 1));
9274 /* Make sure the bound check will happen before the store check */
9275 if (flag_bounds_check)
9276 TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0) =
9277 build (COMPOUND_EXPR, void_type_node,
9278 TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0), check);
9280 lvalue = build (COMPOUND_EXPR, lhs_type, check, lvalue);
9284 TREE_OPERAND (node, 0) = lvalue;
9285 TREE_OPERAND (node, 1) = new_rhs;
9286 TREE_TYPE (node) = lhs_type;
9290 /* Check that type SOURCE can be cast into type DEST. If the cast
9291 can't occur at all, return 0 otherwise 1. This function is used to
9292 produce accurate error messages on the reasons why an assignment
9296 try_reference_assignconv (lhs_type, rhs)
9299 tree new_rhs = NULL_TREE;
9300 tree rhs_type = TREE_TYPE (rhs);
9302 if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
9304 /* `null' may be assigned to any reference type */
9305 if (rhs == null_pointer_node)
9306 new_rhs = null_pointer_node;
9307 /* Try the reference assignment conversion */
9308 else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
9310 /* This is a magic assignment that we process differently */
9311 else if (rhs == soft_exceptioninfo_call_node)
9317 /* Check that RHS can be converted into LHS_TYPE by the assignment
9318 conversion (5.2), for the cases of RHS being a builtin type. Return
9319 NULL_TREE if the conversion fails or if because RHS isn't of a
9320 builtin type. Return a converted RHS if the conversion is possible. */
9323 try_builtin_assignconv (wfl_op1, lhs_type, rhs)
9324 tree wfl_op1, lhs_type, rhs;
9326 tree new_rhs = NULL_TREE;
9327 tree rhs_type = TREE_TYPE (rhs);
9329 /* Zero accepted everywhere */
9330 if (TREE_CODE (rhs) == INTEGER_CST
9331 && TREE_INT_CST_HIGH (rhs) == 0 && TREE_INT_CST_LOW (rhs) == 0
9332 && JPRIMITIVE_TYPE_P (rhs_type))
9333 new_rhs = convert (lhs_type, rhs);
9335 /* 5.1.1 Try Identity Conversion,
9336 5.1.2 Try Widening Primitive Conversion */
9337 else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
9338 new_rhs = convert (lhs_type, rhs);
9340 /* Try a narrowing primitive conversion (5.1.3):
9341 - expression is a constant expression of type int AND
9342 - variable is byte, short or char AND
9343 - The value of the expression is representable in the type of the
9345 else if (rhs_type == int_type_node && TREE_CONSTANT (rhs)
9346 && (lhs_type == byte_type_node || lhs_type == char_type_node
9347 || lhs_type == short_type_node))
9349 if (int_fits_type_p (rhs, lhs_type))
9350 new_rhs = convert (lhs_type, rhs);
9351 else if (wfl_op1) /* Might be called with a NULL */
9352 parse_warning_context
9353 (wfl_op1, "Constant expression `%s' to wide for narrowing "
9354 "primitive conversion to `%s'",
9355 print_int_node (rhs), lang_printable_name (lhs_type, 0));
9356 /* Reported a warning that will turn into an error further
9357 down, so we don't return */
9363 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
9364 conversion (5.1.1) or widening primitve conversion (5.1.2). Return
9365 0 is the conversion test fails. This implements parts the method
9366 invocation convertion (5.3). */
9369 valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type)
9370 tree lhs_type, rhs_type;
9372 /* 5.1.1: This is the identity conversion part. */
9373 if (lhs_type == rhs_type)
9376 /* Reject non primitive types */
9377 if (!JPRIMITIVE_TYPE_P (lhs_type) || !JPRIMITIVE_TYPE_P (rhs_type))
9380 /* 5.1.2: widening primitive conversion. byte, even if it's smaller
9381 than a char can't be converted into a char. Short can't too, but
9382 the < test below takes care of that */
9383 if (lhs_type == char_type_node && rhs_type == byte_type_node)
9386 /* Accept all promoted type here. Note, we can't use <= in the test
9387 below, because we still need to bounce out assignments of short
9388 to char and the likes */
9389 if (lhs_type == int_type_node
9390 && (rhs_type == promoted_byte_type_node
9391 || rhs_type == promoted_short_type_node
9392 || rhs_type == promoted_char_type_node
9393 || rhs_type == promoted_boolean_type_node))
9396 /* From here, an integral is widened if its precision is smaller
9397 than the precision of the LHS or if the LHS is a floating point
9398 type, or the RHS is a float and the RHS a double. */
9399 if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
9400 && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
9401 || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
9402 || (rhs_type == float_type_node && lhs_type == double_type_node))
9408 /* Check that something of SOURCE type can be assigned or cast to
9409 something of DEST type at runtime. Return 1 if the operation is
9410 valid, 0 otherwise. If CAST is set to 1, we're treating the case
9411 were SOURCE is cast into DEST, which borrows a lot of the
9412 assignment check. */
9415 valid_ref_assignconv_cast_p (source, dest, cast)
9420 /* SOURCE or DEST might be null if not from a declared entity. */
9421 if (!source || !dest)
9423 if (JNULLP_TYPE_P (source))
9425 if (TREE_CODE (source) == POINTER_TYPE)
9426 source = TREE_TYPE (source);
9427 if (TREE_CODE (dest) == POINTER_TYPE)
9428 dest = TREE_TYPE (dest);
9429 /* Case where SOURCE is a class type */
9430 if (TYPE_CLASS_P (source))
9432 if (TYPE_CLASS_P (dest))
9433 return source == dest || inherits_from_p (source, dest)
9434 || (cast && inherits_from_p (dest, source));
9435 if (TYPE_INTERFACE_P (dest))
9437 /* If doing a cast and SOURCE is final, the operation is
9438 always correct a compile time (because even if SOURCE
9439 does not implement DEST, a subclass of SOURCE might). */
9440 if (cast && !CLASS_FINAL (TYPE_NAME (source)))
9442 /* Otherwise, SOURCE must implement DEST */
9443 return interface_of_p (dest, source);
9445 /* DEST is an array, cast permited if SOURCE is of Object type */
9446 return (cast && source == object_type_node ? 1 : 0);
9448 if (TYPE_INTERFACE_P (source))
9450 if (TYPE_CLASS_P (dest))
9452 /* If not casting, DEST must be the Object type */
9454 return dest == object_type_node;
9455 /* We're doing a cast. The cast is always valid is class
9456 DEST is not final, otherwise, DEST must implement SOURCE */
9457 else if (!CLASS_FINAL (TYPE_NAME (dest)))
9460 return interface_of_p (source, dest);
9462 if (TYPE_INTERFACE_P (dest))
9464 /* If doing a cast, then if SOURCE and DEST contain method
9465 with the same signature but different return type, then
9466 this is a (compile time) error */
9469 tree method_source, method_dest;
9473 for (method_source = TYPE_METHODS (source); method_source;
9474 method_source = TREE_CHAIN (method_source))
9477 build_java_argument_signature (TREE_TYPE (method_source));
9478 source_type = TREE_TYPE (TREE_TYPE (method_source));
9479 source_name = DECL_NAME (method_source);
9480 for (method_dest = TYPE_METHODS (dest);
9481 method_dest; method_dest = TREE_CHAIN (method_dest))
9483 build_java_argument_signature (TREE_TYPE (method_dest))
9484 && source_name == DECL_NAME (method_dest)
9485 && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
9491 return source == dest || interface_of_p (dest, source);
9495 (DECL_NAME (TYPE_NAME (source)) == java_lang_cloneable) : 0);
9497 if (TYPE_ARRAY_P (source))
9499 if (TYPE_CLASS_P (dest))
9500 return dest == object_type_node;
9501 /* Can't cast an array to an interface unless the interface is
9502 java.lang.Cloneable */
9503 if (TYPE_INTERFACE_P (dest))
9504 return (DECL_NAME (TYPE_NAME (dest)) == java_lang_cloneable ? 1 : 0);
9507 tree source_element_type = TYPE_ARRAY_ELEMENT (source);
9508 tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
9510 /* In case of severe errors, they turn out null */
9511 if (!dest_element_type || !source_element_type)
9513 if (source_element_type == dest_element_type)
9515 return valid_ref_assignconv_cast_p (source_element_type,
9516 dest_element_type, cast);
9524 valid_cast_to_p (source, dest)
9528 if (TREE_CODE (source) == POINTER_TYPE)
9529 source = TREE_TYPE (source);
9530 if (TREE_CODE (dest) == POINTER_TYPE)
9531 dest = TREE_TYPE (dest);
9533 if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
9534 return valid_ref_assignconv_cast_p (source, dest, 1);
9536 else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
9542 /* Method invocation conversion test. Return 1 if type SOURCE can be
9543 converted to type DEST through the methond invocation conversion
9547 do_unary_numeric_promotion (arg)
9550 tree type = TREE_TYPE (arg);
9551 if (TREE_CODE (type) == INTEGER_TYPE ? TYPE_PRECISION (type) < 32
9552 : TREE_CODE (type) == CHAR_TYPE)
9553 arg = convert (int_type_node, arg);
9557 /* Return a non zero value if SOURCE can be converted into DEST using
9558 the method invocation conversion rule (5.3). */
9560 valid_method_invocation_conversion_p (dest, source)
9563 return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
9564 && valid_builtin_assignconv_identity_widening_p (dest, source))
9565 || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
9566 && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
9567 && valid_ref_assignconv_cast_p (source, dest, 0)));
9570 /* Build an incomplete binop expression. */
9573 build_binop (op, op_location, op1, op2)
9578 tree binop = build (op, NULL_TREE, op1, op2);
9579 TREE_SIDE_EFFECTS (binop) = 1;
9580 /* Store the location of the operator, for better error report. The
9581 string of the operator will be rebuild based on the OP value. */
9582 EXPR_WFL_LINECOL (binop) = op_location;
9586 /* Build the string of the operator retained by NODE. If NODE is part
9587 of a compound expression, add an '=' at the end of the string. This
9588 function is called when an error needs to be reported on an
9589 operator. The string is returned as a pointer to a static character
9593 operator_string (node)
9596 #define BUILD_OPERATOR_STRING(S) \
9598 sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
9602 static char buffer [10];
9603 switch (TREE_CODE (node))
9605 case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
9606 case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
9607 case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
9608 case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
9609 case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
9610 case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
9611 case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
9612 case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
9613 case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
9614 case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
9615 case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
9616 case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
9617 case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
9618 case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
9619 case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
9620 case GT_EXPR: BUILD_OPERATOR_STRING (">");
9621 case GE_EXPR: BUILD_OPERATOR_STRING (">=");
9622 case LT_EXPR: BUILD_OPERATOR_STRING ("<");
9623 case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
9624 case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
9625 case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
9626 case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
9627 case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
9628 case PREINCREMENT_EXPR: /* Fall through */
9629 case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
9630 case PREDECREMENT_EXPR: /* Fall through */
9631 case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
9633 fatal ("unregistered operator %s - operator_string",
9634 tree_code_name [TREE_CODE (node)]);
9637 #undef BUILD_OPERATOR_STRING
9640 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2. */
9643 java_decl_equiv (var_acc1, var_acc2)
9644 tree var_acc1, var_acc2;
9646 if (JDECL_P (var_acc1))
9647 return (var_acc1 == var_acc2);
9649 return (TREE_CODE (var_acc1) == COMPONENT_REF
9650 && TREE_CODE (var_acc2) == COMPONENT_REF
9651 && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
9652 == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
9653 && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
9656 /* Return a non zero value if CODE is one of the operators that can be
9657 used in conjunction with the `=' operator in a compound assignment. */
9660 binop_compound_p (code)
9661 enum tree_code code;
9664 for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
9665 if (binop_lookup [i] == code)
9668 return i < BINOP_COMPOUND_CANDIDATES;
9671 /* Reorganize after a fold to get SAVE_EXPR to generate what we want. */
9677 tree c, b, ns, decl;
9679 if (TREE_CODE (t) != MODIFY_EXPR)
9682 c = TREE_OPERAND (t, 1);
9683 if (! (c && TREE_CODE (c) == COMPOUND_EXPR
9684 && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
9685 && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
9688 /* Now the left branch of the binary operator. */
9689 b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
9690 if (! (b && TREE_CODE (b) == NOP_EXPR
9691 && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
9694 ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
9695 if (! (ns && TREE_CODE (ns) == NOP_EXPR
9696 && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
9699 decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
9700 if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
9701 /* It's got to be the an equivalent decl */
9702 && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
9704 /* Shorten the NOP_EXPR/SAVE_EXPR path. */
9705 TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
9706 /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
9707 TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
9708 /* Change the right part of the BINOP_EXPR */
9709 TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
9715 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
9716 errors but we modify NODE so that it contains the type computed
9717 according to the expression, when it's fixed. Otherwise, we write
9718 error_mark_node as the type. It allows us to further the analysis
9719 of remaining nodes and detects more errors in certain cases. */
9722 patch_binop (node, wfl_op1, wfl_op2)
9727 tree op1 = TREE_OPERAND (node, 0);
9728 tree op2 = TREE_OPERAND (node, 1);
9729 tree op1_type = TREE_TYPE (op1);
9730 tree op2_type = TREE_TYPE (op2);
9731 tree prom_type = NULL_TREE;
9732 int code = TREE_CODE (node);
9734 /* If 1, tell the routine that we have to return error_mark_node
9735 after checking for the initialization of the RHS */
9736 int error_found = 0;
9738 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
9742 /* 15.16 Multiplicative operators */
9743 case MULT_EXPR: /* 15.16.1 Multiplication Operator * */
9744 case RDIV_EXPR: /* 15.16.2 Division Operator / */
9745 case TRUNC_MOD_EXPR: /* 15.16.3 Remainder operator % */
9746 if (!JPRIMITIVE_TYPE_P (op1_type) || !JPRIMITIVE_TYPE_P (op2_type))
9748 if (!JPRIMITIVE_TYPE_P (op1_type))
9749 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
9750 if (!JPRIMITIVE_TYPE_P (op2_type) && (op1_type != op2_type))
9751 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
9752 TREE_TYPE (node) = error_mark_node;
9756 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
9757 /* Change the division operator if necessary */
9758 if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
9759 TREE_SET_CODE (node, TRUNC_DIV_EXPR);
9761 if (TREE_CODE (prom_type) == INTEGER_TYPE
9762 && flag_use_divide_subroutine
9763 && ! flag_emit_class_files
9764 && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
9765 return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
9767 /* This one is more complicated. FLOATs are processed by a
9768 function call to soft_fmod. Duplicate the value of the
9769 COMPOUND_ASSIGN_P flag. */
9770 if (code == TRUNC_MOD_EXPR)
9772 tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
9773 COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
9774 TREE_SIDE_EFFECTS (mod)
9775 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
9780 /* 15.17 Additive Operators */
9781 case PLUS_EXPR: /* 15.17.1 String Concatenation Operator + */
9783 /* Operation is valid if either one argument is a string
9784 constant, a String object or a StringBuffer crafted for the
9785 purpose of the a previous usage of the String concatenation
9788 if (TREE_CODE (op1) == STRING_CST
9789 || TREE_CODE (op2) == STRING_CST
9790 || JSTRING_TYPE_P (op1_type)
9791 || JSTRING_TYPE_P (op2_type)
9792 || IS_CRAFTED_STRING_BUFFER_P (op1)
9793 || IS_CRAFTED_STRING_BUFFER_P (op2))
9794 return build_string_concatenation (op1, op2);
9796 case MINUS_EXPR: /* 15.17.2 Additive Operators (+ and -) for
9798 if (!JPRIMITIVE_TYPE_P (op1_type) || !JPRIMITIVE_TYPE_P (op2_type))
9800 if (!JPRIMITIVE_TYPE_P (op1_type))
9801 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
9802 if (!JPRIMITIVE_TYPE_P (op2_type) && (op1_type != op2_type))
9803 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
9804 TREE_TYPE (node) = error_mark_node;
9808 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
9811 /* 15.18 Shift Operators */
9815 if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
9817 if (!JINTEGRAL_TYPE_P (op1_type))
9818 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
9821 if (JPRIMITIVE_TYPE_P (op2_type))
9822 parse_error_context (wfl_operator,
9823 "Incompatible type for `%s'. "
9824 "Explicit cast needed to convert "
9825 "shift distance from `%s' to integral",
9826 operator_string (node),
9827 lang_printable_name (op2_type, 0));
9829 parse_error_context (wfl_operator, "Incompatible type for `%s'."
9830 " Can't convert shift distance from "
9832 operator_string (node),
9833 lang_printable_name (op2_type, 0));
9835 TREE_TYPE (node) = error_mark_node;
9840 /* Unary numeric promotion (5.6.1) is performed on each operand
9842 op1 = do_unary_numeric_promotion (op1);
9843 op2 = do_unary_numeric_promotion (op2);
9845 /* The type of the shift expression is the type of the promoted
9846 type of the left-hand operand */
9847 prom_type = TREE_TYPE (op1);
9849 /* Shift int only up to 0x1f and long up to 0x3f */
9850 if (prom_type == int_type_node)
9851 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
9852 build_int_2 (0x1f, 0)));
9854 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
9855 build_int_2 (0x3f, 0)));
9857 /* The >>> operator is a >> operating on unsigned quantities */
9858 if (code == URSHIFT_EXPR && ! flag_emit_class_files)
9861 tree utype = unsigned_type (prom_type);
9862 op1 = convert (utype, op1);
9863 TREE_SET_CODE (node, RSHIFT_EXPR);
9864 TREE_OPERAND (node, 0) = op1;
9865 TREE_OPERAND (node, 1) = op2;
9866 TREE_TYPE (node) = utype;
9867 to_return = convert (prom_type, node);
9868 /* Copy the original value of the COMPOUND_ASSIGN_P flag */
9869 COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
9870 TREE_SIDE_EFFECTS (to_return)
9871 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
9876 /* 15.19.1 Type Comparison Operator instaceof */
9877 case INSTANCEOF_EXPR:
9879 TREE_TYPE (node) = boolean_type_node;
9881 if (!(op2_type = resolve_type_during_patch (op2)))
9882 return error_mark_node;
9884 /* The first operand must be a reference type or the null type */
9885 if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
9886 error_found = 1; /* Error reported further below */
9888 /* The second operand must be a reference type */
9889 if (!JREFERENCE_TYPE_P (op2_type))
9891 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
9893 (wfl_operator, "Invalid argument `%s' for `instanceof'",
9894 lang_printable_name (op2_type, 0));
9898 if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
9900 /* If the first operand is null, the result is always false */
9901 if (op1 == null_pointer_node)
9902 return boolean_false_node;
9903 else if (flag_emit_class_files)
9905 TREE_OPERAND (node, 1) = op2_type;
9906 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
9909 /* Otherwise we have to invoke instance of to figure it out */
9913 build (CALL_EXPR, boolean_type_node,
9914 build_address_of (soft_instanceof_node),
9917 build_tree_list (NULL_TREE,
9918 build_class_ref (op2_type))),
9920 TREE_SIDE_EFFECTS (call) = TREE_SIDE_EFFECTS (op1);
9924 /* There is no way the expression operand can be an instance of
9925 the type operand. This is a compile time error. */
9928 char *t1 = xstrdup (lang_printable_name (op1_type, 0));
9929 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
9931 (wfl_operator, "Impossible for `%s' to be instance of `%s'",
9932 t1, lang_printable_name (op2_type, 0));
9939 /* 15.21 Bitwise and Logical Operators */
9943 if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
9944 /* Binary numeric promotion is performed on both operand and the
9945 expression retain that type */
9946 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
9948 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
9949 && TREE_CODE (op1_type) == BOOLEAN_TYPE)
9950 /* The type of the bitwise operator expression is BOOLEAN */
9951 prom_type = boolean_type_node;
9954 if (!JINTEGRAL_TYPE_P (op1_type))
9955 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
9956 if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
9957 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
9958 TREE_TYPE (node) = error_mark_node;
9960 /* Insert a break here if adding thing before the switch's
9961 break for this case */
9965 /* 15.22 Conditional-And Operator */
9966 case TRUTH_ANDIF_EXPR:
9967 /* 15.23 Conditional-Or Operator */
9968 case TRUTH_ORIF_EXPR:
9969 /* Operands must be of BOOLEAN type */
9970 if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
9971 TREE_CODE (op2_type) != BOOLEAN_TYPE)
9973 if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
9974 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
9975 if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
9976 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
9977 TREE_TYPE (node) = boolean_type_node;
9981 /* The type of the conditional operators is BOOLEAN */
9982 prom_type = boolean_type_node;
9985 /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
9990 /* The type of each of the operands must be a primitive numeric
9992 if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
9994 if (!JNUMERIC_TYPE_P (op1_type))
9995 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
9996 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
9997 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
9998 TREE_TYPE (node) = boolean_type_node;
10002 /* Binary numeric promotion is performed on the operands */
10003 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
10004 /* The type of the relation expression is always BOOLEAN */
10005 prom_type = boolean_type_node;
10008 /* 15.20 Equality Operator */
10011 /* 15.20.1 Numerical Equality Operators == and != */
10012 /* Binary numeric promotion is performed on the operands */
10013 if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
10014 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
10016 /* 15.20.2 Boolean Equality Operators == and != */
10017 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
10018 TREE_CODE (op2_type) == BOOLEAN_TYPE)
10019 ; /* Nothing to do here */
10021 /* 15.20.3 Reference Equality Operators == and != */
10022 /* Types have to be either references or the null type. If
10023 they're references, it must be possible to convert either
10024 type to the other by casting conversion. */
10025 else if (op1 == null_pointer_node || op2 == null_pointer_node
10026 || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
10027 && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
10028 || valid_ref_assignconv_cast_p (op2_type,
10030 ; /* Nothing to do here */
10032 /* Else we have an error figure what can't be converted into
10033 what and report the error */
10037 t1 = xstrdup (lang_printable_name (op1_type, 0));
10038 parse_error_context
10039 (wfl_operator, "Incompatible type for `%s'. Can't convert `%s' "
10040 "to `%s'", operator_string (node), t1,
10041 lang_printable_name (op2_type, 0));
10043 TREE_TYPE (node) = boolean_type_node;
10047 prom_type = boolean_type_node;
10052 return error_mark_node;
10054 TREE_OPERAND (node, 0) = op1;
10055 TREE_OPERAND (node, 1) = op2;
10056 TREE_TYPE (node) = prom_type;
10057 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
10059 if (flag_emit_xref)
10062 /* fold does not respect side-effect order as required for Java but not C.
10063 * Also, it sometimes create SAVE_EXPRs which are bad when emitting
10066 if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
10067 : ! TREE_SIDE_EFFECTS (node))
10068 node = fold (node);
10072 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
10073 zero value, the value of CSTE comes after the valude of STRING */
10076 do_merge_string_cste (cste, string, string_len, after)
10078 const char *string;
10079 int string_len, after;
10081 int len = TREE_STRING_LENGTH (cste) + string_len;
10082 const char *old = TREE_STRING_POINTER (cste);
10083 TREE_STRING_LENGTH (cste) = len;
10084 TREE_STRING_POINTER (cste) = obstack_alloc (expression_obstack, len+1);
10087 strcpy (TREE_STRING_POINTER (cste), string);
10088 strcat (TREE_STRING_POINTER (cste), old);
10092 strcpy (TREE_STRING_POINTER (cste), old);
10093 strcat (TREE_STRING_POINTER (cste), string);
10098 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
10099 new STRING_CST on success, NULL_TREE on failure */
10102 merge_string_cste (op1, op2, after)
10106 /* Handle two string constants right away */
10107 if (TREE_CODE (op2) == STRING_CST)
10108 return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
10109 TREE_STRING_LENGTH (op2), after);
10111 /* Reasonable integer constant can be treated right away */
10112 if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
10114 static const char *boolean_true = "true";
10115 static const char *boolean_false = "false";
10116 static const char *null_pointer = "null";
10118 const char *string;
10120 if (op2 == boolean_true_node)
10121 string = boolean_true;
10122 else if (op2 == boolean_false_node)
10123 string = boolean_false;
10124 else if (op2 == null_pointer_node)
10125 string = null_pointer;
10126 else if (TREE_TYPE (op2) == char_type_node)
10128 ch[0] = (char )TREE_INT_CST_LOW (op2);
10133 string = print_int_node (op2);
10135 return do_merge_string_cste (op1, string, strlen (string), after);
10140 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
10141 has to be a STRING_CST and the other part must be a STRING_CST or a
10142 INTEGRAL constant. Return a new STRING_CST if the operation
10143 succeed, NULL_TREE otherwise.
10145 If the case we want to optimize for space, we might want to return
10146 NULL_TREE for each invocation of this routine. FIXME */
10149 string_constant_concatenation (op1, op2)
10152 if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
10157 string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
10158 rest = (string == op1 ? op2 : op1);
10159 invert = (string == op1 ? 0 : 1 );
10161 /* Walk REST, only if it looks reasonable */
10162 if (TREE_CODE (rest) != STRING_CST
10163 && !IS_CRAFTED_STRING_BUFFER_P (rest)
10164 && !JSTRING_TYPE_P (TREE_TYPE (rest))
10165 && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
10167 rest = java_complete_tree (rest);
10168 if (rest == error_mark_node)
10169 return error_mark_node;
10170 rest = fold (rest);
10172 return merge_string_cste (string, rest, invert);
10177 /* Implement the `+' operator. Does static optimization if possible,
10178 otherwise create (if necessary) and append elements to a
10179 StringBuffer. The StringBuffer will be carried around until it is
10180 used for a function call or an assignment. Then toString() will be
10181 called on it to turn it into a String object. */
10184 build_string_concatenation (op1, op2)
10188 int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
10190 if (flag_emit_xref)
10191 return build (PLUS_EXPR, string_type_node, op1, op2);
10193 /* Try to do some static optimization */
10194 if ((result = string_constant_concatenation (op1, op2)))
10197 /* Discard empty strings on either side of the expression */
10198 if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
10203 else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
10206 /* If operands are string constant, turn then into object references */
10207 if (TREE_CODE (op1) == STRING_CST)
10208 op1 = patch_string_cst (op1);
10209 if (op2 && TREE_CODE (op2) == STRING_CST)
10210 op2 = patch_string_cst (op2);
10212 /* If either one of the constant is null and the other non null
10213 operand is a String object, return it. */
10214 if (JSTRING_TYPE_P (TREE_TYPE (op1)) && !op2)
10217 /* If OP1 isn't already a StringBuffer, create and
10218 initialize a new one */
10219 if (!IS_CRAFTED_STRING_BUFFER_P (op1))
10221 /* Two solutions here:
10222 1) OP1 is a string reference, we call new StringBuffer(OP1)
10223 2) OP1 is something else, we call new StringBuffer().append(OP1). */
10224 if (JSTRING_TYPE_P (TREE_TYPE (op1)))
10225 op1 = BUILD_STRING_BUFFER (op1);
10228 tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
10229 op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
10235 /* OP1 is no longer the last node holding a crafted StringBuffer */
10236 IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
10237 /* Create a node for `{new...,xxx}.append (op2)' */
10239 op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
10242 /* Mark the last node holding a crafted StringBuffer */
10243 IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
10245 TREE_SIDE_EFFECTS (op1) = side_effects;
10249 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
10250 StringBuffer. If no string were found to be patched, return
10254 patch_string (node)
10257 if (node == error_mark_node)
10258 return error_mark_node;
10259 if (TREE_CODE (node) == STRING_CST)
10260 return patch_string_cst (node);
10261 else if (IS_CRAFTED_STRING_BUFFER_P (node))
10263 int saved = ctxp->explicit_constructor_p;
10264 tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
10266 /* Temporary disable forbid the use of `this'. */
10267 ctxp->explicit_constructor_p = 0;
10268 ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
10269 /* Restore it at its previous value */
10270 ctxp->explicit_constructor_p = saved;
10276 /* Build the internal representation of a string constant. */
10279 patch_string_cst (node)
10283 if (! flag_emit_class_files)
10285 push_obstacks (&permanent_obstack, &permanent_obstack);
10286 node = get_identifier (TREE_STRING_POINTER (node));
10287 location = alloc_name_constant (CONSTANT_String, node);
10288 node = build_ref_from_constant_pool (location);
10291 TREE_TYPE (node) = string_ptr_type_node;
10292 TREE_CONSTANT (node) = 1;
10296 /* Build an incomplete unary operator expression. */
10299 build_unaryop (op_token, op_location, op1)
10300 int op_token, op_location;
10307 case PLUS_TK: op = UNARY_PLUS_EXPR; break;
10308 case MINUS_TK: op = NEGATE_EXPR; break;
10309 case NEG_TK: op = TRUTH_NOT_EXPR; break;
10310 case NOT_TK: op = BIT_NOT_EXPR; break;
10311 default: fatal ("Unknown token `%d' for unary operator - build_unaryop",
10315 unaryop = build1 (op, NULL_TREE, op1);
10316 TREE_SIDE_EFFECTS (unaryop) = 1;
10317 /* Store the location of the operator, for better error report. The
10318 string of the operator will be rebuild based on the OP value. */
10319 EXPR_WFL_LINECOL (unaryop) = op_location;
10323 /* Special case for the ++/-- operators, since they require an extra
10324 argument to build, which is set to NULL and patched
10325 later. IS_POST_P is 1 if the operator, 0 otherwise. */
10328 build_incdec (op_token, op_location, op1, is_post_p)
10329 int op_token, op_location;
10333 static enum tree_code lookup [2][2] =
10335 { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
10336 { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
10338 tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
10339 NULL_TREE, op1, NULL_TREE);
10340 TREE_SIDE_EFFECTS (node) = 1;
10341 /* Store the location of the operator, for better error report. The
10342 string of the operator will be rebuild based on the OP value. */
10343 EXPR_WFL_LINECOL (node) = op_location;
10347 /* Build an incomplete cast operator, based on the use of the
10348 CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
10349 set. java_complete_tree is trained to walk a CONVERT_EXPR even
10350 though its type is already set. */
10353 build_cast (location, type, exp)
10357 tree node = build1 (CONVERT_EXPR, type, exp);
10358 EXPR_WFL_LINECOL (node) = location;
10362 /* 15.14 Unary operators. We return error_mark_node in case of error,
10363 but preserve the type of NODE if the type is fixed. */
10366 patch_unaryop (node, wfl_op)
10370 tree op = TREE_OPERAND (node, 0);
10371 tree op_type = TREE_TYPE (op);
10372 tree prom_type = NULL_TREE, value, decl;
10373 int code = TREE_CODE (node);
10374 int error_found = 0;
10376 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
10380 /* 15.13.2 Postfix Increment Operator ++ */
10381 case POSTINCREMENT_EXPR:
10382 /* 15.13.3 Postfix Increment Operator -- */
10383 case POSTDECREMENT_EXPR:
10384 /* 15.14.1 Prefix Increment Operator ++ */
10385 case PREINCREMENT_EXPR:
10386 /* 15.14.2 Prefix Decrement Operator -- */
10387 case PREDECREMENT_EXPR:
10388 op = decl = strip_out_static_field_access_decl (op);
10389 /* We really should have a JAVA_ARRAY_EXPR to avoid this */
10390 if (!JDECL_P (decl)
10391 && TREE_CODE (decl) != COMPONENT_REF
10392 && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
10393 && TREE_CODE (decl) != INDIRECT_REF
10394 && !(TREE_CODE (decl) == COMPOUND_EXPR
10395 && TREE_OPERAND (decl, 1)
10396 && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
10399 /* Before screaming, check that we're not in fact trying to
10400 increment a optimized static final access, in which case
10401 we issue an different error message. */
10402 if (!(TREE_CODE (wfl_op) == EXPR_WITH_FILE_LOCATION
10403 && resolve_expression_name (wfl_op, &lvalue)
10404 && check_final_assignment (lvalue, wfl_op)))
10405 parse_error_context (wfl_operator, "Invalid argument to `%s'",
10406 operator_string (node));
10407 TREE_TYPE (node) = error_mark_node;
10410 else if (check_final_assignment (op, wfl_op))
10413 /* From now on, we know that op if a variable and that it has a
10414 valid wfl. We use wfl_op to locate errors related to the
10416 else if (!JNUMERIC_TYPE_P (op_type))
10418 parse_error_context
10419 (wfl_op, "Invalid argument type `%s' to `%s'",
10420 lang_printable_name (op_type, 0), operator_string (node));
10421 TREE_TYPE (node) = error_mark_node;
10426 /* Before the addition, binary numeric promotion is performed on
10427 both operands, if really necessary */
10428 if (JINTEGRAL_TYPE_P (op_type))
10430 value = build_int_2 (1, 0);
10431 TREE_TYPE (value) = TREE_TYPE (node) = op_type;
10435 value = build_int_2 (1, 0);
10437 binary_numeric_promotion (op_type,
10438 TREE_TYPE (value), &op, &value);
10440 /* And write back into the node. */
10441 TREE_OPERAND (node, 0) = op;
10442 TREE_OPERAND (node, 1) = value;
10443 /* Convert the overall back into its original type, if
10444 necessary, and return */
10445 if (JINTEGRAL_TYPE_P (op_type))
10446 return fold (node);
10448 return fold (convert (op_type, node));
10452 /* 15.14.3 Unary Plus Operator + */
10453 case UNARY_PLUS_EXPR:
10454 /* 15.14.4 Unary Minus Operator - */
10456 if (!JNUMERIC_TYPE_P (op_type))
10458 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
10459 TREE_TYPE (node) = error_mark_node;
10462 /* Unary numeric promotion is performed on operand */
10465 op = do_unary_numeric_promotion (op);
10466 prom_type = TREE_TYPE (op);
10467 if (code == UNARY_PLUS_EXPR)
10472 /* 15.14.5 Bitwise Complement Operator ~ */
10474 if (!JINTEGRAL_TYPE_P (op_type))
10476 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
10477 TREE_TYPE (node) = error_mark_node;
10482 op = do_unary_numeric_promotion (op);
10483 prom_type = TREE_TYPE (op);
10487 /* 15.14.6 Logical Complement Operator ! */
10488 case TRUTH_NOT_EXPR:
10489 if (TREE_CODE (op_type) != BOOLEAN_TYPE)
10491 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
10492 /* But the type is known. We will report an error if further
10493 attempt of a assignment is made with this rhs */
10494 TREE_TYPE (node) = boolean_type_node;
10498 prom_type = boolean_type_node;
10501 /* 15.15 Cast Expression */
10503 value = patch_cast (node, wfl_operator);
10504 if (value == error_mark_node)
10506 /* If this cast is part of an assignment, we tell the code
10507 that deals with it not to complain about a mismatch,
10508 because things have been cast, anyways */
10509 TREE_TYPE (node) = error_mark_node;
10514 value = fold (value);
10515 TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
10522 return error_mark_node;
10524 /* There are cases where node has been replaced by something else
10525 and we don't end up returning here: UNARY_PLUS_EXPR,
10526 CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
10527 TREE_OPERAND (node, 0) = fold (op);
10528 TREE_TYPE (node) = prom_type;
10529 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
10530 return fold (node);
10533 /* Generic type resolution that sometimes takes place during node
10534 patching. Returned the resolved type or generate an error
10535 message. Return the resolved type or NULL_TREE. */
10538 resolve_type_during_patch (type)
10541 if (unresolved_type_p (type, NULL))
10543 tree type_decl = resolve_no_layout (EXPR_WFL_NODE (type), NULL_TREE);
10546 parse_error_context (type,
10547 "Class `%s' not found in type declaration",
10548 IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
10553 CLASS_LOADED_P (TREE_TYPE (type_decl)) = 1;
10554 return TREE_TYPE (type_decl);
10559 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
10560 found. Otherwise NODE or something meant to replace it is returned. */
10563 patch_cast (node, wfl_operator)
10567 tree op = TREE_OPERAND (node, 0);
10568 tree op_type = TREE_TYPE (op);
10569 tree cast_type = TREE_TYPE (node);
10572 /* First resolve OP_TYPE if unresolved */
10573 if (!(cast_type = resolve_type_during_patch (cast_type)))
10574 return error_mark_node;
10576 /* Check on cast that are proven correct at compile time */
10577 if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
10580 if (cast_type == op_type)
10583 /* float and double type are converted to the original type main
10584 variant and then to the target type. */
10585 if (JFLOAT_TYPE_P (op_type) && TREE_CODE (cast_type) == CHAR_TYPE)
10586 op = convert (integer_type_node, op);
10588 /* Try widening/narowwing convertion. Potentially, things need
10589 to be worked out in gcc so we implement the extreme cases
10590 correctly. fold_convert() needs to be fixed. */
10591 return convert (cast_type, op);
10594 /* It's also valid to cast a boolean into a boolean */
10595 if (op_type == boolean_type_node && cast_type == boolean_type_node)
10598 /* null can be casted to references */
10599 if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
10600 return build_null_of_type (cast_type);
10602 /* The remaining legal casts involve conversion between reference
10603 types. Check for their compile time correctness. */
10604 if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
10605 && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
10607 TREE_TYPE (node) = promote_type (cast_type);
10608 /* Now, the case can be determined correct at compile time if
10609 OP_TYPE can be converted into CAST_TYPE by assignment
10610 conversion (5.2) */
10612 if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
10614 TREE_SET_CODE (node, NOP_EXPR);
10618 if (flag_emit_class_files)
10620 TREE_SET_CODE (node, CONVERT_EXPR);
10624 /* The cast requires a run-time check */
10625 return build (CALL_EXPR, promote_type (cast_type),
10626 build_address_of (soft_checkcast_node),
10627 tree_cons (NULL_TREE, build_class_ref (cast_type),
10628 build_tree_list (NULL_TREE, op)),
10632 /* Any other casts are proven incorrect at compile time */
10633 t1 = xstrdup (lang_printable_name (op_type, 0));
10634 parse_error_context (wfl_operator, "Invalid cast from `%s' to `%s'",
10635 t1, lang_printable_name (cast_type, 0));
10637 return error_mark_node;
10640 /* Build a null constant and give it the type TYPE. */
10643 build_null_of_type (type)
10646 tree node = build_int_2 (0, 0);
10647 TREE_TYPE (node) = promote_type (type);
10651 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
10652 a list of indices. */
10654 build_array_ref (location, array, index)
10658 tree node = build (ARRAY_REF, NULL_TREE, array, index);
10659 EXPR_WFL_LINECOL (node) = location;
10663 /* 15.12 Array Access Expression */
10666 patch_array_ref (node)
10669 tree array = TREE_OPERAND (node, 0);
10670 tree array_type = TREE_TYPE (array);
10671 tree index = TREE_OPERAND (node, 1);
10672 tree index_type = TREE_TYPE (index);
10673 int error_found = 0;
10675 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
10677 if (TREE_CODE (array_type) == POINTER_TYPE)
10678 array_type = TREE_TYPE (array_type);
10680 /* The array reference must be an array */
10681 if (!TYPE_ARRAY_P (array_type))
10683 parse_error_context
10684 (wfl_operator, "`[]' can only be applied to arrays. It can't be "
10685 "applied to `%s'", lang_printable_name (array_type, 0));
10686 TREE_TYPE (node) = error_mark_node;
10690 /* The array index underdoes unary numeric promotion. The promoted
10691 type must be int */
10692 index = do_unary_numeric_promotion (index);
10693 if (TREE_TYPE (index) != int_type_node)
10695 if (valid_cast_to_p (index_type, int_type_node))
10696 parse_error_context (wfl_operator, "Incompatible type for `[]'. "
10697 "Explicit cast needed to convert `%s' to `int'",
10698 lang_printable_name (index_type, 0));
10700 parse_error_context (wfl_operator, "Incompatible type for `[]'. "
10701 "Can't convert `%s' to `int'",
10702 lang_printable_name (index_type, 0));
10703 TREE_TYPE (node) = error_mark_node;
10708 return error_mark_node;
10710 array_type = TYPE_ARRAY_ELEMENT (array_type);
10712 if (flag_emit_class_files || flag_emit_xref)
10714 TREE_OPERAND (node, 0) = array;
10715 TREE_OPERAND (node, 1) = index;
10719 /* The save_expr is for correct evaluation order. It would be cleaner
10720 to use force_evaluation_order (see comment there), but that is
10721 difficult when we also have to deal with bounds checking. */
10722 if (TREE_SIDE_EFFECTS (index))
10723 array = save_expr (array);
10724 node = build_java_arrayaccess (array, array_type, index);
10725 if (TREE_SIDE_EFFECTS (index))
10726 node = build (COMPOUND_EXPR, array_type, array, node);
10728 TREE_TYPE (node) = array_type;
10732 /* 15.9 Array Creation Expressions */
10735 build_newarray_node (type, dims, extra_dims)
10741 build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
10742 build_int_2 (extra_dims, 0));
10747 patch_newarray (node)
10750 tree type = TREE_OPERAND (node, 0);
10751 tree dims = TREE_OPERAND (node, 1);
10752 tree cdim, array_type;
10753 int error_found = 0;
10755 int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
10757 /* Dimension types are verified. It's better for the types to be
10758 verified in order. */
10759 for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
10762 tree dim = TREE_VALUE (cdim);
10764 /* Dim might have been saved during its evaluation */
10765 dim = (TREE_CODE (dim) == SAVE_EXPR ? dim = TREE_OPERAND (dim, 0) : dim);
10767 /* The type of each specified dimension must be an integral type. */
10768 if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
10771 /* Each expression undergoes an unary numeric promotion (5.6.1) and the
10772 promoted type must be int. */
10775 dim = do_unary_numeric_promotion (dim);
10776 if (TREE_TYPE (dim) != int_type_node)
10780 /* Report errors on types here */
10783 parse_error_context
10784 (TREE_PURPOSE (cdim),
10785 "Incompatible type for dimension in array creation expression. "
10786 "%s convert `%s' to `int'",
10787 (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
10788 "Explicit cast needed to" : "Can't"),
10789 lang_printable_name (TREE_TYPE (dim), 0));
10793 TREE_PURPOSE (cdim) = NULL_TREE;
10796 /* Resolve array base type if unresolved */
10797 if (!(type = resolve_type_during_patch (type)))
10802 /* We don't want further evaluation of this bogus array creation
10804 TREE_TYPE (node) = error_mark_node;
10805 return error_mark_node;
10808 /* Set array_type to the actual (promoted) array type of the result. */
10809 if (TREE_CODE (type) == RECORD_TYPE)
10810 type = build_pointer_type (type);
10811 while (--xdims >= 0)
10813 type = promote_type (build_java_array_type (type, -1));
10815 dims = nreverse (dims);
10817 for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
10820 array_type = build_java_array_type (type,
10821 TREE_CODE (cdim) == INTEGER_CST ?
10822 TREE_INT_CST_LOW (cdim) : -1);
10823 array_type = promote_type (array_type);
10825 dims = nreverse (dims);
10827 /* The node is transformed into a function call. Things are done
10828 differently according to the number of dimensions. If the number
10829 of dimension is equal to 1, then the nature of the base type
10830 (primitive or not) matters. */
10832 return build_new_array (type, TREE_VALUE (dims));
10834 /* Can't reuse what's already written in expr.c because it uses the
10835 JVM stack representation. Provide a build_multianewarray. FIXME */
10836 return build (CALL_EXPR, array_type,
10837 build_address_of (soft_multianewarray_node),
10838 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
10839 tree_cons (NULL_TREE,
10840 build_int_2 (ndims, 0), dims )),
10844 /* 10.6 Array initializer. */
10846 /* Build a wfl for array element that don't have one, so we can
10847 pin-point errors. */
10850 maybe_build_array_element_wfl (node)
10853 if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
10854 return build_expr_wfl (NULL_TREE, ctxp->filename,
10855 ctxp->elc.line, ctxp->elc.prev_col);
10860 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
10861 identification of initialized arrays easier to detect during walk
10865 build_new_array_init (location, values)
10869 tree constructor = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, values);
10870 tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
10871 EXPR_WFL_LINECOL (to_return) = location;
10875 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
10876 occurred. Otherwise return NODE after having set its type
10880 patch_new_array_init (type, node)
10883 int error_seen = 0;
10884 tree current, element_type;
10885 HOST_WIDE_INT length;
10886 int all_constant = 1;
10887 tree init = TREE_OPERAND (node, 0);
10889 if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
10891 parse_error_context (node,
10892 "Invalid array initializer for non-array type `%s'",
10893 lang_printable_name (type, 1));
10894 return error_mark_node;
10896 type = TREE_TYPE (type);
10897 element_type = TYPE_ARRAY_ELEMENT (type);
10899 CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
10901 for (length = 0, current = CONSTRUCTOR_ELTS (init);
10902 current; length++, current = TREE_CHAIN (current))
10904 tree elt = TREE_VALUE (current);
10905 if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
10907 error_seen |= array_constructor_check_entry (element_type, current);
10908 elt = TREE_VALUE (current);
10909 /* When compiling to native code, STRING_CST is converted to
10910 INDIRECT_REF, but still with a TREE_CONSTANT flag. */
10911 if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
10916 TREE_VALUE (current) = patch_new_array_init (element_type, elt);
10917 TREE_PURPOSE (current) = NULL_TREE;
10920 if (elt && TREE_VALUE (elt) == error_mark_node)
10925 return error_mark_node;
10927 /* Create a new type. We can't reuse the one we have here by
10928 patching its dimension because it originally is of dimension -1
10929 hence reused by gcc. This would prevent triangular arrays. */
10930 type = build_java_array_type (element_type, length);
10931 TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
10932 TREE_TYPE (node) = promote_type (type);
10933 TREE_CONSTANT (init) = all_constant;
10934 TREE_CONSTANT (node) = all_constant;
10938 /* Verify that one entry of the initializer element list can be
10939 assigned to the array base type. Report 1 if an error occurred, 0
10943 array_constructor_check_entry (type, entry)
10946 char *array_type_string = NULL; /* For error reports */
10947 tree value, type_value, new_value, wfl_value, patched;
10948 int error_seen = 0;
10950 new_value = NULL_TREE;
10951 wfl_value = TREE_VALUE (entry);
10953 push_obstacks (&permanent_obstack, &permanent_obstack);
10954 value = java_complete_tree (TREE_VALUE (entry));
10955 /* patch_string return error_mark_node if arg is error_mark_node */
10956 if ((patched = patch_string (value)))
10958 if (value == error_mark_node)
10961 type_value = TREE_TYPE (value);
10963 /* At anytime, try_builtin_assignconv can report a warning on
10964 constant overflow during narrowing. */
10965 SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
10966 new_value = try_builtin_assignconv (wfl_operator, type, value);
10967 if (!new_value && (new_value = try_reference_assignconv (type, value)))
10968 type_value = promote_type (type);
10971 /* Check and report errors */
10974 const char *msg = (!valid_cast_to_p (type_value, type) ?
10975 "Can't" : "Explicit cast needed to");
10976 if (!array_type_string)
10977 array_type_string = xstrdup (lang_printable_name (type, 1));
10978 parse_error_context
10979 (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
10980 msg, lang_printable_name (type_value, 1), array_type_string);
10986 new_value = maybe_build_primttype_type_ref (new_value, wfl_operator);
10987 TREE_VALUE (entry) = new_value;
10990 if (array_type_string)
10991 free (array_type_string);
10993 TREE_PURPOSE (entry) = NULL_TREE;
10998 build_this (location)
11001 tree node = build_wfl_node (this_identifier_node);
11002 TREE_SET_CODE (node, THIS_EXPR);
11003 EXPR_WFL_LINECOL (node) = location;
11007 /* 14.15 The return statement. It builds a modify expression that
11008 assigns the returned value to the RESULT_DECL that hold the value
11012 build_return (location, op)
11016 tree node = build1 (RETURN_EXPR, NULL_TREE, op);
11017 EXPR_WFL_LINECOL (node) = location;
11018 node = build_debugable_stmt (location, node);
11023 patch_return (node)
11026 tree return_exp = TREE_OPERAND (node, 0);
11027 tree meth = current_function_decl;
11028 tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
11029 int error_found = 0;
11031 TREE_TYPE (node) = error_mark_node;
11032 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11034 /* It's invalid to have a return value within a function that is
11035 declared with the keyword void or that is a constructor */
11036 if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
11039 /* It's invalid to use a return statement in a static block */
11040 if (IS_CLINIT (current_function_decl))
11043 /* It's invalid to have a no return value within a function that
11044 isn't declared with the keyword `void' */
11045 if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
11050 if (IS_CLINIT (current_function_decl))
11051 parse_error_context (wfl_operator,
11052 "`return' inside static initializer.");
11054 else if (!DECL_CONSTRUCTOR_P (meth))
11056 char *t = xstrdup (lang_printable_name (mtype, 0));
11057 parse_error_context (wfl_operator,
11058 "`return' with%s value from `%s %s'",
11059 (error_found == 1 ? "" : "out"),
11060 t, lang_printable_name (meth, 0));
11064 parse_error_context (wfl_operator,
11065 "`return' with value from constructor `%s'",
11066 lang_printable_name (meth, 0));
11067 return error_mark_node;
11070 /* If we have a return_exp, build a modify expression and expand
11071 it. Note: at that point, the assignment is declared valid, but we
11072 may want to carry some more hacks */
11075 tree exp = java_complete_tree (return_exp);
11076 tree modify, patched;
11078 /* If the function returned value and EXP are booleans, EXP has
11079 to be converted into the type of DECL_RESULT, which is integer
11080 (see complete_start_java_method) */
11081 if (TREE_TYPE (exp) == boolean_type_node &&
11082 TREE_TYPE (TREE_TYPE (meth)) == boolean_type_node)
11083 exp = convert_to_integer (TREE_TYPE (DECL_RESULT (meth)), exp);
11085 /* `null' can be assigned to a function returning a reference */
11086 if (JREFERENCE_TYPE_P (TREE_TYPE (TREE_TYPE (meth))) &&
11087 exp == null_pointer_node)
11088 exp = build_null_of_type (TREE_TYPE (TREE_TYPE (meth)));
11090 if ((patched = patch_string (exp)))
11093 modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
11094 EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
11095 modify = java_complete_tree (modify);
11097 if (modify != error_mark_node)
11099 TREE_SIDE_EFFECTS (modify) = 1;
11100 TREE_OPERAND (node, 0) = modify;
11103 return error_mark_node;
11105 TREE_TYPE (node) = void_type_node;
11106 TREE_SIDE_EFFECTS (node) = 1;
11110 /* 14.8 The if Statement */
11113 build_if_else_statement (location, expression, if_body, else_body)
11115 tree expression, if_body, else_body;
11119 else_body = empty_stmt_node;
11120 node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
11121 EXPR_WFL_LINECOL (node) = location;
11122 node = build_debugable_stmt (location, node);
11127 patch_if_else_statement (node)
11130 tree expression = TREE_OPERAND (node, 0);
11132 TREE_TYPE (node) = error_mark_node;
11133 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11135 /* The type of expression must be boolean */
11136 if (TREE_TYPE (expression) != boolean_type_node
11137 && TREE_TYPE (expression) != promoted_boolean_type_node)
11139 parse_error_context
11141 "Incompatible type for `if'. Can't convert `%s' to `boolean'",
11142 lang_printable_name (TREE_TYPE (expression), 0));
11143 return error_mark_node;
11146 TREE_TYPE (node) = void_type_node;
11147 TREE_SIDE_EFFECTS (node) = 1;
11148 CAN_COMPLETE_NORMALLY (node)
11149 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
11150 | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2));
11154 /* 14.6 Labeled Statements */
11156 /* Action taken when a lableled statement is parsed. a new
11157 LABELED_BLOCK_EXPR is created. No statement is attached to the
11158 label, yet. LABEL can be NULL_TREE for artificially-generated blocks. */
11161 build_labeled_block (location, label)
11166 tree label_decl, node;
11167 if (label == NULL_TREE || label == continue_identifier_node)
11168 label_name = label;
11171 label_name = merge_qualified_name (label_id, label);
11172 /* Issue an error if we try to reuse a label that was previously
11174 if (IDENTIFIER_LOCAL_VALUE (label_name))
11176 EXPR_WFL_LINECOL (wfl_operator) = location;
11177 parse_error_context (wfl_operator, "Declaration of `%s' shadows "
11178 "a previous label declaration",
11179 IDENTIFIER_POINTER (label));
11180 EXPR_WFL_LINECOL (wfl_operator) =
11181 EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
11182 parse_error_context (wfl_operator, "This is the location of the "
11183 "previous declaration of label `%s'",
11184 IDENTIFIER_POINTER (label));
11185 java_error_count--;
11189 label_decl = create_label_decl (label_name);
11190 node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
11191 EXPR_WFL_LINECOL (node) = location;
11192 TREE_SIDE_EFFECTS (node) = 1;
11196 /* A labeled statement LBE is attached a statement. */
11199 finish_labeled_statement (lbe, statement)
11200 tree lbe; /* Labeled block expr */
11203 /* In anyways, tie the loop to its statement */
11204 LABELED_BLOCK_BODY (lbe) = statement;
11205 pop_labeled_block ();
11206 POP_LABELED_BLOCK ();
11210 /* 14.10, 14.11, 14.12 Loop Statements */
11212 /* Create an empty LOOP_EXPR and make it the last in the nested loop
11216 build_new_loop (loop_body)
11219 tree loop = build (LOOP_EXPR, NULL_TREE, loop_body);
11220 TREE_SIDE_EFFECTS (loop) = 1;
11225 /* Create a loop body according to the following structure:
11227 COMPOUND_EXPR (loop main body)
11228 EXIT_EXPR (this order is for while/for loops.
11229 LABELED_BLOCK_EXPR the order is reversed for do loops)
11230 LABEL_DECL (a continue occuring here branches at the
11231 BODY end of this labeled block)
11234 REVERSED, if non zero, tells that the loop condition expr comes
11235 after the body, like in the do-while loop.
11237 To obtain a loop, the loop body structure described above is
11238 encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
11241 LABEL_DECL (use this label to exit the loop)
11243 <structure described above> */
11246 build_loop_body (location, condition, reversed)
11251 tree first, second, body;
11253 condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
11254 EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
11255 condition = build_debugable_stmt (location, condition);
11256 TREE_SIDE_EFFECTS (condition) = 1;
11258 body = build_labeled_block (0, continue_identifier_node);
11259 first = (reversed ? body : condition);
11260 second = (reversed ? condition : body);
11262 build (COMPOUND_EXPR, NULL_TREE,
11263 build (COMPOUND_EXPR, NULL_TREE, first, second), empty_stmt_node);
11266 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
11267 their order) on the current loop. Unlink the current loop from the
11271 finish_loop_body (location, condition, body, reversed)
11273 tree condition, body;
11276 tree to_return = ctxp->current_loop;
11277 tree loop_body = LOOP_EXPR_BODY (to_return);
11280 tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
11281 /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
11282 The real EXIT_EXPR is one operand further. */
11283 EXPR_WFL_LINECOL (cnode) = location;
11284 /* This one is for accurate error reports */
11285 EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
11286 TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
11288 LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
11293 /* Tailored version of finish_loop_body for FOR loops, when FOR
11294 loops feature the condition part */
11297 finish_for_loop (location, condition, update, body)
11299 tree condition, update, body;
11301 /* Put the condition and the loop body in place */
11302 tree loop = finish_loop_body (location, condition, body, 0);
11303 /* LOOP is the current loop which has been now popped of the loop
11304 stack. Install the update block */
11305 LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
11309 /* Try to find the loop a block might be related to. This comprises
11310 the case where the LOOP_EXPR is found as the second operand of a
11311 COMPOUND_EXPR, because the loop happens to have an initialization
11312 part, then expressed as the first operand of the COMPOUND_EXPR. If
11313 the search finds something, 1 is returned. Otherwise, 0 is
11314 returned. The search is assumed to start from a
11315 LABELED_BLOCK_EXPR's block. */
11318 search_loop (statement)
11321 if (TREE_CODE (statement) == LOOP_EXPR)
11324 if (TREE_CODE (statement) == BLOCK)
11325 statement = BLOCK_SUBBLOCKS (statement);
11329 if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
11330 while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
11331 statement = TREE_OPERAND (statement, 1);
11333 return (TREE_CODE (statement) == LOOP_EXPR
11334 && IS_FOR_LOOP_P (statement) ? statement : NULL_TREE);
11337 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
11338 returned otherwise. */
11341 labeled_block_contains_loop_p (block, loop)
11347 if (LABELED_BLOCK_BODY (block) == loop)
11350 if (IS_FOR_LOOP_P (loop)
11351 && search_loop (LABELED_BLOCK_BODY (block)) == loop)
11357 /* If the loop isn't surrounded by a labeled statement, create one and
11358 insert LOOP as its body. */
11361 patch_loop_statement (loop)
11366 TREE_TYPE (loop) = void_type_node;
11367 if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
11370 loop_label = build_labeled_block (0, NULL_TREE);
11371 /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
11372 that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
11373 LABELED_BLOCK_BODY (loop_label) = loop;
11374 PUSH_LABELED_BLOCK (loop_label);
11378 /* 14.13, 14.14: break and continue Statements */
11380 /* Build a break or a continue statement. a null NAME indicates an
11381 unlabeled break/continue statement. */
11384 build_bc_statement (location, is_break, name)
11385 int location, is_break;
11388 tree break_continue, label_block_expr = NULL_TREE;
11392 if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
11393 (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
11394 /* Null means that we don't have a target for this named
11395 break/continue. In this case, we make the target to be the
11396 label name, so that the error can be reported accuratly in
11397 patch_bc_statement. */
11398 label_block_expr = EXPR_WFL_NODE (name);
11400 /* Unlabeled break/continue will be handled during the
11401 break/continue patch operation */
11403 = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
11405 IS_BREAK_STMT_P (break_continue) = is_break;
11406 TREE_SIDE_EFFECTS (break_continue) = 1;
11407 EXPR_WFL_LINECOL (break_continue) = location;
11408 break_continue = build_debugable_stmt (location, break_continue);
11409 return break_continue;
11412 /* Verification of a break/continue statement. */
11415 patch_bc_statement (node)
11418 tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
11419 tree labeled_block = ctxp->current_labeled_block;
11420 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11422 /* Having an identifier here means that the target is unknown. */
11423 if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
11425 parse_error_context (wfl_operator, "No label definition found for `%s'",
11426 IDENTIFIER_POINTER (bc_label));
11427 return error_mark_node;
11429 if (! IS_BREAK_STMT_P (node))
11431 /* It's a continue statement. */
11432 for (;; labeled_block = TREE_CHAIN (labeled_block))
11434 if (labeled_block == NULL_TREE)
11436 if (bc_label == NULL_TREE)
11437 parse_error_context (wfl_operator,
11438 "`continue' must be in loop");
11440 parse_error_context
11441 (wfl_operator, "continue label `%s' does not name a loop",
11442 IDENTIFIER_POINTER (bc_label));
11443 return error_mark_node;
11445 if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
11446 == continue_identifier_node)
11447 && (bc_label == NULL_TREE
11448 || TREE_CHAIN (labeled_block) == bc_label))
11450 bc_label = labeled_block;
11455 else if (!bc_label)
11457 for (;; labeled_block = TREE_CHAIN (labeled_block))
11459 if (labeled_block == NULL_TREE)
11461 parse_error_context (wfl_operator,
11462 "`break' must be in loop or switch");
11463 return error_mark_node;
11465 target_stmt = LABELED_BLOCK_BODY (labeled_block);
11466 if (TREE_CODE (target_stmt) == SWITCH_EXPR
11467 || search_loop (target_stmt))
11469 bc_label = labeled_block;
11475 EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
11476 CAN_COMPLETE_NORMALLY (bc_label) = 1;
11478 /* Our break/continue don't return values. */
11479 TREE_TYPE (node) = void_type_node;
11480 /* Encapsulate the break within a compound statement so that it's
11481 expanded all the times by expand_expr (and not clobbered
11482 sometimes, like after a if statement) */
11483 node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
11484 TREE_SIDE_EFFECTS (node) = 1;
11488 /* Process the exit expression belonging to a loop. Its type must be
11492 patch_exit_expr (node)
11495 tree expression = TREE_OPERAND (node, 0);
11496 TREE_TYPE (node) = error_mark_node;
11497 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11499 /* The type of expression must be boolean */
11500 if (TREE_TYPE (expression) != boolean_type_node)
11502 parse_error_context
11504 "Incompatible type for loop conditional. Can't convert `%s' to "
11506 lang_printable_name (TREE_TYPE (expression), 0));
11507 return error_mark_node;
11509 /* Now we know things are allright, invert the condition, fold and
11511 TREE_OPERAND (node, 0) =
11512 fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
11514 if (! integer_zerop (TREE_OPERAND (node, 0))
11515 && ctxp->current_loop != NULL_TREE
11516 && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
11517 CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
11518 if (! integer_onep (TREE_OPERAND (node, 0)))
11519 CAN_COMPLETE_NORMALLY (node) = 1;
11522 TREE_TYPE (node) = void_type_node;
11526 /* 14.9 Switch statement */
11529 patch_switch_statement (node)
11532 tree se = TREE_OPERAND (node, 0), se_type;
11534 /* Complete the switch expression */
11535 se = TREE_OPERAND (node, 0) = java_complete_tree (se);
11536 se_type = TREE_TYPE (se);
11537 /* The type of the switch expression must be char, byte, short or
11539 if (!JINTEGRAL_TYPE_P (se_type))
11541 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11542 parse_error_context (wfl_operator, "Incompatible type for `switch'. "
11543 "Can't convert `%s' to `int'",
11544 lang_printable_name (se_type, 0));
11545 /* This is what java_complete_tree will check */
11546 TREE_OPERAND (node, 0) = error_mark_node;
11547 return error_mark_node;
11550 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11552 /* Ready to return */
11553 if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
11555 TREE_TYPE (node) = error_mark_node;
11556 return error_mark_node;
11558 TREE_TYPE (node) = void_type_node;
11559 TREE_SIDE_EFFECTS (node) = 1;
11560 CAN_COMPLETE_NORMALLY (node)
11561 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
11562 || ! SWITCH_HAS_DEFAULT (node);
11566 /* 14.18 The try statement */
11569 build_try_statement (location, try_block, catches)
11571 tree try_block, catches;
11573 tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
11574 EXPR_WFL_LINECOL (node) = location;
11579 build_try_finally_statement (location, try_block, finally)
11581 tree try_block, finally;
11583 tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
11584 EXPR_WFL_LINECOL (node) = location;
11589 patch_try_statement (node)
11592 int error_found = 0;
11593 tree try = TREE_OPERAND (node, 0);
11594 /* Exception handlers are considered in left to right order */
11595 tree catch = nreverse (TREE_OPERAND (node, 1));
11596 tree current, caught_type_list = NULL_TREE;
11598 /* Check catch clauses, if any. Every time we find an error, we try
11599 to process the next catch clause. We process the catch clause before
11600 the try block so that when processing the try block we can check thrown
11601 exceptions againts the caught type list. */
11602 for (current = catch; current; current = TREE_CHAIN (current))
11604 tree carg_decl, carg_type;
11605 tree sub_current, catch_block, catch_clause;
11608 /* At this point, the structure of the catch clause is
11609 CATCH_EXPR (catch node)
11610 BLOCK (with the decl of the parameter)
11612 MODIFY_EXPR (assignment of the catch parameter)
11613 BLOCK (catch clause block)
11615 catch_clause = TREE_OPERAND (current, 0);
11616 carg_decl = BLOCK_EXPR_DECLS (catch_clause);
11617 carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
11619 /* Catch clauses can't have more than one parameter declared,
11620 but it's already enforced by the grammar. Make sure that the
11621 only parameter of the clause statement in of class Throwable
11622 or a subclass of Throwable, but that was done earlier. The
11623 catch clause parameter type has also been resolved. */
11625 /* Just make sure that the catch clause parameter type inherits
11626 from java.lang.Throwable */
11627 if (!inherits_from_p (carg_type, throwable_type_node))
11629 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
11630 parse_error_context (wfl_operator,
11631 "Can't catch class `%s'. Catch clause "
11632 "parameter type must be a subclass of "
11633 "class `java.lang.Throwable'",
11634 lang_printable_name (carg_type, 0));
11639 /* Partial check for unreachable catch statement: The catch
11640 clause is reachable iff is no earlier catch block A in
11641 the try statement such that the type of the catch
11642 clause's parameter is the same as or a subclass of the
11643 type of A's parameter */
11645 for (sub_current = catch;
11646 sub_current != current; sub_current = TREE_CHAIN (sub_current))
11648 tree sub_catch_clause, decl;
11649 sub_catch_clause = TREE_OPERAND (sub_current, 0);
11650 decl = BLOCK_EXPR_DECLS (sub_catch_clause);
11652 if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
11654 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
11655 parse_error_context
11656 (wfl_operator, "`catch' not reached because of the catch "
11657 "clause at line %d", EXPR_WFL_LINENO (sub_current));
11658 unreachable = error_found = 1;
11662 /* Complete the catch clause block */
11663 catch_block = java_complete_tree (TREE_OPERAND (current, 0));
11664 if (catch_block == error_mark_node)
11669 if (CAN_COMPLETE_NORMALLY (catch_block))
11670 CAN_COMPLETE_NORMALLY (node) = 1;
11671 TREE_OPERAND (current, 0) = catch_block;
11676 /* Things to do here: the exception must be thrown */
11678 /* Link this type to the caught type list */
11679 caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
11682 PUSH_EXCEPTIONS (caught_type_list);
11683 if ((try = java_complete_tree (try)) == error_mark_node)
11685 if (CAN_COMPLETE_NORMALLY (try))
11686 CAN_COMPLETE_NORMALLY (node) = 1;
11689 /* Verification ends here */
11691 return error_mark_node;
11693 TREE_OPERAND (node, 0) = try;
11694 TREE_OPERAND (node, 1) = catch;
11695 TREE_TYPE (node) = void_type_node;
11699 /* 14.17 The synchronized Statement */
11702 patch_synchronized_statement (node, wfl_op1)
11703 tree node, wfl_op1;
11705 tree expr = java_complete_tree (TREE_OPERAND (node, 0));
11706 tree block = TREE_OPERAND (node, 1);
11708 tree enter, exit, expr_decl, assignment;
11710 if (expr == error_mark_node)
11712 block = java_complete_tree (block);
11716 /* The TYPE of expr must be a reference type */
11717 if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
11719 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
11720 parse_error_context (wfl_operator, "Incompatible type for `synchronized'"
11721 ". Can't convert `%s' to `java.lang.Object'",
11722 lang_printable_name (TREE_TYPE (expr), 0));
11723 return error_mark_node;
11726 if (flag_emit_xref)
11728 TREE_OPERAND (node, 0) = expr;
11729 TREE_OPERAND (node, 1) = java_complete_tree (block);
11730 CAN_COMPLETE_NORMALLY (node) = 1;
11734 /* Generate a try-finally for the synchronized statement, except
11735 that the handler that catches all throw exception calls
11736 _Jv_MonitorExit and then rethrow the exception.
11737 The synchronized statement is then implemented as:
11740 _Jv_MonitorEnter (expression)
11742 _Jv_MonitorExit (expression)
11746 e = _Jv_exception_info ();
11747 _Jv_MonitorExit (expression)
11751 expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
11752 BUILD_MONITOR_ENTER (enter, expr_decl);
11753 BUILD_MONITOR_EXIT (exit, expr_decl);
11754 CAN_COMPLETE_NORMALLY (enter) = 1;
11755 CAN_COMPLETE_NORMALLY (exit) = 1;
11756 assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
11757 TREE_SIDE_EFFECTS (assignment) = 1;
11758 node = build1 (CLEANUP_POINT_EXPR, NULL_TREE,
11759 build (COMPOUND_EXPR, NULL_TREE,
11760 build (WITH_CLEANUP_EXPR, NULL_TREE,
11761 build (COMPOUND_EXPR, NULL_TREE,
11762 assignment, enter),
11765 node = build_expr_block (node, expr_decl);
11767 return java_complete_tree (node);
11770 /* 14.16 The throw Statement */
11773 patch_throw_statement (node, wfl_op1)
11774 tree node, wfl_op1;
11776 tree expr = TREE_OPERAND (node, 0);
11777 tree type = TREE_TYPE (expr);
11778 int unchecked_ok = 0, tryblock_throws_ok = 0;
11780 /* Thrown expression must be assignable to java.lang.Throwable */
11781 if (!try_reference_assignconv (throwable_type_node, expr))
11783 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
11784 parse_error_context (wfl_operator, "Can't throw `%s'; it must be a "
11785 "subclass of class `java.lang.Throwable'",
11786 lang_printable_name (type, 0));
11787 /* If the thrown expression was a reference, we further the
11788 compile-time check. */
11789 if (!JREFERENCE_TYPE_P (type))
11790 return error_mark_node;
11793 /* At least one of the following must be true */
11795 /* The type of the throw expression is a not checked exception,
11796 i.e. is a unchecked expression. */
11797 unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
11799 /* Throw is contained in a try statement and at least one catch
11800 clause can receive the thrown expression or the current method is
11801 declared to throw such an exception. Or, the throw statement is
11802 contained in a method or constructor declaration and the type of
11803 the Expression is assignable to at least one type listed in the
11804 throws clause the declaration. */
11805 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
11807 tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
11808 if (!(unchecked_ok || tryblock_throws_ok))
11810 /* If there is a surrounding try block that has no matching
11811 clatch clause, report it first. A surrounding try block exits
11812 only if there is something after the list of checked
11813 exception thrown by the current function (if any). */
11814 if (IN_TRY_BLOCK_P ())
11815 parse_error_context (wfl_operator, "Checked exception `%s' can't be "
11816 "caught by any of the catch clause(s) "
11817 "of the surrounding `try' block",
11818 lang_printable_name (type, 0));
11819 /* If we have no surrounding try statement and the method doesn't have
11820 any throws, report it now. FIXME */
11822 /* We report that the exception can't be throw from a try block
11823 in all circumstances but when the `throw' is inside a static
11825 else if (!EXCEPTIONS_P (currently_caught_type_list)
11826 && !tryblock_throws_ok)
11828 if (IS_CLINIT (current_function_decl))
11829 parse_error_context (wfl_operator, "Checked exception `%s' can't "
11830 "be thrown in initializer",
11831 lang_printable_name (type, 0));
11833 parse_error_context (wfl_operator, "Checked exception `%s' isn't "
11834 "thrown from a `try' block",
11835 lang_printable_name (type, 0));
11837 /* Otherwise, the current method doesn't have the appropriate
11838 throws declaration */
11840 parse_error_context (wfl_operator, "Checked exception `%s' doesn't "
11841 "match any of current method's `throws' "
11843 lang_printable_name (type, 0));
11844 return error_mark_node;
11847 if (! flag_emit_class_files && ! flag_emit_xref)
11848 BUILD_THROW (node, expr);
11850 /* If doing xrefs, keep the location where the `throw' was seen. */
11851 if (flag_emit_xref)
11852 EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
11856 /* Check that exception said to be thrown by method DECL can be
11857 effectively caught from where DECL is invoked. */
11860 check_thrown_exceptions (location, decl)
11865 /* For all the unchecked exceptions thrown by DECL */
11866 for (throws = DECL_FUNCTION_THROWS (decl); throws;
11867 throws = TREE_CHAIN (throws))
11868 if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
11871 /* Temporary hack to suppresses errors about cloning arrays. FIXME */
11872 if (DECL_NAME (decl) == get_identifier ("clone"))
11875 EXPR_WFL_LINECOL (wfl_operator) = location;
11876 if (DECL_NAME (current_function_decl) == finit_identifier_node)
11877 parse_error_context
11878 (wfl_operator, "Exception `%s' can't be thrown in initializer",
11879 lang_printable_name (TREE_VALUE (throws), 0));
11882 parse_error_context
11883 (wfl_operator, "Exception `%s' must be caught, or it must be "
11884 "declared in the `throws' clause of `%s'",
11885 lang_printable_name (TREE_VALUE (throws), 0),
11886 (DECL_NAME (current_function_decl) == init_identifier_node ?
11887 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
11888 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
11893 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
11894 try-catch blocks, OR is listed in the `throws' clause of the
11898 check_thrown_exceptions_do (exception)
11901 tree list = currently_caught_type_list;
11902 resolve_and_layout (exception, NULL_TREE);
11903 /* First, all the nested try-catch-finally at that stage. The
11904 last element contains `throws' clause exceptions, if any. */
11905 if (IS_UNCHECKED_EXCEPTION_P (exception))
11910 for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
11911 if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
11913 list = TREE_CHAIN (list);
11919 purge_unchecked_exceptions (mdecl)
11922 tree throws = DECL_FUNCTION_THROWS (mdecl);
11923 tree new = NULL_TREE;
11927 tree next = TREE_CHAIN (throws);
11928 if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
11930 TREE_CHAIN (throws) = new;
11935 /* List is inverted here, but it doesn't matter */
11936 DECL_FUNCTION_THROWS (mdecl) = new;
11939 /* 15.24 Conditional Operator ?: */
11942 patch_conditional_expr (node, wfl_cond, wfl_op1)
11943 tree node, wfl_cond, wfl_op1;
11945 tree cond = TREE_OPERAND (node, 0);
11946 tree op1 = TREE_OPERAND (node, 1);
11947 tree op2 = TREE_OPERAND (node, 2);
11948 tree resulting_type = NULL_TREE;
11949 tree t1, t2, patched;
11950 int error_found = 0;
11952 /* Operands of ?: might be StringBuffers crafted as a result of a
11953 string concatenation. Obtain a descent operand here. */
11954 if ((patched = patch_string (op1)))
11955 TREE_OPERAND (node, 1) = op1 = patched;
11956 if ((patched = patch_string (op2)))
11957 TREE_OPERAND (node, 2) = op2 = patched;
11959 t1 = TREE_TYPE (op1);
11960 t2 = TREE_TYPE (op2);
11962 /* The first expression must be a boolean */
11963 if (TREE_TYPE (cond) != boolean_type_node)
11965 SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
11966 parse_error_context (wfl_operator, "Incompatible type for `?:'. Can't "
11967 "convert `%s' to `boolean'",
11968 lang_printable_name (TREE_TYPE (cond), 0));
11972 /* Second and third can be numeric, boolean (i.e. primitive),
11973 references or null. Anything else results in an error */
11974 if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
11975 || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
11976 && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
11977 || (t1 == boolean_type_node && t2 == boolean_type_node)))
11980 /* Determine the type of the conditional expression. Same types are
11981 easy to deal with */
11983 resulting_type = t1;
11985 /* There are different rules for numeric types */
11986 else if (JNUMERIC_TYPE_P (t1))
11988 /* if byte/short found, the resulting type is short */
11989 if ((t1 == byte_type_node && t2 == short_type_node)
11990 || (t1 == short_type_node && t2 == byte_type_node))
11991 resulting_type = short_type_node;
11993 /* If t1 is a constant int and t2 is of type byte, short or char
11994 and t1's value fits in t2, then the resulting type is t2 */
11995 else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
11996 && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
11997 resulting_type = t2;
11999 /* If t2 is a constant int and t1 is of type byte, short or char
12000 and t2's value fits in t1, then the resulting type is t1 */
12001 else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
12002 && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
12003 resulting_type = t1;
12005 /* Otherwise, binary numeric promotion is applied and the
12006 resulting type is the promoted type of operand 1 and 2 */
12008 resulting_type = binary_numeric_promotion (t1, t2,
12009 &TREE_OPERAND (node, 1),
12010 &TREE_OPERAND (node, 2));
12013 /* Cases of a reference and a null type */
12014 else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
12015 resulting_type = t1;
12017 else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
12018 resulting_type = t2;
12020 /* Last case: different reference types. If a type can be converted
12021 into the other one by assignment conversion, the latter
12022 determines the type of the expression */
12023 else if ((resulting_type = try_reference_assignconv (t1, op2)))
12024 resulting_type = promote_type (t1);
12026 else if ((resulting_type = try_reference_assignconv (t2, op1)))
12027 resulting_type = promote_type (t2);
12029 /* If we don't have any resulting type, we're in trouble */
12030 if (!resulting_type)
12032 char *t = xstrdup (lang_printable_name (t1, 0));
12033 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
12034 parse_error_context (wfl_operator, "Incompatible type for `?:'. Can't "
12035 "convert `%s' to `%s'", t,
12036 lang_printable_name (t2, 0));
12043 TREE_TYPE (node) = error_mark_node;
12044 return error_mark_node;
12047 TREE_TYPE (node) = resulting_type;
12048 TREE_SET_CODE (node, COND_EXPR);
12049 CAN_COMPLETE_NORMALLY (node) = 1;
12053 /* Try to constant fold NODE.
12054 If NODE is not a constant expression, return NULL_EXPR.
12055 CONTEXT is a static final VAR_DECL whose initializer we are folding. */
12058 fold_constant_for_init (node, context)
12062 tree op0, op1, val;
12063 enum tree_code code = TREE_CODE (node);
12065 if (code == STRING_CST)
12068 if (code == INTEGER_CST || code == REAL_CST)
12069 return convert (TREE_TYPE (context), node);
12070 if (TREE_TYPE (node) != NULL_TREE && code != VAR_DECL && code != FIELD_DECL)
12078 case TRUNC_MOD_EXPR:
12086 case TRUTH_ANDIF_EXPR:
12087 case TRUTH_ORIF_EXPR:
12094 op0 = TREE_OPERAND (node, 0);
12095 op1 = TREE_OPERAND (node, 1);
12096 val = fold_constant_for_init (op0, context);
12097 if (val == NULL_TREE || ! TREE_CONSTANT (val))
12099 TREE_OPERAND (node, 0) = val;
12100 val = fold_constant_for_init (op1, context);
12101 if (val == NULL_TREE || ! TREE_CONSTANT (val))
12103 TREE_OPERAND (node, 1) = val;
12104 return patch_binop (node, op0, op1);
12106 case UNARY_PLUS_EXPR:
12108 case TRUTH_NOT_EXPR:
12111 op0 = TREE_OPERAND (node, 0);
12112 val = fold_constant_for_init (op0, context);
12113 if (val == NULL_TREE || ! TREE_CONSTANT (val))
12115 TREE_OPERAND (node, 0) = val;
12116 return patch_unaryop (node, op0);
12120 val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
12121 if (val == NULL_TREE || ! TREE_CONSTANT (val))
12123 TREE_OPERAND (node, 0) = val;
12124 val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
12125 if (val == NULL_TREE || ! TREE_CONSTANT (val))
12127 TREE_OPERAND (node, 1) = val;
12128 val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
12129 if (val == NULL_TREE || ! TREE_CONSTANT (val))
12131 TREE_OPERAND (node, 2) = val;
12132 return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
12133 : TREE_OPERAND (node, 2);
12137 if (! FIELD_FINAL (node)
12138 || DECL_INITIAL (node) == NULL_TREE)
12140 val = DECL_INITIAL (node);
12141 /* Guard against infinite recursion. */
12142 DECL_INITIAL (node) = NULL_TREE;
12143 val = fold_constant_for_init (val, node);
12144 DECL_INITIAL (node) = val;
12147 case EXPR_WITH_FILE_LOCATION:
12148 /* Compare java_complete_tree and resolve_expression_name. */
12149 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
12150 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
12152 tree name = EXPR_WFL_NODE (node);
12154 if (PRIMARY_P (node))
12156 else if (! QUALIFIED_P (name))
12158 decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
12159 if (decl == NULL_TREE
12160 || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
12162 return fold_constant_for_init (decl, decl);
12166 /* Wait until the USE_COMPONENT_REF re-write. FIXME. */
12167 qualify_ambiguous_name (node);
12168 if (resolve_field_access (node, &decl, NULL)
12169 && decl != NULL_TREE)
12170 return fold_constant_for_init (decl, decl);
12176 op0 = TREE_OPERAND (node, 0);
12177 val = fold_constant_for_init (op0, context);
12178 if (val == NULL_TREE || ! TREE_CONSTANT (val))
12180 TREE_OPERAND (node, 0) = val;
12184 #ifdef USE_COMPONENT_REF
12186 case COMPONENT_REF:
12195 #ifdef USE_COMPONENT_REF
12196 /* Context is 'T' for TypeName, 'P' for PackageName,
12197 'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
12200 resolve_simple_name (name, context)
12207 resolve_qualified_name (name, context)