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"
66 #define DIR_SEPARATOR '/'
69 /* Local function prototypes */
70 static char *java_accstring_lookup PROTO ((int));
71 static void classitf_redefinition_error PROTO ((char *,tree, tree, tree));
72 static void variable_redefinition_error PROTO ((tree, tree, tree, int));
73 static void check_modifiers PROTO ((char *, int, int));
74 static tree create_class PROTO ((int, tree, tree, tree));
75 static tree create_interface PROTO ((int, tree, tree));
76 static tree find_field PROTO ((tree, tree));
77 static tree lookup_field_wrapper PROTO ((tree, tree));
78 static int duplicate_declaration_error_p PROTO ((tree, tree, tree));
79 static void register_fields PROTO ((int, tree, tree));
80 static tree parser_qualified_classname PROTO ((tree));
81 static int parser_check_super PROTO ((tree, tree, tree));
82 static int parser_check_super_interface PROTO ((tree, tree, tree));
83 static void check_modifiers_consistency PROTO ((int));
84 static tree lookup_cl PROTO ((tree));
85 static tree lookup_java_method2 PROTO ((tree, tree, int));
86 static tree method_header PROTO ((int, tree, tree, tree));
87 static void fix_method_argument_names PROTO ((tree ,tree));
88 static tree method_declarator PROTO ((tree, tree));
89 static void parse_warning_context PVPROTO ((tree cl, const char *msg, ...))
91 static void issue_warning_error_from_context PROTO ((tree, const char *msg, va_list));
92 static tree parse_jdk1_1_error PROTO ((char *));
93 static void complete_class_report_errors PROTO ((jdep *));
94 static int process_imports PROTO ((void));
95 static void read_import_dir PROTO ((tree));
96 static int find_in_imports_on_demand PROTO ((tree));
97 static int find_in_imports PROTO ((tree));
98 static int check_pkg_class_access PROTO ((tree, tree));
99 static tree resolve_package PROTO ((tree, tree *));
100 static tree lookup_package_type PROTO ((char *, int));
101 static tree resolve_class PROTO ((tree, tree, tree));
102 static void declare_local_variables PROTO ((int, tree, tree));
103 static void source_start_java_method PROTO ((tree));
104 static void source_end_java_method PROTO ((void));
105 static void expand_start_java_method PROTO ((tree));
106 static tree find_name_in_single_imports PROTO ((tree));
107 static void check_abstract_method_header PROTO ((tree));
108 static tree lookup_java_interface_method2 PROTO ((tree, tree));
109 static tree resolve_expression_name PROTO ((tree, tree *));
110 static tree maybe_create_class_interface_decl PROTO ((tree, tree, tree));
111 static int check_class_interface_creation PROTO ((int, int, tree,
113 static tree patch_method_invocation PROTO ((tree, tree, tree,
115 static int breakdown_qualified PROTO ((tree *, tree *, tree));
116 static tree resolve_and_layout PROTO ((tree, tree));
117 static tree resolve_no_layout PROTO ((tree, tree));
118 static int invocation_mode PROTO ((tree, int));
119 static tree find_applicable_accessible_methods_list PROTO ((int, tree,
121 static tree find_most_specific_methods_list PROTO ((tree));
122 static int argument_types_convertible PROTO ((tree, tree));
123 static tree patch_invoke PROTO ((tree, tree, tree));
124 static tree lookup_method_invoke PROTO ((int, tree, tree, tree, tree));
125 static tree register_incomplete_type PROTO ((int, tree, tree, tree));
126 static tree obtain_incomplete_type PROTO ((tree));
127 static tree java_complete_lhs PROTO ((tree));
128 static tree java_complete_tree PROTO ((tree));
129 static void java_complete_expand_method PROTO ((tree));
130 static int unresolved_type_p PROTO ((tree, tree *));
131 static void create_jdep_list PROTO ((struct parser_ctxt *));
132 static tree build_expr_block PROTO ((tree, tree));
133 static tree enter_block PROTO ((void));
134 static tree enter_a_block PROTO ((tree));
135 static tree exit_block PROTO ((void));
136 static tree lookup_name_in_blocks PROTO ((tree));
137 static void maybe_absorb_scoping_blocks PROTO ((void));
138 static tree build_method_invocation PROTO ((tree, tree));
139 static tree build_new_invocation PROTO ((tree, tree));
140 static tree build_assignment PROTO ((int, int, tree, tree));
141 static tree build_binop PROTO ((enum tree_code, int, tree, tree));
142 static int check_final_assignment PROTO ((tree ,tree));
143 static tree patch_assignment PROTO ((tree, tree, tree ));
144 static tree patch_binop PROTO ((tree, tree, tree));
145 static tree build_unaryop PROTO ((int, int, tree));
146 static tree build_incdec PROTO ((int, int, tree, int));
147 static tree patch_unaryop PROTO ((tree, tree));
148 static tree build_cast PROTO ((int, tree, tree));
149 static tree build_null_of_type PROTO ((tree));
150 static tree patch_cast PROTO ((tree, tree));
151 static int valid_ref_assignconv_cast_p PROTO ((tree, tree, int));
152 static int valid_builtin_assignconv_identity_widening_p PROTO ((tree, tree));
153 static int valid_cast_to_p PROTO ((tree, tree));
154 static int valid_method_invocation_conversion_p PROTO ((tree, tree));
155 static tree try_builtin_assignconv PROTO ((tree, tree, tree));
156 static tree try_reference_assignconv PROTO ((tree, tree));
157 static tree build_unresolved_array_type PROTO ((tree));
158 static tree build_array_from_name PROTO ((tree, tree, tree, tree *));
159 static tree build_array_ref PROTO ((int, tree, tree));
160 static tree patch_array_ref PROTO ((tree));
161 static tree make_qualified_name PROTO ((tree, tree, int));
162 static tree merge_qualified_name PROTO ((tree, tree));
163 static tree make_qualified_primary PROTO ((tree, tree, int));
164 static int resolve_qualified_expression_name PROTO ((tree, tree *,
166 static void qualify_ambiguous_name PROTO ((tree));
167 static void maybe_generate_clinit PROTO ((void));
168 static tree resolve_field_access PROTO ((tree, tree *, tree *));
169 static tree build_newarray_node PROTO ((tree, tree, int));
170 static tree patch_newarray PROTO ((tree));
171 static tree resolve_type_during_patch PROTO ((tree));
172 static tree build_this PROTO ((int));
173 static tree build_return PROTO ((int, tree));
174 static tree patch_return PROTO ((tree));
175 static tree maybe_access_field PROTO ((tree, tree, tree));
176 static int complete_function_arguments PROTO ((tree));
177 static int check_for_static_method_reference PROTO ((tree, tree, tree, tree, tree));
178 static int not_accessible_p PROTO ((tree, tree, int));
179 static void check_deprecation PROTO ((tree, tree));
180 static int class_in_current_package PROTO ((tree));
181 static tree build_if_else_statement PROTO ((int, tree, tree, tree));
182 static tree patch_if_else_statement PROTO ((tree));
183 static tree add_stmt_to_compound PROTO ((tree, tree, tree));
184 static tree add_stmt_to_block PROTO ((tree, tree, tree));
185 static tree patch_exit_expr PROTO ((tree));
186 static tree build_labeled_block PROTO ((int, tree));
187 static tree generate_labeled_block PROTO (());
188 static tree complete_labeled_statement PROTO ((tree, tree));
189 static tree build_bc_statement PROTO ((int, int, tree));
190 static tree patch_bc_statement PROTO ((tree));
191 static tree patch_loop_statement PROTO ((tree));
192 static tree build_new_loop PROTO ((tree));
193 static tree build_loop_body PROTO ((int, tree, int));
194 static tree complete_loop_body PROTO ((int, tree, tree, int));
195 static tree build_debugable_stmt PROTO ((int, tree));
196 static tree complete_for_loop PROTO ((int, tree, tree, tree));
197 static tree patch_switch_statement PROTO ((tree));
198 static tree string_constant_concatenation PROTO ((tree, tree));
199 static tree build_string_concatenation PROTO ((tree, tree));
200 static tree patch_string_cst PROTO ((tree));
201 static tree patch_string PROTO ((tree));
202 static tree build_jump_to_finally PROTO ((tree, tree, tree, tree));
203 static tree build_try_statement PROTO ((int, tree, tree));
204 static tree build_try_finally_statement PROTO ((int, tree, tree));
205 static tree patch_try_statement PROTO ((tree));
206 static tree patch_synchronized_statement PROTO ((tree, tree));
207 static tree patch_throw_statement PROTO ((tree, tree));
208 static void check_thrown_exceptions PROTO ((int, tree));
209 static int check_thrown_exceptions_do PROTO ((tree));
210 static void purge_unchecked_exceptions PROTO ((tree));
211 static void check_throws_clauses PROTO ((tree, tree, tree));
212 static void complete_method_declaration PROTO ((tree));
213 static tree build_super_invocation PROTO (());
214 static int verify_constructor_circularity PROTO ((tree, tree));
215 static char *constructor_circularity_msg PROTO ((tree, tree));
216 static tree build_this_super_qualified_invocation PROTO ((int, tree, tree,
218 static char *get_printable_method_name PROTO ((tree));
219 static tree patch_conditional_expr PROTO ((tree, tree, tree));
220 static void maybe_generate_finit PROTO (());
221 static void fix_constructors PROTO ((tree));
222 static int verify_constructor_super PROTO (());
223 static tree create_artificial_method PROTO ((tree, int, tree, tree, tree));
224 static void start_artificial_method_body PROTO ((tree));
225 static void end_artificial_method_body PROTO ((tree));
226 static int check_method_redefinition PROTO ((tree, tree));
227 static int reset_method_name PROTO ((tree));
228 static void java_check_regular_methods PROTO ((tree));
229 static void java_check_abstract_methods PROTO ((tree));
230 static tree maybe_build_primttype_type_ref PROTO ((tree, tree));
231 static void unreachable_stmt_error PROTO ((tree));
232 static tree find_expr_with_wfl PROTO ((tree));
233 static void missing_return_error PROTO ((tree));
234 static tree build_new_array_init PROTO ((int, tree));
235 static tree patch_new_array_init PROTO ((tree, tree));
236 static tree maybe_build_array_element_wfl PROTO ((tree));
237 static int array_constructor_check_entry PROTO ((tree, tree));
238 static char *purify_type_name PROTO ((char *));
239 static tree patch_initialized_static_field PROTO ((tree));
240 static tree fold_constant_for_init PROTO ((tree, tree));
241 static tree strip_out_static_field_access_decl PROTO ((tree));
243 /* Number of error found so far. */
244 int java_error_count;
245 /* Number of warning found so far. */
246 int java_warning_count;
248 /* The current parser context */
249 static struct parser_ctxt *ctxp;
251 /* List of things that were anlyzed for which code will be generated */
252 static struct parser_ctxt *ctxp_for_generation = NULL;
254 /* binop_lookup maps token to tree_code. It is used where binary
255 operations are involved and required by the parser. RDIV_EXPR
256 covers both integral/floating point division. The code is changed
257 once the type of both operator is worked out. */
259 static enum tree_code binop_lookup[19] =
261 PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR,
262 LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR,
263 BIT_AND_EXPR, BIT_XOR_EXPR, BIT_IOR_EXPR,
264 TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR,
265 EQ_EXPR, NE_EXPR, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR,
267 #define BINOP_LOOKUP(VALUE) \
268 binop_lookup [((VALUE) - PLUS_TK)% \
269 (sizeof (binop_lookup) / sizeof (binop_lookup[0]))]
271 /* Fake WFL used to report error message. It is initialized once if
272 needed and reused with it's location information is overriden. */
273 tree wfl_operator = NULL_TREE;
275 /* The "$L" identifier we use to create labels. */
276 static tree label_id = NULL_TREE;
278 /* The "StringBuffer" identifier used for the String `+' operator. */
279 static tree wfl_string_buffer = NULL_TREE;
281 /* The "append" identifier used for String `+' operator. */
282 static tree wfl_append = NULL_TREE;
284 /* The "toString" identifier used for String `+' operator. */
285 static tree wfl_to_string = NULL_TREE;
287 /* The "java.lang" import qualified name. */
288 static tree java_lang_id = NULL_TREE;
290 /* The "java.lang.Cloneable" qualified name. */
291 static tree java_lang_cloneable = NULL_TREE;
306 /* Things defined here have to match the order of what's in the
307 binop_lookup table. */
309 %token PLUS_TK MINUS_TK MULT_TK DIV_TK REM_TK
310 %token LS_TK SRS_TK ZRS_TK
311 %token AND_TK XOR_TK OR_TK
312 %token BOOL_AND_TK BOOL_OR_TK
313 %token EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
315 /* This maps to the same binop_lookup entry than the token above */
317 %token PLUS_ASSIGN_TK MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
319 %token LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
320 %token AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
323 /* Modifier TOKEN have to be kept in this order. Don't scramble it */
325 %token PUBLIC_TK PRIVATE_TK PROTECTED_TK
326 %token STATIC_TK FINAL_TK SYNCHRONIZED_TK
327 %token VOLATILE_TK TRANSIENT_TK NATIVE_TK
328 %token PAD_TK ABSTRACT_TK MODIFIER_TK
330 /* Keep those two in order, too */
331 %token DECR_TK INCR_TK
333 /* From now one, things can be in any order */
335 %token DEFAULT_TK IF_TK THROW_TK
336 %token BOOLEAN_TK DO_TK IMPLEMENTS_TK
337 %token THROWS_TK BREAK_TK IMPORT_TK
338 %token ELSE_TK INSTANCEOF_TK RETURN_TK
339 %token VOID_TK CATCH_TK INTERFACE_TK
340 %token CASE_TK EXTENDS_TK FINALLY_TK
341 %token SUPER_TK WHILE_TK CLASS_TK
342 %token SWITCH_TK CONST_TK TRY_TK
343 %token FOR_TK NEW_TK CONTINUE_TK
344 %token GOTO_TK PACKAGE_TK THIS_TK
346 %token BYTE_TK SHORT_TK INT_TK LONG_TK
347 %token CHAR_TK INTEGRAL_TK
349 %token FLOAT_TK DOUBLE_TK FP_TK
353 %token REL_QM_TK REL_CL_TK NOT_TK NEG_TK
355 %token ASSIGN_ANY_TK ASSIGN_TK
356 %token OP_TK CP_TK OCB_TK CCB_TK OSB_TK CSB_TK SC_TK C_TK DOT_TK
358 %token STRING_LIT_TK CHAR_LIT_TK INT_LIT_TK FP_LIT_TK
359 %token TRUE_TK FALSE_TK BOOL_LIT_TK NULL_TK
361 %type <value> modifiers MODIFIER_TK
363 %type <node> super ID_TK identifier
364 %type <node> name simple_name qualified_name
365 %type <node> class_declaration type_declaration compilation_unit
366 field_declaration method_declaration extends_interfaces
367 interfaces interface_type_list
368 interface_declaration class_member_declaration
369 import_declarations package_declaration
370 type_declarations interface_body
371 interface_member_declaration constant_declaration
372 interface_member_declarations interface_type
373 abstract_method_declaration interface_type_list
374 %type <node> class_body_declaration class_member_declaration
375 static_initializer constructor_declaration block
376 %type <node> class_body_declarations constructor_header
377 %type <node> class_or_interface_type class_type class_type_list
378 constructor_declarator explicit_constructor_invocation
379 %type <node> dim_expr dim_exprs this_or_super throws
381 %type <node> variable_declarator_id variable_declarator
382 variable_declarators variable_initializer
383 variable_initializers constructor_body
386 %type <node> class_body block_end
387 %type <node> statement statement_without_trailing_substatement
388 labeled_statement if_then_statement label_decl
389 if_then_else_statement while_statement for_statement
390 statement_nsi labeled_statement_nsi do_statement
391 if_then_else_statement_nsi while_statement_nsi
392 for_statement_nsi statement_expression_list for_init
393 for_update statement_expression expression_statement
394 primary_no_new_array expression primary
395 array_creation_expression array_type
396 class_instance_creation_expression field_access
397 method_invocation array_access something_dot_new
398 argument_list postfix_expression while_expression
399 post_increment_expression post_decrement_expression
400 unary_expression_not_plus_minus unary_expression
401 pre_increment_expression pre_decrement_expression
402 unary_expression_not_plus_minus cast_expression
403 multiplicative_expression additive_expression
404 shift_expression relational_expression
405 equality_expression and_expression
406 exclusive_or_expression inclusive_or_expression
407 conditional_and_expression conditional_or_expression
408 conditional_expression assignment_expression
409 left_hand_side assignment for_header for_begin
410 constant_expression do_statement_begin empty_statement
411 switch_statement synchronized_statement throw_statement
412 try_statement switch_expression switch_block
413 catches catch_clause catch_clause_parameter finally
414 %type <node> return_statement break_statement continue_statement
416 %type <operator> ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
417 %type <operator> REM_ASSIGN_TK PLUS_ASSIGN_TK MINUS_ASSIGN_TK
418 %type <operator> LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
419 %type <operator> AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
420 %type <operator> ASSIGN_ANY_TK assignment_operator
421 %token <operator> EQ_TK GTE_TK ZRS_TK SRS_TK GT_TK LTE_TK LS_TK
422 %token <operator> BOOL_AND_TK AND_TK BOOL_OR_TK OR_TK INCR_TK PLUS_TK
423 %token <operator> DECR_TK MINUS_TK MULT_TK DIV_TK XOR_TK REM_TK NEQ_TK
424 %token <operator> NEG_TK REL_QM_TK REL_CL_TK NOT_TK LT_TK OCB_TK
425 %token <operator> OP_TK OSB_TK DOT_TK THROW_TK INSTANCEOF_TK
426 %type <operator> THIS_TK SUPER_TK RETURN_TK BREAK_TK CONTINUE_TK
427 %type <operator> CASE_TK DEFAULT_TK TRY_TK CATCH_TK SYNCHRONIZED_TK
429 %type <node> method_body
431 %type <node> literal INT_LIT_TK FP_LIT_TK BOOL_LIT_TK CHAR_LIT_TK
432 STRING_LIT_TK NULL_TK VOID_TK
434 %type <node> IF_TK WHILE_TK FOR_TK
436 %type <node> formal_parameter_list formal_parameter
437 method_declarator method_header
439 %type <node> primitive_type reference_type type
440 BOOLEAN_TK INTEGRAL_TK FP_TK
443 /* 19.2 Production from 2.3: The Syntactic Grammar */
449 /* 19.3 Productions from 3: Lexical structure */
459 /* 19.4 Productions from 4: Types, Values and Variables */
472 class_or_interface_type
476 class_or_interface_type:
481 class_or_interface_type /* Default rule */
485 class_or_interface_type
489 primitive_type OSB_TK CSB_TK
491 $$ = build_java_array_type ($1, -1);
492 CLASS_LOADED_P ($$) = 1;
495 { $$ = build_unresolved_array_type ($1); }
496 | array_type OSB_TK CSB_TK
497 { $$ = build_unresolved_array_type ($1); }
498 | primitive_type OSB_TK error
499 {RULE ("']' expected"); RECOVER;}
500 | array_type OSB_TK error
501 {RULE ("']' expected"); RECOVER;}
504 /* 19.5 Productions from 6: Names */
506 simple_name /* Default rule */
507 | qualified_name /* Default rule */
511 identifier /* Default rule */
515 name DOT_TK identifier
516 { $$ = make_qualified_name ($1, $3, $2.location); }
523 /* 19.6: Production from 7: Packages */
526 | package_declaration
527 | import_declarations
529 | package_declaration import_declarations
530 | package_declaration type_declarations
531 | import_declarations type_declarations
532 | package_declaration import_declarations type_declarations
540 | import_declarations import_declaration
548 | type_declarations type_declaration
552 PACKAGE_TK name SC_TK
553 { ctxp->package = EXPR_WFL_NODE ($2); }
555 {yyerror ("Missing name"); RECOVER;}
556 | PACKAGE_TK name error
557 {yyerror ("';' expected"); RECOVER;}
561 single_type_import_declaration
562 | type_import_on_demand_declaration
565 single_type_import_declaration:
568 tree name = EXPR_WFL_NODE ($2), node, last_name;
569 int i = IDENTIFIER_LENGTH (name)-1;
570 char *last = &IDENTIFIER_POINTER (name)[i];
571 while (last != IDENTIFIER_POINTER (name))
577 last_name = get_identifier (++last);
578 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (last_name))
580 tree err = find_name_in_single_imports (last_name);
581 if (err && err != name)
583 ($2, "Ambiguous class: `%s' and `%s'",
584 IDENTIFIER_POINTER (name),
585 IDENTIFIER_POINTER (err));
587 REGISTER_IMPORT ($2, last_name)
590 REGISTER_IMPORT ($2, last_name);
593 {yyerror ("Missing name"); RECOVER;}
594 | IMPORT_TK name error
595 {yyerror ("';' expected"); RECOVER;}
598 type_import_on_demand_declaration:
599 IMPORT_TK name DOT_TK MULT_TK SC_TK
601 tree name = EXPR_WFL_NODE ($2);
602 /* Don't import java.lang.* twice. */
603 if (name != java_lang_id)
605 tree node = build_tree_list ($2, NULL_TREE);
606 read_import_dir ($2);
607 TREE_CHAIN (node) = ctxp->import_demand_list;
608 ctxp->import_demand_list = node;
611 | IMPORT_TK name DOT_TK error
612 {yyerror ("'*' expected"); RECOVER;}
613 | IMPORT_TK name DOT_TK MULT_TK error
614 {yyerror ("';' expected"); RECOVER;}
620 maybe_generate_finit ();
621 maybe_generate_clinit ();
624 | interface_declaration
630 yyerror ("Class or interface declaration expected");
634 /* 19.7 Shortened from the original:
635 modifiers: modifier | modifiers modifier
636 modifier: any of public... */
642 | modifiers MODIFIER_TK
647 (ctxp->modifier_ctx [$2], "Modifier `%s' declared twice",
648 java_accstring_lookup (acc));
656 /* 19.8.1 Production from $8.1: Class Declaration */
658 modifiers CLASS_TK identifier super interfaces
659 { create_class ($1, $3, $4, $5); }
664 | CLASS_TK identifier super interfaces
665 { create_class (0, $2, $3, $4); }
670 | modifiers CLASS_TK error
671 {yyerror ("Missing class name"); RECOVER;}
673 {yyerror ("Missing class name"); RECOVER;}
674 | CLASS_TK identifier error
676 if (!ctxp->class_err) yyerror ("'{' expected");
679 | modifiers CLASS_TK identifier error
680 {if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER;}
685 | EXTENDS_TK class_type
687 | EXTENDS_TK class_type error
688 {yyerror ("'{' expected"); ctxp->class_err=1;}
690 {yyerror ("Missing super class name"); ctxp->class_err=1;}
695 | IMPLEMENTS_TK interface_type_list
697 | IMPLEMENTS_TK error
700 yyerror ("Missing interface name");
707 ctxp->interface_number = 1;
708 $$ = build_tree_list ($1, NULL_TREE);
710 | interface_type_list C_TK interface_type
712 ctxp->interface_number++;
713 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
715 | interface_type_list C_TK error
716 {yyerror ("Missing interface name"); RECOVER;}
721 { $$ = ctxp->current_parsed_class; }
722 | OCB_TK class_body_declarations CCB_TK
723 { $$ = ctxp->current_parsed_class; }
726 class_body_declarations:
727 class_body_declaration
728 | class_body_declarations class_body_declaration
731 class_body_declaration:
732 class_member_declaration
734 | constructor_declaration
735 | block /* Added, JDK1.1, instance initializer */
736 { $$ = parse_jdk1_1_error ("instance initializer"); }
739 class_member_declaration:
741 | field_declaration SC_TK
744 | class_declaration /* Added, JDK1.1 inner classes */
745 { $$ = parse_jdk1_1_error ("inner classe declaration"); }
746 | interface_declaration /* Added, JDK1.1 inner classes */
747 { $$ = parse_jdk1_1_error ("inner interface declaration"); }
750 /* 19.8.2 Productions from 8.3: Field Declarations */
752 type variable_declarators SC_TK
753 { register_fields (0, $1, $2); }
754 | modifiers type variable_declarators SC_TK
757 ("Illegal modifier `%s' for field declaration",
758 $1, FIELD_MODIFIERS);
759 check_modifiers_consistency ($1);
760 register_fields ($1, $2, $3);
764 variable_declarators:
765 /* Should we use build_decl_list () instead ? FIXME */
766 variable_declarator /* Default rule */
767 | variable_declarators C_TK variable_declarator
768 { $$ = chainon ($1, $3); }
769 | variable_declarators C_TK error
770 {yyerror ("Missing term"); RECOVER;}
774 variable_declarator_id
775 { $$ = build_tree_list ($1, NULL_TREE); }
776 | variable_declarator_id ASSIGN_TK variable_initializer
778 if (java_error_count)
781 ($1, build_assignment ($2.token, $2.location, $1, $3));
783 | variable_declarator_id ASSIGN_TK error
785 yyerror ("Missing variable initializer");
786 $$ = build_tree_list ($1, NULL_TREE);
789 | variable_declarator_id ASSIGN_TK variable_initializer error
791 yyerror ("';' expected");
792 $$ = build_tree_list ($1, NULL_TREE);
797 variable_declarator_id:
799 | variable_declarator_id OSB_TK CSB_TK
800 { $$ = build_unresolved_array_type ($1); }
802 {yyerror ("Invalid declaration"); DRECOVER(vdi);}
803 | variable_declarator_id OSB_TK error
804 {yyerror ("']' expected"); DRECOVER(vdi);}
805 | variable_declarator_id CSB_TK error
806 {yyerror ("Unbalanced ']'"); DRECOVER(vdi);}
809 variable_initializer:
814 /* 19.8.3 Productions from 8.4: Method Declarations */
818 current_function_decl = $1;
819 source_start_java_method (current_function_decl);
822 { complete_method_declaration ($3); }
823 | method_header error
824 {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;}
828 type method_declarator throws
829 { $$ = method_header (0, $1, $2, $3); }
830 | VOID_TK method_declarator throws
831 { $$ = method_header (0, void_type_node, $2, $3); }
832 | modifiers type method_declarator throws
833 { $$ = method_header ($1, $2, $3, $4); }
834 | modifiers VOID_TK method_declarator throws
835 { $$ = method_header ($1, void_type_node, $3, $4); }
838 | modifiers type error
841 {yyerror ("Identifier expected"); RECOVER;}
842 | modifiers VOID_TK error
843 {yyerror ("Identifier expected"); RECOVER;}
846 yyerror ("Invalid method declaration, return type required");
852 identifier OP_TK CP_TK
853 { $$ = method_declarator ($1, NULL_TREE); }
854 | identifier OP_TK formal_parameter_list CP_TK
855 { $$ = method_declarator ($1, $3); }
856 | method_declarator OSB_TK CSB_TK
858 EXPR_WFL_LINECOL (wfl_operator) = $2.location;
860 build_unresolved_array_type (TREE_PURPOSE ($1));
861 parse_warning_context
863 "Discouraged form of returned type specification");
865 | identifier OP_TK error
866 {yyerror ("')' expected"); DRECOVER(method_declarator);}
867 | method_declarator OSB_TK error
868 {yyerror ("']' expected"); RECOVER;}
871 formal_parameter_list:
874 ctxp->formal_parameter_number = 1;
876 | formal_parameter_list C_TK formal_parameter
878 ctxp->formal_parameter_number += 1;
879 $$ = chainon ($1, $3);
881 | formal_parameter_list C_TK error
882 {yyerror ("Missing formal parameter term"); RECOVER;}
886 type variable_declarator_id
888 $$ = build_tree_list ($2, $1);
890 | modifiers type variable_declarator_id /* Added, JDK1.1 final parms */
891 { $$ = parse_jdk1_1_error ("final parameters"); }
893 {yyerror ("Missing identifier"); RECOVER;}
894 | modifiers type error
896 SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
897 yyerror ("Missing identifier"); RECOVER;
903 | THROWS_TK class_type_list
906 {yyerror ("Missing class type term"); RECOVER;}
911 { $$ = build_tree_list ($1, $1); }
912 | class_type_list C_TK class_type
913 { $$ = tree_cons ($3, $3, $1); }
914 | class_type_list C_TK error
915 {yyerror ("Missing class type term"); RECOVER;}
922 { $$ = NULL_TREE; } /* Probably not the right thing to do. */
925 /* 19.8.4 Productions from 8.5: Static Initializers */
929 RULE ("STATIC_INITIALIZER");
931 | static block SC_TK /* Shouldn't be here. FIXME */
933 RULE ("STATIC_INITIALIZER");
937 static: /* Test lval.sub_token here */
940 SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
944 /* 19.8.5 Productions from 8.6: Constructor Declarations */
945 constructor_declaration:
948 current_function_decl = $1;
949 source_start_java_method (current_function_decl);
952 { complete_method_declaration ($3); }
956 constructor_declarator throws
957 { $$ = method_header (0, NULL_TREE, $1, $2); }
958 | modifiers constructor_declarator throws
959 { $$ = method_header ($1, NULL_TREE, $2, $3); }
962 constructor_declarator:
963 simple_name OP_TK CP_TK
964 { $$ = method_declarator ($1, NULL_TREE); }
965 | simple_name OP_TK formal_parameter_list CP_TK
966 { $$ = method_declarator ($1, $3); }
970 /* Unlike regular method, we always need a complete (empty)
971 body so we can safely perform all the required code
972 addition (super invocation and field initialization) */
973 block_begin block_end
975 BLOCK_EXPR_BODY ($2) = empty_stmt_node;
978 | block_begin explicit_constructor_invocation block_end
980 | block_begin block_statements block_end
982 | block_begin explicit_constructor_invocation block_statements block_end
986 /* Error recovery for that rule moved down expression_statement: rule. */
987 explicit_constructor_invocation:
988 this_or_super OP_TK CP_TK SC_TK
990 $$ = build_method_invocation ($1, NULL_TREE);
991 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
992 $$ = java_method_add_stmt (current_function_decl, $$);
994 | this_or_super OP_TK argument_list CP_TK SC_TK
996 $$ = build_method_invocation ($1, $3);
997 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
998 $$ = java_method_add_stmt (current_function_decl, $$);
1000 /* Added, JDK1.1 inner classes. Modified because the rule
1001 'primary' couldn't work. */
1002 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
1003 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1004 | name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
1005 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1008 this_or_super: /* Added, simplifies error diagnostics */
1011 tree wfl = build_wfl_node (this_identifier_node,
1012 input_filename, 0, 0);
1013 EXPR_WFL_LINECOL (wfl) = $1.location;
1018 tree wfl = build_wfl_node (super_identifier_node,
1019 input_filename, 0, 0);
1020 EXPR_WFL_LINECOL (wfl) = $1.location;
1025 /* 19.9 Productions from 9: Interfaces */
1026 /* 19.9.1 Productions from 9.1: Interfaces Declarations */
1027 interface_declaration:
1028 INTERFACE_TK identifier
1029 { create_interface (0, $2, NULL_TREE); }
1034 | modifiers INTERFACE_TK identifier
1035 { create_interface ($1, $3, NULL_TREE); }
1040 | INTERFACE_TK identifier extends_interfaces
1041 { create_interface (0, $2, $3); }
1046 | modifiers INTERFACE_TK identifier extends_interfaces
1047 { create_interface ($1, $3, $4); }
1052 | INTERFACE_TK identifier error
1053 {yyerror ("'{' expected"); RECOVER;}
1054 | modifiers INTERFACE_TK identifier error
1055 {yyerror ("'{' expected"); RECOVER;}
1059 EXTENDS_TK interface_type
1061 ctxp->interface_number = 1;
1062 $$ = build_tree_list ($2, NULL_TREE);
1064 | extends_interfaces C_TK interface_type
1066 ctxp->interface_number++;
1067 $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
1070 {yyerror ("Invalid interface type"); RECOVER;}
1071 | extends_interfaces C_TK error
1072 {yyerror ("Missing term"); RECOVER;}
1078 | OCB_TK interface_member_declarations CCB_TK
1082 interface_member_declarations:
1083 interface_member_declaration
1084 | interface_member_declarations interface_member_declaration
1087 interface_member_declaration:
1088 constant_declaration
1089 | abstract_method_declaration
1090 | class_declaration /* Added, JDK1.1 inner classes */
1091 { $$ = parse_jdk1_1_error ("inner class declaration"); }
1092 | interface_declaration /* Added, JDK1.1 inner classes */
1093 { $$ = parse_jdk1_1_error ("inner interface declaration"); }
1096 constant_declaration:
1100 abstract_method_declaration:
1103 check_abstract_method_header ($1);
1104 current_function_decl = NULL_TREE; /* FIXME ? */
1106 | method_header error
1107 {yyerror ("';' expected"); RECOVER;}
1110 /* 19.10 Productions from 10: Arrays */
1113 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1114 | OCB_TK variable_initializers CCB_TK
1115 { $$ = build_new_array_init ($1.location, $2); }
1116 | OCB_TK variable_initializers C_TK CCB_TK
1117 { $$ = build_new_array_init ($1.location, $2); }
1120 variable_initializers:
1121 variable_initializer
1123 $$ = tree_cons (maybe_build_array_element_wfl ($1),
1126 | variable_initializers C_TK variable_initializer
1128 $$ = tree_cons (maybe_build_array_element_wfl ($3), $3, $1);
1130 | variable_initializers C_TK error
1131 {yyerror ("Missing term"); RECOVER;}
1134 /* 19.11 Production from 14: Blocks and Statements */
1137 { $$ = empty_stmt_node; }
1138 | block_begin block_statements block_end
1150 maybe_absorb_scoping_blocks ();
1157 | block_statements block_statement
1161 local_variable_declaration_statement
1163 { java_method_add_stmt (current_function_decl, $1); }
1164 | class_declaration /* Added, JDK1.1 inner classes */
1165 { parse_jdk1_1_error ("inner class declaration"); }
1168 local_variable_declaration_statement:
1169 local_variable_declaration SC_TK /* Can't catch missing ';' here */
1172 local_variable_declaration:
1173 type variable_declarators
1174 { declare_local_variables (0, $1, $2); }
1175 | modifiers type variable_declarators /* Added, JDK1.1 final locals */
1176 { declare_local_variables ($1, $2, $3); }
1180 statement_without_trailing_substatement
1183 | if_then_else_statement
1187 /* If the for loop is unlabeled, we must return the
1188 block it was defined it. It our last chance to
1189 get a hold on it. */
1190 if (!LOOP_HAS_LABEL_P ($$))
1196 statement_without_trailing_substatement
1197 | labeled_statement_nsi
1198 | if_then_else_statement_nsi
1199 | while_statement_nsi
1203 statement_without_trailing_substatement:
1206 | expression_statement
1210 | continue_statement
1212 | synchronized_statement
1219 { $$ = empty_stmt_node; }
1223 identifier REL_CL_TK
1225 $$ = build_labeled_block (EXPR_WFL_LINECOL ($1),
1226 EXPR_WFL_NODE ($1));
1228 push_labeled_block ($$);
1229 PUSH_LABELED_BLOCK ($$);
1234 label_decl statement
1236 $$ = complete_labeled_statement ($1, $2);
1237 pop_labeled_block ();
1238 POP_LABELED_BLOCK ();
1241 {yyerror ("':' expected"); RECOVER;}
1244 labeled_statement_nsi:
1245 label_decl statement_nsi
1247 $$ = complete_labeled_statement ($1, $2);
1248 pop_labeled_block ();
1249 POP_LABELED_BLOCK ();
1253 /* We concentrate here a bunch of error handling rules that we couldn't write
1254 earlier, because expression_statement catches a missing ';'. */
1255 expression_statement:
1256 statement_expression SC_TK
1258 /* We have a statement. Generate a WFL around it so
1260 $$ = build_expr_wfl ($1, input_filename, lineno, 0);
1261 /* We know we have a statement, so set the debug
1262 info to be eventually generate here. */
1263 $$ = JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
1267 if (ctxp->prevent_ese != lineno)
1268 yyerror ("Invalid expression statement");
1269 DRECOVER (expr_stmt);
1273 if (ctxp->prevent_ese != lineno)
1274 yyerror ("Invalid expression statement");
1275 DRECOVER (expr_stmt);
1279 if (ctxp->prevent_ese != lineno)
1280 yyerror ("Invalid expression statement");
1281 DRECOVER (expr_stmt);
1283 | this_or_super OP_TK error
1284 {yyerror ("')' expected"); RECOVER;}
1285 | this_or_super OP_TK CP_TK error
1287 yyerror ("Constructor invocation must be first "
1288 "thing in a constructor");
1291 | this_or_super OP_TK argument_list error
1292 {yyerror ("')' expected"); RECOVER;}
1293 | this_or_super OP_TK argument_list CP_TK error
1295 yyerror ("Constructor invocation must be first "
1296 "thing in a constructor");
1299 | name DOT_TK SUPER_TK error
1300 {yyerror ("'(' expected"); RECOVER;}
1301 | name DOT_TK SUPER_TK OP_TK error
1302 {yyerror ("')' expected"); RECOVER;}
1303 | name DOT_TK SUPER_TK OP_TK argument_list error
1304 {yyerror ("')' expected"); RECOVER;}
1305 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK error
1306 {yyerror ("';' expected"); RECOVER;}
1307 | name DOT_TK SUPER_TK OP_TK CP_TK error
1308 {yyerror ("';' expected"); RECOVER;}
1311 statement_expression:
1313 | pre_increment_expression
1314 | pre_decrement_expression
1315 | post_increment_expression
1316 | post_decrement_expression
1318 | class_instance_creation_expression
1322 IF_TK OP_TK expression CP_TK statement
1323 { $$ = build_if_else_statement ($2.location, $3, $5, NULL_TREE); }
1325 {yyerror ("'(' expected"); RECOVER;}
1327 {yyerror ("Missing term"); RECOVER;}
1328 | IF_TK OP_TK expression error
1329 {yyerror ("')' expected"); RECOVER;}
1332 if_then_else_statement:
1333 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
1334 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1337 if_then_else_statement_nsi:
1338 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
1339 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1349 /* Make into "proper list" of COMPOUND_EXPRs.
1350 I.e. make the last statment also have its own
1352 maybe_absorb_scoping_blocks ();
1353 TREE_OPERAND ($1, 1) = exit_block ();
1354 $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $1);
1359 SWITCH_TK OP_TK expression CP_TK
1361 $$ = build (SWITCH_EXPR, NULL_TREE, $3, NULL_TREE);
1362 EXPR_WFL_LINECOL ($$) = $2.location;
1365 {yyerror ("'(' expected"); RECOVER;}
1366 | SWITCH_TK OP_TK error
1367 {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);}
1368 | SWITCH_TK OP_TK expression CP_TK error
1369 {yyerror ("'{' expected"); RECOVER;}
1372 /* Default assignment is there to avoid type node on switch_block
1378 | OCB_TK switch_labels CCB_TK
1380 | OCB_TK switch_block_statement_groups CCB_TK
1382 | OCB_TK switch_block_statement_groups switch_labels CCB_TK
1386 switch_block_statement_groups:
1387 switch_block_statement_group
1388 | switch_block_statement_groups switch_block_statement_group
1391 switch_block_statement_group:
1392 switch_labels block_statements
1397 | switch_labels switch_label
1401 CASE_TK constant_expression REL_CL_TK
1403 tree lab = build1 (CASE_EXPR, NULL_TREE, $2);
1404 EXPR_WFL_LINECOL (lab) = $1.location;
1405 java_method_add_stmt (current_function_decl, lab);
1407 | DEFAULT_TK REL_CL_TK
1409 tree lab = build1 (DEFAULT_EXPR, NULL_TREE, NULL_TREE);
1410 EXPR_WFL_LINECOL (lab) = $1.location;
1411 java_method_add_stmt (current_function_decl, lab);
1414 {yyerror ("Missing or invalid constant expression"); RECOVER;}
1415 | CASE_TK constant_expression error
1416 {yyerror ("':' expected"); RECOVER;}
1418 {yyerror ("':' expected"); RECOVER;}
1422 WHILE_TK OP_TK expression CP_TK
1424 tree body = build_loop_body ($2.location, $3, 0);
1425 $$ = build_new_loop (body);
1430 while_expression statement
1431 { $$ = complete_loop_body (0, NULL_TREE, $2, 0); }
1433 {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;}
1434 | WHILE_TK OP_TK error
1435 {yyerror ("Missing term and ')' expected"); RECOVER;}
1436 | WHILE_TK OP_TK expression error
1437 {yyerror ("')' expected"); RECOVER;}
1440 while_statement_nsi:
1441 while_expression statement_nsi
1442 { $$ = complete_loop_body (0, NULL_TREE, $2, 0); }
1448 tree body = build_loop_body (0, NULL_TREE, 1);
1449 $$ = build_new_loop (body);
1451 /* Need error handing here. FIXME */
1455 do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1456 { $$ = complete_loop_body ($4.location, $5, $2, 1); }
1460 for_begin SC_TK expression SC_TK for_update CP_TK statement
1461 { $$ = complete_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);}
1462 | for_begin SC_TK SC_TK for_update CP_TK statement
1464 $$ = complete_for_loop (0, NULL_TREE, $4, $6);
1465 /* We have not condition, so we get rid of the EXIT_EXPR */
1466 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1469 | for_begin SC_TK error
1470 {yyerror ("Invalid control expression"); RECOVER;}
1471 | for_begin SC_TK expression SC_TK error
1472 {yyerror ("Invalid update expression"); RECOVER;}
1473 | for_begin SC_TK SC_TK error
1474 {yyerror ("Invalid update expression"); RECOVER;}
1478 for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
1479 { $$ = complete_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);}
1480 | for_begin SC_TK SC_TK for_update CP_TK statement_nsi
1482 $$ = complete_for_loop (0, NULL_TREE, $4, $6);
1483 /* We have not condition, so we get rid of the EXIT_EXPR */
1484 LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1492 /* This scope defined for local variable that may be
1493 defined within the scope of the for loop */
1497 {yyerror ("'(' expected"); DRECOVER(for_1);}
1498 | FOR_TK OP_TK error
1499 {yyerror ("Invalid init statement"); RECOVER;}
1505 /* We now declare the loop body. The loop is
1506 declared as a for loop. */
1507 tree body = build_loop_body (0, NULL_TREE, 0);
1508 $$ = build_new_loop (body);
1509 IS_FOR_LOOP_P ($$) = 1;
1510 /* The loop is added to the current block the for
1511 statement is defined within */
1512 java_method_add_stmt (current_function_decl, $$);
1515 for_init: /* Can be empty */
1516 { $$ = empty_stmt_node; }
1517 | statement_expression_list
1519 /* Init statement recorded within the previously
1520 defined block scope */
1521 $$ = java_method_add_stmt (current_function_decl, $1);
1523 | local_variable_declaration
1525 /* Local variable are recorded within the previously
1526 defined block scope */
1529 | statement_expression_list error
1530 {yyerror ("';' expected"); DRECOVER(for_init_1);}
1533 for_update: /* Can be empty */
1534 {$$ = empty_stmt_node;}
1535 | statement_expression_list
1536 { $$ = build_debugable_stmt (BUILD_LOCATION (), $1); }
1539 statement_expression_list:
1540 statement_expression
1541 { $$ = add_stmt_to_compound (NULL_TREE, NULL_TREE, $1); }
1542 | statement_expression_list C_TK statement_expression
1543 { $$ = add_stmt_to_compound ($1, NULL_TREE, $3); }
1544 | statement_expression_list C_TK error
1545 {yyerror ("Missing term"); RECOVER;}
1550 { $$ = build_bc_statement ($1.location, 1, NULL_TREE); }
1551 | BREAK_TK identifier SC_TK
1552 { $$ = build_bc_statement ($1.location, 1, $2); }
1554 {yyerror ("Missing term"); RECOVER;}
1555 | BREAK_TK identifier error
1556 {yyerror ("';' expected"); RECOVER;}
1561 { $$ = build_bc_statement ($1.location, 0, NULL_TREE); }
1562 | CONTINUE_TK identifier SC_TK
1563 { $$ = build_bc_statement ($1.location, 0, $2); }
1565 {yyerror ("Missing term"); RECOVER;}
1566 | CONTINUE_TK identifier error
1567 {yyerror ("';' expected"); RECOVER;}
1572 { $$ = build_return ($1.location, NULL_TREE); }
1573 | RETURN_TK expression SC_TK
1574 { $$ = build_return ($1.location, $2); }
1576 {yyerror ("Missing term"); RECOVER;}
1577 | RETURN_TK expression error
1578 {yyerror ("';' expected"); RECOVER;}
1582 THROW_TK expression SC_TK
1584 $$ = build1 (THROW_EXPR, NULL_TREE, $2);
1585 EXPR_WFL_LINECOL ($$) = $1.location;
1588 {yyerror ("Missing term"); RECOVER;}
1589 | THROW_TK expression error
1590 {yyerror ("';' expected"); RECOVER;}
1593 synchronized_statement:
1594 synchronized OP_TK expression CP_TK block
1596 $$ = build (SYNCHRONIZED_EXPR, NULL_TREE, $3, $5);
1597 EXPR_WFL_LINECOL ($$) =
1598 EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK));
1600 | synchronized OP_TK expression CP_TK error
1601 {yyerror ("'{' expected"); RECOVER;}
1602 | synchronized error
1603 {yyerror ("'(' expected"); RECOVER;}
1604 | synchronized OP_TK error CP_TK
1605 {yyerror ("Missing term"); RECOVER;}
1606 | synchronized OP_TK error
1607 {yyerror ("Missing term"); RECOVER;}
1613 if ((1 << $1) != ACC_SYNCHRONIZED)
1614 fatal ("synchronized was '%d' - yyparse", (1 << $1));
1619 TRY_TK block catches
1620 { $$ = build_try_statement ($1.location, $2, $3); }
1621 | TRY_TK block finally
1622 { $$ = build_try_finally_statement ($1.location, $2, $3); }
1623 | TRY_TK block catches finally
1624 { $$ = build_try_finally_statement ($1.location,
1625 build_try_statement ($1.location,
1629 {yyerror ("'{' expected"); DRECOVER (try_statement);}
1634 | catches catch_clause
1636 TREE_CHAIN ($2) = $1;
1642 catch_clause_parameter block
1644 java_method_add_stmt (current_function_decl, $2);
1649 catch_clause_parameter:
1650 CATCH_TK OP_TK formal_parameter CP_TK
1652 /* We add a block to define a scope for
1653 formal_parameter (CCBP). The formal parameter is
1654 declared initialized by the appropriate function
1656 tree ccpb = enter_block ();
1657 tree init = build_assignment (ASSIGN_TK, $2.location,
1659 soft_exceptioninfo_call_node);
1660 declare_local_variables (0, TREE_VALUE ($3),
1661 build_tree_list (TREE_PURPOSE ($3),
1663 $$ = build1 (CATCH_EXPR, NULL_TREE, ccpb);
1664 EXPR_WFL_LINECOL ($$) = $1.location;
1667 {yyerror ("'(' expected"); RECOVER;}
1668 | CATCH_TK OP_TK error
1669 {yyerror ("Missing term or ')' expected"); DRECOVER (2);}
1670 | CATCH_TK OP_TK error CP_TK /* That's for () */
1671 {yyerror ("')' expected"); DRECOVER (1);}
1678 {yyerror ("'{' expected"); RECOVER; }
1681 /* 19.12 Production from 15: Expressions */
1683 primary_no_new_array
1684 | array_creation_expression
1687 primary_no_new_array:
1690 { $$ = build_this ($1.location); }
1691 | OP_TK expression CP_TK
1693 | class_instance_creation_expression
1697 /* type DOT_TK CLASS_TK doens't work. So we split the rule
1698 'type' into its components. Missing is something for array,
1699 which will complete the reference_type part. FIXME */
1700 | name DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
1701 { $$ = parse_jdk1_1_error ("named class literals"); }
1702 | primitive_type DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
1703 { $$ = build_class_ref ($1); }
1704 | VOID_TK DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
1705 { $$ = build_class_ref (void_type_node); }
1706 /* Added, JDK1.1 inner classes. Documentation is wrong
1707 refering to a 'ClassName' (class_name) rule that doesn't
1708 exist. Used name instead. */
1709 | name DOT_TK THIS_TK
1710 { $$ = parse_jdk1_1_error ("class literals"); }
1711 | OP_TK expression error
1712 {yyerror ("')' expected"); RECOVER;}
1714 {yyerror ("'class' or 'this' expected" ); RECOVER;}
1715 | primitive_type DOT_TK error
1716 {yyerror ("'class' expected" ); RECOVER;}
1717 | VOID_TK DOT_TK error
1718 {yyerror ("'class' expected" ); RECOVER;}
1721 class_instance_creation_expression:
1722 NEW_TK class_type OP_TK argument_list CP_TK
1723 { $$ = build_new_invocation ($2, $4); }
1724 | NEW_TK class_type OP_TK CP_TK
1725 { $$ = build_new_invocation ($2, NULL_TREE); }
1726 /* Added, JDK1.1 inner classes but modified to use
1727 'class_type' instead of 'TypeName' (type_name) mentionned
1728 in the documentation but doesn't exist. */
1729 | NEW_TK class_type OP_TK argument_list CP_TK class_body
1730 { $$ = parse_jdk1_1_error ("inner class instance creation"); }
1731 | NEW_TK class_type OP_TK CP_TK class_body
1732 { $$ = parse_jdk1_1_error ("inner class instance creation"); }
1733 /* Added, JDK1.1 inner classes, modified to use name or
1734 primary instead of primary solely which couldn't work in
1736 | something_dot_new identifier OP_TK CP_TK
1737 | something_dot_new identifier OP_TK CP_TK class_body
1738 | something_dot_new identifier OP_TK argument_list CP_TK
1739 | something_dot_new identifier OP_TK argument_list CP_TK class_body
1740 | NEW_TK error SC_TK
1741 {yyerror ("'(' expected"); DRECOVER(new_1);}
1742 | NEW_TK class_type error
1743 {yyerror ("'(' expected"); RECOVER;}
1744 | NEW_TK class_type OP_TK error
1745 {yyerror ("')' or term expected"); RECOVER;}
1746 | NEW_TK class_type OP_TK argument_list error
1747 {yyerror ("')' expected"); RECOVER;}
1748 | something_dot_new error
1749 {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;}
1750 | something_dot_new identifier error
1751 {yyerror ("'(' expected"); RECOVER;}
1754 something_dot_new: /* Added, not part of the specs. */
1756 | primary DOT_TK NEW_TK
1762 $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
1763 ctxp->formal_parameter_number = 1;
1765 | argument_list C_TK expression
1767 ctxp->formal_parameter_number += 1;
1768 $$ = tree_cons (NULL_TREE, $3, $1);
1770 | argument_list C_TK error
1771 {yyerror ("Missing term"); RECOVER;}
1774 array_creation_expression:
1775 NEW_TK primitive_type dim_exprs
1776 { $$ = build_newarray_node ($2, $3, 0); }
1777 | NEW_TK class_or_interface_type dim_exprs
1778 { $$ = build_newarray_node ($2, $3, 0); }
1779 | NEW_TK primitive_type dim_exprs dims
1780 { $$ = build_newarray_node ($2, $3, CURRENT_OSB (ctxp));}
1781 | NEW_TK class_or_interface_type dim_exprs dims
1782 { $$ = build_newarray_node ($2, $3, CURRENT_OSB (ctxp));}
1783 /* Added, JDK1.1 anonymous array. Initial documentation rule
1785 | NEW_TK class_or_interface_type dims array_initializer
1786 { $$ = parse_jdk1_1_error ("anonymous array"); }
1787 | NEW_TK primitive_type dims array_initializer
1788 { $$ = parse_jdk1_1_error ("anonymous array"); }
1789 | NEW_TK error CSB_TK
1790 {yyerror ("'[' expected"); DRECOVER ("]");}
1791 | NEW_TK error OSB_TK
1792 {yyerror ("']' expected"); RECOVER;}
1797 { $$ = build_tree_list (NULL_TREE, $1); }
1798 | dim_exprs dim_expr
1799 { $$ = tree_cons (NULL_TREE, $2, $$); }
1803 OSB_TK expression CSB_TK
1805 EXPR_WFL_LINECOL ($2) = $1.location;
1808 | OSB_TK expression error
1809 {yyerror ("']' expected"); RECOVER;}
1812 yyerror ("Missing term");
1813 yyerror ("']' expected");
1822 /* If not initialized, allocate memory for the osb
1824 if (!ctxp->osb_limit)
1826 allocate = ctxp->osb_limit = 32;
1827 ctxp->osb_depth = -1;
1829 /* If capacity overflown, reallocate a bigger chuck */
1830 else if (ctxp->osb_depth+1 == ctxp->osb_limit)
1831 allocate = ctxp->osb_limit << 1;
1835 allocate *= sizeof (int);
1836 if (ctxp->osb_number)
1837 ctxp->osb_number = (int *)xrealloc (ctxp->osb_number,
1840 ctxp->osb_number = (int *)xmalloc (allocate);
1843 CURRENT_OSB (ctxp) = 1;
1845 | dims OSB_TK CSB_TK
1846 { CURRENT_OSB (ctxp)++; }
1848 { yyerror ("']' expected"); RECOVER;}
1852 primary DOT_TK identifier
1853 { $$ = make_qualified_primary ($1, $3, $2.location); }
1854 /* FIXME - REWRITE TO:
1855 { $$ = build_binop (COMPONENT_REF, $2.location, $1, $3); } */
1856 | SUPER_TK DOT_TK identifier
1859 build_wfl_node (super_identifier_node,
1860 input_filename, 0, 0);
1861 EXPR_WFL_LINECOL (super_wfl) = $1.location;
1862 $$ = make_qualified_name (super_wfl, $3, $2.location);
1865 {yyerror ("Field expected"); DRECOVER (super_field_acces);}
1870 { $$ = build_method_invocation ($1, NULL_TREE); }
1871 | name OP_TK argument_list CP_TK
1872 { $$ = build_method_invocation ($1, $3); }
1873 | primary DOT_TK identifier OP_TK CP_TK
1875 if (TREE_CODE ($1) == THIS_EXPR)
1876 $$ = build_this_super_qualified_invocation
1877 (1, $3, NULL_TREE, 0, $2.location);
1880 tree invok = build_method_invocation ($3, NULL_TREE);
1881 $$ = make_qualified_primary ($1, invok, $2.location);
1884 | primary DOT_TK identifier OP_TK argument_list CP_TK
1886 if (TREE_CODE ($1) == THIS_EXPR)
1887 $$ = build_this_super_qualified_invocation
1888 (1, $3, $5, 0, $2.location);
1891 tree invok = build_method_invocation ($3, $5);
1892 $$ = make_qualified_primary ($1, invok, $2.location);
1895 | SUPER_TK DOT_TK identifier OP_TK CP_TK
1897 $$ = build_this_super_qualified_invocation
1898 (0, $3, NULL_TREE, $1.location, $2.location);
1900 | SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
1902 $$ = build_this_super_qualified_invocation
1903 (0, $3, $5, $1.location, $2.location);
1905 /* Screws up thing. I let it here until I'm convinced it can
1907 | primary DOT_TK error
1908 {yyerror ("'(' expected"); DRECOVER(bad);} */
1909 | SUPER_TK DOT_TK error CP_TK
1910 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
1911 | SUPER_TK DOT_TK error DOT_TK
1912 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
1916 name OSB_TK expression CSB_TK
1917 { $$ = build_array_ref ($2.location, $1, $3); }
1918 | primary_no_new_array OSB_TK expression CSB_TK
1919 { $$ = build_array_ref ($2.location, $1, $3); }
1922 yyerror ("Missing term and ']' expected");
1923 DRECOVER(array_access);
1925 | name OSB_TK expression error
1927 yyerror ("']' expected");
1928 DRECOVER(array_access);
1930 | primary_no_new_array OSB_TK error
1932 yyerror ("Missing term and ']' expected");
1933 DRECOVER(array_access);
1935 | primary_no_new_array OSB_TK expression error
1937 yyerror ("']' expected");
1938 DRECOVER(array_access);
1945 | post_increment_expression
1946 | post_decrement_expression
1949 post_increment_expression:
1950 postfix_expression INCR_TK
1951 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
1954 post_decrement_expression:
1955 postfix_expression DECR_TK
1956 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
1960 pre_increment_expression
1961 | pre_decrement_expression
1962 | PLUS_TK unary_expression
1963 {$$ = build_unaryop ($1.token, $1.location, $2); }
1964 | MINUS_TK unary_expression
1965 {$$ = build_unaryop ($1.token, $1.location, $2); }
1966 | unary_expression_not_plus_minus
1968 {yyerror ("Missing term"); RECOVER}
1970 {yyerror ("Missing term"); RECOVER}
1973 pre_increment_expression:
1974 INCR_TK unary_expression
1975 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
1977 {yyerror ("Missing term"); RECOVER}
1980 pre_decrement_expression:
1981 DECR_TK unary_expression
1982 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
1984 {yyerror ("Missing term"); RECOVER}
1987 unary_expression_not_plus_minus:
1989 | NOT_TK unary_expression
1990 {$$ = build_unaryop ($1.token, $1.location, $2); }
1991 | NEG_TK unary_expression
1992 {$$ = build_unaryop ($1.token, $1.location, $2); }
1995 {yyerror ("Missing term"); RECOVER}
1997 {yyerror ("Missing term"); RECOVER}
2000 cast_expression: /* Error handling here is potentially weak */
2001 OP_TK primitive_type dims CP_TK unary_expression
2004 while (CURRENT_OSB (ctxp)--)
2005 type = build_java_array_type (type, -1);
2007 $$ = build_cast ($1.location, type, $5);
2009 | OP_TK primitive_type CP_TK unary_expression
2010 { $$ = build_cast ($1.location, $2, $4); }
2011 | OP_TK expression CP_TK unary_expression_not_plus_minus
2012 { $$ = build_cast ($1.location, $2, $4); }
2013 | OP_TK name dims CP_TK unary_expression_not_plus_minus
2016 while (CURRENT_OSB (ctxp)--)
2017 obstack_1grow (&temporary_obstack, '[');
2019 obstack_grow0 (&temporary_obstack,
2020 IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)),
2021 IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2)));
2022 ptr = obstack_finish (&temporary_obstack);
2023 EXPR_WFL_NODE ($2) = get_identifier (ptr);
2024 $$ = build_cast ($1.location, $2, $5);
2026 | OP_TK primitive_type OSB_TK error
2027 {yyerror ("']' expected, invalid type expression");}
2030 if (ctxp->prevent_ese != lineno)
2031 yyerror ("Invalid type expression"); RECOVER;
2034 | OP_TK primitive_type dims CP_TK error
2035 {yyerror ("Missing term"); RECOVER;}
2036 | OP_TK primitive_type CP_TK error
2037 {yyerror ("Missing term"); RECOVER;}
2038 | OP_TK name dims CP_TK error
2039 {yyerror ("Missing term"); RECOVER;}
2042 multiplicative_expression:
2044 | multiplicative_expression MULT_TK unary_expression
2046 $$ = build_binop (BINOP_LOOKUP ($2.token),
2047 $2.location, $1, $3);
2049 | multiplicative_expression DIV_TK unary_expression
2051 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2054 | multiplicative_expression REM_TK unary_expression
2056 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2059 | multiplicative_expression MULT_TK error
2060 {yyerror ("Missing term"); RECOVER;}
2061 | multiplicative_expression DIV_TK error
2062 {yyerror ("Missing term"); RECOVER;}
2063 | multiplicative_expression REM_TK error
2064 {yyerror ("Missing term"); RECOVER;}
2067 additive_expression:
2068 multiplicative_expression
2069 | additive_expression PLUS_TK multiplicative_expression
2071 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2074 | additive_expression MINUS_TK multiplicative_expression
2076 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2079 | additive_expression PLUS_TK error
2080 {yyerror ("Missing term"); RECOVER;}
2081 | additive_expression MINUS_TK error
2082 {yyerror ("Missing term"); RECOVER;}
2087 | shift_expression LS_TK additive_expression
2089 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2092 | shift_expression SRS_TK additive_expression
2094 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2097 | shift_expression ZRS_TK additive_expression
2099 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2102 | shift_expression LS_TK error
2103 {yyerror ("Missing term"); RECOVER;}
2104 | shift_expression SRS_TK error
2105 {yyerror ("Missing term"); RECOVER;}
2106 | shift_expression ZRS_TK error
2107 {yyerror ("Missing term"); RECOVER;}
2110 relational_expression:
2112 | relational_expression LT_TK shift_expression
2114 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2117 | relational_expression GT_TK shift_expression
2119 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2122 | relational_expression LTE_TK shift_expression
2124 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2127 | relational_expression GTE_TK shift_expression
2129 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2132 | relational_expression INSTANCEOF_TK reference_type
2133 { $$ = build_binop (INSTANCEOF_EXPR, $2.location, $1, $3); }
2134 | relational_expression LT_TK error
2135 {yyerror ("Missing term"); RECOVER;}
2136 | relational_expression GT_TK error
2137 {yyerror ("Missing term"); RECOVER;}
2138 | relational_expression LTE_TK error
2139 {yyerror ("Missing term"); RECOVER;}
2140 | relational_expression GTE_TK error
2141 {yyerror ("Missing term"); RECOVER;}
2142 | relational_expression INSTANCEOF_TK error
2143 {yyerror ("Invalid reference type"); RECOVER;}
2146 equality_expression:
2147 relational_expression
2148 | equality_expression EQ_TK relational_expression
2150 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2153 | equality_expression NEQ_TK relational_expression
2155 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2158 | equality_expression EQ_TK error
2159 {yyerror ("Missing term"); RECOVER;}
2160 | equality_expression NEQ_TK error
2161 {yyerror ("Missing term"); RECOVER;}
2166 | and_expression AND_TK equality_expression
2168 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2171 | and_expression AND_TK error
2172 {yyerror ("Missing term"); RECOVER;}
2175 exclusive_or_expression:
2177 | exclusive_or_expression XOR_TK and_expression
2179 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2182 | exclusive_or_expression XOR_TK error
2183 {yyerror ("Missing term"); RECOVER;}
2186 inclusive_or_expression:
2187 exclusive_or_expression
2188 | inclusive_or_expression OR_TK exclusive_or_expression
2190 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2193 | inclusive_or_expression OR_TK error
2194 {yyerror ("Missing term"); RECOVER;}
2197 conditional_and_expression:
2198 inclusive_or_expression
2199 | conditional_and_expression BOOL_AND_TK inclusive_or_expression
2201 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2204 | conditional_and_expression BOOL_AND_TK error
2205 {yyerror ("Missing term"); RECOVER;}
2208 conditional_or_expression:
2209 conditional_and_expression
2210 | conditional_or_expression BOOL_OR_TK conditional_and_expression
2212 $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2215 | conditional_or_expression BOOL_OR_TK error
2216 {yyerror ("Missing term"); RECOVER;}
2219 conditional_expression: /* Error handling here is weak */
2220 conditional_or_expression
2221 | conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
2223 $$ = build (CONDITIONAL_EXPR, NULL_TREE, $1, $3, $5);
2224 EXPR_WFL_LINECOL ($$) = $2.location;
2226 | conditional_or_expression REL_QM_TK REL_CL_TK error
2229 yyerror ("Missing term");
2232 | conditional_or_expression REL_QM_TK error
2233 {yyerror ("Missing term"); DRECOVER (2);}
2234 | conditional_or_expression REL_QM_TK expression REL_CL_TK error
2235 {yyerror ("Missing term"); DRECOVER (3);}
2238 assignment_expression:
2239 conditional_expression
2244 left_hand_side assignment_operator assignment_expression
2245 { $$ = build_assignment ($2.token, $2.location, $1, $3); }
2246 | left_hand_side assignment_operator error
2248 if (ctxp->prevent_ese != lineno)
2249 yyerror ("Missing term");
2260 assignment_operator:
2266 assignment_expression
2269 constant_expression:
2278 /* Flag for the error report routine to issue the error the first time
2279 it's called (overriding the default behavior which is to drop the
2280 first invocation and honor the second one, taking advantage of a
2282 static int force_error = 0;
2284 /* Create a new parser context and make it the current one. */
2287 java_push_parser_context ()
2289 struct parser_ctxt *new =
2290 (struct parser_ctxt *)xmalloc(sizeof (struct parser_ctxt));
2292 bzero (new, sizeof (struct parser_ctxt));
2297 ctxp->incomplete_class = ctxp->next->incomplete_class;
2298 ctxp->gclass_list = ctxp->next->gclass_list;
2302 /* If the first file of a file list was a class file, no context
2303 exists for a source file to be parsed. This boolean remembers that
2304 java_parser_context_save_global might have created a dummy one, so
2305 that java_parser_context_restore_global can pop it. */
2306 static int extra_ctxp_pushed_p = 0;
2309 java_parser_context_save_global ()
2313 java_push_parser_context ();
2314 extra_ctxp_pushed_p = 1;
2316 ctxp->finput = finput;
2317 ctxp->lineno = lineno;
2318 ctxp->current_class = current_class;
2319 ctxp->filename = input_filename;
2320 ctxp->current_function_decl = current_function_decl;
2324 java_parser_context_restore_global ()
2326 finput = ctxp->finput;
2327 lineno = ctxp->lineno;
2328 current_class = ctxp->current_class;
2329 input_filename = ctxp->filename;
2330 current_function_decl = ctxp->current_function_decl;
2331 if (!ctxp->next && extra_ctxp_pushed_p)
2333 java_pop_parser_context (0);
2334 extra_ctxp_pushed_p = 0;
2339 java_pop_parser_context (generate)
2343 struct parser_ctxt *toFree, *next;
2352 next->incomplete_class = ctxp->incomplete_class;
2353 next->gclass_list = ctxp->gclass_list;
2354 lineno = ctxp->lineno;
2355 finput = ctxp->finput;
2356 current_class = ctxp->current_class;
2359 /* Set the single import class file flag to 0 for the current list
2360 of imported things */
2361 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2362 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_PURPOSE (current)) = 0;
2364 /* And restore those of the previous context */
2365 if ((ctxp = next)) /* Assignment is really meant here */
2366 for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2367 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_PURPOSE (current)) = 1;
2371 toFree->next = ctxp_for_generation;
2372 ctxp_for_generation = toFree;
2378 /* Reporting JDK1.1 features not implemented */
2381 parse_jdk1_1_error (msg)
2384 sorry (": `%s' JDK1.1(TM) feature", msg);
2386 return empty_stmt_node;
2389 static int do_warning = 0;
2396 static int prev_lineno;
2397 static char *prev_msg;
2400 char *remainder, *code_from_source;
2401 extern struct obstack temporary_obstack;
2403 if (!force_error && prev_lineno == lineno)
2406 /* Save current error location but report latter, when the context is
2408 if (ctxp->java_error_flag == 0)
2410 ctxp->java_error_flag = 1;
2412 /* Do something to use the previous line if we're reaching the
2413 end of the file... */
2414 #ifdef VERBOSE_SKELETON
2415 printf ("* Error detected (%s)\n", (msg ? msg : "(null)"));
2420 /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
2421 if (!force_error && msg == prev_msg && prev_lineno == elc.line)
2424 ctxp->java_error_flag = 0;
2426 java_warning_count++;
2430 if (elc.col == 0 && msg[1] == ';')
2432 elc.col = ctxp->p_line->char_col-1;
2433 elc.line = ctxp->p_line->lineno;
2436 save_lineno = lineno;
2437 prev_lineno = lineno = elc.line;
2440 code_from_source = java_get_line_col (ctxp->filename, elc.line, elc.col);
2441 obstack_grow0 (&temporary_obstack,
2442 code_from_source, strlen (code_from_source));
2443 remainder = obstack_finish (&temporary_obstack);
2445 warning ("%s.\n%s", msg, remainder);
2447 error ("%s.\n%s", msg, remainder);
2449 /* This allow us to cheaply avoid an extra 'Invalid expression
2450 statement' error report when errors have been already reported on
2451 the same line. This occurs when we report an error but don't have
2452 a synchronization point other than ';', which
2453 expression_statement is the only one to take care of. */
2454 ctxp->prevent_ese = lineno = save_lineno;
2458 issue_warning_error_from_context (cl, msg, ap)
2463 char *saved, *saved_input_filename;
2465 vsprintf (buffer, msg, ap);
2468 ctxp->elc.line = EXPR_WFL_LINENO (cl);
2469 ctxp->elc.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1 :
2470 (EXPR_WFL_COLNO (cl) == 0xffe ? -2 : EXPR_WFL_COLNO (cl)));
2472 /* We have a CL, that's a good reason for using it if it contains data */
2473 saved = ctxp->filename;
2474 if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
2475 ctxp->filename = EXPR_WFL_FILENAME (cl);
2476 saved_input_filename = input_filename;
2477 input_filename = ctxp->filename;
2479 java_error (buffer);
2480 ctxp->filename = saved;
2481 input_filename = saved_input_filename;
2485 /* Issue an error message at a current source line CL */
2488 parse_error_context VPROTO ((tree cl, const char *msg, ...))
2490 #ifndef ANSI_PROTOTYPES
2497 #ifndef ANSI_PROTOTYPES
2498 cl = va_arg (ap, tree);
2499 msg = va_arg (ap, const char *);
2501 issue_warning_error_from_context (cl, msg, ap);
2505 /* Issue a warning at a current source line CL */
2508 parse_warning_context VPROTO ((tree cl, const char *msg, ...))
2510 #ifndef ANSI_PROTOTYPES
2517 #ifndef ANSI_PROTOTYPES
2518 cl = va_arg (ap, tree);
2519 msg = va_arg (ap, const char *);
2522 force_error = do_warning = 1;
2523 issue_warning_error_from_context (cl, msg, ap);
2524 do_warning = force_error = 0;
2529 find_expr_with_wfl (node)
2537 switch (TREE_CODE (node))
2540 node = BLOCK_EXPR_BODY (node);
2544 to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
2547 node = TREE_OPERAND (node, 1);
2551 node = TREE_OPERAND (node, 0);
2554 case LABELED_BLOCK_EXPR:
2555 node = TREE_OPERAND (node, 1);
2559 code = TREE_CODE_CLASS (TREE_CODE (node));
2560 if (((code == '1') || (code == '2') || (code == 'e'))
2561 && EXPR_WFL_LINECOL (node))
2569 /* Issue a missing return statement error. Uses METHOD to figure the
2570 last line of the method the error occurs in. */
2573 missing_return_error (method)
2576 EXPR_WFL_SET_LINECOL (wfl_operator, DECL_SOURCE_LINE_LAST (method), -2);
2577 parse_error_context (wfl_operator, "Missing return statement");
2580 /* Issue an unreachable statement error. From NODE, find the next
2581 statement to report appropriately. */
2583 unreachable_stmt_error (node)
2586 /* Browse node to find the next expression node that has a WFL. Use
2587 the location to report the error */
2588 if (TREE_CODE (node) == COMPOUND_EXPR)
2589 node = find_expr_with_wfl (TREE_OPERAND (node, 1));
2591 node = find_expr_with_wfl (node);
2595 EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
2596 parse_error_context (wfl_operator, "Unreachable statement");
2599 fatal ("Can't get valid statement - unreachable_stmt_error");
2603 java_report_errors ()
2605 if (java_error_count)
2606 fprintf (stderr, "%d error%s",
2607 java_error_count, (java_error_count == 1 ? "" : "s"));
2608 if (java_warning_count)
2609 fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
2610 java_warning_count, (java_warning_count == 1 ? "" : "s"));
2611 if (java_error_count || java_warning_count)
2612 putc ('\n', stderr);
2613 return java_error_count;
2617 java_accstring_lookup (flags)
2620 static char buffer [80];
2621 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
2623 /* Access modifier looked-up first for easier report on forbidden
2625 if (flags & ACC_PUBLIC) COPY_RETURN ("public");
2626 if (flags & ACC_PRIVATE) COPY_RETURN ("private");
2627 if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
2628 if (flags & ACC_STATIC) COPY_RETURN ("static");
2629 if (flags & ACC_FINAL) COPY_RETURN ("final");
2630 if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
2631 if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
2632 if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
2633 if (flags & ACC_NATIVE) COPY_RETURN ("native");
2634 if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
2635 if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
2642 /* Issuing error messages upon redefinition of classes, interfaces or
2646 classitf_redefinition_error (context, id, decl, cl)
2650 parse_error_context (cl, "%s `%s' already defined in %s:%d",
2651 context, IDENTIFIER_POINTER (id),
2652 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
2653 /* Here we should point out where its redefined. It's a unicode. FIXME */
2657 variable_redefinition_error (context, name, type, line)
2658 tree context, name, type;
2663 /* Figure a proper name for type. We might haven't resolved it */
2664 if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
2665 type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
2667 type_name = lang_printable_name (type, 0);
2669 parse_error_context (context,
2670 "Variable `%s' is already defined in this method and "
2671 "was declared `%s %s' at line %d",
2672 IDENTIFIER_POINTER (name),
2673 type_name, IDENTIFIER_POINTER (name), line);
2677 build_array_from_name (type, type_wfl, name, ret_name)
2678 tree type, type_wfl, name, *ret_name;
2683 /* Eventually get more dims */
2684 string = IDENTIFIER_POINTER (name);
2685 while (string [more_dims] == '[')
2688 /* If we have, then craft a new type for this variable */
2691 name = get_identifier (&string [more_dims]);
2693 /* If we have a pointer, use its type */
2694 if (TREE_CODE (type) == POINTER_TYPE)
2695 type = TREE_TYPE (type);
2697 /* Building the first dimension of a primitive type uses this
2699 if (JPRIMITIVE_TYPE_P (type))
2701 type = build_java_array_type (type, -1);
2702 CLASS_LOADED_P (type) = 1;
2705 /* Otherwise, if we have a WFL for this type, use it (the type
2706 is already an array on an unresolved type, and we just keep
2707 on adding dimensions) */
2711 /* Add all the dimensions */
2713 type = build_unresolved_array_type (type);
2715 /* The type may have been incomplete in the first place */
2717 type = obtain_incomplete_type (type);
2724 /* Build something that the type identifier resolver will identify as
2725 being an array to an unresolved type. TYPE_WFL is a WFL on a
2729 build_unresolved_array_type (type_or_wfl)
2734 /* TYPE_OR_WFL might be an array on a resolved type. In this case,
2735 just create a array type */
2736 if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
2738 tree type = build_java_array_type (type_or_wfl, -1);
2739 CLASS_LOADED_P (type) = CLASS_LOADED_P (type_or_wfl);
2743 obstack_1grow (&temporary_obstack, '[');
2744 obstack_grow0 (&temporary_obstack,
2745 IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
2746 IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
2747 ptr = obstack_finish (&temporary_obstack);
2748 return build_expr_wfl (get_identifier (ptr),
2749 EXPR_WFL_FILENAME (type_or_wfl),
2750 EXPR_WFL_LINENO (type_or_wfl),
2751 EXPR_WFL_COLNO (type_or_wfl));
2754 /* Check modifiers. If one doesn't fit, retrieve it in its declaration line
2755 and point it out. */
2758 check_modifiers (message, value, mask)
2763 /* Should point out the one that don't fit. ASCII/unicode,
2764 going backward. FIXME */
2767 int i, remainder = value & ~mask;
2768 for (i = 0; i <= 10; i++)
2769 if ((1 << i) & remainder)
2770 parse_error_context (ctxp->modifier_ctx [i], message,
2771 java_accstring_lookup (1 << i));
2776 parser_add_interface (class_decl, interface_decl, wfl)
2777 tree class_decl, interface_decl, wfl;
2779 if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
2780 parse_error_context (wfl, "Interface `%s' repeated",
2781 IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
2784 /* Bulk of common class/interface checks. Return 1 if an error was
2785 encountered. TAG is 0 for a class, 1 for an interface. */
2788 check_class_interface_creation (is_interface, flags, raw_name, qualified_name, decl, cl)
2789 int is_interface, flags;
2790 tree raw_name, qualified_name, decl, cl;
2795 fprintf (stderr, " %s %s", (is_interface ? "interface" : "class"),
2796 IDENTIFIER_POINTER (qualified_name));
2798 /* Scope of an interface/class type name:
2799 - Can't be imported by a single type import
2800 - Can't already exists in the package */
2801 if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
2802 && (node = find_name_in_single_imports (raw_name)))
2805 (cl, "%s name `%s' clashes with imported type `%s'",
2806 (is_interface ? "Interface" : "Class"),
2807 IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
2810 if (decl && CLASS_COMPLETE_P (decl))
2812 classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
2813 qualified_name, decl, cl);
2817 /* If public, file name should match class/interface name */
2818 if (flags & ACC_PUBLIC)
2822 /* Contains OS dependent assumption on path separator. FIXME */
2823 for (f = &input_filename [strlen (input_filename)];
2824 f != input_filename && f[0] != '/' && f[0] != DIR_SEPARATOR;
2827 if (f[0] == '/' || f[0] == DIR_SEPARATOR)
2829 if (strncmp (IDENTIFIER_POINTER (raw_name),
2830 f , IDENTIFIER_LENGTH (raw_name)) ||
2831 f [IDENTIFIER_LENGTH (raw_name)] != '.')
2832 parse_error_context (cl, "Public %s `%s' must be defined in a file "
2834 (is_interface ? "interface" : "class"),
2835 IDENTIFIER_POINTER (qualified_name),
2836 IDENTIFIER_POINTER (raw_name));
2839 check_modifiers ((is_interface ?
2840 "Illegal modifier `%s' for interface declaration" :
2841 "Illegal modifier `%s' for class declaration"), flags,
2842 (is_interface ? INTERFACE_MODIFIERS : CLASS_MODIFIERS));
2846 /* If DECL is NULL, create and push a new DECL, record the current
2847 line CL and do other maintenance things. */
2850 maybe_create_class_interface_decl (decl, qualified_name, cl)
2851 tree decl, qualified_name, cl;
2854 decl = push_class (make_class (), qualified_name);
2856 /* Take care of the file and line business */
2857 DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
2858 DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
2859 CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
2860 CLASS_FROM_CURRENTLY_COMPILED_SOURCE_P (TREE_TYPE (decl)) =
2861 IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
2863 ctxp->current_parsed_class = decl;
2865 /* Link the declaration to the already seen ones */
2866 TREE_CHAIN (decl) = ctxp->class_list;
2867 ctxp->class_list = decl;
2869 /* Create a new nodes in the global lists */
2870 ctxp->gclass_list = tree_cons (NULL_TREE, decl, ctxp->gclass_list);
2871 all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
2873 /* Install a new dependency list element */
2874 create_jdep_list (ctxp);
2876 SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
2877 IDENTIFIER_POINTER (qualified_name)));
2882 add_superinterfaces (decl, interface_list)
2883 tree decl, interface_list;
2886 /* Superinterface(s): if present and defined, parser_check_super_interface ()
2887 takes care of ensuring that:
2888 - This is an accessible interface type,
2889 - Circularity detection.
2890 parser_add_interface is then called. If present but not defined,
2891 the check operation is delayed until the super interface gets
2893 for (node = interface_list; node; node = TREE_CHAIN (node))
2895 tree current = TREE_PURPOSE (node);
2896 tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
2897 if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
2899 if (!parser_check_super_interface (idecl, decl, current))
2900 parser_add_interface (decl, idecl, current);
2903 register_incomplete_type (JDEP_INTERFACE,
2904 current, decl, NULL_TREE);
2908 /* Create an interface in pass1 and return its decl. Return the
2909 interface's decl in pass 2. */
2912 create_interface (flags, id, super)
2916 tree raw_name = EXPR_WFL_NODE (id);
2917 tree q_name = parser_qualified_classname (id);
2918 tree decl = IDENTIFIER_CLASS_VALUE (q_name);
2920 EXPR_WFL_NODE (id) = q_name; /* Keep source location, even if refined. */
2922 /* Basic checks: scope, redefinition, modifiers */
2923 if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
2926 /* Interface modifiers check
2927 - public/abstract allowed (already done at that point)
2928 - abstract is obsolete (comes first, it's a warning, or should be)
2929 - Can't use twice the same (checked in the modifier rule) */
2930 if ((flags & ACC_ABSTRACT) && flag_redundant)
2931 parse_warning_context
2932 (MODIFIER_WFL (ABSTRACT_TK),
2933 "Redundant use of `abstract' modifier. Interface `%s' is implicitely "
2934 "abstract", IDENTIFIER_POINTER (raw_name));
2936 /* Create a new decl if DECL is NULL, otherwise fix it */
2937 decl = maybe_create_class_interface_decl (decl, q_name, id);
2939 /* Set super info and mark the class a complete */
2940 set_super_info (ACC_ABSTRACT | ACC_INTERFACE | flags, TREE_TYPE (decl),
2941 object_type_node, ctxp->interface_number);
2942 ctxp->interface_number = 0;
2943 CLASS_COMPLETE_P (decl) = 1;
2944 add_superinterfaces (decl, super);
2949 /* Create an class in pass1 and return its decl. Return class
2950 interface's decl in pass 2. */
2953 create_class (flags, id, super, interfaces)
2955 tree id, super, interfaces;
2957 tree raw_name = EXPR_WFL_NODE (id);
2958 tree class_id, decl;
2959 tree super_decl = NULL, super_decl_type;
2961 class_id = parser_qualified_classname (id);
2962 decl = IDENTIFIER_CLASS_VALUE (class_id);
2963 ctxp->current_parsed_class_un = EXPR_WFL_NODE (id);
2964 EXPR_WFL_NODE (id) = class_id;
2966 /* Basic check: scope, redefinition, modifiers */
2967 if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
2970 /* Class modifier check:
2971 - Allowed modifier (already done at that point)
2972 - abstract AND final forbidden
2973 - Public classes defined in the correct file */
2974 if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
2975 parse_error_context (id, "Class `%s' can't be declared both abstract "
2976 "and final", IDENTIFIER_POINTER (raw_name));
2978 /* Create a new decl if DECL is NULL, otherwise fix it */
2979 decl = maybe_create_class_interface_decl (decl, class_id, id);
2981 /* If SUPER exists, use it, otherwise use Object */
2984 /* Can't extend java.lang.Object */
2985 if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
2987 parse_error_context (id, "Can't extend `java.lang.Object'");
2991 /* The class is known and exists if there is a decl. Otherwise,
2992 postpone the operation and do it later. */
2993 super_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (super));
2996 parser_check_super (super_decl, decl, id);
2997 super_decl_type = TREE_TYPE (super_decl);
3001 register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
3003 else if (TREE_TYPE (decl) != object_type_node)
3004 super_decl_type = object_type_node;
3005 /* We're defining java.lang.Object */
3007 super_decl_type = NULL_TREE;
3009 /* Set super info and mark the class a complete */
3010 set_super_info (flags, TREE_TYPE (decl), super_decl_type,
3011 ctxp->interface_number);
3012 ctxp->interface_number = 0;
3013 CLASS_COMPLETE_P (decl) = 1;
3014 add_superinterfaces (decl, interfaces);
3016 /* Eventually sets the @deprecated tag flag */
3017 CHECK_DEPRECATED (decl);
3022 /* Can't use lookup_field () since we don't want to load the class and
3023 can't set the CLASS_LOADED_P flag */
3026 find_field (class, name)
3031 for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
3033 if (DECL_NAME (decl) == name)
3039 /* Wrap around lookup_field that doesn't potentially upset the value
3043 lookup_field_wrapper (class, name)
3048 java_parser_context_save_global ();
3049 decl = lookup_field (&type, name);
3050 java_parser_context_restore_global ();
3054 /* Find duplicate field within the same class declarations and report
3055 the error. Returns 1 if a duplicated field was found, 0
3059 duplicate_declaration_error_p (new_field_name, new_type, cl)
3060 tree new_field_name, new_type, cl;
3062 /* This might be modified to work with method decl as well */
3063 tree decl = find_field (TREE_TYPE (ctxp->current_parsed_class),
3067 char *t1 = strdup (purify_type_name
3068 ((TREE_CODE (new_type) == POINTER_TYPE
3069 && TREE_TYPE (new_type) == NULL_TREE) ?
3070 IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
3071 lang_printable_name (new_type, 1)));
3072 /* The type may not have been completed by the time we report
3074 char *t2 = strdup (purify_type_name
3075 ((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
3076 && TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
3077 IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
3078 lang_printable_name (TREE_TYPE (decl), 1)));
3080 (cl , "Duplicate variable declaration: `%s %s' was `%s %s' (%s:%d)",
3081 t1, IDENTIFIER_POINTER (new_field_name),
3082 t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
3083 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3091 /* Field registration routine. If TYPE doesn't exist, field
3092 declarations are linked to the undefined TYPE dependency list, to
3093 be later resolved in java_complete_class () */
3096 register_fields (flags, type, variable_list)
3098 tree type, variable_list;
3100 tree current, saved_type;
3101 tree class_type = TREE_TYPE (ctxp->current_parsed_class);
3102 int saved_lineno = lineno;
3104 tree wfl = NULL_TREE;
3106 /* If we're adding fields to interfaces, those fields are public,
3108 if (CLASS_INTERFACE (TYPE_NAME (class_type)))
3110 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
3112 "%s", "interface field(s)");
3113 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
3115 "%s", "interface field(s)");
3116 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
3117 flags, ACC_FINAL, "%s", "interface field(s)");
3118 check_modifiers ("Illegal interface member modifier `%s'", flags,
3119 INTERFACE_FIELD_MODIFIERS);
3120 flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
3123 /* Obtain a suitable type for resolution, if necessary */
3124 SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
3126 /* If TYPE is fully resolved and we don't have a reference, make one */
3127 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
3129 for (current = variable_list, saved_type = type; current;
3130 current = TREE_CHAIN (current), type = saved_type)
3134 tree cl = TREE_PURPOSE (current);
3135 tree init = TREE_VALUE (current);
3136 tree current_name = EXPR_WFL_NODE (cl);
3138 /* Process NAME, as it may specify extra dimension(s) for it */
3139 type = build_array_from_name (type, wfl, current_name, ¤t_name);
3141 /* Type adjustment. We may have just readjusted TYPE because
3142 the variable specified more dimensions. Make sure we have
3143 a reference if we can and don't have one already. Also
3144 change the name if we have an init. */
3145 if (type != saved_type)
3147 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
3149 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
3152 real_type = GET_REAL_TYPE (type);
3153 /* Check for redeclarations */
3154 if (duplicate_declaration_error_p (current_name, real_type, cl))
3157 /* Set lineno to the line the field was found and create a
3158 declaration for it. Eventually sets the @deprecated tag flag. */
3159 lineno = EXPR_WFL_LINENO (cl);
3160 field_decl = add_field (class_type, current_name, real_type, flags);
3161 CHECK_DEPRECATED (field_decl);
3163 /* Check if we must chain. */
3165 register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
3167 /* If we have an initialization value tied to the field */
3170 /* The field is declared static */
3171 if (flags & ACC_STATIC)
3173 /* We include the field and its initialization part into
3174 a list used to generate <clinit>. After <clinit> is
3175 walked, field initializations will be processed and
3176 fields initialized with known constants will be taken
3177 out of <clinit> and have their DECL_INITIAL set
3179 TREE_CHAIN (init) = ctxp->static_initialized;
3180 ctxp->static_initialized = init;
3181 DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
3182 if (TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
3183 TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
3185 /* A non-static field declared with an immediate initialization is
3186 to be initialized in <init>, if any. This field is remembered
3187 to be processed at the time of the generation of <init>. */
3190 TREE_CHAIN (init) = ctxp->non_static_initialized;
3191 ctxp->non_static_initialized = init;
3193 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
3196 lineno = saved_lineno;
3199 /* Generate the method $finit$ that initializes fields initialized
3200 upon declaration. */
3203 maybe_generate_finit ()
3205 tree mdecl, current;
3207 if (!ctxp->non_static_initialized || java_error_count)
3210 mdecl = create_artificial_method (TREE_TYPE (ctxp->current_parsed_class),
3211 ACC_PRIVATE, void_type_node,
3212 finit_identifier_node, end_params_node);
3213 start_artificial_method_body (mdecl);
3215 ctxp->non_static_initialized = nreverse (ctxp->non_static_initialized);
3216 for (current = ctxp->non_static_initialized; current;
3217 current = TREE_CHAIN (current))
3218 java_method_add_stmt (mdecl,
3219 build_debugable_stmt (EXPR_WFL_LINECOL (current),
3222 end_artificial_method_body (mdecl);
3223 CLASS_HAS_FINIT_P (TREE_TYPE (ctxp->current_parsed_class)) = 1;
3224 ctxp->non_static_initialized = NULL_TREE;
3227 /* Check whether it is necessary to generate a <clinit> for the class
3231 maybe_generate_clinit ()
3235 if (!ctxp->static_initialized || java_error_count)
3238 mdecl = create_artificial_method (TREE_TYPE (ctxp->current_parsed_class),
3239 ACC_STATIC, void_type_node,
3240 clinit_identifier_node, end_params_node);
3241 start_artificial_method_body (mdecl);
3243 /* Keep initialization in order to enforce 8.5 */
3244 ctxp->static_initialized = nreverse (ctxp->static_initialized);
3246 /* We process the list of assignment we produced as the result of
3247 the declaration of initialized static field and add them as
3248 statement to the <clinit> method. */
3249 for (c = ctxp->static_initialized; c; c = TREE_CHAIN (c))
3251 /* We build the assignment expression that will initialize the
3252 field to its value. There are strict rules on static
3253 initializers (8.5). FIXME */
3254 java_method_add_stmt (mdecl,
3255 build_debugable_stmt (EXPR_WFL_LINECOL (c), c));
3258 end_artificial_method_body (mdecl);
3259 ctxp->static_initialized = NULL_TREE;
3262 /* Shared accros method_declarator and method_header to remember the
3263 patch stage that was reached during the declaration of the method.
3264 A method DECL is built differently is there is no patch
3265 (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
3266 pending on the currently defined method. */
3268 static int patch_stage;
3270 /* Check the method declaration and add the method to its current
3271 class. If the argument list is known to contain incomplete types,
3272 the method is partially added and the registration will be resume
3273 once the method arguments resolved. If TYPE is NULL, we're dealing
3274 with a constructor. */
3277 method_header (flags, type, mdecl, throws)
3279 tree type, mdecl, throws;
3281 tree meth = TREE_VALUE (mdecl);
3282 tree id = TREE_PURPOSE (mdecl);
3283 tree this_class = TREE_TYPE (ctxp->current_parsed_class);
3284 tree type_wfl = NULL_TREE;
3285 tree meth_name = NULL_TREE, current, orig_arg;
3287 int constructor_ok = 0, must_chain;
3289 check_modifiers_consistency (flags);
3291 /* There are some forbidden modifiers for an abstract method and its
3292 class must be abstract as well. */
3293 if (type && (flags & ACC_ABSTRACT))
3295 ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
3296 ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
3297 ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
3298 ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
3299 ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED,id, "Synchronized");
3300 if (!CLASS_ABSTRACT (TYPE_NAME (this_class)))
3302 (id, "Class `%s' must be declared abstract to define abstract "
3304 IDENTIFIER_POINTER (DECL_NAME (ctxp->current_parsed_class)),
3305 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
3307 /* Things to be checked when declaring a constructor */
3310 int ec = java_error_count;
3311 /* 8.6: Constructor declarations: we might be trying to define a
3312 method without specifying a return type. */
3313 if (EXPR_WFL_NODE (id) != ctxp->current_parsed_class_un)
3315 (id, "Invalid method declaration, return type required");
3316 /* 8.6.3: Constructor modifiers */
3319 JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
3320 JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
3321 JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
3322 JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
3323 JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
3325 /* If we found error here, we don't consider it's OK to tread
3326 the method definition as a constructor, for the rest of this
3328 if (ec == java_error_count)
3332 /* Method declared within the scope of an interface are implicitly
3333 abstract and public. Conflicts with other erroneously provided
3334 modifiers are checked right after. */
3336 if (CLASS_INTERFACE (TYPE_NAME (this_class)))
3338 /* If FLAGS isn't set because of a modifier, turn the
3339 corresponding modifier WFL to NULL so we issue a warning on
3340 the obsolete use of the modifier */
3341 if (!(flags & ACC_PUBLIC))
3342 MODIFIER_WFL (PUBLIC_TK) = NULL;
3343 if (!(flags & ACC_ABSTRACT))
3344 MODIFIER_WFL (ABSTRACT_TK) = NULL;
3345 flags |= ACC_PUBLIC;
3346 flags |= ACC_ABSTRACT;
3349 /* Modifiers context reset moved up, so abstract method declaration
3350 modifiers can be later checked. */
3352 /* Set constructor returned type to void and method name to <init>,
3353 unless we found an error identifier the constructor (in which
3354 case we retain the original name) */
3357 type = void_type_node;
3359 meth_name = init_identifier_node;
3362 meth_name = EXPR_WFL_NODE (id);
3364 /* Do the returned type resolution and registration if necessary */
3365 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
3368 type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
3369 EXPR_WFL_NODE (id) = meth_name;
3370 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
3374 patch_stage = JDEP_METHOD_RETURN;
3375 register_incomplete_type (patch_stage, type_wfl, id, type);
3376 TREE_TYPE (meth) = GET_REAL_TYPE (type);
3379 TREE_TYPE (meth) = type;
3381 saved_lineno = lineno;
3382 /* When defining an abstract or interface method, the curly
3383 bracket at level 1 doesn't exist because there is no function
3385 lineno = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
3386 EXPR_WFL_LINENO (id));
3388 /* Remember the original argument list */
3389 orig_arg = TYPE_ARG_TYPES (meth);
3391 if (patch_stage) /* includes ret type and/or all args */
3394 meth = add_method_1 (this_class, flags, meth_name, meth);
3395 /* Patch for the return type */
3396 if (patch_stage == JDEP_METHOD_RETURN)
3398 jdep = CLASSD_LAST (ctxp->classd_list);
3399 JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
3401 /* This is the stop JDEP. METH allows the function's signature
3403 register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
3406 meth = add_method (this_class, flags, meth_name,
3407 build_java_signature (meth));
3409 /* Fix the method argument list so we have the argument name
3411 fix_method_argument_names (orig_arg, meth);
3413 /* Register the parameter number and re-install the current line
3415 DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
3416 lineno = saved_lineno;
3418 /* Register exception specified by the `throws' keyword for
3419 resolution and set the method decl appropriate field to the list.
3420 Note: the grammar ensures that what we get here are class
3424 throws = nreverse (throws);
3425 for (current = throws; current; current = TREE_CHAIN (current))
3427 register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
3428 NULL_TREE, NULL_TREE);
3429 JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
3430 &TREE_VALUE (current);
3432 DECL_FUNCTION_THROWS (meth) = throws;
3435 /* We set the DECL_NAME to ID so we can track the location where
3436 the function was declared. This allow us to report
3437 redefinition error accurately. When method are verified,
3438 DECL_NAME is reinstalled properly (using the content of the
3439 WFL node ID) (see check_method_redefinition). We don't do that
3440 when Object is being defined. Constructor <init> names will be
3441 reinstalled the same way. */
3442 if (TREE_TYPE (ctxp->current_parsed_class) != object_type_node)
3443 DECL_NAME (meth) = id;
3445 /* Set the flag if we correctly processed a constructor */
3447 DECL_CONSTRUCTOR_P (meth) = 1;
3449 /* Eventually set the @deprecated tag flag */
3450 CHECK_DEPRECATED (meth);
3456 fix_method_argument_names (orig_arg, meth)
3457 tree orig_arg, meth;
3459 tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
3460 if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
3462 TREE_PURPOSE (arg) = this_identifier_node;
3463 arg = TREE_CHAIN (arg);
3465 while (orig_arg != end_params_node)
3467 TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
3468 orig_arg = TREE_CHAIN (orig_arg);
3469 arg = TREE_CHAIN (arg);
3473 /* Complete the method declaration with METHOD_BODY. */
3476 complete_method_declaration (method_body)
3479 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
3480 maybe_absorb_scoping_blocks ();
3481 /* Exit function's body */
3483 /* Merge last line of the function with first line, directly in the
3484 function decl. It will be used to emit correct debug info. */
3485 DECL_SOURCE_LINE_MERGE (current_function_decl, ctxp->last_ccb_indent1);
3488 /* Build a an error message for constructor circularity errors. */
3491 constructor_circularity_msg (from, to)
3494 static char string [4096];
3495 char *t = strdup (lang_printable_name (from, 0));
3496 sprintf (string, "`%s' invokes `%s'", t, lang_printable_name (to, 0));
3501 /* Verify a circular call to METH. Return 1 if an error is found, 0
3505 verify_constructor_circularity (meth, current)
3508 static tree list = NULL_TREE;
3510 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
3512 if (TREE_VALUE (c) == meth)
3518 list = nreverse (list);
3519 for (liste = list; liste; liste = TREE_CHAIN (liste))
3522 (TREE_PURPOSE (TREE_PURPOSE (liste)),
3523 constructor_circularity_msg
3524 (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
3528 t = strdup (lang_printable_name (meth, 0));
3529 parse_error_context (TREE_PURPOSE (c),
3530 "%s: recursive invocation of constructor `%s'",
3531 constructor_circularity_msg (current, meth), t);
3537 for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
3539 list = tree_cons (c, current, list);
3540 if (verify_constructor_circularity (meth, TREE_VALUE (c)))
3542 list = TREE_CHAIN (list);
3547 /* Check modifiers that can be declared but exclusively */
3550 check_modifiers_consistency (flags)
3554 tree cl = NULL_TREE;
3556 THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, 0, acc_count, cl);
3557 THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, 1, acc_count, cl);
3558 THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, 2, acc_count, cl);
3561 (cl, "Inconsistent member declaration. At most one of `public', "
3562 "`private', or `protected' may be specified");
3565 /* Check the methode header METH for abstract specifics features */
3568 check_abstract_method_header (meth)
3571 int flags = get_access_flags_from_decl (meth);
3572 /* DECL_NAME might still be a WFL node */
3573 tree name = GET_METHOD_NAME (meth);
3575 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (ABSTRACT_TK), flags,
3576 ACC_ABSTRACT, "abstract method `%s'",
3577 IDENTIFIER_POINTER (name));
3578 OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK), flags,
3579 ACC_PUBLIC, "abstract method `%s'",
3580 IDENTIFIER_POINTER (name));
3582 check_modifiers ("Illegal modifier `%s' for interface method",
3583 flags, INTERFACE_METHOD_MODIFIERS);
3586 /* Create a FUNCTION_TYPE node and start augmenting it with the
3587 declared function arguments. Arguments type that can't be resolved
3588 are left as they are, but the returned node is marked as containing
3589 incomplete types. */
3592 method_declarator (id, list)
3595 tree arg_types = NULL_TREE, current, node;
3596 tree meth = make_node (FUNCTION_TYPE);
3599 patch_stage = JDEP_NO_PATCH;
3601 for (current = list; current; current = TREE_CHAIN (current))
3604 tree wfl_name = TREE_PURPOSE (current);
3605 tree type = TREE_VALUE (current);
3606 tree name = EXPR_WFL_NODE (wfl_name);
3607 tree already, arg_node;
3608 tree type_wfl = NULL_TREE;
3611 /* Obtain a suitable type for resolution, if necessary */
3612 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
3614 /* Process NAME, as it may specify extra dimension(s) for it */
3615 type = build_array_from_name (type, type_wfl, name, &name);
3616 EXPR_WFL_NODE (wfl_name) = name;
3618 real_type = GET_REAL_TYPE (type);
3619 if (TREE_CODE (real_type) == RECORD_TYPE)
3621 real_type = promote_type (real_type);
3622 if (TREE_CODE (type) == TREE_LIST)
3623 TREE_PURPOSE (type) = real_type;
3626 /* Check redefinition */
3627 for (already = arg_types; already; already = TREE_CHAIN (already))
3628 if (TREE_PURPOSE (already) == name)
3631 (wfl_name, "Variable `%s' is used more than once in the "
3632 "argument list of method `%s'", IDENTIFIER_POINTER (name),
3633 IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
3637 /* If we've an incomplete argument type, we know there is a location
3638 to patch when the type get resolved, later. */
3642 patch_stage = JDEP_METHOD;
3643 type = register_incomplete_type (patch_stage,
3644 type_wfl, wfl_name, type);
3645 jdep = CLASSD_LAST (ctxp->classd_list);
3646 JDEP_MISC (jdep) = id;
3649 /* The argument node: a name and a (possibly) incomplete type */
3650 arg_node = build_tree_list (name, real_type);
3652 JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
3653 TREE_CHAIN (arg_node) = arg_types;
3654 arg_types = arg_node;
3656 TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
3657 node = build_tree_list (id, meth);
3662 unresolved_type_p (wfl, returned)
3667 if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
3669 tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
3671 *returned = (decl ? TREE_TYPE (decl) : NULL_TREE);
3679 /* From NAME, build a qualified identifier node using the
3680 qualification from the current package definition. */
3683 parser_qualified_classname (name)
3687 return merge_qualified_name (ctxp->package, EXPR_WFL_NODE (name));
3689 return EXPR_WFL_NODE (name);
3692 /* Called once the type a interface extends is resolved. Returns 0 if
3693 everything is OK. */
3696 parser_check_super_interface (super_decl, this_decl, this_wfl)
3697 tree super_decl, this_decl, this_wfl;
3699 tree super_type = TREE_TYPE (super_decl);
3701 /* Has to be an interface */
3702 if (!CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (super_decl))))
3705 (this_wfl, "Can't use %s `%s' to implement/extend %s `%s'",
3706 (TYPE_ARRAY_P (super_type) ? "array" : "class"),
3707 IDENTIFIER_POINTER (DECL_NAME (super_decl)),
3708 (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
3709 "interface" : "class"),
3710 IDENTIFIER_POINTER (DECL_NAME (this_decl)));
3714 /* Check scope: same package OK, other package: OK if public */
3715 if (check_pkg_class_access (DECL_NAME (super_decl), lookup_cl (this_decl)))
3718 SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
3719 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
3720 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
3724 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
3725 0 if everthing is OK. */
3728 parser_check_super (super_decl, this_decl, wfl)
3729 tree super_decl, this_decl, wfl;
3731 tree super_type = TREE_TYPE (super_decl);
3733 /* SUPER should be a CLASS (neither an array nor an interface) */
3734 if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
3737 (wfl, "Class `%s' can't subclass %s `%s'",
3738 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
3739 (CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
3740 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
3744 if (CLASS_FINAL (TYPE_NAME (super_type)))
3746 parse_error_context (wfl, "Can't subclass final classes: %s",
3747 IDENTIFIER_POINTER (DECL_NAME (super_decl)));
3751 /* Check scope: same package OK, other package: OK if public */
3752 if (check_pkg_class_access (DECL_NAME (super_decl), wfl))
3755 SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
3756 IDENTIFIER_POINTER (DECL_NAME (this_decl)),
3757 IDENTIFIER_POINTER (DECL_NAME (super_decl))));
3761 /* Create a new dependency list and link it (in a LIFO manner) to the
3762 CTXP list of type dependency list. */
3765 create_jdep_list (ctxp)
3766 struct parser_ctxt *ctxp;
3768 jdeplist *new = (jdeplist *)xmalloc (sizeof (jdeplist));
3769 new->first = new->last = NULL;
3770 new->next = ctxp->classd_list;
3771 ctxp->classd_list = new;
3775 reverse_jdep_list (ctxp)
3776 struct parser_ctxt *ctxp;
3778 register jdeplist *prev = NULL, *current, *next;
3779 for (current = ctxp->classd_list; current; current = next)
3781 next = current->next;
3782 current->next = prev;
3788 /* Create a fake pointer based on the ID stored in
3789 TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
3790 registered again. */
3793 obtain_incomplete_type (type_name)
3798 if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
3799 name = EXPR_WFL_NODE (type_name);
3800 else if (INCOMPLETE_TYPE_P (type_name))
3801 name = TYPE_NAME (type_name);
3803 fatal ("invalid type name - obtain_incomplete_type");
3805 for (ptr = ctxp->incomplete_class; ptr; ptr = TREE_CHAIN (ptr))
3806 if (TYPE_NAME (ptr) == name)
3811 push_obstacks (&permanent_obstack, &permanent_obstack);
3812 BUILD_PTR_FROM_NAME (ptr, name);
3815 TREE_CHAIN (ptr) = ctxp->incomplete_class;
3816 ctxp->incomplete_class = ptr;
3822 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
3823 non NULL instead of computing a new fake type based on WFL. The new
3824 dependency is inserted in the current type dependency list, in FIFO
3828 register_incomplete_type (kind, wfl, decl, ptr)
3830 tree wfl, decl, ptr;
3832 jdep *new = (jdep *)xmalloc (sizeof (jdep));
3834 if (!ptr && kind != JDEP_METHOD_END) /* JDEP_METHOD_END is a mere marker */
3835 ptr = obtain_incomplete_type (wfl);
3837 JDEP_KIND (new) = kind;
3838 JDEP_DECL (new) = decl;
3839 JDEP_SOLV (new) = ptr;
3840 JDEP_WFL (new) = wfl;
3841 JDEP_CHAIN (new) = NULL;
3842 JDEP_MISC (new) = NULL_TREE;
3843 JDEP_GET_PATCH (new) = (tree *)NULL;
3845 JDEP_INSERT (ctxp->classd_list, new);
3851 java_check_circular_reference ()
3854 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
3856 tree type = TREE_TYPE (current);
3857 if (CLASS_INTERFACE (TYPE_NAME (type)))
3859 /* Check all interfaces this class extends */
3860 tree basetype_vec = TYPE_BINFO_BASETYPES (type);
3865 n = TREE_VEC_LENGTH (basetype_vec);
3866 for (i = 0; i < n; i++)
3868 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
3869 if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node
3870 && interface_of_p (type, BINFO_TYPE (vec_elt)))
3871 parse_error_context (lookup_cl (current),
3872 "Cyclic interface inheritance");
3876 if (inherits_from_p (CLASSTYPE_SUPER (type), type))
3877 parse_error_context (lookup_cl (current),
3878 "Cyclic class inheritance");
3882 /* safe_layout_class just makes sure that we can load a class without
3883 disrupting the current_class, input_file, lineno, etc, information
3884 about the class processed currently. */
3887 safe_layout_class (class)
3890 tree save_current_class = current_class;
3891 char *save_input_filename = input_filename;
3892 int save_lineno = lineno;
3894 push_obstacks (&permanent_obstack, &permanent_obstack);
3896 layout_class (class);
3899 current_class = save_current_class;
3900 input_filename = save_input_filename;
3901 lineno = save_lineno;
3902 CLASS_LOADED_P (class) = 1;
3906 jdep_resolve_class (dep)
3911 if (JDEP_RESOLVED_P (dep))
3912 decl = JDEP_RESOLVED_DECL (dep);
3915 decl = resolve_class (JDEP_TO_RESOLVE (dep),
3916 JDEP_DECL (dep), JDEP_WFL (dep));
3917 JDEP_RESOLVED (dep, decl);
3921 complete_class_report_errors (dep);
3926 /* Complete unsatisfied class declaration and their dependencies */
3929 java_complete_class ()
3936 push_obstacks (&permanent_obstack, &permanent_obstack);
3938 /* Process imports and reverse the import on demand list */
3940 if (ctxp->import_demand_list)
3941 ctxp->import_demand_list = nreverse (ctxp->import_demand_list);
3943 /* Rever things so we have the right order */
3944 ctxp->class_list = nreverse (ctxp->class_list);
3945 ctxp->classd_list = reverse_jdep_list (ctxp);
3947 for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
3949 cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
3952 for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
3955 if (!(decl = jdep_resolve_class (dep)))
3958 /* Now it's time to patch */
3959 switch (JDEP_KIND (dep))
3962 /* Simply patch super */
3963 if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
3965 BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO
3966 (TREE_TYPE (JDEP_DECL (dep)))), 0)) = TREE_TYPE (decl);
3971 /* We do part of the job done in add_field */
3972 tree field_decl = JDEP_DECL (dep);
3973 tree field_type = TREE_TYPE (decl);
3974 push_obstacks (&permanent_obstack, &permanent_obstack);
3975 if (TREE_CODE (field_type) == RECORD_TYPE)
3976 field_type = promote_type (field_type);
3978 TREE_TYPE (field_decl) = field_type;
3979 DECL_ALIGN (field_decl) = 0;
3980 layout_decl (field_decl, 0);
3981 SOURCE_FRONTEND_DEBUG
3982 (("Completed field/var decl `%s' with `%s'",
3983 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
3984 IDENTIFIER_POINTER (DECL_NAME (decl))));
3987 case JDEP_METHOD: /* We start patching a method */
3988 case JDEP_METHOD_RETURN:
3994 type = TREE_TYPE(decl);
3995 if (TREE_CODE (type) == RECORD_TYPE)
3996 type = promote_type (type);
3997 JDEP_APPLY_PATCH (dep, type);
3998 SOURCE_FRONTEND_DEBUG
3999 (((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
4000 "Completing fct `%s' with ret type `%s'":
4001 "Completing arg `%s' with type `%s'"),
4002 IDENTIFIER_POINTER (EXPR_WFL_NODE
4003 (JDEP_DECL_WFL (dep))),
4004 IDENTIFIER_POINTER (DECL_NAME (decl))));
4008 dep = JDEP_CHAIN (dep);
4009 if (JDEP_KIND (dep) == JDEP_METHOD_END)
4012 decl = jdep_resolve_class (dep);
4016 tree mdecl = JDEP_DECL (dep), signature;
4017 push_obstacks (&permanent_obstack, &permanent_obstack);
4018 /* Recompute and reset the signature */
4019 signature = build_java_signature (TREE_TYPE (mdecl));
4020 set_java_signature (TREE_TYPE (mdecl), signature);
4027 case JDEP_INTERFACE:
4028 if (parser_check_super_interface (decl, JDEP_DECL (dep),
4031 parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
4036 type = TREE_TYPE(decl);
4037 if (TREE_CODE (type) == RECORD_TYPE)
4038 type = promote_type (type);
4039 JDEP_APPLY_PATCH (dep, type);
4043 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
4044 SOURCE_FRONTEND_DEBUG
4045 (("Completing a random type dependency on a '%s' node",
4046 tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
4049 case JDEP_EXCEPTION:
4050 JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
4051 SOURCE_FRONTEND_DEBUG
4052 (("Completing `%s' `throws' argument node",
4053 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
4057 fatal ("Can't handle patch code %d - java_complete_class",
4066 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
4070 resolve_class (class_type, decl, cl)
4071 tree class_type, decl, cl;
4073 char *name = IDENTIFIER_POINTER (TYPE_NAME (class_type));
4075 tree resolved_type = TREE_TYPE (class_type);
4076 tree resolved_type_decl;
4078 if (resolved_type != NULL_TREE)
4080 tree resolved_type_decl = TYPE_NAME (resolved_type);
4081 if (resolved_type_decl == NULL_TREE
4082 || TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
4084 resolved_type_decl = build_decl (TYPE_DECL,
4085 TYPE_NAME (class_type),
4088 return resolved_type_decl;
4091 /* 1- Check to see if we have an array. If true, find what we really
4093 while (name[0] == '[')
4096 TYPE_NAME (class_type) = get_identifier (name);
4098 /* 2- Resolve the bare type */
4099 if (!(resolved_type_decl = do_resolve_class (class_type, decl, cl)))
4101 resolved_type = TREE_TYPE (resolved_type_decl);
4103 /* 3- If we have and array, reconstruct the array down to its nesting */
4106 while (base != name)
4108 if (TREE_CODE (resolved_type) == RECORD_TYPE)
4109 resolved_type = promote_type (resolved_type);
4110 resolved_type = build_java_array_type (resolved_type, -1);
4111 CLASS_LOADED_P (resolved_type) = 1;
4114 /* Build a fake decl for this, since this is what is expected to
4116 resolved_type_decl =
4117 build_decl (TYPE_DECL, TYPE_NAME (resolved_type), resolved_type);
4118 /* Figure how those two things are important for error report. FIXME */
4119 DECL_SOURCE_LINE (resolved_type_decl) = 0;
4120 DECL_SOURCE_FILE (resolved_type_decl) = input_filename;
4121 TYPE_NAME (class_type) = TYPE_NAME (resolved_type);
4123 TREE_TYPE (class_type) = resolved_type;
4124 return resolved_type_decl;
4127 /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL
4128 are used to report error messages. */
4131 do_resolve_class (class_type, decl, cl)
4136 tree new_class_decl;
4137 tree original_name = NULL_TREE;
4139 /* Do not try to replace TYPE_NAME (class_type) by a variable, since
4140 its is changed by find_in_imports{_on_demand} */
4142 /* 1- Check for the type in single imports */
4143 if (find_in_imports (class_type))
4146 /* 2- And check for the type in the current compilation unit. If it fails,
4147 try with a name qualified with the package name if appropriate. */
4148 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
4150 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
4151 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
4152 load_class (TYPE_NAME (class_type), 0);
4153 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
4156 original_name = TYPE_NAME (class_type);
4157 if (!QUALIFIED_P (TYPE_NAME (class_type)) && ctxp->package)
4158 TYPE_NAME (class_type) = merge_qualified_name (ctxp->package,
4159 TYPE_NAME (class_type));
4161 if (!(new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
4162 load_class (TYPE_NAME (class_type), 0);
4163 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
4165 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
4166 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
4167 load_class (TYPE_NAME (class_type), 0);
4168 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
4171 new_name = TYPE_NAME (class_type);
4172 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_name)) != NULL_TREE)
4174 if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) &&
4175 !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl)))
4176 load_class (new_name, 0);
4177 return IDENTIFIER_CLASS_VALUE (new_name);
4181 tree class = read_class (new_name);
4182 if (class != NULL_TREE)
4184 tree decl = IDENTIFIER_CLASS_VALUE (new_name);
4185 if (decl == NULL_TREE)
4186 decl = push_class (class, new_name);
4191 TYPE_NAME (class_type) = original_name;
4193 /* 3- Check an other compilation unit that bears the name of type */
4194 load_class (TYPE_NAME (class_type), 0);
4195 if (check_pkg_class_access (TYPE_NAME (class_type),
4196 (cl ? cl : lookup_cl (decl))))
4199 if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
4200 return new_class_decl;
4202 /* 4- Check the import on demands. Don't allow bar.baz to be
4203 imported from foo.* */
4204 if (!QUALIFIED_P (TYPE_NAME (class_type)))
4205 if (find_in_imports_on_demand (class_type))
4208 /* 5- Last call for a resolution */
4209 return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
4212 /* Resolve NAME and lay it out (if not done and if not the current
4213 parsed class). Return a decl node. This function is meant to be
4214 called when type resolution is necessary during the walk pass. */
4217 resolve_and_layout (something, cl)
4223 /* Don't do that on the current class */
4224 if (something == current_class)
4225 return TYPE_NAME (current_class);
4227 /* Don't do anything for void and other primitive types */
4228 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
4231 /* Pointer types can be reall pointer types or fake pointers. When
4232 finding a real pointer, recheck for primitive types */
4233 if (TREE_CODE (something) == POINTER_TYPE)
4235 if (TREE_TYPE (something))
4237 something = TREE_TYPE (something);
4238 if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
4242 something = TYPE_NAME (something);
4245 /* Don't do anything for arrays of primitive types */
4246 if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
4247 && JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
4250 /* If something is not and IDENTIFIER_NODE, it can be a a TYPE_DECL
4252 if (TREE_CODE (something) != IDENTIFIER_NODE)
4253 something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
4254 DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
4256 if (!(decl = resolve_no_layout (something, cl)))
4259 /* Resolve and layout if necessary */
4260 layout_class_methods (TREE_TYPE (decl));
4261 if (CLASS_FROM_SOURCE_P (TREE_TYPE (decl)))
4262 CHECK_METHODS (decl);
4263 if (TREE_TYPE (decl) != current_class && !CLASS_LOADED_P (TREE_TYPE (decl)))
4264 safe_layout_class (TREE_TYPE (decl));
4269 /* Resolve a class, returns its decl but doesn't perform any
4270 layout. The current parsing context is saved and restored */
4273 resolve_no_layout (name, cl)
4277 BUILD_PTR_FROM_NAME (ptr, name);
4278 java_parser_context_save_global ();
4279 decl = resolve_class (ptr, NULL_TREE, cl);
4280 java_parser_context_restore_global ();
4285 /* Called when reporting errors. Skip leader '[' in a complex array
4286 type description that failed to be resolved. */
4289 purify_type_name (name)
4292 while (*name && *name == '[')
4297 /* The type CURRENT refers to can't be found. We print error messages. */
4300 complete_class_report_errors (dep)
4305 if (!JDEP_WFL (dep))
4308 name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
4309 switch (JDEP_KIND (dep))
4313 (JDEP_WFL (dep), "Superclass `%s' of class `%s' not found",
4314 purify_type_name (name),
4315 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
4319 (JDEP_WFL (dep), "Type `%s' not found in declaration of field `%s'",
4320 purify_type_name (name),
4321 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
4323 case JDEP_METHOD: /* Covers arguments */
4325 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the "
4326 "argument `%s' of method `%s'",
4327 purify_type_name (name),
4328 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
4329 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
4331 case JDEP_METHOD_RETURN: /* Covers return type */
4333 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the "
4334 "return type of method `%s'",
4335 purify_type_name (name),
4336 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
4338 case JDEP_INTERFACE:
4340 (JDEP_WFL (dep), "Superinterface `%s' of %s `%s' not found",
4341 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
4342 (CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
4343 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
4347 (JDEP_WFL (dep), "Type `%s' not found in the declaration of the "
4348 "local variable `%s'",
4349 purify_type_name (IDENTIFIER_POINTER
4350 (EXPR_WFL_NODE (JDEP_WFL (dep)))),
4351 IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
4353 case JDEP_EXCEPTION: /* As specified by `throws' */
4355 (JDEP_WFL (dep), "Class `%s' not found in `throws'",
4356 IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
4359 /* Fix for -Wall. Just break doing nothing. The error will be
4365 /* Check uninitialized final. */
4372 /* Return a static string containing the DECL prototype string. If
4373 DECL is a constructor, use the class name instead of the form
4377 get_printable_method_name (decl)
4383 if (DECL_CONSTRUCTOR_P (decl))
4385 name = DECL_NAME (decl);
4386 DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
4389 to_return = lang_printable_name (decl, 0);
4390 if (DECL_CONSTRUCTOR_P (decl))
4391 DECL_NAME (decl) = name;
4396 /* Reinstall the proper DECL_NAME on METHOD. Return 0 if the method
4397 nevertheless needs to be verfied, 1 otherwise. */
4400 reset_method_name (method)
4403 if (DECL_NAME (method) != clinit_identifier_node
4404 && DECL_NAME (method) != finit_identifier_node)
4406 /* NAME is just the plain name when Object is being defined */
4407 if (DECL_CONTEXT (method) != object_type_node)
4408 DECL_NAME (method) = (DECL_CONSTRUCTOR_P (method) ?
4409 init_identifier_node : GET_METHOD_NAME (method));
4416 /* Return the name of METHOD_DECL, when DECL_NAME is a WFL */
4419 java_get_real_method_name (method_decl)
4422 tree method_name = DECL_NAME (method_decl);
4423 if (DECL_CONSTRUCTOR_P (method_decl))
4424 return init_identifier_node;
4426 /* Explain here why METHOD_DECL doesn't have the DECL_CONSTRUCTUR_P
4427 and still can be a constructor. FIXME */
4429 /* Don't confuse method only bearing the name of their class as
4431 else if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (method_decl))
4433 && ctxp->current_parsed_class_un == EXPR_WFL_NODE (method_name)
4434 && get_access_flags_from_decl (method_decl) <= ACC_PROTECTED
4435 && TREE_TYPE (TREE_TYPE (method_decl)) == void_type_node)
4436 return init_identifier_node;
4438 return EXPR_WFL_NODE (method_name);
4441 /* Track method being redefined inside the same class. As a side
4442 effect, set DECL_NAME to an IDENTIFIER (prior entering this
4443 function it's a FWL, so we can track errors more accurately */
4446 check_method_redefinition (class, method)
4450 tree cl = DECL_NAME (method);
4451 tree sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
4452 /* decl name of artificial <clinit> and $finit$ doesn't need to be
4453 fixed and checked */
4455 /* Reset the method name before running the check. If it returns 1,
4456 the method doesn't need to be verified with respect to method
4457 redeclaration and we return 0 */
4458 if (reset_method_name (method))
4461 name = DECL_NAME (method);
4462 for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
4464 if (redef == method)
4466 if (DECL_NAME (redef) == name
4467 && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef)))
4470 (cl, "Duplicate %s declaration `%s'",
4471 (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
4472 get_printable_method_name (redef));
4479 /* Check all the methods of CLASS. Methods are first completed then
4480 checked according to regular method existance rules.
4481 If no constructor were encountered, then build its declaration. */
4484 java_check_regular_methods (class_decl)
4487 int saw_constructor = 0;
4489 tree class = CLASS_TO_HANDLE_TYPE (TREE_TYPE (class_decl));
4490 tree super_class = CLASSTYPE_SUPER (class);
4491 tree saved_found_wfl = NULL_TREE, found = NULL_TREE;
4494 /* It is not necessary to check methods defined in java.lang.Object */
4495 if (class == object_type_node)
4498 if (!TYPE_NVIRTUALS (class))
4499 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
4501 /* Should take interfaces into account. FIXME */
4502 for (method = TYPE_METHODS (class); method; method = TREE_CHAIN (method))
4505 tree method_wfl = DECL_NAME (method);
4508 /* If we previously found something and its name was saved,
4510 if (found && saved_found_wfl)
4512 DECL_NAME (found) = saved_found_wfl;
4513 saved_found_wfl = NULL_TREE;
4516 /* Check for redefinitions */
4517 if (check_method_redefinition (class, method))
4520 /* If we see one constructor a mark so we don't generate the
4521 default one. Also skip other verifications: constructors
4522 can't be inherited hence hiden or overriden */
4523 if (DECL_CONSTRUCTOR_P (method))
4525 saw_constructor = 1;
4529 /* We verify things thrown by the method. They must inherits from
4530 java.lang.Throwable */
4531 for (mthrows = DECL_FUNCTION_THROWS (method);
4532 mthrows; mthrows = TREE_CHAIN (mthrows))
4534 if (!inherits_from_p (TREE_VALUE (mthrows), throwable_type_node))
4536 (TREE_PURPOSE (mthrows), "Class `%s' in `throws' clause must be "
4537 "a subclass of class `java.lang.Throwable'",
4539 (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))));
4542 sig = build_java_argument_signature (TREE_TYPE (method));
4543 found = lookup_argument_method (super_class, DECL_NAME (method), sig);
4545 /* Nothing overrides or it's a private method. */
4548 if (METHOD_PRIVATE (found))
4554 /* If found wasn't verified, it's DECL_NAME won't be set properly.
4555 We set it temporarily for the sake of the error report. */
4556 saved_found_wfl = DECL_NAME (found);
4557 reset_method_name (found);
4559 /* Can't override a method with the same name and different return
4561 if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
4563 char *t = strdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)),
4567 "Method `%s' was defined with return type `%s' in class `%s'",
4568 lang_printable_name (found, 0), t,
4570 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4574 /* Can't override final. Can't override static. */
4575 if (METHOD_FINAL (found) || METHOD_STATIC (found))
4577 /* Static *can* override static */
4578 if (METHOD_STATIC (found) && METHOD_STATIC (method))
4582 "%s methods can't be overriden. Method `%s' is %s in class `%s'",
4583 (METHOD_FINAL (found) ? "Final" : "Static"),
4584 lang_printable_name (found, 0),
4585 (METHOD_FINAL (found) ? "final" : "static"),
4587 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4590 /* Static method can't override instance method. */
4591 if (METHOD_STATIC (method))
4595 "Instance methods can't be overriden by a static method. Method "
4596 "`%s' is an instance method in class `%s'",
4597 lang_printable_name (found, 0),
4599 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4603 aflags = get_access_flags_from_decl (found);
4604 /* - Overriding/hiding public must be public
4605 - Overriding/hiding protected must be protected or public
4606 - If the overriden or hidden method has default (package)
4607 access, then the overriding or hiding method must not be
4608 private; otherwise, a compile-time error occurs */
4609 if ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
4610 || (METHOD_PROTECTED (found)
4611 && !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
4612 || (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
4613 && METHOD_PRIVATE (method)))
4617 "Methods can't be overridden to be more private. Method `%s' is "
4618 "not %s in class `%s'", lang_printable_name (method, 0),
4619 (METHOD_PUBLIC (method) ? "public" :
4620 (METHOD_PRIVATE (method) ? "private" : "protected")),
4621 IDENTIFIER_POINTER (DECL_NAME
4622 (TYPE_NAME (DECL_CONTEXT (found)))));
4626 /* Overriding methods must have compatible `throws' clauses on checked
4627 exceptions, if any */
4628 check_throws_clauses (method, method_wfl, found);
4630 /* If the method has default access in an other package, then
4631 issue a warning that the current method doesn't override the
4632 one that was found elsewhere. Do not issue this warning when
4633 the match was found in java.lang.Object. */
4634 if (DECL_CONTEXT (found) != object_type_node
4635 && (!aflags || (aflags > ACC_PROTECTED))
4636 && !class_in_current_package (DECL_CONTEXT (found))
4637 && flag_not_overriding)
4638 parse_warning_context
4639 (method_wfl, "Method `%s' in class `%s' does not "
4640 "override the corresponding method in class `%s', which is "
4641 "private to a different package",
4642 lang_printable_name (found, 0),
4643 IDENTIFIER_POINTER (DECL_NAME (class_decl)),
4644 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4646 /* Inheriting multiple methods with the same signature. FIXME */
4649 /* Don't forget eventual pending found and saved_found_wfl. Take
4650 into account that we might have exited because we saw an
4651 aritifical method as the last entry. */
4653 if (found && !DECL_ARTIFICIAL (found) && saved_found_wfl)
4654 DECL_NAME (found) = saved_found_wfl;
4656 if (!TYPE_NVIRTUALS (class))
4657 TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
4659 if (!saw_constructor)
4661 /* No constructor seen, we craft one, at line 0. Since this
4662 operation takes place after we laid methods out
4663 (layout_class_methods), we prepare the its DECL
4668 /* If the class is declared PUBLIC, the default constructor is
4669 PUBLIC otherwise it has default access implied by no access
4671 flags = (get_access_flags_from_decl (class_decl) & ACC_PUBLIC ?
4673 decl = create_artificial_method (class, flags, void_type_node,
4674 init_identifier_node, end_params_node);
4675 DECL_CONSTRUCTOR_P (decl) = 1;
4676 layout_class_method (TREE_TYPE (class_decl), NULL_TREE, decl, NULL_TREE);
4680 /* Return a non zero value if the `throws' clause of METHOD (if any)
4681 is incompatible with the `throws' clause of FOUND (if any). */
4684 check_throws_clauses (method, method_wfl, found)
4685 tree method, method_wfl, found;
4687 tree mthrows, fthrows;
4689 /* Can't check these things with class loaded from bytecode. FIXME */
4690 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
4693 for (mthrows = DECL_FUNCTION_THROWS (method);
4694 mthrows; mthrows = TREE_CHAIN (mthrows))
4696 /* We don't verify unchecked expressions */
4697 if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
4699 /* Checked expression must be compatible */
4700 for (fthrows = DECL_FUNCTION_THROWS (found);
4701 fthrows; fthrows = TREE_CHAIN (fthrows))
4702 if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
4707 (method_wfl, "Invalid checked exception class `%s' in "
4708 "`throws' clause. The exception must be a subclass of an "
4709 "exception thrown by `%s' from class `%s'",
4710 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
4711 lang_printable_name (found, 0),
4713 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4718 /* Check abstract method of interface INTERFACE */
4721 java_check_abstract_methods (interface_decl)
4722 tree interface_decl;
4725 tree method, basetype_vec, found;
4726 tree interface = TREE_TYPE (interface_decl);
4728 for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
4730 tree method_wfl = DECL_NAME (method);
4732 /* 2- Check for double definition inside the defining interface */
4733 if (check_method_redefinition (interface, method))
4736 /* 3- Overriding is OK as far as we preserve the return type and
4737 the thrown exceptions (FIXME) */
4738 found = lookup_java_interface_method2 (interface, method);
4742 tree saved_found_wfl = DECL_NAME (found);
4743 reset_method_name (found);
4744 t = strdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
4747 "Method `%s' was defined with return type `%s' in class `%s'",
4748 lang_printable_name (found, 0), t,
4750 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4754 DECL_NAME (found) = saved_found_wfl;
4758 /* 4- Inherited methods can't differ by their returned types */
4759 if (!(basetype_vec = TYPE_BINFO_BASETYPES (interface)))
4761 n = TREE_VEC_LENGTH (basetype_vec);
4762 for (i = 0; i < n; i++)
4764 tree sub_interface_method, sub_interface;
4765 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
4768 sub_interface = BINFO_TYPE (vec_elt);
4769 for (sub_interface_method = TYPE_METHODS (sub_interface);
4770 sub_interface_method;
4771 sub_interface_method = TREE_CHAIN (sub_interface_method))
4773 found = lookup_java_interface_method2 (interface,
4774 sub_interface_method);
4775 if (found && (found != sub_interface_method))
4777 tree saved_found_wfl = DECL_NAME (found);
4778 reset_method_name (found);
4780 (lookup_cl (sub_interface_method),
4781 "Interface `%s' inherits method `%s' from interface `%s'. "
4782 "This method is redefined with a different return type in "
4784 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
4785 lang_printable_name (found, 0),
4787 (DECL_NAME (TYPE_NAME
4788 (DECL_CONTEXT (sub_interface_method)))),
4790 (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
4791 DECL_NAME (found) = saved_found_wfl;
4797 /* Lookup methods in interfaces using their name and partial
4798 signature. Return a matching method only if their types differ. */
4801 lookup_java_interface_method2 (class, method_decl)
4802 tree class, method_decl;
4805 tree basetype_vec = TYPE_BINFO_BASETYPES (class), to_return;
4810 n = TREE_VEC_LENGTH (basetype_vec);
4811 for (i = 0; i < n; i++)
4813 tree vec_elt = TREE_VEC_ELT (basetype_vec, i), to_return;
4814 if ((BINFO_TYPE (vec_elt) != object_type_node)
4816 lookup_java_method2 (BINFO_TYPE (vec_elt), method_decl, 1)))
4819 for (i = 0; i < n; i++)
4821 to_return = lookup_java_interface_method2
4822 (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)), method_decl);
4830 /* Lookup method using their name and partial signature. Return a
4831 matching method only if their types differ. */
4834 lookup_java_method2 (clas, method_decl, do_interface)
4835 tree clas, method_decl;
4838 tree method, method_signature, method_name, method_type, name;
4840 method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
4841 name = DECL_NAME (method_decl);
4842 method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
4843 EXPR_WFL_NODE (name) : name);
4844 method_type = TREE_TYPE (TREE_TYPE (method_decl));
4846 while (clas != NULL_TREE)
4848 for (method = TYPE_METHODS (clas);
4849 method != NULL_TREE; method = TREE_CHAIN (method))
4851 tree method_sig = build_java_argument_signature (TREE_TYPE (method));
4852 tree name = DECL_NAME (method);
4853 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
4854 EXPR_WFL_NODE (name) : name) == method_name
4855 && method_sig == method_signature
4856 && TREE_TYPE (TREE_TYPE (method)) != method_type)
4859 clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
4864 /* Return the line that matches DECL line number. Used during error
4871 static tree cl = NULL_TREE;
4876 if (cl == NULL_TREE)
4877 cl = build_expr_wfl (NULL_TREE, NULL, 0, 0);
4879 EXPR_WFL_FILENAME_NODE (cl) = get_identifier (DECL_SOURCE_FILE (decl));
4880 EXPR_WFL_SET_LINECOL (cl, DECL_SOURCE_LINE_FIRST (decl), -1);
4885 /* Look for a simple name in the single-type import list */
4888 find_name_in_single_imports (name)
4893 for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
4894 if (TREE_VALUE (node) == name)
4895 return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
4900 /* Process all single-type import. */
4908 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
4910 tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
4912 /* Don't load twice something already defined. */
4913 if (IDENTIFIER_CLASS_VALUE (to_be_found))
4915 QUALIFIED_P (to_be_found) = 1;
4916 load_class (to_be_found, 0);
4918 check_pkg_class_access (to_be_found, TREE_PURPOSE (import));
4919 if (!IDENTIFIER_CLASS_VALUE (to_be_found))
4921 parse_error_context (TREE_PURPOSE (import),
4922 "Class or interface `%s' not found in import",
4923 IDENTIFIER_POINTER (to_be_found));
4932 /* Possibly find a class imported by a single-type import statement. Return
4933 1 if an error occured, 0 otherwise. */
4936 find_in_imports (class_type)
4941 for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
4942 if (TREE_VALUE (import) == TYPE_NAME (class_type))
4944 TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
4945 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
4951 note_possible_classname (name, len)
4956 if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
4958 else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
4962 node = ident_subst (name, len, "", '/', '.', "");
4963 IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
4964 QUALIFIED_P (node) = 1; /* As soon as we turn / into . */
4968 /* Read a import directory, gathering potential match for further type
4969 references. Indifferently reads a filesystem or a ZIP archive
4973 read_import_dir (wfl)
4976 tree package_id = EXPR_WFL_NODE (wfl);
4977 char *package_name = IDENTIFIER_POINTER (package_id);
4978 int package_length = IDENTIFIER_LENGTH (package_id);
4980 JCF *saved_jcf = current_jcf;
4985 struct buffer filename[1];
4988 if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
4990 IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
4992 BUFFER_INIT (filename);
4993 buffer_grow (filename, package_length + 100);
4995 for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
4997 char *entry_name = jcf_path_name (entry);
4998 int entry_length = strlen (entry_name);
4999 if (jcf_path_is_zipfile (entry))
5002 buffer_grow (filename, entry_length);
5003 memcpy (filename->data, entry_name, entry_length - 1);
5004 filename->data[entry_length-1] = '\0';
5005 zipf = opendir_in_zip (filename->data, jcf_path_is_system (entry));
5007 error ("malformed .zip archive in CLASSPATH: %s", entry_name);
5010 ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
5011 BUFFER_RESET (filename);
5012 for (k = 0; k < package_length; k++)
5014 char ch = package_name[k];
5015 *filename->ptr++ = ch == '.' ? '/' : ch;
5017 *filename->ptr++ = '/';
5019 for (k = 0; k < zipf->count; k++, zipd = ZIPDIR_NEXT (zipd))
5021 char *current_entry = ZIPDIR_FILENAME (zipd);
5022 int current_entry_len = zipd->filename_length;
5024 if (current_entry_len >= BUFFER_LENGTH (filename)
5025 && strncmp (filename->data, current_entry,
5026 BUFFER_LENGTH (filename)) != 0)
5028 found |= note_possible_classname (current_entry,
5035 BUFFER_RESET (filename);
5036 buffer_grow (filename, entry_length + package_length + 4);
5037 strcpy (filename->data, entry_name);
5038 filename->ptr = filename->data + entry_length;
5039 for (k = 0; k < package_length; k++)
5041 char ch = package_name[k];
5042 *filename->ptr++ = ch == '.' ? '/' : ch;
5044 *filename->ptr = '\0';
5046 dirp = opendir (filename->data);
5049 *filename->ptr++ = '/';
5054 struct dirent *direntp = readdir (dirp);
5057 d_name = direntp->d_name;
5058 len = strlen (direntp->d_name);
5059 buffer_grow (filename, len+1);
5060 strcpy (filename->ptr, d_name);
5061 found |= note_possible_classname (filename->data + entry_length,
5062 package_length+len+1);
5069 free (filename->data);
5071 /* Here we should have a unified way of retrieving an entry, to be
5075 static int first = 1;
5079 sprintf (buffer, "Can't find default package `%s'. Check "
5080 "the CLASSPATH environment variable and the access to the "
5081 "archives.", package_name);
5087 parse_error_context (wfl, "Package `%s' not found in import",
5089 current_jcf = saved_jcf;
5092 current_jcf = saved_jcf;
5095 /* Possibly find a type in the import on demands specified
5096 types. Returns 1 if an error occured, 0 otherwise. Run throught the
5097 entire list, to detected potential double definitions. */
5100 find_in_imports_on_demand (class_type)
5103 tree node, import, node_to_use;
5107 for (import = ctxp->import_demand_list; import; import = TREE_CHAIN (import))
5110 obstack_grow (&temporary_obstack,
5111 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
5112 IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
5113 obstack_1grow (&temporary_obstack, '.');
5114 obstack_grow0 (&temporary_obstack,
5115 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
5116 IDENTIFIER_LENGTH (TYPE_NAME (class_type)));
5117 id_name = obstack_finish (&temporary_obstack);
5119 node = maybe_get_identifier (id_name);
5120 if (node && IS_A_CLASSFILE_NAME (node))
5124 cl = TREE_PURPOSE (import);
5132 (import, "Type `%s' also potentially defined in package `%s'",
5133 IDENTIFIER_POINTER (TYPE_NAME (class_type)),
5134 IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))));
5141 /* Setup lineno so that it refers to the line of the import (in
5142 case we parse a class file and encounter errors */
5144 int saved_lineno = lineno;
5145 lineno = EXPR_WFL_LINENO (cl);
5146 TYPE_NAME (class_type) = node_to_use;
5147 QUALIFIED_P (TYPE_NAME (class_type)) = 1;
5148 decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5149 /* If there is no DECL set for the class or if the class isn't
5150 loaded and not seen in source yet, the load */
5151 if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl))
5152 && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl))))
5153 load_class (node_to_use, 0);
5154 lineno = saved_lineno;
5155 return check_pkg_class_access (TYPE_NAME (class_type), cl);
5158 return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
5162 resolve_package (pkg, next)
5165 tree type_name = NULL_TREE;
5166 char *name = IDENTIFIER_POINTER (EXPR_WFL_NODE (pkg));
5168 /* The trick is to determine when the package name stops and were
5169 the name of something contained in the package starts. Then we
5170 return a fully qualified name of what we want to get. */
5172 /* Do a quick search on well known package names */
5173 if (!strncmp (name, "java.lang.reflect", 17))
5176 TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (EXPR_WFL_QUALIFICATION (pkg))));
5177 type_name = lookup_package_type (name, 17);
5179 else if (!strncmp (name, "java.lang", 9))
5181 *next = TREE_CHAIN (TREE_CHAIN (EXPR_WFL_QUALIFICATION (pkg)));
5182 type_name = lookup_package_type (name, 9);
5185 return NULL_TREE; /* FIXME, search all imported packages. */
5191 lookup_package_type (name, from)
5196 char *sub = &name[from+1];
5197 while (*sub != '.' && *sub)
5199 strncpy (subname, name, sub-name);
5200 subname [sub-name] = '\0';
5201 return get_identifier (subname);
5204 /* Check that CLASS_NAME refers to a PUBLIC class. Return 0 if no
5205 access violations were found, 1 otherwise. */
5208 check_pkg_class_access (class_name, cl)
5214 if (!QUALIFIED_P (class_name) || !IDENTIFIER_CLASS_VALUE (class_name))
5217 if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
5220 if (!CLASS_PUBLIC (TYPE_NAME (type)))
5222 /* Access to a private class within the same package is
5225 breakdown_qualified (&l, &r, class_name);
5226 if (l == ctxp->package)
5230 (cl, "Can't access %s `%s'. Only public classes and interfaces in "
5231 "other packages can be accessed",
5232 (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
5233 IDENTIFIER_POINTER (class_name));
5239 /* Local variable declaration. */
5242 declare_local_variables (modifier, type, vlist)
5247 tree decl, current, saved_type;
5248 tree type_wfl = NULL_TREE;
5251 /* Push a new block if statement were seen between the last time we
5252 pushed a block and now. Keep a cound of block to close */
5253 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)))
5255 tree body = DECL_FUNCTION_BODY (current_function_decl);
5256 tree b = enter_block ();
5257 BLOCK_EXPR_ORIGIN(b) = body;
5263 for (i = 0; i <= 10; i++) if (1 << i & modifier) break;
5264 if (modifier == ACC_FINAL)
5266 if (flag_static_local_jdk1_1)
5267 parse_warning_context (ctxp->modifier_ctx [i],
5268 "Unsupported JDK1.1 `final' local variable "
5269 "(treated as non final)");
5274 (ctxp->modifier_ctx [i],
5275 "Only `final' is allowed as a local variables modifier");
5280 /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
5281 hold the TYPE value if a new incomplete has to be created (as
5282 opposed to being found already existing and reused). */
5283 SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
5285 /* If TYPE is fully resolved and we don't have a reference, make one */
5286 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
5288 /* Go through all the declared variables */
5289 for (current = vlist, saved_type = type; current;
5290 current = TREE_CHAIN (current), type = saved_type)
5292 tree other, real_type;
5293 tree wfl = TREE_PURPOSE (current);
5294 tree name = EXPR_WFL_NODE (wfl);
5295 tree init = TREE_VALUE (current);
5297 /* Process NAME, as it may specify extra dimension(s) for it */
5298 type = build_array_from_name (type, type_wfl, name, &name);
5300 /* Variable redefinition check */
5301 if ((other = lookup_name_in_blocks (name)))
5303 variable_redefinition_error (wfl, name, TREE_TYPE (other),
5304 DECL_SOURCE_LINE (other));
5308 /* Type adjustment. We may have just readjusted TYPE because
5309 the variable specified more dimensions. Make sure we have
5310 a reference if we can and don't have one already. */
5311 PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
5313 real_type = GET_REAL_TYPE (type);
5314 /* Never layout this decl. This will be done when its scope
5316 decl = build_decl (VAR_DECL, name, real_type);
5317 BLOCK_CHAIN_DECL (decl);
5319 /* Don't try to use an INIT statement when an error was found */
5320 if (init && java_error_count)
5323 /* Add the initialization function to the current function's code */
5326 /* Name might have been readjusted */
5327 EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
5328 MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
5329 java_method_add_stmt (current_function_decl,
5330 build_debugable_stmt (EXPR_WFL_LINECOL (init),
5334 /* Setup dependency the type of the decl */
5338 register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
5339 dep = CLASSD_LAST (ctxp->classd_list);
5340 JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
5343 SOURCE_FRONTEND_DEBUG (("Defined locals"));
5346 /* Called during parsing. Build decls from argument list. */
5349 source_start_java_method (fndecl)
5356 current_function_decl = fndecl;
5358 /* New scope for the function */
5360 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
5361 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
5363 tree type = TREE_VALUE (tem);
5364 tree name = TREE_PURPOSE (tem);
5366 /* If type is incomplete. Create an incomplete decl and ask for
5367 the decl to be patched later */
5368 if (INCOMPLETE_TYPE_P (type))
5371 tree real_type = GET_REAL_TYPE (type);
5372 parm_decl = build_decl (PARM_DECL, name, real_type);
5373 type = obtain_incomplete_type (type);
5374 register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
5375 jdep = CLASSD_LAST (ctxp->classd_list);
5376 JDEP_MISC (jdep) = name;
5377 JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
5380 parm_decl = build_decl (PARM_DECL, name, type);
5382 BLOCK_CHAIN_DECL (parm_decl);
5384 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
5385 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
5387 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
5390 /* Called during parsing. Creates an artificial method declaration. */
5393 create_artificial_method (class, flags, type, name, args)
5396 tree type, name, args;
5398 int saved_lineno = lineno;
5402 mdecl = make_node (FUNCTION_TYPE);
5403 TREE_TYPE (mdecl) = type;
5404 TYPE_ARG_TYPES (mdecl) = args;
5405 mdecl = add_method (class, flags, name, build_java_signature (mdecl));
5406 lineno = saved_lineno;
5407 DECL_ARTIFICIAL (mdecl) = 1;
5411 /* Starts the body if an artifical method. */
5414 start_artificial_method_body (mdecl)
5417 DECL_SOURCE_LINE (mdecl) = 1;
5418 DECL_SOURCE_LINE_MERGE (mdecl, 1);
5419 source_start_java_method (mdecl);
5424 end_artificial_method_body (mdecl)
5427 BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = exit_block ();
5431 /* Called during expansion. Push decls formerly built from argument
5432 list so they're usable during expansion. */
5435 expand_start_java_method (fndecl)
5440 current_function_decl = fndecl;
5442 announce_function (fndecl);
5443 pushlevel (1); /* Push parameters */
5444 ptr = &DECL_ARGUMENTS (fndecl);
5445 tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
5448 tree next = TREE_CHAIN (tem);
5449 tree type = TREE_TYPE (tem);
5450 #ifdef PROMOTE_PROTOTYPES
5451 if (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
5452 && INTEGRAL_TYPE_P (type))
5453 type = integer_type_node;
5455 DECL_ARG_TYPE (tem) = type;
5456 layout_decl (tem, 0);
5459 ptr = &TREE_CHAIN (tem);
5463 pushdecl_force_head (DECL_ARGUMENTS (fndecl));
5464 lineno = DECL_SOURCE_LINE_FIRST (fndecl);
5467 /* Terminate a function and expand its body. */
5470 source_end_java_method ()
5472 tree fndecl = current_function_decl;
5474 java_parser_context_save_global ();
5475 lineno = ctxp->last_ccb_indent1;
5477 /* Set EH language codes */
5478 java_set_exception_lang_code ();
5480 /* Generate function's code */
5481 if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))
5482 && ! flag_emit_class_files)
5483 expand_expr_stmt (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)));
5485 /* pop out of its parameters */
5486 pushdecl_force_head (DECL_ARGUMENTS (fndecl));
5488 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
5490 /* Generate rtl for function exit. */
5491 if (! flag_emit_class_files)
5493 lineno = DECL_SOURCE_LINE_LAST (fndecl);
5494 /* Emit catch-finally clauses */
5496 expand_function_end (input_filename, lineno, 0);
5498 /* Run the optimizers and output assembler code for this function. */
5499 rest_of_compilation (fndecl);
5502 current_function_decl = NULL_TREE;
5503 /* permanent_allocation (1); */
5504 java_parser_context_restore_global ();
5507 /* Record EXPR in the current function block. Complements compound
5508 expression second operand if necessary. */
5511 java_method_add_stmt (fndecl, expr)
5514 return add_stmt_to_block (DECL_FUNCTION_BODY (fndecl), NULL_TREE, expr);
5518 add_stmt_to_block (b, type, stmt)
5521 tree body = BLOCK_EXPR_BODY (b), c;
5523 if (java_error_count)
5526 if ((c = add_stmt_to_compound (body, type, stmt)) == body)
5529 BLOCK_EXPR_BODY (b) = c;
5530 TREE_SIDE_EFFECTS (c) = 1;
5534 /* Add STMT to EXISTING if possible, otherwise create a new
5535 COMPOUND_EXPR and add STMT to it. */
5538 add_stmt_to_compound (existing, type, stmt)
5539 tree existing, type, stmt;
5542 return build (COMPOUND_EXPR, type, existing, stmt);
5547 /* Hold THIS for the scope of the current public method decl. */
5548 static tree current_this;
5550 void java_layout_seen_class_methods ()
5552 tree previous_list = all_class_list;
5553 tree end = NULL_TREE;
5558 for (current = previous_list;
5559 current != end; current = TREE_CHAIN (current))
5560 layout_class_methods (TREE_TYPE (TREE_VALUE (current)));
5562 if (previous_list != all_class_list)
5564 end = previous_list;
5565 previous_list = all_class_list;
5572 /* Layout the methods of all classes loaded in one way on an
5573 other. Check methods of source parsed classes. Then reorder the
5574 fields and layout the classes or the type of all source parsed
5578 java_layout_classes ()
5581 int save_error_count = java_error_count;
5583 /* Layout the methods of all classes seen so far */
5584 java_layout_seen_class_methods ();
5585 java_parse_abort_on_error ();
5586 all_class_list = NULL_TREE;
5588 /* Then check the methods of all parsed classes */
5589 for (current = ctxp->gclass_list; current; current = TREE_CHAIN (current))
5590 if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
5591 CHECK_METHODS (TREE_VALUE (current));
5592 java_parse_abort_on_error ();
5594 for (current = ctxp->gclass_list; current; current = TREE_CHAIN (current))
5596 current_class = TREE_TYPE (TREE_VALUE (current));
5598 /* Reverse the fields, but leave the dummy field in front.
5599 Fields are already ordered for Object and Class */
5600 if (TYPE_FIELDS (current_class) && current_class != object_type_node
5601 && current_class != class_type_node)
5603 /* If the dummy field is there, reverse the right fields and
5604 just layout the type for proper fields offset */
5605 if (!DECL_NAME (TYPE_FIELDS (current_class)))
5607 tree fields = TYPE_FIELDS (current_class);
5608 TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
5609 TYPE_SIZE (current_class) = NULL_TREE;
5610 layout_type (current_class);
5612 /* We don't have a dummy field, we need to layout the class,
5613 after having reversed the fields */
5616 TYPE_FIELDS (current_class) =
5617 nreverse (TYPE_FIELDS (current_class));
5618 TYPE_SIZE (current_class) = NULL_TREE;
5619 layout_class (current_class);
5623 layout_class (current_class);
5625 /* From now on, the class is considered completely loaded */
5626 CLASS_LOADED_P (current_class) = 1;
5628 /* Error reported by the caller */
5629 if (java_error_count)
5633 /* We might have reloaded classes durign the process of laying out
5634 classes for code generation. We must layout the methods of those
5635 late additions, as constructor checks might use them */
5636 java_layout_seen_class_methods ();
5637 java_parse_abort_on_error ();
5640 /* Expand all methods in all registered classes. */
5643 java_complete_expand_methods ()
5647 for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5649 tree class_type = CLASS_TO_HANDLE_TYPE (TREE_TYPE (current));
5652 current_class = TREE_TYPE (current);
5654 /* Initialize a new constant pool */
5655 init_outgoing_cpool ();
5657 /* We want <clinit> (if any) to be processed first. */
5658 decl = tree_last (TYPE_METHODS (class_type));
5659 if (decl && DECL_NAME (decl) == clinit_identifier_node)
5661 tree list = nreverse (TYPE_METHODS (class_type));
5662 list = TREE_CHAIN (list);
5663 TREE_CHAIN (decl) = NULL_TREE;
5664 TYPE_METHODS (class_type) = chainon (decl, nreverse (list));
5667 /* Don't process function bodies in interfaces */
5668 if (!CLASS_INTERFACE (TYPE_NAME (current_class)))
5669 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
5671 current_function_decl = decl;
5672 /* Don't generate debug info on line zero when expanding a
5673 generated constructor. */
5674 if (DECL_CONSTRUCTOR_P (decl) && !DECL_FUNCTION_BODY (decl))
5676 /* If we found errors, it's too dangerous to try to generate
5677 and expand a constructor */
5678 if (!java_error_count)
5680 restore_line_number_status (1);
5681 java_complete_expand_method (decl);
5682 restore_line_number_status (0);
5685 else if (METHOD_ABSTRACT (decl) || METHOD_NATIVE (decl))
5688 java_complete_expand_method (decl);
5691 /* Now verify constructor circularity (stop after the first one
5693 if (!CLASS_INTERFACE (TYPE_NAME (current_class)))
5694 for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
5695 if (DECL_CONSTRUCTOR_P (decl) &&
5696 verify_constructor_circularity (decl, decl))
5699 /* Make the class data, register it and run the rest of decl
5700 compilation on it */
5701 if (!java_error_count)
5703 if (flag_emit_class_files)
5704 write_classfile (current_class);
5705 else if (! flag_syntax_only)
5706 finish_class (current_class);
5711 /* Hold a list of catch clauses list. The first element of this list is
5712 the list of the catch clauses of the currently analysed try block. */
5713 static tree currently_caught_type_list;
5715 /* Complete and expand a method. */
5718 java_complete_expand_method (mdecl)
5721 /* Fix constructors before expanding them */
5722 if (DECL_CONSTRUCTOR_P (mdecl))
5723 fix_constructors (mdecl);
5725 /* Expand functions that have a body */
5726 if (DECL_FUNCTION_BODY (mdecl))
5728 tree fbody = DECL_FUNCTION_BODY (mdecl);
5729 tree block_body = BLOCK_EXPR_BODY (fbody);
5730 expand_start_java_method (mdecl);
5731 build_result_decl (mdecl);
5734 = (!METHOD_STATIC (mdecl) ?
5735 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
5737 /* Purge the `throws' list of unchecked exceptions */
5738 purge_unchecked_exceptions (mdecl);
5740 /* Install exceptions thrown with `throws' */
5741 PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
5743 if (block_body != NULL_TREE)
5745 block_body = java_complete_tree (block_body);
5746 check_for_initialization (block_body);
5748 BLOCK_EXPR_BODY (fbody) = block_body;
5750 if ((block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
5751 && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE)
5752 missing_return_error (current_function_decl);
5754 complete_start_java_method (mdecl);
5756 /* Don't go any further if we've found error(s) during the
5758 if (!java_error_count)
5759 source_end_java_method ();
5762 pushdecl_force_head (DECL_ARGUMENTS (mdecl));
5766 /* Pop the exceptions and sanity check */
5768 if (currently_caught_type_list)
5769 fatal ("Exception list non empty - java_complete_expand_method");
5773 /* Craft a body for default constructor. Patch existing constructor
5774 bodies with call to super() and field initialization statements if
5778 fix_constructors (mdecl)
5781 tree body = DECL_FUNCTION_BODY (mdecl);
5785 /* The constructor body must be crafted by hand. It's the
5786 constructor we defined when we realize we didn't have the
5787 CLASSNAME() constructor */
5791 /* It is an error for the compiler to generate a default
5792 constructor if the superclass doesn't have a constructor that
5793 takes no argument */
5794 if (verify_constructor_super ())
5796 tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (current_class));
5797 char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
5798 parse_error_context (lookup_cl (TYPE_NAME (current_class)),
5799 "No constructor matching `%s()' found in "
5800 "class `%s'", n, n);
5803 start_artificial_method_body (mdecl);
5805 /* We don't generate a super constructor invocation if we're
5806 compiling java.lang.Object. build_super_invocation takes care
5808 compound = java_method_add_stmt (mdecl, build_super_invocation ());
5810 end_artificial_method_body (mdecl);
5812 /* Search for an explicit constructor invocation */
5816 tree main_block = BLOCK_EXPR_BODY (body);
5817 tree compound = NULL_TREE;
5820 switch (TREE_CODE (body))
5823 found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
5827 case EXPR_WITH_FILE_LOCATION:
5828 body = TREE_OPERAND (body, 0);
5831 body = BLOCK_EXPR_BODY (body);
5837 /* The constructor is missing an invocation of super() */
5839 compound = add_stmt_to_compound (compound, NULL_TREE,
5840 build_super_invocation ());
5842 /* Fix the constructor main block if we're adding extra stmts */
5845 compound = add_stmt_to_compound (compound, NULL_TREE,
5846 BLOCK_EXPR_BODY (main_block));
5847 BLOCK_EXPR_BODY (main_block) = compound;
5852 /* Browse constructors in the super class, searching for a constructor
5853 that doesn't take any argument. Return 0 if one is found, 1
5857 verify_constructor_super ()
5859 tree class = CLASSTYPE_SUPER (current_class);
5866 for (mdecl = TYPE_METHODS (class); mdecl; mdecl = TREE_CHAIN (mdecl))
5868 if (DECL_CONSTRUCTOR_P (mdecl)
5869 && TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (mdecl))) == end_params_node)
5876 /* Expand finals. */
5879 java_expand_finals ()
5883 /* Generate code for all context remembered for code generation. */
5886 java_expand_classes ()
5888 int save_error_count = java_error_count;
5889 java_parse_abort_on_error ();
5890 if (!(ctxp = ctxp_for_generation))
5892 java_layout_classes ();
5893 java_parse_abort_on_error ();
5895 for (; ctxp_for_generation; ctxp_for_generation = ctxp_for_generation->next)
5897 ctxp = ctxp_for_generation;
5898 lang_init_source (2); /* Error msgs have method prototypes */
5899 java_complete_expand_methods (); /* Complete and expand method bodies */
5900 java_parse_abort_on_error ();
5901 java_expand_finals (); /* Expand and check the finals */
5902 java_parse_abort_on_error ();
5903 java_check_final (); /* Check unitialized final */
5904 java_parse_abort_on_error ();
5908 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
5909 a tree list node containing RIGHT. Fore coming RIGHTs will be
5910 chained to this hook. LOCATION contains the location of the
5911 separating `.' operator. */
5914 make_qualified_primary (primary, right, location)
5915 tree primary, right;
5920 /* We want to process THIS . xxx symbolicaly, to keep it consistent
5921 with the way we're processing SUPER. A THIS from a primary as a
5922 different form than a SUPER. Turn THIS into something symbolic */
5923 if (TREE_CODE (primary) == THIS_EXPR)
5925 wfl = build_wfl_node (this_identifier_node, input_filename, 0, 0);
5926 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (primary);
5927 wfl = make_qualified_name (wfl, right, location);
5928 PRIMARY_P (wfl) = 1;
5931 /* Other non WFL node are wrapped around a WFL */
5932 else if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
5934 wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
5935 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (primary);
5936 EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (primary, NULL_TREE);
5941 if (!EXPR_WFL_QUALIFICATION (primary))
5942 EXPR_WFL_QUALIFICATION (primary) =
5943 build_tree_list (primary, NULL_TREE);
5946 EXPR_WFL_LINECOL (right) = location;
5947 chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
5948 PRIMARY_P (wfl) = 1;
5952 /* Simple merge of two name separated by a `.' */
5955 merge_qualified_name (left, right)
5959 obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
5960 IDENTIFIER_LENGTH (left));
5961 obstack_1grow (&temporary_obstack, '.');
5962 obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
5963 IDENTIFIER_LENGTH (right));
5964 node = get_identifier (obstack_base (&temporary_obstack));
5965 obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
5966 QUALIFIED_P (node) = 1;
5970 /* Merge the two parts of a qualified name into LEFT. Set the
5971 location information of the resulting node to LOCATION, usually
5972 inherited from the location information of the `.' operator. */
5975 make_qualified_name (left, right, location)
5979 #ifdef USE_COMPONENT_REF
5980 tree node = build (COMPONENT_REF, NULL_TREE, left, right);
5981 EXPR_WFL_LINECOL (node) = location;
5984 tree left_id = EXPR_WFL_NODE (left);
5985 tree right_id = EXPR_WFL_NODE (right);
5988 merge = merge_qualified_name (left_id, right_id);
5990 /* Left wasn't qualified and is now qualified */
5991 if (!QUALIFIED_P (left_id))
5993 tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
5994 EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
5995 EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
5998 wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
5999 EXPR_WFL_LINECOL (wfl) = location;
6000 chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
6002 EXPR_WFL_NODE (left) = merge;
6007 /* Extract the last identifier component of the qualified in WFL. The
6008 last identifier is removed from the linked list */
6011 cut_identifier_in_qualified (wfl)
6015 tree previous = NULL_TREE;
6016 for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
6017 if (!TREE_CHAIN (q))
6020 fatal ("Operating on a non qualified qualified WFL - "
6021 "cut_identifier_in_qualified");
6022 TREE_CHAIN (previous) = NULL_TREE;
6023 return TREE_PURPOSE (q);
6027 /* Resolve the expression name NAME. Return its decl. */
6030 resolve_expression_name (id, orig)
6034 tree name = EXPR_WFL_NODE (id);
6037 /* 6.5.5.1: Simple expression names */
6038 if (!PRIMARY_P (id) && !QUALIFIED_P (name))
6040 /* 15.13.1: NAME can appear within the scope of a local variable
6042 if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
6045 /* 15.13.1: NAME can appear within a class declaration */
6048 decl = lookup_field_wrapper (current_class, name);
6051 int fs = FIELD_STATIC (decl);
6052 /* Instance variable (8.3.1.1) can't appear within
6053 static method, static initializer or initializer for
6054 a static variable. */
6055 if (!fs && METHOD_STATIC (current_function_decl))
6058 (id, "Can't make a static reference to nonstatic variable "
6059 "`%s' in class `%s'",
6060 IDENTIFIER_POINTER (name),
6061 IDENTIFIER_POINTER (DECL_NAME
6062 (TYPE_NAME (current_class))));
6063 return error_mark_node;
6065 /* Instance variables can't appear as an argument of
6066 an explicit constructor invocation */
6067 if (!fs && ctxp->explicit_constructor_p)
6070 (id, "Can't reference `%s' before the superclass "
6071 "constructor has been called", IDENTIFIER_POINTER (name));
6072 return error_mark_node;
6075 /* Otherwise build what it takes to access the field */
6076 decl = build_field_ref ((fs ? NULL_TREE : current_this),
6077 current_class, name);
6078 if (fs && !flag_emit_class_files)
6079 decl = build_class_init (current_class, decl);
6080 /* We may be asked to save the real field access node */
6083 /* And we return what we got */
6086 /* Fall down to error report on undefined variable */
6089 /* 6.5.5.2 Qualified Expression Names */
6094 qualify_ambiguous_name (id);
6095 /* 15.10.1 Field Access Using a Primary and/or Expression Name */
6096 /* 15.10.2: Accessing Superclass Members using super */
6097 return resolve_field_access (id, NULL, NULL);
6100 /* We've got an error here */
6101 parse_error_context (id, "Undefined variable `%s'",
6102 IDENTIFIER_POINTER (name));
6104 return error_mark_node;
6107 /* 15.10.1 Field Acess Using a Primary and/or Expression Name.
6108 We return something suitable to generate the field access. We also
6109 return the field decl in FIELD_DECL and its type in FIELD_TYPE. If
6110 recipient's address can be null. */
6113 resolve_field_access (qual_wfl, field_decl, field_type)
6115 tree *field_decl, *field_type;
6119 tree decl, where_found, type_found;
6121 if (resolve_qualified_expression_name (qual_wfl, &decl,
6122 &where_found, &type_found))
6123 return error_mark_node;
6125 /* Resolve the LENGTH field of an array here */
6126 if (DECL_NAME (decl) == length_identifier_node && TYPE_ARRAY_P (type_found)
6127 && ! flag_emit_class_files)
6129 tree length = build_java_array_length_access (where_found);
6131 build_java_arraynull_check (type_found, length, int_type_node);
6133 /* We might have been trying to resolve field.method(). In which
6134 case, the resolution is over and decl is the answer */
6135 else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
6137 else if (JDECL_P (decl))
6139 int static_final_found = 0;
6141 type_found = DECL_CONTEXT (decl);
6142 is_static = JDECL_P (decl) && FIELD_STATIC (decl);
6143 if (FIELD_FINAL (decl)
6144 && JPRIMITIVE_TYPE_P (TREE_TYPE (decl))
6145 && DECL_LANG_SPECIFIC (decl)
6146 && DECL_INITIAL (decl))
6148 field_ref = DECL_INITIAL (decl);
6149 static_final_found = 1;
6152 field_ref = build_field_ref ((is_static ? NULL_TREE : where_found),
6153 type_found, DECL_NAME (decl));
6154 if (field_ref == error_mark_node)
6155 return error_mark_node;
6156 if (is_static && !static_final_found && !flag_emit_class_files)
6158 field_ref = build_class_init (type_found, field_ref);
6159 /* If the static field was identified by an expression that
6160 needs to be generated, make the field access a compound
6161 expression whose first part of the evaluation of the
6162 field selector part. */
6163 if (where_found && TREE_CODE (where_found) != TYPE_DECL
6164 && TREE_CODE (where_found) != RECORD_TYPE)
6166 tree type = QUAL_DECL_TYPE (field_ref);
6167 field_ref = build (COMPOUND_EXPR, type, where_found, field_ref);
6177 *field_type = (QUAL_DECL_TYPE (decl) ?
6178 QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
6182 /* If NODE is an access to f static field, strip out the class
6183 initialization part and return the field decl, otherwise, return
6187 strip_out_static_field_access_decl (node)
6190 if (TREE_CODE (node) == COMPOUND_EXPR)
6192 tree op1 = TREE_OPERAND (node, 1);
6193 if (TREE_CODE (op1) == COMPOUND_EXPR)
6195 tree call = TREE_OPERAND (op1, 0);
6196 if (TREE_CODE (call) == CALL_EXPR
6197 && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
6198 && TREE_OPERAND (TREE_OPERAND (call, 0), 0)
6199 == soft_initclass_node)
6200 return TREE_OPERAND (op1, 1);
6206 /* 6.5.5.2: Qualified Expression Names */
6209 resolve_qualified_expression_name (wfl, found_decl, where_found, type_found)
6211 tree *found_decl, *type_found, *where_found;
6213 int from_type = 0; /* Field search initiated from a type */
6214 int from_super = 0, from_cast = 0;
6215 int previous_call_static = 0;
6217 tree decl = NULL_TREE, type = NULL_TREE, q;
6218 *type_found = *where_found = NULL_TREE;
6220 for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
6222 tree qual_wfl = QUAL_WFL (q);
6224 /* 15.10.1 Field Access Using a Primary */
6225 switch (TREE_CODE (qual_wfl))
6228 case NEW_CLASS_EXPR:
6229 /* If the access to the function call is a non static field,
6230 build the code to access it. */
6231 if (JDECL_P (decl) && !FIELD_STATIC (decl))
6233 decl = maybe_access_field (decl, *where_found,
6234 DECL_CONTEXT (decl));
6235 if (decl == error_mark_node)
6238 /* And code for the function call */
6239 if (complete_function_arguments (qual_wfl))
6241 if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
6242 CALL_USING_SUPER (qual_wfl) = 1;
6244 patch_method_invocation (qual_wfl, decl, type, &is_static, NULL);
6245 if (*where_found == error_mark_node)
6247 *type_found = type = QUAL_DECL_TYPE (*where_found);
6249 /* If the previous call was static and this one is too,
6250 build a compound expression to hold the two (because in
6251 that case, previous function calls aren't transported as
6252 forcoming function's argument. */
6253 if (previous_call_static && is_static)
6255 decl = build (COMPOUND_EXPR, type, decl, *where_found);
6256 TREE_SIDE_EFFECTS (decl) = 1;
6260 previous_call_static = is_static;
6261 decl = *where_found;
6265 case NEW_ARRAY_EXPR:
6266 *where_found = decl = java_complete_tree (qual_wfl);
6267 if (decl == error_mark_node)
6269 *type_found = type = QUAL_DECL_TYPE (decl);
6270 CLASS_LOADED_P (type) = 1;
6274 *where_found = decl = java_complete_tree (qual_wfl);
6275 if (decl == error_mark_node)
6277 *type_found = type = QUAL_DECL_TYPE (decl);
6281 case CONDITIONAL_EXPR:
6283 *where_found = decl = java_complete_tree (qual_wfl);
6284 if (decl == error_mark_node)
6286 *type_found = type = QUAL_DECL_TYPE (decl);
6290 /* If the access to the function call is a non static field,
6291 build the code to access it. */
6292 if (JDECL_P (decl) && !FIELD_STATIC (decl))
6294 decl = maybe_access_field (decl, *where_found, type);
6295 if (decl == error_mark_node)
6298 /* And code for the array reference expression */
6299 decl = java_complete_tree (qual_wfl);
6300 if (decl == error_mark_node)
6302 type = QUAL_DECL_TYPE (decl);
6306 /* Fix for -Wall Just go to the next statement. Don't
6310 /* If we fall here, we weren't processing a (static) function call. */
6311 previous_call_static = 0;
6313 /* It can be the keyword THIS */
6314 if (EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
6319 (wfl, "Keyword `this' used outside allowed context");
6322 /* We have to generate code for intermediate acess */
6323 *where_found = decl = current_this;
6324 *type_found = type = QUAL_DECL_TYPE (decl);
6328 /* 15.10.2 Accessing Superclass Members using SUPER */
6329 if (EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
6332 /* Check on the restricted use of SUPER */
6333 if (METHOD_STATIC (current_function_decl)
6334 || current_class == object_type_node)
6337 (wfl, "Keyword `super' used outside allowed context");
6340 /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
6341 node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
6342 CLASSTYPE_SUPER (current_class),
6343 build_this (EXPR_WFL_LINECOL (qual_wfl)));
6344 *where_found = decl = java_complete_tree (node);
6345 if (decl == error_mark_node)
6347 *type_found = type = QUAL_DECL_TYPE (decl);
6348 from_super = from_type = 1;
6352 /* 15.13.1: Can't search for field name in packages, so we
6353 assume a variable/class name was meant. */
6354 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
6356 tree name = resolve_package (wfl, &q);
6359 *where_found = decl = resolve_no_layout (name, qual_wfl);
6360 /* We wan't to be absolutely that the class is laid
6361 out. We're going to search something inside it. */
6362 *type_found = type = TREE_TYPE (decl);
6363 layout_class (type);
6365 /* Should be a list, really. FIXME */
6366 RESOLVE_EXPRESSION_NAME_P (QUAL_WFL (TREE_CHAIN (q))) = 1;
6367 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (TREE_CHAIN (q))) = 0;
6371 if (from_super || from_cast)
6373 ((from_cast ? qual_wfl : wfl),
6374 "No variable `%s' defined in class `%s'",
6375 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
6376 lang_printable_name (type, 0));
6379 (qual_wfl, "Undefined variable or class name: `%s'",
6380 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)));
6385 /* We have a type name. It's been already resolved when the
6386 expression was qualified. */
6387 else if (RESOLVE_TYPE_NAME_P (qual_wfl))
6389 if (!(decl = QUAL_RESOLUTION (q)))
6390 return 1; /* Error reported already */
6392 if (not_accessible_p (TREE_TYPE (decl), decl, 0))
6395 (qual_wfl, "Can't access %s field `%s.%s' from `%s'",
6396 java_accstring_lookup (get_access_flags_from_decl (decl)),
6397 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))),
6398 IDENTIFIER_POINTER (DECL_NAME (decl)),
6399 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
6402 check_deprecation (qual_wfl, decl);
6404 type = TREE_TYPE (decl);
6407 /* We resolve and expression name */
6412 /* If there exists an early resolution, use it. That occurs
6413 only once and we know that there are more things to
6414 come. Don't do that when processing something after SUPER
6415 (we need more thing to be put in place below */
6416 if (!from_super && QUAL_RESOLUTION (q))
6418 decl = QUAL_RESOLUTION (q);
6421 if (!FIELD_STATIC (decl))
6422 *where_found = current_this;
6425 *where_found = TREE_TYPE (decl);
6426 if (TREE_CODE (*where_found) == POINTER_TYPE)
6427 *where_found = TREE_TYPE (*where_found);
6432 /* We have to search for a field, knowing the type of its
6433 container. The flag FROM_TYPE indicates that we resolved
6434 the last member of the expression as a type name, which
6435 means that for the resolution of this field, we'll look
6436 for other errors than if it was resolved as a member of
6441 tree field_decl_type; /* For layout */
6443 if (!from_type && !JREFERENCE_TYPE_P (type))
6446 (qual_wfl, "Attempt to reference field `%s' in `%s %s'",
6447 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
6448 lang_printable_name (type, 0),
6449 IDENTIFIER_POINTER (DECL_NAME (field_decl)));
6453 field_decl = lookup_field_wrapper (type,
6454 EXPR_WFL_NODE (qual_wfl));
6455 if (field_decl == NULL_TREE)
6458 (qual_wfl, "No variable `%s' defined in class `%s'",
6459 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
6460 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
6463 if (field_decl == error_mark_node)
6466 /* Layout the type of field_decl, since we may need
6467 it. Don't do primitive types or loaded classes. The
6468 situation of non primitive arrays may not handled
6469 properly here. FIXME */
6470 if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
6471 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
6473 field_decl_type = TREE_TYPE (field_decl);
6474 if (!JPRIMITIVE_TYPE_P (field_decl_type)
6475 && !CLASS_LOADED_P (field_decl_type)
6476 && !TYPE_ARRAY_P (field_decl_type))
6477 resolve_and_layout (field_decl_type, NULL_TREE);
6478 if (TYPE_ARRAY_P (field_decl_type))
6479 CLASS_LOADED_P (field_decl_type) = 1;
6481 /* Check on accessibility here */
6482 if (not_accessible_p (type, field_decl, from_super))
6486 "Can't access %s field `%s.%s' from `%s'",
6487 java_accstring_lookup
6488 (get_access_flags_from_decl (field_decl)),
6489 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))),
6490 IDENTIFIER_POINTER (DECL_NAME (field_decl)),
6492 (DECL_NAME (TYPE_NAME (current_class))));
6495 check_deprecation (qual_wfl, field_decl);
6497 /* There are things to check when fields are accessed
6498 from type. There are no restrictions on a static
6499 declaration of the field when it is accessed from an
6501 is_static = FIELD_STATIC (field_decl);
6502 if (!from_super && from_type
6503 && !TYPE_INTERFACE_P (type) && !is_static)
6506 (qual_wfl, "Can't make a static reference to nonstatic "
6507 "variable `%s' in class `%s'",
6508 IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
6509 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
6512 from_cast = from_super = 0;
6514 /* If we need to generate something to get a proper
6515 handle on what this field is accessed from, do it
6519 decl = maybe_access_field (decl, *where_found, *type_found);
6520 if (decl == error_mark_node)
6524 /* We want to keep the location were found it, and the type
6526 *where_found = decl;
6529 /* This is the decl found and eventually the next one to
6534 type = QUAL_DECL_TYPE (decl);
6541 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
6542 can't be accessed from REFERENCE (a record type). */
6544 int not_accessible_p (reference, member, from_super)
6545 tree reference, member;
6548 int access_flag = get_access_flags_from_decl (member);
6550 /* Access always granted for members declared public */
6551 if (access_flag & ACC_PUBLIC)
6554 /* Check access on protected members */
6555 if (access_flag & ACC_PROTECTED)
6557 /* Access granted if it occurs from within the package
6558 containing the class in which the protected member is
6560 if (class_in_current_package (DECL_CONTEXT (member)))
6563 /* If accessed with the form `super.member', then access is granted */
6567 /* Otherwise, access is granted if occuring from the class where
6568 member is declared or a subclass of it */
6569 if (inherits_from_p (reference, current_class))
6574 /* Check access on private members. Access is granted only if it
6575 occurs from within the class in witch it is declared */
6576 if (access_flag & ACC_PRIVATE)
6577 return (current_class == DECL_CONTEXT (member) ? 0 : 1);
6579 /* Default access are permitted only when occuring within the
6580 package in which the type (REFERENCE) is declared. In other words,
6581 REFERENCE is defined in the current package */
6583 return !class_in_current_package (reference);
6585 /* Otherwise, access is granted */
6589 /* Test deprecated decl access. */
6591 check_deprecation (wfl, decl)
6594 char *file = DECL_SOURCE_FILE (decl);
6595 /* Complain if the field is deprecated and the file it was defined
6596 in isn't compiled at the same time the file which contains its
6598 if (DECL_DEPRECATED (decl)
6599 && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
6602 switch (TREE_CODE (decl))
6605 strcpy (the, "method");
6608 strcpy (the, "field");
6611 strcpy (the, "class");
6614 fatal ("unexpected DECL code - check_deprecation");
6616 parse_warning_context
6617 (wfl, "The %s `%s' in class `%s' has been deprecated",
6618 the, lang_printable_name (decl, 0),
6619 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
6623 /* Returns 1 if class was declared in the current package, 0 otherwise */
6626 class_in_current_package (class)
6629 static tree cache = NULL_TREE;
6636 qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
6638 /* If the current package is empty and the name of CLASS is
6639 qualified, class isn't in the current package. If there is a
6640 current package and the name of the CLASS is not qualified, class
6641 isn't in the current package */
6642 if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
6645 /* If there is not package and the name of CLASS isn't qualified,
6646 they belong to the same unnamed package */
6647 if (!ctxp->package && !qualified_flag)
6650 /* Compare the left part of the name of CLASS with the package name */
6651 breakdown_qualified (&left, NULL, DECL_NAME (TYPE_NAME (class)));
6652 if (ctxp->package == left)
6660 /* This function may generate code to access DECL from WHERE. This is
6661 done only if certain conditions meet. */
6664 maybe_access_field (decl, where, type)
6665 tree decl, where, type;
6667 if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
6668 && !FIELD_STATIC (decl))
6669 decl = build_field_ref (where ? where : current_this,
6670 (type ? type : DECL_CONTEXT (decl)),
6675 /* Build a method invocation, by patching PATCH. If non NULL
6676 and according to the situation, PRIMARY and WHERE may be
6677 used. IS_STATIC is set to 1 if the invoked function is static. */
6680 patch_method_invocation (patch, primary, where, is_static, ret_decl)
6681 tree patch, primary, where;
6685 tree wfl = TREE_OPERAND (patch, 0);
6686 tree args = TREE_OPERAND (patch, 1);
6687 tree name = EXPR_WFL_NODE (wfl);
6689 int is_static_flag = 0;
6690 int is_super_init = 0;
6691 tree this_arg = NULL_TREE;
6693 /* Should be overriden if everything goes well. Otherwise, if
6694 something fails, it should keep this value. It stop the
6695 evaluation of a bogus assignment. See java_complete_tree,
6696 MODIFY_EXPR: for the reasons why we sometimes want to keep on
6697 evaluating an assignment */
6698 TREE_TYPE (patch) = error_mark_node;
6700 /* Since lookup functions are messing with line numbers, save the
6702 java_parser_context_save_global ();
6704 /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
6706 /* Resolution of qualified name, excluding constructors */
6707 if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
6709 tree class_decl, identifier, identifier_wfl;
6710 /* Extract the last IDENTIFIER of the qualified
6711 expression. This is a wfl and we will use it's location
6712 data during error report. */
6713 identifier_wfl = cut_identifier_in_qualified (wfl);
6714 identifier = EXPR_WFL_NODE (identifier_wfl);
6716 /* Given the context, IDENTIFIER is syntactically qualified
6717 as a MethodName. We need to qualify what's before */
6718 qualify_ambiguous_name (wfl);
6720 /* Package resolution are erroneous */
6721 if (RESOLVE_PACKAGE_NAME_P (wfl))
6724 breakdown_qualified (&remainder, NULL, EXPR_WFL_NODE (wfl));
6725 parse_error_context (wfl, "Can't search method `%s' in package "
6726 "`%s'",IDENTIFIER_POINTER (identifier),
6727 IDENTIFIER_POINTER (remainder));
6728 PATCH_METHOD_RETURN_ERROR ();
6730 /* We're resolving a call from a type */
6731 else if (RESOLVE_TYPE_NAME_P (wfl))
6733 tree decl = QUAL_RESOLUTION (EXPR_WFL_QUALIFICATION (wfl));
6734 tree name = DECL_NAME (decl);
6737 class_decl = resolve_and_layout (name, wfl);
6738 if (CLASS_INTERFACE (decl))
6741 (identifier_wfl, "Can't make static reference to method "
6742 "`%s' in interface `%s'", IDENTIFIER_POINTER (identifier),
6743 IDENTIFIER_POINTER (name));
6744 PATCH_METHOD_RETURN_ERROR ();
6746 /* Look the method up in the type selector. The method ought
6748 type = TREE_TYPE (class_decl);
6749 list = lookup_method_invoke (0, wfl, type, identifier, args);
6750 if (list && !METHOD_STATIC (list))
6752 char *fct_name = strdup (lang_printable_name (list, 0));
6755 "Can't make static reference to method `%s %s' in class `%s'",
6756 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
6757 fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
6759 PATCH_METHOD_RETURN_ERROR ();
6761 args = nreverse (args);
6763 /* We're resolving an expression name */
6768 /* 1- Find the field to which the call applies */
6769 field = resolve_field_access (wfl, NULL, &type);
6770 if (field == error_mark_node)
6771 PATCH_METHOD_RETURN_ERROR ();
6772 /* field is used in lieu of a primary. It alows us not to
6773 report errors on erroneous use of `this' in
6777 /* 2- Do the layout of the class where the last field
6778 was found, so we can search it. */
6779 class_decl = resolve_and_layout (type, NULL_TREE);
6780 if (class_decl != NULL_TREE)
6781 type = TREE_TYPE (class_decl);
6783 /* 3- Retrieve a filtered list of method matches, Refine
6784 if necessary. In any cases, point out errors. */
6785 list = lookup_method_invoke (0, identifier_wfl, type,
6788 /* 4- Add the field as an argument */
6789 args = nreverse (args);
6793 /* IDENTIFIER_WFL will be used to report any problem further */
6794 wfl = identifier_wfl;
6796 /* Resolution of simple names, names generated after a primary: or
6800 tree class_to_search;
6801 int lc; /* Looking for Constructor */
6803 /* We search constructor in their target class */
6804 if (CALL_CONSTRUCTOR_P (patch))
6806 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
6807 class_to_search = EXPR_WFL_NODE (wfl);
6808 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
6809 this_identifier_node)
6810 class_to_search = NULL_TREE;
6811 else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
6812 super_identifier_node)
6815 if (CLASSTYPE_SUPER (current_class))
6817 DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
6820 parse_error_context (wfl, "Can't invoke super constructor "
6821 "on java.lang.Object");
6822 PATCH_METHOD_RETURN_ERROR ();
6826 /* Class to search is NULL if we're searching the current one */
6827 if (class_to_search)
6829 class_to_search = resolve_and_layout (class_to_search,
6831 if (!class_to_search)
6834 (wfl, "Class `%s' not found in type declaration",
6835 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
6836 PATCH_METHOD_RETURN_ERROR ();
6839 /* Can't instantiate an abstract class, but we can
6840 invoke it's constructor. It's use within the `new'
6841 context is denied here. */
6842 if (CLASS_ABSTRACT (class_to_search)
6843 && TREE_CODE (patch) == NEW_CLASS_EXPR)
6846 (wfl, "Class `%s' is an abstract class. It can't be "
6847 "instantiated", IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
6848 PATCH_METHOD_RETURN_ERROR ();
6850 class_to_search = TREE_TYPE (class_to_search);
6853 class_to_search = current_class;
6856 /* This is a regular search in the local class, unless an
6857 alternate class is specified. */
6860 class_to_search = (where ? where : current_class);
6864 /* NAME is a simple identifier or comes from a primary. Search
6865 in the class whose declaration contain the method being
6867 resolve_and_layout (class_to_search, NULL_TREE);
6868 list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
6870 /* Don't continue if no method were found, as the next statement
6871 can't be executed then. */
6873 PATCH_METHOD_RETURN_ERROR ();
6875 /* Check for static reference if non static methods */
6876 if (check_for_static_method_reference (wfl, patch, list,
6877 class_to_search, primary))
6878 PATCH_METHOD_RETURN_ERROR ();
6880 /* Non static methods are called with the current object extra
6881 argument. If patch a `new TYPE()', the argument is the value
6882 returned by the object allocator. If method is resolved as a
6883 primary, use the primary otherwise use the current THIS. */
6884 args = nreverse (args);
6885 if (TREE_CODE (patch) != NEW_CLASS_EXPR)
6886 this_arg = primary ? primary : current_this;
6889 /* Merge point of all resolution schemes. If we have nothing, this
6890 is an error, already signaled */
6892 PATCH_METHOD_RETURN_ERROR ();
6894 /* Check accessibility, position the is_static flag, build and
6896 if (not_accessible_p (DECL_CONTEXT (current_function_decl), list, 0))
6898 char *fct_name = strdup (lang_printable_name (list, 0));
6900 (wfl, "Can't access %s method `%s %s.%s' from `%s'",
6901 java_accstring_lookup (get_access_flags_from_decl (list)),
6902 lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
6903 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list)))),
6904 fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
6906 PATCH_METHOD_RETURN_ERROR ();
6908 check_deprecation (wfl, list);
6910 is_static_flag = METHOD_STATIC (list);
6911 if (! METHOD_STATIC (list) && this_arg != NULL_TREE)
6912 args = tree_cons (NULL_TREE, this_arg, args);
6914 /* In the context of an explicit constructor invocation, we can't
6915 invoke any method relying on `this'. Exceptions are: we're
6916 invoking a static function, primary exists and is not the current
6917 this, we're creating a new object. */
6918 if (ctxp->explicit_constructor_p
6920 && (!primary || primary == current_this)
6921 && (TREE_CODE (patch) != NEW_CLASS_EXPR))
6924 (wfl, "Can't reference `this' before the superclass constructor has "
6926 PATCH_METHOD_RETURN_ERROR ();
6928 java_parser_context_restore_global ();
6930 *is_static = is_static_flag;
6931 /* Sometimes, we want the decl of the selected method. Such as for
6935 patch = patch_invoke (patch, list, args);
6936 if (is_super_init && CLASS_HAS_FINIT_P (current_class))
6938 /* Generate the code used to initialize fields declared with an
6939 initialization statement. For now, it returns a call the the
6940 artificial function $finit$, if required. */
6943 build_method_invocation (build_expr_wfl (finit_identifier_node,
6944 input_filename, 0, 0),
6946 patch = build (COMPOUND_EXPR, void_type_node, patch,
6947 java_complete_tree (finit_call));
6948 CAN_COMPLETE_NORMALLY (patch) = 1;
6953 /* Check that we're not trying to do a static reference to a method in
6954 non static method. Return 1 if it's the case, 0 otherwise. */
6957 check_for_static_method_reference (wfl, node, method, where, primary)
6958 tree wfl, node, method, where, primary;
6960 if (METHOD_STATIC (current_function_decl)
6961 && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
6963 char *fct_name = strdup (lang_printable_name (method, 0));
6965 (wfl, "Can't make static reference to method `%s %s' in class `%s'",
6966 lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
6967 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
6974 /* Patch an invoke expression METHOD and ARGS, based on its invocation
6978 patch_invoke (patch, method, args)
6979 tree patch, method, args;
6982 tree original_call, t, ta;
6984 /* Last step for args: convert build-in types. If we're dealing with
6985 a new TYPE() type call, the first argument to the constructor
6986 isn't found in the incomming argument list, but delivered by
6988 t = TYPE_ARG_TYPES (TREE_TYPE (method));
6989 if (TREE_CODE (patch) == NEW_CLASS_EXPR)
6991 for (ta = args; t != end_params_node && ta;
6992 t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
6993 if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
6994 TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
6995 TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
6997 if (flag_emit_class_files)
7001 tree signature = build_java_signature (TREE_TYPE (method));
7002 switch (invocation_mode (method, CALL_USING_SUPER (patch)))
7004 case INVOKE_VIRTUAL:
7005 dtable = invoke_build_dtable (0, args);
7006 func = build_invokevirtual (dtable, method);
7011 func = build_known_method_ref (method, TREE_TYPE (method),
7012 DECL_CONTEXT (method),
7016 case INVOKE_INTERFACE:
7017 dtable = invoke_build_dtable (1, args);
7018 func = build_invokeinterface (dtable, DECL_NAME (method), signature);
7022 fatal ("internal error - unknown invocation_mode result");
7025 /* Ensure self_type is initialized, (invokestatic). FIXME */
7026 func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
7029 TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
7030 TREE_OPERAND (patch, 0) = func;
7031 TREE_OPERAND (patch, 1) = args;
7032 original_call = patch;
7034 /* We're processing a `new TYPE ()' form. New is called an its
7035 returned value is the first argument to the constructor. We build
7036 a COMPOUND_EXPR and use saved expression so that the overall NEW
7037 expression value is a pointer to a newly created and initialized
7039 if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
7041 tree class = DECL_CONTEXT (method);
7042 tree c1, saved_new, size, new;
7043 if (flag_emit_class_files)
7045 TREE_TYPE (patch) = build_pointer_type (class);
7048 if (!TYPE_SIZE (class))
7049 safe_layout_class (class);
7050 size = size_in_bytes (class);
7051 new = build (CALL_EXPR, promote_type (class),
7052 build_address_of (alloc_object_node),
7053 tree_cons (NULL_TREE, build_class_ref (class),
7054 build_tree_list (NULL_TREE,
7055 size_in_bytes (class))),
7057 saved_new = save_expr (new);
7058 c1 = build_tree_list (NULL_TREE, saved_new);
7059 TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
7060 TREE_OPERAND (original_call, 1) = c1;
7061 TREE_SET_CODE (original_call, CALL_EXPR);
7062 patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
7068 invocation_mode (method, super)
7072 int access = get_access_flags_from_decl (method);
7075 return INVOKE_SUPER;
7077 if (access & ACC_STATIC || access & ACC_FINAL || access & ACC_PRIVATE)
7078 return INVOKE_STATIC;
7080 if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
7081 return INVOKE_STATIC;
7083 if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
7084 return INVOKE_INTERFACE;
7086 if (DECL_CONSTRUCTOR_P (method))
7087 return INVOKE_STATIC;
7089 return INVOKE_VIRTUAL;
7092 /* Retrieve a refined list of matching methods. It covers the step
7093 15.11.2 (Compile-Time Step 2) */
7096 lookup_method_invoke (lc, cl, class, name, arg_list)
7099 tree class, name, arg_list;
7101 tree atl = end_params_node; /* Arg Type List */
7102 tree method, signature, list, node;
7103 char *candidates; /* Used for error report */
7105 /* Fix the arguments */
7106 for (node = arg_list; node; node = TREE_CHAIN (node))
7108 tree current_arg = TREE_TYPE (TREE_VALUE (node));
7109 /* Non primitive type may have to be resolved */
7110 if (!JPRIMITIVE_TYPE_P (current_arg))
7111 resolve_and_layout (current_arg, NULL_TREE);
7113 if (TREE_CODE (current_arg) == RECORD_TYPE)
7114 current_arg = promote_type (current_arg);
7115 atl = tree_cons (NULL_TREE, current_arg, atl);
7118 /* Find all candidates and then refine the list, searching for the
7119 most specific method. */
7120 list = find_applicable_accessible_methods_list (lc, class, name, atl);
7121 list = find_most_specific_methods_list (list);
7122 if (list && !TREE_CHAIN (list))
7123 return TREE_VALUE (list);
7125 /* Issue an error. List candidates if any. Candidates are listed
7126 only if accessible (non accessible methods may end-up here for
7127 the sake of a better error report). */
7132 obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
7133 for (current = list; current; current = TREE_CHAIN (current))
7135 tree cm = TREE_VALUE (current);
7137 if (!cm || not_accessible_p (class, cm, 0))
7140 (string, " `%s' in `%s'%s",
7141 get_printable_method_name (cm),
7142 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
7143 (TREE_CHAIN (current) ? "\n" : ""));
7144 obstack_grow (&temporary_obstack, string, strlen (string));
7146 obstack_1grow (&temporary_obstack, '\0');
7147 candidates = obstack_finish (&temporary_obstack);
7149 /* Issue the error message */
7150 method = make_node (FUNCTION_TYPE);
7151 TYPE_ARG_TYPES (method) = atl;
7152 signature = build_java_argument_signature (method);
7153 parse_error_context (cl, "Can't find %s `%s(%s)' in class `%s'%s",
7154 (lc ? "constructor" : "method"),
7156 IDENTIFIER_POINTER(DECL_NAME (TYPE_NAME (class))) :
7157 IDENTIFIER_POINTER (name)),
7158 IDENTIFIER_POINTER (signature),
7159 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class))),
7160 (candidates ? candidates : ""));
7164 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
7165 when we're looking for a constructor. */
7168 find_applicable_accessible_methods_list (lc, class, name, arglist)
7170 tree class, name, arglist;
7173 tree list = NULL_TREE, all_list = NULL_TREE;
7175 while (class != NULL_TREE)
7177 for (method = TYPE_METHODS (class);
7178 method != NULL_TREE; method = TREE_CHAIN (method))
7180 if (lc && !DECL_CONSTRUCTOR_P (method))
7182 else if (!lc && (DECL_CONSTRUCTOR_P (method)
7183 || (GET_METHOD_NAME (method) != name)))
7186 if (argument_types_convertible (method, arglist))
7188 /* Retain accessible methods only */
7189 if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
7191 list = tree_cons (NULL_TREE, method, list);
7193 /* Also retain all selected method here */
7194 all_list = tree_cons (NULL_TREE, method, list);
7197 /* When dealing with constructor, stop here, otherwise search
7199 class = (lc ? NULL_TREE : CLASSTYPE_SUPER (class));
7201 /* Either return the list obtained or all selected (but
7202 inaccessible) methods for better error report. */
7203 return (!list ? all_list : list);
7206 /* 15.11.2.2 Choose the Most Specific Method */
7209 find_most_specific_methods_list (list)
7213 tree current, new_list = NULL_TREE;
7214 for (current = list; current; current = TREE_CHAIN (current))
7217 DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
7219 for (method = list; method; method = TREE_CHAIN (method))
7221 /* Don't test a method against itself */
7222 if (method == current)
7225 /* Compare arguments and location where method where declared */
7226 if (argument_types_convertible (TREE_VALUE (method),
7227 TREE_VALUE (current))
7228 && valid_method_invocation_conversion_p
7229 (DECL_CONTEXT (TREE_VALUE (method)),
7230 DECL_CONTEXT (TREE_VALUE (current))))
7232 int v = ++DECL_SPECIFIC_COUNT (TREE_VALUE (current));
7233 max = (v > max ? v : max);
7238 /* Review the list and select the maximally specific methods */
7239 for (current = list; current; current = TREE_CHAIN (current))
7240 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
7241 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
7243 /* If we can't find one, lower expectations and try to gather multiple
7244 maximally specific methods */
7249 if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
7250 new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
7258 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
7259 converted by method invocation conversion (5.3) to the type of the
7260 corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
7261 to change less often than M1. */
7264 argument_types_convertible (m1, m2_or_arglist)
7265 tree m1, m2_or_arglist;
7267 static tree m2_arg_value = NULL_TREE;
7268 static tree m2_arg_cache = NULL_TREE;
7270 register tree m1_arg, m2_arg;
7272 m1_arg = TYPE_ARG_TYPES (TREE_TYPE (m1));
7273 if (!METHOD_STATIC (m1))
7274 m1_arg = TREE_CHAIN (m1_arg);
7276 if (m2_arg_value == m2_or_arglist)
7277 m2_arg = m2_arg_cache;
7280 /* M2_OR_ARGLIST can be a function DECL or a raw list of
7282 if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
7284 m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
7285 if (!METHOD_STATIC (m2_or_arglist))
7286 m2_arg = TREE_CHAIN (m2_arg);
7289 m2_arg = m2_or_arglist;
7291 m2_arg_value = m2_or_arglist;
7292 m2_arg_cache = m2_arg;
7295 while (m1_arg != end_params_node && m2_arg != end_params_node)
7297 resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
7298 if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
7299 TREE_VALUE (m2_arg)))
7301 m1_arg = TREE_CHAIN (m1_arg);
7302 m2_arg = TREE_CHAIN (m2_arg);
7304 return m1_arg == end_params_node && m2_arg == end_params_node;
7307 /* Qualification routines */
7310 qualify_ambiguous_name (id)
7313 tree qual, qual_wfl, name, decl, ptr_type, saved_current_class;
7314 int again, super_found = 0, this_found = 0, new_array_found = 0;
7316 /* We first qualify the first element, then derive qualification of
7317 others based on the first one. If the first element is qualified
7318 by a resolution (field or type), this resolution is stored in the
7319 QUAL_RESOLUTION of the qual element being examined. We need to
7320 save the current_class since the use of SUPER might change the
7322 saved_current_class = current_class;
7323 qual = EXPR_WFL_QUALIFICATION (id);
7326 /* Simple qualified expression feature a qual_wfl that is a
7327 WFL. Expression derived from a primary feature more complicated
7328 things like a CALL_EXPR. Expression from primary need to be
7329 worked out to extract the part on which the qualification will
7331 qual_wfl = QUAL_WFL (qual);
7332 switch (TREE_CODE (qual_wfl))
7335 qual_wfl = TREE_OPERAND (qual_wfl, 0);
7336 if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
7338 qual = EXPR_WFL_QUALIFICATION (qual_wfl);
7339 qual_wfl = QUAL_WFL (qual);
7342 case NEW_ARRAY_EXPR:
7343 qual = TREE_CHAIN (qual);
7344 new_array_found = again = 1;
7346 case NEW_CLASS_EXPR:
7348 qual_wfl = TREE_OPERAND (qual_wfl, 0);
7351 while (TREE_CODE (qual_wfl) == ARRAY_REF)
7352 qual_wfl = TREE_OPERAND (qual_wfl, 0);
7355 /* Fix for -Wall. Just break doing nothing */
7358 name = EXPR_WFL_NODE (qual_wfl);
7359 ptr_type = current_class;
7361 /* If we have a THIS (from a primary), we set the context accordingly */
7362 if (name == this_identifier_node)
7364 qual = TREE_CHAIN (qual);
7365 qual_wfl = QUAL_WFL (qual);
7366 if (TREE_CODE (qual_wfl) == CALL_EXPR)
7369 name = EXPR_WFL_NODE (qual_wfl);
7372 /* If we have a SUPER, we set the context accordingly */
7373 if (name == super_identifier_node)
7375 current_class = CLASSTYPE_SUPER (ptr_type);
7376 /* Check that there is such a thing as a super class. If not,
7377 return. The error will be caught later on, during the
7381 current_class = saved_current_class;
7384 qual = TREE_CHAIN (qual);
7385 /* Do one more interation to set things up */
7386 super_found = again = 1;
7388 /* Loop one more time if we're dealing with ?: or a string
7389 constant, or a convert expression */
7390 if (TREE_CODE (qual_wfl) == CONDITIONAL_EXPR
7391 || TREE_CODE (qual_wfl) == STRING_CST
7392 || TREE_CODE (qual_wfl) == CONVERT_EXPR)
7394 qual = TREE_CHAIN (qual);
7395 qual_wfl = QUAL_WFL (qual);
7400 /* If name appears within the scope of a location variable
7401 declaration or parameter declaration, then it is an expression
7402 name. We don't carry this test out if we're in the context of the
7403 use of SUPER or THIS */
7404 if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name)))
7406 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
7407 QUAL_RESOLUTION (qual) = decl;
7410 /* If within the class/interface NAME was found to be used there
7411 exists a (possibly inherited) field named NAME, then this is an
7412 expression name. If we saw a NEW_ARRAY_EXPR before and want to
7413 address length, it is OK. */
7414 else if ((decl = lookup_field_wrapper (ptr_type, name))
7415 || (new_array_found && name == length_identifier_node))
7417 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
7418 QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
7421 /* We reclassify NAME as a type name if:
7422 - NAME is a class/interface declared within the compilation
7423 unit containing NAME,
7424 - NAME is imported via a single-type-import declaration,
7425 - NAME is declared in an another compilation unit of the package
7426 of the compilation unit containing NAME,
7427 - NAME is declared by exactly on type-import-on-demand declaration
7428 of the compilation unit containing NAME. */
7429 else if ((decl = resolve_and_layout (name, NULL_TREE)))
7431 RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
7432 QUAL_RESOLUTION (qual) = decl;
7435 /* Method call are expression name */
7436 else if (TREE_CODE (QUAL_WFL (qual)) == CALL_EXPR
7437 || TREE_CODE (QUAL_WFL (qual)) == ARRAY_REF)
7438 RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
7440 /* Check here that NAME isn't declared by more than one
7441 type-import-on-demand declaration of the compilation unit
7442 containing NAME. FIXME */
7444 /* Otherwise, NAME is reclassified as a package name */
7446 RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
7448 /* Propagate the qualification accross other components of the
7450 for (qual = TREE_CHAIN (qual); qual;
7451 qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
7453 if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
7454 RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
7456 RESOLVE_EXPRESSION_NAME_P (QUAL_WFL (qual)) = 1;
7459 /* Store the global qualification for the ambiguous part of ID back
7461 if (RESOLVE_EXPRESSION_NAME_P (qual_wfl))
7462 RESOLVE_EXPRESSION_NAME_P (id) = 1;
7463 else if (RESOLVE_TYPE_NAME_P (qual_wfl))
7464 RESOLVE_TYPE_NAME_P (id) = 1;
7465 else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
7466 RESOLVE_PACKAGE_NAME_P (id) = 1;
7468 /* Restore the current class */
7469 current_class = saved_current_class;
7473 breakdown_qualified (left, right, source)
7474 tree *left, *right, source;
7476 char *p = IDENTIFIER_POINTER (source), *base;
7477 int l = IDENTIFIER_LENGTH (source);
7479 /* Breakdown NAME into REMAINDER . IDENTIFIER */
7482 while (*p != '.' && p != base)
7485 /* We didn't find a '.'. Return an error */
7491 *right = get_identifier (p+1);
7492 *left = get_identifier (IDENTIFIER_POINTER (source));
7498 /* Patch tree nodes in a function body. When a BLOCK is found, push
7499 local variable decls if present.
7500 Same as java_complete_lhs, but does resolve static finals to values. */
7503 java_complete_tree (node)
7506 node = java_complete_lhs (node);
7507 if (TREE_CODE (node) == VAR_DECL && FIELD_STATIC (node)
7508 && FIELD_FINAL (node) && DECL_INITIAL (node) != NULL_TREE)
7510 tree value = DECL_INITIAL (node);
7511 DECL_INITIAL (node) = NULL_TREE;
7512 value = fold_constant_for_init (value, node);
7513 DECL_INITIAL (node) = value;
7514 if (value != NULL_TREE)
7520 /* Patch tree nodes in a function body. When a BLOCK is found, push
7521 local variable decls if present.
7522 Same as java_complete_tree, but does not resolve static finals to values. */
7525 java_complete_lhs (node)
7528 tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
7531 /* CONVERT_EXPR always has its type set, even though it needs to be
7533 if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
7536 /* The switch block implements cases processing container nodes
7537 first. Contained nodes are always written back. Leaves come
7538 next and return a value. */
7539 switch (TREE_CODE (node))
7543 /* 1- Block section.
7544 Set the local values on decl names so we can identify them
7545 faster when they're referenced. At that stage, identifiers
7546 are legal so we don't check for declaration errors. */
7547 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
7549 DECL_CONTEXT (cn) = current_function_decl;
7550 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
7552 if (BLOCK_EXPR_BODY (node) == NULL_TREE)
7553 CAN_COMPLETE_NORMALLY (node) = 1;
7556 tree stmt = BLOCK_EXPR_BODY (node);
7559 if (TREE_CODE (stmt) == COMPOUND_EXPR)
7561 /* Re-order from (((A; B); C); ...; Z) to
7562 (A; (B; (C ; (...; Z)))).
7563 This makes it easier to scan the statements left-to-right
7564 without using recursion (which might overflow the stack
7565 if the block has many statements. */
7568 tree left = TREE_OPERAND (stmt, 0);
7569 if (TREE_CODE (left) != COMPOUND_EXPR)
7571 TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
7572 TREE_OPERAND (left, 1) = stmt;
7575 BLOCK_EXPR_BODY (node) = stmt;
7578 /* Now do the actual complete, without deep recursion for
7580 ptr = &BLOCK_EXPR_BODY (node);
7581 while (TREE_CODE (*ptr) == COMPOUND_EXPR
7582 && TREE_OPERAND (*ptr, 1) != empty_stmt_node)
7584 tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
7585 tree *next = &TREE_OPERAND (*ptr, 1);
7586 TREE_OPERAND (*ptr, 0) = cur;
7587 if (TREE_CODE (cur) == ERROR_MARK)
7589 else if (! CAN_COMPLETE_NORMALLY (cur))
7594 if (TREE_CODE (wfl_op2) == BLOCK)
7595 wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
7596 else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
7597 wfl_op2 = TREE_OPERAND (wfl_op2, 0);
7601 if (TREE_CODE (wfl_op2) != CASE_EXPR
7602 && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
7603 unreachable_stmt_error (*ptr);
7607 *ptr = java_complete_tree (*ptr);
7609 if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
7610 return error_mark_node;
7611 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
7613 /* Turn local bindings to null */
7614 for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
7615 IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
7617 TREE_TYPE (node) = void_type_node;
7620 /* 2- They are expressions but ultimately deal with statements */
7623 wfl_op1 = TREE_OPERAND (node, 0);
7624 COMPLETE_CHECK_OP_0 (node);
7625 /* CAN_COMPLETE_NORMALLY (node) = 0; */
7626 return patch_throw_statement (node, wfl_op1);
7628 case SYNCHRONIZED_EXPR:
7629 wfl_op1 = TREE_OPERAND (node, 0);
7630 return patch_synchronized_statement (node, wfl_op1);
7633 return patch_try_statement (node);
7635 case TRY_FINALLY_EXPR:
7636 COMPLETE_CHECK_OP_0 (node);
7637 COMPLETE_CHECK_OP_1 (node);
7638 CAN_COMPLETE_NORMALLY (node)
7639 = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
7640 && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
7641 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
7644 case CLEANUP_POINT_EXPR:
7645 COMPLETE_CHECK_OP_0 (node);
7646 TREE_TYPE (node) = void_type_node;
7647 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0));
7650 case WITH_CLEANUP_EXPR:
7651 COMPLETE_CHECK_OP_0 (node);
7652 COMPLETE_CHECK_OP_2 (node);
7653 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0));
7654 TREE_TYPE (node) = void_type_node;
7657 case LABELED_BLOCK_EXPR:
7658 PUSH_LABELED_BLOCK (node);
7659 if (LABELED_BLOCK_BODY (node))
7660 COMPLETE_CHECK_OP_1 (node);
7661 TREE_TYPE (node) = void_type_node;
7662 POP_LABELED_BLOCK ();
7663 if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
7664 CAN_COMPLETE_NORMALLY (node) = 1;
7667 case EXIT_BLOCK_EXPR:
7668 /* We don't complete operand 1, because it's the return value of
7669 the EXIT_BLOCK_EXPR which doesn't exist it Java */
7670 return patch_bc_statement (node);
7673 cn = java_complete_tree (TREE_OPERAND (node, 0));
7674 if (cn == error_mark_node)
7677 /* First, the case expression must be constant */
7680 if (!TREE_CONSTANT (cn))
7682 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
7683 parse_error_context (node, "Constant expression required");
7684 return error_mark_node;
7687 nn = ctxp->current_loop;
7689 /* It must be assignable to the type of the switch expression. */
7690 if (!try_builtin_assignconv (NULL_TREE,
7691 TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
7693 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
7696 "Incompatible type for case. Can't convert `%s' to `int'",
7697 lang_printable_name (TREE_TYPE (cn), 0));
7698 return error_mark_node;
7701 cn = fold (convert (int_type_node, cn));
7703 /* Multiple instance of a case label bearing the same
7704 value is checked during code generation. The case
7705 expression is allright so far. */
7706 TREE_OPERAND (node, 0) = cn;
7707 TREE_TYPE (node) = void_type_node;
7708 CAN_COMPLETE_NORMALLY (node) = 1;
7709 TREE_SIDE_EFFECTS (node) = 1;
7713 nn = ctxp->current_loop;
7714 /* Only one default label is allowed per switch statement */
7715 if (SWITCH_HAS_DEFAULT (nn))
7717 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
7718 parse_error_context (wfl_operator,
7719 "Duplicate case label: `default'");
7720 return error_mark_node;
7723 SWITCH_HAS_DEFAULT (nn) = 1;
7724 TREE_TYPE (node) = void_type_node;
7725 TREE_SIDE_EFFECTS (node) = 1;
7726 CAN_COMPLETE_NORMALLY (node) = 1;
7732 /* Check whether the loop was enclosed in a labeled
7733 statement. If not, create one, insert the loop in it and
7735 nn = patch_loop_statement (node);
7737 /* Anyways, walk the body of the loop */
7738 if (TREE_CODE (node) == LOOP_EXPR)
7739 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
7740 /* Switch statement: walk the switch expression and the cases */
7742 node = patch_switch_statement (node);
7744 if (TREE_OPERAND (node, 0) == error_mark_node)
7745 return error_mark_node;
7746 TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
7747 /* If we returned something different, that's because we
7748 inserted a label. Pop the label too. */
7751 if (CAN_COMPLETE_NORMALLY (node))
7752 CAN_COMPLETE_NORMALLY (nn) = 1;
7753 POP_LABELED_BLOCK ();
7759 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
7760 return patch_exit_expr (node);
7764 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
7765 if (TREE_OPERAND (node, 0) == error_mark_node)
7766 return error_mark_node;
7767 /* then-else branches */
7768 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
7769 if (TREE_OPERAND (node, 1) == error_mark_node)
7770 return error_mark_node;
7771 TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
7772 if (TREE_OPERAND (node, 2) == error_mark_node)
7773 return error_mark_node;
7774 return patch_if_else_statement (node);
7777 case CONDITIONAL_EXPR:
7779 wfl_op1 = TREE_OPERAND (node, 0);
7780 COMPLETE_CHECK_OP_0 (node);
7781 wfl_op2 = TREE_OPERAND (node, 1);
7782 COMPLETE_CHECK_OP_1 (node);
7783 wfl_op3 = TREE_OPERAND (node, 2);
7784 COMPLETE_CHECK_OP_2 (node);
7785 return patch_conditional_expr (node, wfl_op1, wfl_op2);
7787 /* 3- Expression section */
7789 wfl_op2 = TREE_OPERAND (node, 1);
7790 TREE_OPERAND (node, 0) = nn =
7791 java_complete_tree (TREE_OPERAND (node, 0));
7792 if (wfl_op2 == empty_stmt_node)
7793 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
7796 if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
7798 /* An unreachable condition in a do-while statement
7799 is *not* (technically) an unreachable statement. */
7801 if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
7802 nn = EXPR_WFL_NODE (nn);
7803 if (TREE_CODE (nn) != EXIT_EXPR)
7805 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
7806 parse_error_context (wfl_operator, "Unreachable statement");
7809 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
7810 if (TREE_OPERAND (node, 1) == error_mark_node)
7811 return error_mark_node;
7812 CAN_COMPLETE_NORMALLY (node)
7813 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1));
7815 TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
7819 /* CAN_COMPLETE_NORMALLY (node) = 0; */
7820 return patch_return (node);
7822 case EXPR_WITH_FILE_LOCATION:
7823 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
7824 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
7826 node = resolve_expression_name (node, NULL);
7827 if (node == error_mark_node)
7829 CAN_COMPLETE_NORMALLY (node) = 1;
7834 int save_lineno = lineno;
7835 lineno = EXPR_WFL_LINENO (node);
7836 body = java_complete_tree (EXPR_WFL_NODE (node));
7837 lineno = save_lineno;
7838 EXPR_WFL_NODE (node) = body;
7839 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
7840 CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
7841 if (body == error_mark_node)
7843 /* Its important for the evaluation of assignment that
7844 this mark on the TREE_TYPE is propagated. */
7845 TREE_TYPE (node) = error_mark_node;
7846 return error_mark_node;
7849 TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
7854 case NEW_ARRAY_EXPR:
7855 /* Patch all the dimensions */
7857 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
7859 int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
7860 tree dim = java_complete_tree (TREE_VALUE (cn));
7861 if (dim == error_mark_node)
7868 TREE_VALUE (cn) = dim;
7869 /* Setup the location of the current dimension, for
7870 later error report. */
7872 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
7873 EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
7876 /* They complete the array creation expression, if no errors
7878 CAN_COMPLETE_NORMALLY (node) = 1;
7879 return (flag ? error_mark_node : patch_newarray (node));
7881 case NEW_CLASS_EXPR:
7883 /* Complete function's argument(s) first */
7884 if (complete_function_arguments (node))
7885 return error_mark_node;
7888 tree decl, wfl = TREE_OPERAND (node, 0);
7889 int in_this = CALL_THIS_CONSTRUCTOR_P (node);
7891 node = patch_method_invocation (node, NULL_TREE,
7892 NULL_TREE, 0, &decl);
7893 if (node == error_mark_node)
7894 return error_mark_node;
7896 check_thrown_exceptions (EXPR_WFL_LINECOL (node), decl);
7897 /* If we call this(...), register signature and positions */
7899 DECL_CONSTRUCTOR_CALLS (current_function_decl) =
7900 tree_cons (wfl, decl,
7901 DECL_CONSTRUCTOR_CALLS (current_function_decl));
7902 CAN_COMPLETE_NORMALLY (node) = 1;
7903 return force_evaluation_order (node);
7907 /* Save potential wfls */
7908 wfl_op1 = TREE_OPERAND (node, 0);
7909 wfl_op2 = TREE_OPERAND (node, 1);
7910 TREE_OPERAND (node, 0) = java_complete_lhs (wfl_op1);
7911 if (TREE_OPERAND (node, 0) == error_mark_node)
7912 return error_mark_node;
7914 if (COMPOUND_ASSIGN_P (wfl_op2))
7918 java_complete_tree (TREE_OPERAND (wfl_op2, 0));
7920 /* Hand stablize the lhs on both places */
7921 lvalue = stabilize_reference (other);
7922 TREE_OPERAND (node, 0) = lvalue;
7923 TREE_OPERAND (TREE_OPERAND (node, 1), 0) = lvalue;
7926 /* If we're about to patch a NEW_ARRAY_INIT, we call a special
7927 function to complete this RHS */
7928 if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT)
7929 nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
7930 TREE_OPERAND (node, 1));
7932 nn = java_complete_tree (TREE_OPERAND (node, 1));
7934 if (nn == error_mark_node)
7935 return error_mark_node;
7936 TREE_OPERAND (node, 1) = nn;
7938 /* In case we're handling = with a String as a RHS, we need to
7939 produce a String out of the RHS (it might still be a
7940 STRING_CST or a StringBuffer at this stage */
7941 if ((nn = patch_string (TREE_OPERAND (node, 1))))
7942 TREE_OPERAND (node, 1) = nn;
7943 node = patch_assignment (node, wfl_op1, wfl_op2);
7944 CAN_COMPLETE_NORMALLY (node) = 1;
7946 /* Before returning the node, in the context of a static field
7947 assignment in <clinit>, we may want to carray further
7948 optimizations. (VAR_DECL means it's a static field. See
7950 if (DECL_NAME (current_function_decl) == clinit_identifier_node
7951 && MODIFY_EXPR_FROM_INITIALIZATION_P (node)
7952 && TREE_CODE (TREE_OPERAND (node, 0)) == VAR_DECL)
7953 node = patch_initialized_static_field (node);
7966 case TRUNC_MOD_EXPR:
7968 case TRUTH_ANDIF_EXPR:
7969 case TRUTH_ORIF_EXPR:
7976 /* Operands 0 and 1 are WFL in certain cases only. patch_binop
7977 knows how to handle those cases. */
7978 wfl_op1 = TREE_OPERAND (node, 0);
7979 wfl_op2 = TREE_OPERAND (node, 1);
7981 CAN_COMPLETE_NORMALLY (node) = 1;
7982 /* Don't complete string nodes if dealing with the PLUS operand. */
7983 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
7985 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
7986 if (TREE_OPERAND (node, 0) == error_mark_node)
7987 return error_mark_node;
7989 if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
7991 TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
7992 if (TREE_OPERAND (node, 1) == error_mark_node)
7993 return error_mark_node;
7995 return force_evaluation_order (patch_binop (node, wfl_op1, wfl_op2));
7997 case INSTANCEOF_EXPR:
7998 wfl_op1 = TREE_OPERAND (node, 0);
7999 COMPLETE_CHECK_OP_0 (node);
8000 return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
8002 case UNARY_PLUS_EXPR:
8004 case TRUTH_NOT_EXPR:
8006 case PREDECREMENT_EXPR:
8007 case PREINCREMENT_EXPR:
8008 case POSTDECREMENT_EXPR:
8009 case POSTINCREMENT_EXPR:
8011 /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
8012 how to handle those cases. */
8013 wfl_op1 = TREE_OPERAND (node, 0);
8014 CAN_COMPLETE_NORMALLY (node) = 1;
8015 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
8016 if (TREE_OPERAND (node, 0) == error_mark_node)
8017 return error_mark_node;
8018 node = patch_unaryop (node, wfl_op1);
8019 CAN_COMPLETE_NORMALLY (node) = 1;
8023 /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
8024 how to handle those cases. */
8025 wfl_op1 = TREE_OPERAND (node, 0);
8026 TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
8027 if (TREE_OPERAND (node, 0) == error_mark_node)
8028 return error_mark_node;
8029 if (!flag_emit_class_files)
8030 TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
8031 /* The same applies to wfl_op2 */
8032 wfl_op2 = TREE_OPERAND (node, 1);
8033 TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
8034 if (TREE_OPERAND (node, 1) == error_mark_node)
8035 return error_mark_node;
8036 if (!flag_emit_class_files)
8037 TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
8038 return patch_array_ref (node);
8044 /* The first step in the re-write of qualified name handling. FIXME.
8045 So far, this is only to support PRIMTYPE.class -> PRIMCLASS.TYPE. */
8046 TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
8047 if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
8049 tree name = TREE_OPERAND (node, 1);
8050 tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
8051 if (field == NULL_TREE)
8053 error ("missing static field `%s'", IDENTIFIER_POINTER (name));
8054 return error_mark_node;
8056 if (! FIELD_STATIC (field))
8058 error ("not a static field `%s'", IDENTIFIER_POINTER (name));
8059 return error_mark_node;
8064 fatal ("unimplemented java_complete_tree for COMPONENT_REF");
8068 /* Can't use THIS in a static environment */
8071 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8072 parse_error_context (wfl_operator, "Keyword `this' used outside "
8074 TREE_TYPE (node) = error_mark_node;
8075 return error_mark_node;
8077 if (ctxp->explicit_constructor_p)
8079 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8081 (wfl_operator, "Can't reference `this' or `super' before the "
8082 "superclass constructor has been called");
8083 TREE_TYPE (node) = error_mark_node;
8084 return error_mark_node;
8086 return current_this;
8089 CAN_COMPLETE_NORMALLY (node) = 1;
8090 /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
8091 and it's time to turn it into the appropriate String object
8093 if ((node = patch_string (node)))
8095 fatal ("No case for tree code `%s' - java_complete_tree\n",
8096 tree_code_name [TREE_CODE (node)]);
8101 /* Complete function call's argument. Return a non zero value is an
8105 complete_function_arguments (node)
8111 ctxp->explicit_constructor_p += (CALL_THIS_CONSTRUCTOR_P (node) ? 1 : 0);
8112 for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
8114 tree wfl = TREE_VALUE (cn), parm, temp;
8115 parm = java_complete_tree (wfl);
8116 if (parm == error_mark_node)
8121 /* If have a string literal that we haven't transformed yet or a
8122 crafted string buffer, as a result of use of the the String
8123 `+' operator. Build `parm.toString()' and expand it. */
8124 if ((temp = patch_string (parm)))
8126 /* Inline PRIMTYPE.TYPE read access */
8127 parm = maybe_build_primttype_type_ref (parm, wfl);
8129 TREE_VALUE (cn) = parm;
8131 ctxp->explicit_constructor_p -= (CALL_THIS_CONSTRUCTOR_P (node) ? 1 : 0);
8135 /* Sometimes (for loops and variable initialized during their
8136 declaration), we want to wrap a statement around a WFL and turn it
8140 build_debugable_stmt (location, stmt)
8144 if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
8146 stmt = build_expr_wfl (stmt, input_filename, 0, 0);
8147 EXPR_WFL_LINECOL (stmt) = location;
8149 JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
8154 build_expr_block (body, decls)
8157 tree node = make_node (BLOCK);
8158 BLOCK_EXPR_DECLS (node) = decls;
8159 BLOCK_EXPR_BODY (node) = body;
8161 TREE_TYPE (node) = TREE_TYPE (body);
8162 TREE_SIDE_EFFECTS (node) = 1;
8166 /* Create a new function block and link it approriately to current
8167 function block chain */
8172 return (enter_a_block (build_expr_block (NULL_TREE, NULL_TREE)));
8175 /* Link block B supercontext to the previous block. The current
8176 function DECL is used as supercontext when enter_a_block is called
8177 for the first time for a given function. The current function body
8178 (DECL_FUNCTION_BODY) is set to be block B. */
8184 tree fndecl = current_function_decl;
8186 if (!DECL_FUNCTION_BODY (fndecl))
8188 BLOCK_SUPERCONTEXT (b) = fndecl;
8189 DECL_FUNCTION_BODY (fndecl) = b;
8193 BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
8194 DECL_FUNCTION_BODY (fndecl) = b;
8199 /* Exit a block by changing the current function body
8200 (DECL_FUNCTION_BODY) to the current block super context, only if
8201 the block being exited isn't the method's top level one. */
8206 tree b = DECL_FUNCTION_BODY (current_function_decl);
8208 if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
8209 DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
8214 /* Lookup for NAME in the nested function's blocks, all the way up to
8215 the current toplevel one. It complies with Java's local variable
8219 lookup_name_in_blocks (name)
8222 tree b = DECL_FUNCTION_BODY (current_function_decl);
8224 while (b != current_function_decl)
8228 /* Paranoid sanity check. To be removed */
8229 if (TREE_CODE (b) != BLOCK)
8230 fatal ("non block expr function body - lookup_name_in_blocks");
8232 for (current = BLOCK_EXPR_DECLS (b); current;
8233 current = TREE_CHAIN (current))
8234 if (DECL_NAME (current) == name)
8236 b = BLOCK_SUPERCONTEXT (b);
8242 maybe_absorb_scoping_blocks ()
8244 while (BLOCK_EXPR_ORIGIN (DECL_FUNCTION_BODY (current_function_decl)))
8246 tree b = exit_block ();
8247 java_method_add_stmt (current_function_decl, b);
8248 SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", lineno));
8253 /* This section of the source is reserved to build_* functions that
8254 are building incomplete tree nodes and the patch_* functions that
8255 are completing them. */
8257 /* Build a super() constructor invocation. Returns empty_stmt_node if
8258 we're currently dealing with the class java.lang.Object. */
8261 build_super_invocation ()
8263 if (current_class == object_type_node)
8264 return empty_stmt_node;
8267 tree super_wfl = build_wfl_node (super_identifier_node,
8268 input_filename, 0, 0);
8269 return build_method_invocation (super_wfl, NULL_TREE);
8273 /* Build a SUPER/THIS qualified method invocation. */
8276 build_this_super_qualified_invocation (use_this, name, args, lloc, rloc)
8284 build_wfl_node ((use_this ? this_identifier_node : super_identifier_node),
8285 input_filename, 0, 0);
8286 EXPR_WFL_LINECOL (wfl) = lloc;
8287 invok = build_method_invocation (name, args);
8288 return make_qualified_primary (wfl, invok, rloc);
8291 /* Build an incomplete CALL_EXPR node. */
8294 build_method_invocation (name, args)
8298 tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
8299 TREE_SIDE_EFFECTS (call) = 1;
8300 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
8304 /* Build an incomplete new xxx(...) node. */
8307 build_new_invocation (name, args)
8310 tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
8311 TREE_SIDE_EFFECTS (call) = 1;
8312 EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
8316 /* Build an incomplete assignment expression. */
8319 build_assignment (op, op_location, lhs, rhs)
8320 int op, op_location;
8324 /* Build the corresponding binop if we deal with a Compound
8325 Assignment operator. Mark the binop sub-tree as part of a
8326 Compound Assignment expression */
8327 if (op != ASSIGN_TK)
8329 rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
8330 COMPOUND_ASSIGN_P (rhs) = 1;
8332 assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
8333 TREE_SIDE_EFFECTS (assignment) = 1;
8334 EXPR_WFL_LINECOL (assignment) = op_location;
8338 /* Print an INTEGER_CST node in a static buffer, and return the buffer. */
8341 print_int_node (node)
8344 static char buffer [80];
8345 if (TREE_CONSTANT_OVERFLOW (node))
8346 sprintf (buffer, "<overflow>");
8348 if (TREE_INT_CST_HIGH (node) == 0)
8349 sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
8350 TREE_INT_CST_LOW (node));
8351 else if (TREE_INT_CST_HIGH (node) == -1
8352 && TREE_INT_CST_LOW (node) != 0)
8355 sprintf (&buffer [1], HOST_WIDE_INT_PRINT_UNSIGNED,
8356 -TREE_INT_CST_LOW (node));
8359 sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
8360 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
8365 /* Return 1 if you an assignment of a FINAL is attempted */
8368 check_final_assignment (lvalue, wfl)
8371 if (JDECL_P (lvalue) && FIELD_FINAL (lvalue) &&
8372 DECL_NAME (current_function_decl) != clinit_identifier_node)
8375 (wfl, "Can't assign a value to the final variable `%s'",
8376 IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
8382 /* Inline references to java.lang.PRIMTYPE.TYPE when accessed in
8383 read. This is needed to avoid circularities in the implementation
8384 of these fields in libjava. */
8387 maybe_build_primttype_type_ref (rhs, wfl)
8390 tree to_return = NULL_TREE;
8391 tree rhs_type = TREE_TYPE (rhs);
8392 if (TREE_CODE (rhs) == COMPOUND_EXPR)
8394 tree n = TREE_OPERAND (rhs, 1);
8395 if (TREE_CODE (n) == VAR_DECL
8396 && DECL_NAME (n) == TYPE_identifier_node
8397 && rhs_type == class_ptr_type)
8399 char *self_name = IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl));
8400 if (!strncmp (self_name, "java.lang.", 10))
8401 to_return = build_primtype_type_ref (self_name);
8404 return (to_return ? to_return : rhs );
8407 /* 15.25 Assignment operators. */
8410 patch_assignment (node, wfl_op1, wfl_op2)
8415 tree rhs = TREE_OPERAND (node, 1);
8416 tree lvalue = TREE_OPERAND (node, 0), llvalue;
8417 tree lhs_type, rhs_type, new_rhs = NULL_TREE;
8418 int error_found = 0;
8419 int lvalue_from_array = 0;
8421 /* Can't assign to a final. */
8422 if (check_final_assignment (lvalue, wfl_op1))
8425 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8427 /* Lhs can be a named variable */
8428 if (JDECL_P (lvalue))
8430 lhs_type = TREE_TYPE (lvalue);
8432 /* Or Lhs can be a array acccess. Should that be lvalue ? FIXME +
8433 comment on reason why */
8434 else if (TREE_CODE (wfl_op1) == ARRAY_REF)
8436 lhs_type = TREE_TYPE (lvalue);
8437 lvalue_from_array = 1;
8439 /* Or a field access */
8440 else if (TREE_CODE (lvalue) == COMPONENT_REF)
8441 lhs_type = TREE_TYPE (lvalue);
8442 /* Or a function return slot */
8443 else if (TREE_CODE (lvalue) == RESULT_DECL)
8444 lhs_type = TREE_TYPE (lvalue);
8445 /* Otherwise, we might want to try to write into an optimized static
8446 final, this is an of a different nature, reported further on. */
8447 else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
8448 && resolve_expression_name (wfl_op1, &llvalue)
8449 && check_final_assignment (llvalue, wfl_op1))
8452 /* What we should do instead is resetting the all the flags
8453 previously set, exchange lvalue for llvalue and continue. */
8454 return error_mark_node;
8458 parse_error_context (wfl_op1, "Invalid left hand side of assignment");
8462 rhs_type = TREE_TYPE (rhs);
8463 /* 5.1 Try the assignment conversion for builtin type. */
8464 new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
8466 /* 5.2 If it failed, try a reference conversion */
8467 if (!new_rhs && (new_rhs = try_reference_assignconv (lhs_type, rhs)))
8468 lhs_type = promote_type (rhs_type);
8470 /* 15.25.2 If we have a compound assignment, convert RHS into the
8472 else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
8473 new_rhs = convert (lhs_type, rhs);
8475 /* Explicit cast required. This is an error */
8478 char *t1 = strdup (lang_printable_name (TREE_TYPE (rhs), 0));
8479 char *t2 = strdup (lang_printable_name (lhs_type, 0));
8481 char operation [32]; /* Max size known */
8483 /* If the assignment is part of a declaration, we use the WFL of
8484 the declared variable to point out the error and call it a
8485 declaration problem. If the assignment is a genuine =
8486 operator, we call is a operator `=' problem, otherwise we
8487 call it an assignment problem. In both of these last cases,
8488 we use the WFL of the operator to indicate the error. */
8490 if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
8493 strcpy (operation, "declaration");
8498 if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
8499 strcpy (operation, "assignment");
8500 else if (TREE_CODE (TREE_OPERAND (node, 0)) == RESULT_DECL)
8501 strcpy (operation, "`return'");
8503 strcpy (operation, "`='");
8507 (wfl, (!valid_cast_to_p (rhs_type, lhs_type) ?
8508 "Incompatible type for %s. Can't convert `%s' to `%s'" :
8509 "Incompatible type for %s. Explicit cast "
8510 "needed to convert `%s' to `%s'"), operation, t1, t2);
8511 free (t1); free (t2);
8515 /* Inline read access to java.lang.PRIMTYPE.TYPE */
8517 new_rhs = maybe_build_primttype_type_ref (new_rhs, wfl_op2);
8520 return error_mark_node;
8522 /* If we built a compound expression as the result of a reference
8523 assignment into an array element, return it here. */
8524 if (TREE_CODE (node) == COMPOUND_EXPR)
8527 TREE_OPERAND (node, 0) = lvalue;
8528 TREE_OPERAND (node, 1) = new_rhs;
8529 TREE_TYPE (node) = lhs_type;
8533 /* Optimize static (final) field initialized upon declaration.
8534 - If the field is static final and is assigned to a primitive
8535 constant type, then set its DECL_INITIAL to the value.
8539 patch_initialized_static_field (node)
8542 tree field = TREE_OPERAND (node, 0);
8543 tree value = TREE_OPERAND (node, 1);
8545 if (DECL_INITIAL (field) != NULL_TREE)
8547 tree type = TREE_TYPE (value);
8548 if (FIELD_FINAL (field) && TREE_CONSTANT (value)
8549 && (JPRIMITIVE_TYPE_P (type)
8550 || (flag_emit_class_files
8551 && TREE_CODE (type) == POINTER_TYPE
8552 && TREE_TYPE (type) == string_type_node)))
8554 DECL_INITIAL (field) = value;
8555 return empty_stmt_node;
8557 DECL_INITIAL (field) = NULL_TREE;
8562 /* Check that type SOURCE can be cast into type DEST. If the cast
8563 can't occur at all, return 0 otherwise 1. This function is used to
8564 produce accurate error messages on the reasons why an assignment
8568 try_reference_assignconv (lhs_type, rhs)
8571 tree new_rhs = NULL_TREE;
8572 tree rhs_type = TREE_TYPE (rhs);
8574 if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
8576 /* `null' may be assigned to any reference type */
8577 if (rhs == null_pointer_node)
8578 new_rhs = null_pointer_node;
8579 /* Try the reference assignment conversion */
8580 else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
8582 /* This is a magic assignment that we process differently */
8583 else if (rhs == soft_exceptioninfo_call_node)
8589 /* Check that RHS can be converted into LHS_TYPE by the assignment
8590 conversion (5.2), for the cases of RHS being a builtin type. Return
8591 NULL_TREE if the conversion fails or if because RHS isn't of a
8592 builtin type. Return a converted RHS if the conversion is possible. */
8595 try_builtin_assignconv (wfl_op1, lhs_type, rhs)
8596 tree wfl_op1, lhs_type, rhs;
8598 tree new_rhs = NULL_TREE;
8599 tree rhs_type = TREE_TYPE (rhs);
8601 /* Zero accepted everywhere */
8602 if (TREE_CODE (rhs) == INTEGER_CST
8603 && TREE_INT_CST_HIGH (rhs) == 0 && TREE_INT_CST_LOW (rhs) == 0
8604 && JPRIMITIVE_TYPE_P (rhs_type))
8605 new_rhs = convert (lhs_type, rhs);
8607 /* 5.1.1 Try Identity Conversion,
8608 5.1.2 Try Widening Primitive Conversion */
8609 else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
8610 new_rhs = convert (lhs_type, rhs);
8612 /* Try a narrowing primitive conversion (5.1.3):
8613 - expression is a constant expression of type int AND
8614 - variable is byte, short or char AND
8615 - The value of the expression is representable in the type of the
8617 else if (rhs_type == int_type_node && TREE_CONSTANT (rhs)
8618 && (lhs_type == byte_type_node || lhs_type == char_type_node
8619 || lhs_type == short_type_node))
8621 if (int_fits_type_p (rhs, lhs_type))
8622 new_rhs = convert (lhs_type, rhs);
8623 else if (wfl_op1) /* Might be called with a NULL */
8624 parse_warning_context
8625 (wfl_op1, "Constant expression `%s' to wide for narrowing "
8626 "primitive conversion to `%s'",
8627 print_int_node (rhs), lang_printable_name (lhs_type, 0));
8628 /* Reported a warning that will turn into an error further
8629 down, so we don't return */
8635 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
8636 conversion (5.1.1) or widening primitve conversion (5.1.2). Return
8637 0 is the conversion test fails. This implements parts the method
8638 invocation convertion (5.3). */
8641 valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type)
8642 tree lhs_type, rhs_type;
8644 /* 5.1.1: This is the identity conversion part. */
8645 if (lhs_type == rhs_type)
8648 /* Reject non primitive types */
8649 if (!JPRIMITIVE_TYPE_P (lhs_type) || !JPRIMITIVE_TYPE_P (rhs_type))
8652 /* 5.1.2: widening primitive conversion. byte, even if it's smaller
8653 than a char can't be converted into a char. Short can't too, but
8654 the < test below takes care of that */
8655 if (lhs_type == char_type_node && rhs_type == byte_type_node)
8658 /* Accept all promoted type here. Note, we can't use <= in the test
8659 below, because we still need to bounce out assignments of short
8660 to char and the likes */
8661 if (lhs_type == int_type_node
8662 && (rhs_type == promoted_byte_type_node
8663 || rhs_type == promoted_short_type_node
8664 || rhs_type == promoted_char_type_node
8665 || rhs_type == promoted_boolean_type_node))
8668 /* From here, an integral is widened if its precision is smaller
8669 than the precision of the LHS or if the LHS is a floating point
8670 type, or the RHS is a float and the RHS a double. */
8671 if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
8672 && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
8673 || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
8674 || (rhs_type == float_type_node && lhs_type == double_type_node))
8680 /* Check that something of SOURCE type can be assigned or cast to
8681 something of DEST type at runtime. Return 1 if the operation is
8682 valid, 0 otherwise. If CAST is set to 1, we're treating the case
8683 were SOURCE is cast into DEST, which borrows a lot of the
8684 assignment check. */
8687 valid_ref_assignconv_cast_p (source, dest, cast)
8692 /* SOURCE or DEST might be null if not from a declared entity. */
8693 if (!source || !dest)
8695 if (JNULLP_TYPE_P (source))
8697 if (TREE_CODE (source) == POINTER_TYPE)
8698 source = TREE_TYPE (source);
8699 if (TREE_CODE (dest) == POINTER_TYPE)
8700 dest = TREE_TYPE (dest);
8701 /* Case where SOURCE is a class type */
8702 if (TYPE_CLASS_P (source))
8704 if (TYPE_CLASS_P (dest))
8705 return source == dest || inherits_from_p (source, dest)
8706 || (cast && inherits_from_p (dest, source));
8707 if (TYPE_INTERFACE_P (dest))
8709 /* If doing a cast and SOURCE is final, the operation is
8710 always correct a compile time (because even if SOURCE
8711 does not implement DEST, a subclass of SOURCE might). */
8712 if (cast && !CLASS_FINAL (TYPE_NAME (source)))
8714 /* Otherwise, SOURCE must implement DEST */
8715 return interface_of_p (dest, source);
8717 /* DEST is an array, cast permited if SOURCE is of Object type */
8718 return (cast && source == object_type_node ? 1 : 0);
8720 if (TYPE_INTERFACE_P (source))
8722 if (TYPE_CLASS_P (dest))
8724 /* If not casting, DEST must be the Object type */
8726 return dest == object_type_node;
8727 /* We're doing a cast. The cast is always valid is class
8728 DEST is not final, otherwise, DEST must implement SOURCE */
8729 else if (!CLASS_FINAL (TYPE_NAME (dest)))
8732 return interface_of_p (source, dest);
8734 if (TYPE_INTERFACE_P (dest))
8736 /* If doing a cast, then if SOURCE and DEST contain method
8737 with the same signature but different return type, then
8738 this is a (compile time) error */
8741 tree method_source, method_dest;
8745 for (method_source = TYPE_METHODS (source); method_source;
8746 method_source = TREE_CHAIN (method_source))
8749 build_java_argument_signature (TREE_TYPE (method_source));
8750 source_type = TREE_TYPE (TREE_TYPE (method_source));
8751 source_name = DECL_NAME (method_source);
8752 for (method_dest = TYPE_METHODS (dest);
8753 method_dest; method_dest = TREE_CHAIN (method_dest))
8755 build_java_argument_signature (TREE_TYPE (method_dest))
8756 && source_name == DECL_NAME (method_dest)
8757 && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
8763 return source == dest || interface_of_p (dest, source);
8768 if (TYPE_ARRAY_P (source))
8770 if (TYPE_CLASS_P (dest))
8771 return dest == object_type_node;
8772 /* Can't cast an array to an interface unless the interface is
8773 java.lang.Cloneable */
8774 if (TYPE_INTERFACE_P (dest))
8775 return (DECL_NAME (TYPE_NAME (dest)) == java_lang_cloneable ? 1 : 0);
8778 tree source_element_type = TYPE_ARRAY_ELEMENT (source);
8779 tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
8781 /* In case of severe errors, they turn out null */
8782 if (!dest_element_type || !source_element_type)
8784 if (source_element_type == dest_element_type)
8786 return valid_ref_assignconv_cast_p (source_element_type,
8787 dest_element_type, cast);
8795 valid_cast_to_p (source, dest)
8799 if (TREE_CODE (source) == POINTER_TYPE)
8800 source = TREE_TYPE (source);
8801 if (TREE_CODE (dest) == POINTER_TYPE)
8802 dest = TREE_TYPE (dest);
8804 if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
8805 return valid_ref_assignconv_cast_p (source, dest, 1);
8807 else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
8813 /* Method invocation conversion test. Return 1 if type SOURCE can be
8814 converted to type DEST through the methond invocation conversion
8818 do_unary_numeric_promotion (arg)
8821 tree type = TREE_TYPE (arg);
8822 if (TREE_CODE (type) == INTEGER_TYPE ? TYPE_PRECISION (type) < 32
8823 : TREE_CODE (type) == CHAR_TYPE)
8824 arg = convert (int_type_node, arg);
8828 /* Return a non zero value if SOURCE can be converted into DEST using
8829 the method invocation conversion rule (5.3). */
8831 valid_method_invocation_conversion_p (dest, source)
8834 return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
8835 && valid_builtin_assignconv_identity_widening_p (dest, source))
8836 || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
8837 && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
8838 && valid_ref_assignconv_cast_p (source, dest, 0)));
8841 /* Build an incomplete binop expression. */
8844 build_binop (op, op_location, op1, op2)
8849 tree binop = build (op, NULL_TREE, op1, op2);
8850 TREE_SIDE_EFFECTS (binop) = 1;
8851 /* Store the location of the operator, for better error report. The
8852 string of the operator will be rebuild based on the OP value. */
8853 EXPR_WFL_LINECOL (binop) = op_location;
8857 /* Build the string of the operator retained by NODE. If NODE is part
8858 of a compound expression, add an '=' at the end of the string. This
8859 function is called when an error needs to be reported on an
8860 operator. The string is returned as a pointer to a static character
8864 operator_string (node)
8867 #define BUILD_OPERATOR_STRING(S) \
8869 sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
8873 static char buffer [10];
8874 switch (TREE_CODE (node))
8876 case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
8877 case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
8878 case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
8879 case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
8880 case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
8881 case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
8882 case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
8883 case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
8884 case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
8885 case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
8886 case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
8887 case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
8888 case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
8889 case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
8890 case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
8891 case GT_EXPR: BUILD_OPERATOR_STRING (">");
8892 case GE_EXPR: BUILD_OPERATOR_STRING (">=");
8893 case LT_EXPR: BUILD_OPERATOR_STRING ("<");
8894 case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
8895 case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
8896 case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
8897 case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
8898 case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
8899 case PREINCREMENT_EXPR: /* Fall through */
8900 case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
8901 case PREDECREMENT_EXPR: /* Fall through */
8902 case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
8904 fatal ("unregistered operator %s - operator_string",
8905 tree_code_name [TREE_CODE (node)]);
8908 #undef BUILD_OPERATOR_STRING
8911 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
8912 errors but we modify NODE so that it contains the type computed
8913 according to the expression, when it's fixed. Otherwise, we write
8914 error_mark_node as the type. It allows us to further the analysis
8915 of remaining nodes and detects more errors in certain cases. */
8918 patch_binop (node, wfl_op1, wfl_op2)
8923 tree op1 = TREE_OPERAND (node, 0);
8924 tree op2 = TREE_OPERAND (node, 1);
8925 tree op1_type = TREE_TYPE (op1);
8926 tree op2_type = TREE_TYPE (op2);
8928 int code = TREE_CODE (node);
8930 /* If 1, tell the routine that we have to return error_mark_node
8931 after checking for the initialization of the RHS */
8932 int error_found = 0;
8934 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
8938 /* 15.16 Multiplicative operators */
8939 case MULT_EXPR: /* 15.16.1 Multiplication Operator * */
8940 case RDIV_EXPR: /* 15.16.2 Division Operator / */
8941 case TRUNC_MOD_EXPR: /* 15.16.3 Remainder operator % */
8942 if (!JPRIMITIVE_TYPE_P (op1_type) || !JPRIMITIVE_TYPE_P (op2_type))
8944 if (!JPRIMITIVE_TYPE_P (op1_type))
8945 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
8946 if (!JPRIMITIVE_TYPE_P (op2_type) && (op1_type != op2_type))
8947 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
8948 TREE_TYPE (node) = error_mark_node;
8952 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
8953 /* Change the division operator if necessary */
8954 if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
8955 TREE_SET_CODE (node, TRUNC_DIV_EXPR);
8957 /* This one is more complicated. FLOATs are processed by a
8958 function call to soft_fmod. Duplicate the value of the
8959 COMPOUND_ASSIGN_P flag. */
8960 if (code == TRUNC_MOD_EXPR)
8962 tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
8963 COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
8964 TREE_SIDE_EFFECTS (mod)
8965 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
8970 /* 15.17 Additive Operators */
8971 case PLUS_EXPR: /* 15.17.1 String Concatenation Operator + */
8973 /* Operation is valid if either one argument is a string
8974 constant, a String object or a StringBuffer crafted for the
8975 purpose of the a previous usage of the String concatenation
8978 if (TREE_CODE (op1) == STRING_CST
8979 || TREE_CODE (op2) == STRING_CST
8980 || JSTRING_TYPE_P (op1_type)
8981 || JSTRING_TYPE_P (op2_type)
8982 || IS_CRAFTED_STRING_BUFFER_P (op1)
8983 || IS_CRAFTED_STRING_BUFFER_P (op2))
8984 return build_string_concatenation (op1, op2);
8986 case MINUS_EXPR: /* 15.17.2 Additive Operators (+ and -) for
8988 if (!JPRIMITIVE_TYPE_P (op1_type) || !JPRIMITIVE_TYPE_P (op2_type))
8990 if (!JPRIMITIVE_TYPE_P (op1_type))
8991 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
8992 if (!JPRIMITIVE_TYPE_P (op2_type) && (op1_type != op2_type))
8993 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
8994 TREE_TYPE (node) = error_mark_node;
8998 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
9001 /* 15.18 Shift Operators */
9005 if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
9007 if (!JINTEGRAL_TYPE_P (op1_type))
9008 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
9011 (wfl_operator, (JPRIMITIVE_TYPE_P (op2_type) ?
9012 "Incompatible type for `%s'. Explicit cast needed to convert "
9013 "shift distance from `%s' to integral" :
9014 "Incompatible type for `%s'. Can't convert shift distance from "
9015 "`%s' to integral"),
9016 operator_string (node), lang_printable_name (op2_type, 0));
9017 TREE_TYPE (node) = error_mark_node;
9022 /* Unary numeric promotion (5.6.1) is performed on each operand
9024 op1 = do_unary_numeric_promotion (op1);
9025 op2 = do_unary_numeric_promotion (op2);
9027 /* The type of the shift expression is the type of the promoted
9028 type of the left-hand operand */
9029 prom_type = TREE_TYPE (op1);
9031 /* Shift int only up to 0x1f and long up to 0x3f */
9032 if (prom_type == int_type_node)
9033 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
9034 build_int_2 (0x1f, 0)));
9036 op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
9037 build_int_2 (0x3f, 0)));
9039 /* The >>> operator is a >> operating on unsigned quantities */
9040 if (code == URSHIFT_EXPR && ! flag_emit_class_files)
9043 tree utype = unsigned_type (prom_type);
9044 op1 = convert (utype, op1);
9045 TREE_SET_CODE (node, RSHIFT_EXPR);
9046 TREE_OPERAND (node, 0) = op1;
9047 TREE_OPERAND (node, 1) = op2;
9048 TREE_TYPE (node) = utype;
9049 to_return = convert (prom_type, node);
9050 /* Copy the original value of the COMPOUND_ASSIGN_P flag */
9051 COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
9052 TREE_SIDE_EFFECTS (to_return)
9053 = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
9058 /* 15.19.1 Type Comparison Operator instaceof */
9059 case INSTANCEOF_EXPR:
9061 TREE_TYPE (node) = boolean_type_node;
9063 if (!(op2_type = resolve_type_during_patch (op2)))
9064 return error_mark_node;
9066 /* The first operand must be a reference type or the null type */
9067 if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
9068 error_found = 1; /* Error reported further below */
9070 /* The second operand must be a reference type */
9071 if (!JREFERENCE_TYPE_P (op2_type))
9073 SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
9075 (wfl_operator, "Invalid argument `%s' for `instanceof'",
9076 lang_printable_name (op2_type, 0));
9080 if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
9082 /* If the first operand is null, the result is always false */
9083 if (op1 == null_pointer_node)
9084 return boolean_false_node;
9085 else if (flag_emit_class_files)
9087 TREE_OPERAND (node, 1) = op2_type;
9088 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
9091 /* Otherwise we have to invoke instance of to figure it out */
9095 build (CALL_EXPR, boolean_type_node,
9096 build_address_of (soft_instanceof_node),
9099 build_tree_list (NULL_TREE,
9100 build_class_ref (op2_type))),
9102 TREE_SIDE_EFFECTS (call) = TREE_SIDE_EFFECTS (op1);
9106 /* There is no way the expression operand can be an instance of
9107 the type operand. This is a compile time error. */
9110 char *t1 = strdup (lang_printable_name (op1_type, 0));
9111 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
9113 (wfl_operator, "Impossible for `%s' to be instance of `%s'",
9114 t1, lang_printable_name (op2_type, 0));
9121 /* 15.21 Bitwise and Logical Operators */
9125 if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
9126 /* Binary numeric promotion is performed on both operand and the
9127 expression retain that type */
9128 prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
9130 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
9131 && TREE_CODE (op1_type) == BOOLEAN_TYPE)
9132 /* The type of the bitwise operator expression is BOOLEAN */
9133 prom_type = boolean_type_node;
9136 if (!JINTEGRAL_TYPE_P (op1_type))
9137 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
9138 if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
9139 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
9140 TREE_TYPE (node) = error_mark_node;
9142 /* Insert a break here if adding thing before the switch's
9143 break for this case */
9147 /* 15.22 Conditional-And Operator */
9148 case TRUTH_ANDIF_EXPR:
9149 /* 15.23 Conditional-Or Operator */
9150 case TRUTH_ORIF_EXPR:
9151 /* Operands must be of BOOLEAN type */
9152 if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
9153 TREE_CODE (op2_type) != BOOLEAN_TYPE)
9155 if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
9156 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
9157 if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
9158 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
9159 TREE_TYPE (node) = boolean_type_node;
9163 /* The type of the conditional operators is BOOLEAN */
9164 prom_type = boolean_type_node;
9167 /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
9172 /* The type of each of the operands must be a primitive numeric
9174 if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
9176 if (!JNUMERIC_TYPE_P (op1_type))
9177 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
9178 if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
9179 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
9180 TREE_TYPE (node) = boolean_type_node;
9184 /* Binary numeric promotion is performed on the operands */
9185 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
9186 /* The type of the relation expression is always BOOLEAN */
9187 prom_type = boolean_type_node;
9190 /* 15.20 Equality Operator */
9193 /* 15.20.1 Numerical Equality Operators == and != */
9194 /* Binary numeric promotion is performed on the operands */
9195 if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
9196 binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
9198 /* 15.20.2 Boolean Equality Operators == and != */
9199 else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
9200 TREE_CODE (op2_type) == BOOLEAN_TYPE)
9201 ; /* Nothing to do here */
9203 /* 15.20.3 Reference Equality Operators == and != */
9204 /* Types have to be either references or the null type. If
9205 they're references, it must be possible to convert either
9206 type to the other by casting conversion. */
9207 else if (op1 == null_pointer_node || op2 == null_pointer_node
9208 || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
9209 && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
9210 || valid_ref_assignconv_cast_p (op2_type,
9212 ; /* Nothing to do here */
9214 /* Else we have an error figure what can't be converted into
9215 what and report the error */
9219 t1 = strdup (lang_printable_name (op1_type, 0));
9221 (wfl_operator, "Incompatible type for `%s'. Can't convert `%s' "
9222 "to `%s'", operator_string (node), t1,
9223 lang_printable_name (op2_type, 0));
9225 TREE_TYPE (node) = boolean_type_node;
9229 prom_type = boolean_type_node;
9234 return error_mark_node;
9236 TREE_OPERAND (node, 0) = op1;
9237 TREE_OPERAND (node, 1) = op2;
9238 TREE_TYPE (node) = prom_type;
9239 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
9244 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
9245 zero value, the value of CSTE comes after the valude of STRING */
9248 do_merge_string_cste (cste, string, string_len, after)
9251 int string_len, after;
9253 int len = TREE_STRING_LENGTH (cste) + string_len;
9254 char *old = TREE_STRING_POINTER (cste);
9255 TREE_STRING_LENGTH (cste) = len;
9256 TREE_STRING_POINTER (cste) = obstack_alloc (expression_obstack, len+1);
9259 strcpy (TREE_STRING_POINTER (cste), string);
9260 strcat (TREE_STRING_POINTER (cste), old);
9264 strcpy (TREE_STRING_POINTER (cste), old);
9265 strcat (TREE_STRING_POINTER (cste), string);
9270 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
9271 new STRING_CST on success, NULL_TREE on failure */
9274 merge_string_cste (op1, op2, after)
9278 /* Handle two string constants right away */
9279 if (TREE_CODE (op2) == STRING_CST)
9280 return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
9281 TREE_STRING_LENGTH (op2), after);
9283 /* Reasonable integer constant can be treated right away */
9284 if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
9286 static char *boolean_true = "true";
9287 static char *boolean_false = "false";
9288 static char *null_pointer = "null";
9292 if (op2 == boolean_true_node)
9293 string = boolean_true;
9294 else if (op2 == boolean_false_node)
9295 string = boolean_false;
9296 else if (op2 == null_pointer_node)
9297 string = null_pointer;
9298 else if (TREE_TYPE (op2) == char_type_node)
9300 ch[0] = (char )TREE_INT_CST_LOW (op2);
9305 string = print_int_node (op2);
9307 return do_merge_string_cste (op1, string, strlen (string), after);
9312 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
9313 has to be a STRING_CST and the other part must be a STRING_CST or a
9314 INTEGRAL constant. Return a new STRING_CST if the operation
9315 succeed, NULL_TREE otherwise.
9317 If the case we want to optimize for space, we might want to return
9318 NULL_TREE for each invocation of this routine. FIXME */
9321 string_constant_concatenation (op1, op2)
9324 if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
9329 string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
9330 rest = (string == op1 ? op2 : op1);
9331 invert = (string == op1 ? 0 : 1 );
9333 /* Walk REST, only if it looks reasonable */
9334 if (TREE_CODE (rest) != STRING_CST
9335 && !IS_CRAFTED_STRING_BUFFER_P (rest)
9336 && !JSTRING_TYPE_P (TREE_TYPE (rest))
9337 && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
9339 rest = java_complete_tree (rest);
9340 if (rest == error_mark_node)
9341 return error_mark_node;
9344 return merge_string_cste (string, rest, invert);
9349 /* Implement the `+' operator. Does static optimization if possible,
9350 otherwise create (if necessary) and append elements to a
9351 StringBuffer. The StringBuffer will be carried around until it is
9352 used for a function call or an assignment. Then toString() will be
9353 called on it to turn it into a String object. */
9356 build_string_concatenation (op1, op2)
9360 int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
9363 /* Try to do some static optimization */
9364 if ((result = string_constant_concatenation (op1, op2)))
9367 /* Discard empty strings on either side of the expression */
9368 if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
9373 else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
9376 /* If operands are string constant, turn then into object references */
9377 if (TREE_CODE (op1) == STRING_CST)
9378 op1 = patch_string_cst (op1);
9379 if (op2 && TREE_CODE (op2) == STRING_CST)
9380 op2 = patch_string_cst (op2);
9382 /* If either one of the constant is null and the other non null
9383 operand is a String object, return it. */
9384 if (JSTRING_TYPE_P (TREE_TYPE (op1)) && !op2)
9387 /* If OP1 isn't already a StringBuffer, create and
9388 initialize a new one */
9389 if (!IS_CRAFTED_STRING_BUFFER_P (op1))
9391 /* Two solutions here:
9392 1) OP1 is a string reference, we call new StringBuffer(OP1)
9393 2) OP1 is something else, we call new StringBuffer().append(OP1). */
9394 if (JSTRING_TYPE_P (TREE_TYPE (op1)))
9395 op1 = BUILD_STRING_BUFFER (op1);
9398 tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
9399 op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
9405 /* OP1 is no longer the last node holding a crafted StringBuffer */
9406 IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
9407 /* Create a node for `{new...,xxx}.append (op2)' */
9409 op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
9412 /* Mark the last node holding a crafted StringBuffer */
9413 IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
9415 TREE_SIDE_EFFECTS (op1) = side_effects;
9419 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
9420 StringBuffer. If no string were found to be patched, return
9427 if (node == error_mark_node)
9428 return error_mark_node;
9429 if (TREE_CODE (node) == STRING_CST)
9430 return patch_string_cst (node);
9431 else if (IS_CRAFTED_STRING_BUFFER_P (node))
9433 int saved = ctxp->explicit_constructor_p;
9434 tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
9436 /* Temporary disable forbid the use of `this'. */
9437 ctxp->explicit_constructor_p = 0;
9438 ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
9439 /* Restore it at its previous value */
9440 ctxp->explicit_constructor_p = saved;
9446 /* Build the internal representation of a string constant. */
9449 patch_string_cst (node)
9453 if (! flag_emit_class_files)
9455 push_obstacks (&permanent_obstack, &permanent_obstack);
9456 node = get_identifier (TREE_STRING_POINTER (node));
9457 location = alloc_name_constant (CONSTANT_String, node);
9458 node = build_ref_from_constant_pool (location);
9460 TREE_TYPE (node) = promote_type (string_type_node);
9461 TREE_CONSTANT (node) = 1;
9465 /* Build an incomplete unary operator expression. */
9468 build_unaryop (op_token, op_location, op1)
9469 int op_token, op_location;
9476 case PLUS_TK: op = UNARY_PLUS_EXPR; break;
9477 case MINUS_TK: op = NEGATE_EXPR; break;
9478 case NEG_TK: op = TRUTH_NOT_EXPR; break;
9479 case NOT_TK: op = BIT_NOT_EXPR; break;
9480 default: fatal ("Unknown token `%d' for unary operator - build_unaryop",
9484 unaryop = build1 (op, NULL_TREE, op1);
9485 TREE_SIDE_EFFECTS (unaryop) = 1;
9486 /* Store the location of the operator, for better error report. The
9487 string of the operator will be rebuild based on the OP value. */
9488 EXPR_WFL_LINECOL (unaryop) = op_location;
9492 /* Special case for the ++/-- operators, since they require an extra
9493 argument to build, which is set to NULL and patched
9494 later. IS_POST_P is 1 if the operator, 0 otherwise. */
9497 build_incdec (op_token, op_location, op1, is_post_p)
9498 int op_token, op_location;
9502 static enum tree_code lookup [2][2] =
9504 { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
9505 { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
9507 tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
9508 NULL_TREE, op1, NULL_TREE);
9509 TREE_SIDE_EFFECTS (node) = 1;
9510 /* Store the location of the operator, for better error report. The
9511 string of the operator will be rebuild based on the OP value. */
9512 EXPR_WFL_LINECOL (node) = op_location;
9516 /* Build an incomplete cast operator, based on the use of the
9517 CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
9518 set. java_complete_tree is trained to walk a CONVERT_EXPR even
9519 though its type is already set. */
9522 build_cast (location, type, exp)
9526 tree node = build1 (CONVERT_EXPR, type, exp);
9527 EXPR_WFL_LINECOL (node) = location;
9531 /* 15.14 Unary operators. We return error_mark_node in case of error,
9532 but preserve the type of NODE if the type is fixed. */
9535 patch_unaryop (node, wfl_op)
9539 tree op = TREE_OPERAND (node, 0);
9540 tree op_type = TREE_TYPE (op);
9541 tree prom_type, value, decl;
9542 int code = TREE_CODE (node);
9543 int error_found = 0;
9545 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
9549 /* 15.13.2 Postfix Increment Operator ++ */
9550 case POSTINCREMENT_EXPR:
9551 /* 15.13.3 Postfix Increment Operator -- */
9552 case POSTDECREMENT_EXPR:
9553 /* 15.14.1 Prefix Increment Operator ++ */
9554 case PREINCREMENT_EXPR:
9555 /* 15.14.2 Prefix Decrement Operator -- */
9556 case PREDECREMENT_EXPR:
9557 decl = strip_out_static_field_access_decl (op);
9559 && !((TREE_CODE (decl) == INDIRECT_REF
9560 || TREE_CODE (decl) == COMPONENT_REF)
9561 && JPRIMITIVE_TYPE_P (TREE_TYPE (decl))))
9564 /* Before screaming, check that we're not in fact trying to
9565 increment a optimized static final access, in which case
9566 we issue an different error message. */
9567 if (!(TREE_CODE (wfl_op) == EXPR_WITH_FILE_LOCATION
9568 && resolve_expression_name (wfl_op, &lvalue)
9569 && check_final_assignment (lvalue, wfl_op)))
9570 parse_error_context (wfl_operator, "Invalid argument to `%s'",
9571 operator_string (node));
9572 TREE_TYPE (node) = error_mark_node;
9575 else if (check_final_assignment (op, wfl_op))
9578 /* From now on, we know that op if a variable and that it has a
9579 valid wfl. We use wfl_op to locate errors related to the
9581 else if (!JNUMERIC_TYPE_P (op_type))
9584 (wfl_op, "Invalid argument type `%s' to `%s'",
9585 lang_printable_name (op_type, 0), operator_string (node));
9586 TREE_TYPE (node) = error_mark_node;
9591 /* Before the addition, binary numeric promotion is performed on
9593 value = build_int_2 (1, 0);
9595 binary_numeric_promotion (op_type, TREE_TYPE (value), &op, &value);
9596 /* And write the promoted incremented and increment */
9597 TREE_OPERAND (node, 0) = op;
9598 TREE_OPERAND (node, 1) = value;
9599 /* Convert the overall back into its original type. */
9600 return fold (convert (op_type, node));
9604 /* 15.14.3 Unary Plus Operator + */
9605 case UNARY_PLUS_EXPR:
9606 /* 15.14.4 Unary Minus Operator - */
9608 if (!JNUMERIC_TYPE_P (op_type))
9610 ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
9611 TREE_TYPE (node) = error_mark_node;
9614 /* Unary numeric promotion is performed on operand */
9617 op = do_unary_numeric_promotion (op);
9618 prom_type = TREE_TYPE (op);
9619 if (code == UNARY_PLUS_EXPR)
9624 /* 15.14.5 Bitwise Complement Operator ~ */
9626 if (!JINTEGRAL_TYPE_P (op_type))
9628 ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
9629 TREE_TYPE (node) = error_mark_node;
9634 op = do_unary_numeric_promotion (op);
9635 prom_type = TREE_TYPE (op);
9639 /* 15.14.6 Logical Complement Operator ! */
9640 case TRUTH_NOT_EXPR:
9641 if (TREE_CODE (op_type) != BOOLEAN_TYPE)
9643 ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
9644 /* But the type is known. We will report an error if further
9645 attempt of a assignment is made with this rhs */
9646 TREE_TYPE (node) = boolean_type_node;
9650 prom_type = boolean_type_node;
9653 /* 15.15 Cast Expression */
9655 value = patch_cast (node, wfl_operator);
9656 if (value == error_mark_node)
9658 /* If this cast is part of an assignment, we tell the code
9659 that deals with it not to complain about a mismatch,
9660 because things have been cast, anyways */
9661 TREE_TYPE (node) = error_mark_node;
9666 value = fold (value);
9667 TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
9674 return error_mark_node;
9676 /* There are cases where node has been replaced by something else
9677 and we don't end up returning here: UNARY_PLUS_EXPR,
9678 CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
9679 TREE_OPERAND (node, 0) = fold (op);
9680 TREE_TYPE (node) = prom_type;
9681 TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
9685 /* Generic type resolution that sometimes takes place during node
9686 patching. Returned the resolved type or generate an error
9687 message. Return the resolved type or NULL_TREE. */
9690 resolve_type_during_patch (type)
9693 if (unresolved_type_p (type, NULL))
9695 tree type_decl = resolve_no_layout (EXPR_WFL_NODE (type), NULL_TREE);
9698 parse_error_context (type,
9699 "Class `%s' not found in type declaration",
9700 IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
9705 CLASS_LOADED_P (TREE_TYPE (type_decl)) = 1;
9706 return TREE_TYPE (type_decl);
9711 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
9712 found. Otherwise NODE or something meant to replace it is returned. */
9715 patch_cast (node, wfl_operator)
9719 tree op = TREE_OPERAND (node, 0);
9720 tree op_type = TREE_TYPE (op);
9721 tree cast_type = TREE_TYPE (node);
9724 /* First resolve OP_TYPE if unresolved */
9725 if (!(cast_type = resolve_type_during_patch (cast_type)))
9726 return error_mark_node;
9728 /* Check on cast that are proven correct at compile time */
9729 if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
9731 static tree convert_narrow ();
9733 if (cast_type == op_type)
9736 /* float and double type are converted to the original type main
9737 variant and then to the target type. */
9738 if (JFLOAT_TYPE_P (op_type) && TREE_CODE (cast_type) == CHAR_TYPE)
9739 op = convert (integer_type_node, op);
9741 /* Try widening/narowwing convertion. Potentially, things need
9742 to be worked out in gcc so we implement the extreme cases
9743 correctly. fold_convert() needs to be fixed. */
9744 return convert (cast_type, op);
9747 /* It's also valid to cast a boolean into a boolean */
9748 if (op_type == boolean_type_node && cast_type == boolean_type_node)
9751 /* null can be casted to references */
9752 if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
9753 return build_null_of_type (cast_type);
9755 /* The remaining legal casts involve conversion between reference
9756 types. Check for their compile time correctness. */
9757 if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
9758 && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
9760 TREE_TYPE (node) = promote_type (cast_type);
9761 /* Now, the case can be determined correct at compile time if
9762 OP_TYPE can be converted into CAST_TYPE by assignment
9765 if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
9767 TREE_SET_CODE (node, NOP_EXPR);
9771 if (flag_emit_class_files)
9773 TREE_SET_CODE (node, CONVERT_EXPR);
9777 /* The cast requires a run-time check */
9778 return build (CALL_EXPR, promote_type (cast_type),
9779 build_address_of (soft_checkcast_node),
9780 tree_cons (NULL_TREE, build_class_ref (cast_type),
9781 build_tree_list (NULL_TREE, op)),
9785 /* Any other casts are proven incorrect at compile time */
9786 t1 = strdup (lang_printable_name (op_type, 0));
9787 parse_error_context (wfl_operator, "Invalid cast from `%s' to `%s'",
9788 t1, lang_printable_name (cast_type, 0));
9790 return error_mark_node;
9793 /* Build a null constant and give it the type TYPE. */
9796 build_null_of_type (type)
9799 tree node = build_int_2 (0, 0);
9800 TREE_TYPE (node) = promote_type (type);
9804 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
9805 a list of indices. */
9807 build_array_ref (location, array, index)
9811 tree node = build (ARRAY_REF, NULL_TREE, array, index);
9812 EXPR_WFL_LINECOL (node) = location;
9816 /* 15.12 Array Access Expression */
9819 patch_array_ref (node)
9822 tree array = TREE_OPERAND (node, 0);
9823 tree array_type = TREE_TYPE (array);
9824 tree index = TREE_OPERAND (node, 1);
9825 tree index_type = TREE_TYPE (index);
9826 int error_found = 0;
9828 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
9830 if (TREE_CODE (array_type) == POINTER_TYPE)
9831 array_type = TREE_TYPE (array_type);
9833 /* The array reference must be an array */
9834 if (!TYPE_ARRAY_P (array_type))
9837 (wfl_operator, "`[]' can only be applied to arrays. It can't be "
9838 "applied to `%s'", lang_printable_name (array_type, 0));
9839 TREE_TYPE (node) = error_mark_node;
9843 /* The array index underdoes unary numeric promotion. The promoted
9845 index = do_unary_numeric_promotion (index);
9846 if (TREE_TYPE (index) != int_type_node)
9848 int could_cast = valid_cast_to_p (index_type, int_type_node);
9851 (could_cast ? "Incompatible type for `[]'. Explicit cast needed to "
9852 "convert `%s' to `int'" : "Incompatible type for `[]'. "
9853 "Can't convert `%s' to `int'"),
9854 lang_printable_name (index_type, 0));
9855 TREE_TYPE (node) = error_mark_node;
9860 return error_mark_node;
9862 array_type = TYPE_ARRAY_ELEMENT (array_type);
9864 if (flag_emit_class_files)
9866 TREE_OPERAND (node, 0) = array;
9867 TREE_OPERAND (node, 1) = index;
9871 /* The save_expr is for correct evaluation order. It would be cleaner
9872 to use force_evaluation_order (see comment there), but that is
9873 difficult when we also have to deal with bounds checking. */
9874 if (TREE_SIDE_EFFECTS (index))
9875 array = save_expr (array);
9876 node = build_java_arrayaccess (array, array_type, index);
9877 if (TREE_SIDE_EFFECTS (index))
9878 node = build (COMPOUND_EXPR, array_type, array, node);
9880 TREE_TYPE (node) = array_type;
9884 /* 15.9 Array Creation Expressions */
9887 build_newarray_node (type, dims, extra_dims)
9893 build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
9894 build_int_2 (extra_dims, 0));
9899 patch_newarray (node)
9902 tree type = TREE_OPERAND (node, 0);
9903 tree dims = TREE_OPERAND (node, 1);
9904 tree cdim, array_type;
9905 int error_found = 0;
9907 int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
9909 /* Dimension types are verified. It's better for the types to be
9910 verified in order. */
9911 for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
9914 tree dim = TREE_VALUE (cdim);
9916 /* Dim might have been saved during its evaluation */
9917 dim = (TREE_CODE (dim) == SAVE_EXPR ? dim = TREE_OPERAND (dim, 0) : dim);
9919 /* The type of each specified dimension must be an integral type. */
9920 if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
9923 /* Each expression undergoes an unary numeric promotion (5.6.1) and the
9924 promoted type must be int. */
9927 dim = do_unary_numeric_promotion (dim);
9928 if (TREE_TYPE (dim) != int_type_node)
9932 /* Report errors on types here */
9936 (TREE_PURPOSE (cdim),
9937 "Incompatible type for dimension in array creation expression. "
9938 "%s convert `%s' to `int'",
9939 (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
9940 "Explicit cast needed to" : "Can't"),
9941 lang_printable_name (TREE_TYPE (dim), 0));
9945 TREE_PURPOSE (cdim) = NULL_TREE;
9948 /* Resolve array base type if unresolved */
9949 if (!(type = resolve_type_during_patch (type)))
9954 /* We don't want further evaluation of this bogus array creation
9956 TREE_TYPE (node) = error_mark_node;
9957 return error_mark_node;
9960 /* Set array_type to the actual (promoted) array type of the result. */
9961 if (TREE_CODE (type) == RECORD_TYPE)
9962 type = build_pointer_type (type);
9963 while (--xdims >= 0)
9965 type = promote_type (build_java_array_type (type, -1));
9967 dims = nreverse (dims);
9969 for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
9972 array_type = build_java_array_type (type,
9973 TREE_CODE (cdim) == INTEGER_CST ?
9974 TREE_INT_CST_LOW (cdim) : -1);
9975 array_type = promote_type (array_type);
9977 dims = nreverse (dims);
9979 /* The node is transformed into a function call. Things are done
9980 differently according to the number of dimensions. If the number
9981 of dimension is equal to 1, then the nature of the base type
9982 (primitive or not) matters. */
9984 return build_new_array (type, TREE_VALUE (dims));
9986 /* Can't reuse what's already written in expr.c because it uses the
9987 JVM stack representation. Provide a build_multianewarray. FIXME */
9988 return build (CALL_EXPR, array_type,
9989 build_address_of (soft_multianewarray_node),
9990 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
9991 tree_cons (NULL_TREE,
9992 build_int_2 (ndims, 0), dims )),
9996 /* 10.6 Array initializer. */
9998 /* Build a wfl for array element that don't have one, so we can
9999 pin-point errors. */
10002 maybe_build_array_element_wfl (node)
10005 if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
10006 return build_expr_wfl (NULL_TREE, ctxp->filename,
10007 ctxp->elc.line, ctxp->elc.prev_col);
10012 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
10013 identification of initialized arrays easier to detect during walk
10017 build_new_array_init (location, values)
10021 tree constructor = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, values);
10022 tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
10023 EXPR_WFL_LINECOL (to_return) = location;
10027 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
10028 occurred. Otherwise return NODE after having set its type
10032 patch_new_array_init (type, node)
10035 int error_seen = 0;
10036 tree current, element_type;
10037 HOST_WIDE_INT length;
10038 int all_constant = 1;
10039 tree init = TREE_OPERAND (node, 0);
10041 if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
10043 parse_error_context (node,
10044 "Invalid array initializer for non-array type `%s'",
10045 lang_printable_name (type, 1));
10046 return error_mark_node;
10048 type = TREE_TYPE (type);
10049 element_type = TYPE_ARRAY_ELEMENT (type);
10051 CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
10053 for (length = 0, current = CONSTRUCTOR_ELTS (init);
10054 current; length++, current = TREE_CHAIN (current))
10056 tree elt = TREE_VALUE (current);
10057 if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
10059 error_seen |= array_constructor_check_entry (element_type, current);
10060 elt = TREE_VALUE (current);
10061 /* When compiling to native code, STRING_CST is converted to
10062 INDIRECT_REF, but still with a TREE_CONSTANT flag. */
10063 if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
10068 TREE_VALUE (current) = patch_new_array_init (element_type, elt);
10069 TREE_PURPOSE (current) = NULL_TREE;
10072 if (elt && TREE_VALUE (elt) == error_mark_node)
10077 return error_mark_node;
10079 /* Create a new type. We can't reuse the one we have here by
10080 patching its dimension because it originally is of dimension -1
10081 hence reused by gcc. This would prevent triangular arrays. */
10082 type = build_java_array_type (element_type, length);
10083 TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
10084 TREE_TYPE (node) = promote_type (type);
10085 TREE_CONSTANT (init) = all_constant;
10086 TREE_CONSTANT (node) = all_constant;
10090 /* Verify that one entry of the initializer element list can be
10091 assigned to the array base type. Report 1 if an error occurred, 0
10095 array_constructor_check_entry (type, entry)
10098 char *array_type_string = NULL; /* For error reports */
10099 tree value, type_value, new_value, wfl_value, patched;
10100 int error_seen = 0;
10102 new_value = NULL_TREE;
10103 wfl_value = TREE_VALUE (entry);
10105 value = java_complete_tree (TREE_VALUE (entry));
10106 /* patch_string return error_mark_node if arg is error_mark_node */
10107 if ((patched = patch_string (value)))
10109 if (value == error_mark_node)
10112 type_value = TREE_TYPE (value);
10114 /* At anytime, try_builtin_assignconv can report a warning on
10115 constant overflow during narrowing. */
10116 SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
10117 new_value = try_builtin_assignconv (wfl_operator, type, value);
10118 if (!new_value && (new_value = try_reference_assignconv (type, value)))
10119 type_value = promote_type (type);
10121 /* Check and report errors */
10124 char *msg = (!valid_cast_to_p (type_value, type) ?
10125 "Can't" : "Explicit cast needed to");
10126 if (!array_type_string)
10127 array_type_string = strdup (lang_printable_name (type, 1));
10128 parse_error_context
10129 (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
10130 msg, lang_printable_name (type_value, 1), array_type_string);
10136 new_value = maybe_build_primttype_type_ref (new_value, wfl_operator);
10137 TREE_VALUE (entry) = new_value;
10140 if (array_type_string)
10141 free (array_type_string);
10143 TREE_PURPOSE (entry) = NULL_TREE;
10148 build_this (location)
10151 tree node = build_wfl_node (this_identifier_node, input_filename, 0, 0);
10152 TREE_SET_CODE (node, THIS_EXPR);
10153 EXPR_WFL_LINECOL (node) = location;
10157 /* 14.15 The return statement. It builds a modify expression that
10158 assigns the returned value to the RESULT_DECL that hold the value
10162 build_return (location, op)
10166 tree node = build1 (RETURN_EXPR, NULL_TREE, op);
10167 EXPR_WFL_LINECOL (node) = location;
10168 node = build_debugable_stmt (location, node);
10173 patch_return (node)
10176 tree return_exp = TREE_OPERAND (node, 0);
10177 tree meth = current_function_decl;
10178 tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
10179 int error_found = 0;
10181 TREE_TYPE (node) = error_mark_node;
10182 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
10184 /* It's invalid to have a return value within a function that is
10185 declared with the keyword void or that is a constructor */
10186 if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
10189 /* It's invalid to have a no return value within a function that
10190 isn't declared with the keyword `void' */
10191 if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
10196 if (!DECL_CONSTRUCTOR_P (meth))
10198 char *t = strdup (lang_printable_name (mtype, 0));
10199 parse_error_context (wfl_operator,
10200 "`return' with%s value from `%s %s'",
10201 (error_found == 1 ? "" : "out"),
10202 t, lang_printable_name (meth, 0));
10206 parse_error_context (wfl_operator,
10207 "`return' with value from constructor `%s'",
10208 lang_printable_name (meth, 0));
10209 return error_mark_node;
10212 /* If we have a return_exp, build a modify expression and expand
10213 it. Note: at that point, the assignment is declared valid, but we
10214 may want to carry some more hacks */
10217 tree exp = java_complete_tree (return_exp);
10218 tree modify, patched;
10220 /* If the function returned value and EXP are booleans, EXP has
10221 to be converted into the type of DECL_RESULT, which is integer
10222 (see complete_start_java_method) */
10223 if (TREE_TYPE (exp) == boolean_type_node &&
10224 TREE_TYPE (TREE_TYPE (meth)) == boolean_type_node)
10225 exp = convert_to_integer (TREE_TYPE (DECL_RESULT (meth)), exp);
10227 /* `null' can be assigned to a function returning a reference */
10228 if (JREFERENCE_TYPE_P (TREE_TYPE (TREE_TYPE (meth))) &&
10229 exp == null_pointer_node)
10230 exp = build_null_of_type (TREE_TYPE (TREE_TYPE (meth)));
10232 if ((patched = patch_string (exp)))
10235 modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
10236 EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
10237 modify = java_complete_tree (modify);
10239 if (modify != error_mark_node)
10241 TREE_SIDE_EFFECTS (modify) = 1;
10242 TREE_OPERAND (node, 0) = modify;
10245 return error_mark_node;
10247 TREE_TYPE (node) = void_type_node;
10248 TREE_SIDE_EFFECTS (node) = 1;
10252 /* 14.8 The if Statement */
10255 build_if_else_statement (location, expression, if_body, else_body)
10257 tree expression, if_body, else_body;
10261 else_body = empty_stmt_node;
10262 node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
10263 EXPR_WFL_LINECOL (node) = location;
10264 node = build_debugable_stmt (location, node);
10269 patch_if_else_statement (node)
10272 tree expression = TREE_OPERAND (node, 0);
10274 TREE_TYPE (node) = error_mark_node;
10275 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
10277 /* The type of expression must be boolean */
10278 if (TREE_TYPE (expression) != boolean_type_node
10279 && TREE_TYPE (expression) != promoted_boolean_type_node)
10281 parse_error_context
10283 "Incompatible type for `if'. Can't convert `%s' to `boolean'",
10284 lang_printable_name (TREE_TYPE (expression), 0));
10285 return error_mark_node;
10288 TREE_TYPE (node) = void_type_node;
10289 TREE_SIDE_EFFECTS (node) = 1;
10290 CAN_COMPLETE_NORMALLY (node)
10291 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
10292 | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2));
10296 /* 14.6 Labeled Statements */
10298 /* Action taken when a lableled statement is parsed. a new
10299 LABELED_BLOCK_EXPR is created. No statement is attached to the
10303 build_labeled_block (location, label)
10307 tree label_name = merge_qualified_name (label_id, label);
10308 tree label_decl, node;
10310 /* Issue an error if we try to reuse a label that was previously
10312 if (IDENTIFIER_LOCAL_VALUE (label_name))
10314 EXPR_WFL_LINECOL (wfl_operator) = location;
10315 parse_error_context (wfl_operator, "Declaration of `%s' shadows "
10316 "a previous label declaration",
10317 IDENTIFIER_POINTER (label));
10318 EXPR_WFL_LINECOL (wfl_operator) =
10319 EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
10320 parse_error_context (wfl_operator, "This is the location of the "
10321 "previous declaration of label `%s'",
10322 IDENTIFIER_POINTER (label));
10323 java_error_count--;
10326 label_decl = create_label_decl (label_name);
10327 node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
10328 EXPR_WFL_LINECOL (node) = location;
10329 TREE_SIDE_EFFECTS (node) = 1;
10333 /* Generate a label crafting a unique name for it. This is used to
10334 implicitely label loops that aren't the body part of labeled
10338 generate_labeled_block ()
10340 return build_labeled_block (0, generate_name ());
10343 /* A labeled statement LBE is attached a statement. */
10346 complete_labeled_statement (lbe, statement)
10347 tree lbe; /* Labeled block expr */
10350 /* In anyways, tie the loop to its statement */
10351 LABELED_BLOCK_BODY (lbe) = statement;
10353 /* Ok, if statement is a for loop, we have to attach the labeled
10354 statement to the block the for loop belongs to and return the
10356 if (TREE_CODE (statement) == LOOP_EXPR && IS_FOR_LOOP_P (statement))
10358 java_method_add_stmt (current_function_decl, lbe);
10359 return exit_block ();
10365 /* 14.10, 14.11, 14.12 Loop Statements */
10367 /* Create an empty LOOP_EXPR and make it the last in the nested loop
10371 build_new_loop (loop_body)
10374 tree loop = build (LOOP_EXPR, NULL_TREE, loop_body);
10375 TREE_SIDE_EFFECTS (loop) = 1;
10380 /* Create a loop body according to the following structure:
10382 COMPOUND_EXPR (loop main body)
10383 EXIT_EXPR (this order is for while/for loops.
10384 LABELED_BLOCK_EXPR the order is reversed for do loops)
10385 LABEL_DECL (a continue occuring here branches at the
10386 BODY end of this labeled block)
10389 REVERSED, if non zero, tells that the loop condition expr comes
10390 after the body, like in the do-while loop.
10392 To obtain a loop, the loop body structure described above is
10393 encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
10396 LABEL_DECL (use this label to exit the loop)
10398 <structure described above> */
10401 build_loop_body (location, condition, reversed)
10406 tree first, second, body;
10408 condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
10409 EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
10410 condition = build_debugable_stmt (location, condition);
10411 TREE_SIDE_EFFECTS (condition) = 1;
10413 body = generate_labeled_block ();
10414 first = (reversed ? body : condition);
10415 second = (reversed ? condition : body);
10417 build (COMPOUND_EXPR, NULL_TREE,
10418 build (COMPOUND_EXPR, NULL_TREE, first, second), empty_stmt_node);
10421 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
10422 their order) on the current loop. Unlink the current loop from the
10426 complete_loop_body (location, condition, body, reversed)
10428 tree condition, body;
10431 tree to_return = ctxp->current_loop;
10432 tree loop_body = LOOP_EXPR_BODY (to_return);
10435 tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
10436 /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
10437 The real EXIT_EXPR is one operand further. */
10438 EXPR_WFL_LINECOL (cnode) = location;
10439 /* This one is for accurate error reports */
10440 EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
10441 TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
10443 LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
10448 /* Tailored version of complete_loop_body for FOR loops, when FOR
10449 loops feature the condition part */
10452 complete_for_loop (location, condition, update, body)
10454 tree condition, update, body;
10456 /* Put the condition and the loop body in place */
10457 tree loop = complete_loop_body (location, condition, body, 0);
10458 /* LOOP is the current loop which has been now popped of the loop
10459 stack. Install the update block */
10460 LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
10464 /* If the loop isn't surrounded by a labeled statement, create one and
10465 insert LOOP as it's body. */
10468 patch_loop_statement (loop)
10471 tree loop_label, to_return_as_loop;
10473 if (LOOP_HAS_LABEL_P (loop))
10475 loop_label = ctxp->current_labeled_block;
10476 to_return_as_loop = loop;
10480 loop_label = generate_labeled_block ();
10481 LABELED_BLOCK_BODY (loop_label) = loop;
10482 PUSH_LABELED_BLOCK (loop_label);
10483 to_return_as_loop = loop_label;
10485 TREE_TYPE (to_return_as_loop) = void_type_node;
10486 return to_return_as_loop;
10489 /* 14.13, 14.14: break and continue Statements */
10491 /* Build a break or a continue statement. a null NAME indicates an
10492 unlabeled break/continue statement. */
10495 build_bc_statement (location, is_break, name)
10496 int location, is_break;
10499 tree break_continue, label_block_expr = NULL_TREE;
10503 if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
10504 (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
10505 /* Null means that we don't have a target for this named
10506 break/continue. In this case, we make the target to be the
10507 label name, so that the error can be reported accuratly in
10508 patch_bc_statement. */
10509 label_block_expr = EXPR_WFL_NODE (name);
10511 /* Unlabeled break/continue will be handled during the
10512 break/continue patch operation */
10514 = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
10516 IS_BREAK_STMT_P (break_continue) = is_break;
10517 TREE_SIDE_EFFECTS (break_continue) = 1;
10518 EXPR_WFL_LINECOL (break_continue) = location;
10519 break_continue = build_debugable_stmt (location, break_continue);
10520 return break_continue;
10523 /* Verification of a break/continue statement. */
10526 patch_bc_statement (node)
10529 tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
10530 int is_unlabeled = 0;
10531 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
10533 /* Not having a target means that the break/continue statement is
10534 unlabeled. We try to find a decent label for it */
10538 /* There should be a loop/switch to branch to */
10539 if (ctxp->current_loop)
10541 if (TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
10543 /* At that stage, we're in the loop body, which is
10544 encapsulated around a LABELED_BLOCK_EXPR. So searching
10545 the current loop label requires us to consider the
10546 labeled block before the current one. */
10547 if (!LOOP_HAS_LABEL_SKIP_P (ctxp->current_loop))
10548 fatal ("unlabeled loop has no installed label -- "
10549 "patch_bc_statement");
10550 bc_label = TREE_CHAIN (ctxp->current_labeled_block);
10552 /* For a SWITCH statement, this is the current one */
10554 bc_label = ctxp->current_labeled_block;
10556 /* Not having a loop to break/continue to is an error */
10559 parse_error_context (wfl_operator, "`%s' must be in loop%s",
10560 (IS_BREAK_STMT_P (node) ? "break" : "continue"),
10561 (IS_BREAK_STMT_P (node) ? " or switch" : ""));
10562 return error_mark_node;
10565 /* Having an identifier here means that the target is unknown. */
10566 else if (TREE_CODE (bc_label) == IDENTIFIER_NODE)
10568 parse_error_context (wfl_operator, "No label definition found for `%s'",
10569 IDENTIFIER_POINTER (bc_label));
10570 return error_mark_node;
10573 /* Find the statement we're targeting. */
10574 target_stmt = LABELED_BLOCK_BODY (bc_label);
10576 /* Target loop is slightly burrowed in the case of a for loop, it
10577 appears at the first sight to be a block. */
10578 if (TREE_CODE (target_stmt) == BLOCK)
10580 tree sub = BLOCK_SUBBLOCKS (target_stmt);
10581 if (sub && TREE_CODE (sub) == COMPOUND_EXPR && TREE_OPERAND (sub, 1)
10582 && TREE_CODE (TREE_OPERAND (sub, 1)) == LOOP_EXPR)
10583 target_stmt = TREE_OPERAND (sub, 1);
10586 /* 14.13 The break Statement */
10587 if (IS_BREAK_STMT_P (node))
10589 /* Named break are always fine, as far as they have a target
10590 (already verified). Anonymous break need to target
10591 while/do/for/switch */
10592 if (is_unlabeled &&
10593 !(TREE_CODE (target_stmt) == LOOP_EXPR /* do/while/for */
10594 || TREE_CODE (target_stmt) == SWITCH_EXPR)) /* switch */
10596 parse_error_context (wfl_operator,
10597 "`break' must be in loop or switch");
10598 return error_mark_node;
10600 /* If previously unlabeled, install the new found label */
10602 EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
10604 /* 14.14 The continue Statement */
10605 /* The continue statement must always target a loop, unnamed or not. */
10608 if (TREE_CODE (target_stmt) != LOOP_EXPR) /* do/while/for */
10610 parse_error_context (wfl_operator, "`continue' must be in loop");
10611 return error_mark_node;
10613 /* Everything looks good. We can fix the `continue' jump to go
10614 at the place in the loop were the continue is. For unlabeled
10615 continue, the continuation point is the current labeled
10616 block, by construction. */
10618 EXIT_BLOCK_LABELED_BLOCK (node) =
10619 bc_label = ctxp->current_labeled_block;
10622 CAN_COMPLETE_NORMALLY (bc_label) = 1;
10624 /* Our break/continue don't return values. */
10625 TREE_TYPE (node) = void_type_node;
10626 /* Encapsulate the break within a compound statement so that it's
10627 expanded all the times by expand_expr (and not clobered
10628 sometimes, like after a if statement) */
10629 node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
10630 TREE_SIDE_EFFECTS (node) = 1;
10634 /* Process the exit expression belonging to a loop. Its type must be
10638 patch_exit_expr (node)
10641 tree expression = TREE_OPERAND (node, 0);
10642 TREE_TYPE (node) = error_mark_node;
10643 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
10645 /* The type of expression must be boolean */
10646 if (TREE_TYPE (expression) != boolean_type_node)
10648 parse_error_context
10650 "Incompatible type for loop conditional. Can't convert `%s' to "
10652 lang_printable_name (TREE_TYPE (expression), 0));
10653 return error_mark_node;
10655 /* Now we know things are allright, invert the condition, fold and
10657 TREE_OPERAND (node, 0) =
10658 fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
10660 if (! integer_zerop (TREE_OPERAND (node, 0))
10661 && ctxp->current_loop != NULL_TREE
10662 && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
10663 CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
10664 if (! integer_onep (TREE_OPERAND (node, 0)))
10665 CAN_COMPLETE_NORMALLY (node) = 1;
10668 TREE_TYPE (node) = void_type_node;
10672 /* 14.9 Switch statement */
10675 patch_switch_statement (node)
10678 tree se = TREE_OPERAND (node, 0), se_type;
10680 /* Complete the switch expression */
10681 se = TREE_OPERAND (node, 0) = java_complete_tree (se);
10682 se_type = TREE_TYPE (se);
10683 /* The type of the switch expression must be char, byte, short or
10685 if (!JINTEGRAL_TYPE_P (se_type))
10687 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
10688 parse_error_context (wfl_operator, "Incompatible type for `switch'. "
10689 "Can't convert `%s' to `int'",
10690 lang_printable_name (se_type, 0));
10691 /* This is what java_complete_tree will check */
10692 TREE_OPERAND (node, 0) = error_mark_node;
10693 return error_mark_node;
10696 TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
10698 /* Ready to return */
10699 if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
10701 TREE_TYPE (node) = error_mark_node;
10702 return error_mark_node;
10704 TREE_TYPE (node) = void_type_node;
10705 TREE_SIDE_EFFECTS (node) = 1;
10706 CAN_COMPLETE_NORMALLY (node)
10707 = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
10708 || ! SWITCH_HAS_DEFAULT (node);
10712 /* 14.18 The try statement */
10714 /* Wrap BLOCK around a LABELED_BLOCK, set DECL to the newly generated
10715 exit labeld and issue a jump to FINALLY_LABEL:
10719 <orignal_statments>
10726 build_jump_to_finally (block, decl, finally_label, type)
10727 tree block, decl, finally_label, type;
10730 tree new_block = build (LABELED_BLOCK_EXPR, type,
10731 create_label_decl (generate_name ()), block);
10733 stmt = build (MODIFY_EXPR, void_type_node, decl,
10734 build_address_of (LABELED_BLOCK_LABEL (new_block)));
10735 TREE_SIDE_EFFECTS (stmt) = 1;
10736 CAN_COMPLETE_NORMALLY (stmt) = 1;
10737 add_stmt_to_block (block, type, stmt);
10738 stmt = build (GOTO_EXPR, void_type_node, finally_label);
10739 TREE_SIDE_EFFECTS (stmt) = 1;
10740 add_stmt_to_block (block, type, stmt);
10745 build_try_statement (location, try_block, catches)
10747 tree try_block, catches;
10749 tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
10750 EXPR_WFL_LINECOL (node) = location;
10755 build_try_finally_statement (location, try_block, finally)
10757 tree try_block, finally;
10759 tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
10760 EXPR_WFL_LINECOL (node) = location;
10765 patch_try_statement (node)
10768 int error_found = 0;
10769 tree try = TREE_OPERAND (node, 0);
10770 /* Exception handlers are considered in left to right order */
10771 tree catch = nreverse (TREE_OPERAND (node, 1));
10772 tree current, caught_type_list = NULL_TREE;
10774 /* Check catch clauses, if any. Every time we find an error, we try
10775 to process the next catch clause. We process the catch clause before
10776 the try block so that when processing the try block we can check thrown
10777 exceptions againts the caught type list. */
10778 for (current = catch; current; current = TREE_CHAIN (current))
10780 tree carg_decl, carg_type;
10781 tree sub_current, catch_block, catch_clause;
10784 /* At this point, the structure of the catch clause is
10785 CATCH_EXPR (catch node)
10786 BLOCK (with the decl of the parameter)
10788 MODIFY_EXPR (assignment of the catch parameter)
10789 BLOCK (catch clause block)
10791 catch_clause = TREE_OPERAND (current, 0);
10792 carg_decl = BLOCK_EXPR_DECLS (catch_clause);
10793 carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
10795 /* Catch clauses can't have more than one parameter declared,
10796 but it's already enforced by the grammar. Make sure that the
10797 only parameter of the clause statement in of class Throwable
10798 or a subclass of Throwable, but that was done earlier. The
10799 catch clause parameter type has also been resolved. */
10801 /* Just make sure that the catch clause parameter type inherits
10802 from java.lang.Throwable */
10803 if (!inherits_from_p (carg_type, throwable_type_node))
10805 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
10806 parse_error_context (wfl_operator,
10807 "Can't catch class `%s'. Catch clause "
10808 "parameter type must be a subclass of "
10809 "class `java.lang.Throwable'",
10810 lang_printable_name (carg_type, 0));
10815 /* Partial check for unreachable catch statement: The catch
10816 clause is reachable iff is no earlier catch block A in
10817 the try statement such that the type of the catch
10818 clause's parameter is the same as or a subclass of the
10819 type of A's parameter */
10821 for (sub_current = catch;
10822 sub_current != current; sub_current = TREE_CHAIN (sub_current))
10824 tree sub_catch_clause, decl;
10825 sub_catch_clause = TREE_OPERAND (sub_current, 0);
10826 decl = BLOCK_EXPR_DECLS (sub_catch_clause);
10828 if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
10830 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
10831 parse_error_context
10832 (wfl_operator, "`catch' not reached because of the catch "
10833 "clause at line %d", EXPR_WFL_LINENO (sub_current));
10834 unreachable = error_found = 1;
10838 /* Complete the catch clause block */
10839 catch_block = java_complete_tree (TREE_OPERAND (current, 0));
10840 if (catch_block == error_mark_node)
10845 if (CAN_COMPLETE_NORMALLY (catch_block))
10846 CAN_COMPLETE_NORMALLY (node) = 1;
10847 TREE_OPERAND (current, 0) = catch_block;
10852 /* Things to do here: the exception must be thrown */
10854 /* Link this type to the caught type list */
10855 caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
10858 PUSH_EXCEPTIONS (caught_type_list);
10859 if ((try = java_complete_tree (try)) == error_mark_node)
10861 if (CAN_COMPLETE_NORMALLY (try))
10862 CAN_COMPLETE_NORMALLY (node) = 1;
10865 /* Verification ends here */
10867 return error_mark_node;
10869 TREE_OPERAND (node, 0) = try;
10870 TREE_OPERAND (node, 1) = catch;
10871 TREE_TYPE (node) = void_type_node;
10875 /* 14.17 The synchronized Statement */
10878 patch_synchronized_statement (node, wfl_op1)
10879 tree node, wfl_op1;
10881 tree expr = java_complete_tree (TREE_OPERAND (node, 0));
10882 tree block = TREE_OPERAND (node, 1);
10884 tree enter, exit, expr_decl, assignment;
10886 if (expr == error_mark_node)
10888 block = java_complete_tree (block);
10892 /* The TYPE of expr must be a reference type */
10893 if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
10895 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
10896 parse_error_context (wfl_operator, "Incompatible type for `synchronized'"
10897 ". Can't convert `%s' to `java.lang.Object'",
10898 lang_printable_name (TREE_TYPE (expr), 0));
10899 return error_mark_node;
10902 /* Generate a try-finally for the synchronized statement, except
10903 that the handler that catches all throw exception calls
10904 _Jv_MonitorExit and then rethrow the exception.
10905 The synchronized statement is then implemented as:
10908 _Jv_MonitorEnter (expression)
10910 _Jv_MonitorExit (expression)
10914 e = _Jv_exception_info ();
10915 _Jv_MonitorExit (expression)
10919 expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
10920 BUILD_MONITOR_ENTER (enter, expr_decl);
10921 BUILD_MONITOR_EXIT (exit, expr_decl);
10922 CAN_COMPLETE_NORMALLY (enter) = 1;
10923 CAN_COMPLETE_NORMALLY (exit) = 1;
10924 assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
10925 TREE_SIDE_EFFECTS (assignment) = 1;
10926 node = build1 (CLEANUP_POINT_EXPR, NULL_TREE,
10927 build (COMPOUND_EXPR, NULL_TREE,
10928 build (WITH_CLEANUP_EXPR, NULL_TREE,
10929 build (COMPOUND_EXPR, NULL_TREE,
10930 assignment, enter),
10933 node = build_expr_block (node, expr_decl);
10935 return java_complete_tree (node);
10938 /* 14.16 The throw Statement */
10941 patch_throw_statement (node, wfl_op1)
10942 tree node, wfl_op1;
10944 tree expr = TREE_OPERAND (node, 0);
10945 tree type = TREE_TYPE (expr);
10946 int unchecked_ok = 0, tryblock_throws_ok = 0;
10948 /* Thrown expression must be assignable to java.lang.Throwable */
10949 if (!try_reference_assignconv (throwable_type_node, expr))
10951 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
10952 parse_error_context (wfl_operator, "Can't throw `%s'; it must be a "
10953 "subclass of class `java.lang.Throwable'",
10954 lang_printable_name (type, 0));
10955 /* If the thrown expression was a reference, we further the
10956 compile-time check. */
10957 if (!JREFERENCE_TYPE_P (type))
10958 return error_mark_node;
10961 /* At least one of the following must be true */
10963 /* The type of the throw expression is a not checked exception,
10964 i.e. is a unchecked expression. */
10965 unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
10967 /* Throw is contained in a try statement and at least one catch
10968 clause can receive the thrown expression or the current method is
10969 declared to throw such an exception. Or, the throw statement is
10970 contained in a method or constructor declaration and the type of
10971 the Expression is assignable to at least one type listed in the
10972 throws clause the declaration. */
10973 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
10975 tryblock_throws_ok =
10976 check_thrown_exceptions_do (TREE_TYPE (expr));
10977 if (!(unchecked_ok || tryblock_throws_ok))
10979 /* If there is a surrounding try block that has no matching
10980 clatch clause, report it first. A surrounding try block exits
10981 only if there is something after the list of checked
10982 exception thrown by the current function (if any). */
10983 if (IN_TRY_BLOCK_P ())
10984 parse_error_context (wfl_operator, "Checked exception `%s' can't be "
10985 "caught by any of the catch clause(s) "
10986 "of the surrounding `try' block",
10987 lang_printable_name (type, 0));
10988 /* If we have no surrounding try statement and the method doesn't have
10989 any throws, report it now. FIXME */
10990 else if (!EXCEPTIONS_P (currently_caught_type_list)
10991 && !tryblock_throws_ok)
10992 parse_error_context (wfl_operator, "Checked exception `%s' isn't "
10993 "thrown from a `try' block",
10994 lang_printable_name (type, 0));
10995 /* Otherwise, the current method doesn't have the appropriate
10996 throws declaration */
10998 parse_error_context (wfl_operator, "Checked exception `%s' doesn't "
10999 "match any of current method's `throws' "
11001 lang_printable_name (type, 0));
11002 return error_mark_node;
11005 /* If a throw statement is contained in a static initializer, then a
11006 compile-time check ensures that either its value is always an
11007 unchecked exception or its value is always caught by some try
11008 statement that contains it. FIXME, static initializer. */
11010 if (! flag_emit_class_files)
11011 BUILD_THROW (node, expr);
11015 /* Check that exception said to be thrown by method DECL can be
11016 effectively caught from where DECL is invoked. */
11019 check_thrown_exceptions (location, decl)
11024 /* For all the unchecked exceptions thrown by DECL */
11025 for (throws = DECL_FUNCTION_THROWS (decl); throws;
11026 throws = TREE_CHAIN (throws))
11027 if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
11030 /* Temporary hack to suppresses errors about cloning arrays. FIXME */
11031 if (DECL_NAME (decl) == get_identifier ("clone"))
11034 EXPR_WFL_LINECOL (wfl_operator) = location;
11035 parse_error_context
11036 (wfl_operator, "Exception `%s' must be caught, or it must be "
11037 "declared in the `throws' clause of `%s'",
11038 lang_printable_name (TREE_VALUE (throws), 0),
11039 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
11043 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
11044 try-catch blocks, OR is listed in the `throws' clause of the
11048 check_thrown_exceptions_do (exception)
11051 tree list = currently_caught_type_list;
11052 resolve_and_layout (exception, NULL_TREE);
11053 /* First, all the nested try-catch-finally at that stage. The
11054 last element contains `throws' clause exceptions, if any. */
11055 if (IS_UNCHECKED_EXCEPTION_P (exception))
11060 for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
11061 if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
11063 list = TREE_CHAIN (list);
11069 purge_unchecked_exceptions (mdecl)
11072 tree throws = DECL_FUNCTION_THROWS (mdecl);
11073 tree new = NULL_TREE;
11077 tree next = TREE_CHAIN (throws);
11078 if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
11080 TREE_CHAIN (throws) = new;
11085 /* List is inverted here, but it doesn't matter */
11086 DECL_FUNCTION_THROWS (mdecl) = new;
11089 /* 15.24 Conditional Operator ?: */
11092 patch_conditional_expr (node, wfl_cond, wfl_op1)
11093 tree node, wfl_cond, wfl_op1;
11095 tree cond = TREE_OPERAND (node, 0);
11096 tree op1 = TREE_OPERAND (node, 1);
11097 tree op2 = TREE_OPERAND (node, 2);
11098 tree resulting_type = NULL_TREE;
11099 tree t1, t2, patched;
11100 int error_found = 0;
11102 /* Operands of ?: might be StringBuffers crafted as a result of a
11103 string concatenation. Obtain a descent operand here. */
11104 if ((patched = patch_string (op1)))
11105 TREE_OPERAND (node, 1) = op1 = patched;
11106 if ((patched = patch_string (op2)))
11107 TREE_OPERAND (node, 2) = op2 = patched;
11109 t1 = TREE_TYPE (op1);
11110 t2 = TREE_TYPE (op2);
11112 /* The first expression must be a boolean */
11113 if (TREE_TYPE (cond) != boolean_type_node)
11115 SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
11116 parse_error_context (wfl_operator, "Incompatible type for `?:'. Can't "
11117 "convert `%s' to `boolean'",
11118 lang_printable_name (TREE_TYPE (cond), 0));
11122 /* Second and third can be numeric, boolean (i.e. primitive),
11123 references or null. Anything else results in an error */
11124 if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
11125 || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
11126 && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
11127 || (t1 == boolean_type_node && t2 == boolean_type_node)))
11130 /* Determine the type of the conditional expression. Same types are
11131 easy to deal with */
11133 resulting_type = t1;
11135 /* There are different rules for numeric types */
11136 else if (JNUMERIC_TYPE_P (t1))
11138 /* if byte/short found, the resulting type is short */
11139 if ((t1 == byte_type_node && t2 == short_type_node)
11140 || (t1 == short_type_node && t2 == byte_type_node))
11141 resulting_type = short_type_node;
11143 /* If t1 is a constant int and t2 is of type byte, short or char
11144 and t1's value fits in t2, then the resulting type is t2 */
11145 else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
11146 && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
11147 resulting_type = t2;
11149 /* If t2 is a constant int and t1 is of type byte, short or char
11150 and t2's value fits in t1, then the resulting type is t1 */
11151 else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
11152 && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
11153 resulting_type = t1;
11155 /* Otherwise, binary numeric promotion is applied and the
11156 resulting type is the promoted type of operand 1 and 2 */
11158 resulting_type = binary_numeric_promotion (t2, t2,
11159 &TREE_OPERAND (node, 1),
11160 &TREE_OPERAND (node, 2));
11163 /* Cases of a reference and a null type */
11164 else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
11165 resulting_type = t1;
11167 else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
11168 resulting_type = t2;
11170 /* Last case: different reference types. If a type can be converted
11171 into the other one by assignment conversion, the latter
11172 determines the type of the expression */
11173 else if ((resulting_type = try_reference_assignconv (t1, op2)))
11174 resulting_type = promote_type (t1);
11176 else if ((resulting_type = try_reference_assignconv (t2, op1)))
11177 resulting_type = promote_type (t2);
11179 /* If we don't have any resulting type, we're in trouble */
11180 if (!resulting_type)
11182 char *t = strdup (lang_printable_name (t1, 0));
11183 SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
11184 parse_error_context (wfl_operator, "Incompatible type for `?:'. Can't "
11185 "convert `%s' to `%s'", t,
11186 lang_printable_name (t2, 0));
11193 TREE_TYPE (node) = error_mark_node;
11194 return error_mark_node;
11197 TREE_TYPE (node) = resulting_type;
11198 TREE_SET_CODE (node, COND_EXPR);
11199 CAN_COMPLETE_NORMALLY (node) = 1;
11203 /* Try to constant fold NODE.
11204 If NODE is not a constant expression, return NULL_EXPR.
11205 CONTEXT is a static final VAR_DECL whose initializer we are folding. */
11208 fold_constant_for_init (node, context)
11212 tree op0, op1, val;
11213 enum tree_code code = TREE_CODE (node);
11215 if (code == INTEGER_CST || code == REAL_CST || code == STRING_CST)
11217 if (TREE_TYPE (node) != NULL_TREE)
11225 case TRUNC_MOD_EXPR:
11233 case TRUTH_ANDIF_EXPR:
11234 case TRUTH_ORIF_EXPR:
11241 op0 = TREE_OPERAND (node, 0);
11242 op1 = TREE_OPERAND (node, 1);
11243 val = fold_constant_for_init (op0, context);
11244 if (val == NULL_TREE || ! TREE_CONSTANT (val))
11246 TREE_OPERAND (node, 0) = val;
11247 val = fold_constant_for_init (op1, context);
11248 if (val == NULL_TREE || ! TREE_CONSTANT (val))
11250 TREE_OPERAND (node, 1) = val;
11251 return patch_binop (node, op0, op1);
11253 case UNARY_PLUS_EXPR:
11255 case TRUTH_NOT_EXPR:
11258 op0 = TREE_OPERAND (node, 0);
11259 val = fold_constant_for_init (op0, context);
11260 if (val == NULL_TREE || ! TREE_CONSTANT (val))
11262 TREE_OPERAND (node, 0) = val;
11263 return patch_unaryop (node, op0);
11267 val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
11268 if (val == NULL_TREE || ! TREE_CONSTANT (val))
11270 TREE_OPERAND (node, 0) = val;
11271 val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
11272 if (val == NULL_TREE || ! TREE_CONSTANT (val))
11274 TREE_OPERAND (node, 1) = val;
11275 val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
11276 if (val == NULL_TREE || ! TREE_CONSTANT (val))
11278 TREE_OPERAND (node, 2) = val;
11279 return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
11280 : TREE_OPERAND (node, 2);
11283 if (! FIELD_STATIC (node) || ! FIELD_FINAL (node)
11284 || DECL_INITIAL (node) == NULL_TREE)
11286 val = DECL_INITIAL (node);
11287 /* Guard against infinite recursion. */
11288 DECL_INITIAL (node) = NULL_TREE;
11289 val = fold_constant_for_init (val, DECL_CONTEXT (node));
11290 DECL_INITIAL (node) = val;
11293 case EXPR_WITH_FILE_LOCATION:
11294 /* Compare java_complete_tree and resolve_expression_name. */
11295 if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
11296 || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
11298 tree name = EXPR_WFL_NODE (node);
11300 if (PRIMARY_P (node))
11302 else if (! QUALIFIED_P (name))
11304 decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
11305 if (! FIELD_STATIC (decl))
11307 return fold_constant_for_init (decl, decl);
11312 /* Wait until the USE_COMPONENT_REF re-write. FIXME. */
11313 qualify_ambiguous_name (node);
11314 if (resolve_field_access (node, &decl, NULL)
11315 && decl != NULL_TREE)
11316 return fold_constant_for_init (decl, decl);
11323 op0 = TREE_OPERAND (node, 0);
11324 val = fold_constant_for_init (op0, context);
11325 if (val == NULL_TREE || ! TREE_CONSTANT (val))
11327 TREE_OPERAND (node, 0) = val;
11331 #ifdef USE_COMPONENT_REF
11333 case COMPONENT_REF:
11342 #ifdef USE_COMPONENT_REF
11343 /* Context is 'T' for TypeName, 'P' for PackageName,
11344 'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
11347 resolve_simple_name (name, context)
11354 resolve_qualified_name (name, context)