1 /* Source code parsing and tree node generation for the GNU compiler
2 for the Java(TM) language.
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
4 Free Software Foundation, Inc.
5 Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to
21 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA.
24 Java and all Java-based marks are trademarks or registered trademarks
25 of Sun Microsystems, Inc. in the United States and other countries.
26 The Free Software Foundation is independent of Sun Microsystems, Inc. */
28 /* This file parses java source code and issues a tree node image
29 suitable for code generation (byte code and targeted CPU assembly
32 The grammar conforms to the Java grammar described in "The Java(TM)
33 Language Specification. J. Gosling, B. Joy, G. Steele. Addison Wesley
34 1996, ISBN 0-201-63451-1"
36 The following modifications were brought to the original grammar:
38 method_body: added the rule '| block SC_TK'
39 static_initializer: added the rule 'static block SC_TK'.
41 Note: All the extra rules described above should go away when the
42 empty_statement rule will work.
44 statement_nsi: 'nsi' should be read no_short_if.
46 Some rules have been modified to support JDK1.1 inner classes
47 definitions and other extensions. */
52 #include "coretypes.h"
60 #include "pretty-print.h"
61 #include "diagnostic.h"
63 #include "java-tree.h"
74 #include "tree-inline.h"
75 #include "tree-dump.h"
79 /* Local function prototypes */
80 static char *java_accstring_lookup
(int);
81 static const char *accessibility_string
(int);
82 static void classitf_redefinition_error
(const char *,tree
, tree
, tree
);
83 static void variable_redefinition_error
(tree
, tree
, tree
, int);
84 static tree create_class
(int, tree
, tree
, tree
);
85 static tree create_interface
(int, tree
, tree
);
86 static void end_class_declaration
(int);
87 static tree find_field
(tree
, tree
);
88 static tree lookup_field_wrapper
(tree
, tree
);
89 static int duplicate_declaration_error_p
(tree
, tree
, tree
);
90 static void register_fields
(int, tree
, tree
);
91 static tree parser_qualified_classname
(tree
);
92 static int parser_check_super
(tree
, tree
, tree
);
93 static int parser_check_super_interface
(tree
, tree
, tree
);
94 static void check_modifiers_consistency
(int);
95 static tree lookup_cl
(tree
);
96 static tree lookup_java_method2
(tree
, tree
, int);
97 static tree method_header
(int, tree
, tree
, tree
);
98 static void fix_method_argument_names
(tree
,tree
);
99 static tree method_declarator
(tree
, tree
);
100 static void parse_warning_context
(tree cl
, const char *gmsgid
, ...
) ATTRIBUTE_GCC_DIAG
(2,3);
101 #ifdef USE_MAPPED_LOCATION
102 static void issue_warning_error_from_context
103 (source_location
, const char *gmsgid
, va_list *);
105 static void issue_warning_error_from_context
106 (tree
, const char *gmsgid
, va_list *);
108 static void parse_ctor_invocation_error
(void);
109 static tree parse_jdk1_1_error
(const char *);
110 static void complete_class_report_errors
(jdep
*);
111 static int process_imports
(void);
112 static void read_import_dir
(tree
);
113 static int find_in_imports_on_demand
(tree
, tree
);
114 static void find_in_imports
(tree
, tree
);
115 static bool inner_class_accessible
(tree
, tree
);
116 static void check_inner_class_access
(tree
, tree
, tree
);
117 static int check_pkg_class_access
(tree
, tree
, bool, tree
);
118 static tree resolve_package
(tree
, tree
*, tree
*);
119 static tree resolve_class
(tree
, tree
, tree
, tree
);
120 static void declare_local_variables
(int, tree
, tree
);
121 static void dump_java_tree
(enum tree_dump_index
, tree
);
122 static void source_start_java_method
(tree
);
123 static void source_end_java_method
(void);
124 static tree find_name_in_single_imports
(tree
);
125 static void check_abstract_method_header
(tree
);
126 static tree lookup_java_interface_method2
(tree
, tree
);
127 static tree resolve_expression_name
(tree
, tree
*);
128 static tree maybe_create_class_interface_decl
(tree
, tree
, tree
, tree
);
129 static int check_class_interface_creation
(int, int, tree
, tree
, tree
, tree
);
130 static tree patch_method_invocation
(tree
, tree
, tree
, int, int *, tree
*);
131 static tree resolve_and_layout
(tree
, tree
);
132 static tree qualify_and_find
(tree
, tree
, tree
);
133 static tree resolve_no_layout
(tree
, tree
);
134 static int invocation_mode
(tree
, int);
135 static tree find_applicable_accessible_methods_list
(int, tree
, tree
, tree
);
136 static void search_applicable_methods_list
(int, tree
, tree
, tree
, tree
*, tree
*);
137 static tree find_most_specific_methods_list
(tree
, tree
);
138 static int argument_types_convertible
(tree
, tree
);
139 static tree patch_invoke
(tree
, tree
, tree
);
140 static int maybe_use_access_method
(int, tree
*, tree
*);
141 static tree lookup_method_invoke
(int, tree
, tree
, tree
, tree
);
142 static tree register_incomplete_type
(int, tree
, tree
, tree
);
143 static tree check_inner_circular_reference
(tree
, tree
);
144 static tree check_circular_reference
(tree
);
145 static tree obtain_incomplete_type
(tree
);
146 static tree java_complete_lhs
(tree
);
147 static tree java_complete_tree
(tree
);
148 static tree maybe_generate_pre_expand_clinit
(tree
);
149 static int analyze_clinit_body
(tree
, tree
);
150 static int maybe_yank_clinit
(tree
);
151 static void start_complete_expand_method
(tree
);
152 static void java_complete_expand_method
(tree
);
153 static void java_expand_method_bodies
(tree
);
154 static int unresolved_type_p
(tree
, tree
*);
155 static void create_jdep_list
(struct parser_ctxt
*);
156 static tree build_expr_block
(tree
, tree
);
157 static tree enter_block
(void);
158 static tree exit_block
(void);
159 static tree lookup_name_in_blocks
(tree
);
160 static void maybe_absorb_scoping_blocks
(void);
161 static tree build_method_invocation
(tree
, tree
);
162 static tree build_new_invocation
(tree
, tree
);
163 static tree build_assignment
(int, int, tree
, tree
);
164 static tree build_binop
(enum tree_code
, int, tree
, tree
);
165 static tree patch_assignment
(tree
, tree
);
166 static tree patch_binop
(tree
, tree
, tree
, int);
167 static tree build_unaryop
(int, int, tree
);
168 static tree build_incdec
(int, int, tree
, int);
169 static tree patch_unaryop
(tree
, tree
);
170 static tree build_cast
(int, tree
, tree
);
171 static tree build_null_of_type
(tree
);
172 static tree patch_cast
(tree
, tree
);
173 static int valid_ref_assignconv_cast_p
(tree
, tree
, int);
174 static int valid_builtin_assignconv_identity_widening_p
(tree
, tree
);
175 static int valid_cast_to_p
(tree
, tree
);
176 static int valid_method_invocation_conversion_p
(tree
, tree
);
177 static tree try_builtin_assignconv
(tree
, tree
, tree
);
178 static tree try_reference_assignconv
(tree
, tree
);
179 static tree build_unresolved_array_type
(tree
);
180 static int build_type_name_from_array_name
(tree
, tree
*);
181 static tree build_array_from_name
(tree
, tree
, tree
, tree
*);
182 static tree build_array_ref
(int, tree
, tree
);
183 static tree patch_array_ref
(tree
);
184 #ifdef USE_MAPPED_LOCATION
185 static tree make_qualified_name
(tree
, tree
, source_location
);
187 static tree make_qualified_name
(tree
, tree
, int);
189 static tree merge_qualified_name
(tree
, tree
);
190 static tree make_qualified_primary
(tree
, tree
, int);
191 static int resolve_qualified_expression_name
(tree
, tree
*, tree
*, tree
*);
192 static void qualify_ambiguous_name
(tree
);
193 static tree resolve_field_access
(tree
, tree
*, tree
*);
194 static tree build_newarray_node
(tree
, tree
, int);
195 static tree patch_newarray
(tree
);
196 static tree resolve_type_during_patch
(tree
);
197 static tree build_this
(int);
198 static tree build_wfl_wrap
(tree
, int);
199 static tree build_return
(int, tree
);
200 static tree patch_return
(tree
);
201 static tree maybe_access_field
(tree
, tree
, tree
);
202 static int complete_function_arguments
(tree
);
203 static int check_for_static_method_reference
(tree
, tree
, tree
, tree
, tree
);
204 static int not_accessible_p
(tree
, tree
, tree
, int);
205 static void check_deprecation
(tree
, tree
);
206 static int class_in_current_package
(tree
);
207 static tree build_if_else_statement
(int, tree
, tree
, tree
);
208 static tree patch_if_else_statement
(tree
);
209 static tree add_stmt_to_block
(tree
, tree
, tree
);
210 static tree patch_exit_expr
(tree
);
211 static tree build_labeled_block
(int, tree
);
212 static tree finish_labeled_statement
(tree
, tree
);
213 static tree build_bc_statement
(int, int, tree
);
214 static tree patch_bc_statement
(tree
);
215 static tree patch_loop_statement
(tree
);
216 static tree build_new_loop
(tree
);
217 static tree build_loop_body
(int, tree
, int);
218 static tree finish_loop_body
(int, tree
, tree
, int);
219 static tree build_debugable_stmt
(int, tree
);
220 static tree finish_for_loop
(int, tree
, tree
, tree
);
221 static tree patch_switch_statement
(tree
);
222 static tree string_constant_concatenation
(tree
, tree
);
223 static tree build_string_concatenation
(tree
, tree
);
224 static tree patch_string_cst
(tree
);
225 static tree patch_string
(tree
);
226 static tree encapsulate_with_try_catch
(int, tree
, tree
, tree
);
227 #ifdef USE_MAPPED_LOCATION
228 static tree build_assertion
(source_location
, tree
, tree
);
230 static tree build_assertion
(int, tree
, tree
);
232 static tree build_try_statement
(int, tree
, tree
);
233 static tree build_try_finally_statement
(int, tree
, tree
);
234 static tree patch_try_statement
(tree
);
235 static tree patch_synchronized_statement
(tree
, tree
);
236 static tree patch_throw_statement
(tree
, tree
);
237 static void add_exception_to_throws
(tree
, tree
);
238 #ifdef USE_MAPPED_LOCATION
239 static void check_thrown_exceptions
(source_location
, tree
, tree
);
241 static void check_thrown_exceptions
(int, tree
, tree
);
243 static int check_thrown_exceptions_do
(tree
);
244 static bool ctors_unchecked_throws_clause_p
(tree
);
245 static void check_concrete_throws_clauses
(tree
, tree
, tree
, tree
);
246 static void check_throws_clauses
(tree
, tree
, tree
);
247 static void finish_method_declaration
(tree
);
248 static tree build_super_invocation
(tree
);
249 static int verify_constructor_circularity
(tree
, tree
);
250 static char *constructor_circularity_msg
(tree
, tree
);
251 static tree build_this_super_qualified_invocation
(int, tree
, tree
, int, int);
252 static const char *get_printable_method_name
(tree
);
253 static tree patch_conditional_expr
(tree
, tree
, tree
);
254 static tree generate_finit
(tree
);
255 static tree generate_instinit
(tree
);
256 static tree build_instinit_invocation
(tree
);
257 static void fix_constructors
(tree
);
258 static tree build_alias_initializer_parameter_list
(int, tree
, tree
, int *);
259 static tree craft_constructor
(tree
, tree
);
260 static tree get_constructor_super
(tree
);
261 static tree create_artificial_method
(tree
, int, tree
, tree
, tree
);
262 static void start_artificial_method_body
(tree
);
263 static void end_artificial_method_body
(tree
);
264 static int check_method_redefinition
(tree
, tree
);
265 static int check_method_types_complete
(tree
);
266 static bool hack_is_accessible_p
(tree
, tree
);
267 static void java_check_regular_methods
(tree
);
268 static void check_interface_throws_clauses
(tree
, tree
);
269 static void java_check_abstract_methods
(tree
);
270 static void unreachable_stmt_error
(tree
);
271 static int not_accessible_field_error
(tree
, tree
);
272 static tree find_expr_with_wfl
(tree
);
273 static void missing_return_error
(tree
);
274 static tree build_new_array_init
(int, tree
);
275 static tree patch_new_array_init
(tree
, tree
);
276 static tree maybe_build_array_element_wfl
(tree
);
277 static int array_constructor_check_entry
(tree
, constructor_elt
*);
278 static const char *purify_type_name
(const char *);
279 static tree fold_constant_for_init
(tree
, tree
);
280 static jdeplist
*reverse_jdep_list
(struct parser_ctxt
*);
281 static void static_ref_err
(tree
, tree
, tree
);
282 static void parser_add_interface
(tree
, tree
, tree
);
283 static void add_superinterfaces
(tree
, tree
);
284 static tree jdep_resolve_class
(jdep
*);
285 static int note_possible_classname
(const char *, int);
286 static void java_complete_expand_classes
(void);
287 static void java_complete_expand_class
(tree
);
288 static void java_complete_expand_methods
(tree
);
289 static tree cut_identifier_in_qualified
(tree
);
290 static tree java_stabilize_reference
(tree
);
291 static tree do_unary_numeric_promotion
(tree
);
292 static char * operator_string
(tree
);
293 static tree do_merge_string_cste
(tree
, const char *, int, int);
294 static tree merge_string_cste
(tree
, tree
, int);
295 static tree java_refold
(tree
);
296 static int java_decl_equiv
(tree
, tree
);
297 static int binop_compound_p
(enum tree_code
);
298 static tree search_loop
(tree
);
299 static int labeled_block_contains_loop_p
(tree
, tree
);
300 static int check_abstract_method_definitions
(int, tree
, tree
);
301 static void java_check_abstract_method_definitions
(tree
);
302 static void java_debug_context_do
(int);
303 static void java_parser_context_push_initialized_field
(void);
304 static void java_parser_context_pop_initialized_field
(void);
305 static tree reorder_static_initialized
(tree
);
306 static void java_parser_context_suspend
(void);
307 static void java_parser_context_resume
(void);
308 static int pop_current_osb
(struct parser_ctxt
*);
310 /* JDK 1.1 work. FIXME */
312 static tree maybe_make_nested_class_name
(tree
);
313 static int make_nested_class_name
(tree
);
314 static void link_nested_class_to_enclosing
(void);
315 static tree resolve_inner_class
(tree
, tree
, tree
, tree
);
316 static tree find_as_inner_class
(tree
, tree
, tree
);
317 static tree find_as_inner_class_do
(tree
, tree
);
318 static int check_inner_class_redefinition
(tree
, tree
);
320 static tree build_thisn_assign
(void);
321 static tree build_current_thisn
(tree
);
322 static tree build_access_to_thisn
(tree
, tree
, int);
323 static tree maybe_build_thisn_access_method
(tree
);
325 static tree build_nested_field_access
(tree
, tree
);
326 static tree build_nested_field_access_methods
(tree
);
327 static tree build_nested_field_access_method
(tree
, tree
, tree
, tree
, tree
);
328 static tree build_nested_field_access_expr
(int, tree
, tree
, tree
, tree
);
329 static tree build_nested_method_access_method
(tree
);
330 static tree build_new_access_id
(void);
332 static int nested_member_access_p
(tree
, tree
);
333 static int nested_field_expanded_access_p
(tree
, tree
*, tree
*, tree
*);
334 static tree nested_field_access_fix
(tree
, tree
, tree
);
336 static tree build_incomplete_class_ref
(int, tree
);
337 static tree patch_incomplete_class_ref
(tree
);
338 static tree create_anonymous_class
(tree
);
339 static void patch_anonymous_class
(tree
, tree
, tree
);
340 static void add_inner_class_fields
(tree
, tree
);
342 static tree build_dot_class_method
(tree
);
343 static tree build_dot_class_method_invocation
(tree
, tree
);
344 static void create_new_parser_context
(int);
345 static tree maybe_build_class_init_for_field
(tree
, tree
);
347 static int emit_test_initialization
(void **, void *);
349 static char *string_convert_int_cst
(tree
);
351 /* Number of error found so far. */
352 int java_error_count
;
353 /* Number of warning found so far. */
354 int java_warning_count
;
355 /* Cyclic inheritance report, as it can be set by layout_class */
356 const char *cyclic_inheritance_report
;
358 /* The current parser context */
359 struct parser_ctxt
*ctxp
;
361 /* List of things that were analyzed for which code will be generated */
362 struct parser_ctxt
*ctxp_for_generation
= NULL
;
363 struct parser_ctxt
*ctxp_for_generation_last
= NULL
;
365 /* binop_lookup maps token to tree_code. It is used where binary
366 operations are involved and required by the parser. RDIV_EXPR
367 covers both integral/floating point division. The code is changed
368 once the type of both operator is worked out. */
370 static const enum tree_code binop_lookup
[19] =
372 PLUS_EXPR
, MINUS_EXPR
, MULT_EXPR
, RDIV_EXPR
, TRUNC_MOD_EXPR
,
373 LSHIFT_EXPR
, RSHIFT_EXPR
, URSHIFT_EXPR
,
374 BIT_AND_EXPR
, BIT_XOR_EXPR
, BIT_IOR_EXPR
,
375 TRUTH_ANDIF_EXPR
, TRUTH_ORIF_EXPR
,
376 EQ_EXPR
, NE_EXPR
, GT_EXPR
, GE_EXPR
, LT_EXPR
, LE_EXPR
,
378 #define BINOP_LOOKUP(VALUE) \
379 binop_lookup
[((VALUE
) - PLUS_TK
) % ARRAY_SIZE
(binop_lookup
)]
381 /* This is the end index for binary operators that can also be used
382 in compound assignments. */
383 #define BINOP_COMPOUND_CANDIDATES 11
385 /* The "$L" identifier we use to create labels. */
386 static GTY
(()) tree label_id
;
388 /* The "StringBuffer" identifier used for the String `+' operator. */
389 static GTY
(()) tree wfl_string_buffer
;
391 /* The "append" identifier used for String `+' operator. */
392 static GTY
(()) tree wfl_append
;
394 /* The "toString" identifier used for String `+' operator. */
395 static GTY
(()) tree wfl_to_string
;
397 /* The "java.lang" import qualified name. */
398 static GTY
(()) tree java_lang_id
;
400 /* The generated `inst$' identifier used for generated enclosing
401 instance/field access functions. */
402 static GTY
(()) tree inst_id
;
404 /* Context and flag for static blocks */
405 static GTY
(()) tree current_static_block
;
407 /* The generated `write_parm_value$' identifier. */
408 static GTY
(()) tree wpv_id
;
410 /* Hold THIS for the scope of the current method decl. */
411 static GTY
(()) tree current_this
;
413 /* Hold a list of catch clauses list. The first element of this list is
414 the list of the catch clauses of the currently analyzed try block. */
415 static GTY
(()) tree currently_caught_type_list
;
417 /* This holds a linked list of all the case labels for the current
418 switch statement. It is only used when checking to see if there
419 are duplicate labels. FIXME: probably this should just be attached
420 to the switch itself; then it could be referenced via
421 `ctxp->current_loop'. */
422 static GTY
(()) tree case_label_list
;
424 /* Anonymous class counter. Will be reset to 1 every time a non
425 anonymous class gets created. */
426 static int anonymous_class_counter
= 1;
428 static GTY
(()) tree src_parse_roots
[1];
430 /* All classes seen from source code */
431 #define gclass_list src_parse_roots[0]
433 /* Check modifiers. If one doesn't fit, retrieve it in its declaration
434 line and point it out. */
435 /* Should point out the one that don't fit. ASCII/unicode, going
438 #define check_modifiers(__message, __value, __mask) do { \
439 if
((__value
) & ~
(__mask
)) \
441 size_t i
, remainder
= (__value
) & ~
(__mask
); \
442 for
(i
= 0; i
< ARRAY_SIZE
(ctxp
->modifier_ctx
); i
++) \
443 if
((1 << i
) & remainder
) \
444 parse_error_context
(ctxp
->modifier_ctx
[i
], (__message
), \
445 java_accstring_lookup
(1 << i
)); \
456 #ifdef USE_MAPPED_LOCATION
457 source_location location
;
466 #ifdef USE_MAPPED_LOCATION
467 #define SET_EXPR_LOCATION_FROM_TOKEN(EXPR, TOKEN) \
468 SET_EXPR_LOCATION
(EXPR
, (TOKEN
).location
)
470 #define SET_EXPR_LOCATION_FROM_TOKEN(EXPR, TOKEN) \
471 (EXPR_WFL_LINECOL
(EXPR
) = (TOKEN
).location
)
479 /* Things defined here have to match the order of what's in the
480 binop_lookup table. */
482 %token PLUS_TK MINUS_TK MULT_TK DIV_TK REM_TK
483 %token LS_TK SRS_TK ZRS_TK
484 %token AND_TK XOR_TK OR_TK
485 %token BOOL_AND_TK BOOL_OR_TK
486 %token EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
488 /* This maps to the same binop_lookup entry than the token above */
490 %token PLUS_ASSIGN_TK MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
492 %token LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
493 %token AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
496 /* Modifier TOKEN have to be kept in this order. Don't scramble it */
498 %token PUBLIC_TK PRIVATE_TK PROTECTED_TK
499 %token STATIC_TK FINAL_TK SYNCHRONIZED_TK
500 %token VOLATILE_TK TRANSIENT_TK NATIVE_TK
501 %token PAD_TK ABSTRACT_TK STRICT_TK
504 /* Keep those two in order, too */
505 %token DECR_TK INCR_TK
507 /* From now one, things can be in any order */
509 %token DEFAULT_TK IF_TK THROW_TK
510 %token BOOLEAN_TK DO_TK IMPLEMENTS_TK
511 %token THROWS_TK BREAK_TK IMPORT_TK
512 %token ELSE_TK INSTANCEOF_TK RETURN_TK
513 %token VOID_TK CATCH_TK INTERFACE_TK
514 %token CASE_TK EXTENDS_TK FINALLY_TK
515 %token SUPER_TK WHILE_TK CLASS_TK
516 %token SWITCH_TK CONST_TK TRY_TK
517 %token FOR_TK NEW_TK CONTINUE_TK
518 %token GOTO_TK PACKAGE_TK THIS_TK
521 %token BYTE_TK SHORT_TK INT_TK LONG_TK
522 %token CHAR_TK INTEGRAL_TK
524 %token FLOAT_TK DOUBLE_TK FP_TK
528 %token REL_QM_TK REL_CL_TK NOT_TK NEG_TK
530 %token ASSIGN_ANY_TK ASSIGN_TK
531 %token OP_TK CP_TK OCB_TK CCB_TK OSB_TK CSB_TK SC_TK C_TK DOT_TK
533 %token STRING_LIT_TK CHAR_LIT_TK INT_LIT_TK FP_LIT_TK
534 %token TRUE_TK FALSE_TK BOOL_LIT_TK NULL_TK
536 %type
<value
> modifiers MODIFIER_TK final synchronized
538 %type
<node
> super ID_TK identifier
539 %type
<node
> name simple_name qualified_name
540 %type
<node
> type_declaration compilation_unit
541 field_declaration method_declaration extends_interfaces
542 interfaces interface_type_list
543 import_declarations package_declaration
544 type_declarations interface_body
545 interface_member_declaration constant_declaration
546 interface_member_declarations interface_type
547 abstract_method_declaration
548 %type
<node
> class_body_declaration class_member_declaration
549 static_initializer constructor_declaration block
550 %type
<node
> class_body_declarations constructor_header
551 %type
<node
> class_or_interface_type class_type class_type_list
552 constructor_declarator explicit_constructor_invocation
553 %type
<node
> dim_expr dim_exprs this_or_super throws
555 %type
<node
> variable_declarator_id variable_declarator
556 variable_declarators variable_initializer
557 variable_initializers constructor_body
560 %type
<node
> class_body block_end constructor_block_end
561 %type
<node
> statement statement_without_trailing_substatement
562 labeled_statement if_then_statement label_decl
563 if_then_else_statement while_statement for_statement
564 statement_nsi labeled_statement_nsi do_statement
565 if_then_else_statement_nsi while_statement_nsi
566 for_statement_nsi statement_expression_list for_init
567 for_update statement_expression expression_statement
568 primary_no_new_array expression primary array_type
569 array_creation_initialized array_creation_uninitialized
570 class_instance_creation_expression field_access
571 method_invocation array_access something_dot_new
572 argument_list postfix_expression while_expression
573 post_increment_expression post_decrement_expression
574 unary_expression_not_plus_minus unary_expression
575 pre_increment_expression pre_decrement_expression
577 multiplicative_expression additive_expression
578 shift_expression relational_expression
579 equality_expression and_expression
580 exclusive_or_expression inclusive_or_expression
581 conditional_and_expression conditional_or_expression
582 conditional_expression assignment_expression
583 left_hand_side assignment for_header for_begin
584 constant_expression do_statement_begin empty_statement
585 switch_statement synchronized_statement throw_statement
586 try_statement assert_statement
587 switch_expression switch_block
588 catches catch_clause catch_clause_parameter finally
589 anonymous_class_creation trap_overflow_corner_case
590 %type
<node
> return_statement break_statement continue_statement
592 %type
<operator
> ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
593 %type
<operator
> REM_ASSIGN_TK PLUS_ASSIGN_TK MINUS_ASSIGN_TK
594 %type
<operator
> LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
595 %type
<operator
> AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
596 %type
<operator
> ASSIGN_ANY_TK assignment_operator
597 %token
<operator
> EQ_TK GTE_TK ZRS_TK SRS_TK GT_TK LTE_TK LS_TK
598 %token
<operator
> BOOL_AND_TK AND_TK BOOL_OR_TK OR_TK INCR_TK PLUS_TK
599 %token
<operator
> DECR_TK MINUS_TK MULT_TK DIV_TK XOR_TK REM_TK NEQ_TK
600 %token
<operator
> NEG_TK REL_QM_TK REL_CL_TK NOT_TK LT_TK OCB_TK CCB_TK
601 %token
<operator
> OP_TK OSB_TK DOT_TK THROW_TK INSTANCEOF_TK
602 %type
<operator
> THIS_TK SUPER_TK RETURN_TK BREAK_TK CONTINUE_TK
603 %type
<operator
> CASE_TK DEFAULT_TK TRY_TK CATCH_TK SYNCHRONIZED_TK
604 %type
<operator
> NEW_TK ASSERT_TK
606 %type
<node
> method_body
608 %type
<node
> literal INT_LIT_TK FP_LIT_TK BOOL_LIT_TK CHAR_LIT_TK
609 STRING_LIT_TK NULL_TK VOID_TK
611 %type
<node
> IF_TK WHILE_TK FOR_TK
613 %type
<node
> formal_parameter_list formal_parameter
614 method_declarator method_header
616 %type
<node
> primitive_type reference_type type
617 BOOLEAN_TK INTEGRAL_TK FP_TK
619 /* Added or modified JDK 1.1 rule types */
620 %type
<node
> type_literals
623 /* 19.2 Production from 2.3: The Syntactic Grammar */
624 goal: compilation_unit
628 /* 19.3 Productions from 3: Lexical structure */
638 /* 19.4 Productions from 4: Types, Values and Variables */
651 class_or_interface_type
655 class_or_interface_type:
660 class_or_interface_type
/* Default rule */
664 class_or_interface_type
670 int osb
= pop_current_osb
(ctxp
);
671 tree t
= build_java_array_type
(($1), -1);
673 t
= build_unresolved_array_type
(t
);
678 int osb
= pop_current_osb
(ctxp
);
681 t
= build_unresolved_array_type
(t
);
686 /* 19.5 Productions from 6: Names */
688 simple_name
/* Default rule */
689 | qualified_name
/* Default rule */
693 identifier
/* Default rule */
697 name DOT_TK identifier
698 { $$
= make_qualified_name
($1, $3, $2.location
); }
705 /* 19.6: Production from 7: Packages */
708 | package_declaration
709 | import_declarations
711 | package_declaration import_declarations
712 | package_declaration type_declarations
713 | import_declarations type_declarations
714 | package_declaration import_declarations type_declarations
722 | import_declarations import_declaration
730 | type_declarations type_declaration
734 PACKAGE_TK name SC_TK
736 ctxp
->package
= EXPR_WFL_NODE
($2);
739 {yyerror ("Missing name"); RECOVER
;}
740 | PACKAGE_TK name
error
741 {yyerror ("';' expected"); RECOVER
;}
745 single_type_import_declaration
746 | type_import_on_demand_declaration
749 single_type_import_declaration:
752 tree name
= EXPR_WFL_NODE
($2), last_name
;
753 int i
= IDENTIFIER_LENGTH
(name
)-1;
754 const char *last
= &IDENTIFIER_POINTER
(name
)[i
];
755 while
(last
!= IDENTIFIER_POINTER
(name
))
761 last_name
= get_identifier
(++last
);
762 if
(IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P
(last_name
))
764 tree err
= find_name_in_single_imports
(last_name
);
765 if
(err
&& err
!= name
)
767 ($2, "Ambiguous class: %qs and %qs",
768 IDENTIFIER_POINTER
(name
),
769 IDENTIFIER_POINTER
(err
));
771 REGISTER_IMPORT
($2, last_name
);
774 REGISTER_IMPORT
($2, last_name
);
777 {yyerror ("Missing name"); RECOVER
;}
778 | IMPORT_TK name
error
779 {yyerror ("';' expected"); RECOVER
;}
782 type_import_on_demand_declaration:
783 IMPORT_TK name DOT_TK MULT_TK SC_TK
785 tree name
= EXPR_WFL_NODE
($2);
787 /* Search for duplicates. */
788 for
(it
= ctxp
->import_demand_list
; it
; it
= TREE_CHAIN
(it
))
789 if
(EXPR_WFL_NODE
(TREE_PURPOSE
(it
)) == name
)
791 /* Don't import the same thing more than once, just ignore
792 duplicates (7.5.2) */
795 read_import_dir
($2);
796 ctxp
->import_demand_list
=
797 chainon
(ctxp
->import_demand_list
,
798 build_tree_list
($2, NULL_TREE
));
801 | IMPORT_TK name DOT_TK
error
802 {yyerror ("'*' expected"); RECOVER
;}
803 | IMPORT_TK name DOT_TK MULT_TK
error
804 {yyerror ("';' expected"); RECOVER
;}
809 { end_class_declaration
(0); }
810 | interface_declaration
811 { end_class_declaration
(0); }
816 yyerror ("Class or interface declaration expected");
820 /* 19.7 Shortened from the original:
821 modifiers: modifier | modifiers modifier
822 modifier: any of public... */
828 | modifiers MODIFIER_TK
833 (ctxp
->modifier_ctx
[$2], "Modifier %qs declared twice",
834 java_accstring_lookup
(acc
));
842 /* 19.8.1 Production from $8.1: Class Declaration */
844 modifiers CLASS_TK identifier super interfaces
845 { create_class
($1, $3, $4, $5); }
848 | CLASS_TK identifier super interfaces
849 { create_class
(0, $2, $3, $4); }
852 | modifiers CLASS_TK
error
853 { yyerror ("Missing class name"); RECOVER
; }
855 { yyerror ("Missing class name"); RECOVER
; }
856 | CLASS_TK identifier
error
858 if
(!ctxp
->class_err
) yyerror ("'{' expected");
861 | modifiers CLASS_TK identifier
error
862 { if
(!ctxp
->class_err
) yyerror ("'{' expected"); RECOVER
; }
867 | EXTENDS_TK class_type
869 | EXTENDS_TK class_type
error
870 {yyerror ("'{' expected"); ctxp
->class_err
=1;}
872 {yyerror ("Missing super class name"); ctxp
->class_err
=1;}
877 | IMPLEMENTS_TK interface_type_list
879 | IMPLEMENTS_TK
error
882 yyerror ("Missing interface name");
889 ctxp
->interface_number
= 1;
890 $$
= build_tree_list
($1, NULL_TREE
);
892 | interface_type_list C_TK interface_type
894 ctxp
->interface_number
++;
895 $$
= chainon
($1, build_tree_list
($3, NULL_TREE
));
897 | interface_type_list C_TK
error
898 {yyerror ("Missing interface name"); RECOVER
;}
906 | OCB_TK class_body_declarations CCB_TK
912 class_body_declarations:
913 class_body_declaration
914 | class_body_declarations class_body_declaration
917 class_body_declaration:
918 class_member_declaration
920 | constructor_declaration
921 | block
/* Added, JDK1.1, instance initializer */
923 if
(!IS_EMPTY_STMT
($1))
925 TREE_CHAIN
($1) = CPC_INSTANCE_INITIALIZER_STMT
(ctxp
);
926 SET_CPC_INSTANCE_INITIALIZER_STMT
(ctxp
, $1);
931 class_member_declaration:
934 | class_declaration
/* Added, JDK1.1 inner classes */
935 { end_class_declaration
(1); }
936 | interface_declaration
/* Added, JDK1.1 inner interfaces */
937 { end_class_declaration
(1); }
941 /* 19.8.2 Productions from 8.3: Field Declarations */
943 type variable_declarators SC_TK
944 { register_fields
(0, $1, $2); }
945 | modifiers type variable_declarators SC_TK
948 ("Illegal modifier %qs for field declaration",
949 $1, FIELD_MODIFIERS
);
950 check_modifiers_consistency
($1);
951 register_fields
($1, $2, $3);
955 variable_declarators:
956 /* Should we use build_decl_list () instead ? FIXME */
957 variable_declarator
/* Default rule */
958 | variable_declarators C_TK variable_declarator
959 { $$
= chainon
($1, $3); }
960 | variable_declarators C_TK
error
961 {yyerror ("Missing term"); RECOVER
;}
965 variable_declarator_id
966 { $$
= build_tree_list
($1, NULL_TREE
); }
967 | variable_declarator_id ASSIGN_TK variable_initializer
969 if
(java_error_count
)
972 ($1, build_assignment
($2.token
, $2.location
, $1, $3));
974 | variable_declarator_id ASSIGN_TK
error
976 yyerror ("Missing variable initializer");
977 $$
= build_tree_list
($1, NULL_TREE
);
980 | variable_declarator_id ASSIGN_TK variable_initializer
error
982 yyerror ("';' expected");
983 $$
= build_tree_list
($1, NULL_TREE
);
988 variable_declarator_id:
990 | variable_declarator_id OSB_TK CSB_TK
991 { $$
= build_unresolved_array_type
($1); }
993 {yyerror ("Invalid declaration"); DRECOVER
(vdi
);}
994 | variable_declarator_id OSB_TK
error
996 yyerror ("']' expected");
999 | variable_declarator_id CSB_TK
error
1000 {yyerror ("Unbalanced ']'"); DRECOVER
(vdi
);}
1003 variable_initializer:
1008 /* 19.8.3 Productions from 8.4: Method Declarations */
1012 current_function_decl
= $1;
1013 if
(current_function_decl
1014 && TREE_CODE
(current_function_decl
) == FUNCTION_DECL
)
1015 source_start_java_method
(current_function_decl
);
1017 current_function_decl
= NULL_TREE
;
1020 { finish_method_declaration
($3); }
1021 | method_header
error
1022 {YYNOT_TWICE
yyerror ("'{' expected"); RECOVER
;}
1026 type method_declarator throws
1027 { $$
= method_header
(0, $1, $2, $3); }
1028 | VOID_TK method_declarator throws
1029 { $$
= method_header
(0, void_type_node
, $2, $3); }
1030 | modifiers type method_declarator throws
1031 { $$
= method_header
($1, $2, $3, $4); }
1032 | modifiers VOID_TK method_declarator throws
1033 { $$
= method_header
($1, void_type_node
, $3, $4); }
1036 yyerror ("Invalid method declaration, method name required");
1040 | modifiers type
error
1042 yyerror ("Identifier expected");
1048 yyerror ("Identifier expected");
1052 | modifiers VOID_TK
error
1054 yyerror ("Identifier expected");
1060 yyerror ("Invalid method declaration, return type required");
1067 identifier OP_TK CP_TK
1069 ctxp
->formal_parameter_number
= 0;
1070 $$
= method_declarator
($1, NULL_TREE
);
1072 | identifier OP_TK formal_parameter_list CP_TK
1073 { $$
= method_declarator
($1, $3); }
1074 | method_declarator OSB_TK CSB_TK
1076 SET_EXPR_LOCATION_FROM_TOKEN
(wfl_operator
, $2);
1078 build_unresolved_array_type
(TREE_PURPOSE
($1));
1079 parse_warning_context
1081 "Discouraged form of returned type specification");
1083 | identifier OP_TK
error
1084 {yyerror ("')' expected"); DRECOVER
(method_declarator
);}
1085 | method_declarator OSB_TK
error
1086 {yyerror ("']' expected"); RECOVER
;}
1089 formal_parameter_list:
1092 ctxp
->formal_parameter_number
= 1;
1094 | formal_parameter_list C_TK formal_parameter
1096 ctxp
->formal_parameter_number
+= 1;
1097 $$
= chainon
($1, $3);
1099 | formal_parameter_list C_TK
error
1100 { yyerror ("Missing formal parameter term"); RECOVER
; }
1104 type variable_declarator_id
1106 $$
= build_tree_list
($2, $1);
1108 | final type variable_declarator_id
/* Added, JDK1.1 final parms */
1110 $$
= build_tree_list
($3, $2);
1111 ARG_FINAL_P
($$
) = 1;
1115 yyerror ("Missing identifier"); RECOVER
;
1120 yyerror ("Missing identifier"); RECOVER
;
1128 check_modifiers
("Illegal modifier %qs. Only %<final%> was expected here",
1130 if
($1 != ACC_FINAL
)
1131 MODIFIER_WFL
(FINAL_TK
) = build_wfl_node
(NULL_TREE
);
1137 | THROWS_TK class_type_list
1140 {yyerror ("Missing class type term"); RECOVER
;}
1145 { $$
= build_tree_list
($1, $1); }
1146 | class_type_list C_TK class_type
1147 { $$
= tree_cons
($3, $3, $1); }
1148 | class_type_list C_TK
error
1149 {yyerror ("Missing class type term"); RECOVER
;}
1154 | SC_TK
{ $$
= NULL_TREE
; }
1157 /* 19.8.4 Productions from 8.5: Static Initializers */
1161 TREE_CHAIN
($2) = CPC_STATIC_INITIALIZER_STMT
(ctxp
);
1162 SET_CPC_STATIC_INITIALIZER_STMT
(ctxp
, $2);
1163 current_static_block
= NULL_TREE
;
1167 static: /* Test lval.sub_token here */
1170 check_modifiers
("Illegal modifier %qs for static initializer", $1, ACC_STATIC
);
1171 /* Can't have a static initializer in an innerclass */
1172 if
($1 | ACC_STATIC
&&
1173 GET_CPC_LIST
() && !TOPLEVEL_CLASS_DECL_P
(GET_CPC
()))
1175 (MODIFIER_WFL
(STATIC_TK
),
1176 "Can't define static initializer in class %qs. Static initializer can only be defined in top-level classes",
1177 IDENTIFIER_POINTER
(DECL_NAME
(GET_CPC
())));
1178 SOURCE_FRONTEND_DEBUG
(("Modifiers: %d", $1));
1182 /* 19.8.5 Productions from 8.6: Constructor Declarations */
1183 constructor_declaration:
1186 current_function_decl
= $1;
1187 source_start_java_method
(current_function_decl
);
1190 { finish_method_declaration
($3); }
1194 constructor_declarator throws
1195 { $$
= method_header
(0, NULL_TREE
, $1, $2); }
1196 | modifiers constructor_declarator throws
1197 { $$
= method_header
($1, NULL_TREE
, $2, $3); }
1200 constructor_declarator:
1201 simple_name OP_TK CP_TK
1203 ctxp
->formal_parameter_number
= 0;
1204 $$
= method_declarator
($1, NULL_TREE
);
1206 | simple_name OP_TK formal_parameter_list CP_TK
1207 { $$
= method_declarator
($1, $3); }
1211 /* Unlike regular method, we always need a complete (empty)
1212 body so we can safely perform all the required code
1213 addition (super invocation and field initialization) */
1214 block_begin constructor_block_end
1216 BLOCK_EXPR_BODY
($2) = build_java_empty_stmt
();
1219 | block_begin explicit_constructor_invocation constructor_block_end
1221 | block_begin block_statements constructor_block_end
1223 | block_begin explicit_constructor_invocation block_statements constructor_block_end
1227 constructor_block_end:
1231 /* Error recovery for that rule moved down expression_statement: rule. */
1232 explicit_constructor_invocation:
1233 this_or_super OP_TK CP_TK SC_TK
1235 $$
= build_method_invocation
($1, NULL_TREE
);
1236 $$
= build_debugable_stmt
(EXPR_WFL_LINECOL
($1), $$
);
1237 $$
= java_method_add_stmt
(current_function_decl
, $$
);
1239 | this_or_super OP_TK argument_list CP_TK SC_TK
1241 $$
= build_method_invocation
($1, $3);
1242 $$
= build_debugable_stmt
(EXPR_WFL_LINECOL
($1), $$
);
1243 $$
= java_method_add_stmt
(current_function_decl
, $$
);
1245 /* Added, JDK1.1 inner classes. Modified because the rule
1246 'primary' couldn't work. */
1247 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
1248 {$$
= parse_jdk1_1_error
("explicit constructor invocation"); }
1249 | name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
1250 {$$
= parse_jdk1_1_error
("explicit constructor invocation"); }
1253 this_or_super: /* Added, simplifies error diagnostics */
1256 tree wfl
= build_wfl_node
(this_identifier_node
);
1257 SET_EXPR_LOCATION_FROM_TOKEN
(wfl
, $1);
1262 tree wfl
= build_wfl_node
(super_identifier_node
);
1263 SET_EXPR_LOCATION_FROM_TOKEN
(wfl
, $1);
1268 /* 19.9 Productions from 9: Interfaces */
1269 /* 19.9.1 Productions from 9.1: Interfaces Declarations */
1270 interface_declaration:
1271 INTERFACE_TK identifier
1272 { create_interface
(0, $2, NULL_TREE
); }
1275 | modifiers INTERFACE_TK identifier
1276 { create_interface
($1, $3, NULL_TREE
); }
1279 | INTERFACE_TK identifier extends_interfaces
1280 { create_interface
(0, $2, $3); }
1283 | modifiers INTERFACE_TK identifier extends_interfaces
1284 { create_interface
($1, $3, $4); }
1287 | INTERFACE_TK identifier
error
1288 { yyerror ("'{' expected"); RECOVER
; }
1289 | modifiers INTERFACE_TK identifier
error
1290 { yyerror ("'{' expected"); RECOVER
; }
1294 EXTENDS_TK interface_type
1296 ctxp
->interface_number
= 1;
1297 $$
= build_tree_list
($2, NULL_TREE
);
1299 | extends_interfaces C_TK interface_type
1301 ctxp
->interface_number
++;
1302 $$
= chainon
($1, build_tree_list
($3, NULL_TREE
));
1305 {yyerror ("Invalid interface type"); RECOVER
;}
1306 | extends_interfaces C_TK
error
1307 {yyerror ("Missing term"); RECOVER
;}
1313 | OCB_TK interface_member_declarations CCB_TK
1317 interface_member_declarations:
1318 interface_member_declaration
1319 | interface_member_declarations interface_member_declaration
1322 interface_member_declaration:
1323 constant_declaration
1324 | abstract_method_declaration
1325 | class_declaration
/* Added, JDK1.1 inner classes */
1326 { end_class_declaration
(1); }
1327 | interface_declaration
/* Added, JDK1.1 inner interfaces */
1328 { end_class_declaration
(1); }
1332 constant_declaration:
1336 abstract_method_declaration:
1339 check_abstract_method_header
($1);
1340 current_function_decl
= NULL_TREE
; /* FIXME ? */
1342 | method_header
error
1343 {yyerror ("';' expected"); RECOVER
;}
1346 /* 19.10 Productions from 10: Arrays */
1349 { $$
= build_new_array_init
($1.location
, NULL_TREE
); }
1350 | OCB_TK C_TK CCB_TK
1351 { $$
= build_new_array_init
($1.location
, NULL_TREE
); }
1352 | OCB_TK variable_initializers CCB_TK
1353 { $$
= build_new_array_init
($1.location
, $2); }
1354 | OCB_TK variable_initializers C_TK CCB_TK
1355 { $$
= build_new_array_init
($1.location
, $2); }
1358 variable_initializers:
1359 variable_initializer
1361 $$
= tree_cons
(maybe_build_array_element_wfl
($1),
1364 | variable_initializers C_TK variable_initializer
1366 $$
= tree_cons
(maybe_build_array_element_wfl
($3), $3, $1);
1368 | variable_initializers C_TK
error
1369 {yyerror ("Missing term"); RECOVER
;}
1372 /* 19.11 Production from 14: Blocks and Statements */
1374 block_begin block_end
1376 | block_begin block_statements block_end
1388 maybe_absorb_scoping_blocks
();
1390 if
(!BLOCK_SUBBLOCKS
($$
))
1391 BLOCK_SUBBLOCKS
($$
) = build_java_empty_stmt
();
1397 | block_statements block_statement
1401 local_variable_declaration_statement
1403 { java_method_add_stmt
(current_function_decl
, $1); }
1404 | class_declaration
/* Added, JDK1.1 local classes */
1406 LOCAL_CLASS_P
(TREE_TYPE
(GET_CPC
())) = 1;
1407 end_class_declaration
(1);
1411 local_variable_declaration_statement:
1412 local_variable_declaration SC_TK
/* Can't catch missing ';' here */
1415 local_variable_declaration:
1416 type variable_declarators
1417 { declare_local_variables
(0, $1, $2); }
1418 | final type variable_declarators
/* Added, JDK1.1 final locals */
1419 { declare_local_variables
($1, $2, $3); }
1423 statement_without_trailing_substatement
1426 | if_then_else_statement
1429 { $$
= exit_block
(); }
1433 statement_without_trailing_substatement
1434 | labeled_statement_nsi
1435 | if_then_else_statement_nsi
1436 | while_statement_nsi
1438 { $$
= exit_block
(); }
1441 statement_without_trailing_substatement:
1444 | expression_statement
1448 | continue_statement
1450 | synchronized_statement
1459 if
(flag_extraneous_semicolon
1460 && ! current_static_block
1461 && (! current_function_decl ||
1462 /* Verify we're not in a inner class declaration */
1463 (GET_CPC
() != TYPE_NAME
1464 (DECL_CONTEXT
(current_function_decl
)))))
1467 #ifdef USE_MAPPED_LOCATION
1468 SET_EXPR_LOCATION
(wfl_operator
, input_location
);
1470 EXPR_WFL_SET_LINECOL
(wfl_operator
, input_line
, -1);
1472 parse_warning_context
(wfl_operator
, "An empty declaration is a deprecated feature that should not be used");
1474 $$
= build_java_empty_stmt
();
1479 identifier REL_CL_TK
1481 $$
= build_labeled_block
(EXPR_WFL_LINECOL
($1),
1482 EXPR_WFL_NODE
($1));
1484 push_labeled_block
($$
);
1485 PUSH_LABELED_BLOCK
($$
);
1490 label_decl statement
1491 { $$
= finish_labeled_statement
($1, $2); }
1493 {yyerror ("':' expected"); RECOVER
;}
1496 labeled_statement_nsi:
1497 label_decl statement_nsi
1498 { $$
= finish_labeled_statement
($1, $2); }
1501 /* We concentrate here a bunch of error handling rules that we couldn't write
1502 earlier, because expression_statement catches a missing ';'. */
1503 expression_statement:
1504 statement_expression SC_TK
1506 /* We have a statement. Generate a WFL around it so
1508 #ifdef USE_MAPPED_LOCATION
1509 $$
= expr_add_location
($1, input_location
, 1);
1511 $$
= build_expr_wfl
($1, input_filename
, input_line
, 0);
1512 JAVA_MAYBE_GENERATE_DEBUG_INFO
($$
);
1514 /* We know we have a statement, so set the debug
1515 info to be eventually generate here. */
1519 YYNOT_TWICE
yyerror ("Invalid expression statement");
1520 DRECOVER
(expr_stmt
);
1524 YYNOT_TWICE
yyerror ("Invalid expression statement");
1525 DRECOVER
(expr_stmt
);
1529 YYNOT_TWICE
yyerror ("Invalid expression statement");
1530 DRECOVER
(expr_stmt
);
1532 | this_or_super OP_TK
error
1533 {yyerror ("')' expected"); RECOVER
;}
1534 | this_or_super OP_TK CP_TK
error
1536 parse_ctor_invocation_error
();
1539 | this_or_super OP_TK argument_list
error
1540 {yyerror ("')' expected"); RECOVER
;}
1541 | this_or_super OP_TK argument_list CP_TK
error
1543 parse_ctor_invocation_error
();
1546 | name DOT_TK SUPER_TK
error
1547 {yyerror ("'(' expected"); RECOVER
;}
1548 | name DOT_TK SUPER_TK OP_TK
error
1549 {yyerror ("')' expected"); RECOVER
;}
1550 | name DOT_TK SUPER_TK OP_TK argument_list
error
1551 {yyerror ("')' expected"); RECOVER
;}
1552 | name DOT_TK SUPER_TK OP_TK argument_list CP_TK
error
1553 {yyerror ("';' expected"); RECOVER
;}
1554 | name DOT_TK SUPER_TK OP_TK CP_TK
error
1555 {yyerror ("';' expected"); RECOVER
;}
1558 statement_expression:
1560 | pre_increment_expression
1561 | pre_decrement_expression
1562 | post_increment_expression
1563 | post_decrement_expression
1565 | class_instance_creation_expression
1569 IF_TK OP_TK expression CP_TK statement
1571 $$
= build_if_else_statement
($2.location
, $3,
1575 {yyerror ("'(' expected"); RECOVER
;}
1577 {yyerror ("Missing term"); RECOVER
;}
1578 | IF_TK OP_TK expression
error
1579 {yyerror ("')' expected"); RECOVER
;}
1582 if_then_else_statement:
1583 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
1584 { $$
= build_if_else_statement
($2.location
, $3, $5, $7); }
1587 if_then_else_statement_nsi:
1588 IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
1589 { $$
= build_if_else_statement
($2.location
, $3, $5, $7); }
1599 /* Make into "proper list" of COMPOUND_EXPRs.
1600 I.e. make the last statement also have its own
1602 maybe_absorb_scoping_blocks
();
1603 TREE_OPERAND
($1, 1) = exit_block
();
1604 $$
= build_debugable_stmt
(EXPR_WFL_LINECOL
($1), $1);
1609 SWITCH_TK OP_TK expression CP_TK
1611 $$
= build3
(SWITCH_EXPR
, NULL_TREE
, $3,
1612 NULL_TREE
, NULL_TREE
);
1613 SET_EXPR_LOCATION_FROM_TOKEN
($$
, $2);
1616 {yyerror ("'(' expected"); RECOVER
;}
1617 | SWITCH_TK OP_TK
error
1618 {yyerror ("Missing term or ')'"); DRECOVER
(switch_statement
);}
1619 | SWITCH_TK OP_TK expression CP_TK
error
1620 {yyerror ("'{' expected"); RECOVER
;}
1623 /* Default assignment is there to avoid type node on switch_block
1629 | OCB_TK switch_labels CCB_TK
1631 | OCB_TK switch_block_statement_groups CCB_TK
1633 | OCB_TK switch_block_statement_groups switch_labels CCB_TK
1637 switch_block_statement_groups:
1638 switch_block_statement_group
1639 | switch_block_statement_groups switch_block_statement_group
1642 switch_block_statement_group:
1643 switch_labels block_statements
1648 | switch_labels switch_label
1652 CASE_TK constant_expression REL_CL_TK
1654 tree lab
= build1
(CASE_EXPR
, NULL_TREE
, $2);
1655 SET_EXPR_LOCATION_FROM_TOKEN
(lab
, $1);
1656 java_method_add_stmt
(current_function_decl
, lab
);
1658 | DEFAULT_TK REL_CL_TK
1660 tree lab
= make_node
(DEFAULT_EXPR
);
1661 SET_EXPR_LOCATION_FROM_TOKEN
(lab
, $1);
1662 java_method_add_stmt
(current_function_decl
, lab
);
1665 {yyerror ("Missing or invalid constant expression"); RECOVER
;}
1666 | CASE_TK constant_expression
error
1667 {yyerror ("':' expected"); RECOVER
;}
1669 {yyerror ("':' expected"); RECOVER
;}
1673 WHILE_TK OP_TK expression CP_TK
1675 tree body
= build_loop_body
($2.location
, $3, 0);
1676 $$
= build_new_loop
(body
);
1681 while_expression statement
1682 { $$
= finish_loop_body
(0, NULL_TREE
, $2, 0); }
1684 {YYERROR_NOW
; yyerror ("'(' expected"); RECOVER
;}
1685 | WHILE_TK OP_TK
error
1686 {yyerror ("Missing term and ')' expected"); RECOVER
;}
1687 | WHILE_TK OP_TK expression
error
1688 {yyerror ("')' expected"); RECOVER
;}
1691 while_statement_nsi:
1692 while_expression statement_nsi
1693 { $$
= finish_loop_body
(0, NULL_TREE
, $2, 0); }
1699 tree body
= build_loop_body
(0, NULL_TREE
, 1);
1700 $$
= build_new_loop
(body
);
1702 /* Need error handing here. FIXME */
1706 do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1707 { $$
= finish_loop_body
($4.location
, $5, $2, 1); }
1711 for_begin SC_TK expression SC_TK for_update CP_TK statement
1713 if
(CONSTANT_CLASS_P
($3))
1714 $3 = build_wfl_node
($3);
1715 $$
= finish_for_loop
(EXPR_WFL_LINECOL
($3), $3, $5, $7);
1717 | for_begin SC_TK SC_TK for_update CP_TK statement
1719 $$
= finish_for_loop
(0, NULL_TREE
, $4, $6);
1720 /* We have not condition, so we get rid of the EXIT_EXPR */
1721 LOOP_EXPR_BODY_CONDITION_EXPR
(LOOP_EXPR_BODY
($$
), 0) =
1722 build_java_empty_stmt
();
1724 | for_begin SC_TK
error
1725 {yyerror ("Invalid control expression"); RECOVER
;}
1726 | for_begin SC_TK expression SC_TK
error
1727 {yyerror ("Invalid update expression"); RECOVER
;}
1728 | for_begin SC_TK SC_TK
error
1729 {yyerror ("Invalid update expression"); RECOVER
;}
1733 for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
1734 { $$
= finish_for_loop
(EXPR_WFL_LINECOL
($3), $3, $5, $7);}
1735 | for_begin SC_TK SC_TK for_update CP_TK statement_nsi
1737 $$
= finish_for_loop
(0, NULL_TREE
, $4, $6);
1738 /* We have not condition, so we get rid of the EXIT_EXPR */
1739 LOOP_EXPR_BODY_CONDITION_EXPR
(LOOP_EXPR_BODY
($$
), 0) =
1740 build_java_empty_stmt
();
1747 /* This scope defined for local variable that may be
1748 defined within the scope of the for loop */
1752 {yyerror ("'(' expected"); DRECOVER
(for_1
);}
1753 | FOR_TK OP_TK
error
1754 {yyerror ("Invalid init statement"); RECOVER
;}
1760 /* We now declare the loop body. The loop is
1761 declared as a for loop. */
1762 tree body
= build_loop_body
(0, NULL_TREE
, 0);
1763 $$
= build_new_loop
(body
);
1764 FOR_LOOP_P
($$
) = 1;
1765 /* The loop is added to the current block the for
1766 statement is defined within */
1767 java_method_add_stmt
(current_function_decl
, $$
);
1770 for_init: /* Can be empty */
1771 { $$
= build_java_empty_stmt
(); }
1772 | statement_expression_list
1774 /* Init statement recorded within the previously
1775 defined block scope */
1776 $$
= java_method_add_stmt
(current_function_decl
, $1);
1778 | local_variable_declaration
1780 /* Local variable are recorded within the previously
1781 defined block scope */
1784 | statement_expression_list
error
1785 {yyerror ("';' expected"); DRECOVER
(for_init_1
);}
1788 for_update: /* Can be empty */
1789 {$$
= build_java_empty_stmt
();}
1790 | statement_expression_list
1791 { $$
= build_debugable_stmt
(BUILD_LOCATION
(), $1); }
1794 statement_expression_list:
1795 statement_expression
1796 { $$
= add_stmt_to_compound
(NULL_TREE
, NULL_TREE
, $1); }
1797 | statement_expression_list C_TK statement_expression
1798 { $$
= add_stmt_to_compound
($1, NULL_TREE
, $3); }
1799 | statement_expression_list C_TK
error
1800 {yyerror ("Missing term"); RECOVER
;}
1805 { $$
= build_bc_statement
($1.location
, 1, NULL_TREE
); }
1806 | BREAK_TK identifier SC_TK
1807 { $$
= build_bc_statement
($1.location
, 1, $2); }
1809 {yyerror ("Missing term"); RECOVER
;}
1810 | BREAK_TK identifier
error
1811 {yyerror ("';' expected"); RECOVER
;}
1816 { $$
= build_bc_statement
($1.location
, 0, NULL_TREE
); }
1817 | CONTINUE_TK identifier SC_TK
1818 { $$
= build_bc_statement
($1.location
, 0, $2); }
1820 {yyerror ("Missing term"); RECOVER
;}
1821 | CONTINUE_TK identifier
error
1822 {yyerror ("';' expected"); RECOVER
;}
1827 { $$
= build_return
($1.location
, NULL_TREE
); }
1828 | RETURN_TK expression SC_TK
1829 { $$
= build_return
($1.location
, $2); }
1831 {yyerror ("Missing term"); RECOVER
;}
1832 | RETURN_TK expression
error
1833 {yyerror ("';' expected"); RECOVER
;}
1837 THROW_TK expression SC_TK
1839 $$
= build1
(THROW_EXPR
, NULL_TREE
, $2);
1840 SET_EXPR_LOCATION_FROM_TOKEN
($$
, $1);
1843 {yyerror ("Missing term"); RECOVER
;}
1844 | THROW_TK expression
error
1845 {yyerror ("';' expected"); RECOVER
;}
1849 ASSERT_TK expression REL_CL_TK expression SC_TK
1851 $$
= build_assertion
($1.location
, $2, $4);
1853 | ASSERT_TK expression SC_TK
1855 $$
= build_assertion
($1.location
, $2, NULL_TREE
);
1858 {yyerror ("Missing term"); RECOVER
;}
1859 | ASSERT_TK expression
error
1860 {yyerror ("';' expected"); RECOVER
;}
1863 synchronized_statement:
1864 synchronized OP_TK expression CP_TK block
1866 $$
= build2
(SYNCHRONIZED_EXPR
, NULL_TREE
, $3, $5);
1867 EXPR_WFL_LINECOL
($$
) =
1868 EXPR_WFL_LINECOL
(MODIFIER_WFL
(SYNCHRONIZED_TK
));
1870 | synchronized OP_TK expression CP_TK
error
1871 {yyerror ("'{' expected"); RECOVER
;}
1872 | synchronized
error
1873 {yyerror ("'(' expected"); RECOVER
;}
1874 | synchronized OP_TK
error CP_TK
1875 {yyerror ("Missing term"); RECOVER
;}
1876 | synchronized OP_TK
error
1877 {yyerror ("Missing term"); RECOVER
;}
1884 "Illegal modifier %qs. Only %<synchronized%> was expected here",
1885 $1, ACC_SYNCHRONIZED
);
1886 if
($1 != ACC_SYNCHRONIZED
)
1887 MODIFIER_WFL
(SYNCHRONIZED_TK
) =
1888 build_wfl_node
(NULL_TREE
);
1893 TRY_TK block catches
1894 { $$
= build_try_statement
($1.location
, $2, $3); }
1895 | TRY_TK block finally
1896 { $$
= build_try_finally_statement
($1.location
, $2, $3); }
1897 | TRY_TK block catches finally
1898 { $$
= build_try_finally_statement
1899 ($1.location
, build_try_statement
($1.location
,
1903 {yyerror ("'{' expected"); DRECOVER
(try_statement
);}
1908 | catches catch_clause
1910 TREE_CHAIN
($2) = $1;
1916 catch_clause_parameter block
1918 java_method_add_stmt
(current_function_decl
, $2);
1924 catch_clause_parameter:
1925 CATCH_TK OP_TK formal_parameter CP_TK
1927 /* We add a block to define a scope for
1928 formal_parameter (CCBP). The formal parameter is
1929 declared initialized by the appropriate function
1935 ccpb
= enter_block
();
1936 init
= build_assignment
1937 (ASSIGN_TK
, $2.location
, TREE_PURPOSE
($3),
1938 build0
(JAVA_EXC_OBJ_EXPR
, ptr_type_node
));
1939 declare_local_variables
(0, TREE_VALUE
($3),
1941 (TREE_PURPOSE
($3), init
));
1942 $$
= build1
(JAVA_CATCH_EXPR
, NULL_TREE
, ccpb
);
1943 SET_EXPR_LOCATION_FROM_TOKEN
($$
, $1);
1947 $$
= error_mark_node
;
1951 {yyerror ("'(' expected"); RECOVER
; $$
= NULL_TREE
;}
1952 | CATCH_TK OP_TK
error
1954 yyerror ("Missing term or ')' expected");
1955 RECOVER
; $$
= NULL_TREE
;
1957 | CATCH_TK OP_TK
error CP_TK
/* That's for () */
1958 {yyerror ("Missing term"); RECOVER
; $$
= NULL_TREE
;}
1965 {yyerror ("'{' expected"); RECOVER
; }
1968 /* 19.12 Production from 15: Expressions */
1970 primary_no_new_array
1971 | array_creation_uninitialized
1972 | array_creation_initialized
1975 primary_no_new_array:
1978 { $$
= build_this
($1.location
); }
1979 | OP_TK expression CP_TK
1981 | class_instance_creation_expression
1986 /* Added, JDK1.1 inner classes. Documentation is wrong
1987 referring to a 'ClassName' (class_name) rule that doesn't
1988 exist. Used name: instead. */
1989 | name DOT_TK THIS_TK
1991 tree wfl
= build_wfl_node
(this_identifier_node
);
1992 $$
= make_qualified_primary
($1, wfl
, EXPR_WFL_LINECOL
($1));
1994 | OP_TK expression
error
1995 {yyerror ("')' expected"); RECOVER
;}
1997 {yyerror ("'class' or 'this' expected" ); RECOVER
;}
1998 | primitive_type DOT_TK
error
1999 {yyerror ("'class' expected" ); RECOVER
;}
2000 | VOID_TK DOT_TK
error
2001 {yyerror ("'class' expected" ); RECOVER
;}
2005 name DOT_TK CLASS_TK
2006 { $$
= build_incomplete_class_ref
($2.location
, $1); }
2007 | array_type DOT_TK CLASS_TK
2008 { $$
= build_incomplete_class_ref
($2.location
, $1); }
2009 | primitive_type DOT_TK CLASS_TK
2010 { $$
= build_incomplete_class_ref
($2.location
, $1); }
2011 | VOID_TK DOT_TK CLASS_TK
2013 $$
= build_incomplete_class_ref
($2.location
,
2018 class_instance_creation_expression:
2019 NEW_TK class_type OP_TK argument_list CP_TK
2020 { $$
= build_new_invocation
($2, $4); }
2021 | NEW_TK class_type OP_TK CP_TK
2022 { $$
= build_new_invocation
($2, NULL_TREE
); }
2023 | anonymous_class_creation
2024 /* Added, JDK1.1 inner classes, modified to use name or
2025 primary instead of primary solely which couldn't work in
2027 | something_dot_new identifier OP_TK CP_TK
2029 tree ctor
= build_new_invocation
($2, NULL_TREE
);
2030 $$
= make_qualified_primary
($1, ctor
,
2031 EXPR_WFL_LINECOL
($1));
2033 | something_dot_new identifier OP_TK CP_TK class_body
2034 | something_dot_new identifier OP_TK argument_list CP_TK
2036 tree ctor
= build_new_invocation
($2, $4);
2037 $$
= make_qualified_primary
($1, ctor
,
2038 EXPR_WFL_LINECOL
($1));
2040 | something_dot_new identifier OP_TK argument_list CP_TK class_body
2041 | NEW_TK
error SC_TK
2042 {$$
= NULL_TREE
; yyerror ("'(' expected"); DRECOVER
(new_1
);}
2043 | NEW_TK class_type
error
2044 {$$
= NULL_TREE
; yyerror ("'(' expected"); RECOVER
;}
2045 | NEW_TK class_type OP_TK
error
2046 {$$
= NULL_TREE
; yyerror ("')' or term expected"); RECOVER
;}
2047 | NEW_TK class_type OP_TK argument_list
error
2048 {$$
= NULL_TREE
; yyerror ("')' expected"); RECOVER
;}
2049 | something_dot_new
error
2053 yyerror ("Identifier expected");
2056 | something_dot_new identifier
error
2057 {$$
= NULL_TREE
; yyerror ("'(' expected"); RECOVER
;}
2060 /* Created after JDK1.1 rules originally added to
2061 class_instance_creation_expression, but modified to use
2062 'class_type' instead of 'TypeName' (type_name) which is mentioned
2063 in the documentation but doesn't exist. */
2065 anonymous_class_creation:
2066 NEW_TK class_type OP_TK argument_list CP_TK
2067 { create_anonymous_class
($2); }
2070 tree id
= build_wfl_node
(DECL_NAME
(GET_CPC
()));
2071 EXPR_WFL_LINECOL
(id
) = EXPR_WFL_LINECOL
($2);
2073 end_class_declaration
(1);
2075 /* Now we can craft the new expression */
2076 $$
= build_new_invocation
(id
, $4);
2078 /* Note that we can't possibly be here if
2079 `class_type' is an interface (in which case the
2080 anonymous class extends Object and implements
2081 `class_type', hence its constructor can't have
2084 /* Otherwise, the innerclass must feature a
2085 constructor matching `argument_list'. Anonymous
2086 classes are a bit special: it's impossible to
2087 define constructor for them, hence constructors
2088 must be generated following the hints provided by
2089 the `new' expression. Whether a super constructor
2090 of that nature exists or not is to be verified
2091 later on in get_constructor_super.
2093 It's during the expansion of a `new' statement
2094 referring to an anonymous class that a ctor will
2095 be generated for the anonymous class, with the
2099 | NEW_TK class_type OP_TK CP_TK
2100 { create_anonymous_class
($2); }
2103 tree id
= build_wfl_node
(DECL_NAME
(GET_CPC
()));
2104 EXPR_WFL_LINECOL
(id
) = EXPR_WFL_LINECOL
($2);
2106 end_class_declaration
(1);
2108 /* Now we can craft the new expression. The
2109 statement doesn't need to be remember so that a
2110 constructor can be generated, since its signature
2111 is already known. */
2112 $$
= build_new_invocation
(id
, NULL_TREE
);
2116 something_dot_new: /* Added, not part of the specs. */
2119 | primary DOT_TK NEW_TK
2126 $$
= tree_cons
(NULL_TREE
, $1, NULL_TREE
);
2127 ctxp
->formal_parameter_number
= 1;
2129 | argument_list C_TK expression
2131 ctxp
->formal_parameter_number
+= 1;
2132 $$
= tree_cons
(NULL_TREE
, $3, $1);
2134 | argument_list C_TK
error
2135 {yyerror ("Missing term"); RECOVER
;}
2138 array_creation_uninitialized:
2139 NEW_TK primitive_type dim_exprs
2140 { $$
= build_newarray_node
($2, $3, 0); }
2141 | NEW_TK class_or_interface_type dim_exprs
2142 { $$
= build_newarray_node
($2, $3, 0); }
2143 | NEW_TK primitive_type dim_exprs dims
2144 { $$
= build_newarray_node
($2, $3, pop_current_osb
(ctxp
));}
2145 | NEW_TK class_or_interface_type dim_exprs dims
2146 { $$
= build_newarray_node
($2, $3, pop_current_osb
(ctxp
));}
2147 | NEW_TK
error CSB_TK
2148 {yyerror ("'[' expected"); DRECOVER
("]");}
2149 | NEW_TK
error OSB_TK
2150 {yyerror ("']' expected"); RECOVER
;}
2153 array_creation_initialized:
2154 /* Added, JDK1.1 anonymous array. Initial documentation rule
2156 NEW_TK class_or_interface_type dims array_initializer
2159 int osb
= pop_current_osb
(ctxp
);
2161 obstack_grow
(&temporary_obstack
, "[]", 2);
2162 obstack_1grow
(&temporary_obstack
, '\0');
2163 sig
= obstack_finish
(&temporary_obstack
);
2164 $$
= build3
(NEW_ANONYMOUS_ARRAY_EXPR
, NULL_TREE
,
2165 $2, get_identifier
(sig
), $4);
2167 | NEW_TK primitive_type dims array_initializer
2169 int osb
= pop_current_osb
(ctxp
);
2172 type
= build_java_array_type
(type
, -1);
2173 $$
= build3
(NEW_ANONYMOUS_ARRAY_EXPR
, NULL_TREE
,
2174 build_pointer_type
(type
), NULL_TREE
, $4);
2176 | NEW_TK
error CSB_TK
2177 {yyerror ("'[' expected"); DRECOVER
("]");}
2178 | NEW_TK
error OSB_TK
2179 {yyerror ("']' expected"); RECOVER
;}
2184 { $$
= build_tree_list
(NULL_TREE
, $1); }
2185 | dim_exprs dim_expr
2186 { $$
= tree_cons
(NULL_TREE
, $2, $$
); }
2190 OSB_TK expression CSB_TK
2192 if
(JNUMERIC_TYPE_P
(TREE_TYPE
($2)))
2194 $2 = build_wfl_node
($2);
2195 TREE_TYPE
($2) = NULL_TREE
;
2197 EXPR_WFL_LINECOL
($2) = $1.location
;
2200 | OSB_TK expression
error
2201 {yyerror ("']' expected"); RECOVER
;}
2204 yyerror ("Missing term");
2205 yyerror ("']' expected");
2214 /* If not initialized, allocate memory for the osb
2216 if
(!ctxp
->osb_limit
)
2218 allocate
= ctxp
->osb_limit
= 32;
2219 ctxp
->osb_depth
= -1;
2221 /* If capacity overflown, reallocate a bigger chunk */
2222 else if
(ctxp
->osb_depth
+1 == ctxp
->osb_limit
)
2223 allocate
= ctxp
->osb_limit
<< 1;
2227 allocate
*= sizeof
(int);
2228 if
(ctxp
->osb_number
)
2229 ctxp
->osb_number
= xrealloc
(ctxp
->osb_number
,
2232 ctxp
->osb_number
= xmalloc
(allocate
);
2235 CURRENT_OSB
(ctxp
) = 1;
2237 | dims OSB_TK CSB_TK
2238 { CURRENT_OSB
(ctxp
)++; }
2240 { yyerror ("']' expected"); RECOVER
;}
2244 primary DOT_TK identifier
2245 { $$
= make_qualified_primary
($1, $3, $2.location
); }
2246 /* FIXME - REWRITE TO:
2247 { $$ = build_binop (COMPONENT_REF, $2.location, $1, $3); } */
2248 | SUPER_TK DOT_TK identifier
2250 tree super_wfl
= build_wfl_node
(super_identifier_node
);
2251 SET_EXPR_LOCATION_FROM_TOKEN
(super_wfl
, $1);
2252 $$
= make_qualified_name
(super_wfl
, $3, $2.location
);
2255 {yyerror ("Field expected"); DRECOVER
(super_field_acces
);}
2260 { $$
= build_method_invocation
($1, NULL_TREE
); }
2261 | name OP_TK argument_list CP_TK
2262 { $$
= build_method_invocation
($1, $3); }
2263 | primary DOT_TK identifier OP_TK CP_TK
2265 if
(TREE_CODE
($1) == THIS_EXPR
)
2266 $$
= build_this_super_qualified_invocation
2267 (1, $3, NULL_TREE
, 0, $2.location
);
2270 tree invok
= build_method_invocation
($3, NULL_TREE
);
2271 $$
= make_qualified_primary
($1, invok
, $2.location
);
2274 | primary DOT_TK identifier OP_TK argument_list CP_TK
2276 if
(TREE_CODE
($1) == THIS_EXPR
)
2277 $$
= build_this_super_qualified_invocation
2278 (1, $3, $5, 0, $2.location
);
2281 tree invok
= build_method_invocation
($3, $5);
2282 $$
= make_qualified_primary
($1, invok
, $2.location
);
2285 | SUPER_TK DOT_TK identifier OP_TK CP_TK
2287 $$
= build_this_super_qualified_invocation
2288 (0, $3, NULL_TREE
, $1.location
, $2.location
);
2290 | SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
2292 $$
= build_this_super_qualified_invocation
2293 (0, $3, $5, $1.location
, $2.location
);
2295 /* Screws up thing. I let it here until I'm convinced it can
2297 | primary DOT_TK error
2298 {yyerror ("'(' expected"); DRECOVER(bad);} */
2299 | SUPER_TK DOT_TK
error CP_TK
2300 { yyerror ("'(' expected"); DRECOVER
(method_invocation
); }
2301 | SUPER_TK DOT_TK
error DOT_TK
2302 { yyerror ("'(' expected"); DRECOVER
(method_invocation
); }
2306 name OSB_TK expression CSB_TK
2307 { $$
= build_array_ref
($2.location
, $1, $3); }
2308 | primary_no_new_array OSB_TK expression CSB_TK
2309 { $$
= build_array_ref
($2.location
, $1, $3); }
2310 | array_creation_initialized OSB_TK expression CSB_TK
2311 { $$
= build_array_ref
($2.location
, $1, $3); }
2314 yyerror ("Missing term and ']' expected");
2315 DRECOVER
(array_access
);
2317 | name OSB_TK expression
error
2319 yyerror ("']' expected");
2320 DRECOVER
(array_access
);
2322 | primary_no_new_array OSB_TK
error
2324 yyerror ("Missing term and ']' expected");
2325 DRECOVER
(array_access
);
2327 | primary_no_new_array OSB_TK expression
error
2329 yyerror ("']' expected");
2330 DRECOVER
(array_access
);
2332 | array_creation_initialized OSB_TK
error
2334 yyerror ("Missing term and ']' expected");
2335 DRECOVER
(array_access
);
2337 | array_creation_initialized OSB_TK expression
error
2339 yyerror ("']' expected");
2340 DRECOVER
(array_access
);
2347 | post_increment_expression
2348 | post_decrement_expression
2351 post_increment_expression:
2352 postfix_expression INCR_TK
2353 { $$
= build_incdec
($2.token
, $2.location
, $1, 1); }
2356 post_decrement_expression:
2357 postfix_expression DECR_TK
2358 { $$
= build_incdec
($2.token
, $2.location
, $1, 1); }
2361 trap_overflow_corner_case:
2362 pre_increment_expression
2363 | pre_decrement_expression
2364 | PLUS_TK unary_expression
2365 {$$
= build_unaryop
($1.token
, $1.location
, $2); }
2366 | unary_expression_not_plus_minus
2368 {yyerror ("Missing term"); RECOVER
}
2372 trap_overflow_corner_case
2375 error_if_numeric_overflow
($1);
2378 | MINUS_TK trap_overflow_corner_case
2379 {$$
= build_unaryop
($1.token
, $1.location
, $2); }
2381 {yyerror ("Missing term"); RECOVER
}
2384 pre_increment_expression:
2385 INCR_TK unary_expression
2386 {$$
= build_incdec
($1.token
, $1.location
, $2, 0); }
2388 {yyerror ("Missing term"); RECOVER
}
2391 pre_decrement_expression:
2392 DECR_TK unary_expression
2393 {$$
= build_incdec
($1.token
, $1.location
, $2, 0); }
2395 {yyerror ("Missing term"); RECOVER
}
2398 unary_expression_not_plus_minus:
2400 | NOT_TK unary_expression
2401 {$$
= build_unaryop
($1.token
, $1.location
, $2); }
2402 | NEG_TK unary_expression
2403 {$$
= build_unaryop
($1.token
, $1.location
, $2); }
2406 {yyerror ("Missing term"); RECOVER
}
2408 {yyerror ("Missing term"); RECOVER
}
2411 cast_expression: /* Error handling here is potentially weak */
2412 OP_TK primitive_type dims CP_TK unary_expression
2415 int osb
= pop_current_osb
(ctxp
);
2417 type
= build_java_array_type
(type
, -1);
2418 $$
= build_cast
($1.location
, type
, $5);
2420 | OP_TK primitive_type CP_TK unary_expression
2421 { $$
= build_cast
($1.location
, $2, $4); }
2422 | OP_TK expression CP_TK unary_expression_not_plus_minus
2423 { $$
= build_cast
($1.location
, $2, $4); }
2424 | OP_TK name dims CP_TK unary_expression_not_plus_minus
2427 int osb
= pop_current_osb
(ctxp
);
2428 obstack_grow
(&temporary_obstack
,
2429 IDENTIFIER_POINTER
(EXPR_WFL_NODE
($2)),
2430 IDENTIFIER_LENGTH
(EXPR_WFL_NODE
($2)));
2432 obstack_grow
(&temporary_obstack
, "[]", 2);
2433 obstack_1grow
(&temporary_obstack
, '\0');
2434 ptr
= obstack_finish
(&temporary_obstack
);
2435 EXPR_WFL_NODE
($2) = get_identifier
(ptr
);
2436 $$
= build_cast
($1.location
, $2, $5);
2438 | OP_TK primitive_type OSB_TK
error
2439 {yyerror ("']' expected, invalid type expression");}
2442 YYNOT_TWICE
yyerror ("Invalid type expression"); RECOVER
;
2445 | OP_TK primitive_type dims CP_TK
error
2446 {yyerror ("Missing term"); RECOVER
;}
2447 | OP_TK primitive_type CP_TK
error
2448 {yyerror ("Missing term"); RECOVER
;}
2449 | OP_TK name dims CP_TK
error
2450 {yyerror ("Missing term"); RECOVER
;}
2453 multiplicative_expression:
2455 | multiplicative_expression MULT_TK unary_expression
2457 $$
= build_binop
(BINOP_LOOKUP
($2.token
),
2458 $2.location
, $1, $3);
2460 | multiplicative_expression DIV_TK unary_expression
2462 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2465 | multiplicative_expression REM_TK unary_expression
2467 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2470 | multiplicative_expression MULT_TK
error
2471 {yyerror ("Missing term"); RECOVER
;}
2472 | multiplicative_expression DIV_TK
error
2473 {yyerror ("Missing term"); RECOVER
;}
2474 | multiplicative_expression REM_TK
error
2475 {yyerror ("Missing term"); RECOVER
;}
2478 additive_expression:
2479 multiplicative_expression
2480 | additive_expression PLUS_TK multiplicative_expression
2482 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2485 | additive_expression MINUS_TK multiplicative_expression
2487 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2490 | additive_expression PLUS_TK
error
2491 {yyerror ("Missing term"); RECOVER
;}
2492 | additive_expression MINUS_TK
error
2493 {yyerror ("Missing term"); RECOVER
;}
2498 | shift_expression LS_TK additive_expression
2500 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2503 | shift_expression SRS_TK additive_expression
2505 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2508 | shift_expression ZRS_TK additive_expression
2510 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2513 | shift_expression LS_TK
error
2514 {yyerror ("Missing term"); RECOVER
;}
2515 | shift_expression SRS_TK
error
2516 {yyerror ("Missing term"); RECOVER
;}
2517 | shift_expression ZRS_TK
error
2518 {yyerror ("Missing term"); RECOVER
;}
2521 relational_expression:
2523 | relational_expression LT_TK shift_expression
2525 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2528 | relational_expression GT_TK shift_expression
2530 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2533 | relational_expression LTE_TK shift_expression
2535 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2538 | relational_expression GTE_TK shift_expression
2540 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2543 | relational_expression INSTANCEOF_TK reference_type
2544 { $$
= build_binop
(INSTANCEOF_EXPR
, $2.location
, $1, $3); }
2545 | relational_expression LT_TK
error
2546 {yyerror ("Missing term"); RECOVER
;}
2547 | relational_expression GT_TK
error
2548 {yyerror ("Missing term"); RECOVER
;}
2549 | relational_expression LTE_TK
error
2550 {yyerror ("Missing term"); RECOVER
;}
2551 | relational_expression GTE_TK
error
2552 {yyerror ("Missing term"); RECOVER
;}
2553 | relational_expression INSTANCEOF_TK
error
2554 {yyerror ("Invalid reference type"); RECOVER
;}
2557 equality_expression:
2558 relational_expression
2559 | equality_expression EQ_TK relational_expression
2561 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2564 | equality_expression NEQ_TK relational_expression
2566 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2569 | equality_expression EQ_TK
error
2570 {yyerror ("Missing term"); RECOVER
;}
2571 | equality_expression NEQ_TK
error
2572 {yyerror ("Missing term"); RECOVER
;}
2577 | and_expression AND_TK equality_expression
2579 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2582 | and_expression AND_TK
error
2583 {yyerror ("Missing term"); RECOVER
;}
2586 exclusive_or_expression:
2588 | exclusive_or_expression XOR_TK and_expression
2590 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2593 | exclusive_or_expression XOR_TK
error
2594 {yyerror ("Missing term"); RECOVER
;}
2597 inclusive_or_expression:
2598 exclusive_or_expression
2599 | inclusive_or_expression OR_TK exclusive_or_expression
2601 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2604 | inclusive_or_expression OR_TK
error
2605 {yyerror ("Missing term"); RECOVER
;}
2608 conditional_and_expression:
2609 inclusive_or_expression
2610 | conditional_and_expression BOOL_AND_TK inclusive_or_expression
2612 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2615 | conditional_and_expression BOOL_AND_TK
error
2616 {yyerror ("Missing term"); RECOVER
;}
2619 conditional_or_expression:
2620 conditional_and_expression
2621 | conditional_or_expression BOOL_OR_TK conditional_and_expression
2623 $$
= build_binop
(BINOP_LOOKUP
($2.token
), $2.location
,
2626 | conditional_or_expression BOOL_OR_TK
error
2627 {yyerror ("Missing term"); RECOVER
;}
2630 conditional_expression: /* Error handling here is weak */
2631 conditional_or_expression
2632 | conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
2634 $$
= build3
(CONDITIONAL_EXPR
, NULL_TREE
, $1, $3, $5);
2635 SET_EXPR_LOCATION_FROM_TOKEN
($$
, $2);
2637 | conditional_or_expression REL_QM_TK REL_CL_TK
error
2640 yyerror ("Missing term");
2643 | conditional_or_expression REL_QM_TK
error
2644 {yyerror ("Missing term"); DRECOVER
(2);}
2645 | conditional_or_expression REL_QM_TK expression REL_CL_TK
error
2646 {yyerror ("Missing term"); DRECOVER
(3);}
2649 assignment_expression:
2650 conditional_expression
2655 left_hand_side assignment_operator assignment_expression
2656 { $$
= build_assignment
($2.token
, $2.location
, $1, $3); }
2657 | left_hand_side assignment_operator
error
2659 YYNOT_TWICE
yyerror ("Missing term");
2670 assignment_operator:
2676 assignment_expression
2679 constant_expression:
2685 /* Helper function to retrieve an OSB count. Should be used when the
2686 `dims:' rule is being used. */
2689 pop_current_osb
(struct parser_ctxt
*ctxp
)
2693 if
(ctxp
->osb_depth
< 0)
2696 to_return
= CURRENT_OSB
(ctxp
);
2704 /* This section of the code deal with save/restoring parser contexts.
2705 Add mode documentation here. FIXME */
2707 /* Helper function. Create a new parser context. With
2708 COPY_FROM_PREVIOUS set to a nonzero value, content of the previous
2709 context is copied, otherwise, the new context is zeroed. The newly
2710 created context becomes the current one. */
2713 create_new_parser_context
(int copy_from_previous
)
2715 struct parser_ctxt
*new
;
2717 new
= ggc_alloc
(sizeof
(struct parser_ctxt
));
2718 if
(copy_from_previous
)
2720 memcpy
(new
, ctxp
, sizeof
(struct parser_ctxt
));
2721 /* This flag, indicating the context saves global values,
2722 should only be set by java_parser_context_save_global. */
2723 new
->saved_data_ctx
= 0;
2726 memset
(new
, 0, sizeof
(struct parser_ctxt
));
2732 /* Create a new parser context and make it the current one. */
2735 java_push_parser_context
(void)
2737 create_new_parser_context
(0);
2741 java_pop_parser_context
(int generate
)
2744 struct parser_ctxt
*next
;
2752 input_location
= ctxp
->save_location
;
2753 current_class
= ctxp
->class_type
;
2756 /* If the old and new lexers differ, then free the old one. */
2757 if
(ctxp
->lexer
&& next
&& ctxp
->lexer
!= next
->lexer
)
2758 java_destroy_lexer
(ctxp
->lexer
);
2760 /* Set the single import class file flag to 0 for the current list
2761 of imported things */
2762 for
(current
= ctxp
->import_list
; current
; current
= TREE_CHAIN
(current
))
2763 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P
(TREE_VALUE
(current
)) = 0;
2765 /* If we pushed a context to parse a class intended to be generated,
2766 we keep it so we can remember the class. What we could actually
2767 do is to just update a list of class names. */
2770 if
(ctxp_for_generation_last
== NULL
)
2771 ctxp_for_generation
= ctxp
;
2773 ctxp_for_generation_last
->next
= ctxp
;
2775 ctxp_for_generation_last
= ctxp
;
2778 /* And restore those of the previous context */
2779 if
((ctxp
= next
)) /* Assignment is really meant here */
2780 for
(current
= ctxp
->import_list
; current
; current
= TREE_CHAIN
(current
))
2781 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P
(TREE_VALUE
(current
)) = 1;
2784 /* Create a parser context for the use of saving some global
2788 java_parser_context_save_global
(void)
2792 java_push_parser_context
();
2793 ctxp
->saved_data_ctx
= 1;
2796 /* If this context already stores data, create a new one suitable
2797 for data storage. */
2798 else if
(ctxp
->saved_data
)
2800 create_new_parser_context
(1);
2801 ctxp
->saved_data_ctx
= 1;
2804 ctxp
->save_location
= input_location
;
2805 ctxp
->class_type
= current_class
;
2806 ctxp
->function_decl
= current_function_decl
;
2807 ctxp
->saved_data
= 1;
2810 /* Restore some global variables from the previous context. Make the
2811 previous context the current one. */
2814 java_parser_context_restore_global
(void)
2816 input_location
= ctxp
->save_location
;
2817 current_class
= ctxp
->class_type
;
2819 #ifdef USE_MAPPED_LOCATION
2820 SET_EXPR_LOCATION
(wfl_operator
, ctxp
->save_location
);
2822 EXPR_WFL_FILENAME_NODE
(wfl_operator
) = get_identifier
(input_filename
);
2824 current_function_decl
= ctxp
->function_decl
;
2825 ctxp
->saved_data
= 0;
2826 if
(ctxp
->saved_data_ctx
)
2827 java_pop_parser_context
(0);
2830 /* Suspend vital data for the current class/function being parsed so
2831 that an other class can be parsed. Used to let local/anonymous
2832 classes be parsed. */
2835 java_parser_context_suspend
(void)
2837 /* This makes debugging through java_debug_context easier */
2838 static const char *const name
= "<inner buffer context>";
2840 /* Duplicate the previous context, use it to save the globals we're
2842 create_new_parser_context
(1);
2843 ctxp
->function_decl
= current_function_decl
;
2844 ctxp
->class_type
= current_class
;
2846 /* Then create a new context which inherits all data from the
2847 previous one. This will be the new current context */
2848 create_new_parser_context
(1);
2850 /* Help debugging */
2851 ctxp
->next
->filename
= name
;
2854 /* Resume vital data for the current class/function being parsed so
2855 that an other class can be parsed. Used to let local/anonymous
2856 classes be parsed. The trick is the data storing file position
2857 informations must be restored to their current value, so parsing
2858 can resume as if no context was ever saved. */
2861 java_parser_context_resume
(void)
2863 struct parser_ctxt
*old
= ctxp
; /* This one is to be discarded */
2864 struct parser_ctxt
*saver
= old
->next
; /* This one contain saved info */
2865 struct parser_ctxt
*restored
= saver
->next
; /* This one is the old current */
2867 /* We need to inherit the list of classes to complete/generate */
2868 restored
->classd_list
= old
->classd_list
;
2869 restored
->class_list
= old
->class_list
;
2871 /* Restore the current class and function from the saver */
2872 current_class
= saver
->class_type
;
2873 current_function_decl
= saver
->function_decl
;
2875 /* Retrieve the restored context */
2878 /* Re-installed the data for the parsing to carry on */
2879 memcpy
(&ctxp
->marker_begining
, &old
->marker_begining
,
2880 (size_t)(&ctxp
->marker_end
- &ctxp
->marker_begining
));
2883 /* Add a new anchor node to which all statement(s) initializing static
2884 and non static initialized upon declaration field(s) will be
2888 java_parser_context_push_initialized_field
(void)
2892 node
= build_tree_list
(NULL_TREE
, NULL_TREE
);
2893 TREE_CHAIN
(node
) = CPC_STATIC_INITIALIZER_LIST
(ctxp
);
2894 CPC_STATIC_INITIALIZER_LIST
(ctxp
) = node
;
2896 node
= build_tree_list
(NULL_TREE
, NULL_TREE
);
2897 TREE_CHAIN
(node
) = CPC_INITIALIZER_LIST
(ctxp
);
2898 CPC_INITIALIZER_LIST
(ctxp
) = node
;
2900 node
= build_tree_list
(NULL_TREE
, NULL_TREE
);
2901 TREE_CHAIN
(node
) = CPC_INSTANCE_INITIALIZER_LIST
(ctxp
);
2902 CPC_INSTANCE_INITIALIZER_LIST
(ctxp
) = node
;
2905 /* Pop the lists of initialized field. If this lists aren't empty,
2906 remember them so we can use it to create and populate the finit$
2907 or <clinit> functions. */
2910 java_parser_context_pop_initialized_field
(void)
2913 tree class_type
= TREE_TYPE
(GET_CPC
());
2915 if
(CPC_INITIALIZER_LIST
(ctxp
))
2917 stmts
= CPC_INITIALIZER_STMT
(ctxp
);
2918 CPC_INITIALIZER_LIST
(ctxp
) = TREE_CHAIN
(CPC_INITIALIZER_LIST
(ctxp
));
2919 if
(stmts
&& !java_error_count
)
2920 TYPE_FINIT_STMT_LIST
(class_type
) = reorder_static_initialized
(stmts
);
2923 if
(CPC_STATIC_INITIALIZER_LIST
(ctxp
))
2925 stmts
= CPC_STATIC_INITIALIZER_STMT
(ctxp
);
2926 CPC_STATIC_INITIALIZER_LIST
(ctxp
) =
2927 TREE_CHAIN
(CPC_STATIC_INITIALIZER_LIST
(ctxp
));
2928 /* Keep initialization in order to enforce 8.5 */
2929 if
(stmts
&& !java_error_count
)
2930 TYPE_CLINIT_STMT_LIST
(class_type
) = nreverse
(stmts
);
2933 /* JDK 1.1 instance initializers */
2934 if
(CPC_INSTANCE_INITIALIZER_LIST
(ctxp
))
2936 stmts
= CPC_INSTANCE_INITIALIZER_STMT
(ctxp
);
2937 CPC_INSTANCE_INITIALIZER_LIST
(ctxp
) =
2938 TREE_CHAIN
(CPC_INSTANCE_INITIALIZER_LIST
(ctxp
));
2939 if
(stmts
&& !java_error_count
)
2940 TYPE_II_STMT_LIST
(class_type
) = nreverse
(stmts
);
2945 reorder_static_initialized
(tree list
)
2947 /* We have to keep things in order. The alias initializer have to
2948 come first, then the initialized regular field, in reverse to
2949 keep them in lexical order. */
2950 tree marker
, previous
= NULL_TREE
;
2951 for
(marker
= list
; marker
; previous
= marker
, marker
= TREE_CHAIN
(marker
))
2952 if
(TREE_CODE
(marker
) == TREE_LIST
2953 && !TREE_VALUE
(marker
) && !TREE_PURPOSE
(marker
))
2956 /* No static initialized, the list is fine as is */
2958 list
= TREE_CHAIN
(marker
);
2960 /* No marker? reverse the whole list */
2962 list
= nreverse
(list
);
2964 /* Otherwise, reverse what's after the marker and the new reordered
2965 sublist will replace the marker. */
2968 TREE_CHAIN
(previous
) = NULL_TREE
;
2969 list
= nreverse
(list
);
2970 list
= chainon
(TREE_CHAIN
(marker
), list
);
2975 /* Helper functions to dump the parser context stack. */
2977 #define TAB_CONTEXT(C) \
2978 {int i
; for
(i
= 0; i
< (C
); i
++) fputc
(' ', stderr
);}
2981 java_debug_context_do
(int tab
)
2983 struct parser_ctxt
*copy
= ctxp
;
2987 fprintf
(stderr
, "ctxt: 0x%0lX\n", (unsigned long)copy
);
2989 fprintf
(stderr
, "filename: %s\n", copy
->filename
);
2991 fprintf
(stderr
, "package: %s\n",
2993 IDENTIFIER_POINTER
(copy
->package
) : "<none>"));
2995 fprintf
(stderr
, "context for saving: %d\n", copy
->saved_data_ctx
);
2997 fprintf
(stderr
, "saved data: %d\n", copy
->saved_data
);
3003 /* Dump the stacked up parser contexts. Intended to be called from a
3007 java_debug_context
(void)
3009 java_debug_context_do
(0);
3014 /* Flag for the error report routine to issue the error the first time
3015 it's called (overriding the default behavior which is to drop the
3016 first invocation and honor the second one, taking advantage of a
3018 static int force_error
= 0;
3020 /* Reporting an constructor invocation error. */
3022 parse_ctor_invocation_error
(void)
3024 if
(DECL_CONSTRUCTOR_P
(current_function_decl
))
3025 yyerror ("Constructor invocation must be first thing in a constructor");
3027 yyerror ("Only constructors can invoke constructors");
3030 /* Reporting JDK1.1 features not implemented. */
3033 parse_jdk1_1_error
(const char *msg
)
3035 sorry
(": %qs JDK1.1(TM) feature", msg
);
3037 return build_java_empty_stmt
();
3040 static int do_warning
= 0;
3043 yyerror (const char *msgid
)
3045 #ifdef USE_MAPPED_LOCATION
3046 static source_location elc
;
3047 expanded_location xloc
= expand_location
(input_location
);
3048 int current_line
= xloc.line
;
3052 int current_line
= input_line
;
3054 static int prev_lineno
;
3055 static const char *prev_msg
;
3057 char *remainder
, *code_from_source
;
3059 if
(!force_error
&& prev_lineno
== current_line
)
3061 #ifndef USE_MAPPED_LOCATION
3062 current_line
= ctxp
->lexer
->token_start.line
;
3065 /* Save current error location but report latter, when the context is
3067 if
(ctxp
->java_error_flag
== 0)
3069 ctxp
->java_error_flag
= 1;
3070 #ifdef USE_MAPPED_LOCATION
3071 elc
= input_location
;
3073 elc
= ctxp
->lexer
->token_start
;
3075 /* Do something to use the previous line if we're reaching the
3076 end of the file... */
3077 #ifdef VERBOSE_SKELETON
3078 printf
("* Error detected (%s)\n", (msgid ? msgid
: "(null)"));
3083 /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
3084 if
(!force_error
&& msgid
== prev_msg
&& prev_lineno
== current_line
)
3087 ctxp
->java_error_flag
= 0;
3089 java_warning_count
++;
3094 if
(elc.col
== 0 && msgid
&& msgid
[1] == ';')
3095 elc
= ctxp
->prev_line_end
;
3100 #ifdef USE_MAPPED_LOCATION
3101 prev_lineno
= current_line
;
3102 code_from_source
= java_get_line_col
(xloc.file
, current_line
, xloc.column
);
3104 save_lineno
= input_line
;
3105 prev_lineno
= input_line
= current_line
;
3106 code_from_source
= java_get_line_col
(input_filename
, current_line
,
3107 ctxp
->lexer
->token_start.col
);
3111 obstack_grow0
(&temporary_obstack
,
3112 code_from_source
, strlen
(code_from_source
));
3113 remainder
= obstack_finish
(&temporary_obstack
);
3115 warning
(0, "%s.\n%s", msgid
, remainder
);
3117 error ("%s.\n%s", msgid
, remainder
);
3119 /* This allow us to cheaply avoid an extra 'Invalid expression
3120 statement' error report when errors have been already reported on
3121 the same line. This occurs when we report an error but don't have
3122 a synchronization point other than ';', which
3123 expression_statement is the only one to take care of. */
3124 #ifndef USE_MAPPED_LOCATION
3125 input_line
= save_lineno
;
3127 ctxp
->prevent_ese
= input_line
;
3131 issue_warning_error_from_context
(
3132 #ifdef USE_MAPPED_LOCATION
3137 const char *gmsgid
, va_list *ap
)
3139 #ifdef USE_MAPPED_LOCATION
3140 source_location saved_location
= input_location
;
3141 expanded_location xloc
= expand_location
(cl
);
3143 java_lc save_lc
= ctxp
->lexer
->token_start
;
3144 const char *saved
= ctxp
->filename
, *saved_input_filename
;
3149 text.err_no
= errno
;
3151 text.format_spec
= gmsgid
;
3152 pp_format
(global_dc
->printer
, &text
);
3153 pp_output_formatted_text
(global_dc
->printer
);
3154 strncpy
(buffer
, pp_formatted_text
(global_dc
->printer
), sizeof
(buffer
) - 1);
3155 buffer
[sizeof
(buffer
) - 1] = '\0';
3156 pp_clear_output_area
(global_dc
->printer
);
3160 #ifdef USE_MAPPED_LOCATION
3161 if
(xloc.file
!= NULL
)
3163 ctxp
->filename
= xloc.file
;
3164 input_location
= cl
;
3167 ctxp
->lexer
->token_start.line
= EXPR_WFL_LINENO
(cl
);
3168 ctxp
->lexer
->token_start.col
= (EXPR_WFL_COLNO
(cl
) == 0xfff ?
-1
3169 : EXPR_WFL_COLNO
(cl
) == 0xffe ?
-2
3170 : EXPR_WFL_COLNO
(cl
));
3172 /* We have a CL, that's a good reason for using it if it contains data */
3173 if
(TREE_CODE
(cl
) == EXPR_WITH_FILE_LOCATION
&& EXPR_WFL_FILENAME_NODE
(cl
))
3174 ctxp
->filename
= EXPR_WFL_FILENAME
(cl
);
3175 saved_input_filename
= input_filename
;
3176 input_filename
= ctxp
->filename
;
3179 java_error
(buffer
);
3180 #ifdef USE_MAPPED_LOCATION
3181 input_location
= saved_location
;
3183 ctxp
->filename
= saved
;
3184 input_filename
= saved_input_filename
;
3185 ctxp
->lexer
->token_start
= save_lc
;
3190 /* Issue an error message at a current source line CL.
3191 FUTURE/FIXME: change cl to be a source_location. */
3194 parse_error_context
(tree cl
, const char *gmsgid
, ...
)
3197 va_start
(ap
, gmsgid
);
3198 #ifdef USE_MAPPED_LOCATION
3199 issue_warning_error_from_context
(EXPR_LOCATION
(cl
), gmsgid
, &ap
);
3201 issue_warning_error_from_context
(cl
, gmsgid
, &ap
);
3206 /* Issue a warning at a current source line CL.
3207 FUTURE/FIXME: change cl to be a source_location. */
3210 parse_warning_context
(tree cl
, const char *gmsgid
, ...
)
3213 va_start
(ap
, gmsgid
);
3216 #ifdef USE_MAPPED_LOCATION
3217 issue_warning_error_from_context
(EXPR_LOCATION
(cl
), gmsgid
, &ap
);
3219 issue_warning_error_from_context
(cl
, gmsgid
, &ap
);
3226 find_expr_with_wfl
(tree node
)
3230 enum tree_code_class code
;
3233 switch
(TREE_CODE
(node
))
3236 node
= BLOCK_EXPR_BODY
(node
);
3240 to_return
= find_expr_with_wfl
(TREE_OPERAND
(node
, 0));
3243 node
= TREE_OPERAND
(node
, 1);
3247 node
= TREE_OPERAND
(node
, 0);
3250 case LABELED_BLOCK_EXPR
:
3251 node
= LABELED_BLOCK_BODY
(node
);
3255 code
= TREE_CODE_CLASS
(TREE_CODE
(node
));
3256 if
(((code
== tcc_unary
) ||
(code
== tcc_binary
)
3257 ||
(code
== tcc_expression
))
3258 && EXPR_WFL_LINECOL
(node
))
3266 /* Issue a missing return statement error. Uses METHOD to figure the
3267 last line of the method the error occurs in. */
3270 missing_return_error
(tree method
)
3272 #ifdef USE_MAPPED_LOCATION
3273 SET_EXPR_LOCATION
(wfl_operator
, DECL_FUNCTION_LAST_LINE
(method
));
3275 EXPR_WFL_SET_LINECOL
(wfl_operator
, DECL_FUNCTION_LAST_LINE
(method
), -2);
3277 parse_error_context
(wfl_operator
, "Missing return statement");
3280 /* Issue an unreachable statement error. From NODE, find the next
3281 statement to report appropriately. */
3283 unreachable_stmt_error
(tree node
)
3285 /* Browse node to find the next expression node that has a WFL. Use
3286 the location to report the error */
3287 if
(TREE_CODE
(node
) == COMPOUND_EXPR
)
3288 node
= find_expr_with_wfl
(TREE_OPERAND
(node
, 1));
3290 node
= find_expr_with_wfl
(node
);
3294 #ifdef USE_MAPPED_LOCATION
3295 SET_EXPR_LOCATION
(wfl_operator
, EXPR_LOCATION
(node
));
3297 EXPR_WFL_SET_LINECOL
(wfl_operator
, EXPR_WFL_LINENO
(node
), -2);
3299 parse_error_context
(wfl_operator
, "Unreachable statement");
3306 not_accessible_field_error
(tree wfl
, tree decl
)
3309 (wfl
, "Can't access %s field %<%s.%s%> from %qs",
3310 accessibility_string
(get_access_flags_from_decl
(decl
)),
3311 GET_TYPE_NAME
(DECL_CONTEXT
(decl
)),
3312 IDENTIFIER_POINTER
(DECL_NAME
(decl
)),
3313 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(current_class
))));
3318 java_report_errors
(void)
3320 if
(java_error_count
)
3321 fprintf
(stderr
, "%d error%s",
3322 java_error_count
, (java_error_count
== 1 ?
"" : "s"));
3323 if
(java_warning_count
)
3324 fprintf
(stderr
, "%s%d warning%s", (java_error_count ?
", " : ""),
3325 java_warning_count
, (java_warning_count
== 1 ?
"" : "s"));
3326 if
(java_error_count || java_warning_count
)
3327 putc
('\n', stderr
);
3328 return java_error_count
;
3332 java_accstring_lookup
(int flags
)
3334 static char buffer
[80];
3335 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
3337 /* Access modifier looked-up first for easier report on forbidden
3339 if
(flags
& ACC_PUBLIC
) COPY_RETURN
("public");
3340 if
(flags
& ACC_PRIVATE
) COPY_RETURN
("private");
3341 if
(flags
& ACC_PROTECTED
) COPY_RETURN
("protected");
3342 if
(flags
& ACC_STATIC
) COPY_RETURN
("static");
3343 if
(flags
& ACC_FINAL
) COPY_RETURN
("final");
3344 if
(flags
& ACC_SYNCHRONIZED
) COPY_RETURN
("synchronized");
3345 if
(flags
& ACC_VOLATILE
) COPY_RETURN
("volatile");
3346 if
(flags
& ACC_TRANSIENT
) COPY_RETURN
("transient");
3347 if
(flags
& ACC_NATIVE
) COPY_RETURN
("native");
3348 if
(flags
& ACC_INTERFACE
) COPY_RETURN
("interface");
3349 if
(flags
& ACC_ABSTRACT
) COPY_RETURN
("abstract");
3356 /* Returns a string denoting the accessibility of a class or a member as
3357 indicated by FLAGS. We need a separate function from
3358 java_accstring_lookup, as the latter can return spurious "static", etc.
3359 if package-private access is defined (in which case none of the
3360 relevant access control bits in FLAGS is set). */
3363 accessibility_string
(int flags
)
3365 if
(flags
& ACC_PRIVATE
) return
"private";
3366 if
(flags
& ACC_PROTECTED
) return
"protected";
3367 if
(flags
& ACC_PUBLIC
) return
"public";
3369 return
"package-private";
3372 /* Issuing error messages upon redefinition of classes, interfaces or
3376 classitf_redefinition_error
(const char *context
, tree id
, tree decl
, tree cl
)
3378 parse_error_context
(cl
, "%s %qs already defined in %s:%d",
3379 context
, IDENTIFIER_POINTER
(id
),
3380 DECL_SOURCE_FILE
(decl
), DECL_SOURCE_LINE
(decl
));
3381 /* Here we should point out where its redefined. It's a unicode. FIXME */
3385 variable_redefinition_error
(tree context
, tree name
, tree type
, int line
)
3387 const char *type_name
;
3389 /* Figure a proper name for type. We might haven't resolved it */
3390 if
(TREE_CODE
(type
) == POINTER_TYPE
&& !TREE_TYPE
(type
))
3391 type_name
= IDENTIFIER_POINTER
(TYPE_NAME
(type
));
3393 type_name
= lang_printable_name
(type
, 0);
3395 parse_error_context
(context
,
3396 "Variable %qs is already defined in this method and was declared %<%s %s%> at line %d",
3397 IDENTIFIER_POINTER
(name
),
3398 type_name
, IDENTIFIER_POINTER
(name
), line
);
3401 /* If ANAME is terminated with `[]', it indicates an array. This
3402 function returns the number of `[]' found and if this number is
3403 greater than zero, it extracts the array type name and places it in
3404 the node pointed to by TRIMMED unless TRIMMED is null. */
3407 build_type_name_from_array_name
(tree aname
, tree
*trimmed
)
3409 const char *name
= IDENTIFIER_POINTER
(aname
);
3410 int len
= IDENTIFIER_LENGTH
(aname
);
3413 STRING_STRIP_BRACKETS
(name
, len
, array_dims
);
3415 if
(array_dims
&& trimmed
)
3416 *trimmed
= get_identifier_with_length
(name
, len
);
3422 build_array_from_name
(tree type
, tree type_wfl
, tree name
, tree
*ret_name
)
3426 /* Eventually get more dims */
3427 more_dims
= build_type_name_from_array_name
(name
, &name
);
3429 /* If we have, then craft a new type for this variable */
3434 /* If we have a pointer, use its type */
3435 if
(TREE_CODE
(type
) == POINTER_TYPE
)
3436 type
= TREE_TYPE
(type
);
3438 /* Building the first dimension of a primitive type uses this
3440 if
(JPRIMITIVE_TYPE_P
(type
))
3442 type
= build_java_array_type
(type
, -1);
3445 /* Otherwise, if we have a WFL for this type, use it (the type
3446 is already an array on an unresolved type, and we just keep
3447 on adding dimensions) */
3451 more_dims
+= build_type_name_from_array_name
(TYPE_NAME
(save
),
3455 /* Add all the dimensions */
3457 type
= build_unresolved_array_type
(type
);
3459 /* The type may have been incomplete in the first place */
3461 type
= obtain_incomplete_type
(type
);
3469 /* Build something that the type identifier resolver will identify as
3470 being an array to an unresolved type. TYPE_WFL is a WFL on a
3474 build_unresolved_array_type
(tree type_or_wfl
)
3479 /* TYPE_OR_WFL might be an array on a resolved type. In this case,
3480 just create a array type */
3481 if
(TREE_CODE
(type_or_wfl
) == RECORD_TYPE
)
3482 return build_java_array_type
(type_or_wfl
, -1);
3484 obstack_grow
(&temporary_obstack
,
3485 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(type_or_wfl
)),
3486 IDENTIFIER_LENGTH
(EXPR_WFL_NODE
(type_or_wfl
)));
3487 obstack_grow0
(&temporary_obstack
, "[]", 2);
3488 ptr
= obstack_finish
(&temporary_obstack
);
3489 #ifdef USE_MAPPED_LOCATION
3490 wfl
= build_expr_wfl
(get_identifier
(ptr
), EXPR_LOCATION
(type_or_wfl
));
3492 wfl
= build_expr_wfl
(get_identifier
(ptr
),
3493 EXPR_WFL_FILENAME
(type_or_wfl
),
3494 EXPR_WFL_LINENO
(type_or_wfl
),
3495 EXPR_WFL_COLNO
(type_or_wfl
));
3497 /* Re-install the existing qualifications so that the type can be
3498 resolved properly. */
3499 EXPR_WFL_QUALIFICATION
(wfl
) = EXPR_WFL_QUALIFICATION
(type_or_wfl
);
3504 parser_add_interface
(tree class_decl
, tree interface_decl
, tree wfl
)
3506 if
(maybe_add_interface
(TREE_TYPE
(class_decl
), TREE_TYPE
(interface_decl
)))
3507 parse_error_context
(wfl
, "Interface %qs repeated",
3508 IDENTIFIER_POINTER
(DECL_NAME
(interface_decl
)));
3511 /* Bulk of common class/interface checks. Return 1 if an error was
3512 encountered. TAG is 0 for a class, 1 for an interface. */
3515 check_class_interface_creation
(int is_interface
, int flags
, tree raw_name
,
3516 tree qualified_name
, tree decl
, tree cl
)
3519 int sca
= 0; /* Static class allowed */
3520 int icaf
= 0; /* Inner class allowed flags */
3521 int uaaf
= CLASS_MODIFIERS
; /* Usually allowed access flags */
3524 fprintf
(stderr
, " %s%s %s",
3525 (CPC_INNER_P
() ?
"inner" : ""),
3526 (is_interface ?
"interface" : "class"),
3527 IDENTIFIER_POINTER
(qualified_name
));
3529 /* Scope of an interface/class type name:
3530 - Can't be imported by a single type import
3531 - Can't already exists in the package */
3532 if
(IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P
(raw_name
)
3533 && (node
= find_name_in_single_imports
(raw_name
))
3537 (cl
, "%s name %qs clashes with imported type %qs",
3538 (is_interface ?
"Interface" : "Class"),
3539 IDENTIFIER_POINTER
(raw_name
), IDENTIFIER_POINTER
(node
));
3542 if
(decl
&& CLASS_COMPLETE_P
(decl
))
3544 classitf_redefinition_error
((is_interface ?
"Interface" : "Class"),
3545 qualified_name
, decl
, cl
);
3549 if
(check_inner_class_redefinition
(raw_name
, cl
))
3552 /* If public, file name should match class/interface name, except
3553 when dealing with an inner class */
3554 if
(!CPC_INNER_P
() && (flags
& ACC_PUBLIC
))
3556 const char *fname
= input_filename
;
3559 for
(f
= fname
+ strlen
(fname
);
3560 f
!= fname
&& ! IS_DIR_SEPARATOR
(*f
);
3563 if
(IS_DIR_SEPARATOR
(*f
))
3565 if
(strncmp
(IDENTIFIER_POINTER
(raw_name
),
3566 f
, IDENTIFIER_LENGTH
(raw_name
)) ||
3567 f
[IDENTIFIER_LENGTH
(raw_name
)] != '.')
3569 (cl
, "Public %s %qs must be defined in a file called %<%s.java%>",
3570 (is_interface ?
"interface" : "class"),
3571 IDENTIFIER_POINTER
(qualified_name
),
3572 IDENTIFIER_POINTER
(raw_name
));
3575 /* Static classes can be declared only in top level classes. Note:
3576 once static, a inner class is a top level class. */
3577 if
(flags
& ACC_STATIC
)
3579 /* Catch the specific error of declaring an class inner class
3580 with no toplevel enclosing class. Prevent check_modifiers from
3581 complaining a second time */
3582 if
(CPC_INNER_P
() && !TOPLEVEL_CLASS_DECL_P
(GET_CPC
()))
3584 parse_error_context
(cl
, "Inner class %qs can't be static. Static classes can only occur in interfaces and top-level classes",
3585 IDENTIFIER_POINTER
(qualified_name
));
3588 /* Else, in the context of a top-level class declaration, let
3589 `check_modifiers' do its job, otherwise, give it a go */
3591 sca
= (GET_CPC_LIST
() ? ACC_STATIC
: 0);
3594 /* Inner classes can be declared private or protected
3595 within their enclosing classes. */
3598 /* A class which is local to a block can't be public, private,
3599 protected or static. But it is created final, so allow this
3601 if
(current_function_decl
)
3602 icaf
= sca
= uaaf
= ACC_FINAL
;
3605 check_modifiers_consistency
(flags
);
3606 icaf
= ACC_PROTECTED
;
3607 if
(! CLASS_INTERFACE
(GET_CPC
()))
3608 icaf |
= ACC_PRIVATE
;
3615 uaaf
= INTERFACE_INNER_MODIFIERS
;
3617 uaaf
= INTERFACE_MODIFIERS
;
3619 check_modifiers
("Illegal modifier %qs for interface declaration",
3623 check_modifiers
((current_function_decl ?
3624 "Illegal modifier %qs for local class declaration" :
3625 "Illegal modifier %qs for class declaration"),
3626 flags
, uaaf|sca|icaf
);
3630 /* Construct a nested class name. If the final component starts with
3631 a digit, return true. Otherwise return false. */
3633 make_nested_class_name
(tree cpc_list
)
3640 make_nested_class_name
(TREE_CHAIN
(cpc_list
));
3642 /* Pick the qualified name when dealing with the first upmost
3644 name
= (TREE_CHAIN
(cpc_list
)
3645 ? TREE_PURPOSE
(cpc_list
) : DECL_NAME
(TREE_VALUE
(cpc_list
)));
3646 obstack_grow
(&temporary_obstack
,
3647 IDENTIFIER_POINTER
(name
), IDENTIFIER_LENGTH
(name
));
3648 obstack_1grow
(&temporary_obstack
, '$');
3650 return ISDIGIT
(IDENTIFIER_POINTER
(name
)[0]);
3653 /* Can't redefine a class already defined in an earlier scope. */
3656 check_inner_class_redefinition
(tree raw_name
, tree cl
)
3660 for
(scope_list
= GET_CPC_LIST
(); scope_list
;
3661 scope_list
= GET_NEXT_ENCLOSING_CPC
(scope_list
))
3662 if
(raw_name
== GET_CPC_UN_NODE
(scope_list
))
3665 (cl
, "The class name %qs is already defined in this scope. An inner class may not have the same simple name as any of its enclosing classes",
3666 IDENTIFIER_POINTER
(raw_name
));
3672 /* Tries to find a decl for CLASS_TYPE within ENCLOSING. May return an
3673 invisible/non-accessible matching decl when an accessible one could not be
3674 found, in order to give a better error message when accessibility is
3678 resolve_inner_class
(tree context
, tree cl
, tree enclosing
, tree class_type
)
3680 tree local_super
= NULL_TREE
;
3681 tree candidate
= NULL_TREE
;
3683 /* This hash table is used to register the classes we're going
3684 through when searching the current class as an inner class, in
3685 order to detect circular references. */
3686 htab_t circularity_hash
= htab_create
(20, htab_hash_pointer
, htab_eq_pointer
,
3693 *htab_find_slot
(circularity_hash
, enclosing
, INSERT
) = enclosing
;
3695 if
((decl
= find_as_inner_class
(enclosing
, class_type
, cl
)))
3697 if
(inner_class_accessible
(decl
, context
))
3703 if
(candidate
== NULL_TREE
)
3707 /* Now go to the upper classes, bail out if necessary. We will
3708 analyze the returned SUPER and act accordingly (see
3709 do_resolve_class). */
3710 if
(JPRIMITIVE_TYPE_P
(TREE_TYPE
(enclosing
))
3711 || TREE_TYPE
(enclosing
) == void_type_node
)
3713 parse_error_context
(cl
, "Qualifier must be a reference");
3714 enclosing
= NULL_TREE
;
3717 local_super
= CLASSTYPE_SUPER
(TREE_TYPE
(enclosing
));
3718 if
(!local_super || local_super
== object_type_node
)
3721 if
(TREE_CODE
(local_super
) == POINTER_TYPE
)
3722 local_super
= do_resolve_class
(NULL
, NULL
, local_super
, NULL
, NULL
);
3724 local_super
= TYPE_NAME
(local_super
);
3726 /* We may not have checked for circular inheritance yet, so do so
3727 here to prevent an infinite loop. */
3728 if
(htab_find
(circularity_hash
, local_super
) != NULL
)
3731 cl
= lookup_cl
(enclosing
);
3734 (cl
, "Cyclic inheritance involving %s",
3735 IDENTIFIER_POINTER
(DECL_NAME
(enclosing
)));
3736 enclosing
= NULL_TREE
;
3739 enclosing
= local_super
;
3742 htab_delete
(circularity_hash
);
3744 /* We failed, but we might have found a matching class that wasn't
3745 accessible. Return that to get a better error message. */
3749 /* Within ENCLOSING, find a decl for NAME and return it. NAME can be
3753 find_as_inner_class
(tree enclosing
, tree name
, tree cl
)
3755 tree qual
, to_return
;
3759 name
= TYPE_NAME
(name
);
3761 /* First search: within the scope of `enclosing', search for name */
3762 if
(QUALIFIED_P
(name
) && cl
&& EXPR_WFL_NODE
(cl
) == name
)
3763 qual
= EXPR_WFL_QUALIFICATION
(cl
);
3765 qual
= build_tree_list
(cl
, NULL_TREE
);
3767 qual
= build_tree_list
(build_unknown_wfl
(name
), NULL_TREE
);
3769 if
((to_return
= find_as_inner_class_do
(qual
, enclosing
)))
3772 /* We're dealing with a qualified name. Try to resolve thing until
3773 we get something that is an enclosing class. */
3774 if
(QUALIFIED_P
(name
) && cl
&& EXPR_WFL_NODE
(cl
) == name
)
3776 tree acc
= NULL_TREE
, decl
= NULL_TREE
, ptr
;
3778 for
(qual
= EXPR_WFL_QUALIFICATION
(cl
); qual
&& !decl
;
3779 qual
= TREE_CHAIN
(qual
))
3781 acc
= merge_qualified_name
(acc
,
3782 EXPR_WFL_NODE
(TREE_PURPOSE
(qual
)));
3783 BUILD_PTR_FROM_NAME
(ptr
, acc
);
3784 decl
= do_resolve_class
(NULL_TREE
, NULL_TREE
, ptr
, NULL_TREE
, cl
);
3787 /* A NULL qual and a decl means that the search ended
3788 successfully?!? We have to do something then. FIXME */
3793 qual
= EXPR_WFL_QUALIFICATION
(cl
);
3795 /* Otherwise, create a qual for the other part of the resolution. */
3797 qual
= build_tree_list
(build_unknown_wfl
(name
), NULL_TREE
);
3799 return find_as_inner_class_do
(qual
, enclosing
);
3802 /* We go inside the list of sub classes and try to find a way
3806 find_as_inner_class_do
(tree qual
, tree enclosing
)
3811 for
(; qual
&& enclosing
; qual
= TREE_CHAIN
(qual
))
3813 tree name_to_match
= EXPR_WFL_NODE
(TREE_PURPOSE
(qual
));
3814 tree next_enclosing
= NULL_TREE
;
3817 for
(inner_list
= DECL_INNER_CLASS_LIST
(enclosing
);
3818 inner_list
; inner_list
= TREE_CHAIN
(inner_list
))
3820 if
(TREE_VALUE
(inner_list
) == name_to_match
)
3822 next_enclosing
= TREE_PURPOSE
(inner_list
);
3826 enclosing
= next_enclosing
;
3829 return
(!qual
&& enclosing ? enclosing
: NULL_TREE
);
3833 link_nested_class_to_enclosing
(void)
3835 if
(GET_ENCLOSING_CPC
())
3837 tree enclosing
= GET_ENCLOSING_CPC_CONTEXT
();
3838 DECL_INNER_CLASS_LIST
(enclosing
) =
3839 tree_cons
(GET_CPC
(), GET_CPC_UN
(),
3840 DECL_INNER_CLASS_LIST
(enclosing
));
3845 maybe_make_nested_class_name
(tree name
)
3847 tree id
= NULL_TREE
;
3851 /* If we're in a function, we must append a number to create the
3852 nested class name. However, we don't do this if the class we
3853 are constructing is anonymous, because in that case we'll
3854 already have a number as the class name. */
3855 if
(! make_nested_class_name
(GET_CPC_LIST
())
3856 && current_function_decl
!= NULL_TREE
3857 && ! ISDIGIT
(IDENTIFIER_POINTER
(name
)[0]))
3860 sprintf
(buf
, "%d", anonymous_class_counter
);
3861 ++anonymous_class_counter
;
3862 obstack_grow
(&temporary_obstack
, buf
, strlen
(buf
));
3863 obstack_1grow
(&temporary_obstack
, '$');
3865 obstack_grow0
(&temporary_obstack
,
3866 IDENTIFIER_POINTER
(name
),
3867 IDENTIFIER_LENGTH
(name
));
3868 id
= get_identifier
(obstack_finish
(&temporary_obstack
));
3870 QUALIFIED_P
(id
) = 1;
3875 /* If DECL is NULL, create and push a new DECL, record the current
3876 line CL and do other maintenance things. */
3879 maybe_create_class_interface_decl
(tree decl
, tree raw_name
,
3880 tree qualified_name
, tree cl
)
3883 decl
= push_class
(make_class
(), qualified_name
);
3885 /* Take care of the file and line business */
3886 #ifdef USE_MAPPED_LOCATION
3887 DECL_SOURCE_LOCATION
(decl
) = EXPR_LOCATION
(cl
);
3889 DECL_SOURCE_FILE
(decl
) = EXPR_WFL_FILENAME
(cl
);
3890 DECL_SOURCE_LINE
(decl
) = EXPR_WFL_LINENO
(cl
);
3892 CLASS_FROM_SOURCE_P
(TREE_TYPE
(decl
)) = 1;
3893 CLASS_PARSED_P
(TREE_TYPE
(decl
)) = 1;
3894 #ifdef USE_MAPPED_LOCATION
3896 tree tmp
= maybe_get_identifier
(EXPR_FILENAME
(cl
));
3897 CLASS_FROM_CURRENTLY_COMPILED_P
(TREE_TYPE
(decl
)) =
3898 tmp
&& IS_A_COMMAND_LINE_FILENAME_P
(tmp
);
3901 CLASS_FROM_CURRENTLY_COMPILED_P
(TREE_TYPE
(decl
)) =
3902 IS_A_COMMAND_LINE_FILENAME_P
(EXPR_WFL_FILENAME_NODE
(cl
));
3905 PUSH_CPC
(decl
, raw_name
);
3906 DECL_CONTEXT
(decl
) = GET_ENCLOSING_CPC_CONTEXT
();
3908 /* Link the declaration to the already seen ones */
3909 TREE_CHAIN
(decl
) = ctxp
->class_list
;
3910 ctxp
->class_list
= decl
;
3912 /* Create a new nodes in the global lists */
3913 gclass_list
= tree_cons
(NULL_TREE
, decl
, gclass_list
);
3914 all_class_list
= tree_cons
(NULL_TREE
, decl
, all_class_list
);
3916 /* Install a new dependency list element */
3917 create_jdep_list
(ctxp
);
3919 /* We keep the compilation unit imports in the class so that
3920 they can be used later to resolve type dependencies that
3921 aren't necessary to solve now. */
3922 TYPE_IMPORT_LIST
(TREE_TYPE
(decl
)) = ctxp
->import_list
;
3923 TYPE_IMPORT_DEMAND_LIST
(TREE_TYPE
(decl
)) = ctxp
->import_demand_list
;
3925 TYPE_PACKAGE
(TREE_TYPE
(decl
)) = ctxp
->package
;
3927 SOURCE_FRONTEND_DEBUG
(("Defining class/interface %s",
3928 IDENTIFIER_POINTER
(qualified_name
)));
3933 add_superinterfaces
(tree decl
, tree interface_list
)
3936 /* Superinterface(s): if present and defined, parser_check_super_interface ()
3937 takes care of ensuring that:
3938 - This is an accessible interface type,
3939 - Circularity detection.
3940 parser_add_interface is then called. If present but not defined,
3941 the check operation is delayed until the super interface gets
3943 for
(node
= interface_list
; node
; node
= TREE_CHAIN
(node
))
3945 tree current
= TREE_PURPOSE
(node
);
3946 tree idecl
= IDENTIFIER_CLASS_VALUE
(EXPR_WFL_NODE
(current
));
3947 if
(idecl
&& CLASS_LOADED_P
(TREE_TYPE
(idecl
)))
3949 if
(!parser_check_super_interface
(idecl
, decl
, current
))
3950 parser_add_interface
(decl
, idecl
, current
);
3953 register_incomplete_type
(JDEP_INTERFACE
,
3954 current
, decl
, NULL_TREE
);
3958 /* Create an interface in pass1 and return its decl. Return the
3959 interface's decl in pass 2. */
3962 create_interface
(int flags
, tree id
, tree super
)
3964 tree raw_name
= EXPR_WFL_NODE
(id
);
3965 tree q_name
= parser_qualified_classname
(raw_name
);
3966 tree decl
= IDENTIFIER_CLASS_VALUE
(q_name
);
3968 /* Certain syntax errors are making SUPER be like ID. Avoid this
3970 if
(ctxp
->class_err
&& id
== super
)
3973 EXPR_WFL_NODE
(id
) = q_name
; /* Keep source location, even if refined. */
3975 /* Basic checks: scope, redefinition, modifiers */
3976 if
(check_class_interface_creation
(1, flags
, raw_name
, q_name
, decl
, id
))
3982 /* Suspend the current parsing context if we're parsing an inner
3986 java_parser_context_suspend
();
3987 /* Interface members are public. */
3988 if
(CLASS_INTERFACE
(GET_CPC
()))
3989 flags |
= ACC_PUBLIC
;
3992 /* Push a new context for (static) initialized upon declaration fields */
3993 java_parser_context_push_initialized_field
();
3995 /* Interface modifiers check
3996 - public/abstract allowed (already done at that point)
3997 - abstract is obsolete (comes first, it's a warning, or should be)
3998 - Can't use twice the same (checked in the modifier rule) */
3999 if
((flags
& ACC_ABSTRACT
) && flag_redundant
)
4000 parse_warning_context
4001 (MODIFIER_WFL
(ABSTRACT_TK
),
4002 "Redundant use of %<abstract%> modifier. Interface %qs is implicitly abstract", IDENTIFIER_POINTER
(raw_name
));
4004 /* Create a new decl if DECL is NULL, otherwise fix it */
4005 decl
= maybe_create_class_interface_decl
(decl
, raw_name
, q_name
, id
);
4007 /* Interfaces are always abstract. */
4008 flags |
= ACC_ABSTRACT
;
4010 /* Inner interfaces are always static. */
4011 if
(INNER_CLASS_DECL_P
(decl
))
4012 flags |
= ACC_STATIC
;
4014 /* Set super info and mark the class a complete */
4015 set_super_info
(ACC_INTERFACE | flags
, TREE_TYPE
(decl
),
4016 object_type_node
, ctxp
->interface_number
);
4017 ctxp
->interface_number
= 0;
4018 CLASS_COMPLETE_P
(decl
) = 1;
4019 add_superinterfaces
(decl
, super
);
4021 /* Eventually sets the @deprecated tag flag */
4022 CHECK_DEPRECATED
(decl
);
4027 /* Patch anonymous class CLASS, by either extending or implementing
4031 patch_anonymous_class
(tree type_decl
, tree class_decl
, tree wfl
)
4033 tree class
= TREE_TYPE
(class_decl
);
4034 tree type
= TREE_TYPE
(type_decl
);
4035 tree binfo
= TYPE_BINFO
(class
);
4037 /* If it's an interface, implement it */
4038 if
(CLASS_INTERFACE
(type_decl
))
4040 if
(parser_check_super_interface
(type_decl
, class_decl
, wfl
))
4043 if
(!VEC_space
(tree
, BINFO_BASE_BINFOS
(binfo
), 1))
4045 /* Extend the binfo - by reallocating and copying it. */
4050 new_binfo
= make_tree_binfo
((BINFO_N_BASE_BINFOS
(binfo
) + 1) * 2);
4051 for
(i
= 0; BINFO_BASE_ITERATE
(binfo
, i
, base_binfo
); i
++)
4052 BINFO_BASE_APPEND
(new_binfo
, base_binfo
);
4053 CLASS_HAS_SUPER_FLAG
(new_binfo
) = CLASS_HAS_SUPER_FLAG
(binfo
);
4054 BINFO_VTABLE
(new_binfo
) = BINFO_VTABLE
(binfo
);
4055 TYPE_BINFO
(class
) = new_binfo
;
4058 /* And add the interface */
4059 parser_add_interface
(class_decl
, type_decl
, wfl
);
4061 /* Otherwise, it's a type we want to extend */
4064 if
(parser_check_super
(type_decl
, class_decl
, wfl
))
4066 BINFO_TYPE
(BINFO_BASE_BINFO
(binfo
, 0)) = type
;
4070 /* Create an anonymous class which extends/implements TYPE_NAME, and return
4074 create_anonymous_class
(tree type_name
)
4077 tree super
= NULL_TREE
, itf
= NULL_TREE
;
4078 tree id
, type_decl
, class
;
4080 /* The unqualified name of the anonymous class. It's just a number. */
4081 sprintf
(buffer
, "%d", anonymous_class_counter
++);
4082 id
= build_wfl_node
(get_identifier
(buffer
));
4083 EXPR_WFL_LINECOL
(id
) = EXPR_WFL_LINECOL
(type_name
);
4085 /* We know about the type to extend/implement. We go ahead */
4086 if
((type_decl
= IDENTIFIER_CLASS_VALUE
(EXPR_WFL_NODE
(type_name
))))
4088 /* Create a class which either implements on extends the designated
4089 class. The class bears an inaccessible name. */
4090 if
(CLASS_INTERFACE
(type_decl
))
4092 /* It's OK to modify it here. It's been already used and
4093 shouldn't be reused */
4094 ctxp
->interface_number
= 1;
4095 /* Interfaces should presented as a list of WFLs */
4096 itf
= build_tree_list
(type_name
, NULL_TREE
);
4102 class
= create_class
(ACC_FINAL
, id
, super
, itf
);
4104 /* We didn't know anything about the stuff. We register a dependence. */
4106 register_incomplete_type
(JDEP_ANONYMOUS
, type_name
, class
, NULL_TREE
);
4108 ANONYMOUS_CLASS_P
(TREE_TYPE
(class
)) = 1;
4112 /* Create a class in pass1 and return its decl. Return class
4113 interface's decl in pass 2. */
4116 create_class
(int flags
, tree id
, tree super
, tree interfaces
)
4118 tree raw_name
= EXPR_WFL_NODE
(id
);
4119 tree class_id
, decl
;
4120 tree super_decl_type
;
4122 /* Certain syntax errors are making SUPER be like ID. Avoid this
4124 if
(ctxp
->class_err
&& id
== super
)
4127 class_id
= parser_qualified_classname
(raw_name
);
4128 decl
= IDENTIFIER_CLASS_VALUE
(class_id
);
4129 EXPR_WFL_NODE
(id
) = class_id
;
4131 /* Basic check: scope, redefinition, modifiers */
4132 if
(check_class_interface_creation
(0, flags
, raw_name
, class_id
, decl
, id
))
4138 /* Suspend the current parsing context if we're parsing an inner
4139 class or an anonymous class. */
4142 java_parser_context_suspend
();
4143 /* Interface members are public. */
4144 if
(CLASS_INTERFACE
(GET_CPC
()))
4145 flags |
= ACC_PUBLIC
;
4148 /* Push a new context for (static) initialized upon declaration fields */
4149 java_parser_context_push_initialized_field
();
4151 /* Class modifier check:
4152 - Allowed modifier (already done at that point)
4153 - abstract AND final forbidden
4154 - Public classes defined in the correct file */
4155 if
((flags
& ACC_ABSTRACT
) && (flags
& ACC_FINAL
))
4157 (id
, "Class %qs can't be declared both abstract and final",
4158 IDENTIFIER_POINTER
(raw_name
));
4160 /* Create a new decl if DECL is NULL, otherwise fix it */
4161 decl
= maybe_create_class_interface_decl
(decl
, raw_name
, class_id
, id
);
4163 /* If SUPER exists, use it, otherwise use Object */
4166 /* java.lang.Object can't extend anything. */
4167 if
(TREE_TYPE
(IDENTIFIER_CLASS_VALUE
(class_id
)) == object_type_node
)
4169 parse_error_context
(id
, "%<java.lang.Object%> can't extend anything");
4174 register_incomplete_type
(JDEP_SUPER
, super
, decl
, NULL_TREE
);
4176 else if
(TREE_TYPE
(decl
) != object_type_node
)
4177 super_decl_type
= object_type_node
;
4178 /* We're defining java.lang.Object */
4180 super_decl_type
= NULL_TREE
;
4182 /* A class nested in an interface is implicitly static. */
4183 if
(INNER_CLASS_DECL_P
(decl
)
4184 && CLASS_INTERFACE
(TYPE_NAME
(TREE_TYPE
(DECL_CONTEXT
(decl
)))))
4186 flags |
= ACC_STATIC
;
4189 /* Set super info and mark the class as complete. */
4190 set_super_info
(flags
, TREE_TYPE
(decl
), super_decl_type
,
4191 ctxp
->interface_number
);
4192 ctxp
->interface_number
= 0;
4193 CLASS_COMPLETE_P
(decl
) = 1;
4194 add_superinterfaces
(decl
, interfaces
);
4196 /* TYPE_VFIELD' is a compiler-generated field used to point to
4197 virtual function tables. In gcj, every class has a common base
4198 virtual function table in java.lang.object. */
4199 TYPE_VFIELD
(TREE_TYPE
(decl
)) = TYPE_VFIELD
(object_type_node
);
4201 /* Add the private this$<n> field, Replicate final locals still in
4202 scope as private final fields mangled like val$<local_name>.
4203 This does not occur for top level (static) inner classes. */
4204 if
(PURE_INNER_CLASS_DECL_P
(decl
))
4205 add_inner_class_fields
(decl
, current_function_decl
);
4207 /* Eventually sets the @deprecated tag flag */
4208 CHECK_DEPRECATED
(decl
);
4210 /* Reset the anonymous class counter when declaring non inner classes */
4211 if
(!INNER_CLASS_DECL_P
(decl
))
4212 anonymous_class_counter
= 1;
4217 /* End a class declaration: register the statements used to create
4218 finit$ and <clinit>, pop the current class and resume the prior
4219 parser context if necessary. */
4222 end_class_declaration
(int resume
)
4224 /* If an error occurred, context weren't pushed and won't need to be
4225 popped by a resume. */
4226 int no_error_occurred
= ctxp
->next
&& GET_CPC
() != error_mark_node
;
4228 if
(GET_CPC
() != error_mark_node
)
4229 dump_java_tree
(TDI_class
, GET_CPC
());
4231 java_parser_context_pop_initialized_field
();
4233 if
(resume
&& no_error_occurred
)
4234 java_parser_context_resume
();
4236 /* We're ending a class declaration, this is a good time to reset
4237 the interface cout. Note that might have been already done in
4238 create_interface, but if at that time an inner class was being
4239 dealt with, the interface count was reset in a context created
4240 for the sake of handling inner classes declaration. */
4241 ctxp
->interface_number
= 0;
4245 add_inner_class_fields
(tree class_decl
, tree fct_decl
)
4247 tree block
, marker
, f
;
4249 f
= add_field
(TREE_TYPE
(class_decl
),
4250 build_current_thisn
(TREE_TYPE
(class_decl
)),
4251 build_pointer_type
(TREE_TYPE
(DECL_CONTEXT
(class_decl
))),
4253 FIELD_THISN
(f
) = 1;
4258 for
(block
= GET_CURRENT_BLOCK
(fct_decl
);
4259 block
&& TREE_CODE
(block
) == BLOCK
; block
= BLOCK_SUPERCONTEXT
(block
))
4262 for
(decl
= BLOCK_EXPR_DECLS
(block
); decl
; decl
= TREE_CHAIN
(decl
))
4265 tree wfl
, init
, list
;
4267 /* Avoid non final arguments. */
4268 if
(!LOCAL_FINAL_P
(decl
))
4271 MANGLE_OUTER_LOCAL_VARIABLE_NAME
(name
, DECL_NAME
(decl
));
4272 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID
(pname
, DECL_NAME
(decl
));
4273 wfl
= build_wfl_node
(name
);
4274 init
= build_wfl_node
(pname
);
4275 /* Build an initialization for the field: it will be
4276 initialized by a parameter added to finit$, bearing a
4277 mangled name of the field itself (param$<n>.) The
4278 parameter is provided to finit$ by the constructor
4279 invoking it (hence the constructor will also feature a
4280 hidden parameter, set to the value of the outer context
4281 local at the time the inner class is created.)
4283 Note: we take into account all possible locals that can
4284 be accessed by the inner class. It's actually not trivial
4285 to minimize these aliases down to the ones really
4286 used. One way to do that would be to expand all regular
4287 methods first, then finit$ to get a picture of what's
4288 used. It works with the exception that we would have to
4289 go back on all constructor invoked in regular methods to
4290 have their invocation reworked (to include the right amount
4291 of alias initializer parameters.)
4293 The only real way around, I think, is a first pass to
4294 identify locals really used in the inner class. We leave
4295 the flag FIELD_LOCAL_ALIAS_USED around for that future
4298 On the other hand, it only affect local inner classes,
4299 whose constructors (and finit$ call) will be featuring
4300 unnecessary arguments. It's easy for a developer to keep
4301 this number of parameter down by using the `final'
4302 keyword only when necessary. For the time being, we can
4303 issue a warning on unnecessary finals. FIXME */
4304 init
= build_assignment
(ASSIGN_TK
, EXPR_WFL_LINECOL
(wfl
),
4307 /* Register the field. The TREE_LIST holding the part
4308 initialized/initializer will be marked ARG_FINAL_P so
4309 that the created field can be marked
4310 FIELD_LOCAL_ALIAS. */
4311 list
= build_tree_list
(wfl
, init
);
4312 ARG_FINAL_P
(list
) = 1;
4313 register_fields
(ACC_PRIVATE | ACC_FINAL
, TREE_TYPE
(decl
), list
);
4317 if
(!CPC_INITIALIZER_STMT
(ctxp
))
4320 /* If we ever registered an alias field, insert and marker to
4321 remember where the list ends. The second part of the list (the one
4322 featuring initialized fields) so it can be later reversed to
4323 enforce 8.5. The marker will be removed during that operation. */
4324 marker
= build_tree_list
(NULL_TREE
, NULL_TREE
);
4325 TREE_CHAIN
(marker
) = CPC_INITIALIZER_STMT
(ctxp
);
4326 SET_CPC_INITIALIZER_STMT
(ctxp
, marker
);
4329 /* Can't use lookup_field () since we don't want to load the class and
4330 can't set the CLASS_LOADED_P flag */
4333 find_field
(tree class
, tree name
)
4336 for
(decl
= TYPE_FIELDS
(class
); decl
; decl
= TREE_CHAIN
(decl
))
4338 if
(DECL_NAME
(decl
) == name
)
4344 /* Wrap around lookup_field that doesn't potentially upset the value
4348 lookup_field_wrapper
(tree class
, tree name
)
4351 tree decl
= NULL_TREE
;
4352 java_parser_context_save_global
();
4354 /* Last chance: if we're within the context of an inner class, we
4355 might be trying to access a local variable defined in an outer
4356 context. We try to look for it now. */
4357 if
(INNER_CLASS_TYPE_P
(class
) && TREE_CODE
(name
) == IDENTIFIER_NODE
)
4360 MANGLE_OUTER_LOCAL_VARIABLE_NAME
(new_name
, name
);
4361 decl
= lookup_field
(&type
, new_name
);
4362 if
(decl
&& decl
!= error_mark_node
)
4363 FIELD_LOCAL_ALIAS_USED
(decl
) = 1;
4365 if
(!decl || decl
== error_mark_node
)
4368 decl
= lookup_field
(&type
, name
);
4371 /* If the field still hasn't been found, try the next enclosing context. */
4372 if
(!decl
&& INNER_CLASS_TYPE_P
(class
))
4374 tree outer_type
= TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(class
)));
4375 decl
= lookup_field_wrapper
(outer_type
, name
);
4378 java_parser_context_restore_global
();
4379 return decl
== error_mark_node ? NULL
: decl
;
4382 /* Find duplicate field within the same class declarations and report
4383 the error. Returns 1 if a duplicated field was found, 0
4387 duplicate_declaration_error_p
(tree new_field_name
, tree new_type
, tree cl
)
4389 /* This might be modified to work with method decl as well */
4390 tree decl
= find_field
(TREE_TYPE
(GET_CPC
()), new_field_name
);
4393 char *t1
= xstrdup
(purify_type_name
4394 ((TREE_CODE
(new_type
) == POINTER_TYPE
4395 && TREE_TYPE
(new_type
) == NULL_TREE
) ?
4396 IDENTIFIER_POINTER
(TYPE_NAME
(new_type
)) :
4397 lang_printable_name
(new_type
, 1)));
4398 /* The type may not have been completed by the time we report
4400 char *t2
= xstrdup
(purify_type_name
4401 ((TREE_CODE
(TREE_TYPE
(decl
)) == POINTER_TYPE
4402 && TREE_TYPE
(TREE_TYPE
(decl
)) == NULL_TREE
) ?
4403 IDENTIFIER_POINTER
(TYPE_NAME
(TREE_TYPE
(decl
))) :
4404 lang_printable_name
(TREE_TYPE
(decl
), 1)));
4406 (cl
, "Duplicate variable declaration: %<%s %s%> was %<%s %s%> (%s:%d)",
4407 t1
, IDENTIFIER_POINTER
(new_field_name
),
4408 t2
, IDENTIFIER_POINTER
(DECL_NAME
(decl
)),
4409 DECL_SOURCE_FILE
(decl
), DECL_SOURCE_LINE
(decl
));
4417 /* Field registration routine. If TYPE doesn't exist, field
4418 declarations are linked to the undefined TYPE dependency list, to
4419 be later resolved in java_complete_class () */
4422 register_fields
(int flags
, tree type
, tree variable_list
)
4424 tree current
, saved_type
;
4425 tree class_type
= NULL_TREE
;
4426 location_t saved_location
= input_location
;
4428 tree wfl
= NULL_TREE
;
4431 class_type
= TREE_TYPE
(GET_CPC
());
4433 if
(!class_type || class_type
== error_mark_node
)
4436 /* If we're adding fields to interfaces, those fields are public,
4438 if
(CLASS_INTERFACE
(TYPE_NAME
(class_type
)))
4440 OBSOLETE_MODIFIER_WARNING
(MODIFIER_WFL
(PUBLIC_TK
),
4441 flags
, ACC_PUBLIC
, "interface field(s)");
4442 OBSOLETE_MODIFIER_WARNING
(MODIFIER_WFL
(STATIC_TK
),
4443 flags
, ACC_STATIC
, "interface field(s)");
4444 OBSOLETE_MODIFIER_WARNING
(MODIFIER_WFL
(FINAL_TK
),
4445 flags
, ACC_FINAL
, "interface field(s)");
4446 check_modifiers
("Illegal interface member modifier %qs", flags
,
4447 INTERFACE_FIELD_MODIFIERS
);
4448 flags |
= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL
);
4451 /* Obtain a suitable type for resolution, if necessary */
4452 SET_TYPE_FOR_RESOLUTION
(type
, wfl
, must_chain
);
4454 /* If TYPE is fully resolved and we don't have a reference, make one */
4455 PROMOTE_RECORD_IF_COMPLETE
(type
, must_chain
);
4457 for
(current
= variable_list
, saved_type
= type
; current
;
4458 current
= TREE_CHAIN
(current
), type
= saved_type
)
4462 tree cl
= TREE_PURPOSE
(current
);
4463 tree init
= TREE_VALUE
(current
);
4464 tree current_name
= EXPR_WFL_NODE
(cl
);
4466 /* Can't declare non-final static fields in inner classes */
4467 if
((flags
& ACC_STATIC
) && !TOPLEVEL_CLASS_TYPE_P
(class_type
)
4468 && !(flags
& ACC_FINAL
))
4470 (cl
, "Field %qs can't be static in inner class %qs unless it is final",
4471 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(cl
)),
4472 lang_printable_name
(class_type
, 0));
4474 /* Process NAME, as it may specify extra dimension(s) for it */
4475 type
= build_array_from_name
(type
, wfl
, current_name
, ¤t_name
);
4477 /* Type adjustment. We may have just readjusted TYPE because
4478 the variable specified more dimensions. Make sure we have
4479 a reference if we can and don't have one already. Also
4480 change the name if we have an init. */
4481 if
(type
!= saved_type
)
4483 PROMOTE_RECORD_IF_COMPLETE
(type
, must_chain
);
4485 EXPR_WFL_NODE
(TREE_OPERAND
(init
, 0)) = current_name
;
4488 real_type
= GET_REAL_TYPE
(type
);
4489 /* Check for redeclarations */
4490 if
(duplicate_declaration_error_p
(current_name
, real_type
, cl
))
4493 /* Set input_line to the line the field was found and create a
4494 declaration for it. Eventually sets the @deprecated tag flag. */
4495 #ifdef USE_MAPPED_LOCATION
4496 input_location
= EXPR_LOCATION
(cl
);
4498 input_line
= EXPR_WFL_LINENO
(cl
);
4500 field_decl
= add_field
(class_type
, current_name
, real_type
, flags
);
4501 CHECK_DEPRECATED_NO_RESET
(field_decl
);
4503 /* If the field denotes a final instance variable, then we
4504 allocate a LANG_DECL_SPECIFIC part to keep track of its
4505 initialization. We also mark whether the field was
4506 initialized upon its declaration. We don't do that if the
4507 created field is an alias to a final local. */
4508 if
(!ARG_FINAL_P
(current
) && (flags
& ACC_FINAL
))
4510 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC
(field_decl
);
4511 DECL_FIELD_FINAL_WFL
(field_decl
) = cl
;
4514 /* If the couple initializer/initialized is marked ARG_FINAL_P,
4515 we mark the created field FIELD_LOCAL_ALIAS, so that we can
4516 hide parameters to this inner class finit$ and
4517 constructors. It also means that the field isn't final per
4519 if
(ARG_FINAL_P
(current
))
4521 FIELD_LOCAL_ALIAS
(field_decl
) = 1;
4522 FIELD_FINAL
(field_decl
) = 0;
4525 /* Check if we must chain. */
4527 register_incomplete_type
(JDEP_FIELD
, wfl
, field_decl
, type
);
4529 /* If we have an initialization value tied to the field */
4532 /* The field is declared static */
4533 if
(flags
& ACC_STATIC
)
4535 /* We include the field and its initialization part into
4536 a list used to generate <clinit>. After <clinit> is
4537 walked, field initializations will be processed and
4538 fields initialized with known constants will be taken
4539 out of <clinit> and have their DECL_INITIAL set
4541 TREE_CHAIN
(init
) = CPC_STATIC_INITIALIZER_STMT
(ctxp
);
4542 SET_CPC_STATIC_INITIALIZER_STMT
(ctxp
, init
);
4543 if
(TREE_OPERAND
(init
, 1)
4544 && TREE_CODE
(TREE_OPERAND
(init
, 1)) == NEW_ARRAY_INIT
)
4545 TREE_STATIC
(TREE_OPERAND
(init
, 1)) = 1;
4547 /* A non-static field declared with an immediate initialization is
4548 to be initialized in <init>, if any. This field is remembered
4549 to be processed at the time of the generation of <init>. */
4552 TREE_CHAIN
(init
) = CPC_INITIALIZER_STMT
(ctxp
);
4553 SET_CPC_INITIALIZER_STMT
(ctxp
, init
);
4555 MODIFY_EXPR_FROM_INITIALIZATION_P
(init
) = 1;
4556 DECL_INITIAL
(field_decl
) = TREE_OPERAND
(init
, 1);
4561 input_location
= saved_location
;
4564 /* Generate finit$, using the list of initialized fields to populate
4565 its body. finit$'s parameter(s) list is adjusted to include the
4566 one(s) used to initialized the field(s) caching outer context
4570 generate_finit
(tree class_type
)
4573 tree list
= TYPE_FINIT_STMT_LIST
(class_type
);
4574 tree mdecl
, current
, parms
;
4576 parms
= build_alias_initializer_parameter_list
(AIPL_FUNCTION_CREATION
,
4577 class_type
, NULL_TREE
,
4579 CRAFTED_PARAM_LIST_FIXUP
(parms
);
4580 mdecl
= create_artificial_method
(class_type
, ACC_PRIVATE
, void_type_node
,
4581 finit_identifier_node
, parms
);
4582 fix_method_argument_names
(parms
, mdecl
);
4583 layout_class_method
(class_type
, CLASSTYPE_SUPER
(class_type
),
4585 DECL_FUNCTION_NAP
(mdecl
) = count
;
4586 start_artificial_method_body
(mdecl
);
4588 for
(current
= list
; current
; current
= TREE_CHAIN
(current
))
4589 java_method_add_stmt
(mdecl
,
4590 build_debugable_stmt
(EXPR_WFL_LINECOL
(current
),
4592 end_artificial_method_body
(mdecl
);
4596 /* Generate a function to run the instance initialization code. The
4597 private method is called `instinit$'. Unless we're dealing with an
4598 anonymous class, we determine whether all ctors of CLASS_TYPE
4599 declare a checked exception in their `throws' clause in order to
4600 see whether it's necessary to encapsulate the instance initializer
4601 statements in a try/catch/rethrow sequence. */
4604 generate_instinit
(tree class_type
)
4607 tree compound
= NULL_TREE
;
4608 tree parms
= tree_cons
(this_identifier_node
,
4609 build_pointer_type
(class_type
), end_params_node
);
4610 tree mdecl
= create_artificial_method
(class_type
, ACC_PRIVATE
,
4612 instinit_identifier_node
, parms
);
4614 layout_class_method
(class_type
, CLASSTYPE_SUPER
(class_type
),
4617 /* Gather all the statements in a compound */
4618 for
(current
= TYPE_II_STMT_LIST
(class_type
);
4619 current
; current
= TREE_CHAIN
(current
))
4620 compound
= add_stmt_to_compound
(compound
, NULL_TREE
, current
);
4622 /* We need to encapsulate COMPOUND by a try/catch statement to
4623 rethrow exceptions that might occur in the instance initializer.
4624 We do that only if all ctors of CLASS_TYPE are set to catch a
4625 checked exception. This doesn't apply to anonymous classes (since
4626 they don't have declared ctors.) */
4627 if
(!ANONYMOUS_CLASS_P
(class_type
) &&
4628 ctors_unchecked_throws_clause_p
(class_type
))
4630 compound
= encapsulate_with_try_catch
(0, exception_type_node
, compound
,
4631 build1
(THROW_EXPR
, NULL_TREE
,
4632 build_wfl_node
(wpv_id
)));
4633 DECL_FUNCTION_THROWS
(mdecl
) = build_tree_list
(NULL_TREE
,
4634 exception_type_node
);
4637 start_artificial_method_body
(mdecl
);
4638 java_method_add_stmt
(mdecl
, compound
);
4639 end_artificial_method_body
(mdecl
);
4646 build_instinit_invocation
(tree class_type
)
4648 tree to_return
= NULL_TREE
;
4650 if
(TYPE_II_STMT_LIST
(class_type
))
4652 tree parm
= build_tree_list
(NULL_TREE
,
4653 build_wfl_node
(this_identifier_node
));
4655 build_method_invocation
(build_wfl_node
(instinit_identifier_node
),
4661 /* Shared across method_declarator and method_header to remember the
4662 patch stage that was reached during the declaration of the method.
4663 A method DECL is built differently is there is no patch
4664 (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
4665 pending on the currently defined method. */
4667 static int patch_stage
;
4669 /* Check the method declaration and add the method to its current
4670 class. If the argument list is known to contain incomplete types,
4671 the method is partially added and the registration will be resume
4672 once the method arguments resolved. If TYPE is NULL, we're dealing
4673 with a constructor. */
4676 method_header
(int flags
, tree type
, tree mdecl
, tree throws
)
4678 tree type_wfl
= NULL_TREE
;
4679 tree meth_name
= NULL_TREE
;
4680 tree current
, orig_arg
, this_class
= NULL
;
4682 location_t saved_location
;
4683 int constructor_ok
= 0, must_chain
;
4686 if
(mdecl
== error_mark_node
)
4687 return error_mark_node
;
4688 meth
= TREE_VALUE
(mdecl
);
4689 id
= TREE_PURPOSE
(mdecl
);
4691 check_modifiers_consistency
(flags
);
4694 this_class
= TREE_TYPE
(GET_CPC
());
4696 if
(!this_class || this_class
== error_mark_node
)
4699 /* There are some forbidden modifiers for an abstract method and its
4700 class must be abstract as well. */
4701 if
(type
&& (flags
& ACC_ABSTRACT
))
4703 ABSTRACT_CHECK
(flags
, ACC_PRIVATE
, id
, "Private");
4704 ABSTRACT_CHECK
(flags
, ACC_STATIC
, id
, "Static");
4705 ABSTRACT_CHECK
(flags
, ACC_FINAL
, id
, "Final");
4706 ABSTRACT_CHECK
(flags
, ACC_NATIVE
, id
, "Native");
4707 ABSTRACT_CHECK
(flags
, ACC_SYNCHRONIZED
, id
, "Synchronized");
4708 ABSTRACT_CHECK
(flags
, ACC_STRICT
, id
, "Strictfp");
4709 if
(!CLASS_ABSTRACT
(TYPE_NAME
(this_class
))
4710 && !CLASS_INTERFACE
(TYPE_NAME
(this_class
)))
4713 "Class %qs must be declared abstract to define abstract method %qs",
4714 IDENTIFIER_POINTER
(DECL_NAME
(GET_CPC
())),
4715 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(id
)));
4718 /* A native method can't be strictfp. */
4719 if
((flags
& ACC_NATIVE
) && (flags
& ACC_STRICT
))
4720 parse_error_context
(id
, "native method %qs can't be strictfp",
4721 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(id
)));
4722 /* No such thing as a transient or volatile method. */
4723 if
((flags
& ACC_TRANSIENT
))
4724 parse_error_context
(id
, "method %qs can't be transient",
4725 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(id
)));
4726 if
((flags
& ACC_VOLATILE
))
4727 parse_error_context
(id
, "method %qs can't be volatile",
4728 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(id
)));
4730 /* Things to be checked when declaring a constructor */
4733 int ec
= java_error_count
;
4734 /* 8.6: Constructor declarations: we might be trying to define a
4735 method without specifying a return type. */
4736 if
(EXPR_WFL_NODE
(id
) != GET_CPC_UN
())
4738 (id
, "Invalid method declaration, return type required");
4739 /* 8.6.3: Constructor modifiers */
4742 JCONSTRUCTOR_CHECK
(flags
, ACC_ABSTRACT
, id
, "abstract");
4743 JCONSTRUCTOR_CHECK
(flags
, ACC_STATIC
, id
, "static");
4744 JCONSTRUCTOR_CHECK
(flags
, ACC_FINAL
, id
, "final");
4745 JCONSTRUCTOR_CHECK
(flags
, ACC_NATIVE
, id
, "native");
4746 JCONSTRUCTOR_CHECK
(flags
, ACC_SYNCHRONIZED
, id
, "synchronized");
4747 JCONSTRUCTOR_CHECK
(flags
, ACC_STRICT
, id
, "strictfp");
4749 /* If we found error here, we don't consider it's OK to tread
4750 the method definition as a constructor, for the rest of this
4752 if
(ec
== java_error_count
)
4756 /* Method declared within the scope of an interface are implicitly
4757 abstract and public. Conflicts with other erroneously provided
4758 modifiers are checked right after. */
4760 if
(CLASS_INTERFACE
(TYPE_NAME
(this_class
)))
4762 /* If FLAGS isn't set because of a modifier, turn the
4763 corresponding modifier WFL to NULL so we issue a warning on
4764 the obsolete use of the modifier */
4765 if
(!(flags
& ACC_PUBLIC
))
4766 MODIFIER_WFL
(PUBLIC_TK
) = NULL
;
4767 if
(!(flags
& ACC_ABSTRACT
))
4768 MODIFIER_WFL
(ABSTRACT_TK
) = NULL
;
4769 flags |
= ACC_PUBLIC
;
4770 flags |
= ACC_ABSTRACT
;
4773 /* Inner class can't declare static methods */
4774 if
((flags
& ACC_STATIC
) && !TOPLEVEL_CLASS_TYPE_P
(this_class
))
4777 (id
, "Method %qs can't be static in inner class %qs. Only members of interfaces and top-level classes can be static",
4778 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(id
)),
4779 lang_printable_name
(this_class
, 0));
4782 /* Modifiers context reset moved up, so abstract method declaration
4783 modifiers can be later checked. */
4785 /* Set constructor returned type to void and method name to <init>,
4786 unless we found an error identifier the constructor (in which
4787 case we retain the original name) */
4790 type
= void_type_node
;
4792 meth_name
= init_identifier_node
;
4795 meth_name
= EXPR_WFL_NODE
(id
);
4797 /* Do the returned type resolution and registration if necessary */
4798 SET_TYPE_FOR_RESOLUTION
(type
, type_wfl
, must_chain
);
4801 type
= build_array_from_name
(type
, type_wfl
, meth_name
, &meth_name
);
4802 EXPR_WFL_NODE
(id
) = meth_name
;
4803 PROMOTE_RECORD_IF_COMPLETE
(type
, must_chain
);
4807 patch_stage
= JDEP_METHOD_RETURN
;
4808 register_incomplete_type
(patch_stage
, type_wfl
, id
, type
);
4809 TREE_TYPE
(meth
) = GET_REAL_TYPE
(type
);
4812 TREE_TYPE
(meth
) = type
;
4814 saved_location
= input_location
;
4815 /* When defining an abstract or interface method, the curly
4816 bracket at level 1 doesn't exist because there is no function
4818 #ifdef USE_MAPPED_LOCATION
4819 input_location
= (ctxp
->first_ccb_indent1 ? ctxp
->first_ccb_indent1
:
4820 EXPR_LOCATION
(id
));
4822 input_line
= (ctxp
->first_ccb_indent1 ?
(int) ctxp
->first_ccb_indent1
:
4823 EXPR_WFL_LINENO
(id
));
4826 /* Remember the original argument list */
4827 orig_arg
= TYPE_ARG_TYPES
(meth
);
4829 if
(patch_stage
) /* includes ret type and/or all args */
4832 meth
= add_method_1
(this_class
, flags
, meth_name
, meth
);
4833 /* Patch for the return type */
4834 if
(patch_stage
== JDEP_METHOD_RETURN
)
4836 jdep
= CLASSD_LAST
(ctxp
->classd_list
);
4837 JDEP_GET_PATCH
(jdep
) = &TREE_TYPE
(TREE_TYPE
(meth
));
4839 /* This is the stop JDEP. METH allows the function's signature
4841 register_incomplete_type
(JDEP_METHOD_END
, NULL_TREE
, meth
, NULL_TREE
);
4844 meth
= add_method
(this_class
, flags
, meth_name
,
4845 build_java_signature
(meth
));
4847 /* Remember final parameters */
4848 MARK_FINAL_PARMS
(meth
, orig_arg
);
4850 /* Fix the method argument list so we have the argument name
4852 fix_method_argument_names
(orig_arg
, meth
);
4854 /* Register the parameter number and re-install the current line
4856 DECL_MAX_LOCALS
(meth
) = ctxp
->formal_parameter_number
+1;
4857 input_location
= saved_location
;
4859 /* Register exception specified by the `throws' keyword for
4860 resolution and set the method decl appropriate field to the list.
4861 Note: the grammar ensures that what we get here are class
4865 throws
= nreverse
(throws
);
4866 for
(current
= throws
; current
; current
= TREE_CHAIN
(current
))
4868 register_incomplete_type
(JDEP_EXCEPTION
, TREE_VALUE
(current
),
4869 NULL_TREE
, NULL_TREE
);
4870 JDEP_GET_PATCH
(CLASSD_LAST
(ctxp
->classd_list
)) =
4871 &TREE_VALUE
(current
);
4873 DECL_FUNCTION_THROWS
(meth
) = throws
;
4876 if
(TREE_TYPE
(GET_CPC
()) != object_type_node
)
4877 DECL_FUNCTION_WFL
(meth
) = id
;
4879 /* Set the flag if we correctly processed a constructor */
4882 DECL_CONSTRUCTOR_P
(meth
) = 1;
4883 /* Compute and store the number of artificial parameters declared
4884 for this constructor */
4885 for
(count
= 0, current
= TYPE_FIELDS
(this_class
); current
;
4886 current
= TREE_CHAIN
(current
))
4887 if
(FIELD_LOCAL_ALIAS
(current
))
4889 DECL_FUNCTION_NAP
(meth
) = count
;
4892 /* Eventually set the @deprecated tag flag */
4893 CHECK_DEPRECATED
(meth
);
4899 fix_method_argument_names
(tree orig_arg
, tree meth
)
4901 tree arg
= TYPE_ARG_TYPES
(TREE_TYPE
(meth
));
4902 if
(TREE_CODE
(TREE_TYPE
(meth
)) == METHOD_TYPE
)
4904 TREE_PURPOSE
(arg
) = this_identifier_node
;
4905 arg
= TREE_CHAIN
(arg
);
4907 while
(orig_arg
!= end_params_node
)
4909 TREE_PURPOSE
(arg
) = TREE_PURPOSE
(orig_arg
);
4910 orig_arg
= TREE_CHAIN
(orig_arg
);
4911 arg
= TREE_CHAIN
(arg
);
4915 /* Complete the method declaration with METHOD_BODY. */
4918 finish_method_declaration
(tree method_body
)
4922 if
(!current_function_decl
)
4925 flags
= get_access_flags_from_decl
(current_function_decl
);
4927 /* 8.4.5 Method Body */
4928 if
((flags
& ACC_ABSTRACT || flags
& ACC_NATIVE
) && method_body
)
4930 tree name
= DECL_NAME
(current_function_decl
);
4931 parse_error_context
(DECL_FUNCTION_WFL
(current_function_decl
),
4932 "%s method %qs can't have a body defined",
4933 (METHOD_NATIVE
(current_function_decl
) ?
4934 "Native" : "Abstract"),
4935 IDENTIFIER_POINTER
(name
));
4936 method_body
= NULL_TREE
;
4938 else if
(!(flags
& ACC_ABSTRACT
) && !(flags
& ACC_NATIVE
) && !method_body
)
4940 tree name
= DECL_NAME
(current_function_decl
);
4942 (DECL_FUNCTION_WFL
(current_function_decl
),
4943 "Non native and non abstract method %qs must have a body defined",
4944 IDENTIFIER_POINTER
(name
));
4945 method_body
= NULL_TREE
;
4948 if
(flag_emit_class_files
&& method_body
4949 && TREE_CODE
(method_body
) == NOP_EXPR
4950 && TREE_TYPE
(current_function_decl
)
4951 && TREE_TYPE
(TREE_TYPE
(current_function_decl
)) == void_type_node
)
4952 method_body
= build1
(RETURN_EXPR
, void_type_node
, NULL
);
4954 BLOCK_EXPR_BODY
(DECL_FUNCTION_BODY
(current_function_decl
)) = method_body
;
4955 maybe_absorb_scoping_blocks
();
4956 /* Exit function's body */
4958 /* Merge last line of the function with first line, directly in the
4959 function decl. It will be used to emit correct debug info. */
4960 DECL_FUNCTION_LAST_LINE
(current_function_decl
) = ctxp
->last_ccb_indent1
;
4962 /* Since function's argument's list are shared, reset the
4963 ARG_FINAL_P parameter that might have been set on some of this
4964 function parameters. */
4965 UNMARK_FINAL_PARMS
(current_function_decl
);
4967 /* So we don't have an irrelevant function declaration context for
4968 the next static block we'll see. */
4969 current_function_decl
= NULL_TREE
;
4972 /* Build a an error message for constructor circularity errors. */
4975 constructor_circularity_msg
(tree from
, tree to
)
4977 static char string [4096];
4978 char *t
= xstrdup
(lang_printable_name
(from
, 2));
4979 sprintf
(string, "'%s' invokes '%s'", t
, lang_printable_name
(to
, 2));
4984 /* Verify a circular call to METH. Return 1 if an error is found, 0
4987 static GTY
(()) tree vcc_list
;
4989 verify_constructor_circularity
(tree meth
, tree current
)
4993 for
(c
= DECL_CONSTRUCTOR_CALLS
(current
); c
; c
= TREE_CHAIN
(c
))
4995 if
(TREE_VALUE
(c
) == meth
)
5001 vcc_list
= nreverse
(vcc_list
);
5002 for
(liste
= vcc_list
; liste
; liste
= TREE_CHAIN
(liste
))
5005 (TREE_PURPOSE
(TREE_PURPOSE
(liste
)), "%s",
5006 constructor_circularity_msg
5007 (TREE_VALUE
(liste
), TREE_VALUE
(TREE_PURPOSE
(liste
))));
5011 t
= xstrdup
(lang_printable_name
(meth
, 2));
5012 parse_error_context
(TREE_PURPOSE
(c
),
5013 "%s: recursive invocation of constructor %qs",
5014 constructor_circularity_msg
(current
, meth
), t
);
5016 vcc_list
= NULL_TREE
;
5020 for
(c
= DECL_CONSTRUCTOR_CALLS
(current
); c
; c
= TREE_CHAIN
(c
))
5022 vcc_list
= tree_cons
(c
, current
, vcc_list
);
5023 if
(verify_constructor_circularity
(meth
, TREE_VALUE
(c
)))
5025 vcc_list
= TREE_CHAIN
(vcc_list
);
5030 /* Check modifiers that can be declared but exclusively */
5033 check_modifiers_consistency
(int flags
)
5036 tree cl
= NULL_TREE
;
5038 THIS_MODIFIER_ONLY
(flags
, ACC_PUBLIC
, PUBLIC_TK
, acc_count
, cl
);
5039 THIS_MODIFIER_ONLY
(flags
, ACC_PRIVATE
, PRIVATE_TK
, acc_count
, cl
);
5040 THIS_MODIFIER_ONLY
(flags
, ACC_PROTECTED
, PROTECTED_TK
, acc_count
, cl
);
5043 (cl
, "Inconsistent member declaration. At most one of %<public%>, %<private%>, or %<protected%> may be specified");
5047 THIS_MODIFIER_ONLY
(flags
, ACC_FINAL
, FINAL_TK
, acc_count
, cl
);
5048 THIS_MODIFIER_ONLY
(flags
, ACC_VOLATILE
, VOLATILE_TK
, acc_count
, cl
);
5050 parse_error_context
(cl
,
5051 "Inconsistent member declaration. At most one of %<final%> or %<volatile%> may be specified");
5054 /* Check the methode header METH for abstract specifics features */
5057 check_abstract_method_header
(tree meth
)
5059 int flags
= get_access_flags_from_decl
(meth
);
5061 OBSOLETE_MODIFIER_WARNING2
(MODIFIER_WFL
(ABSTRACT_TK
), flags
,
5062 ACC_ABSTRACT
, "abstract method",
5063 IDENTIFIER_POINTER
(DECL_NAME
(meth
)));
5064 OBSOLETE_MODIFIER_WARNING2
(MODIFIER_WFL
(PUBLIC_TK
), flags
,
5065 ACC_PUBLIC
, "abstract method",
5066 IDENTIFIER_POINTER
(DECL_NAME
(meth
)));
5068 check_modifiers
("Illegal modifier %qs for interface method",
5069 flags
, INTERFACE_METHOD_MODIFIERS
);
5072 /* Create a FUNCTION_TYPE node and start augmenting it with the
5073 declared function arguments. Arguments type that can't be resolved
5074 are left as they are, but the returned node is marked as containing
5075 incomplete types. */
5078 method_declarator
(tree id
, tree list
)
5080 tree arg_types
= NULL_TREE
, current
, node
;
5081 tree meth
= make_node
(FUNCTION_TYPE
);
5084 patch_stage
= JDEP_NO_PATCH
;
5086 if
(GET_CPC
() == error_mark_node
)
5087 return error_mark_node
;
5089 /* If we're dealing with an inner class constructor, we hide the
5090 this$<n> decl in the name field of its parameter declaration. We
5091 also might have to hide the outer context local alias
5092 initializers. Not done when the class is a toplevel class. */
5093 if
(PURE_INNER_CLASS_DECL_P
(GET_CPC
())
5094 && EXPR_WFL_NODE
(id
) == GET_CPC_UN
())
5096 tree aliases_list
, type
, thisn
;
5097 /* First the aliases, linked to the regular parameters */
5099 build_alias_initializer_parameter_list
(AIPL_FUNCTION_DECLARATION
,
5100 TREE_TYPE
(GET_CPC
()),
5102 list
= chainon
(nreverse
(aliases_list
), list
);
5105 type
= TREE_TYPE
(DECL_CONTEXT
(GET_CPC
()));
5106 thisn
= build_current_thisn
(TREE_TYPE
(GET_CPC
()));
5107 list
= tree_cons
(build_wfl_node
(thisn
), build_pointer_type
(type
),
5111 for
(current
= list
; current
; current
= TREE_CHAIN
(current
))
5114 tree wfl_name
= TREE_PURPOSE
(current
);
5115 tree type
= TREE_VALUE
(current
);
5116 tree name
= EXPR_WFL_NODE
(wfl_name
);
5117 tree already
, arg_node
;
5118 tree type_wfl
= NULL_TREE
;
5121 /* Obtain a suitable type for resolution, if necessary */
5122 SET_TYPE_FOR_RESOLUTION
(type
, type_wfl
, must_chain
);
5124 /* Process NAME, as it may specify extra dimension(s) for it */
5125 type
= build_array_from_name
(type
, type_wfl
, name
, &name
);
5126 EXPR_WFL_NODE
(wfl_name
) = name
;
5128 real_type
= GET_REAL_TYPE
(type
);
5129 if
(TREE_CODE
(real_type
) == RECORD_TYPE
)
5131 real_type
= promote_type
(real_type
);
5132 if
(TREE_CODE
(type
) == TREE_LIST
)
5133 TREE_PURPOSE
(type
) = real_type
;
5136 /* Check redefinition */
5137 for
(already
= arg_types
; already
; already
= TREE_CHAIN
(already
))
5138 if
(TREE_PURPOSE
(already
) == name
)
5141 (wfl_name
, "Variable %qs is used more than once in the argument list of method %qs",
5142 IDENTIFIER_POINTER
(name
),
5143 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(id
)));
5147 /* If we've an incomplete argument type, we know there is a location
5148 to patch when the type get resolved, later. */
5152 patch_stage
= JDEP_METHOD
;
5153 type
= register_incomplete_type
(patch_stage
,
5154 type_wfl
, wfl_name
, type
);
5155 jdep
= CLASSD_LAST
(ctxp
->classd_list
);
5156 JDEP_MISC
(jdep
) = id
;
5159 /* The argument node: a name and a (possibly) incomplete type. */
5160 arg_node
= build_tree_list
(name
, real_type
);
5161 /* Remember arguments declared final. */
5162 ARG_FINAL_P
(arg_node
) = ARG_FINAL_P
(current
);
5165 JDEP_GET_PATCH
(jdep
) = &TREE_VALUE
(arg_node
);
5166 TREE_CHAIN
(arg_node
) = arg_types
;
5167 arg_types
= arg_node
;
5169 TYPE_ARG_TYPES
(meth
) = chainon
(nreverse
(arg_types
), end_params_node
);
5170 node
= build_tree_list
(id
, meth
);
5175 unresolved_type_p
(tree wfl
, tree
*returned
)
5177 if
(TREE_CODE
(wfl
) == EXPR_WITH_FILE_LOCATION
)
5181 tree decl
= IDENTIFIER_CLASS_VALUE
(EXPR_WFL_NODE
(wfl
));
5182 if
(decl
&& current_class
&& (decl
== TYPE_NAME
(current_class
)))
5183 *returned
= TREE_TYPE
(decl
);
5184 else if
(GET_CPC_UN
() == EXPR_WFL_NODE
(wfl
))
5185 *returned
= TREE_TYPE
(GET_CPC
());
5187 *returned
= NULL_TREE
;
5196 /* From NAME, build a qualified identifier node using the
5197 qualification from the current package definition. */
5200 parser_qualified_classname
(tree name
)
5202 tree nested_class_name
;
5204 if
((nested_class_name
= maybe_make_nested_class_name
(name
)))
5205 return nested_class_name
;
5208 return merge_qualified_name
(ctxp
->package
, name
);
5213 /* Called once the type a interface extends is resolved. Returns 0 if
5214 everything is OK. */
5217 parser_check_super_interface
(tree super_decl
, tree this_decl
, tree this_wfl
)
5219 tree super_type
= TREE_TYPE
(super_decl
);
5221 /* Has to be an interface */
5222 if
(!CLASS_INTERFACE
(super_decl
))
5225 (this_wfl
, "%s %qs can't implement/extend %s %qs",
5226 (CLASS_INTERFACE
(TYPE_NAME
(TREE_TYPE
(this_decl
))) ?
5227 "Interface" : "Class"),
5228 IDENTIFIER_POINTER
(DECL_NAME
(this_decl
)),
5229 (TYPE_ARRAY_P
(super_type
) ?
"array" : "class"),
5230 IDENTIFIER_POINTER
(DECL_NAME
(super_decl
)));
5234 /* Check top-level interface access. Inner classes are subject to member
5235 access rules (6.6.1). */
5236 if
(! INNER_CLASS_P
(super_type
)
5237 && check_pkg_class_access
(DECL_NAME
(super_decl
),
5238 NULL_TREE
, true
, this_decl
))
5241 SOURCE_FRONTEND_DEBUG
(("Completing interface %s with %s",
5242 IDENTIFIER_POINTER
(DECL_NAME
(this_decl
)),
5243 IDENTIFIER_POINTER
(DECL_NAME
(super_decl
))));
5247 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
5248 0 if everything is OK. */
5251 parser_check_super
(tree super_decl
, tree this_decl
, tree wfl
)
5253 tree super_type
= TREE_TYPE
(super_decl
);
5255 /* SUPER should be a CLASS (neither an array nor an interface) */
5256 if
(TYPE_ARRAY_P
(super_type
) || CLASS_INTERFACE
(TYPE_NAME
(super_type
)))
5259 (wfl
, "Class %qs can't subclass %s %qs",
5260 IDENTIFIER_POINTER
(DECL_NAME
(this_decl
)),
5261 (CLASS_INTERFACE
(TYPE_NAME
(super_type
)) ?
"interface" : "array"),
5262 IDENTIFIER_POINTER
(DECL_NAME
(super_decl
)));
5266 if
(CLASS_FINAL
(TYPE_NAME
(super_type
)))
5268 parse_error_context
(wfl
, "Can't subclass final classes: %s",
5269 IDENTIFIER_POINTER
(DECL_NAME
(super_decl
)));
5273 /* Check top-level class scope. Inner classes are subject to member access
5275 if
(! INNER_CLASS_P
(super_type
)
5276 && (check_pkg_class_access
(DECL_NAME
(super_decl
), wfl
, true
, NULL_TREE
)))
5279 SOURCE_FRONTEND_DEBUG
(("Completing class %s with %s",
5280 IDENTIFIER_POINTER
(DECL_NAME
(this_decl
)),
5281 IDENTIFIER_POINTER
(DECL_NAME
(super_decl
))));
5285 /* Create a new dependency list and link it (in a LIFO manner) to the
5286 CTXP list of type dependency list. */
5289 create_jdep_list
(struct parser_ctxt
*ctxp
)
5291 jdeplist
*new
= xmalloc
(sizeof
(jdeplist
));
5292 new
->first
= new
->last
= NULL
;
5293 new
->next
= ctxp
->classd_list
;
5294 ctxp
->classd_list
= new
;
5298 reverse_jdep_list
(struct parser_ctxt
*ctxp
)
5300 jdeplist
*prev
= NULL
, *current
, *next
;
5301 for
(current
= ctxp
->classd_list
; current
; current
= next
)
5303 next
= current
->next
;
5304 current
->next
= prev
;
5310 /* Create a fake pointer based on the ID stored in
5311 TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
5312 registered again. */
5315 obtain_incomplete_type
(tree type_name
)
5317 tree ptr
= NULL_TREE
, name
;
5319 if
(TREE_CODE
(type_name
) == EXPR_WITH_FILE_LOCATION
)
5320 name
= EXPR_WFL_NODE
(type_name
);
5321 else if
(INCOMPLETE_TYPE_P
(type_name
))
5322 name
= TYPE_NAME
(type_name
);
5326 /* Workaround from build_pointer_type for incomplete types. */
5327 BUILD_PTR_FROM_NAME
(ptr
, name
);
5328 TYPE_MODE
(ptr
) = ptr_mode
;
5334 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
5335 non NULL instead of computing a new fake type based on WFL. The new
5336 dependency is inserted in the current type dependency list, in FIFO
5340 register_incomplete_type
(int kind
, tree wfl
, tree decl
, tree ptr
)
5342 jdep
*new
= xmalloc
(sizeof
(jdep
));
5344 if
(!ptr
&& kind
!= JDEP_METHOD_END
) /* JDEP_METHOD_END is a mere marker */
5345 ptr
= obtain_incomplete_type
(wfl
);
5347 JDEP_KIND
(new
) = kind
;
5348 JDEP_DECL
(new
) = decl
;
5349 JDEP_TO_RESOLVE
(new
) = ptr
;
5350 JDEP_WFL
(new
) = wfl
;
5351 JDEP_CHAIN
(new
) = NULL
;
5352 JDEP_MISC
(new
) = NULL_TREE
;
5353 /* For some dependencies, set the enclosing class of the current
5354 class to be the enclosing context */
5355 if
((kind
== JDEP_INTERFACE || kind
== JDEP_ANONYMOUS || kind
== JDEP_SUPER
)
5356 && GET_ENCLOSING_CPC
())
5357 JDEP_ENCLOSING
(new
) = TREE_VALUE
(GET_ENCLOSING_CPC
());
5359 JDEP_ENCLOSING
(new
) = GET_CPC
();
5360 JDEP_GET_PATCH
(new
) = (tree
*)NULL
;
5362 JDEP_INSERT
(ctxp
->classd_list
, new
);
5367 /* This checks for circular references with innerclasses. We start
5368 from SOURCE and should never reach TARGET. Extended/implemented
5369 types in SOURCE have their enclosing context checked not to reach
5370 TARGET. When the last enclosing context of SOURCE is reached, its
5371 extended/implemented types are also checked not to reach TARGET.
5372 In case of error, WFL of the offending type is returned; NULL_TREE
5376 check_inner_circular_reference
(tree source
, tree target
)
5382 for
(i
= 0; BINFO_BASE_ITERATE
(TYPE_BINFO
(source
), i
, base_binfo
); i
++)
5386 /* We can end up with a NULL_TREE or an incomplete type here if
5387 we encountered previous type resolution errors. It's safe to
5388 simply ignore these cases. */
5389 su
= BINFO_TYPE
(base_binfo
);
5390 if
(INCOMPLETE_TYPE_P
(su
))
5393 if
(inherits_from_p
(su
, target
))
5394 return lookup_cl
(TYPE_NAME
(su
));
5396 for
(ctx
= DECL_CONTEXT
(TYPE_NAME
(su
)); ctx
; ctx
= DECL_CONTEXT
(ctx
))
5398 /* An enclosing context shouldn't be TARGET */
5399 if
(ctx
== TYPE_NAME
(target
))
5400 return lookup_cl
(TYPE_NAME
(su
));
5402 /* When we reach the enclosing last context, start a check
5403 on it, with the same target */
5404 if
(! DECL_CONTEXT
(ctx
) &&
5405 (cl
= check_inner_circular_reference
(TREE_TYPE
(ctx
), target
)))
5412 /* Explore TYPE's `extends' clause member(s) and return the WFL of the
5413 offending type if a circularity is detected. NULL_TREE is returned
5414 otherwise. TYPE can be an interface or a class. */
5417 check_circular_reference
(tree type
)
5422 if
(!BINFO_N_BASE_BINFOS
(TYPE_BINFO
(type
)))
5425 if
(! CLASS_INTERFACE
(TYPE_NAME
(type
)))
5427 if
(inherits_from_p
(CLASSTYPE_SUPER
(type
), type
))
5428 return lookup_cl
(TYPE_NAME
(type
));
5432 for
(i
= 0; BINFO_BASE_ITERATE
(TYPE_BINFO
(type
), i
, base_binfo
); i
++)
5434 if
(BINFO_TYPE
(base_binfo
) != object_type_node
5435 && interface_of_p
(type
, BINFO_TYPE
(base_binfo
)))
5436 return lookup_cl
(TYPE_NAME
(BINFO_TYPE
(base_binfo
)));
5442 java_check_circular_reference
(void)
5445 for
(current
= ctxp
->class_list
; current
; current
= TREE_CHAIN
(current
))
5447 tree type
= TREE_TYPE
(current
);
5450 cl
= check_circular_reference
(type
);
5452 cl
= check_inner_circular_reference
(type
, type
);
5454 parse_error_context
(cl
, "Cyclic class inheritance%s",
5455 (cyclic_inheritance_report ?
5456 cyclic_inheritance_report
: ""));
5460 /* Augment the parameter list PARM with parameters crafted to
5461 initialize outer context locals aliases. Through ARTIFICIAL, a
5462 count is kept of the number of crafted parameters. MODE governs
5463 what eventually gets created: something suitable for a function
5464 creation or a function invocation, either the constructor or
5468 build_alias_initializer_parameter_list
(int mode
, tree class_type
, tree parm
,
5472 tree additional_parms
= NULL_TREE
;
5474 for
(field
= TYPE_FIELDS
(class_type
); field
; field
= TREE_CHAIN
(field
))
5475 if
(FIELD_LOCAL_ALIAS
(field
))
5477 const char *buffer
= IDENTIFIER_POINTER
(DECL_NAME
(field
));
5478 tree purpose
= NULL_TREE
, value
= NULL_TREE
, name
= NULL_TREE
;
5483 case AIPL_FUNCTION_DECLARATION
:
5484 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR
(mangled_id
,
5486 purpose
= build_wfl_node
(mangled_id
);
5487 if
(TREE_CODE
(TREE_TYPE
(field
)) == POINTER_TYPE
)
5488 value
= build_wfl_node
(TYPE_NAME
(TREE_TYPE
(field
)));
5490 value
= TREE_TYPE
(field
);
5493 case AIPL_FUNCTION_CREATION
:
5494 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR
(purpose
,
5496 value
= TREE_TYPE
(field
);
5499 case AIPL_FUNCTION_FINIT_INVOCATION
:
5500 MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR
(mangled_id
,
5502 /* Now, this is wrong. purpose should always be the NAME
5503 of something and value its matching value (decl, type,
5504 etc...) FIXME -- but there is a lot to fix. */
5506 /* When invoked for this kind of operation, we already
5507 know whether a field is used or not. */
5508 purpose
= TREE_TYPE
(field
);
5509 value
= build_wfl_node
(mangled_id
);
5512 case AIPL_FUNCTION_CTOR_INVOCATION
:
5513 /* There are two case: the constructor invocation happens
5514 outside the local inner, in which case, locales from the outer
5515 context are directly used.
5517 Otherwise, we fold to using the alias directly. */
5518 if
(class_type
== current_class
)
5522 name
= get_identifier
(&buffer
[4]);
5523 value
= IDENTIFIER_LOCAL_VALUE
(name
);
5527 additional_parms
= tree_cons
(purpose
, value
, additional_parms
);
5531 if
(additional_parms
)
5533 if
(ANONYMOUS_CLASS_P
(class_type
)
5534 && mode
== AIPL_FUNCTION_CTOR_INVOCATION
)
5535 additional_parms
= nreverse
(additional_parms
);
5536 parm
= chainon
(additional_parms
, parm
);
5542 /* Craft a constructor for CLASS_DECL -- what we should do when none
5543 where found. ARGS is non NULL when a special signature must be
5544 enforced. This is the case for anonymous classes. */
5547 craft_constructor
(tree class_decl
, tree args
)
5549 tree class_type
= TREE_TYPE
(class_decl
);
5550 tree parm
= NULL_TREE
;
5551 /* Inherit access flags for the constructor from its enclosing class. */
5552 int valid_ctor_flags
= ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE
;
5553 int flags
= (get_access_flags_from_decl
(class_decl
) & valid_ctor_flags
);
5554 int i
= 0, artificial
= 0;
5555 tree decl
, ctor_name
;
5558 ctor_name
= init_identifier_node
;
5560 /* If we're dealing with an inner class constructor, we hide the
5561 this$<n> decl in the name field of its parameter declaration. */
5562 if
(PURE_INNER_CLASS_TYPE_P
(class_type
))
5564 tree type
= TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(class_type
)));
5565 parm
= tree_cons
(build_current_thisn
(class_type
),
5566 build_pointer_type
(type
), parm
);
5568 /* Some more arguments to be hidden here. The values of the local
5569 variables of the outer context that the inner class needs to see. */
5570 parm
= build_alias_initializer_parameter_list
(AIPL_FUNCTION_CREATION
,
5575 /* Then if there are any args to be enforced, enforce them now */
5576 for
(; args
&& args
!= end_params_node
; args
= TREE_CHAIN
(args
))
5578 /* If we see a `void *', we need to change it to Object. */
5579 if
(TREE_VALUE
(args
) == TREE_TYPE
(null_pointer_node
))
5580 TREE_VALUE
(args
) = object_ptr_type_node
;
5582 sprintf
(buffer
, "parm%d", i
++);
5583 parm
= tree_cons
(get_identifier
(buffer
), TREE_VALUE
(args
), parm
);
5586 CRAFTED_PARAM_LIST_FIXUP
(parm
);
5587 decl
= create_artificial_method
(class_type
, flags
, void_type_node
,
5589 fix_method_argument_names
(parm
, decl
);
5590 /* Now, mark the artificial parameters. */
5591 DECL_FUNCTION_NAP
(decl
) = artificial
;
5592 DECL_FUNCTION_SYNTHETIC_CTOR
(decl
) = DECL_CONSTRUCTOR_P
(decl
) = 1;
5593 DECL_INLINE
(decl
) = 1;
5598 /* Fix the constructors. This will be called right after circular
5599 references have been checked. It is necessary to fix constructors
5600 early even if no code generation will take place for that class:
5601 some generated constructor might be required by the class whose
5602 compilation triggered this one to be simply loaded. */
5605 java_fix_constructors
(void)
5609 for
(current
= ctxp
->class_list
; current
; current
= TREE_CHAIN
(current
))
5611 tree class_type
= TREE_TYPE
(current
);
5615 if
(CLASS_INTERFACE
(TYPE_NAME
(class_type
)))
5618 output_class
= current_class
= class_type
;
5619 for
(decl
= TYPE_METHODS
(class_type
); decl
; decl
= TREE_CHAIN
(decl
))
5621 if
(DECL_CONSTRUCTOR_P
(decl
))
5623 fix_constructors
(decl
);
5628 /* Anonymous class constructor can't be generated that early. */
5629 if
(!saw_ctor
&& !ANONYMOUS_CLASS_P
(class_type
))
5630 craft_constructor
(current
, NULL_TREE
);
5634 /* safe_layout_class just makes sure that we can load a class without
5635 disrupting the current_class, input_file, input_line, etc, information
5636 about the class processed currently. */
5639 safe_layout_class
(tree class
)
5641 tree save_current_class
= current_class
;
5642 location_t save_location
= input_location
;
5644 layout_class
(class
);
5646 current_class
= save_current_class
;
5647 input_location
= save_location
;
5651 jdep_resolve_class
(jdep
*dep
)
5655 /* Set the correct context for class resolution. */
5656 current_class
= TREE_TYPE
(JDEP_ENCLOSING
(dep
));
5658 if
(JDEP_RESOLVED_P
(dep
))
5659 decl
= JDEP_RESOLVED_DECL
(dep
);
5662 decl
= resolve_class
(JDEP_ENCLOSING
(dep
), JDEP_TO_RESOLVE
(dep
),
5663 JDEP_DECL
(dep
), JDEP_WFL
(dep
));
5664 JDEP_RESOLVED
(dep
, decl
);
5665 /* If there is no WFL, that's ok. We generate this warning
5667 if
(decl
&& JDEP_WFL
(dep
) != NULL_TREE
)
5668 check_deprecation
(JDEP_WFL
(dep
), decl
);
5672 complete_class_report_errors
(dep
);
5673 else if
(INNER_CLASS_DECL_P
(decl
))
5675 tree inner
= TREE_TYPE
(decl
);
5676 if
(! CLASS_LOADED_P
(inner
))
5678 safe_layout_class
(inner
);
5679 if
(TYPE_SIZE
(inner
) == error_mark_node
)
5680 TYPE_SIZE
(inner
) = NULL_TREE
;
5682 check_inner_class_access
(decl
, JDEP_ENCLOSING
(dep
), JDEP_WFL
(dep
));
5687 /* Complete unsatisfied class declaration and their dependencies */
5690 java_complete_class
(void)
5697 /* Process imports */
5700 /* Reverse things so we have the right order */
5701 ctxp
->class_list
= nreverse
(ctxp
->class_list
);
5702 ctxp
->classd_list
= reverse_jdep_list
(ctxp
);
5704 for
(cclassd
= ctxp
->classd_list
, cclass
= ctxp
->class_list
;
5706 cclass
= TREE_CHAIN
(cclass
), cclassd
= CLASSD_CHAIN
(cclassd
))
5710 for
(dep
= CLASSD_FIRST
(cclassd
); dep
; dep
= JDEP_CHAIN
(dep
))
5713 if
(!(decl
= jdep_resolve_class
(dep
)))
5716 /* Now it's time to patch */
5717 switch
(JDEP_KIND
(dep
))
5720 /* Simply patch super */
5721 if
(parser_check_super
(decl
, JDEP_DECL
(dep
), JDEP_WFL
(dep
)))
5723 BINFO_TYPE
(BINFO_BASE_BINFO
5724 (TYPE_BINFO
(TREE_TYPE
(JDEP_DECL
(dep
))), 0))
5730 /* We do part of the job done in add_field */
5731 tree field_decl
= JDEP_DECL
(dep
);
5732 tree field_type
= TREE_TYPE
(decl
);
5733 if
(TREE_CODE
(field_type
) == RECORD_TYPE
)
5734 field_type
= promote_type
(field_type
);
5735 TREE_TYPE
(field_decl
) = field_type
;
5736 DECL_ALIGN
(field_decl
) = 0;
5737 DECL_USER_ALIGN
(field_decl
) = 0;
5738 layout_decl
(field_decl
, 0);
5739 SOURCE_FRONTEND_DEBUG
5740 (("Completed field/var decl '%s' with '%s'",
5741 IDENTIFIER_POINTER
(DECL_NAME
(field_decl
)),
5742 IDENTIFIER_POINTER
(DECL_NAME
(decl
))));
5745 case JDEP_METHOD
: /* We start patching a method */
5746 case JDEP_METHOD_RETURN
:
5752 type
= TREE_TYPE
(decl
);
5753 if
(TREE_CODE
(type
) == RECORD_TYPE
)
5754 type
= promote_type
(type
);
5755 JDEP_APPLY_PATCH
(dep
, type
);
5756 SOURCE_FRONTEND_DEBUG
5757 (((JDEP_KIND
(dep
) == JDEP_METHOD_RETURN ?
5758 "Completing fct '%s' with ret type '%s'":
5759 "Completing arg '%s' with type '%s'"),
5760 IDENTIFIER_POINTER
(EXPR_WFL_NODE
5761 (JDEP_DECL_WFL
(dep
))),
5762 IDENTIFIER_POINTER
(DECL_NAME
(decl
))));
5766 dep
= JDEP_CHAIN
(dep
);
5767 if
(JDEP_KIND
(dep
) == JDEP_METHOD_END
)
5770 decl
= jdep_resolve_class
(dep
);
5774 tree mdecl
= JDEP_DECL
(dep
), signature
;
5775 /* Recompute and reset the signature, check first that
5776 all types are now defined. If they're not,
5777 don't build the signature. */
5778 if
(check_method_types_complete
(mdecl
))
5780 signature
= build_java_signature
(TREE_TYPE
(mdecl
));
5781 set_java_signature
(TREE_TYPE
(mdecl
), signature
);
5788 case JDEP_INTERFACE
:
5789 if
(parser_check_super_interface
(decl
, JDEP_DECL
(dep
),
5792 parser_add_interface
(JDEP_DECL
(dep
), decl
, JDEP_WFL
(dep
));
5797 type
= TREE_TYPE
(decl
);
5798 if
(TREE_CODE
(type
) == RECORD_TYPE
)
5799 type
= promote_type
(type
);
5800 JDEP_APPLY_PATCH
(dep
, type
);
5804 JDEP_APPLY_PATCH
(dep
, TREE_TYPE
(decl
));
5805 SOURCE_FRONTEND_DEBUG
5806 (("Completing a random type dependency on a '%s' node",
5807 tree_code_name
[TREE_CODE
(JDEP_DECL
(dep
))]));
5810 case JDEP_EXCEPTION
:
5811 JDEP_APPLY_PATCH
(dep
, TREE_TYPE
(decl
));
5812 SOURCE_FRONTEND_DEBUG
5813 (("Completing '%s' 'throws' argument node",
5814 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(JDEP_WFL
(dep
)))));
5817 case JDEP_ANONYMOUS
:
5818 patch_anonymous_class
(decl
, JDEP_DECL
(dep
), JDEP_WFL
(dep
));
5829 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
5833 resolve_class
(tree enclosing
, tree class_type
, tree decl
, tree cl
)
5835 tree tname
= TYPE_NAME
(class_type
);
5836 tree resolved_type
= TREE_TYPE
(class_type
);
5838 tree resolved_type_decl
;
5840 if
(resolved_type
!= NULL_TREE
)
5842 tree resolved_type_decl
= TYPE_NAME
(resolved_type
);
5843 if
(resolved_type_decl
== NULL_TREE
5844 || TREE_CODE
(resolved_type_decl
) == IDENTIFIER_NODE
)
5846 resolved_type_decl
= build_decl
(TYPE_DECL
,
5847 TYPE_NAME
(class_type
),
5850 return resolved_type_decl
;
5853 /* 1- Check to see if we have an array. If true, find what we really
5855 if
((array_dims
= build_type_name_from_array_name
(tname
,
5856 &TYPE_NAME
(class_type
))))
5857 WFL_STRIP_BRACKET
(cl
, cl
);
5859 /* 2- Resolve the bare type */
5860 if
(!(resolved_type_decl
= do_resolve_class
(enclosing
, NULL_TREE
, class_type
,
5863 resolved_type
= TREE_TYPE
(resolved_type_decl
);
5865 /* 3- If we have an array, reconstruct the array down to its nesting */
5868 for
(; array_dims
; array_dims
--)
5869 resolved_type
= build_java_array_type
(resolved_type
, -1);
5870 resolved_type_decl
= TYPE_NAME
(resolved_type
);
5872 TREE_TYPE
(class_type
) = resolved_type
;
5873 return resolved_type_decl
;
5876 /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL
5877 are used to report error messages; CL must either be NULL_TREE or a
5878 WFL wrapping a class. Do not try to replace TYPE_NAME (class_type)
5879 by a variable, since it is changed by find_in_imports{_on_demand}
5880 and (but it doesn't really matter) qualify_and_find. */
5883 do_resolve_class
(tree enclosing
, tree import_type
, tree class_type
, tree decl
,
5886 tree new_class_decl
= NULL_TREE
;
5887 tree saved_enclosing_type
= enclosing ? TREE_TYPE
(enclosing
) : NULL_TREE
;
5888 tree candidate
= NULL_TREE
;
5891 if
(QUALIFIED_P
(TYPE_NAME
(class_type
)))
5893 /* If the type name is of the form `Q . Id', then Q is either a
5894 package name or a class name. First we try to find Q as a
5895 class and then treat Id as a member type. If we can't find Q
5896 as a class then we fall through. */
5897 tree q
, left
, left_type
, right
;
5898 if
(split_qualified_name
(&left
, &right
, TYPE_NAME
(class_type
)) == 0)
5900 BUILD_PTR_FROM_NAME
(left_type
, left
);
5901 q
= do_resolve_class
(enclosing
, import_type
, left_type
, decl
, cl
);
5905 saved_enclosing_type
= TREE_TYPE
(q
);
5906 BUILD_PTR_FROM_NAME
(class_type
, right
);
5913 tree context
= enclosing
;
5915 /* 0- Search in the current class as an inner class.
5916 Maybe some code here should be added to load the class or
5917 something, at least if the class isn't an inner class and ended
5918 being loaded from class file. FIXME. */
5921 new_class_decl
= resolve_inner_class
(context
, cl
, enclosing
, class_type
);
5925 if
(inner_class_accessible
(new_class_decl
, context
))
5928 if
(candidate
== NULL_TREE
)
5929 candidate
= new_class_decl
;
5930 new_class_decl
= NULL_TREE
;
5933 /* Now that we've looked through all superclasses, try the enclosing
5935 enclosing
= DECL_CONTEXT
(enclosing
);
5939 return new_class_decl
;
5942 /* 1- Check for the type in single imports. Look at enclosing classes and,
5943 if we're laying out a superclass, at the import list for the subclass.
5944 This will change TYPE_NAME() if something relevant is found. */
5945 if
(import_type
&& TYPE_IMPORT_LIST
(import_type
))
5946 find_in_imports
(import_type
, class_type
);
5947 find_in_imports
(saved_enclosing_type
, class_type
);
5949 /* 2- And check for the type in the current compilation unit */
5950 if
((new_class_decl
= IDENTIFIER_CLASS_VALUE
(TYPE_NAME
(class_type
))))
5952 if
(!CLASS_LOADED_P
(TREE_TYPE
(new_class_decl
)))
5953 load_class
(TYPE_NAME
(class_type
), 0);
5954 return IDENTIFIER_CLASS_VALUE
(TYPE_NAME
(class_type
));
5957 /* 3- Search according to the current package definition */
5958 if
(!QUALIFIED_P
(TYPE_NAME
(class_type
)))
5960 if
((new_class_decl
= qualify_and_find
(class_type
,
5961 TYPE_PACKAGE
(current_class
), TYPE_NAME
(class_type
))))
5962 return new_class_decl
;
5965 /* 4- Check the import on demands. Don't allow bar.baz to be
5966 imported from foo.* */
5967 if
(!QUALIFIED_P
(TYPE_NAME
(class_type
)))
5970 && TYPE_IMPORT_DEMAND_LIST
(import_type
)
5971 && find_in_imports_on_demand
(import_type
, class_type
))
5973 if
(find_in_imports_on_demand
(saved_enclosing_type
, class_type
))
5977 /* If found in find_in_imports_on_demand, the type has already been
5979 if
((new_class_decl
= IDENTIFIER_CLASS_VALUE
(TYPE_NAME
(class_type
))))
5980 return new_class_decl
;
5982 /* 5- Check another compilation unit that bears the name of type */
5983 load_class
(TYPE_NAME
(class_type
), 0);
5986 cl
= lookup_cl
(decl
);
5988 /* If we don't have a value for CL, then we're being called recursively.
5989 We can't check package access just yet, but it will be taken care of
5993 if
(check_pkg_class_access
(TYPE_NAME
(class_type
), cl
, true
, NULL_TREE
))
5997 /* 6- Last call for a resolution */
5998 decl_result
= IDENTIFIER_CLASS_VALUE
(TYPE_NAME
(class_type
));
6000 /* The final lookup might have registered a.b.c into a.b$c If we
6001 failed at the first lookup, progressively change the name if
6002 applicable and use the matching DECL instead. */
6003 if
(!decl_result
&& QUALIFIED_P
(TYPE_NAME
(class_type
)))
6006 tree name
= TYPE_NAME
(class_type
);
6007 char *namebuffer
= alloca
(IDENTIFIER_LENGTH
(name
) + 1);
6009 strcpy
(namebuffer
, IDENTIFIER_POINTER
(name
));
6013 /* Reach the last '.', and if applicable, replace it by a `$' and
6014 see if this exists as a type. */
6015 if
((separator
= strrchr
(namebuffer
, '.')))
6018 name
= get_identifier
(namebuffer
);
6019 decl_result
= IDENTIFIER_CLASS_VALUE
(name
);
6021 } while
(!decl_result
&& separator
);
6030 qualify_and_find
(tree class_type
, tree package
, tree name
)
6032 tree new_qualified
= merge_qualified_name
(package
, name
);
6033 tree new_class_decl
;
6035 if
(!IDENTIFIER_CLASS_VALUE
(new_qualified
))
6036 load_class
(new_qualified
, 0);
6037 if
((new_class_decl
= IDENTIFIER_CLASS_VALUE
(new_qualified
)))
6039 if
(!CLASS_LOADED_P
(TREE_TYPE
(new_class_decl
)))
6040 load_class
(TREE_TYPE
(new_class_decl
), 0);
6041 TYPE_NAME
(class_type
) = new_qualified
;
6042 return IDENTIFIER_CLASS_VALUE
(new_qualified
);
6047 /* Resolve NAME and lay it out (if not done and if not the current
6048 parsed class). Return a decl node. This function is meant to be
6049 called when type resolution is necessary during the walk pass. */
6052 resolve_and_layout
(tree something
, tree cl
)
6054 tree decl
, decl_type
;
6056 /* Don't do that on the current class */
6057 if
(something
== current_class
)
6058 return TYPE_NAME
(current_class
);
6060 /* Don't do anything for void and other primitive types */
6061 if
(JPRIMITIVE_TYPE_P
(something
) || something
== void_type_node
)
6064 /* Pointer types can be reall pointer types or fake pointers. When
6065 finding a real pointer, recheck for primitive types */
6066 if
(TREE_CODE
(something
) == POINTER_TYPE
)
6068 if
(TREE_TYPE
(something
))
6070 something
= TREE_TYPE
(something
);
6071 if
(JPRIMITIVE_TYPE_P
(something
) || something
== void_type_node
)
6075 something
= TYPE_NAME
(something
);
6078 /* Don't do anything for arrays of primitive types */
6079 if
(TREE_CODE
(something
) == RECORD_TYPE
&& TYPE_ARRAY_P
(something
)
6080 && JPRIMITIVE_TYPE_P
(TYPE_ARRAY_ELEMENT
(something
)))
6083 /* Something might be a WFL */
6084 if
(TREE_CODE
(something
) == EXPR_WITH_FILE_LOCATION
)
6085 something
= EXPR_WFL_NODE
(something
);
6087 /* Otherwise, if something is not and IDENTIFIER_NODE, it can be a
6088 TYPE_DECL or a real TYPE. */
6089 else if
(TREE_CODE
(something
) != IDENTIFIER_NODE
)
6090 something
= (TREE_CODE
(TYPE_NAME
(something
)) == TYPE_DECL ?
6091 DECL_NAME
(TYPE_NAME
(something
)) : TYPE_NAME
(something
));
6093 if
(!(decl
= resolve_no_layout
(something
, cl
)))
6096 /* Resolve and layout if necessary */
6097 decl_type
= TREE_TYPE
(decl
);
6098 layout_class_methods
(decl_type
);
6100 if
(CLASS_FROM_SOURCE_P
(decl_type
))
6101 java_check_methods
(decl
);
6102 /* Layout the type if necessary */
6103 if
(decl_type
!= current_class
&& !CLASS_LOADED_P
(decl_type
))
6104 safe_layout_class
(decl_type
);
6109 /* Resolve a class, returns its decl but doesn't perform any
6110 layout. The current parsing context is saved and restored */
6113 resolve_no_layout
(tree name
, tree cl
)
6116 BUILD_PTR_FROM_NAME
(ptr
, name
);
6117 java_parser_context_save_global
();
6118 decl
= resolve_class
(TYPE_NAME
(current_class
), ptr
, NULL_TREE
, cl
);
6119 java_parser_context_restore_global
();
6124 /* Called when reporting errors. Skip the '[]'s in a complex array
6125 type description that failed to be resolved. purify_type_name can't
6126 use an identifier tree. */
6129 purify_type_name
(const char *name
)
6131 int len
= strlen
(name
);
6134 STRING_STRIP_BRACKETS
(name
, len
, bracket_found
);
6137 char *stripped_name
= xmemdup
(name
, len
, len
+1);
6138 stripped_name
[len
] = '\0';
6139 return stripped_name
;
6144 /* The type CURRENT refers to can't be found. We print error messages. */
6147 complete_class_report_errors
(jdep
*dep
)
6151 if
(!JDEP_WFL
(dep
))
6154 name
= IDENTIFIER_POINTER
(EXPR_WFL_NODE
(JDEP_WFL
(dep
)));
6155 switch
(JDEP_KIND
(dep
))
6159 (JDEP_WFL
(dep
), "Superclass %qs of class %qs not found",
6160 purify_type_name
(name
),
6161 IDENTIFIER_POINTER
(DECL_NAME
(JDEP_DECL
(dep
))));
6165 (JDEP_WFL
(dep
), "Type %qs not found in declaration of field %qs",
6166 purify_type_name
(name
),
6167 IDENTIFIER_POINTER
(DECL_NAME
(JDEP_DECL
(dep
))));
6169 case JDEP_METHOD
: /* Covers arguments */
6171 (JDEP_WFL
(dep
), "Type %qs not found in the declaration of the argument %qs of method %qs",
6172 purify_type_name
(name
),
6173 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(JDEP_DECL_WFL
(dep
))),
6174 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(JDEP_MISC
(dep
))));
6176 case JDEP_METHOD_RETURN
: /* Covers return type */
6178 (JDEP_WFL
(dep
), "Type %qs not found in the declaration of the return type of method %qs",
6179 purify_type_name
(name
),
6180 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(JDEP_DECL_WFL
(dep
))));
6182 case JDEP_INTERFACE
:
6184 (JDEP_WFL
(dep
), "Superinterface %qs of %s %qs not found",
6185 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(JDEP_WFL
(dep
))),
6186 (CLASS_OR_INTERFACE
(JDEP_DECL
(dep
), "class", "interface")),
6187 IDENTIFIER_POINTER
(DECL_NAME
(JDEP_DECL
(dep
))));
6191 (JDEP_WFL
(dep
), "Type %qs not found in the declaration of the local variable %qs",
6192 purify_type_name
(IDENTIFIER_POINTER
6193 (EXPR_WFL_NODE
(JDEP_WFL
(dep
)))),
6194 IDENTIFIER_POINTER
(DECL_NAME
(JDEP_DECL
(dep
))));
6196 case JDEP_EXCEPTION
: /* As specified by `throws' */
6198 (JDEP_WFL
(dep
), "Class %qs not found in %<throws%>",
6199 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(JDEP_WFL
(dep
))));
6202 /* Fix for -Wall. Just break doing nothing. The error will be
6208 /* Return a static string containing the DECL prototype string. If
6209 DECL is a constructor, use the class name instead of the form
6213 get_printable_method_name
(tree decl
)
6215 const char *to_return
;
6216 tree name
= NULL_TREE
;
6218 if
(DECL_CONSTRUCTOR_P
(decl
))
6220 name
= DECL_NAME
(decl
);
6221 DECL_NAME
(decl
) = DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(decl
)));
6224 to_return
= lang_printable_name
(decl
, 2);
6225 if
(DECL_CONSTRUCTOR_P
(decl
))
6226 DECL_NAME
(decl
) = name
;
6231 /* Track method being redefined inside the same class. As a side
6232 effect, set DECL_NAME to an IDENTIFIER (prior entering this
6233 function it's a FWL, so we can track errors more accurately.) */
6236 check_method_redefinition
(tree class
, tree method
)
6240 /* There's no need to verify <clinit> and finit$ and instinit$ */
6241 if
(DECL_CLINIT_P
(method
)
6242 || DECL_FINIT_P
(method
) || DECL_INSTINIT_P
(method
))
6245 sig
= TYPE_ARGUMENT_SIGNATURE
(TREE_TYPE
(method
));
6246 for
(redef
= TYPE_METHODS
(class
); redef
; redef
= TREE_CHAIN
(redef
))
6248 if
(redef
== method
)
6250 if
(DECL_NAME
(redef
) == DECL_NAME
(method
)
6251 && sig
== TYPE_ARGUMENT_SIGNATURE
(TREE_TYPE
(redef
))
6252 && !DECL_ARTIFICIAL
(method
))
6255 (DECL_FUNCTION_WFL
(method
), "Duplicate %s declaration %qs",
6256 (DECL_CONSTRUCTOR_P
(redef
) ?
"constructor" : "method"),
6257 get_printable_method_name
(redef
));
6264 /* Return 1 if check went ok, 0 otherwise. */
6266 check_abstract_method_definitions
(int do_interface
, tree class_decl
,
6269 tree class
= TREE_TYPE
(class_decl
);
6270 tree method
, end_type
;
6273 end_type
= (do_interface ? object_type_node
: type
);
6274 for
(method
= TYPE_METHODS
(type
); method
; method
= TREE_CHAIN
(method
))
6276 tree other_super
, other_method
, method_sig
, method_name
;
6278 int end_type_reached
= 0;
6280 if
(!METHOD_ABSTRACT
(method
) || METHOD_FINAL
(method
))
6283 /* Now verify that somewhere in between TYPE and CLASS,
6284 abstract method METHOD gets a non abstract definition
6285 that is inherited by CLASS. */
6287 method_sig
= build_java_signature
(TREE_TYPE
(method
));
6288 method_name
= DECL_NAME
(method
);
6289 if
(TREE_CODE
(method_name
) == EXPR_WITH_FILE_LOCATION
)
6290 method_name
= EXPR_WFL_NODE
(method_name
);
6292 other_super
= class
;
6294 if
(other_super
== end_type
)
6295 end_type_reached
= 1;
6298 for
(other_method
= TYPE_METHODS
(other_super
); other_method
;
6299 other_method
= TREE_CHAIN
(other_method
))
6301 tree s
= build_java_signature
(TREE_TYPE
(other_method
));
6302 tree other_name
= DECL_NAME
(other_method
);
6304 if
(TREE_CODE
(other_name
) == EXPR_WITH_FILE_LOCATION
)
6305 other_name
= EXPR_WFL_NODE
(other_name
);
6306 if
(!DECL_CLINIT_P
(other_method
)
6307 && !DECL_CONSTRUCTOR_P
(other_method
)
6308 && method_name
== other_name
6310 && !METHOD_ABSTRACT
(other_method
))
6316 other_super
= CLASSTYPE_SUPER
(other_super
);
6317 } while
(!end_type_reached
);
6319 /* Report that abstract METHOD didn't find an implementation
6320 that CLASS can use. */
6323 char *t
= xstrdup
(lang_printable_name
6324 (TREE_TYPE
(TREE_TYPE
(method
)), 0));
6325 tree ccn
= DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(method
)));
6328 (lookup_cl
(class_decl
),
6329 "Class %qs doesn't define the abstract method %<%s %s%> from %s %<%s%>. This method must be defined or %s %qs must be declared abstract",
6330 IDENTIFIER_POINTER
(DECL_NAME
(class_decl
)),
6331 t
, lang_printable_name
(method
, 2),
6332 (CLASS_INTERFACE
(TYPE_NAME
(DECL_CONTEXT
(method
))) ?
6333 "interface" : "class"),
6334 IDENTIFIER_POINTER
(ccn
),
6335 (CLASS_INTERFACE
(class_decl
) ?
"interface" : "class"),
6336 IDENTIFIER_POINTER
(DECL_NAME
(class_decl
)));
6342 if
(ok
&& do_interface
)
6344 /* Check for implemented interfaces. */
6349 ok
&& BINFO_BASE_ITERATE
(TYPE_BINFO
(type
), i
, base_binfo
);
6351 ok
= check_abstract_method_definitions
(1, class_decl
,
6352 BINFO_TYPE
(base_binfo
));
6358 /* Check that CLASS_DECL somehow implements all inherited abstract
6362 java_check_abstract_method_definitions
(tree class_decl
)
6364 tree class
= TREE_TYPE
(class_decl
);
6365 tree super
, base_binfo
;
6368 if
(CLASS_ABSTRACT
(class_decl
))
6371 /* Check for inherited types */
6374 super
= CLASSTYPE_SUPER
(super
);
6375 check_abstract_method_definitions
(0, class_decl
, super
);
6376 } while
(super
!= object_type_node
);
6378 /* Check for implemented interfaces. */
6379 for
(i
= 1; BINFO_BASE_ITERATE
(TYPE_BINFO
(class
), i
, base_binfo
); i
++)
6380 check_abstract_method_definitions
(1, class_decl
, BINFO_TYPE
(base_binfo
));
6383 /* Check all the types method DECL uses and return 1 if all of them
6384 are now complete, 0 otherwise. This is used to check whether its
6385 safe to build a method signature or not. */
6388 check_method_types_complete
(tree decl
)
6390 tree type
= TREE_TYPE
(decl
);
6393 if
(!INCOMPLETE_TYPE_P
(TREE_TYPE
(type
)))
6396 args
= TYPE_ARG_TYPES
(type
);
6397 if
(TREE_CODE
(type
) == METHOD_TYPE
)
6398 args
= TREE_CHAIN
(args
);
6399 for
(; args
!= end_params_node
; args
= TREE_CHAIN
(args
))
6400 if
(INCOMPLETE_TYPE_P
(TREE_VALUE
(args
)))
6406 /* Visible interface to check methods contained in CLASS_DECL */
6409 java_check_methods
(tree class_decl
)
6411 if
(CLASS_METHOD_CHECKED_P
(TREE_TYPE
(class_decl
)))
6414 if
(CLASS_INTERFACE
(class_decl
))
6415 java_check_abstract_methods
(class_decl
);
6417 java_check_regular_methods
(class_decl
);
6419 CLASS_METHOD_CHECKED_P
(TREE_TYPE
(class_decl
)) = 1;
6422 /* Like not_accessible_p, but doesn't refer to the current class at
6425 hack_is_accessible_p
(tree member
, tree from_where
)
6427 int flags
= get_access_flags_from_decl
(member
);
6429 if
(from_where
== DECL_CONTEXT
(member
)
6430 ||
(flags
& ACC_PUBLIC
))
6433 if
((flags
& ACC_PROTECTED
))
6435 if
(inherits_from_p
(from_where
, DECL_CONTEXT
(member
)))
6439 if
((flags
& ACC_PRIVATE
))
6442 /* Package private, or protected. */
6443 return in_same_package
(TYPE_NAME
(from_where
),
6444 TYPE_NAME
(DECL_CONTEXT
(member
)));
6447 /* Check all the methods of CLASS_DECL. Methods are first completed
6448 then checked according to regular method existence rules. If no
6449 constructor for CLASS_DECL were encountered, then build its
6452 java_check_regular_methods
(tree class_decl
)
6454 int saw_constructor
= ANONYMOUS_CLASS_P
(TREE_TYPE
(class_decl
));
6456 tree class
= TREE_TYPE
(class_decl
);
6457 tree found
= NULL_TREE
;
6460 /* It is not necessary to check methods defined in java.lang.Object */
6461 if
(class
== object_type_node
)
6464 if
(!TYPE_NVIRTUALS
(class
))
6465 TYPE_METHODS
(class
) = nreverse
(TYPE_METHODS
(class
));
6467 /* Should take interfaces into account. FIXME */
6468 for
(method
= TYPE_METHODS
(class
); method
; method
= TREE_CHAIN
(method
))
6471 tree method_wfl
= DECL_FUNCTION_WFL
(method
);
6474 /* Check for redefinitions */
6475 if
(check_method_redefinition
(class
, method
))
6478 /* We verify things thrown by the method. They must inherit from
6479 java.lang.Throwable. */
6480 for
(mthrows
= DECL_FUNCTION_THROWS
(method
);
6481 mthrows
; mthrows
= TREE_CHAIN
(mthrows
))
6483 if
(!inherits_from_p
(TREE_VALUE
(mthrows
), throwable_type_node
))
6485 (TREE_PURPOSE
(mthrows
), "Class %qs in %<throws%> clause must be a subclass of class %<java.lang.Throwable%>",
6487 (DECL_NAME
(TYPE_NAME
(TREE_VALUE
(mthrows
)))));
6490 /* If we see one constructor a mark so we don't generate the
6491 default one. Also skip other verifications: constructors
6492 can't be inherited hence hidden or overridden. */
6493 if
(DECL_CONSTRUCTOR_P
(method
))
6495 saw_constructor
= 1;
6499 sig
= build_java_argument_signature
(TREE_TYPE
(method
));
6500 found
= lookup_argument_method_generic
(class
, DECL_NAME
(method
), sig
,
6501 SEARCH_SUPER | SEARCH_INTERFACE
);
6503 /* Inner class can't declare static methods */
6504 if
(METHOD_STATIC
(method
) && !TOPLEVEL_CLASS_DECL_P
(class_decl
))
6506 char *t
= xstrdup
(lang_printable_name
(class
, 0));
6508 (method_wfl
, "Method %qs can't be static in inner class %qs. Only members of interfaces and top-level classes can be static",
6509 lang_printable_name
(method
, 2), t
);
6513 /* Nothing overrides or it's a private method. */
6516 if
(METHOD_PRIVATE
(found
))
6522 /* If `found' is declared in an interface, make sure the
6523 modifier matches. */
6524 if
(CLASS_INTERFACE
(TYPE_NAME
(DECL_CONTEXT
(found
)))
6525 && clinit_identifier_node
!= DECL_NAME
(found
)
6526 && !METHOD_PUBLIC
(method
))
6528 tree found_decl
= TYPE_NAME
(DECL_CONTEXT
(found
));
6529 parse_error_context
(method_wfl
, "Class %qs must override %qs with a public method in order to implement interface %qs",
6530 IDENTIFIER_POINTER
(DECL_NAME
(class_decl
)),
6531 lang_printable_name
(found
, 0),
6532 IDENTIFIER_POINTER
(DECL_NAME
(found_decl
)));
6535 /* Can't override a method with the same name and different return
6537 if
(TREE_TYPE
(TREE_TYPE
(found
)) != TREE_TYPE
(TREE_TYPE
(method
)))
6540 (lang_printable_name
(TREE_TYPE
(TREE_TYPE
(found
)), 2));
6543 "Method %qs was defined with return type %qs in class %qs",
6544 lang_printable_name
(found
, 2), t
,
6546 (DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(found
)))));
6550 aflags
= get_access_flags_from_decl
(found
);
6552 /* Can't override final. Can't override static. */
6553 if
(METHOD_FINAL
(found
) || METHOD_STATIC
(found
))
6555 /* Static *can* override static */
6556 if
(METHOD_STATIC
(found
) && METHOD_STATIC
(method
))
6560 "%s methods can't be overridden. Method %qs is %s in class %qs",
6561 (METHOD_FINAL
(found
) ?
"Final" : "Static"),
6562 lang_printable_name
(found
, 2),
6563 (METHOD_FINAL
(found
) ?
"final" : "static"),
6565 (DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(found
)))));
6569 /* Static method can't override instance method. */
6570 if
(METHOD_STATIC
(method
))
6574 "Instance methods can't be overridden by a static method. Method %qs is an instance method in class %qs",
6575 lang_printable_name
(found
, 2),
6577 (DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(found
)))));
6581 /* - Overriding/hiding public must be public
6582 - Overriding/hiding protected must be protected or public
6583 - If the overridden or hidden method has default (package)
6584 access, then the overriding or hiding method must not be
6585 private; otherwise, a compile-time error occurs. If
6586 `found' belongs to an interface, things have been already
6588 if
(!CLASS_INTERFACE
(TYPE_NAME
(DECL_CONTEXT
(found
)))
6589 && ((METHOD_PUBLIC
(found
) && !METHOD_PUBLIC
(method
))
6590 ||
(METHOD_PROTECTED
(found
)
6591 && !(METHOD_PUBLIC
(method
) || METHOD_PROTECTED
(method
)))
6592 ||
(!(aflags
& (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC
))
6593 && METHOD_PRIVATE
(method
))))
6597 "Methods can't be overridden to be more private. Method %qs is not %s in class %qs", lang_printable_name
(method
, 2),
6598 (METHOD_PUBLIC
(method
) ?
"public" :
6599 (METHOD_PRIVATE
(method
) ?
"private" : "protected")),
6600 IDENTIFIER_POINTER
(DECL_NAME
6601 (TYPE_NAME
(DECL_CONTEXT
(found
)))));
6605 /* Check this method against all the other implementations it
6606 overrides. Here we only check the class hierarchy; the rest
6607 of the checking is done later. If this method is just a
6608 Miranda method, we can skip the check. */
6609 if
(! METHOD_INVISIBLE
(method
))
6610 check_concrete_throws_clauses
(class
, method
, DECL_NAME
(method
), sig
);
6613 /* The above throws clause check only looked at superclasses. Now
6614 we must also make sure that all methods declared in interfaces
6615 have compatible throws clauses. FIXME: there are more efficient
6616 ways to organize this checking; we should implement one. */
6617 check_interface_throws_clauses
(class
, class
);
6619 if
(!TYPE_NVIRTUALS
(class
))
6620 TYPE_METHODS
(class
) = nreverse
(TYPE_METHODS
(class
));
6622 /* Search for inherited abstract method not yet implemented in this
6624 java_check_abstract_method_definitions
(class_decl
);
6626 if
(!saw_constructor
)
6630 /* Check to make sure that all the methods in all the interfaces
6631 implemented by CLASS_DECL are compatible with the concrete
6632 implementations available in CHECK_CLASS_DECL. */
6634 check_interface_throws_clauses
(tree check_class_decl
, tree class_decl
)
6636 for
(; class_decl
!= NULL_TREE
; class_decl
= CLASSTYPE_SUPER
(class_decl
))
6640 if
(! CLASS_LOADED_P
(class_decl
))
6642 if
(CLASS_FROM_SOURCE_P
(class_decl
))
6643 safe_layout_class
(class_decl
);
6645 load_class
(class_decl
, 1);
6648 for
(i
= BINFO_N_BASE_BINFOS
(TYPE_BINFO
(class_decl
)) - 1; i
> 0; --i
)
6651 = BINFO_TYPE
(BINFO_BASE_BINFO
(TYPE_BINFO
(class_decl
), i
));
6654 for
(iface_method
= TYPE_METHODS
(interface
);
6655 iface_method
!= NULL_TREE
;
6656 iface_method
= TREE_CHAIN
(iface_method
))
6660 /* First look for a concrete method implemented or
6661 inherited by this class. No need to search
6662 interfaces here, since we're already looking through
6664 sig
= build_java_argument_signature
(TREE_TYPE
(iface_method
));
6666 = lookup_argument_method_generic
(check_class_decl
,
6667 DECL_NAME
(iface_method
),
6668 sig
, SEARCH_VISIBLE
);
6669 /* If we don't find an implementation, that is ok. Any
6670 potential errors from that are diagnosed elsewhere.
6671 Also, multiple inheritance with conflicting throws
6672 clauses is fine in the absence of a concrete
6674 if
(method
!= NULL_TREE
&& !METHOD_ABSTRACT
(method
)
6675 && !METHOD_INVISIBLE
(iface_method
))
6677 tree method_wfl
= DECL_FUNCTION_WFL
(method
);
6678 check_throws_clauses
(method
, method_wfl
, iface_method
);
6682 /* Now check superinterfaces. */
6683 check_interface_throws_clauses
(check_class_decl
, interface
);
6688 /* Check throws clauses of a method against the clauses of all the
6689 methods it overrides. We do this by searching up the class
6690 hierarchy, examining all matching accessible methods. */
6692 check_concrete_throws_clauses
(tree class
, tree self_method
,
6693 tree name
, tree signature
)
6695 tree method
= lookup_argument_method_generic
(class
, name
, signature
,
6696 SEARCH_SUPER | SEARCH_VISIBLE
);
6697 while
(method
!= NULL_TREE
)
6699 if
(! METHOD_INVISIBLE
(method
) && hack_is_accessible_p
(method
, class
))
6700 check_throws_clauses
(self_method
, DECL_FUNCTION_WFL
(self_method
),
6703 method
= lookup_argument_method_generic
(DECL_CONTEXT
(method
),
6705 SEARCH_SUPER | SEARCH_VISIBLE
);
6709 /* Generate an error if the `throws' clause of METHOD (if any) is
6710 incompatible with the `throws' clause of FOUND (if any). */
6712 check_throws_clauses
(tree method
, tree method_wfl
, tree found
)
6716 for
(mthrows
= DECL_FUNCTION_THROWS
(method
);
6717 mthrows
; mthrows
= TREE_CHAIN
(mthrows
))
6721 /* We don't verify unchecked expressions */
6722 if
(IS_UNCHECKED_EXCEPTION_P
(TREE_VALUE
(mthrows
)))
6724 /* Checked expression must be compatible */
6725 for
(fthrows
= DECL_FUNCTION_THROWS
(found
);
6726 fthrows
; fthrows
= TREE_CHAIN
(fthrows
))
6728 if
(inherits_from_p
(TREE_VALUE
(mthrows
), TREE_VALUE
(fthrows
)))
6734 (method_wfl
, "Invalid checked exception class %qs in %<throws%> clause. The exception must be a subclass of an exception thrown by %qs from class %qs",
6735 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(TREE_VALUE
(mthrows
)))),
6736 lang_printable_name
(found
, 2),
6738 (DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(found
)))));
6743 /* Check abstract method of interface INTERFACE */
6745 java_check_abstract_methods
(tree interface_decl
)
6749 tree interface
= TREE_TYPE
(interface_decl
);
6752 for
(method
= TYPE_METHODS
(interface
); method
; method
= TREE_CHAIN
(method
))
6754 /* 2- Check for double definition inside the defining interface */
6755 if
(check_method_redefinition
(interface
, method
))
6758 /* 3- Overriding is OK as far as we preserve the return type. */
6759 found
= lookup_java_interface_method2
(interface
, method
);
6763 t
= xstrdup
(lang_printable_name
(TREE_TYPE
(TREE_TYPE
(found
)), 2));
6765 (DECL_FUNCTION_WFL
(found
),
6766 "Method %qs was defined with return type %qs in class %qs",
6767 lang_printable_name
(found
, 2), t
,
6769 (DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(found
)))));
6775 /* 4- Inherited methods can't differ by their returned types */
6776 for
(i
= 0; BINFO_BASE_ITERATE
(TYPE_BINFO
(interface
), i
, base_binfo
); i
++)
6778 tree sub_interface_method
, sub_interface
;
6780 sub_interface
= BINFO_TYPE
(base_binfo
);
6781 for
(sub_interface_method
= TYPE_METHODS
(sub_interface
);
6782 sub_interface_method
;
6783 sub_interface_method
= TREE_CHAIN
(sub_interface_method
))
6785 found
= lookup_java_interface_method2
(interface
,
6786 sub_interface_method
);
6787 if
(found
&& (found
!= sub_interface_method
))
6790 (lookup_cl
(sub_interface_method
),
6791 "Interface %qs inherits method %qs from interface %qs. This method is redefined with a different return type in interface %qs",
6792 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(interface
))),
6793 lang_printable_name
(found
, 2),
6795 (DECL_NAME
(TYPE_NAME
6796 (DECL_CONTEXT
(sub_interface_method
)))),
6798 (DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(found
)))));
6804 /* Lookup methods in interfaces using their name and partial
6805 signature. Return a matching method only if their types differ. */
6808 lookup_java_interface_method2
(tree class
, tree method_decl
)
6814 for
(i
= 0; BINFO_BASE_ITERATE
(TYPE_BINFO
(class
), i
, base_binfo
); i
++)
6816 if
((BINFO_TYPE
(base_binfo
) != object_type_node
)
6818 lookup_java_method2
(BINFO_TYPE
(base_binfo
), method_decl
, 1)))
6821 for
(i
= 0; BINFO_BASE_ITERATE
(TYPE_BINFO
(class
), i
, base_binfo
); i
++)
6823 to_return
= lookup_java_interface_method2
6824 (BINFO_TYPE
(base_binfo
), method_decl
);
6832 /* Lookup method using their name and partial signature. Return a
6833 matching method only if their types differ. */
6836 lookup_java_method2
(tree clas
, tree method_decl
, int do_interface
)
6838 tree method
, method_signature
, method_name
, method_type
, name
;
6840 method_signature
= build_java_argument_signature
(TREE_TYPE
(method_decl
));
6841 name
= DECL_NAME
(method_decl
);
6842 method_name
= (TREE_CODE
(name
) == EXPR_WITH_FILE_LOCATION ?
6843 EXPR_WFL_NODE
(name
) : name
);
6844 method_type
= TREE_TYPE
(TREE_TYPE
(method_decl
));
6846 while
(clas
!= NULL_TREE
)
6848 for
(method
= TYPE_METHODS
(clas
);
6849 method
!= NULL_TREE
; method
= TREE_CHAIN
(method
))
6851 tree method_sig
= build_java_argument_signature
(TREE_TYPE
(method
));
6852 tree name
= DECL_NAME
(method
);
6853 if
((TREE_CODE
(name
) == EXPR_WITH_FILE_LOCATION ?
6854 EXPR_WFL_NODE
(name
) : name
) == method_name
6855 && method_sig
== method_signature
6856 && TREE_TYPE
(TREE_TYPE
(method
)) != method_type
)
6859 clas
= (do_interface ? NULL_TREE
: CLASSTYPE_SUPER
(clas
));
6864 /* Return the line that matches DECL line number, and try its best to
6865 position the column number. Used during error reports.
6866 FUTURE/FIXME: return source_location instead of node. */
6868 static GTY
(()) tree cl_v
;
6870 lookup_cl
(tree decl
)
6872 #ifndef USE_MAPPED_LOCATION
6879 if
(cl_v
== NULL_TREE
)
6881 cl_v
= build_unknown_wfl
(NULL_TREE
);
6884 #ifdef USE_MAPPED_LOCATION
6885 SET_EXPR_LOCATION
(cl_v
, DECL_SOURCE_LOCATION
(decl
));
6887 EXPR_WFL_FILENAME_NODE
(cl_v
) = get_identifier
(DECL_SOURCE_FILE
(decl
));
6888 EXPR_WFL_SET_LINECOL
(cl_v
, DECL_SOURCE_LINE
(decl
), -1);
6890 line
= java_get_line_col
(EXPR_WFL_FILENAME
(cl_v
),
6891 EXPR_WFL_LINENO
(cl_v
), EXPR_WFL_COLNO
(cl_v
));
6893 found
= strstr
((const char *)line
,
6894 (const char *)IDENTIFIER_POINTER
(DECL_NAME
(decl
)));
6896 EXPR_WFL_SET_LINECOL
(cl_v
, EXPR_WFL_LINENO
(cl_v
), found
- line
);
6902 /* Look for a simple name in the single-type import list */
6905 find_name_in_single_imports
(tree name
)
6909 for
(node
= ctxp
->import_list
; node
; node
= TREE_CHAIN
(node
))
6910 if
(TREE_VALUE
(node
) == name
)
6911 return
(EXPR_WFL_NODE
(TREE_PURPOSE
(node
)));
6916 /* Process all single-type import. */
6919 process_imports
(void)
6924 for
(import
= ctxp
->import_list
; import
; import
= TREE_CHAIN
(import
))
6926 tree to_be_found
= EXPR_WFL_NODE
(TREE_PURPOSE
(import
));
6927 char *original_name
;
6929 /* Don't load twice something already defined. */
6930 if
(IDENTIFIER_CLASS_VALUE
(to_be_found
))
6933 original_name
= xmemdup
(IDENTIFIER_POINTER
(to_be_found
),
6934 IDENTIFIER_LENGTH
(to_be_found
),
6935 IDENTIFIER_LENGTH
(to_be_found
) + 1);
6941 QUALIFIED_P
(to_be_found
) = 1;
6942 load_class
(to_be_found
, 0);
6944 check_pkg_class_access
(to_be_found
, TREE_PURPOSE
(import
), true
, NULL_TREE
);
6946 /* We found it, we can bail out */
6947 if
(IDENTIFIER_CLASS_VALUE
(to_be_found
))
6949 check_deprecation
(TREE_PURPOSE
(import
),
6950 IDENTIFIER_CLASS_VALUE
(to_be_found
));
6954 /* We haven't found it. Maybe we're trying to access an
6955 inner class. The only way for us to know is to try again
6956 after having dropped a qualifier. If we can't break it further,
6957 we have an error. */
6958 if
(split_qualified_name
(&left
, NULL
, to_be_found
))
6963 if
(!IDENTIFIER_CLASS_VALUE
(to_be_found
))
6965 parse_error_context
(TREE_PURPOSE
(import
),
6966 "Class or interface %qs not found in import",
6971 free
(original_name
);
6978 /* Possibly find and mark a class imported by a single-type import
6982 find_in_imports
(tree enclosing_type
, tree class_type
)
6985 if
(enclosing_type
&& TYPE_IMPORT_LIST
(enclosing_type
))
6986 import
= TYPE_IMPORT_LIST
(enclosing_type
);
6988 import
= ctxp
->import_list
;
6992 if
(TREE_VALUE
(import
) == TYPE_NAME
(class_type
))
6994 TYPE_NAME
(class_type
) = EXPR_WFL_NODE
(TREE_PURPOSE
(import
));
6995 QUALIFIED_P
(TYPE_NAME
(class_type
)) = 1;
6998 import
= TREE_CHAIN
(import
);
7003 note_possible_classname
(const char *name
, int len
)
7006 if
(len
> 5 && strncmp
(&name
[len
-5], ".java", 5) == 0)
7008 else if
(len
> 6 && strncmp
(&name
[len
-6], ".class", 6) == 0)
7012 node
= ident_subst
(name
, len
, "", '/', '.', "");
7013 IS_A_CLASSFILE_NAME
(node
) = 1; /* Or soon to be */
7014 QUALIFIED_P
(node
) = strchr
(name
, '/') ?
1 : 0;
7018 /* Read a import directory, gathering potential match for further type
7019 references. Indifferently reads a filesystem or a ZIP archive
7023 read_import_dir
(tree wfl
)
7025 tree package_id
= EXPR_WFL_NODE
(wfl
);
7026 const char *package_name
= IDENTIFIER_POINTER
(package_id
);
7027 int package_length
= IDENTIFIER_LENGTH
(package_id
);
7029 JCF
*saved_jcf
= current_jcf
;
7034 struct buffer filename
[1];
7036 if
(IS_AN_IMPORT_ON_DEMAND_P
(package_id
))
7038 IS_AN_IMPORT_ON_DEMAND_P
(package_id
) = 1;
7040 BUFFER_INIT
(filename
);
7041 buffer_grow
(filename
, package_length
+ 100);
7043 for
(entry
= jcf_path_start
(); entry
!= NULL
; entry
= jcf_path_next
(entry
))
7045 const char *entry_name
= jcf_path_name
(entry
);
7046 int entry_length
= strlen
(entry_name
);
7047 if
(jcf_path_is_zipfile
(entry
))
7050 buffer_grow
(filename
, entry_length
);
7051 memcpy
(filename
->data
, entry_name
, entry_length
- 1);
7052 filename
->data
[entry_length
-1] = '\0';
7053 zipf
= opendir_in_zip
((const char *) filename
->data
, jcf_path_is_system
(entry
));
7055 error ("malformed .zip archive in CLASSPATH: %s", entry_name
);
7058 ZipDirectory
*zipd
= (ZipDirectory
*) zipf
->central_directory
;
7059 BUFFER_RESET
(filename
);
7060 for
(k
= 0; k
< package_length
; k
++)
7062 char ch
= package_name
[k
];
7063 *filename
->ptr
++ = ch
== '.' ?
'/' : ch
;
7065 *filename
->ptr
++ = '/';
7067 for
(k
= 0; k
< zipf
->count
; k
++, zipd
= ZIPDIR_NEXT
(zipd
))
7069 const char *current_entry
= ZIPDIR_FILENAME
(zipd
);
7070 int current_entry_len
= zipd
->filename_length
;
7072 if
(current_entry_len
>= BUFFER_LENGTH
(filename
)
7073 && strncmp
((const char *) filename
->data
, current_entry
,
7074 BUFFER_LENGTH
(filename
)) != 0)
7076 found |
= note_possible_classname
(current_entry
,
7083 BUFFER_RESET
(filename
);
7084 buffer_grow
(filename
, entry_length
+ package_length
+ 4);
7085 strcpy
((char *) filename
->data
, entry_name
);
7086 filename
->ptr
= filename
->data
+ entry_length
;
7087 for
(k
= 0; k
< package_length
; k
++)
7089 char ch
= package_name
[k
];
7090 *filename
->ptr
++ = ch
== '.' ?
'/' : ch
;
7092 *filename
->ptr
= '\0';
7094 dirp
= opendir
((const char *) filename
->data
);
7097 *filename
->ptr
++ = '/';
7102 struct dirent
*direntp
= readdir
(dirp
);
7105 d_name
= direntp
->d_name
;
7106 len
= strlen
(direntp
->d_name
);
7107 buffer_grow
(filename
, len
+1);
7108 strcpy
((char *) filename
->ptr
, d_name
);
7109 found |
= note_possible_classname
((const char *) filename
->data
+ entry_length
,
7110 package_length
+len
+1);
7117 free
(filename
->data
);
7119 /* Here we should have a unified way of retrieving an entry, to be
7123 static int first
= 1;
7126 error ("Can't find default package %qs. Check the CLASSPATH environment variable and the access to the archives", package_name
);
7131 parse_error_context
(wfl
, "Package %qs not found in import",
7133 current_jcf
= saved_jcf
;
7136 current_jcf
= saved_jcf
;
7139 /* Possibly find a type in the import on demands specified
7140 types. Returns 1 if an error occurred, 0 otherwise. Run through the
7141 entire list, to detected potential double definitions. */
7144 find_in_imports_on_demand
(tree enclosing_type
, tree class_type
)
7146 tree class_type_name
= TYPE_NAME
(class_type
);
7147 tree cl
= NULL_TREE
;
7148 int seen_once
= -1; /* -1 when not set, 1 if seen once, >1 otherwise. */
7149 int to_return
= -1; /* -1 when not set, 0 or 1 otherwise */
7153 if
(enclosing_type
&& TYPE_IMPORT_DEMAND_LIST
(enclosing_type
))
7154 import
= TYPE_IMPORT_DEMAND_LIST
(enclosing_type
);
7156 import
= ctxp
->import_demand_list
;
7158 for
(; import
; import
= TREE_CHAIN
(import
))
7160 location_t saved_location
= input_location
;
7162 const char *id_name
;
7163 tree decl
, type_name_copy
;
7165 obstack_grow
(&temporary_obstack
,
7166 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(TREE_PURPOSE
(import
))),
7167 IDENTIFIER_LENGTH
(EXPR_WFL_NODE
(TREE_PURPOSE
(import
))));
7168 obstack_1grow
(&temporary_obstack
, '.');
7169 obstack_grow0
(&temporary_obstack
,
7170 IDENTIFIER_POINTER
(class_type_name
),
7171 IDENTIFIER_LENGTH
(class_type_name
));
7172 id_name
= obstack_finish
(&temporary_obstack
);
7174 if
(! (node
= maybe_get_identifier
(id_name
)))
7177 /* Setup input_line so that it refers to the line of the import (in
7178 case we parse a class file and encounter errors */
7179 #ifdef USE_MAPPED_LOCATION
7180 input_location
= EXPR_LOCATION
(TREE_PURPOSE
(import
));
7182 input_line
= EXPR_WFL_LINENO
(TREE_PURPOSE
(import
));
7185 type_name_copy
= TYPE_NAME
(class_type
);
7186 TYPE_NAME
(class_type
) = node
;
7187 QUALIFIED_P
(node
) = 1;
7188 decl
= IDENTIFIER_CLASS_VALUE
(node
);
7190 /* If there is no DECL set for the class or if the class isn't
7191 loaded and not seen in source yet, then load */
7192 if
(!decl ||
! CLASS_LOADED_P
(TREE_TYPE
(decl
)))
7194 load_class
(node
, 0);
7195 decl
= IDENTIFIER_CLASS_VALUE
(node
);
7197 if
(decl
&& ! INNER_CLASS_P
(TREE_TYPE
(decl
)))
7198 access_check
= check_pkg_class_access
(node
, TREE_PURPOSE
(import
),
7201 /* 6.6.1: Inner classes are subject to member access rules. */
7204 input_location
= saved_location
;
7206 /* If the loaded class is not accessible or couldn't be loaded,
7207 we restore the original TYPE_NAME and process the next
7209 if
(access_check ||
!decl
)
7211 TYPE_NAME
(class_type
) = type_name_copy
;
7215 /* If the loaded class is accessible, we keep a tab on it to
7216 detect and report multiple inclusions. */
7217 if
(IS_A_CLASSFILE_NAME
(node
))
7221 cl
= TREE_PURPOSE
(import
);
7224 else if
(seen_once
>= 0)
7226 tree location
= (cl ? cl
: TREE_PURPOSE
(import
));
7227 tree package
= (cl ? EXPR_WFL_NODE
(cl
) :
7228 EXPR_WFL_NODE
(TREE_PURPOSE
(import
)));
7232 "Type %qs also potentially defined in package %qs",
7233 IDENTIFIER_POINTER
(TYPE_NAME
(class_type
)),
7234 IDENTIFIER_POINTER
(package
));
7237 to_return
= access_check
;
7243 return
(seen_once
< 0 ?
0 : seen_once
); /* It's ok not to have found */
7247 resolve_package
(tree pkg
, tree
*next
, tree
*type_name
)
7250 tree decl
= NULL_TREE
;
7251 *type_name
= NULL_TREE
;
7253 /* The trick is to determine when the package name stops and were
7254 the name of something contained in the package starts. Then we
7255 return a fully qualified name of what we want to get. */
7257 *next
= EXPR_WFL_QUALIFICATION
(pkg
);
7259 /* Try to progressively construct a type name */
7260 if
(TREE_CODE
(pkg
) == EXPR_WITH_FILE_LOCATION
)
7261 for
(current
= EXPR_WFL_QUALIFICATION
(pkg
);
7262 current
; current
= TREE_CHAIN
(current
))
7264 /* If we don't have what we're expecting, exit now. TYPE_NAME
7265 will be null and the error caught later. */
7266 if
(TREE_CODE
(QUAL_WFL
(current
)) != EXPR_WITH_FILE_LOCATION
)
7269 merge_qualified_name
(*type_name
, EXPR_WFL_NODE
(QUAL_WFL
(current
)));
7270 if
((decl
= resolve_no_layout
(*type_name
, NULL_TREE
)))
7272 /* resolve_package should be used in a loop, hence we
7273 point at this one to naturally process the next one at
7274 the next iteration. */
7282 /* Check accessibility of inner class DECL, from the context ENCLOSING_DECL,
7283 according to member access rules. */
7286 inner_class_accessible
(tree decl
, tree enclosing_decl
)
7288 tree enclosing_decl_type
;
7290 enclosing_decl_type
= TREE_TYPE
(enclosing_decl
);
7292 if
(CLASS_PRIVATE
(decl
))
7294 /* Access is permitted only within the body of the top-level
7295 class in which DECL is declared. */
7296 tree top_level
= decl
;
7297 while
(DECL_CONTEXT
(top_level
))
7298 top_level
= DECL_CONTEXT
(top_level
);
7299 while
(DECL_CONTEXT
(enclosing_decl
))
7300 enclosing_decl
= DECL_CONTEXT
(enclosing_decl
);
7301 if
(top_level
== enclosing_decl
)
7304 else if
(CLASS_PROTECTED
(decl
))
7307 /* Access is permitted from within the same package... */
7308 if
(in_same_package
(decl
, enclosing_decl
))
7311 /* ... or from within the body of a subtype of the context in which
7312 DECL is declared. */
7313 decl_context
= DECL_CONTEXT
(decl
);
7314 while
(enclosing_decl
)
7316 if
(CLASS_INTERFACE
(decl
))
7318 if
(interface_of_p
(TREE_TYPE
(decl_context
),
7319 enclosing_decl_type
))
7324 /* Eww. The order of the arguments is different!! */
7325 if
(inherits_from_p
(enclosing_decl_type
,
7326 TREE_TYPE
(decl_context
)))
7329 enclosing_decl
= DECL_CONTEXT
(enclosing_decl
);
7332 else if
(! CLASS_PUBLIC
(decl
))
7334 /* Access is permitted only from within the same package as DECL. */
7335 if
(in_same_package
(decl
, enclosing_decl
))
7339 /* Class is public. */
7345 /* Check accessibility of inner classes according to member access rules.
7346 DECL is the inner class, ENCLOSING_DECL is the class from which the
7347 access is being attempted. */
7350 check_inner_class_access
(tree decl
, tree enclosing_decl
, tree cl
)
7354 /* We don't issue an error message when CL is null. CL can be null
7355 as a result of processing a JDEP crafted by source_start_java_method
7356 for the purpose of patching its parm decl. But the error would
7357 have been already trapped when fixing the method's signature.
7358 DECL can also be NULL in case of earlier errors. */
7362 if
(inner_class_accessible
(decl
, enclosing_decl
))
7365 if
(CLASS_PRIVATE
(decl
))
7367 else if
(CLASS_PROTECTED
(decl
))
7368 access
= "protected";
7370 access
= "non-public";
7372 parse_error_context
(cl
, "Nested %s %s is %s; cannot be accessed from here",
7373 (CLASS_INTERFACE
(decl
) ?
"interface" : "class"),
7374 lang_printable_name
(decl
, 2), access
);
7377 /* Accessibility check for top-level classes. If CLASS_NAME is in a
7378 foreign package, it must be PUBLIC. Return 0 if no access
7379 violations were found, 1 otherwise. If VERBOSE is true and an error
7380 was found, it is reported and accounted for. If CL is NULL then
7381 look it up with THIS_DECL. */
7384 check_pkg_class_access
(tree class_name
, tree cl
, bool verbose
, tree this_decl
)
7388 if
(!IDENTIFIER_CLASS_VALUE
(class_name
))
7391 if
(!(type
= TREE_TYPE
(IDENTIFIER_CLASS_VALUE
(class_name
))))
7394 if
(!CLASS_PUBLIC
(TYPE_NAME
(type
)))
7396 /* Access to a private class within the same package is
7399 split_qualified_name
(&l
, &r
, class_name
);
7400 if
(!QUALIFIED_P
(class_name
) && !ctxp
->package
)
7401 /* Both in the empty package. */
7403 if
(l
== ctxp
->package
)
7404 /* Both in the same package. */
7409 (cl
== NULL ? lookup_cl
(this_decl
): cl
,
7410 "Can't access %s %qs. Only public classes and interfaces in other packages can be accessed",
7411 (CLASS_INTERFACE
(TYPE_NAME
(type
)) ?
"interface" : "class"),
7412 IDENTIFIER_POINTER
(class_name
));
7418 /* Local variable declaration. */
7421 declare_local_variables
(int modifier
, tree type
, tree vlist
)
7423 tree decl
, current
, saved_type
;
7424 tree type_wfl
= NULL_TREE
;
7428 /* Push a new block if statements were seen between the last time we
7429 pushed a block and now. Keep a count of blocks to close */
7430 if
(BLOCK_EXPR_BODY
(GET_CURRENT_BLOCK
(current_function_decl
)))
7432 tree b
= enter_block
();
7433 BLOCK_IS_IMPLICIT
(b
) = 1;
7439 for
(i
= 0; i
< ARRAY_SIZE
(ctxp
->modifier_ctx
); i
++)
7440 if
(1 << i
& modifier
)
7442 if
(modifier
== ACC_FINAL
)
7447 (ctxp
->modifier_ctx
[i
],
7448 "Only %<final%> is allowed as a local variables modifier");
7453 /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
7454 hold the TYPE value if a new incomplete has to be created (as
7455 opposed to being found already existing and reused). */
7456 SET_TYPE_FOR_RESOLUTION
(type
, type_wfl
, must_chain
);
7458 /* If TYPE is fully resolved and we don't have a reference, make one */
7459 PROMOTE_RECORD_IF_COMPLETE
(type
, must_chain
);
7461 /* Go through all the declared variables */
7462 for
(current
= vlist
, saved_type
= type
; current
;
7463 current
= TREE_CHAIN
(current
), type
= saved_type
)
7465 tree other
, real_type
;
7466 tree wfl
= TREE_PURPOSE
(current
);
7467 tree name
= EXPR_WFL_NODE
(wfl
);
7468 tree init
= TREE_VALUE
(current
);
7470 /* Process NAME, as it may specify extra dimension(s) for it */
7471 type
= build_array_from_name
(type
, type_wfl
, name
, &name
);
7473 /* Variable redefinition check */
7474 if
((other
= lookup_name_in_blocks
(name
)))
7476 variable_redefinition_error
(wfl
, name
, TREE_TYPE
(other
),
7477 DECL_SOURCE_LINE
(other
));
7481 /* Type adjustment. We may have just readjusted TYPE because
7482 the variable specified more dimensions. Make sure we have
7483 a reference if we can and don't have one already. */
7484 PROMOTE_RECORD_IF_COMPLETE
(type
, must_chain
);
7486 real_type
= GET_REAL_TYPE
(type
);
7487 /* Never layout this decl. This will be done when its scope
7489 decl
= build_decl
(VAR_DECL
, name
, real_type
);
7490 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC
(decl
);
7491 DECL_FINAL
(decl
) = final_p
;
7492 BLOCK_CHAIN_DECL
(decl
);
7494 /* Don't try to use an INIT statement when an error was found */
7495 if
(init
&& java_error_count
)
7498 /* Remember it if this is an initialized-upon-declaration final
7500 if
(init
&& final_p
)
7502 DECL_LOCAL_FINAL_IUD
(decl
) = 1;
7505 /* Add the initialization function to the current function's code */
7508 /* Name might have been readjusted */
7509 EXPR_WFL_NODE
(TREE_OPERAND
(init
, 0)) = name
;
7510 MODIFY_EXPR_FROM_INITIALIZATION_P
(init
) = 1;
7511 java_method_add_stmt
(current_function_decl
,
7512 build_debugable_stmt
(EXPR_WFL_LINECOL
(init
),
7516 /* Setup dependency the type of the decl */
7520 register_incomplete_type
(JDEP_VARIABLE
, type_wfl
, decl
, type
);
7521 dep
= CLASSD_LAST
(ctxp
->classd_list
);
7522 JDEP_GET_PATCH
(dep
) = &TREE_TYPE
(decl
);
7525 SOURCE_FRONTEND_DEBUG
(("Defined locals"));
7528 /* Called during parsing. Build decls from argument list. */
7531 source_start_java_method
(tree fndecl
)
7540 current_function_decl
= fndecl
;
7542 /* New scope for the function */
7544 for
(tem
= TYPE_ARG_TYPES
(TREE_TYPE
(fndecl
)), i
= 0;
7545 tem
!= end_params_node
; tem
= TREE_CHAIN
(tem
), i
++)
7547 tree type
= TREE_VALUE
(tem
);
7548 tree name
= TREE_PURPOSE
(tem
);
7550 /* If type is incomplete. Create an incomplete decl and ask for
7551 the decl to be patched later */
7552 if
(INCOMPLETE_TYPE_P
(type
))
7555 tree real_type
= GET_REAL_TYPE
(type
);
7556 parm_decl
= build_decl
(PARM_DECL
, name
, real_type
);
7557 type
= obtain_incomplete_type
(type
);
7558 register_incomplete_type
(JDEP_PARM
, NULL_TREE
, NULL_TREE
, type
);
7559 jdep
= CLASSD_LAST
(ctxp
->classd_list
);
7560 JDEP_MISC
(jdep
) = name
;
7561 JDEP_GET_PATCH
(jdep
) = &TREE_TYPE
(parm_decl
);
7564 parm_decl
= build_decl
(PARM_DECL
, name
, type
);
7566 /* Remember if a local variable was declared final (via its
7567 TREE_LIST of type/name.) Set DECL_FINAL accordingly. */
7568 if
(ARG_FINAL_P
(tem
))
7570 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC
(parm_decl
);
7571 DECL_FINAL
(parm_decl
) = 1;
7574 if
(name
== this_identifier_node
)
7575 DECL_ARTIFICIAL
(parm_decl
) = 1;
7577 BLOCK_CHAIN_DECL
(parm_decl
);
7579 tem
= BLOCK_EXPR_DECLS
(DECL_FUNCTION_BODY
(current_function_decl
));
7580 BLOCK_EXPR_DECLS
(DECL_FUNCTION_BODY
(current_function_decl
)) =
7582 DECL_ARG_SLOT_COUNT
(current_function_decl
) = i
;
7583 DECL_MAX_LOCALS
(current_function_decl
) = i
;
7586 /* Called during parsing. Creates an artificial method declaration. */
7589 create_artificial_method
(tree class
, int flags
, tree type
,
7590 tree name
, tree args
)
7593 location_t save_location
= input_location
;
7595 input_location
= DECL_SOURCE_LOCATION
(TYPE_NAME
(class
));
7596 mdecl
= make_node
(FUNCTION_TYPE
);
7597 TREE_TYPE
(mdecl
) = type
;
7598 TYPE_ARG_TYPES
(mdecl
) = args
;
7599 /* We used to compute the signature of MDECL here and then use
7600 add_method(), but that failed because our caller might modify
7601 the type of the returned method, which trashes the cache in
7602 get_type_from_signature(). */
7603 mdecl
= add_method_1
(class
, flags
, name
, mdecl
);
7604 input_location
= save_location
;
7605 DECL_ARTIFICIAL
(mdecl
) = 1;
7609 /* Starts the body if an artificial method. */
7612 start_artificial_method_body
(tree mdecl
)
7614 #ifdef USE_MAPPED_LOCATION
7615 DECL_SOURCE_LOCATION
(mdecl
) = ctxp
->file_start_location
;
7616 DECL_FUNCTION_LAST_LINE
(mdecl
) = ctxp
->file_start_location
;
7618 DECL_SOURCE_LINE
(mdecl
) = 1;
7619 DECL_FUNCTION_LAST_LINE
(mdecl
) = 1;
7621 source_start_java_method
(mdecl
);
7626 end_artificial_method_body
(tree mdecl
)
7628 /* exit_block modifies DECL_FUNCTION_BODY (current_function_decl).
7629 It has to be evaluated first. (if mdecl is current_function_decl,
7630 we have an undefined behavior if no temporary variable is used.) */
7631 tree b
= exit_block
();
7632 BLOCK_EXPR_BODY
(DECL_FUNCTION_BODY
(mdecl
)) = b
;
7636 /* Dump a tree of some kind. This is a convenience wrapper for the
7637 dump_* functions in tree-dump.c. */
7639 dump_java_tree
(enum tree_dump_index phase
, tree t
)
7644 stream
= dump_begin
(phase
, &flags
);
7648 dump_node
(t
, flags
, stream
);
7649 dump_end
(phase
, stream
);
7653 /* Terminate a function and expand its body. */
7656 source_end_java_method
(void)
7658 tree fndecl
= current_function_decl
;
7663 java_parser_context_save_global
();
7664 #ifdef USE_MAPPED_LOCATION
7665 input_location
= ctxp
->last_ccb_indent1
;
7667 input_line
= ctxp
->last_ccb_indent1
;
7670 /* Turn function bodies with only a NOP expr null, so they don't get
7671 generated at all and we won't get warnings when using the -W
7673 if
(IS_EMPTY_STMT
(BLOCK_EXPR_BODY
(DECL_FUNCTION_BODY
(fndecl
))))
7674 BLOCK_EXPR_BODY
(DECL_FUNCTION_BODY
(fndecl
)) = NULL_TREE
;
7676 if
(BLOCK_EXPR_BODY
(DECL_FUNCTION_BODY
(fndecl
))
7677 && ! flag_emit_class_files
)
7678 finish_method
(fndecl
);
7680 current_function_decl
= NULL_TREE
;
7681 java_parser_context_restore_global
();
7682 current_function_decl
= NULL_TREE
;
7685 /* Record EXPR in the current function block. Complements compound
7686 expression second operand if necessary. */
7689 java_method_add_stmt
(tree fndecl
, tree expr
)
7691 if
(!GET_CURRENT_BLOCK
(fndecl
))
7693 return add_stmt_to_block
(GET_CURRENT_BLOCK
(fndecl
), NULL_TREE
, expr
);
7697 add_stmt_to_block
(tree b
, tree type
, tree stmt
)
7699 tree body
= BLOCK_EXPR_BODY
(b
), c
;
7701 if
(java_error_count
)
7704 if
((c
= add_stmt_to_compound
(body
, type
, stmt
)) == body
)
7707 BLOCK_EXPR_BODY
(b
) = c
;
7708 TREE_SIDE_EFFECTS
(c
) = 1;
7712 /* Lays out the methods for the classes seen so far. */
7715 java_layout_seen_class_methods
(void)
7717 tree previous_list
= all_class_list
;
7718 tree end
= NULL_TREE
;
7723 for
(current
= previous_list
;
7724 current
!= end
; current
= TREE_CHAIN
(current
))
7726 tree decl
= TREE_VALUE
(current
);
7727 tree cls
= TREE_TYPE
(decl
);
7729 input_location
= DECL_SOURCE_LOCATION
(decl
);
7731 if
(! CLASS_LOADED_P
(cls
))
7732 load_class
(cls
, 0);
7734 layout_class_methods
(cls
);
7737 /* Note that new classes might have been added while laying out
7738 methods, changing the value of all_class_list. */
7740 if
(previous_list
!= all_class_list
)
7742 end
= previous_list
;
7743 previous_list
= all_class_list
;
7750 static GTY
(()) tree stop_reordering
;
7752 java_reorder_fields
(void)
7756 for
(current
= gclass_list
; current
; current
= TREE_CHAIN
(current
))
7758 output_class
= current_class
= TREE_TYPE
(TREE_VALUE
(current
));
7760 if
(current_class
== stop_reordering
)
7763 /* Reverse the fields, but leave the dummy field in front.
7764 Fields are already ordered for Object and Class */
7765 if
(TYPE_FIELDS
(current_class
) && current_class
!= object_type_node
7766 && current_class
!= class_type_node
)
7768 /* If the dummy field is there, reverse the right fields and
7769 just layout the type for proper fields offset */
7770 if
(!DECL_NAME
(TYPE_FIELDS
(current_class
)))
7772 tree fields
= TYPE_FIELDS
(current_class
);
7773 /* This works around a problem where on some platforms,
7774 the field might be given its size incorrectly. */
7775 DECL_SIZE
(fields
) = NULL_TREE
;
7776 DECL_SIZE_UNIT
(fields
) = NULL_TREE
;
7777 TREE_CHAIN
(fields
) = nreverse
(TREE_CHAIN
(fields
));
7778 TYPE_SIZE
(current_class
) = NULL_TREE
;
7780 /* We don't have a dummy field, we need to layout the class,
7781 after having reversed the fields */
7784 TYPE_FIELDS
(current_class
) =
7785 nreverse
(TYPE_FIELDS
(current_class
));
7786 TYPE_SIZE
(current_class
) = NULL_TREE
;
7790 /* There are cases were gclass_list will be empty. */
7792 stop_reordering
= TREE_TYPE
(TREE_VALUE
(gclass_list
));
7795 /* Layout the methods of all classes loaded in one way or another.
7796 Check methods of source parsed classes. Then reorder the
7797 fields and layout the classes or the type of all source parsed
7801 java_layout_classes
(void)
7804 int save_error_count
= java_error_count
;
7806 /* Layout the methods of all classes seen so far */
7807 java_layout_seen_class_methods
();
7808 java_parse_abort_on_error
();
7809 all_class_list
= NULL_TREE
;
7811 /* Then check the methods of all parsed classes */
7812 for
(current
= gclass_list
; current
; current
= TREE_CHAIN
(current
))
7813 if
(CLASS_FROM_SOURCE_P
(TREE_TYPE
(TREE_VALUE
(current
))))
7814 java_check_methods
(TREE_VALUE
(current
));
7815 java_parse_abort_on_error
();
7817 for
(current
= gclass_list
; current
; current
= TREE_CHAIN
(current
))
7819 output_class
= current_class
= TREE_TYPE
(TREE_VALUE
(current
));
7820 layout_class
(current_class
);
7822 /* Error reported by the caller */
7823 if
(java_error_count
)
7827 /* We might have reloaded classes durign the process of laying out
7828 classes for code generation. We must layout the methods of those
7829 late additions, as constructor checks might use them */
7830 java_layout_seen_class_methods
();
7831 java_parse_abort_on_error
();
7834 /* Expand methods in the current set of classes remembered for
7838 java_complete_expand_classes
(void)
7842 for
(current
= ctxp
->class_list
; current
; current
= TREE_CHAIN
(current
))
7843 if
(!INNER_CLASS_DECL_P
(current
))
7844 java_complete_expand_class
(current
);
7847 /* Expand the methods found in OUTER, starting first by OUTER's inner
7851 java_complete_expand_class
(tree outer
)
7855 /* We need to go after all inner classes and start expanding them,
7856 starting with most nested ones. We have to do that because nested
7857 classes might add functions to outer classes */
7859 for
(inner_list
= DECL_INNER_CLASS_LIST
(outer
);
7860 inner_list
; inner_list
= TREE_CHAIN
(inner_list
))
7861 java_complete_expand_class
(TREE_PURPOSE
(inner_list
));
7863 java_complete_expand_methods
(outer
);
7866 /* Expand methods registered in CLASS_DECL. The general idea is that
7867 we expand regular methods first. This allows us get an estimate on
7868 how outer context local alias fields are really used so we can add
7869 to the constructor just enough code to initialize them properly (it
7870 also lets us generate finit$ correctly.) Then we expand the
7871 constructors and then <clinit>. */
7874 java_complete_expand_methods
(tree class_decl
)
7876 tree clinit
, decl
, first_decl
;
7878 output_class
= current_class
= TREE_TYPE
(class_decl
);
7880 /* Pre-expand <clinit> to figure whether we really need it or
7881 not. If we do need it, we pre-expand the static fields so they're
7882 ready to be used somewhere else. <clinit> will be fully expanded
7883 after we processed the constructors. */
7884 first_decl
= TYPE_METHODS
(current_class
);
7885 clinit
= maybe_generate_pre_expand_clinit
(current_class
);
7887 /* Then generate finit$ (if we need to) because constructors will
7889 if
(TYPE_FINIT_STMT_LIST
(current_class
))
7890 java_complete_expand_method
(generate_finit
(current_class
));
7892 /* Then generate instinit$ (if we need to) because constructors will
7894 if
(TYPE_II_STMT_LIST
(current_class
))
7895 java_complete_expand_method
(generate_instinit
(current_class
));
7897 /* Now do the constructors */
7898 for
(decl
= first_decl
; !java_error_count
&& decl
; decl
= TREE_CHAIN
(decl
))
7900 if
(!DECL_CONSTRUCTOR_P
(decl
))
7902 java_complete_expand_method
(decl
);
7905 /* First, do the ordinary methods. */
7906 for
(decl
= first_decl
; decl
; decl
= TREE_CHAIN
(decl
))
7908 /* Ctors aren't part of this batch. */
7909 if
(DECL_CONSTRUCTOR_P
(decl
) || DECL_CLINIT_P
(decl
))
7912 /* Skip abstract or native methods -- but do handle native
7913 methods when generating JNI stubs. */
7914 if
(METHOD_ABSTRACT
(decl
) ||
(! flag_jni
&& METHOD_NATIVE
(decl
)))
7916 DECL_FUNCTION_BODY
(decl
) = NULL_TREE
;
7920 if
(METHOD_NATIVE
(decl
))
7923 current_function_decl
= decl
;
7924 body
= build_jni_stub
(decl
);
7925 BLOCK_EXPR_BODY
(DECL_FUNCTION_BODY
(decl
)) = body
;
7928 java_complete_expand_method
(decl
);
7931 /* If there is indeed a <clinit>, fully expand it now */
7934 /* Prevent the use of `this' inside <clinit> */
7935 ctxp
->explicit_constructor_p
= 1;
7936 java_complete_expand_method
(clinit
);
7937 ctxp
->explicit_constructor_p
= 0;
7940 /* We might have generated a class$ that we now want to expand */
7941 if
(TYPE_DOT_CLASS
(current_class
))
7942 java_complete_expand_method
(TYPE_DOT_CLASS
(current_class
));
7944 /* Now verify constructor circularity (stop after the first one we
7946 if
(!CLASS_INTERFACE
(class_decl
))
7947 for
(decl
= TYPE_METHODS
(current_class
); decl
; decl
= TREE_CHAIN
(decl
))
7948 if
(DECL_CONSTRUCTOR_P
(decl
)
7949 && verify_constructor_circularity
(decl
, decl
))
7953 /* Attempt to create <clinit>. Pre-expand static fields so they can be
7954 safely used in some other methods/constructors. */
7957 maybe_generate_pre_expand_clinit
(tree class_type
)
7959 tree current
, mdecl
;
7961 if
(!TYPE_CLINIT_STMT_LIST
(class_type
))
7964 /* Go through all static fields and pre expand them */
7965 for
(current
= TYPE_FIELDS
(class_type
); current
;
7966 current
= TREE_CHAIN
(current
))
7967 if
(FIELD_STATIC
(current
))
7968 build_field_ref
(NULL_TREE
, class_type
, DECL_NAME
(current
));
7970 /* Then build the <clinit> method */
7971 mdecl
= create_artificial_method
(class_type
, ACC_STATIC
, void_type_node
,
7972 clinit_identifier_node
, end_params_node
);
7973 layout_class_method
(class_type
, CLASSTYPE_SUPER
(class_type
),
7975 start_artificial_method_body
(mdecl
);
7977 /* We process the list of assignment we produced as the result of
7978 the declaration of initialized static field and add them as
7979 statement to the <clinit> method. */
7980 for
(current
= TYPE_CLINIT_STMT_LIST
(class_type
); current
;
7981 current
= TREE_CHAIN
(current
))
7983 tree stmt
= current
;
7984 /* We build the assignment expression that will initialize the
7985 field to its value. There are strict rules on static
7986 initializers (8.5). FIXME */
7987 if
(TREE_CODE
(stmt
) != BLOCK
&& !IS_EMPTY_STMT
(stmt
))
7988 stmt
= build_debugable_stmt
(EXPR_WFL_LINECOL
(stmt
), stmt
);
7989 java_method_add_stmt
(mdecl
, stmt
);
7992 end_artificial_method_body
(mdecl
);
7994 /* Now we want to place <clinit> as the last method (because we need
7995 it at least for interface so that it doesn't interfere with the
7996 dispatch table based lookup. */
7997 if
(TREE_CHAIN
(TYPE_METHODS
(class_type
)))
7999 current
= TREE_CHAIN
(TYPE_METHODS
(class_type
));
8000 TYPE_METHODS
(class_type
) = current
;
8002 while
(TREE_CHAIN
(current
))
8003 current
= TREE_CHAIN
(current
);
8005 TREE_CHAIN
(current
) = mdecl
;
8006 TREE_CHAIN
(mdecl
) = NULL_TREE
;
8012 /* Analyzes a method body and look for something that isn't a
8013 MODIFY_EXPR with a constant value. Return true if <clinit> is
8014 needed, false otherwise. */
8017 analyze_clinit_body
(tree this_class
, tree bbody
)
8020 switch
(TREE_CODE
(bbody
))
8023 bbody
= BLOCK_EXPR_BODY
(bbody
);
8026 case EXPR_WITH_FILE_LOCATION
:
8027 bbody
= EXPR_WFL_NODE
(bbody
);
8031 if
(analyze_clinit_body
(this_class
, TREE_OPERAND
(bbody
, 0)))
8033 bbody
= TREE_OPERAND
(bbody
, 1);
8037 /* If we're generating to class file and we're dealing with an
8038 array initialization, we return 1 to keep <clinit> */
8039 if
(TREE_CODE
(TREE_OPERAND
(bbody
, 1)) == NEW_ARRAY_INIT
8040 && flag_emit_class_files
)
8043 /* There are a few cases where we're required to keep
8045 - If this is an assignment whose operand is not constant,
8046 - If this is an assignment to a non-initialized field,
8047 - If this field is not a member of the current class.
8049 return
(! TREE_CONSTANT
(TREE_OPERAND
(bbody
, 1))
8050 ||
! DECL_INITIAL
(TREE_OPERAND
(bbody
, 0))
8051 || DECL_CONTEXT
(TREE_OPERAND
(bbody
, 0)) != this_class
);
8054 /* We might see an empty statement here, which is
8056 return
! IS_EMPTY_STMT
(bbody
);
8065 /* See whether we could get rid of <clinit>. Criteria are: all static
8066 final fields have constant initial values and the body of <clinit>
8067 is empty. Return 1 if <clinit> was discarded, 0 otherwise. */
8070 maybe_yank_clinit
(tree mdecl
)
8075 if
(!DECL_CLINIT_P
(mdecl
))
8078 /* If the body isn't empty, then we keep <clinit>. Note that if
8079 we're emitting classfiles, this isn't enough not to rule it
8081 fbody
= DECL_FUNCTION_BODY
(mdecl
);
8082 bbody
= BLOCK_EXPR_BODY
(fbody
);
8083 if
(bbody
&& bbody
!= error_mark_node
)
8084 bbody
= BLOCK_EXPR_BODY
(bbody
);
8087 if
(bbody
&& ! flag_emit_class_files
&& !IS_EMPTY_STMT
(bbody
))
8090 type
= DECL_CONTEXT
(mdecl
);
8091 current
= TYPE_FIELDS
(type
);
8093 for
(current
= (current ? TREE_CHAIN
(current
) : current
);
8094 current
; current
= TREE_CHAIN
(current
))
8098 /* We're not interested in non-static fields. */
8099 if
(!FIELD_STATIC
(current
))
8102 /* Nor in fields without initializers. */
8103 f_init
= DECL_INITIAL
(current
);
8104 if
(f_init
== NULL_TREE
)
8107 /* Anything that isn't String or a basic type is ruled out -- or
8108 if we know how to deal with it (when doing things natively) we
8109 should generated an empty <clinit> so that SUID are computed
8111 if
(! JSTRING_TYPE_P
(TREE_TYPE
(current
))
8112 && ! JNUMERIC_TYPE_P
(TREE_TYPE
(current
)))
8115 if
(! FIELD_FINAL
(current
) ||
! TREE_CONSTANT
(f_init
))
8119 /* Now we analyze the method body and look for something that
8120 isn't a MODIFY_EXPR */
8121 if
(bbody
&& !IS_EMPTY_STMT
(bbody
) && analyze_clinit_body
(type
, bbody
))
8124 /* Get rid of <clinit> in the class' list of methods */
8125 if
(TYPE_METHODS
(type
) == mdecl
)
8126 TYPE_METHODS
(type
) = TREE_CHAIN
(mdecl
);
8128 for
(current
= TYPE_METHODS
(type
); current
;
8129 current
= TREE_CHAIN
(current
))
8130 if
(TREE_CHAIN
(current
) == mdecl
)
8132 TREE_CHAIN
(current
) = TREE_CHAIN
(mdecl
);
8139 /* Install the argument from MDECL. Suitable to completion and
8140 expansion of mdecl's body. */
8143 start_complete_expand_method
(tree mdecl
)
8147 pushlevel
(1); /* Prepare for a parameter push */
8148 tem
= BLOCK_EXPR_DECLS
(DECL_FUNCTION_BODY
(current_function_decl
));
8149 DECL_ARGUMENTS
(mdecl
) = tem
;
8151 for
(; tem
; tem
= TREE_CHAIN
(tem
))
8153 /* TREE_CHAIN (tem) will change after pushdecl. */
8154 tree next
= TREE_CHAIN
(tem
);
8155 tree type
= TREE_TYPE
(tem
);
8156 if
(targetm.calls.promote_prototypes
(type
)
8157 && TYPE_PRECISION
(type
) < TYPE_PRECISION
(integer_type_node
)
8158 && INTEGRAL_TYPE_P
(type
))
8159 type
= integer_type_node
;
8160 DECL_ARG_TYPE
(tem
) = type
;
8161 layout_decl
(tem
, 0);
8163 /* Re-install the next so that the list is kept and the loop
8165 TREE_CHAIN
(tem
) = next
;
8167 pushdecl_force_head
(DECL_ARGUMENTS
(mdecl
));
8168 input_location
= DECL_SOURCE_LOCATION
(mdecl
);
8169 build_result_decl
(mdecl
);
8173 /* Complete and expand a method. */
8176 java_complete_expand_method
(tree mdecl
)
8178 tree fbody
, block_body
, exception_copy
;
8180 current_function_decl
= mdecl
;
8181 /* Fix constructors before expanding them */
8182 if
(DECL_CONSTRUCTOR_P
(mdecl
))
8183 fix_constructors
(mdecl
);
8185 /* Expand functions that have a body */
8186 if
(!DECL_FUNCTION_BODY
(mdecl
))
8189 fbody
= DECL_FUNCTION_BODY
(mdecl
);
8190 block_body
= BLOCK_EXPR_BODY
(fbody
);
8191 exception_copy
= NULL_TREE
;
8193 current_function_decl
= mdecl
;
8196 fprintf
(stderr
, " [%s.",
8197 lang_printable_name
(DECL_CONTEXT
(mdecl
), 0));
8198 announce_function
(mdecl
);
8200 fprintf
(stderr
, "]");
8202 /* Prepare the function for tree completion */
8203 start_complete_expand_method
(mdecl
);
8205 /* Install the current this */
8206 current_this
= (!METHOD_STATIC
(mdecl
) ?
8207 BLOCK_EXPR_DECLS
(DECL_FUNCTION_BODY
(mdecl
)) : NULL_TREE
);
8209 /* Install exceptions thrown with `throws' */
8210 PUSH_EXCEPTIONS
(DECL_FUNCTION_THROWS
(mdecl
));
8212 if
(block_body
!= NULL_TREE
)
8214 block_body
= java_complete_tree
(block_body
);
8216 /* Before we check initialization, attached all class initialization
8217 variable to the block_body */
8218 htab_traverse
(DECL_FUNCTION_INIT_TEST_TABLE
(mdecl
),
8219 attach_init_test_initialization_flags
, block_body
);
8221 if
(! METHOD_NATIVE
(mdecl
))
8223 check_for_initialization
(block_body
, mdecl
);
8225 /* Go through all the flags marking the initialization of
8226 static variables and see whether they're definitively
8227 assigned, in which case the type is remembered as
8228 definitively initialized in MDECL. */
8229 if
(STATIC_CLASS_INIT_OPT_P
())
8231 /* Always register the context as properly initialized in
8232 MDECL. This used with caution helps removing extra
8233 initialization of self. */
8234 if
(METHOD_STATIC
(mdecl
))
8237 (DECL_FUNCTION_INITIALIZED_CLASS_TABLE
(mdecl
),
8238 DECL_CONTEXT
(mdecl
), INSERT
)) = DECL_CONTEXT
(mdecl
);
8242 ctxp
->explicit_constructor_p
= 0;
8245 BLOCK_EXPR_BODY
(fbody
) = block_body
;
8247 /* If we saw a return but couldn't evaluate it properly, we'll have
8248 an error_mark_node here. */
8249 if
(block_body
!= error_mark_node
8250 && (block_body
== NULL_TREE || CAN_COMPLETE_NORMALLY
(block_body
))
8251 && TREE_CODE
(TREE_TYPE
(TREE_TYPE
(mdecl
))) != VOID_TYPE
)
8252 missing_return_error
(current_function_decl
);
8254 /* See if we can get rid of <clinit> if MDECL happens to be <clinit> */
8255 maybe_yank_clinit
(mdecl
);
8257 /* Pop the current level, with special measures if we found errors. */
8258 if
(java_error_count
)
8259 pushdecl_force_head
(DECL_ARGUMENTS
(mdecl
));
8262 /* Pop the exceptions and sanity check */
8264 if
(currently_caught_type_list
)
8268 /* For with each class for which there's code to generate. */
8271 java_expand_method_bodies
(tree class
)
8274 for
(decl
= TYPE_METHODS
(class
); decl
; decl
= TREE_CHAIN
(decl
))
8278 if
(! DECL_FUNCTION_BODY
(decl
))
8281 current_function_decl
= decl
;
8283 block
= BLOCK_EXPR_BODY
(DECL_FUNCTION_BODY
(decl
));
8285 /* Save the function body for gimplify and inlining. */
8286 DECL_SAVED_TREE
(decl
) = block
;
8288 /* It's time to assign the variable flagging static class
8289 initialization based on which classes invoked static methods
8290 are definitely initializing. This should be flagged. */
8291 if
(STATIC_CLASS_INIT_OPT_P
())
8293 tree list
= DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND
(decl
);
8294 for
(; list
!= NULL_TREE
; list
= TREE_CHAIN
(list
))
8296 /* Executed for each statement calling a static function.
8297 LIST is a TREE_LIST whose PURPOSE is the called function
8298 and VALUE is a compound whose second operand can be patched
8299 with static class initialization flag assignments. */
8301 tree called_method
= TREE_PURPOSE
(list
);
8302 tree compound
= TREE_VALUE
(list
);
8303 tree assignment_compound_list
8304 = build_tree_list
(called_method
, NULL
);
8306 /* For each class definitely initialized in
8307 CALLED_METHOD, fill ASSIGNMENT_COMPOUND with
8308 assignment to the class initialization flag. */
8309 htab_traverse
(DECL_FUNCTION_INITIALIZED_CLASS_TABLE
(called_method
),
8310 emit_test_initialization
,
8311 assignment_compound_list
);
8313 if
(TREE_VALUE
(assignment_compound_list
))
8314 TREE_OPERAND
(compound
, 1)
8315 = TREE_VALUE
(assignment_compound_list
);
8319 /* Expand the function body. */
8320 source_end_java_method
();
8326 /* This section of the code deals with accessing enclosing context
8327 fields either directly by using the relevant access to this$<n> or
8328 by invoking an access method crafted for that purpose. */
8330 /* Build the necessary access across nested class boundaries.
8331 This routine could be optimized to cache previous result
8332 (decl, current_class and returned access). When an access method
8333 needs to be generated, it always takes the form of a read. It might
8334 be later turned into a write by calling nested_field_access_fix. */
8337 build_nested_field_access
(tree id
, tree decl
)
8339 tree access
= NULL_TREE
;
8340 tree ctx
= NULL_TREE
;
8341 tree decl_ctx
= DECL_CONTEXT
(decl
);
8342 bool is_static
= FIELD_STATIC
(decl
);
8344 if
(DECL_CONTEXT
(TYPE_NAME
(current_class
)))
8345 ctx
= TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(current_class
)));
8347 /* For non-static fields, if the immediate enclosing context of the
8348 current class is the field decl's class or inherits from it,
8349 build the access as `this$<n>.<field>'. Note that we will break
8350 the `private' barrier if we're not emitting bytecodes. */
8353 && (ctx
== decl_ctx || inherits_from_p
(ctx
, decl_ctx
))
8354 && (!FIELD_PRIVATE
(decl
) ||
!flag_emit_class_files
))
8356 tree thisn
= build_current_thisn
(current_class
);
8357 access
= make_qualified_primary
(build_wfl_node
(thisn
),
8358 id
, EXPR_WFL_LINECOL
(id
));
8360 /* Otherwise, generate and use accessor methods for the field as
8364 int lc
= EXPR_WFL_LINECOL
(id
);
8366 /* Now we chain the required number of calls to the access$0 to
8367 get a hold to the enclosing instance we need for a non-static
8368 field, and then we build the field access. */
8370 access
= build_access_to_thisn
(current_class
, decl_ctx
, lc
);
8372 /* If the field is private and we're generating bytecode, then
8373 we generate an access method. */
8374 if
(FIELD_PRIVATE
(decl
) && flag_emit_class_files
)
8376 tree name
= build_nested_field_access_methods
(decl
);
8377 access
= build_nested_field_access_expr
(lc
, decl_ctx
,
8378 name
, access
, NULL_TREE
);
8380 /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'
8381 for non-static fields.
8382 Once again we break the `private' access rule from a foreign
8386 tree class_name
= DECL_NAME
(TYPE_NAME
(decl_ctx
));
8388 = make_qualified_primary
(build_wfl_node
(class_name
), id
, lc
);
8391 access
= make_qualified_primary
(access
, id
, lc
);
8394 return resolve_expression_name
(access
, NULL
);
8397 /* Return a nonzero value if DECL describes a member access across nested
8398 class boundaries. That is, DECL is in a class that either encloses,
8399 is enclosed by or shares a common enclosing class with the class
8403 nested_member_access_p
(tree type
, tree decl
)
8405 bool is_static
= false
;
8406 tree decl_type
= DECL_CONTEXT
(decl
);
8407 tree type_root
, decl_type_root
;
8409 if
(decl_type
== type
8410 ||
(TREE_CODE
(decl
) != FIELD_DECL
8411 && TREE_CODE
(decl
) != VAR_DECL
8412 && TREE_CODE
(decl
) != FUNCTION_DECL
))
8415 if
(!INNER_CLASS_TYPE_P
(type
)
8416 && !(TREE_CODE
(decl_type
) == RECORD_TYPE
8417 && INNER_CLASS_TYPE_P
(decl_type
)))
8420 is_static
= (TREE_CODE
(decl
) == FUNCTION_DECL
)
8421 ? METHOD_STATIC
(decl
)
8422 : FIELD_STATIC
(decl
);
8424 /* If TYPE extends the declaration context of the non-static
8425 member we're trying to access, then this isn't a nested member
8426 access we need to worry about. */
8427 if
(!is_static
&& inherits_from_p
(type
, decl_type
))
8430 for
(type_root
= type
;
8431 DECL_CONTEXT
(TYPE_NAME
(type_root
));
8432 type_root
= TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(type_root
))))
8434 if
(type_root
== decl_type
)
8438 if
(TREE_CODE
(decl_type
) == RECORD_TYPE
8439 && INNER_CLASS_TYPE_P
(decl_type
))
8441 for
(decl_type_root
= decl_type
;
8442 DECL_CONTEXT
(TYPE_NAME
(decl_type_root
));
8444 = TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(decl_type_root
))))
8446 if
(decl_type_root
== type
)
8451 decl_type_root
= decl_type
;
8453 if
(type_root
== decl_type_root
)
8456 /* Before we give up, see whether it is a non-static field
8457 inherited from the enclosing context we are considering. */
8458 if
(!DECL_CONTEXT
(TYPE_NAME
(type_root
))
8460 && inherits_from_p
(type_root
, decl_type
))
8466 /* Return a nonzero value if NODE represents a cross-nested-class
8467 access that has already been expanded. As a side effect, it returns
8468 the name of the field being accessed and the argument passed to the
8469 access function, suitable for a regeneration of the access method
8470 call if necessary. */
8473 nested_field_expanded_access_p
(tree node
, tree
*name
, tree
*arg_type
,
8478 if
(TREE_CODE
(node
) != CALL_EXPR
)
8481 /* Well, GCJ generates slightly different tree nodes when compiling
8482 to native or bytecodes. It's the case for function calls. */
8484 if
(flag_emit_class_files
8485 && TREE_CODE
(node
) == CALL_EXPR
8486 && NESTED_FIELD_ACCESS_IDENTIFIER_P
(DECL_NAME
(TREE_OPERAND
(node
, 0))))
8488 else if
(!flag_emit_class_files
)
8490 node
= TREE_OPERAND
(node
, 0);
8492 if
(node
&& TREE_OPERAND
(node
, 0)
8493 && TREE_CODE
(TREE_OPERAND
(node
, 0)) == ADDR_EXPR
)
8495 node
= TREE_OPERAND
(node
, 0);
8496 if
(TREE_OPERAND
(node
, 0)
8497 && TREE_CODE
(TREE_OPERAND
(node
, 0)) == FUNCTION_DECL
8498 && (NESTED_FIELD_ACCESS_IDENTIFIER_P
8499 (DECL_NAME
(TREE_OPERAND
(node
, 0)))))
8504 if
(identified
&& name
&& arg_type
&& arg
)
8506 tree argument
= TREE_OPERAND
(node
, 1);
8507 *name
= DECL_NAME
(TREE_OPERAND
(node
, 0));
8509 /* The accessors for static fields do not take in a this$<n> argument,
8510 so we take the class name from the accessor's context instead. */
8513 *arg_type
= TREE_TYPE
(TREE_TYPE
(TREE_VALUE
(argument
)));
8514 *arg
= TREE_VALUE
(argument
);
8518 *arg_type
= DECL_CONTEXT
(TREE_OPERAND
(node
, 0));
8525 /* Detect in NODE cross-nested-class field read access and
8526 transform it into a write with RHS as an argument. This function
8527 is called from the java_complete_lhs when an assignment to a LHS can
8531 nested_field_access_fix
(tree wfl
, tree node
, tree rhs
)
8533 tree name
, arg_type
, arg
;
8535 if
(nested_field_expanded_access_p
(node
, &name
, &arg_type
, &arg
))
8537 node
= build_nested_field_access_expr
(EXPR_WFL_LINECOL
(wfl
),
8538 arg_type
, name
, arg
, rhs
);
8539 return java_complete_tree
(node
);
8544 /* Construct the expression that calls an access method:
8545 <type>.access$<n>(<arg1> [, <arg2>]);
8547 ARG2 can be NULL and will be omitted in that case. It will denote a
8551 build_nested_field_access_expr
(int lc
, tree type
, tree access_method_name
,
8552 tree arg1
, tree arg2
)
8554 tree args
, cn
, access
;
8557 args
= build_tree_list
(NULL_TREE
, arg1
);
8564 args
= tree_cons
(NULL_TREE
, arg2
, args
);
8566 args
= build_tree_list
(NULL_TREE
, arg2
);
8570 = build_method_invocation
(build_wfl_node
(access_method_name
), args
);
8571 cn
= build_wfl_node
(DECL_NAME
(TYPE_NAME
(type
)));
8573 return make_qualified_primary
(cn
, access
, lc
);
8576 /* Build the name of a synthetic accessor used to access class members
8577 across nested class boundaries. */
8580 build_new_access_id
(void)
8582 static int access_n_counter
= 1;
8585 sprintf
(buffer
, "access$%d", access_n_counter
++);
8586 return get_identifier
(buffer
);
8589 /* Create the static access functions for the cross-nested-class field DECL.
8591 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
8595 TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$,
8596 TREE_TYPE (<field>) value$) {
8597 return inst$.field = value$;
8599 For static fields, these methods are generated without the instance
8601 We should have a usage flag on the DECL so we can lazily turn the ones
8602 we're using for code generation. FIXME.
8606 build_nested_field_access_methods
(tree decl
)
8608 tree id
, args
, stmt
, mdecl
, class_name
= NULL_TREE
;
8609 bool is_static
= FIELD_STATIC
(decl
);
8611 if
(FIELD_NESTED_ACCESS_P
(decl
))
8612 return FIELD_NESTED_ACCESS
(decl
);
8614 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC
(decl
);
8616 /* Create the identifier and a function named after it. */
8617 id
= build_new_access_id
();
8619 /* The identifier is marked as bearing the name of a generated write
8620 access function for outer field accessed from inner classes. */
8621 NESTED_FIELD_ACCESS_IDENTIFIER_P
(id
) = 1;
8623 /* Create the read access. */
8626 args
= build_tree_list
(inst_id
,
8627 build_pointer_type
(DECL_CONTEXT
(decl
)));
8628 TREE_CHAIN
(args
) = end_params_node
;
8629 stmt
= make_qualified_primary
(build_wfl_node
(inst_id
),
8630 build_wfl_node
(DECL_NAME
(decl
)), 0);
8634 args
= end_params_node
;
8635 class_name
= DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(decl
)));
8636 stmt
= make_qualified_primary
(build_wfl_node
(class_name
),
8637 build_wfl_node
(DECL_NAME
(decl
)), 0);
8639 stmt
= build_return
(0, stmt
);
8640 mdecl
= build_nested_field_access_method
(DECL_CONTEXT
(decl
),
8641 TREE_TYPE
(decl
), id
, args
, stmt
);
8642 DECL_FUNCTION_ACCESS_DECL
(mdecl
) = decl
;
8644 /* Create the write access method. No write access for final variable */
8645 if
(!FIELD_FINAL
(decl
))
8649 args
= build_tree_list
(inst_id
,
8650 build_pointer_type
(DECL_CONTEXT
(decl
)));
8651 TREE_CHAIN
(args
) = build_tree_list
(wpv_id
, TREE_TYPE
(decl
));
8652 TREE_CHAIN
(TREE_CHAIN
(args
)) = end_params_node
;
8653 stmt
= make_qualified_primary
(build_wfl_node
(inst_id
),
8654 build_wfl_node
(DECL_NAME
(decl
)),
8659 args
= build_tree_list
(wpv_id
, TREE_TYPE
(decl
));
8660 TREE_CHAIN
(args
) = end_params_node
;
8661 stmt
= make_qualified_primary
(build_wfl_node
(class_name
),
8662 build_wfl_node
(DECL_NAME
(decl
)),
8665 stmt
= build_return
(0, build_assignment
(ASSIGN_TK
, 0, stmt
,
8666 build_wfl_node
(wpv_id
)));
8667 mdecl
= build_nested_field_access_method
(DECL_CONTEXT
(decl
),
8668 TREE_TYPE
(decl
), id
,
8671 DECL_FUNCTION_ACCESS_DECL
(mdecl
) = decl
;
8673 /* Return the access name */
8674 return FIELD_NESTED_ACCESS
(decl
) = id
;
8677 /* Build a field access method NAME. */
8680 build_nested_field_access_method
(tree class
, tree type
, tree name
,
8681 tree args
, tree body
)
8683 tree saved_current_function_decl
, mdecl
;
8685 /* Create the method */
8686 mdecl
= create_artificial_method
(class
, ACC_STATIC
, type
, name
, args
);
8687 fix_method_argument_names
(args
, mdecl
);
8688 layout_class_method
(class
, NULL_TREE
, mdecl
, NULL_TREE
);
8690 /* Attach the method body. */
8691 saved_current_function_decl
= current_function_decl
;
8692 start_artificial_method_body
(mdecl
);
8693 java_method_add_stmt
(mdecl
, body
);
8694 end_artificial_method_body
(mdecl
);
8695 current_function_decl
= saved_current_function_decl
;
8701 /* This section deals with building access function necessary for
8702 certain kinds of method invocation across nested class boundaries. */
8705 build_nested_method_access_method
(tree decl
)
8707 tree saved_current_function_decl
, mdecl
;
8708 tree args
= NULL_TREE
, call_args
= NULL_TREE
;
8709 tree carg
, id
, body
, class
;
8711 int parm_id_count
= 0;
8713 /* Test this abort with an access to a private field */
8714 if
(!strcmp
(IDENTIFIER_POINTER
(DECL_NAME
(decl
)), "access$"))
8717 /* Check the cache first */
8718 if
(DECL_FUNCTION_INNER_ACCESS
(decl
))
8719 return DECL_FUNCTION_INNER_ACCESS
(decl
);
8721 class
= DECL_CONTEXT
(decl
);
8723 /* Obtain an access identifier and mark it */
8724 id
= build_new_access_id
();
8725 NESTED_FIELD_ACCESS_IDENTIFIER_P
(id
) = 1;
8727 carg
= TYPE_ARG_TYPES
(TREE_TYPE
(decl
));
8728 /* Create the arguments, as much as the original */
8729 for
(; carg
&& carg
!= end_params_node
;
8730 carg
= TREE_CHAIN
(carg
))
8732 sprintf
(buffer
, "write_parm_value$%d", parm_id_count
++);
8733 args
= chainon
(args
, build_tree_list
(get_identifier
(buffer
),
8734 TREE_VALUE
(carg
)));
8736 args
= chainon
(args
, end_params_node
);
8738 /* Create the method */
8739 mdecl
= create_artificial_method
(class
, ACC_STATIC
,
8740 TREE_TYPE
(TREE_TYPE
(decl
)), id
, args
);
8741 layout_class_method
(class
, NULL_TREE
, mdecl
, NULL_TREE
);
8742 /* There is a potential bug here. We should be able to use
8743 fix_method_argument_names, but then arg names get mixed up and
8744 eventually a constructor will have its this$0 altered and the
8745 outer context won't be assignment properly. The testcase is
8747 TYPE_ARG_TYPES
(TREE_TYPE
(mdecl
)) = args
;
8749 /* Attach the method body. */
8750 saved_current_function_decl
= current_function_decl
;
8751 start_artificial_method_body
(mdecl
);
8753 /* The actual method invocation uses the same args. When invoking a
8754 static methods that way, we don't want to skip the first argument. */
8756 if
(!METHOD_STATIC
(decl
))
8757 carg
= TREE_CHAIN
(carg
);
8758 for
(; carg
&& carg
!= end_params_node
; carg
= TREE_CHAIN
(carg
))
8759 call_args
= tree_cons
(NULL_TREE
, build_wfl_node
(TREE_PURPOSE
(carg
)),
8762 body
= build_method_invocation
(build_wfl_node
(DECL_NAME
(decl
)),
8764 if
(!METHOD_STATIC
(decl
))
8765 body
= make_qualified_primary
(build_wfl_node
(TREE_PURPOSE
(args
)),
8767 if
(TREE_TYPE
(TREE_TYPE
(decl
)) != void_type_node
)
8768 body
= build_return
(0, body
);
8769 java_method_add_stmt
(mdecl
,body
);
8770 end_artificial_method_body
(mdecl
);
8771 current_function_decl
= saved_current_function_decl
;
8773 /* Back tag the access function so it know what it accesses. */
8774 DECL_FUNCTION_ACCESS_DECL
(decl
) = mdecl
;
8776 /* Tag the current method so it knows it has an access generated. */
8777 return DECL_FUNCTION_INNER_ACCESS
(decl
) = mdecl
;
8781 /* This section of the code deals with building expressions to access
8782 the enclosing instance of an inner class. The enclosing instance is
8783 kept in a generated field called this$<n>, with <n> being the
8784 inner class nesting level (starting from 0.) */
8786 /* Build an access to a given this$<n>, always chaining access call to
8787 others. Access methods to this$<n> are build on the fly if
8788 necessary. This CAN'T be used to solely access this$<n-1> from
8789 this$<n> (which alway yield to special cases and optimization, see
8790 for example build_nested_field_access). */
8793 build_access_to_thisn
(tree from
, tree to
, int lc
)
8795 tree access
= NULL_TREE
;
8797 while
(from
!= to
&& PURE_INNER_CLASS_TYPE_P
(from
))
8801 access
= build_current_thisn
(from
);
8802 access
= build_wfl_node
(access
);
8806 tree access0_wfl
, cn
;
8808 maybe_build_thisn_access_method
(from
);
8809 access0_wfl
= build_wfl_node
(access0_identifier_node
);
8810 cn
= build_wfl_node
(DECL_NAME
(TYPE_NAME
(from
)));
8811 EXPR_WFL_LINECOL
(access0_wfl
) = lc
;
8812 access
= build_tree_list
(NULL_TREE
, access
);
8813 access
= build_method_invocation
(access0_wfl
, access
);
8814 access
= make_qualified_primary
(cn
, access
, lc
);
8817 /* If FROM isn't an inner class, that's fine, we've done enough.
8818 What we're looking for can be accessed from there. */
8819 from
= DECL_CONTEXT
(TYPE_NAME
(from
));
8822 from
= TREE_TYPE
(from
);
8827 /* Build an access function to the this$<n> local to TYPE. NULL_TREE
8828 is returned if nothing needs to be generated. Otherwise, the method
8829 generated and a method decl is returned.
8831 NOTE: These generated methods should be declared in a class file
8832 attribute so that they can't be referred to directly. */
8835 maybe_build_thisn_access_method
(tree type
)
8837 tree mdecl
, args
, stmt
, rtype
;
8838 tree saved_current_function_decl
;
8840 /* If TYPE is a top-level class, no access method is required.
8841 If there already is such an access method, bail out. */
8842 if
(CLASS_ACCESS0_GENERATED_P
(type
) ||
!PURE_INNER_CLASS_TYPE_P
(type
))
8845 /* We generate the method. The method looks like:
8846 static <outer_of_type> access$0 (<type> inst$) { return inst$.this$<n>; }
8848 args
= build_tree_list
(inst_id
, build_pointer_type
(type
));
8849 TREE_CHAIN
(args
) = end_params_node
;
8850 rtype
= build_pointer_type
(TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(type
))));
8851 mdecl
= create_artificial_method
(type
, ACC_STATIC
, rtype
,
8852 access0_identifier_node
, args
);
8853 fix_method_argument_names
(args
, mdecl
);
8854 layout_class_method
(type
, NULL_TREE
, mdecl
, NULL_TREE
);
8855 stmt
= build_current_thisn
(type
);
8856 stmt
= make_qualified_primary
(build_wfl_node
(inst_id
),
8857 build_wfl_node
(stmt
), 0);
8858 stmt
= build_return
(0, stmt
);
8860 saved_current_function_decl
= current_function_decl
;
8861 start_artificial_method_body
(mdecl
);
8862 java_method_add_stmt
(mdecl
, stmt
);
8863 end_artificial_method_body
(mdecl
);
8864 current_function_decl
= saved_current_function_decl
;
8866 CLASS_ACCESS0_GENERATED_P
(type
) = 1;
8871 /* Craft an correctly numbered `this$<n>'string. this$0 is used for
8872 the first level of innerclassing. this$1 for the next one, etc...
8873 This function can be invoked with TYPE to NULL, available and then
8874 has to count the parser context. */
8876 static GTY
(()) tree saved_thisn
;
8877 static GTY
(()) tree saved_type
;
8880 build_current_thisn
(tree type
)
8882 static int saved_i
= -1;
8883 static int saved_type_i
= 0;
8890 if
(type
== saved_type
)
8894 for
(i
= -1, decl
= DECL_CONTEXT
(TYPE_NAME
(type
));
8895 decl
; decl
= DECL_CONTEXT
(decl
), i
++)
8903 i
= list_length
(GET_CPC_LIST
())-2;
8908 sprintf
(buffer
, "this$%d", i
);
8910 saved_thisn
= get_identifier
(buffer
);
8914 /* Return the assignment to the hidden enclosing context `this$<n>'
8915 by the second incoming parameter to the innerclass constructor. The
8916 form used is `this.this$<n> = this$<n>;'. */
8919 build_thisn_assign
(void)
8921 if
(current_class
&& PURE_INNER_CLASS_TYPE_P
(current_class
))
8923 tree thisn
= build_current_thisn
(current_class
);
8924 tree lhs
= make_qualified_primary
(build_wfl_node
(this_identifier_node
),
8925 build_wfl_node
(thisn
), 0);
8926 tree rhs
= build_wfl_node
(thisn
);
8927 #ifdef USE_MAPPED_LOCATION
8928 SET_EXPR_LOCATION
(lhs
, input_location
);
8930 EXPR_WFL_SET_LINECOL
(lhs
, input_line
, 0);
8932 return build_assignment
(ASSIGN_TK
, EXPR_WFL_LINECOL
(lhs
), lhs
, rhs
);
8938 /* Building the synthetic `class$' used to implement the `.class' 1.1
8939 extension for non primitive types. This method looks like:
8941 static Class class$(String type) throws NoClassDefFoundError
8943 try {return (java.lang.Class.forName (String));}
8944 catch (ClassNotFoundException e) {
8945 throw new NoClassDefFoundError(e.getMessage());}
8948 static GTY
(()) tree get_message_wfl
;
8949 static GTY
(()) tree type_parm_wfl
;
8952 build_dot_class_method
(tree class
)
8954 #define BWF(S) build_wfl_node (get_identifier ((S)))
8955 #ifdef USE_MAPPED_LOCATION
8956 #define MQN(X,Y) make_qualified_name ((X), (Y), UNKNOWN_LOCATION)
8958 #define MQN(X,Y) make_qualified_name ((X), (Y), 0)
8960 tree args
, tmp
, saved_current_function_decl
, mdecl
, qual_name
;
8961 tree stmt
, throw_stmt
;
8963 if
(!get_message_wfl
)
8965 get_message_wfl
= build_wfl_node
(get_identifier
("getMessage"));
8966 type_parm_wfl
= build_wfl_node
(get_identifier
("type$"));
8969 /* Build the arguments */
8970 args
= build_tree_list
(get_identifier
("type$"),
8971 build_pointer_type
(string_type_node
));
8972 TREE_CHAIN
(args
) = end_params_node
;
8974 /* Build the qualified name java.lang.Class.forName */
8975 tmp
= MQN
(MQN
(MQN
(BWF
("java"),
8976 BWF
("lang")), BWF
("Class")), BWF
("forName"));
8978 /* Create the "class$" function */
8979 mdecl
= create_artificial_method
(class
, ACC_STATIC
,
8980 build_pointer_type
(class_type_node
),
8981 classdollar_identifier_node
, args
);
8982 qual_name
= MQN
(MQN
(BWF
("java"), BWF
("lang")),
8983 BWF
("NoClassDefFoundError"));
8984 DECL_FUNCTION_THROWS
(mdecl
) = build_tree_list
(NULL_TREE
, qual_name
);
8985 register_incomplete_type
(JDEP_EXCEPTION
, qual_name
, NULL_TREE
, NULL_TREE
);
8986 JDEP_GET_PATCH
(CLASSD_LAST
(ctxp
->classd_list
)) =
8987 &TREE_VALUE
(DECL_FUNCTION_THROWS
(mdecl
));
8989 /* We start by building the try block. We need to build:
8990 return (java.lang.Class.forName (type)); */
8991 stmt
= build_method_invocation
(tmp
,
8992 build_tree_list
(NULL_TREE
, type_parm_wfl
));
8993 stmt
= build_return
(0, stmt
);
8995 /* Now onto the catch block. We start by building the expression
8996 throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
8997 #ifdef USE_MAPPED_LOCATION
8998 throw_stmt
= make_qualified_name
(build_wfl_node
(wpv_id
),
8999 get_message_wfl
, UNKNOWN_LOCATION
);
9001 throw_stmt
= make_qualified_name
(build_wfl_node
(wpv_id
),
9002 get_message_wfl
, 0);
9004 throw_stmt
= build_method_invocation
(throw_stmt
, NULL_TREE
);
9006 /* Build new NoClassDefFoundError (_.getMessage) */
9007 throw_stmt
= build_new_invocation
9008 (build_wfl_node
(get_identifier
("NoClassDefFoundError")),
9009 build_tree_list
(build_pointer_type
(string_type_node
), throw_stmt
));
9011 /* Build the throw, (it's too early to use BUILD_THROW) */
9012 throw_stmt
= build1
(THROW_EXPR
, NULL_TREE
, throw_stmt
);
9014 /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */
9015 qual_name
= MQN
(MQN
(BWF
("java"), BWF
("lang")),
9016 BWF
("ClassNotFoundException"));
9017 stmt
= encapsulate_with_try_catch
(0, qual_name
, stmt
, throw_stmt
);
9019 fix_method_argument_names
(args
, mdecl
);
9020 layout_class_method
(class
, NULL_TREE
, mdecl
, NULL_TREE
);
9021 saved_current_function_decl
= current_function_decl
;
9022 start_artificial_method_body
(mdecl
);
9023 java_method_add_stmt
(mdecl
, stmt
);
9024 end_artificial_method_body
(mdecl
);
9025 current_function_decl
= saved_current_function_decl
;
9026 TYPE_DOT_CLASS
(class
) = mdecl
;
9032 build_dot_class_method_invocation
(tree this_class
, tree type
)
9034 tree dot_class_method
= TYPE_DOT_CLASS
(this_class
);
9037 if
(TYPE_ARRAY_P
(type
))
9038 sig_id
= build_java_signature
(type
);
9040 sig_id
= DECL_NAME
(TYPE_NAME
(type
));
9042 /* Ensure that the proper name separator is used */
9043 sig_id
= unmangle_classname
(IDENTIFIER_POINTER
(sig_id
),
9044 IDENTIFIER_LENGTH
(sig_id
));
9046 s
= build_string
(IDENTIFIER_LENGTH
(sig_id
),
9047 IDENTIFIER_POINTER
(sig_id
));
9048 t
= build_method_invocation
(build_wfl_node
(DECL_NAME
(dot_class_method
)),
9049 build_tree_list
(NULL_TREE
, s
));
9050 if
(DECL_CONTEXT
(dot_class_method
) != this_class
)
9052 tree class_name
= DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(dot_class_method
)));
9053 t
= make_qualified_primary
(build_wfl_node
(class_name
), t
, 0);
9058 /* This section of the code deals with constructor. */
9060 /* Craft a body for default constructor. Patch existing constructor
9061 bodies with call to super() and field initialization statements if
9065 fix_constructors
(tree mdecl
)
9067 tree iii
; /* Instance Initializer Invocation */
9068 tree
*bodyp
= &DECL_FUNCTION_BODY
(mdecl
);
9069 tree thisn_assign
, compound
= NULL_TREE
;
9070 tree class_type
= DECL_CONTEXT
(mdecl
);
9072 if
(DECL_FIXED_CONSTRUCTOR_P
(mdecl
))
9074 DECL_FIXED_CONSTRUCTOR_P
(mdecl
) = 1;
9078 /* It is an error for the compiler to generate a default
9079 constructor if the superclass doesn't have a constructor that
9080 takes no argument, or the same args for an anonymous class */
9081 tree sdecl
= get_constructor_super
(mdecl
);
9082 if
(sdecl
== NULL_TREE
)
9084 tree sclass_decl
= TYPE_NAME
(CLASSTYPE_SUPER
(class_type
));
9085 tree save
= DECL_NAME
(mdecl
);
9086 const char *n
= IDENTIFIER_POINTER
(DECL_NAME
(sclass_decl
));
9087 DECL_NAME
(mdecl
) = DECL_NAME
(sclass_decl
);
9089 (lookup_cl
(TYPE_NAME
(class_type
)),
9090 "No constructor matching %qs found in class %qs",
9091 lang_printable_name
(mdecl
, 2), n
);
9092 DECL_NAME
(mdecl
) = save
;
9095 if
(ANONYMOUS_CLASS_P
(class_type
))
9097 /* Copy throws clause from the super constructor. */
9098 tree throws
= DECL_FUNCTION_THROWS
(sdecl
);
9099 DECL_FUNCTION_THROWS
(mdecl
) = copy_list
(throws
);
9102 /* The constructor body must be crafted by hand. It's the
9103 constructor we defined when we realize we didn't have the
9104 CLASSNAME() constructor */
9105 start_artificial_method_body
(mdecl
);
9107 /* Insert an assignment to the this$<n> hidden field, if
9109 if
((thisn_assign
= build_thisn_assign
()))
9110 java_method_add_stmt
(mdecl
, thisn_assign
);
9112 /* We don't generate a super constructor invocation if we're
9113 compiling java.lang.Object. build_super_invocation takes care
9115 java_method_add_stmt
(mdecl
, build_super_invocation
(mdecl
));
9118 if
((iii
= build_instinit_invocation
(class_type
)))
9119 java_method_add_stmt
(mdecl
, iii
);
9121 end_artificial_method_body
(mdecl
);
9123 /* Search for an explicit constructor invocation */
9127 int invokes_this
= 0;
9128 tree main_block
= BLOCK_EXPR_BODY
(*bodyp
);
9133 switch
(TREE_CODE
(body
))
9136 found
= CALL_EXPLICIT_CONSTRUCTOR_P
(body
);
9137 if
(CALL_THIS_CONSTRUCTOR_P
(body
))
9141 case EXPR_WITH_FILE_LOCATION
:
9142 bodyp
= &TREE_OPERAND
(body
, 0);
9145 bodyp
= &BLOCK_EXPR_BODY
(body
);
9153 /* Generate the assignment to this$<n>, if necessary */
9154 if
((thisn_assign
= build_thisn_assign
()))
9155 compound
= add_stmt_to_compound
(compound
, NULL_TREE
, thisn_assign
);
9157 /* The constructor is missing an invocation of super() */
9159 compound
= add_stmt_to_compound
(compound
, NULL_TREE
,
9160 build_super_invocation
(mdecl
));
9161 /* Explicit super() invocation should take place before the
9162 instance initializer blocks. */
9165 compound
= add_stmt_to_compound
(compound
, NULL_TREE
, *bodyp
);
9166 *bodyp
= build_java_empty_stmt
();
9169 DECL_INIT_CALLS_THIS
(mdecl
) = invokes_this
;
9171 /* Insert the instance initializer block right after. */
9172 if
(!invokes_this
&& (iii
= build_instinit_invocation
(class_type
)))
9173 compound
= add_stmt_to_compound
(compound
, NULL_TREE
, iii
);
9175 /* Fix the constructor main block if we're adding extra stmts */
9178 compound
= add_stmt_to_compound
(compound
, NULL_TREE
,
9179 BLOCK_EXPR_BODY
(main_block
));
9180 BLOCK_EXPR_BODY
(main_block
) = compound
;
9185 /* Browse constructors in the super class, searching for a constructor
9186 that doesn't take any argument. Return the constructor if one is found,
9187 NULL_TREE otherwise. If the current class is an anonymous inner class,
9188 look for something that has the same signature. */
9190 get_constructor_super
(tree mdecl
)
9192 tree class
= CLASSTYPE_SUPER
(current_class
);
9193 int super_inner
= PURE_INNER_CLASS_TYPE_P
(class
);
9199 if
(ANONYMOUS_CLASS_P
(current_class
))
9201 tree mdecl_arg_type
;
9202 SKIP_THIS_AND_ARTIFICIAL_PARMS
(mdecl_arg_type
, mdecl
);
9203 for
(sdecl
= TYPE_METHODS
(class
); sdecl
; sdecl
= TREE_CHAIN
(sdecl
))
9204 if
(DECL_CONSTRUCTOR_P
(sdecl
))
9207 tree arg_type
= TREE_CHAIN
(TYPE_ARG_TYPES
(TREE_TYPE
(sdecl
)));
9209 arg_type
= TREE_CHAIN
(arg_type
);
9210 for
(m_arg_type
= mdecl_arg_type
;
9211 (arg_type
!= end_params_node
9212 && m_arg_type
!= end_params_node
);
9213 arg_type
= TREE_CHAIN
(arg_type
),
9214 m_arg_type
= TREE_CHAIN
(m_arg_type
))
9215 if
(!valid_method_invocation_conversion_p
9216 (TREE_VALUE
(arg_type
),
9217 TREE_VALUE
(m_arg_type
)))
9220 if
(arg_type
== end_params_node
&& m_arg_type
== end_params_node
)
9226 for
(sdecl
= TYPE_METHODS
(class
); sdecl
; sdecl
= TREE_CHAIN
(sdecl
))
9228 tree arg
= TREE_CHAIN
(TYPE_ARG_TYPES
(TREE_TYPE
(sdecl
)));
9230 arg
= TREE_CHAIN
(arg
);
9231 if
(DECL_CONSTRUCTOR_P
(sdecl
) && arg
== end_params_node
)
9238 /* Generate code for all context remembered for code generation. */
9240 static GTY
(()) tree reversed_class_list
;
9242 java_expand_classes
(void)
9244 int save_error_count
= 0;
9245 static struct parser_ctxt
*cur_ctxp
= NULL
;
9246 location_t save_location
;
9248 java_parse_abort_on_error
();
9249 if
(!(ctxp
= ctxp_for_generation
))
9251 java_layout_classes
();
9252 java_parse_abort_on_error
();
9253 save_location
= input_location
;
9255 for
(cur_ctxp
= ctxp_for_generation
; cur_ctxp
; cur_ctxp
= cur_ctxp
->next
)
9258 for
(current
= cur_ctxp
->class_list
;
9260 current
= TREE_CHAIN
(current
))
9261 gen_indirect_dispatch_tables
(TREE_TYPE
(current
));
9264 for
(cur_ctxp
= ctxp_for_generation
; cur_ctxp
; cur_ctxp
= cur_ctxp
->next
)
9267 input_location
= ctxp
->file_start_location
;
9268 lang_init_source
(2); /* Error msgs have method prototypes */
9269 java_complete_expand_classes
(); /* Complete and expand classes */
9270 java_parse_abort_on_error
();
9272 input_location
= save_location
;
9274 /* Find anonymous classes and expand their constructor. This extra pass is
9275 necessary because the constructor itself is only generated when the
9276 method in which it is defined is expanded. */
9277 for
(cur_ctxp
= ctxp_for_generation
; cur_ctxp
; cur_ctxp
= cur_ctxp
->next
)
9281 for
(current
= ctxp
->class_list
; current
; current
= TREE_CHAIN
(current
))
9283 output_class
= current_class
= TREE_TYPE
(current
);
9284 if
(ANONYMOUS_CLASS_P
(current_class
))
9287 for
(d
= TYPE_METHODS
(current_class
); d
; d
= TREE_CHAIN
(d
))
9289 if
(DECL_CONSTRUCTOR_P
(d
))
9291 java_complete_expand_method
(d
);
9292 break
; /* There is only one constructor. */
9299 /* Expanding the constructors of anonymous classes generates access
9300 methods. Scan all the methods looking for null DECL_RESULTs --
9301 this will be the case if a method hasn't been expanded. */
9302 for
(cur_ctxp
= ctxp_for_generation
; cur_ctxp
; cur_ctxp
= cur_ctxp
->next
)
9306 for
(current
= ctxp
->class_list
; current
; current
= TREE_CHAIN
(current
))
9309 output_class
= current_class
= TREE_TYPE
(current
);
9310 for
(d
= TYPE_METHODS
(current_class
); d
; d
= TREE_CHAIN
(d
))
9312 if
(DECL_RESULT
(d
) == NULL_TREE
)
9313 java_complete_expand_method
(d
);
9318 /* ??? Instead of all this we could iterate around the list of
9319 classes until there were no more un-expanded methods. It would
9320 take a little longer -- one pass over the whole list of methods
9321 -- but it would be simpler. Like this: */
9324 int something_changed
;
9328 something_changed
= 0;
9329 for
(cur_ctxp
= ctxp_for_generation
; cur_ctxp
; cur_ctxp
= cur_ctxp
->next
)
9333 for
(current
= ctxp
->class_list
; current
; current
= TREE_CHAIN
(current
))
9336 output_class
= current_class
= TREE_TYPE
(current
);
9337 for
(d
= TYPE_METHODS
(current_class
); d
; d
= TREE_CHAIN
(d
))
9339 if
(DECL_RESULT
(d
) == NULL_TREE
)
9341 something_changed
= 1;
9342 java_complete_expand_method
(d
);
9348 while
(something_changed
);
9352 /* If we've found error at that stage, don't try to generate
9353 anything, unless we're checking the syntax only
9354 (but not using -fsyntax-only for the purpose of generating
9356 if
(java_error_count
9357 && (!flag_syntax_only
&& !flag_emit_class_files
))
9360 /* Now things are stable, go for generation of the class data. */
9362 /* We pessimistically marked all methods and fields external until
9363 we knew what set of classes we were planning to compile. Now mark
9364 those that will be generated locally as not external. */
9365 for
(cur_ctxp
= ctxp_for_generation
; cur_ctxp
; cur_ctxp
= cur_ctxp
->next
)
9369 for
(current
= ctxp
->class_list
; current
; current
= TREE_CHAIN
(current
))
9370 java_mark_class_local
(TREE_TYPE
(current
));
9373 /* Compile the classes. */
9374 for
(cur_ctxp
= ctxp_for_generation
; cur_ctxp
; cur_ctxp
= cur_ctxp
->next
)
9377 reversed_class_list
= NULL
;
9381 /* We write out the classes in reverse order. This ensures that
9382 inner classes are written before their containing classes,
9383 which is important for parallel builds. Otherwise, the
9384 class file for the outer class may be found, but the class
9385 file for the inner class may not be present. In that
9386 situation, the compiler cannot fall back to the original
9387 source, having already read the outer class, so we must
9388 prevent that situation. */
9389 for
(current
= ctxp
->class_list
;
9391 current
= TREE_CHAIN
(current
))
9393 = tree_cons
(NULL_TREE
, current
, reversed_class_list
);
9395 for
(current
= reversed_class_list
;
9397 current
= TREE_CHAIN
(current
))
9399 output_class
= current_class
= TREE_TYPE
(TREE_VALUE
(current
));
9400 if
(flag_emit_class_files
)
9401 write_classfile
(current_class
);
9402 else if
(! flag_syntax_only
)
9403 java_expand_method_bodies
(current_class
);
9409 java_finish_classes
(void)
9411 static struct parser_ctxt
*cur_ctxp
= NULL
;
9412 for
(cur_ctxp
= ctxp_for_generation
; cur_ctxp
; cur_ctxp
= cur_ctxp
->next
)
9416 for
(current
= ctxp
->class_list
; current
; current
= TREE_CHAIN
(current
))
9418 output_class
= current_class
= TREE_TYPE
(current
);
9424 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
9425 a tree list node containing RIGHT. Fore coming RIGHTs will be
9426 chained to this hook. LOCATION contains the location of the
9427 separating `.' operator. */
9430 make_qualified_primary
(tree primary
, tree right
, int location
)
9434 if
(TREE_CODE
(primary
) != EXPR_WITH_FILE_LOCATION
)
9435 wfl
= build_wfl_wrap
(primary
, location
);
9439 /* If wfl wasn't qualified, we build a first anchor */
9440 if
(!EXPR_WFL_QUALIFICATION
(wfl
))
9441 EXPR_WFL_QUALIFICATION
(wfl
) = build_tree_list
(wfl
, NULL_TREE
);
9444 /* And chain them */
9445 EXPR_WFL_LINECOL
(right
) = location
;
9446 chainon
(EXPR_WFL_QUALIFICATION
(wfl
), build_tree_list
(right
, NULL_TREE
));
9447 PRIMARY_P
(wfl
) = 1;
9451 /* Simple merge of two name separated by a `.' */
9454 merge_qualified_name
(tree left
, tree right
)
9457 if
(!left
&& !right
)
9466 obstack_grow
(&temporary_obstack
, IDENTIFIER_POINTER
(left
),
9467 IDENTIFIER_LENGTH
(left
));
9468 obstack_1grow
(&temporary_obstack
, '.');
9469 obstack_grow0
(&temporary_obstack
, IDENTIFIER_POINTER
(right
),
9470 IDENTIFIER_LENGTH
(right
));
9471 node
= get_identifier
(obstack_base
(&temporary_obstack
));
9472 obstack_free
(&temporary_obstack
, obstack_base
(&temporary_obstack
));
9473 QUALIFIED_P
(node
) = 1;
9477 /* Merge the two parts of a qualified name into LEFT. Set the
9478 location information of the resulting node to LOCATION, usually
9479 inherited from the location information of the `.' operator. */
9482 make_qualified_name
(tree left
, tree right
,
9483 #ifdef USE_MAPPED_LOCATION
9484 source_location location
9490 #ifdef USE_COMPONENT_REF
9491 tree node
= build3
(COMPONENT_REF
, NULL_TREE
, left
, right
, NULL_TREE
);
9492 SET_EXPR_LOCATION
(node
, location
);
9495 tree left_id
= EXPR_WFL_NODE
(left
);
9496 tree right_id
= EXPR_WFL_NODE
(right
);
9499 merge
= merge_qualified_name
(left_id
, right_id
);
9501 /* Left wasn't qualified and is now qualified */
9502 #ifdef USE_MAPPED_LOCATION
9503 if
(!QUALIFIED_P
(left_id
))
9505 tree wfl
= build_expr_wfl
(left_id
, EXPR_LOCATION
(left
));
9506 EXPR_WFL_QUALIFICATION
(left
) = build_tree_list
(wfl
, NULL_TREE
);
9509 wfl
= build_expr_wfl
(right_id
, location
);
9511 if
(!QUALIFIED_P
(left_id
))
9513 tree wfl
= build_expr_wfl
(left_id
, ctxp
->filename
, 0, 0);
9514 EXPR_WFL_LINECOL
(wfl
) = EXPR_WFL_LINECOL
(left
);
9515 EXPR_WFL_QUALIFICATION
(left
) = build_tree_list
(wfl
, NULL_TREE
);
9518 wfl
= build_expr_wfl
(right_id
, ctxp
->filename
, 0, 0);
9519 EXPR_WFL_LINECOL
(wfl
) = location
;
9521 chainon
(EXPR_WFL_QUALIFICATION
(left
), build_tree_list
(wfl
, NULL_TREE
));
9522 EXPR_WFL_NODE
(left
) = merge
;
9527 /* Extract the last identifier component of the qualified in WFL. The
9528 last identifier is removed from the linked list */
9531 cut_identifier_in_qualified
(tree wfl
)
9534 tree previous
= NULL_TREE
;
9535 for
(q
= EXPR_WFL_QUALIFICATION
(wfl
); ; previous
= q
, q
= TREE_CHAIN
(q
))
9536 if
(!TREE_CHAIN
(q
))
9539 /* Operating on a non qualified qualified WFL. */
9542 TREE_CHAIN
(previous
) = NULL_TREE
;
9543 return TREE_PURPOSE
(q
);
9547 /* Resolve the expression name NAME. Return its decl. */
9550 resolve_expression_name
(tree id
, tree
*orig
)
9552 tree name
= EXPR_WFL_NODE
(id
);
9555 /* 6.5.5.1: Simple expression names */
9556 if
(!PRIMARY_P
(id
) && !QUALIFIED_P
(name
))
9558 /* 15.13.1: NAME can appear within the scope of a local variable
9560 if
((decl
= IDENTIFIER_LOCAL_VALUE
(name
)))
9563 /* 15.13.1: NAME can appear within a class declaration */
9566 decl
= lookup_field_wrapper
(current_class
, name
);
9569 tree access
= NULL_TREE
;
9570 int fs
= FIELD_STATIC
(decl
);
9572 /* If we're accessing an outer scope local alias, make
9573 sure we change the name of the field we're going to
9575 if
(FIELD_LOCAL_ALIAS_USED
(decl
))
9576 name
= DECL_NAME
(decl
);
9578 check_deprecation
(id
, decl
);
9580 /* Instance variable (8.3.1.1) can't appear within
9581 static method, static initializer or initializer for
9582 a static variable. */
9583 if
(!fs
&& METHOD_STATIC
(current_function_decl
))
9585 static_ref_err
(id
, name
, current_class
);
9586 return error_mark_node
;
9588 /* Instance variables can't appear as an argument of
9589 an explicit constructor invocation */
9590 if
(!fs
&& ctxp
->explicit_constructor_p
9591 && !enclosing_context_p
(DECL_CONTEXT
(decl
), current_class
))
9594 (id
, "Can't reference %qs before the superclass constructor has been called", IDENTIFIER_POINTER
(name
));
9595 return error_mark_node
;
9598 /* If we're processing an inner class and we're trying
9599 to access a field belonging to an outer class, build
9600 the access to the field.
9601 As usual, we have to treat initialized static final
9602 variables as a special case. */
9603 if
(nested_member_access_p
(current_class
, decl
)
9604 && ! (JDECL_P
(decl
) && CLASS_FINAL_VARIABLE_P
(decl
)
9605 && DECL_INITIAL
(decl
) != NULL_TREE
9606 && (JSTRING_TYPE_P
(TREE_TYPE
(decl
))
9607 || JNUMERIC_TYPE_P
(TREE_TYPE
(decl
)))
9608 && TREE_CONSTANT
(DECL_INITIAL
(decl
))))
9610 if
(!fs
&& CLASS_STATIC
(TYPE_NAME
(current_class
)))
9612 static_ref_err
(id
, DECL_NAME
(decl
), current_class
);
9613 return error_mark_node
;
9615 access
= build_nested_field_access
(id
, decl
);
9621 /* Otherwise build what it takes to access the field */
9622 access
= build_field_ref
((fs ? NULL_TREE
: current_this
),
9623 DECL_CONTEXT
(decl
), name
);
9625 access
= maybe_build_class_init_for_field
(decl
, access
);
9626 /* We may be asked to save the real field access node */
9629 /* Last check: can we access the field? */
9630 if
(not_accessible_p
(current_class
, decl
, NULL_TREE
, 0))
9632 not_accessible_field_error
(id
, decl
);
9633 return error_mark_node
;
9635 /* And we return what we got */
9638 /* Fall down to error report on undefined variable */
9641 /* 6.5.5.2 Qualified Expression Names */
9646 qualify_ambiguous_name
(id
);
9647 /* 15.10.1 Field Access Using a Primary and/or Expression Name */
9648 /* 15.10.2: Accessing Superclass Members using super */
9649 return resolve_field_access
(id
, orig
, NULL
);
9652 /* We've got an error here */
9653 if
(INNER_CLASS_TYPE_P
(current_class
))
9654 parse_error_context
(id
,
9655 "Local variable %qs can't be accessed from within the inner class %qs unless it is declared final",
9656 IDENTIFIER_POINTER
(name
),
9657 IDENTIFIER_POINTER
(DECL_NAME
9658 (TYPE_NAME
(current_class
))));
9660 parse_error_context
(id
, "Undefined variable %qs",
9661 IDENTIFIER_POINTER
(name
));
9663 return error_mark_node
;
9667 static_ref_err
(tree wfl
, tree field_id
, tree class_type
)
9671 "Can't make a static reference to nonstatic variable %qs in class %qs",
9672 IDENTIFIER_POINTER
(field_id
),
9673 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(class_type
))));
9676 /* 15.10.1 Field Access Using a Primary and/or Expression Name.
9677 We return something suitable to generate the field access. We also
9678 return the field decl in FIELD_DECL and its type in FIELD_TYPE. If
9679 recipient's address can be null. */
9682 resolve_field_access
(tree qual_wfl
, tree
*field_decl
, tree
*field_type
)
9686 tree decl
= NULL_TREE
, where_found
, type_found
;
9688 if
(resolve_qualified_expression_name
(qual_wfl
, &decl
,
9689 &where_found
, &type_found
))
9690 return error_mark_node
;
9692 /* Resolve the LENGTH field of an array here */
9693 if
(DECL_P
(decl
) && DECL_NAME
(decl
) == length_identifier_node
9694 && type_found
&& TYPE_ARRAY_P
(type_found
)
9695 && ! flag_emit_class_files
)
9697 tree length
= build_java_array_length_access
(where_found
);
9700 /* In case we're dealing with a static array, we need to
9701 initialize its class before the array length can be fetched. */
9702 if
(TREE_CODE
(where_found
) == VAR_DECL
&& FIELD_STATIC
(where_found
))
9704 build_static_field_ref
(where_found
);
9705 field_ref
= build_class_init
(DECL_CONTEXT
(where_found
), field_ref
);
9708 /* We might have been trying to resolve field.method(). In which
9709 case, the resolution is over and decl is the answer */
9710 else if
(JDECL_P
(decl
) && IDENTIFIER_LOCAL_VALUE
(DECL_NAME
(decl
)) == decl
)
9712 else if
(JDECL_P
(decl
))
9715 type_found
= DECL_CONTEXT
(decl
);
9716 is_static
= FIELD_STATIC
(decl
);
9717 field_ref
= build_field_ref
((is_static ?
9718 NULL_TREE
: where_found
),
9719 type_found
, DECL_NAME
(decl
));
9720 if
(field_ref
== error_mark_node
)
9721 return error_mark_node
;
9723 field_ref
= maybe_build_class_init_for_field
(decl
, field_ref
);
9725 /* If we're looking at a static field, we may need to generate a
9726 class initialization for it. This can happen when the access
9727 looks like `field.ref', where `field' is a static field in an
9728 interface we implement. */
9729 if
(!flag_emit_class_files
9730 && TREE_CODE
(where_found
) == VAR_DECL
9731 && FIELD_STATIC
(where_found
))
9733 build_static_field_ref
(where_found
);
9734 field_ref
= build_class_init
(DECL_CONTEXT
(where_found
), field_ref
);
9743 *field_type
= (QUAL_DECL_TYPE
(decl
) ?
9744 QUAL_DECL_TYPE
(decl
) : TREE_TYPE
(decl
));
9748 /* If NODE is an access to a static field, strip out the class
9749 initialization part and return the field decl, otherwise, return
9753 extract_field_decl
(tree node
)
9755 if
(TREE_CODE
(node
) == COMPOUND_EXPR
)
9757 tree op1
= TREE_OPERAND
(node
, 1);
9758 if
(TREE_CODE
(op1
) == COMPOUND_EXPR
)
9760 tree call
= TREE_OPERAND
(op1
, 0);
9761 if
(TREE_CODE
(call
) == CALL_EXPR
9762 && TREE_CODE
(TREE_OPERAND
(call
, 0)) == ADDR_EXPR
9763 && (TREE_OPERAND
(TREE_OPERAND
(call
, 0), 0)
9764 == soft_initclass_node
))
9765 return TREE_OPERAND
(op1
, 1);
9767 else if
(JDECL_P
(op1
))
9773 /* 6.5.5.2: Qualified Expression Names */
9776 resolve_qualified_expression_name
(tree wfl
, tree
*found_decl
,
9777 tree
*where_found
, tree
*type_found
)
9779 int from_type
= 0; /* Field search initiated from a type */
9780 int from_super
= 0, from_cast
= 0, from_qualified_this
= 0;
9781 int previous_call_static
= 0;
9783 tree decl
= NULL_TREE
, type
= NULL_TREE
, q
;
9784 /* For certain for of inner class instantiation */
9785 tree saved_current
, saved_this
;
9786 #define RESTORE_THIS_AND_CURRENT_CLASS \
9787 { current_class
= saved_current
; current_this
= saved_this
;}
9789 *type_found
= *where_found
= NULL_TREE
;
9791 for
(q
= EXPR_WFL_QUALIFICATION
(wfl
); q
; q
= TREE_CHAIN
(q
))
9793 tree qual_wfl
= QUAL_WFL
(q
);
9794 tree ret_decl
; /* for EH checking */
9795 #ifdef USE_MAPPED_LOCATION
9796 source_location location
; /* for EH checking */
9798 int location
; /* for EH checking */
9801 /* 15.10.1 Field Access Using a Primary */
9802 switch
(TREE_CODE
(qual_wfl
))
9805 case NEW_CLASS_EXPR
:
9806 /* If the access to the function call is a non static field,
9807 build the code to access it. */
9808 if
(JDECL_P
(decl
) && !FIELD_STATIC
(decl
))
9810 decl
= maybe_access_field
(decl
, *where_found
,
9811 DECL_CONTEXT
(decl
));
9812 if
(decl
== error_mark_node
)
9816 /* And code for the function call */
9817 if
(complete_function_arguments
(qual_wfl
))
9820 /* We might have to setup a new current class and a new this
9821 for the search of an inner class, relative to the type of
9822 a expression resolved as `decl'. The current values are
9823 saved and restored shortly after */
9824 saved_current
= current_class
;
9825 saved_this
= current_this
;
9827 && (TREE_CODE
(qual_wfl
) == NEW_CLASS_EXPR
9828 || from_qualified_this
))
9830 /* If we still have `from_qualified_this', we have the form
9831 <T>.this.f() and we need to build <T>.this */
9832 if
(from_qualified_this
)
9834 decl
= build_access_to_thisn
(current_class
, type
, 0);
9835 decl
= java_complete_tree
(decl
);
9836 type
= TREE_TYPE
(TREE_TYPE
(decl
));
9838 current_class
= type
;
9839 current_this
= decl
;
9840 from_qualified_this
= 0;
9843 if
(from_super
&& TREE_CODE
(qual_wfl
) == CALL_EXPR
)
9844 CALL_USING_SUPER
(qual_wfl
) = 1;
9845 #ifdef USE_MAPPED_LOCATION
9846 location
= (TREE_CODE
(qual_wfl
) == CALL_EXPR
9847 ? EXPR_LOCATION
(TREE_OPERAND
(qual_wfl
, 0))
9848 : UNKNOWN_LOCATION
);
9850 location
= (TREE_CODE
(qual_wfl
) == CALL_EXPR ?
9851 EXPR_WFL_LINECOL
(TREE_OPERAND
(qual_wfl
, 0)) : 0);
9853 *where_found
= patch_method_invocation
(qual_wfl
, decl
, type
,
9855 &is_static
, &ret_decl
);
9857 if
(*where_found
== error_mark_node
)
9859 RESTORE_THIS_AND_CURRENT_CLASS
;
9862 *type_found
= type
= QUAL_DECL_TYPE
(*where_found
);
9864 *where_found
= force_evaluation_order
(*where_found
);
9866 /* If we're creating an inner class instance, check for that
9867 an enclosing instance is in scope */
9868 if
(TREE_CODE
(qual_wfl
) == NEW_CLASS_EXPR
9869 && INNER_ENCLOSING_SCOPE_CHECK
(type
))
9872 (qual_wfl
, "No enclosing instance for inner class %qs is in scope%s",
9873 lang_printable_name
(type
, 0),
9874 (!current_this ?
"" :
9875 "; an explicit one must be provided when creating this inner class"));
9876 RESTORE_THIS_AND_CURRENT_CLASS
;
9880 /* In case we had to change then to resolve a inner class
9881 instantiation using a primary qualified by a `new' */
9882 RESTORE_THIS_AND_CURRENT_CLASS
;
9884 #ifdef USE_MAPPED_LOCATION
9885 if
(location
!= UNKNOWN_LOCATION
)
9890 tree arguments
= NULL_TREE
;
9891 if
(TREE_CODE
(qual_wfl
) == CALL_EXPR
9892 && TREE_OPERAND
(qual_wfl
, 1) != NULL_TREE
)
9893 arguments
= TREE_VALUE
(TREE_OPERAND
(qual_wfl
, 1));
9894 check_thrown_exceptions
(location
, ret_decl
, arguments
);
9897 /* If the previous call was static and this one is too,
9898 build a compound expression to hold the two (because in
9899 that case, previous function calls aren't transported as
9900 forcoming function's argument. */
9901 if
(previous_call_static
&& is_static
)
9903 /* We must set CAN_COMPLETE_NORMALLY for the first call
9904 since it is done nowhere else. */
9905 CAN_COMPLETE_NORMALLY
(decl
) = 1;
9906 decl
= build2
(COMPOUND_EXPR
, TREE_TYPE
(*where_found
),
9907 decl
, *where_found
);
9908 TREE_SIDE_EFFECTS
(decl
) = 1;
9912 previous_call_static
= is_static
;
9913 decl
= *where_found
;
9918 case NEW_ARRAY_EXPR
:
9919 case NEW_ANONYMOUS_ARRAY_EXPR
:
9920 *where_found
= decl
= java_complete_tree
(qual_wfl
);
9921 if
(decl
== error_mark_node
)
9923 *type_found
= type
= QUAL_DECL_TYPE
(decl
);
9927 *where_found
= decl
= java_complete_tree
(qual_wfl
);
9928 if
(decl
== error_mark_node
)
9930 *type_found
= type
= QUAL_DECL_TYPE
(decl
);
9934 case CONDITIONAL_EXPR
:
9937 *where_found
= decl
= java_complete_tree
(qual_wfl
);
9938 if
(decl
== error_mark_node
)
9940 *type_found
= type
= QUAL_DECL_TYPE
(decl
);
9944 /* If the access to the function call is a non static field,
9945 build the code to access it. */
9946 if
(JDECL_P
(decl
) && !FIELD_STATIC
(decl
))
9948 decl
= maybe_access_field
(decl
, *where_found
, type
);
9949 if
(decl
== error_mark_node
)
9952 /* And code for the array reference expression */
9953 decl
= java_complete_tree
(qual_wfl
);
9954 if
(decl
== error_mark_node
)
9956 type
= QUAL_DECL_TYPE
(decl
);
9960 if
((decl
= java_complete_tree
(qual_wfl
)) == error_mark_node
)
9962 if
((type
= patch_string
(decl
)))
9964 *where_found
= QUAL_RESOLUTION
(q
) = decl
;
9965 *type_found
= type
= TREE_TYPE
(decl
);
9969 if
((decl
= java_complete_tree
(qual_wfl
)) == error_mark_node
)
9971 *where_found
= QUAL_RESOLUTION
(q
) = decl
;
9972 *type_found
= type
= TREE_TYPE
(decl
);
9976 /* Fix for -Wall Just go to the next statement. Don't
9981 /* If we fall here, we weren't processing a (static) function call. */
9982 previous_call_static
= 0;
9984 /* It can be the keyword THIS */
9985 if
(TREE_CODE
(qual_wfl
) == EXPR_WITH_FILE_LOCATION
9986 && EXPR_WFL_NODE
(qual_wfl
) == this_identifier_node
)
9991 (wfl
, "Keyword %<this%> used outside allowed context");
9994 if
(ctxp
->explicit_constructor_p
9995 && type
== current_class
)
9997 parse_error_context
(wfl
, "Can't reference %<this%> before the superclass constructor has been called");
10000 /* We have to generate code for intermediate access */
10001 if
(!from_type || TREE_TYPE
(TREE_TYPE
(current_this
)) == type
)
10003 *where_found
= decl
= current_this
;
10004 *type_found
= type
= QUAL_DECL_TYPE
(decl
);
10006 /* We're trying to access the this from somewhere else. Make sure
10007 it's allowed before doing so. */
10010 if
(!enclosing_context_p
(type
, current_class
))
10012 char *p
= xstrdup
(lang_printable_name
(type
, 0));
10013 parse_error_context
(qual_wfl
, "Can't use variable %<%s.this%>: type %qs isn't an outer type of type %qs",
10015 lang_printable_name
(current_class
, 0));
10019 from_qualified_this
= 1;
10020 /* If there's nothing else after that, we need to
10021 produce something now, otherwise, the section of the
10022 code that needs to produce <T>.this will generate
10023 what is necessary. */
10024 if
(!TREE_CHAIN
(q
))
10026 decl
= build_access_to_thisn
(current_class
, type
, 0);
10027 *where_found
= decl
= java_complete_tree
(decl
);
10028 *type_found
= type
= TREE_TYPE
(decl
);
10036 /* 15.10.2 Accessing Superclass Members using SUPER */
10037 if
(TREE_CODE
(qual_wfl
) == EXPR_WITH_FILE_LOCATION
10038 && EXPR_WFL_NODE
(qual_wfl
) == super_identifier_node
)
10041 /* Check on the restricted use of SUPER */
10042 if
(METHOD_STATIC
(current_function_decl
)
10043 || current_class
== object_type_node
)
10045 parse_error_context
10046 (wfl
, "Keyword %<super%> used outside allowed context");
10049 /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
10050 node
= build_cast
(EXPR_WFL_LINECOL
(qual_wfl
),
10051 CLASSTYPE_SUPER
(current_class
),
10052 build_this
(EXPR_WFL_LINECOL
(qual_wfl
)));
10053 *where_found
= decl
= java_complete_tree
(node
);
10054 if
(decl
== error_mark_node
)
10056 *type_found
= type
= QUAL_DECL_TYPE
(decl
);
10057 from_super
= from_type
= 1;
10061 /* 15.13.1: Can't search for field name in packages, so we
10062 assume a variable/class name was meant. */
10063 if
(RESOLVE_PACKAGE_NAME_P
(qual_wfl
))
10066 if
((decl
= resolve_package
(wfl
, &q
, &name
)))
10069 *where_found
= decl
;
10071 check_pkg_class_access
(DECL_NAME
(decl
), qual_wfl
, true
, NULL
);
10073 /* We want to be absolutely sure that the class is laid
10074 out. We're going to search something inside it. */
10075 *type_found
= type
= TREE_TYPE
(decl
);
10076 layout_class
(type
);
10079 /* Fix them all the way down, if any are left. */
10082 list
= TREE_CHAIN
(q
);
10085 RESOLVE_PACKAGE_NAME_P
(QUAL_WFL
(list
)) = 0;
10086 list
= TREE_CHAIN
(list
);
10092 if
(from_super || from_cast
)
10093 parse_error_context
10094 ((from_cast ? qual_wfl
: wfl
),
10095 "No variable %qs defined in class %qs",
10096 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(qual_wfl
)),
10097 lang_printable_name
(type
, 0));
10099 parse_error_context
10100 (qual_wfl
, "Undefined variable or class name: %qs",
10101 IDENTIFIER_POINTER
(name
));
10106 /* We have a type name. It's been already resolved when the
10107 expression was qualified. */
10108 else if
(RESOLVE_TYPE_NAME_P
(qual_wfl
) && QUAL_RESOLUTION
(q
))
10110 decl
= QUAL_RESOLUTION
(q
);
10112 /* Sneak preview. If next we see a `new', we're facing a
10113 qualification which resulted in a type being selected
10114 instead of a field. Report the error. */
10116 && TREE_CODE
(TREE_PURPOSE
(TREE_CHAIN
(q
))) == NEW_CLASS_EXPR
)
10118 parse_error_context
(qual_wfl
, "Undefined variable %qs",
10119 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(wfl
)));
10123 check_pkg_class_access
(DECL_NAME
(decl
), qual_wfl
, true
, NULL
);
10125 check_deprecation
(qual_wfl
, decl
);
10127 type
= TREE_TYPE
(decl
);
10130 /* We resolve an expression name */
10133 tree field_decl
= NULL_TREE
;
10135 /* If there exists an early resolution, use it. That occurs
10136 only once and we know that there are more things to
10137 come. Don't do that when processing something after SUPER
10138 (we need more thing to be put in place below */
10139 if
(!from_super
&& QUAL_RESOLUTION
(q
))
10141 decl
= QUAL_RESOLUTION
(q
);
10144 if
(TREE_CODE
(decl
) == FIELD_DECL
10145 || TREE_CODE
(decl
) == VAR_DECL
)
10147 if
(TREE_CODE
(decl
) == FIELD_DECL
10148 && !FIELD_STATIC
(decl
))
10151 *where_found
= current_this
;
10154 static_ref_err
(qual_wfl
, DECL_NAME
(decl
),
10161 *where_found
= TREE_TYPE
(decl
);
10162 if
(TREE_CODE
(*where_found
) == POINTER_TYPE
)
10163 *where_found
= TREE_TYPE
(*where_found
);
10165 if
(nested_member_access_p
(current_class
, decl
))
10166 decl
= build_nested_field_access
(qual_wfl
, decl
);
10170 *where_found
= TREE_TYPE
(decl
);
10171 if
(TREE_CODE
(*where_found
) == POINTER_TYPE
)
10172 *where_found
= TREE_TYPE
(*where_found
);
10177 /* Report and error if we're using a numerical literal as a
10178 qualifier. It can only be an INTEGER_CST. */
10179 else if
(TREE_CODE
(qual_wfl
) == INTEGER_CST
)
10181 parse_error_context
10182 (wfl
, "Can't use type %qs as a qualifier",
10183 lang_printable_name
(TREE_TYPE
(qual_wfl
), 0));
10187 /* We have to search for a field, knowing the type of its
10188 container. The flag FROM_TYPE indicates that we resolved
10189 the last member of the expression as a type name, which
10190 means that for the resolution of this field, we'll look
10191 for other errors than if it was resolved as a member of
10196 tree field_decl_type
; /* For layout */
10198 if
(!from_type
&& !JREFERENCE_TYPE_P
(type
))
10200 parse_error_context
10201 (qual_wfl
, "Attempt to reference field %qs in %<%s %s%>",
10202 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(qual_wfl
)),
10203 lang_printable_name
(type
, 0),
10204 IDENTIFIER_POINTER
(DECL_NAME
(decl
)));
10208 field_decl
= lookup_field_wrapper
(type
,
10209 EXPR_WFL_NODE
(qual_wfl
));
10211 /* Maybe what we're trying to access to is an inner
10212 class, only if decl is a TYPE_DECL. */
10213 if
(!field_decl
&& TREE_CODE
(decl
) == TYPE_DECL
)
10215 tree ptr
, inner_decl
;
10217 BUILD_PTR_FROM_NAME
(ptr
, EXPR_WFL_NODE
(qual_wfl
));
10218 inner_decl
= resolve_class
(decl
, ptr
, NULL_TREE
, qual_wfl
);
10221 check_inner_class_access
(inner_decl
, decl
, qual_wfl
);
10222 type
= TREE_TYPE
(inner_decl
);
10229 if
(field_decl
== NULL_TREE
)
10231 parse_error_context
10232 (qual_wfl
, "No variable %qs defined in type %qs",
10233 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(qual_wfl
)),
10234 GET_TYPE_NAME
(type
));
10237 if
(field_decl
== error_mark_node
)
10240 /* Layout the type of field_decl, since we may need
10241 it. Don't do primitive types or loaded classes. The
10242 situation of non primitive arrays may not handled
10243 properly here. FIXME */
10244 if
(TREE_CODE
(TREE_TYPE
(field_decl
)) == POINTER_TYPE
)
10245 field_decl_type
= TREE_TYPE
(TREE_TYPE
(field_decl
));
10247 field_decl_type
= TREE_TYPE
(field_decl
);
10248 if
(!JPRIMITIVE_TYPE_P
(field_decl_type
)
10249 && !CLASS_LOADED_P
(field_decl_type
)
10250 && !TYPE_ARRAY_P
(field_decl_type
))
10251 resolve_and_layout
(field_decl_type
, NULL_TREE
);
10253 /* Check on accessibility here */
10254 if
(not_accessible_p
(current_class
, field_decl
,
10255 *type_found
, from_super
))
10256 return not_accessible_field_error
(qual_wfl
,field_decl
);
10257 check_deprecation
(qual_wfl
, field_decl
);
10259 /* There are things to check when fields are accessed
10260 from type. There are no restrictions on a static
10261 declaration of the field when it is accessed from an
10263 is_static
= FIELD_STATIC
(field_decl
);
10264 if
(!from_super
&& from_type
10265 && !TYPE_INTERFACE_P
(type
)
10267 && (current_function_decl
10268 && METHOD_STATIC
(current_function_decl
)))
10270 static_ref_err
(qual_wfl
, EXPR_WFL_NODE
(qual_wfl
), type
);
10273 from_cast
= from_super
= 0;
10275 /* If it's an access from a type but isn't static, we
10276 make it relative to `this'. */
10277 if
(!is_static
&& from_type
)
10278 decl
= current_this
;
10280 /* If we need to generate something to get a proper
10281 handle on what this field is accessed from, do it
10285 decl
= maybe_access_field
(decl
, *where_found
, *type_found
);
10286 if
(decl
== error_mark_node
)
10290 /* We want to keep the location where we found it, and the
10292 *where_found
= decl
;
10293 *type_found
= type
;
10295 /* Generate the correct expression for field access from
10297 if
(from_qualified_this
)
10300 = build_nested_field_access
(qual_wfl
, field_decl
);
10301 from_qualified_this
= 0;
10304 /* If needed, generate accessors for static field access. */
10306 && FIELD_PRIVATE
(field_decl
)
10307 && flag_emit_class_files
10308 && nested_member_access_p
(current_class
, field_decl
))
10309 field_decl
= build_nested_field_access
(qual_wfl
, field_decl
);
10311 /* This is the decl found and eventually the next one to
10316 type
= QUAL_DECL_TYPE
(decl
);
10318 /* Sneak preview. If decl is qualified by a `new', report
10319 the error here to be accurate on the peculiar construct */
10321 && TREE_CODE
(TREE_PURPOSE
(TREE_CHAIN
(q
))) == NEW_CLASS_EXPR
10322 && !JREFERENCE_TYPE_P
(type
))
10324 parse_error_context
(qual_wfl
, "Attempt to reference field %<new%> in a %qs",
10325 lang_printable_name
(type
, 0));
10329 /* `q' might have changed due to a after package resolution
10330 re-qualification */
10334 *found_decl
= decl
;
10338 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
10339 can't be accessed from REFERENCE (a record type). If MEMBER
10340 features a protected access, we then use WHERE which, if non null,
10341 holds the type of MEMBER's access that is checked against
10342 6.6.2.1. This function should be used when decl is a field or a
10346 not_accessible_p
(tree reference
, tree member
, tree where
, int from_super
)
10348 int access_flag
= get_access_flags_from_decl
(member
);
10349 bool is_static
= false
;
10351 if
(TREE_CODE
(member
) == FIELD_DECL ||
10352 TREE_CODE
(member
) == VAR_DECL
)
10353 is_static
= FIELD_STATIC
(member
);
10355 is_static
= METHOD_STATIC
(member
);
10357 /* Access always granted for members declared public */
10358 if
(access_flag
& ACC_PUBLIC
)
10361 /* Check access on protected members */
10362 if
(access_flag
& ACC_PROTECTED
)
10364 /* Access granted if it occurs from within the package
10365 containing the class in which the protected member is
10367 if
(class_in_current_package
(DECL_CONTEXT
(member
)))
10370 /* If accessed with the form `super.member', then access is granted */
10374 /* If WHERE is active, access was made through a qualifier. For
10375 non-static members, access is granted if the type of the qualifier
10376 is or is a sublass of the type the access is made from (6.6.2.1.) */
10377 if
(where
&& !is_static
)
10381 if
(inherits_from_p
(where
, reference
))
10383 if
(INNER_CLASS_TYPE_P
(reference
))
10384 reference
= TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(reference
)));
10391 /* Otherwise, access is granted if occurring from within the class
10392 where member is declared, or a subclass of it. */
10395 if
(inherits_from_p
(reference
, DECL_CONTEXT
(member
)))
10397 if
(INNER_CLASS_TYPE_P
(reference
))
10398 reference
= TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(reference
)));
10405 /* Check access on private members. Access is granted only if it
10406 occurs from within the class in which it is declared -- that does
10407 it for innerclasses too. */
10408 if
(access_flag
& ACC_PRIVATE
)
10410 if
(reference
== DECL_CONTEXT
(member
) ||
10411 common_enclosing_context_p
(DECL_CONTEXT
(member
), reference
))
10416 /* Default access is permitted only when occurring from within the
10417 package in which the context (MEMBER) is declared. */
10418 return
!class_in_current_package
(DECL_CONTEXT
(member
));
10421 /* Test deprecated decl access. */
10423 check_deprecation
(tree wfl
, tree decl
)
10428 if
(! warn_deprecated
)
10431 /* We want to look at the element type of arrays here, so we strip
10432 all surrounding array types. */
10433 if
(TYPE_ARRAY_P
(TREE_TYPE
(decl
)))
10435 elt
= TREE_TYPE
(decl
);
10436 while
(TYPE_ARRAY_P
(elt
))
10437 elt
= TYPE_ARRAY_ELEMENT
(elt
);
10438 /* We'll end up with a pointer type, so we use TREE_TYPE to go
10440 decl
= TYPE_NAME
(TREE_TYPE
(elt
));
10442 file
= DECL_SOURCE_FILE
(decl
);
10444 /* Complain if the field is deprecated and the file it was defined
10445 in isn't compiled at the same time the file which contains its
10447 if
(DECL_DEPRECATED
(decl
)
10448 && !IS_A_COMMAND_LINE_FILENAME_P
(get_identifier
(file
)))
10451 switch
(TREE_CODE
(decl
))
10453 case FUNCTION_DECL
:
10461 parse_warning_context
(wfl
, "The class %qs has been deprecated",
10462 IDENTIFIER_POINTER
(DECL_NAME
(decl
)));
10467 /* Don't issue a message if the context as been deprecated as a
10469 if
(! CLASS_DEPRECATED
(TYPE_NAME
(DECL_CONTEXT
(decl
))))
10470 parse_warning_context
10471 (wfl
, "The %s %qs in class %qs has been deprecated",
10472 the
, lang_printable_name
(decl
, 0),
10473 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(decl
)))));
10477 /* Returns 1 if class was declared in the current package, 0 otherwise */
10480 class_in_current_package
(tree class
)
10482 if
(TYPE_PACKAGE
(current_class
) == TYPE_PACKAGE
(class
))
10487 /* This function may generate code to access DECL from WHERE. This is
10488 done only if certain conditions meet. */
10491 maybe_access_field
(tree decl
, tree where
, tree type
)
10493 if
(TREE_CODE
(decl
) == FIELD_DECL
&& decl
!= current_this
10494 && !FIELD_STATIC
(decl
))
10495 decl
= build_field_ref
(where ? where
: current_this
,
10496 (type ? type
: DECL_CONTEXT
(decl
)),
10501 /* Build a method invocation, by patching PATCH. If non NULL
10502 and according to the situation, PRIMARY and WHERE may be
10503 used. IS_STATIC is set to 1 if the invoked function is static. */
10506 patch_method_invocation
(tree patch
, tree primary
, tree where
, int from_super
,
10507 int *is_static
, tree
*ret_decl
)
10509 tree wfl
= TREE_OPERAND
(patch
, 0);
10510 tree args
= TREE_OPERAND
(patch
, 1);
10511 tree name
= EXPR_WFL_NODE
(wfl
);
10513 int is_static_flag
= 0;
10514 int is_super_init
= 0;
10515 tree this_arg
= NULL_TREE
;
10516 int is_array_clone_call
= 0;
10518 /* Should be overridden if everything goes well. Otherwise, if
10519 something fails, it should keep this value. It stop the
10520 evaluation of a bogus assignment. See java_complete_tree,
10521 MODIFY_EXPR: for the reasons why we sometimes want to keep on
10522 evaluating an assignment */
10523 TREE_TYPE
(patch
) = error_mark_node
;
10525 /* Since lookup functions are messing with line numbers, save the
10527 java_parser_context_save_global
();
10529 /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
10531 /* Resolution of qualified name, excluding constructors */
10532 if
(QUALIFIED_P
(name
) && !CALL_CONSTRUCTOR_P
(patch
))
10534 tree identifier
, identifier_wfl
, type
, resolved
;
10535 /* Extract the last IDENTIFIER of the qualified
10536 expression. This is a wfl and we will use it's location
10537 data during error report. */
10538 identifier_wfl
= cut_identifier_in_qualified
(wfl
);
10539 identifier
= EXPR_WFL_NODE
(identifier_wfl
);
10541 /* Given the context, IDENTIFIER is syntactically qualified
10542 as a MethodName. We need to qualify what's before */
10543 qualify_ambiguous_name
(wfl
);
10544 resolved
= resolve_field_access
(wfl
, NULL
, NULL
);
10546 if
(TREE_CODE
(resolved
) == VAR_DECL
&& FIELD_STATIC
(resolved
)
10547 && FIELD_FINAL
(resolved
)
10548 && !inherits_from_p
(DECL_CONTEXT
(resolved
), current_class
)
10549 && !flag_emit_class_files
)
10550 resolved
= build_class_init
(DECL_CONTEXT
(resolved
), resolved
);
10552 if
(resolved
== error_mark_node
)
10553 PATCH_METHOD_RETURN_ERROR
();
10555 type
= GET_SKIP_TYPE
(resolved
);
10556 resolve_and_layout
(type
, NULL_TREE
);
10558 if
(JPRIMITIVE_TYPE_P
(type
))
10560 parse_error_context
10562 "Can't invoke a method on primitive type %qs",
10563 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(type
))));
10564 PATCH_METHOD_RETURN_ERROR
();
10567 list
= lookup_method_invoke
(0, identifier_wfl
, type
, identifier
, args
);
10568 args
= nreverse
(args
);
10570 /* We're resolving a call from a type */
10571 if
(TREE_CODE
(resolved
) == TYPE_DECL
)
10573 if
(CLASS_INTERFACE
(resolved
))
10575 parse_error_context
10577 "Can't make static reference to method %qs in interface %qs",
10578 IDENTIFIER_POINTER
(identifier
),
10579 IDENTIFIER_POINTER
(name
));
10580 PATCH_METHOD_RETURN_ERROR
();
10584 if
(METHOD_STATIC
(list
))
10585 maybe_use_access_method
(0, &list
, NULL
);
10588 char *fct_name
= xstrdup
(lang_printable_name
(list
, 2));
10589 parse_error_context
10591 "Can't make static reference to method %<%s %s%> in class %qs",
10592 lang_printable_name
(TREE_TYPE
(TREE_TYPE
(list
)), 0),
10594 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(type
))));
10596 PATCH_METHOD_RETURN_ERROR
();
10601 this_arg
= primary
= resolved
;
10603 if
(TYPE_ARRAY_P
(type
) && identifier
== get_identifier
("clone"))
10604 is_array_clone_call
= 1;
10606 /* IDENTIFIER_WFL will be used to report any problem further */
10607 wfl
= identifier_wfl
;
10609 /* Resolution of simple names, names generated after a primary: or
10613 tree class_to_search
= NULL_TREE
;
10614 int lc
; /* Looking for Constructor */
10616 /* We search constructor in their target class */
10617 if
(CALL_CONSTRUCTOR_P
(patch
))
10619 if
(TREE_CODE
(patch
) == NEW_CLASS_EXPR
)
10620 class_to_search
= EXPR_WFL_NODE
(wfl
);
10621 else if
(EXPR_WFL_NODE
(TREE_OPERAND
(patch
, 0)) ==
10622 this_identifier_node
)
10623 class_to_search
= NULL_TREE
;
10624 else if
(EXPR_WFL_NODE
(TREE_OPERAND
(patch
, 0)) ==
10625 super_identifier_node
)
10628 if
(CLASSTYPE_SUPER
(current_class
))
10630 DECL_NAME
(TYPE_NAME
(CLASSTYPE_SUPER
(current_class
)));
10633 parse_error_context
(wfl
, "Can't invoke super constructor on java.lang.Object");
10634 PATCH_METHOD_RETURN_ERROR
();
10638 /* Class to search is NULL if we're searching the current one */
10639 if
(class_to_search
)
10641 class_to_search
= resolve_and_layout
(class_to_search
, wfl
);
10643 if
(!class_to_search
)
10645 parse_error_context
10646 (wfl
, "Class %qs not found in type declaration",
10647 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(wfl
)));
10648 PATCH_METHOD_RETURN_ERROR
();
10651 /* Can't instantiate an abstract class, but we can
10652 invoke it's constructor. It's use within the `new'
10653 context is denied here. */
10654 if
(CLASS_ABSTRACT
(class_to_search
)
10655 && TREE_CODE
(patch
) == NEW_CLASS_EXPR
)
10657 parse_error_context
10658 (wfl
, "Class %qs is an abstract class. It can't be instantiated",
10659 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(wfl
)));
10660 PATCH_METHOD_RETURN_ERROR
();
10663 class_to_search
= TREE_TYPE
(class_to_search
);
10666 class_to_search
= current_class
;
10669 /* This is a regular search in the local class, unless an
10670 alternate class is specified. */
10673 if
(where
!= NULL_TREE
)
10674 class_to_search
= where
;
10675 else if
(QUALIFIED_P
(name
))
10676 class_to_search
= current_class
;
10679 class_to_search
= current_class
;
10683 if
(has_method
(class_to_search
, name
))
10685 if
(! INNER_CLASS_TYPE_P
(class_to_search
))
10687 parse_error_context
(wfl
,
10688 "No method named %qs in scope",
10689 IDENTIFIER_POINTER
(name
));
10690 PATCH_METHOD_RETURN_ERROR
();
10693 = TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(class_to_search
)));
10699 /* NAME is a simple identifier or comes from a primary. Search
10700 in the class whose declaration contain the method being
10702 resolve_and_layout
(class_to_search
, NULL_TREE
);
10704 list
= lookup_method_invoke
(lc
, wfl
, class_to_search
, name
, args
);
10705 /* Don't continue if no method were found, as the next statement
10706 can't be executed then. */
10708 PATCH_METHOD_RETURN_ERROR
();
10710 if
(TYPE_ARRAY_P
(class_to_search
)
10711 && DECL_NAME
(list
) == get_identifier
("clone"))
10712 is_array_clone_call
= 1;
10714 /* Check for static reference of non static methods. */
10715 if
(check_for_static_method_reference
(wfl
, patch
, list
,
10716 class_to_search
, primary
))
10717 PATCH_METHOD_RETURN_ERROR
();
10719 /* Check for inner classes creation from illegal contexts */
10720 if
(lc
&& (INNER_CLASS_TYPE_P
(class_to_search
)
10721 && !CLASS_STATIC
(TYPE_NAME
(class_to_search
)))
10722 && INNER_ENCLOSING_SCOPE_CHECK
(class_to_search
)
10723 && !DECL_INIT_P
(current_function_decl
))
10725 parse_error_context
10726 (wfl
, "No enclosing instance for inner class %qs is in scope%s",
10727 lang_printable_name
(class_to_search
, 0),
10728 (!current_this ?
"" :
10729 "; an explicit one must be provided when creating this inner class"));
10730 PATCH_METHOD_RETURN_ERROR
();
10733 /* Non static methods are called with the current object extra
10734 argument. If PATCH is a `new TYPE()', the argument is the value
10735 returned by the object allocator. If method is resolved as a
10736 primary, use the primary otherwise use the current THIS. */
10737 args
= nreverse
(args
);
10738 if
(TREE_CODE
(patch
) != NEW_CLASS_EXPR
)
10740 this_arg
= primary ? primary
: current_this
;
10742 /* If we're using an access method, things are different.
10743 There are two family of cases:
10745 1) We're not generating bytecodes:
10747 - LIST is non-static. Its invocation is transformed from
10748 x(a1,...,an) into this$<n>.x(a1,....an).
10749 - LIST is static. Its invocation is transformed from
10750 x(a1,...,an) into TYPE_OF(this$<n>).x(a1,....an)
10752 2) We're generating bytecodes:
10754 - LIST is non-static. Its invocation is transformed from
10755 x(a1,....,an) into access$<n>(this$<n>,a1,...,an).
10756 - LIST is static. Its invocation is transformed from
10757 x(a1,....,an) into TYPE_OF(this$<n>).x(a1,....an).
10759 Of course, this$<n> can be arbitrarily complex, ranging from
10760 this$0 (the immediate outer context) to
10761 access$0(access$0(...(this$0))).
10763 maybe_use_access_method returns a nonzero value if the
10764 this_arg has to be moved into the (then generated) stub
10765 argument list. In the meantime, the selected function
10766 might have been replaced by a generated stub. */
10767 if
(METHOD_STATIC
(list
))
10768 maybe_use_access_method
(0, &list
, NULL
);
10769 else if
(!primary
&&
10770 maybe_use_access_method
(is_super_init
, &list
, &this_arg
))
10772 args
= tree_cons
(NULL_TREE
, this_arg
, args
);
10773 this_arg
= NULL_TREE
; /* So it doesn't get chained twice */
10778 /* Merge point of all resolution schemes. If we have nothing, this
10779 is an error, already signaled */
10781 PATCH_METHOD_RETURN_ERROR
();
10783 /* Check accessibility, position the is_static flag, build and
10785 if
(not_accessible_p
(DECL_CONTEXT
(current_function_decl
), list
,
10786 (primary ? TREE_TYPE
(TREE_TYPE
(primary
)) :
10787 NULL_TREE
), from_super
)
10788 /* Calls to clone() on array types are permitted as a special-case. */
10789 && !is_array_clone_call
)
10791 const char *const fct_name
= IDENTIFIER_POINTER
(DECL_NAME
(list
));
10792 const char *const access
=
10793 accessibility_string
(get_access_flags_from_decl
(list
));
10794 const char *const klass
=
10795 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(list
))));
10796 const char *const refklass
=
10797 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(current_class
)));
10798 const char *const what
= (DECL_CONSTRUCTOR_P
(list
)
10799 ?
"constructor" : "method");
10800 parse_error_context
(wfl
,
10801 "Can't access %s %s %<%s.%s%> from %qs",
10802 access
, what
, klass
, fct_name
, refklass
);
10803 PATCH_METHOD_RETURN_ERROR
();
10806 /* Deprecation check: check whether the method being invoked or the
10807 instance-being-created's type are deprecated. */
10808 if
(TREE_CODE
(patch
) == NEW_CLASS_EXPR
)
10809 check_deprecation
(wfl
, TYPE_NAME
(DECL_CONTEXT
(list
)));
10810 check_deprecation
(wfl
, list
);
10812 /* If invoking a innerclass constructor, there are hidden parameters
10814 if
(TREE_CODE
(patch
) == NEW_CLASS_EXPR
10815 && PURE_INNER_CLASS_TYPE_P
(DECL_CONTEXT
(list
)))
10817 /* And make sure we add the accessed local variables to be saved
10818 in field aliases. */
10819 args
= build_alias_initializer_parameter_list
10820 (AIPL_FUNCTION_CTOR_INVOCATION
, DECL_CONTEXT
(list
), args
, NULL
);
10822 /* Secretly pass the current_this/primary as a second argument */
10823 if
(primary || current_this
)
10826 tree this_type
= (current_this ?
10827 TREE_TYPE
(TREE_TYPE
(current_this
)) : NULL_TREE
);
10828 /* Method's (list) enclosing context */
10829 tree mec
= DECL_CONTEXT
(TYPE_NAME
(DECL_CONTEXT
(list
)));
10830 /* If we have a primary, use it. */
10832 extra_arg
= primary
;
10833 /* The current `this' is an inner class but isn't a direct
10834 enclosing context for the inner class we're trying to
10835 create. Build an access to the proper enclosing context
10837 else if
(current_this
&& PURE_INNER_CLASS_TYPE_P
(this_type
)
10838 && this_type
!= TREE_TYPE
(mec
))
10841 extra_arg
= build_access_to_thisn
(current_class
,
10842 TREE_TYPE
(mec
), 0);
10843 extra_arg
= java_complete_tree
(extra_arg
);
10845 /* Otherwise, just use the current `this' as an enclosing
10848 extra_arg
= current_this
;
10849 args
= tree_cons
(NULL_TREE
, extra_arg
, args
);
10852 args
= tree_cons
(NULL_TREE
, integer_zero_node
, args
);
10855 /* This handles the situation where a constructor invocation needs
10856 to have an enclosing context passed as a second parameter (the
10857 constructor is one of an inner class). */
10858 if
((is_super_init ||
10859 (TREE_CODE
(patch
) == CALL_EXPR
&& name
== this_identifier_node
))
10860 && PURE_INNER_CLASS_TYPE_P
(DECL_CONTEXT
(list
)))
10862 tree dest
= TYPE_NAME
(DECL_CONTEXT
(list
));
10864 build_access_to_thisn
(current_class
, DECL_CONTEXT
(dest
), 0);
10865 extra_arg
= java_complete_tree
(extra_arg
);
10866 args
= tree_cons
(NULL_TREE
, extra_arg
, args
);
10869 is_static_flag
= METHOD_STATIC
(list
);
10870 if
(! is_static_flag
&& this_arg
!= NULL_TREE
)
10871 args
= tree_cons
(NULL_TREE
, this_arg
, args
);
10873 /* In the context of an explicit constructor invocation, we can't
10874 invoke any method relying on `this'. Exceptions are: we're
10875 invoking a static function, primary exists and is not the current
10876 this, we're creating a new object. */
10877 if
(ctxp
->explicit_constructor_p
10879 && (!primary || primary
== current_this
)
10880 && (TREE_CODE
(patch
) != NEW_CLASS_EXPR
))
10882 parse_error_context
(wfl
, "Can't reference %<this%> before the superclass constructor has been called");
10883 PATCH_METHOD_RETURN_ERROR
();
10885 java_parser_context_restore_global
();
10887 *is_static
= is_static_flag
;
10888 /* Sometimes, we want the decl of the selected method. Such as for
10892 patch
= patch_invoke
(patch
, list
, args
);
10894 /* Now is a good time to insert the call to finit$ */
10895 if
(is_super_init
&& CLASS_HAS_FINIT_P
(current_class
))
10897 tree finit_parms
, finit_call
;
10899 /* Prepare to pass hidden parameters to finit$, if any. */
10900 finit_parms
= build_alias_initializer_parameter_list
10901 (AIPL_FUNCTION_FINIT_INVOCATION
, current_class
, NULL_TREE
, NULL
);
10904 build_method_invocation
(build_wfl_node
(finit_identifier_node
),
10907 /* Generate the code used to initialize fields declared with an
10908 initialization statement and build a compound statement along
10909 with the super constructor invocation. */
10910 CAN_COMPLETE_NORMALLY
(patch
) = 1;
10911 patch
= build2
(COMPOUND_EXPR
, void_type_node
, patch
,
10912 java_complete_tree
(finit_call
));
10917 /* Check that we're not trying to do a static reference to a method in
10918 non static method. Return 1 if it's the case, 0 otherwise. */
10921 check_for_static_method_reference
(tree wfl
, tree node
, tree method
,
10922 tree where
, tree primary
)
10924 if
(METHOD_STATIC
(current_function_decl
)
10925 && !METHOD_STATIC
(method
) && !primary
&& !CALL_CONSTRUCTOR_P
(node
))
10927 char *fct_name
= xstrdup
(lang_printable_name
(method
, 0));
10928 parse_error_context
10929 (wfl
, "Can't make static reference to method %<%s %s%> in class %qs",
10930 lang_printable_name
(TREE_TYPE
(TREE_TYPE
(method
)), 0), fct_name
,
10931 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(where
))));
10938 /* Fix the invocation of *MDECL if necessary in the case of an
10939 invocation across a nested class. *THIS_ARG might be modified
10940 appropriately and an alternative access to *MDECL might be
10944 maybe_use_access_method
(int is_super_init
, tree
*mdecl
, tree
*this_arg
)
10947 tree md
= *mdecl
, ta
= NULL_TREE
;
10949 int non_static_context
= !METHOD_STATIC
(md
);
10952 || DECL_FINIT_P
(md
)
10953 || DECL_INSTINIT_P
(md
)
10954 ||
!nested_member_access_p
(current_class
, md
))
10957 /* If we're calling a method found in an enclosing class, generate
10958 what it takes to retrieve the right `this'. Don't do that if we're
10959 invoking a static method. Note that if MD's type is unrelated to
10960 CURRENT_CLASS, then the current this can be used. */
10962 if
(non_static_context
10963 && !inherits_from_p
(current_class
, DECL_CONTEXT
(md
))
10964 && DECL_CONTEXT
(TYPE_NAME
(current_class
)))
10967 ctx
= TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(current_class
)));
10968 if
(inherits_from_p
(ctx
, DECL_CONTEXT
(md
)))
10970 ta
= build_current_thisn
(current_class
);
10971 ta
= build_wfl_node
(ta
);
10978 maybe_build_thisn_access_method
(type
);
10979 if
(inherits_from_p
(type
, DECL_CONTEXT
(md
)))
10981 ta
= build_access_to_thisn
(ctx
, type
, 0);
10984 type
= (DECL_CONTEXT
(TYPE_NAME
(type
)) ?
10985 TREE_TYPE
(DECL_CONTEXT
(TYPE_NAME
(type
))) : NULL_TREE
);
10988 ta
= java_complete_tree
(ta
);
10991 /* We might have to use an access method to get to MD. We can
10992 break the method access rule as long as we're not generating
10994 if
(METHOD_PRIVATE
(md
) && flag_emit_class_files
)
10996 md
= build_nested_method_access_method
(md
);
11004 /* Returning a nonzero value indicates we were doing a non static
11005 method invocation that is now a static invocation. It will have
11006 callee displace `this' to insert it in the regular argument
11008 return
(non_static_context
&& to_return
);
11011 /* Patch an invoke expression METHOD and ARGS, based on its invocation
11015 patch_invoke
(tree patch
, tree method
, tree args
)
11018 tree original_call
, t
, ta
;
11019 tree check
= NULL_TREE
;
11021 /* Last step for args: convert build-in types. If we're dealing with
11022 a new TYPE() type call, the first argument to the constructor
11023 isn't found in the incoming argument list, but delivered by
11025 t
= TYPE_ARG_TYPES
(TREE_TYPE
(method
));
11026 if
(TREE_CODE
(patch
) == NEW_CLASS_EXPR
)
11027 t
= TREE_CHAIN
(t
);
11028 for
(ta
= args
; t
!= end_params_node
&& ta
;
11029 t
= TREE_CHAIN
(t
), ta
= TREE_CHAIN
(ta
))
11030 if
(JPRIMITIVE_TYPE_P
(TREE_TYPE
(TREE_VALUE
(ta
))) &&
11031 TREE_TYPE
(TREE_VALUE
(ta
)) != TREE_VALUE
(t
))
11032 TREE_VALUE
(ta
) = convert
(TREE_VALUE
(t
), TREE_VALUE
(ta
));
11034 /* Resolve unresolved returned type issues */
11035 t
= TREE_TYPE
(TREE_TYPE
(method
));
11036 if
(TREE_CODE
(t
) == POINTER_TYPE
&& !CLASS_LOADED_P
(TREE_TYPE
(t
)))
11037 resolve_and_layout
(TREE_TYPE
(t
), NULL
);
11039 if
(flag_emit_class_files
)
11043 switch
(invocation_mode
(method
, CALL_USING_SUPER
(patch
)))
11045 case INVOKE_VIRTUAL
:
11047 tree signature
= build_java_signature
(TREE_TYPE
(method
));
11049 maybe_rewrite_invocation
(&method
, &args
, &signature
, &special
);
11051 dtable
= invoke_build_dtable
(0, args
);
11052 func
= build_invokevirtual
(dtable
, method
, special
);
11056 case INVOKE_NONVIRTUAL
:
11057 /* If the object for the method call is null, we throw an
11058 exception. We don't do this if the object is the current
11059 method's `this'. In other cases we just rely on an
11060 optimization pass to eliminate redundant checks. */
11061 if
(TREE_VALUE
(args
) != current_this
)
11063 /* We use a save_expr here to make sure we only evaluate
11064 the new `self' expression once. */
11065 tree save_arg
= save_expr
(TREE_VALUE
(args
));
11066 TREE_VALUE
(args
) = save_arg
;
11067 check
= java_check_reference
(save_arg
, 1);
11069 /* Fall through. */
11072 case INVOKE_STATIC
:
11074 tree signature
= build_java_signature
(TREE_TYPE
(method
));
11076 maybe_rewrite_invocation
(&method
, &args
, &signature
, &special
);
11077 func
= build_known_method_ref
(method
, TREE_TYPE
(method
),
11078 DECL_CONTEXT
(method
),
11079 signature
, args
, special
);
11083 case INVOKE_INTERFACE
:
11084 dtable
= invoke_build_dtable
(1, args
);
11085 func
= build_invokeinterface
(dtable
, method
);
11092 /* Ensure self_type is initialized, (invokestatic). FIXME */
11093 func
= build1
(NOP_EXPR
, build_pointer_type
(TREE_TYPE
(method
)), func
);
11096 TREE_TYPE
(patch
) = TREE_TYPE
(TREE_TYPE
(method
));
11097 TREE_OPERAND
(patch
, 0) = func
;
11098 TREE_OPERAND
(patch
, 1) = args
;
11099 patch
= check_for_builtin
(method
, patch
);
11100 original_call
= patch
;
11102 /* We're processing a `new TYPE ()' form. New is called and its
11103 returned value is the first argument to the constructor. We build
11104 a COMPOUND_EXPR and use saved expression so that the overall NEW
11105 expression value is a pointer to a newly created and initialized
11107 if
(TREE_CODE
(original_call
) == NEW_CLASS_EXPR
)
11109 tree class
= DECL_CONTEXT
(method
);
11110 tree c1
, saved_new
, new
;
11113 if
(flag_emit_class_files
)
11115 TREE_TYPE
(patch
) = build_pointer_type
(class
);
11118 if
(!TYPE_SIZE
(class
))
11119 safe_layout_class
(class
);
11121 (class_has_finalize_method
(class
) ? alloc_object_node
11122 : alloc_no_finalizer_node
);
11123 new
= build3
(CALL_EXPR
, promote_type
(class
),
11124 build_address_of
(alloc_node
),
11125 build_tree_list
(NULL_TREE
, build_class_ref
(class
)),
11127 saved_new
= save_expr
(new
);
11128 c1
= build_tree_list
(NULL_TREE
, saved_new
);
11129 TREE_CHAIN
(c1
) = TREE_OPERAND
(original_call
, 1);
11130 TREE_OPERAND
(original_call
, 1) = c1
;
11131 TREE_SET_CODE
(original_call
, CALL_EXPR
);
11132 patch
= build2
(COMPOUND_EXPR
, TREE_TYPE
(new
), patch
, saved_new
);
11135 /* If CHECK is set, then we are building a check to see if the object
11137 if
(check
!= NULL_TREE
)
11139 /* We have to call force_evaluation_order now because creating a
11140 COMPOUND_EXPR wraps the arg list in a way that makes it
11141 unrecognizable by force_evaluation_order later. Yuk. */
11142 patch
= build2
(COMPOUND_EXPR
, TREE_TYPE
(patch
), check
,
11143 force_evaluation_order
(patch
));
11144 TREE_SIDE_EFFECTS
(patch
) = 1;
11147 /* In order to be able to modify PATCH later, we SAVE_EXPR it and
11148 put it as the first expression of a COMPOUND_EXPR. The second
11149 expression being an empty statement to be later patched if
11150 necessary. We remember a TREE_LIST (the PURPOSE is the method,
11151 the VALUE is the compound) in a hashtable and return a
11152 COMPOUND_EXPR built so that the result of the evaluation of the
11153 original PATCH node is returned. */
11154 if
(STATIC_CLASS_INIT_OPT_P
()
11155 && current_function_decl
&& METHOD_STATIC
(method
))
11158 tree fndecl
= current_function_decl
;
11159 /* We have to call force_evaluation_order now because creating a
11160 COMPOUND_EXPR wraps the arg list in a way that makes it
11161 unrecognizable by force_evaluation_order later. Yuk. */
11162 tree save
= force_evaluation_order
(patch
);
11163 tree type
= TREE_TYPE
(patch
);
11165 patch
= build2
(COMPOUND_EXPR
, type
, save
, build_java_empty_stmt
());
11166 list
= tree_cons
(method
, patch
,
11167 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND
(fndecl
));
11169 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND
(fndecl
) = list
;
11171 patch
= build2
(COMPOUND_EXPR
, type
, patch
, save
);
11178 invocation_mode
(tree method
, int super
)
11180 int access
= get_access_flags_from_decl
(method
);
11183 return INVOKE_SUPER
;
11185 if
(access
& ACC_STATIC
)
11186 return INVOKE_STATIC
;
11188 /* We have to look for a constructor before we handle nonvirtual
11189 calls; otherwise the constructor will look nonvirtual. */
11190 if
(DECL_CONSTRUCTOR_P
(method
))
11191 return INVOKE_STATIC
;
11193 if
(access
& ACC_PRIVATE
)
11194 return INVOKE_NONVIRTUAL
;
11196 /* Binary compatibility: just because it's final today, that doesn't
11197 mean it'll be final tomorrow. */
11198 if
(! flag_indirect_dispatch
11199 || DECL_CONTEXT
(method
) == object_type_node
)
11201 if
(access
& ACC_FINAL
)
11202 return INVOKE_NONVIRTUAL
;
11204 if
(CLASS_FINAL
(TYPE_NAME
(DECL_CONTEXT
(method
))))
11205 return INVOKE_NONVIRTUAL
;
11208 if
(CLASS_INTERFACE
(TYPE_NAME
(DECL_CONTEXT
(method
))))
11209 return INVOKE_INTERFACE
;
11211 return INVOKE_VIRTUAL
;
11214 /* Retrieve a refined list of matching methods. It covers the step
11215 15.11.2 (Compile-Time Step 2) */
11218 lookup_method_invoke
(int lc
, tree cl
, tree class
, tree name
, tree arg_list
)
11220 tree atl
= end_params_node
; /* Arg Type List */
11221 tree method
, signature
, list
, node
;
11222 const char *candidates
; /* Used for error report */
11225 /* Fix the arguments */
11226 for
(node
= arg_list
; node
; node
= TREE_CHAIN
(node
))
11228 tree current_arg
= TREE_TYPE
(TREE_VALUE
(node
));
11229 /* Non primitive type may have to be resolved */
11230 if
(!JPRIMITIVE_TYPE_P
(current_arg
))
11231 resolve_and_layout
(current_arg
, NULL_TREE
);
11233 if
(TREE_CODE
(current_arg
) == RECORD_TYPE
)
11234 current_arg
= promote_type
(current_arg
);
11235 /* If we're building an anonymous constructor call, and one of
11236 the arguments has array type, cast it to a size-less array
11237 type. This prevents us from getting a strange gcj-specific
11238 "sized array" signature in the constructor's signature. */
11239 if
(lc
&& ANONYMOUS_CLASS_P
(class
)
11240 && TREE_CODE
(current_arg
) == POINTER_TYPE
11241 && TYPE_ARRAY_P
(TREE_TYPE
(current_arg
)))
11243 tree elt
= TYPE_ARRAY_ELEMENT
(TREE_TYPE
(current_arg
));
11244 current_arg
= build_pointer_type
(build_java_array_type
(elt
, -1));
11246 atl
= tree_cons
(NULL_TREE
, current_arg
, atl
);
11249 /* Presto. If we're dealing with an anonymous class and a
11250 constructor call, generate the right constructor now, since we
11251 know the arguments' types. */
11253 if
(lc
&& ANONYMOUS_CLASS_P
(class
))
11255 tree mdecl
= craft_constructor
(TYPE_NAME
(class
), atl
);
11256 /* The anonymous class may have already been laid out, so make sure
11257 the new constructor is laid out here. */
11258 layout_class_method
(class
, CLASSTYPE_SUPER
(class
), mdecl
, NULL_TREE
);
11261 /* Find all candidates and then refine the list, searching for the
11262 most specific method. */
11263 list
= find_applicable_accessible_methods_list
(lc
, class
, name
, atl
);
11264 list
= find_most_specific_methods_list
(list
, class
);
11265 if
(list
&& !TREE_CHAIN
(list
))
11266 return TREE_VALUE
(list
);
11268 /* Issue an error. List candidates if any. Candidates are listed
11269 only if accessible (non accessible methods may end-up here for
11270 the sake of a better error report). */
11275 obstack_grow
(&temporary_obstack
, ". Candidates are:\n", 18);
11276 for
(current
= list
; current
; current
= TREE_CHAIN
(current
))
11278 tree cm
= TREE_VALUE
(current
);
11279 char string [4096];
11280 if
(!cm || not_accessible_p
(class
, cm
, NULL_TREE
, 0))
11283 (string, " '%s' in '%s'%s",
11284 get_printable_method_name
(cm
),
11285 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(DECL_CONTEXT
(cm
)))),
11286 (TREE_CHAIN
(current
) ?
"\n" : ""));
11287 obstack_grow
(&temporary_obstack
, string, strlen
(string));
11289 obstack_1grow
(&temporary_obstack
, '\0');
11290 candidates
= obstack_finish
(&temporary_obstack
);
11292 /* Issue the error message */
11293 method
= make_node
(FUNCTION_TYPE
);
11294 TYPE_ARG_TYPES
(method
) = atl
;
11295 signature
= build_java_argument_signature
(method
);
11296 dup
= xstrdup
(lang_printable_name
(class
, 0));
11297 parse_error_context
(cl
, "Can't find %s %<%s(%s)%> in type %qs%s",
11298 (lc ?
"constructor" : "method"),
11299 (lc ? dup
: IDENTIFIER_POINTER
(name
)),
11300 IDENTIFIER_POINTER
(signature
), dup
,
11301 (candidates ? candidates
: ""));
11306 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
11307 when we're looking for a constructor. */
11310 find_applicable_accessible_methods_list
(int lc
, tree class
, tree name
,
11313 static htab_t searched_classes
;
11314 static int search_not_done
= 0;
11315 tree list
= NULL_TREE
, all_list
= NULL_TREE
;
11319 /* Check the hash table to determine if this class has been searched
11321 if
(searched_classes
)
11323 if
(htab_find
(searched_classes
, class
) != NULL
)
11328 searched_classes
= htab_create
(10, htab_hash_pointer
,
11329 htab_eq_pointer
, NULL
);
11333 *htab_find_slot
(searched_classes
, class
, INSERT
) = class
;
11335 if
(!CLASS_LOADED_P
(class
))
11337 load_class
(class
, 1);
11338 safe_layout_class
(class
);
11341 /* Search interfaces */
11342 if
(TREE_CODE
(TYPE_NAME
(class
)) == TYPE_DECL
11343 && CLASS_INTERFACE
(TYPE_NAME
(class
)))
11345 search_applicable_methods_list
(lc
, TYPE_METHODS
(class
),
11346 name
, arglist
, &list
, &all_list
);
11347 for
(i
= 1; BINFO_BASE_ITERATE
(TYPE_BINFO
(class
), i
, base_binfo
); i
++)
11349 tree t
= BINFO_TYPE
(base_binfo
);
11352 rlist
= find_applicable_accessible_methods_list
(lc
, t
, name
,
11354 list
= chainon
(rlist
, list
);
11357 /* Search classes */
11360 search_applicable_methods_list
(lc
, TYPE_METHODS
(class
),
11361 name
, arglist
, &list
, &all_list
);
11363 /* When looking finit$, class$ or instinit$, we turn LC to 1 so
11364 that we only search in class. Note that we should have found
11365 something at this point. */
11366 if
(ID_FINIT_P
(name
) || ID_CLASSDOLLAR_P
(name
) || ID_INSTINIT_P
(name
))
11373 /* We must search all interfaces of this class */
11377 BINFO_BASE_ITERATE
(TYPE_BINFO
(class
), i
, base_binfo
); i
++)
11379 tree t
= BINFO_TYPE
(base_binfo
);
11380 if
(t
!= object_type_node
)
11383 = find_applicable_accessible_methods_list
(lc
, t
,
11385 list
= chainon
(rlist
, list
);
11390 /* Search superclass */
11391 if
(!lc
&& CLASSTYPE_SUPER
(class
) != NULL_TREE
)
11394 class
= CLASSTYPE_SUPER
(class
);
11395 rlist
= find_applicable_accessible_methods_list
(lc
, class
,
11397 list
= chainon
(rlist
, list
);
11403 /* We're done. Reset the searched classes list and finally search
11404 java.lang.Object if it wasn't searched already. */
11405 if
(!search_not_done
)
11408 && TYPE_METHODS
(object_type_node
)
11409 && htab_find
(searched_classes
, object_type_node
) == NULL
)
11411 search_applicable_methods_list
(lc
,
11412 TYPE_METHODS
(object_type_node
),
11413 name
, arglist
, &list
, &all_list
);
11415 htab_delete
(searched_classes
);
11416 searched_classes
= NULL
;
11419 /* Either return the list obtained or all selected (but
11420 inaccessible) methods for better error report. */
11421 return
(!list ? all_list
: list
);
11424 /* Effectively search for the appropriate method in method */
11427 search_applicable_methods_list
(int lc
, tree method
, tree name
, tree arglist
,
11428 tree
*list
, tree
*all_list
)
11430 for
(; method
; method
= TREE_CHAIN
(method
))
11432 /* When dealing with constructor, stop here, otherwise search
11434 if
(lc
&& !DECL_CONSTRUCTOR_P
(method
))
11436 else if
(!lc
&& (DECL_CONSTRUCTOR_P
(method
)
11437 ||
(DECL_NAME
(method
) != name
)))
11440 if
(argument_types_convertible
(method
, arglist
))
11442 /* Retain accessible methods only */
11443 if
(!not_accessible_p
(DECL_CONTEXT
(current_function_decl
),
11444 method
, NULL_TREE
, 0))
11445 *list
= tree_cons
(NULL_TREE
, method
, *list
);
11447 /* Also retain all selected method here */
11448 *all_list
= tree_cons
(NULL_TREE
, method
, *list
);
11453 /* 15.11.2.2 Choose the Most Specific Method */
11456 find_most_specific_methods_list
(tree list
, tree class
)
11459 int abstract
, candidates
;
11460 tree current
, new_list
= NULL_TREE
;
11461 for
(current
= list
; current
; current
= TREE_CHAIN
(current
))
11464 DECL_SPECIFIC_COUNT
(TREE_VALUE
(current
)) = 0;
11466 for
(method
= list
; method
; method
= TREE_CHAIN
(method
))
11468 tree method_v
, current_v
;
11469 /* Don't test a method against itself */
11470 if
(method
== current
)
11473 method_v
= TREE_VALUE
(method
);
11474 current_v
= TREE_VALUE
(current
);
11476 /* Compare arguments and location where methods where declared */
11477 if
(argument_types_convertible
(method_v
, current_v
))
11479 /* We have a rather odd special case here. The front
11480 end doesn't properly implement inheritance, so we
11481 work around it here. The idea is, if we are
11482 comparing a method declared in a class to one
11483 declared in an interface, and the invocation's
11484 qualifying class is a class (and not an interface),
11485 then we consider the method's class to be the
11486 qualifying class of the invocation. This lets us
11487 fake the result of ordinary inheritance. */
11488 tree context_v
= DECL_CONTEXT
(current_v
);
11489 if
(TYPE_INTERFACE_P
(DECL_CONTEXT
(method_v
))
11490 && ! TYPE_INTERFACE_P
(context_v
)
11491 && ! TYPE_INTERFACE_P
(class
))
11494 if
(valid_method_invocation_conversion_p
11495 (DECL_CONTEXT
(method_v
), context_v
))
11497 int v
= (DECL_SPECIFIC_COUNT
(current_v
) += 1);
11498 max
= (v
> max ? v
: max
);
11504 /* Review the list and select the maximally specific methods */
11505 for
(current
= list
, abstract
= -1, candidates
= -1;
11506 current
; current
= TREE_CHAIN
(current
))
11507 if
(DECL_SPECIFIC_COUNT
(TREE_VALUE
(current
)) == max
)
11509 new_list
= tree_cons
(NULL_TREE
, TREE_VALUE
(current
), new_list
);
11510 abstract
+= (METHOD_ABSTRACT
(TREE_VALUE
(current
)) ?
1 : 0);
11514 /* If we have several and they're all abstract, just pick the
11516 if
(candidates
> 0 && candidates
== abstract
)
11518 /* FIXME: merge the throws clauses. There is no convenient way
11519 to do this in gcj right now, since ideally we'd like to
11520 introduce a new METHOD_DECL here, but that is really not
11522 new_list
= nreverse
(new_list
);
11523 TREE_CHAIN
(new_list
) = NULL_TREE
;
11527 /* We have several (we couldn't find a most specific), all but one
11528 are abstract, we pick the only non abstract one. */
11529 if
(candidates
> 0 && (candidates
== abstract
+1))
11531 for
(current
= new_list
; current
; current
= TREE_CHAIN
(current
))
11532 if
(!METHOD_ABSTRACT
(TREE_VALUE
(current
)))
11534 TREE_CHAIN
(current
) = NULL_TREE
;
11535 new_list
= current
;
11539 /* If we can't find one, lower expectations and try to gather multiple
11540 maximally specific methods */
11541 while
(!new_list
&& max
)
11545 if
(DECL_SPECIFIC_COUNT
(TREE_VALUE
(current
)) == max
)
11546 new_list
= tree_cons
(NULL_TREE
, TREE_VALUE
(current
), new_list
);
11553 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
11554 converted by method invocation conversion (5.3) to the type of the
11555 corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
11556 to change less often than M1. */
11558 static GTY
(()) tree m2_arg_value
;
11559 static GTY
(()) tree m2_arg_cache
;
11562 argument_types_convertible
(tree m1
, tree m2_or_arglist
)
11564 tree m1_arg
, m2_arg
;
11566 SKIP_THIS_AND_ARTIFICIAL_PARMS
(m1_arg
, m1
)
11568 if
(m2_arg_value
== m2_or_arglist
)
11569 m2_arg
= m2_arg_cache
;
11572 /* M2_OR_ARGLIST can be a function DECL or a raw list of
11574 if
(m2_or_arglist
&& TREE_CODE
(m2_or_arglist
) == FUNCTION_DECL
)
11576 m2_arg
= TYPE_ARG_TYPES
(TREE_TYPE
(m2_or_arglist
));
11577 if
(!METHOD_STATIC
(m2_or_arglist
))
11578 m2_arg
= TREE_CHAIN
(m2_arg
);
11581 m2_arg
= m2_or_arglist
;
11583 m2_arg_value
= m2_or_arglist
;
11584 m2_arg_cache
= m2_arg
;
11587 while
(m1_arg
!= end_params_node
&& m2_arg
!= end_params_node
)
11589 resolve_and_layout
(TREE_VALUE
(m1_arg
), NULL_TREE
);
11590 if
(!valid_method_invocation_conversion_p
(TREE_VALUE
(m1_arg
),
11591 TREE_VALUE
(m2_arg
)))
11593 m1_arg
= TREE_CHAIN
(m1_arg
);
11594 m2_arg
= TREE_CHAIN
(m2_arg
);
11596 return m1_arg
== end_params_node
&& m2_arg
== end_params_node
;
11599 /* Qualification routines */
11601 /* Given a name x.y.z, look up x locally. If it's found, save the
11602 decl. If it's not found, mark the name as RESOLVE_PACKAGE_NAME_P,
11603 so that we later try and load the appropriate classes. */
11605 qualify_ambiguous_name
(tree id
)
11609 /* We inspect the first item of the qualification list. As a sanity
11610 check, make sure that it is an identfier node. */
11611 tree qual
= EXPR_WFL_QUALIFICATION
(id
);
11612 tree qual_wfl
= QUAL_WFL
(qual
);
11614 if
(TREE_CODE
(qual_wfl
) != EXPR_WITH_FILE_LOCATION
)
11617 name
= EXPR_WFL_NODE
(qual_wfl
);
11619 /* If we don't have an identifier, or we have a 'this' or 'super',
11620 then field access processing is all we need : there is nothing
11622 if
(!name || TREE_CODE
(name
) != IDENTIFIER_NODE ||
11623 name
== this_identifier_node ||
11624 name
== super_identifier_node
)
11627 /* If name appears within the scope of a local variable declaration
11628 or parameter declaration, or is a field within an enclosing
11629 class, then it is an expression name. Save the decl and let
11630 resolve_field_access do it's work. */
11631 if
((decl
= IDENTIFIER_LOCAL_VALUE
(name
)) ||
11632 (decl
= lookup_field_wrapper
(current_class
, name
)))
11634 QUAL_RESOLUTION
(qual
) = decl
;
11638 /* If name is a known class name (either declared or imported), mark
11639 us as a type name. */
11640 if
((decl
= resolve_and_layout
(name
, NULL_TREE
)))
11642 RESOLVE_TYPE_NAME_P
(qual_wfl
) = 1;
11643 QUAL_RESOLUTION
(qual
) = decl
;
11646 /* Check here that NAME isn't declared by more than one
11647 type-import-on-demand declaration of the compilation unit
11648 containing NAME. FIXME */
11650 /* We couldn't find a declaration for the name. Assume for now that
11651 we have a qualified class name that needs to be loaded from an
11652 external class file. */
11654 RESOLVE_PACKAGE_NAME_P
(qual_wfl
) = 1;
11656 /* Propagate the qualification across other components of the
11658 for
(qual
= TREE_CHAIN
(qual
); qual
;
11659 qual_wfl
= QUAL_WFL
(qual
), qual
= TREE_CHAIN
(qual
))
11661 if
(RESOLVE_PACKAGE_NAME_P
(qual_wfl
))
11662 RESOLVE_PACKAGE_NAME_P
(QUAL_WFL
(qual
)) = 1;
11665 /* Store the global qualification for the ambiguous part of ID back
11667 if
(RESOLVE_TYPE_NAME_P
(qual_wfl
))
11668 RESOLVE_TYPE_NAME_P
(id
) = 1;
11669 else if
(RESOLVE_PACKAGE_NAME_P
(qual_wfl
))
11670 RESOLVE_PACKAGE_NAME_P
(id
) = 1;
11673 /* Patch tree nodes in a function body. When a BLOCK is found, push
11674 local variable decls if present.
11675 Same as java_complete_lhs, but does resolve static finals to values. */
11678 java_complete_tree
(tree node
)
11680 node
= java_complete_lhs
(node
);
11681 if
(JDECL_P
(node
) && CLASS_FINAL_VARIABLE_P
(node
)
11682 && DECL_INITIAL
(node
) != NULL_TREE
)
11684 tree value
= fold_constant_for_init
(node
, node
);
11685 if
(value
!= NULL_TREE
)
11692 java_stabilize_reference
(tree node
)
11694 if
(TREE_CODE
(node
) == COMPOUND_EXPR
)
11696 tree op0
= TREE_OPERAND
(node
, 0);
11697 tree op1
= TREE_OPERAND
(node
, 1);
11698 TREE_OPERAND
(node
, 0) = save_expr
(op0
);
11699 TREE_OPERAND
(node
, 1) = java_stabilize_reference
(op1
);
11702 return stabilize_reference
(node
);
11705 /* Patch tree nodes in a function body. When a BLOCK is found, push
11706 local variable decls if present.
11707 Same as java_complete_tree, but does not resolve static finals to values. */
11710 java_complete_lhs
(tree node
)
11712 tree nn
, cn
, wfl_op1
, wfl_op2
, wfl_op3
;
11715 /* CONVERT_EXPR always has its type set, even though it needs to be
11717 if
(TREE_TYPE
(node
) && TREE_CODE
(node
) != CONVERT_EXPR
)
11720 /* The switch block implements cases processing container nodes
11721 first. Contained nodes are always written back. Leaves come
11722 next and return a value. */
11723 switch
(TREE_CODE
(node
))
11727 /* 1- Block section.
11728 Set the local values on decl names so we can identify them
11729 faster when they're referenced. At that stage, identifiers
11730 are legal so we don't check for declaration errors. */
11731 for
(cn
= BLOCK_EXPR_DECLS
(node
); cn
; cn
= TREE_CHAIN
(cn
))
11733 DECL_CONTEXT
(cn
) = current_function_decl
;
11734 IDENTIFIER_LOCAL_VALUE
(DECL_NAME
(cn
)) = cn
;
11736 if
(BLOCK_EXPR_BODY
(node
) == NULL_TREE
)
11737 CAN_COMPLETE_NORMALLY
(node
) = 1;
11740 tree stmt
= BLOCK_EXPR_BODY
(node
);
11742 int error_seen
= 0;
11743 if
(TREE_CODE
(stmt
) == COMPOUND_EXPR
)
11745 /* Re-order from (((A; B); C); ...; Z) to
11746 (A; (B; (C ; (...; Z)))).
11747 This makes it easier to scan the statements left-to-right
11748 without using recursion (which might overflow the stack
11749 if the block has many statements. */
11752 tree left
= TREE_OPERAND
(stmt
, 0);
11753 if
(TREE_CODE
(left
) != COMPOUND_EXPR
)
11755 TREE_OPERAND
(stmt
, 0) = TREE_OPERAND
(left
, 1);
11756 TREE_OPERAND
(left
, 1) = stmt
;
11759 BLOCK_EXPR_BODY
(node
) = stmt
;
11762 /* Now do the actual complete, without deep recursion for
11764 ptr
= &BLOCK_EXPR_BODY
(node
);
11765 while
(TREE_CODE
(*ptr
) == COMPOUND_EXPR
11766 && !IS_EMPTY_STMT
(TREE_OPERAND
(*ptr
, 1)))
11768 tree cur
= java_complete_tree
(TREE_OPERAND
(*ptr
, 0));
11769 tree
*next
= &TREE_OPERAND
(*ptr
, 1);
11770 TREE_OPERAND
(*ptr
, 0) = cur
;
11771 if
(IS_EMPTY_STMT
(cur
))
11773 /* Optimization; makes it easier to detect empty bodies.
11774 Most useful for <clinit> with all-constant initializer. */
11778 if
(TREE_CODE
(cur
) == ERROR_MARK
)
11780 else if
(! CAN_COMPLETE_NORMALLY
(cur
))
11785 if
(TREE_CODE
(wfl_op2
) == BLOCK
)
11786 wfl_op2
= BLOCK_EXPR_BODY
(wfl_op2
);
11787 else if
(TREE_CODE
(wfl_op2
) == COMPOUND_EXPR
)
11788 wfl_op2
= TREE_OPERAND
(wfl_op2
, 0);
11792 if
(TREE_CODE
(wfl_op2
) != CASE_EXPR
11793 && TREE_CODE
(wfl_op2
) != DEFAULT_EXPR
)
11794 unreachable_stmt_error
(*ptr
);
11796 if
(TREE_TYPE
(*ptr
) == NULL_TREE
)
11797 TREE_TYPE
(*ptr
) = void_type_node
;
11800 *ptr
= java_complete_tree
(*ptr
);
11802 if
(TREE_CODE
(*ptr
) == ERROR_MARK || error_seen
> 0)
11803 return error_mark_node
;
11804 CAN_COMPLETE_NORMALLY
(node
) = CAN_COMPLETE_NORMALLY
(*ptr
);
11806 /* Turn local bindings to null */
11807 for
(cn
= BLOCK_EXPR_DECLS
(node
); cn
; cn
= TREE_CHAIN
(cn
))
11808 IDENTIFIER_LOCAL_VALUE
(DECL_NAME
(cn
)) = NULL_TREE
;
11810 TREE_TYPE
(node
) = void_type_node
;
11813 /* 2- They are expressions but ultimately deal with statements */
11816 wfl_op1
= TREE_OPERAND
(node
, 0);
11817 COMPLETE_CHECK_OP_0
(node
);
11818 /* 14.19 A throw statement cannot complete normally. */
11819 CAN_COMPLETE_NORMALLY
(node
) = 0;
11820 return patch_throw_statement
(node
, wfl_op1
);
11822 case SYNCHRONIZED_EXPR
:
11823 wfl_op1
= TREE_OPERAND
(node
, 0);
11824 return patch_synchronized_statement
(node
, wfl_op1
);
11827 return patch_try_statement
(node
);
11829 case TRY_FINALLY_EXPR
:
11830 COMPLETE_CHECK_OP_0
(node
);
11831 COMPLETE_CHECK_OP_1
(node
);
11832 if
(IS_EMPTY_STMT
(TREE_OPERAND
(node
, 0)))
11833 /* Reduce try/finally nodes with an empty try block. */
11834 return TREE_OPERAND
(node
, 1);
11835 if
(IS_EMPTY_STMT
(TREE_OPERAND
(node
, 1)))
11836 /* Likewise for an empty finally block. */
11837 return TREE_OPERAND
(node
, 0);
11838 CAN_COMPLETE_NORMALLY
(node
)
11839 = (CAN_COMPLETE_NORMALLY
(TREE_OPERAND
(node
, 0))
11840 && CAN_COMPLETE_NORMALLY
(TREE_OPERAND
(node
, 1)));
11841 TREE_TYPE
(node
) = TREE_TYPE
(TREE_OPERAND
(node
, 0));
11844 case LABELED_BLOCK_EXPR
:
11845 PUSH_LABELED_BLOCK
(node
);
11846 if
(LABELED_BLOCK_BODY
(node
))
11847 COMPLETE_CHECK_OP_1
(node
);
11848 TREE_TYPE
(node
) = void_type_node
;
11849 POP_LABELED_BLOCK
();
11851 if
(IS_EMPTY_STMT
(LABELED_BLOCK_BODY
(node
)))
11853 LABELED_BLOCK_BODY
(node
) = NULL_TREE
;
11854 CAN_COMPLETE_NORMALLY
(node
) = 1;
11856 else if
(CAN_COMPLETE_NORMALLY
(LABELED_BLOCK_BODY
(node
)))
11857 CAN_COMPLETE_NORMALLY
(node
) = 1;
11860 case EXIT_BLOCK_EXPR
:
11861 return patch_bc_statement
(node
);
11864 cn
= java_complete_tree
(TREE_OPERAND
(node
, 0));
11865 if
(cn
== error_mark_node
)
11868 /* First, the case expression must be constant. Values of final
11869 fields are accepted. */
11870 nn
= fold_constant_for_init
(cn
, NULL_TREE
);
11871 if
(nn
!= NULL_TREE
)
11875 if
((TREE_CODE
(cn
) == COMPOUND_EXPR
11876 || TREE_CODE
(cn
) == COMPONENT_REF
)
11877 && JDECL_P
(TREE_OPERAND
(cn
, 1))
11878 && FIELD_FINAL
(TREE_OPERAND
(cn
, 1))
11879 && DECL_INITIAL
(TREE_OPERAND
(cn
, 1)))
11881 cn
= fold_constant_for_init
(DECL_INITIAL
(TREE_OPERAND
(cn
, 1)),
11882 TREE_OPERAND
(cn
, 1));
11884 /* Accept final locals too. */
11885 else if
(TREE_CODE
(cn
) == VAR_DECL
&& DECL_FINAL
(cn
)
11886 && DECL_INITIAL
(cn
))
11887 cn
= fold_constant_for_init
(DECL_INITIAL
(cn
), cn
);
11889 if
(!TREE_CONSTANT
(cn
))
11891 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
11892 parse_error_context
(node
, "Constant expression required");
11893 return error_mark_node
;
11896 nn
= ctxp
->current_loop
;
11898 /* It must be assignable to the type of the switch expression. */
11899 if
(!try_builtin_assignconv
(NULL_TREE
,
11900 TREE_TYPE
(TREE_OPERAND
(nn
, 0)), cn
))
11902 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
11903 parse_error_context
11905 "Incompatible type for case. Can't convert %qs to %<int%>",
11906 lang_printable_name
(TREE_TYPE
(cn
), 0));
11907 return error_mark_node
;
11910 cn
= fold
(convert
(int_type_node
, cn
));
11911 TREE_CONSTANT_OVERFLOW
(cn
) = 0;
11912 CAN_COMPLETE_NORMALLY
(cn
) = 1;
11914 /* Save the label on a list so that we can later check for
11916 case_label_list
= tree_cons
(node
, cn
, case_label_list
);
11918 /* Multiple instance of a case label bearing the same value is
11919 checked later. The case expression is all right so far. */
11920 if
(TREE_CODE
(cn
) == VAR_DECL
)
11921 cn
= DECL_INITIAL
(cn
);
11922 TREE_OPERAND
(node
, 0) = cn
;
11923 TREE_TYPE
(node
) = void_type_node
;
11924 CAN_COMPLETE_NORMALLY
(node
) = 1;
11925 TREE_SIDE_EFFECTS
(node
) = 1;
11929 nn
= ctxp
->current_loop
;
11930 /* Only one default label is allowed per switch statement */
11931 if
(SWITCH_HAS_DEFAULT
(nn
))
11933 #ifdef USE_MAPPED_LOCATION
11934 SET_EXPR_LOCATION
(wfl_operator
, EXPR_LOCATION
(node
));
11936 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
11938 parse_error_context
(wfl_operator
,
11939 "Duplicate case label: %<default%>");
11940 return error_mark_node
;
11943 SWITCH_HAS_DEFAULT
(nn
) = 1;
11944 TREE_TYPE
(node
) = void_type_node
;
11945 TREE_SIDE_EFFECTS
(node
) = 1;
11946 CAN_COMPLETE_NORMALLY
(node
) = 1;
11952 /* Check whether the loop was enclosed in a labeled
11953 statement. If not, create one, insert the loop in it and
11955 nn
= patch_loop_statement
(node
);
11957 /* Anyways, walk the body of the loop */
11958 if
(TREE_CODE
(node
) == LOOP_EXPR
)
11959 TREE_OPERAND
(node
, 0) = java_complete_tree
(TREE_OPERAND
(node
, 0));
11960 /* Switch statement: walk the switch expression and the cases */
11962 node
= patch_switch_statement
(node
);
11964 if
(node
== error_mark_node || TREE_OPERAND
(node
, 0) == error_mark_node
)
11965 nn
= error_mark_node
;
11968 TREE_TYPE
(nn
) = TREE_TYPE
(node
) = void_type_node
;
11969 /* If we returned something different, that's because we
11970 inserted a label. Pop the label too. */
11973 if
(CAN_COMPLETE_NORMALLY
(node
))
11974 CAN_COMPLETE_NORMALLY
(nn
) = 1;
11975 POP_LABELED_BLOCK
();
11982 TREE_OPERAND
(node
, 0) = java_complete_tree
(TREE_OPERAND
(node
, 0));
11983 return patch_exit_expr
(node
);
11987 TREE_OPERAND
(node
, 0) = java_complete_tree
(TREE_OPERAND
(node
, 0));
11988 if
(TREE_OPERAND
(node
, 0) == error_mark_node
)
11989 return error_mark_node
;
11990 /* then-else branches */
11991 TREE_OPERAND
(node
, 1) = java_complete_tree
(TREE_OPERAND
(node
, 1));
11992 if
(TREE_OPERAND
(node
, 1) == error_mark_node
)
11993 return error_mark_node
;
11995 /* This is a special case due to build_assertion(). When
11996 assertions are disabled we build a COND_EXPR in which
11997 Operand 1 is the body of the assertion. If that happens to
11998 be a string concatenation we'll need to patch it here. */
11999 tree patched
= patch_string
(TREE_OPERAND
(node
, 1));
12001 TREE_OPERAND
(node
, 1) = patched
;
12003 TREE_OPERAND
(node
, 2) = java_complete_tree
(TREE_OPERAND
(node
, 2));
12004 if
(TREE_OPERAND
(node
, 2) == error_mark_node
)
12005 return error_mark_node
;
12006 return patch_if_else_statement
(node
);
12009 case CONDITIONAL_EXPR
:
12011 wfl_op1
= TREE_OPERAND
(node
, 0);
12012 COMPLETE_CHECK_OP_0
(node
);
12013 wfl_op2
= TREE_OPERAND
(node
, 1);
12014 COMPLETE_CHECK_OP_1
(node
);
12015 wfl_op3
= TREE_OPERAND
(node
, 2);
12016 COMPLETE_CHECK_OP_2
(node
);
12017 return patch_conditional_expr
(node
, wfl_op1
, wfl_op2
);
12019 /* 3- Expression section */
12020 case COMPOUND_EXPR
:
12021 wfl_op2
= TREE_OPERAND
(node
, 1);
12022 TREE_OPERAND
(node
, 0) = nn
=
12023 java_complete_tree
(TREE_OPERAND
(node
, 0));
12024 if
(IS_EMPTY_STMT
(wfl_op2
))
12025 CAN_COMPLETE_NORMALLY
(node
) = CAN_COMPLETE_NORMALLY
(nn
);
12028 if
(! CAN_COMPLETE_NORMALLY
(nn
) && TREE_CODE
(nn
) != ERROR_MARK
)
12030 /* An unreachable condition in a do-while statement
12031 is *not* (technically) an unreachable statement. */
12033 if
(TREE_CODE
(nn
) == EXPR_WITH_FILE_LOCATION
)
12034 nn
= EXPR_WFL_NODE
(nn
);
12035 /* NN can be NULL_TREE exactly when UPDATE is, in
12036 finish_for_loop. */
12037 if
(nn
!= NULL_TREE
&& TREE_CODE
(nn
) != EXIT_EXPR
)
12039 SET_WFL_OPERATOR
(wfl_operator
, node
, wfl_op2
);
12040 if
(SUPPRESS_UNREACHABLE_ERROR
(nn
))
12042 /* Perhaps this warning should have an
12043 associated flag. The code being compiled is
12044 pedantically correct, but useless. */
12045 parse_warning_context
(wfl_operator
,
12046 "Unreachable statement");
12049 parse_error_context
(wfl_operator
,
12050 "Unreachable statement");
12053 TREE_OPERAND
(node
, 1) = java_complete_tree
(TREE_OPERAND
(node
, 1));
12054 if
(TREE_OPERAND
(node
, 1) == error_mark_node
)
12055 return error_mark_node
;
12056 /* Even though we might allow the case where the first
12057 operand doesn't return normally, we still should compute
12058 CAN_COMPLETE_NORMALLY correctly. */
12059 CAN_COMPLETE_NORMALLY
(node
)
12060 = (CAN_COMPLETE_NORMALLY
(TREE_OPERAND
(node
, 0))
12061 && CAN_COMPLETE_NORMALLY
(TREE_OPERAND
(node
, 1)));
12063 TREE_TYPE
(node
) = TREE_TYPE
(TREE_OPERAND
(node
, 1));
12067 /* CAN_COMPLETE_NORMALLY (node) = 0; */
12068 return patch_return
(node
);
12070 case EXPR_WITH_FILE_LOCATION
:
12071 if
(!EXPR_WFL_NODE
(node
) /* Or a PRIMARY flag ? */
12072 || TREE_CODE
(EXPR_WFL_NODE
(node
)) == IDENTIFIER_NODE
)
12074 node
= resolve_expression_name
(node
, NULL
);
12075 if
(node
== error_mark_node
)
12077 CAN_COMPLETE_NORMALLY
(node
) = 1;
12082 location_t save_location
= input_location
;
12083 #ifdef USE_MAPPED_LOCATION
12084 input_location
= EXPR_LOCATION
(node
);
12085 if
(input_location
== UNKNOWN_LOCATION
)
12086 input_location
= save_location
;
12088 input_line
= EXPR_WFL_LINENO
(node
);
12090 body
= java_complete_tree
(EXPR_WFL_NODE
(node
));
12091 input_location
= save_location
;
12092 EXPR_WFL_NODE
(node
) = body
;
12093 TREE_SIDE_EFFECTS
(node
) = TREE_SIDE_EFFECTS
(body
);
12094 CAN_COMPLETE_NORMALLY
(node
) = CAN_COMPLETE_NORMALLY
(body
);
12095 if
(IS_EMPTY_STMT
(body
) || TREE_CONSTANT
(body
))
12097 /* Makes it easier to constant fold, detect empty bodies. */
12100 if
(body
== error_mark_node
)
12102 /* Its important for the evaluation of assignment that
12103 this mark on the TREE_TYPE is propagated. */
12104 TREE_TYPE
(node
) = error_mark_node
;
12105 return error_mark_node
;
12108 TREE_TYPE
(node
) = TREE_TYPE
(EXPR_WFL_NODE
(node
));
12113 case NEW_ARRAY_EXPR
:
12114 /* Patch all the dimensions */
12116 for
(cn
= TREE_OPERAND
(node
, 1); cn
; cn
= TREE_CHAIN
(cn
))
12118 int location
= EXPR_WFL_LINECOL
(TREE_VALUE
(cn
));
12119 tree dim
= convert
(int_type_node
,
12120 java_complete_tree
(TREE_VALUE
(cn
)));
12121 if
(dim
== error_mark_node
)
12128 TREE_VALUE
(cn
) = dim
;
12129 /* Setup the location of the current dimension, for
12130 later error report. */
12131 #ifdef USE_MAPPED_LOCATION
12132 TREE_PURPOSE
(cn
) = expr_add_location
(NULL_TREE
, location
, 0);
12134 TREE_PURPOSE
(cn
) =
12135 build_expr_wfl
(NULL_TREE
, input_filename
, 0, 0);
12136 EXPR_WFL_LINECOL
(TREE_PURPOSE
(cn
)) = location
;
12140 /* They complete the array creation expression, if no errors
12142 CAN_COMPLETE_NORMALLY
(node
) = 1;
12143 return
(flag ? error_mark_node
12144 : force_evaluation_order
(patch_newarray
(node
)));
12146 case NEW_ANONYMOUS_ARRAY_EXPR
:
12147 /* Create the array type if necessary. */
12148 if
(ANONYMOUS_ARRAY_DIMS_SIG
(node
))
12150 tree type
= ANONYMOUS_ARRAY_BASE_TYPE
(node
);
12151 if
(!(type
= resolve_type_during_patch
(type
)))
12152 return error_mark_node
;
12153 type
= build_array_from_name
(type
, NULL_TREE
,
12154 ANONYMOUS_ARRAY_DIMS_SIG
(node
), NULL
);
12155 ANONYMOUS_ARRAY_BASE_TYPE
(node
) = build_pointer_type
(type
);
12157 node
= patch_new_array_init
(ANONYMOUS_ARRAY_BASE_TYPE
(node
),
12158 ANONYMOUS_ARRAY_INITIALIZER
(node
));
12159 if
(node
== error_mark_node
)
12160 return error_mark_node
;
12161 CAN_COMPLETE_NORMALLY
(node
) = 1;
12164 case NEW_CLASS_EXPR
:
12166 /* Complete function's argument(s) first */
12167 if
(complete_function_arguments
(node
))
12168 return error_mark_node
;
12171 tree decl
, wfl
= TREE_OPERAND
(node
, 0);
12172 int in_this
= CALL_THIS_CONSTRUCTOR_P
(node
);
12173 int from_super
= (EXPR_WFL_NODE
(TREE_OPERAND
(node
, 0)) ==
12174 super_identifier_node
);
12176 #ifdef USE_MAPPED_LOCATION
12177 source_location location
= EXPR_LOCATION
(node
);
12179 int location
= EXPR_WFL_LINECOL
(node
);
12182 node
= patch_method_invocation
(node
, NULL_TREE
, NULL_TREE
,
12183 from_super
, 0, &decl
);
12184 if
(node
== error_mark_node
)
12185 return error_mark_node
;
12187 if
(TREE_CODE
(node
) == CALL_EXPR
12188 && TREE_OPERAND
(node
, 1) != NULL_TREE
)
12189 arguments
= TREE_VALUE
(TREE_OPERAND
(node
, 1));
12191 arguments
= NULL_TREE
;
12192 check_thrown_exceptions
(location
, decl
, arguments
);
12193 /* If we call this(...), register signature and positions */
12195 DECL_CONSTRUCTOR_CALLS
(current_function_decl
) =
12196 tree_cons
(wfl
, decl
,
12197 DECL_CONSTRUCTOR_CALLS
(current_function_decl
));
12198 CAN_COMPLETE_NORMALLY
(node
) = 1;
12199 return force_evaluation_order
(node
);
12203 /* Save potential wfls */
12204 wfl_op1
= TREE_OPERAND
(node
, 0);
12205 TREE_OPERAND
(node
, 0) = nn
= java_complete_lhs
(wfl_op1
);
12207 if
(MODIFY_EXPR_FROM_INITIALIZATION_P
(node
)
12208 && TREE_CODE
(nn
) == VAR_DECL
&& TREE_STATIC
(nn
)
12209 && DECL_INITIAL
(nn
) != NULL_TREE
)
12213 value
= fold_constant_for_init
(nn
, nn
);
12215 /* When we have a primitype type, or a string and we're not
12216 emitting a class file, we actually don't want to generate
12217 anything for the assignment. */
12218 if
(value
!= NULL_TREE
&&
12219 (JPRIMITIVE_TYPE_P
(TREE_TYPE
(value
)) ||
12220 (TREE_TYPE
(value
) == string_ptr_type_node
&&
12221 ! flag_emit_class_files
)))
12223 /* Prepare node for patch_assignment */
12224 TREE_OPERAND
(node
, 1) = value
;
12225 /* Call patch assignment to verify the assignment */
12226 if
(patch_assignment
(node
, wfl_op1
) == error_mark_node
)
12227 return error_mark_node
;
12228 /* Set DECL_INITIAL properly (a conversion might have
12229 been decided by patch_assignment) and return the
12230 empty statement. */
12233 tree patched
= patch_string
(TREE_OPERAND
(node
, 1));
12235 DECL_INITIAL
(nn
) = patched
;
12237 DECL_INITIAL
(nn
) = TREE_OPERAND
(node
, 1);
12238 DECL_FIELD_FINAL_IUD
(nn
) = 1;
12239 return build_java_empty_stmt
();
12242 if
(! flag_emit_class_files
)
12243 DECL_INITIAL
(nn
) = NULL_TREE
;
12245 wfl_op2
= TREE_OPERAND
(node
, 1);
12247 if
(TREE_OPERAND
(node
, 0) == error_mark_node
)
12248 return error_mark_node
;
12250 flag
= COMPOUND_ASSIGN_P
(wfl_op2
);
12253 /* This might break when accessing outer field from inner
12254 class. TESTME, FIXME */
12255 tree lvalue
= java_stabilize_reference
(TREE_OPERAND
(node
, 0));
12257 /* Hand stabilize the lhs on both places */
12258 TREE_OPERAND
(node
, 0) = lvalue
;
12259 TREE_OPERAND
(TREE_OPERAND
(node
, 1), 0) =
12260 (flag_emit_class_files ? lvalue
: save_expr
(lvalue
));
12262 /* 15.25.2.a: Left hand is not an array access. FIXME */
12263 /* Now complete the RHS. We write it back later on. */
12264 nn
= java_complete_tree
(TREE_OPERAND
(node
, 1));
12266 if
((cn
= patch_string
(nn
)))
12269 /* The last part of the rewrite for E1 op= E2 is to have
12270 E1 = (T)(E1 op E2), with T being the type of E1. */
12271 nn
= java_complete_tree
(build_cast
(EXPR_WFL_LINECOL
(wfl_op2
),
12272 TREE_TYPE
(lvalue
), nn
));
12274 /* If the assignment is compound and has reference type,
12275 then ensure the LHS has type String and nothing else. */
12276 if
(JREFERENCE_TYPE_P
(TREE_TYPE
(lvalue
))
12277 && ! JSTRING_TYPE_P
(TREE_TYPE
(lvalue
)))
12278 parse_error_context
(wfl_op2
,
12279 "Incompatible type for %<+=%>. Can't convert %qs to %<java.lang.String%>",
12280 lang_printable_name
(TREE_TYPE
(lvalue
), 0));
12282 /* 15.25.2.b: Left hand is an array access. FIXME */
12285 /* If we're about to patch a NEW_ARRAY_INIT, we call a special
12286 function to complete this RHS. Note that a NEW_ARRAY_INIT
12287 might have been already fully expanded if created as a result
12288 of processing an anonymous array initializer. We avoid doing
12289 the operation twice by testing whether the node already bears
12291 else if
(TREE_CODE
(wfl_op2
) == NEW_ARRAY_INIT
&& !TREE_TYPE
(wfl_op2
))
12292 nn
= patch_new_array_init
(TREE_TYPE
(TREE_OPERAND
(node
, 0)),
12293 TREE_OPERAND
(node
, 1));
12294 /* Otherwise we simply complete the RHS */
12296 nn
= java_complete_tree
(TREE_OPERAND
(node
, 1));
12298 if
(nn
== error_mark_node
)
12299 return error_mark_node
;
12301 /* Write back the RHS as we evaluated it. */
12302 TREE_OPERAND
(node
, 1) = nn
;
12304 /* In case we're handling = with a String as a RHS, we need to
12305 produce a String out of the RHS (it might still be a
12306 STRING_CST or a StringBuffer at this stage */
12307 if
((nn
= patch_string
(TREE_OPERAND
(node
, 1))))
12308 TREE_OPERAND
(node
, 1) = nn
;
12310 if
((nn
= nested_field_access_fix
(wfl_op1
, TREE_OPERAND
(node
, 0),
12311 TREE_OPERAND
(node
, 1))))
12313 /* We return error_mark_node if nested_field_access_fix
12314 detects we write into a final. */
12315 if
(nn
== error_mark_node
)
12316 return error_mark_node
;
12321 node
= patch_assignment
(node
, wfl_op1
);
12322 if
(node
== error_mark_node
)
12323 return error_mark_node
;
12324 /* Reorganize the tree if necessary. */
12325 if
(flag
&& (!JREFERENCE_TYPE_P
(TREE_TYPE
(node
))
12326 || JSTRING_P
(TREE_TYPE
(node
))))
12327 node
= java_refold
(node
);
12330 /* Seek to set DECL_INITIAL to a proper value, since it might have
12331 undergone a conversion in patch_assignment. We do that only when
12332 it's necessary to have DECL_INITIAL properly set. */
12333 nn
= TREE_OPERAND
(node
, 0);
12334 if
(TREE_CODE
(nn
) == VAR_DECL
12335 && DECL_INITIAL
(nn
) && CONSTANT_VALUE_P
(DECL_INITIAL
(nn
))
12336 && FIELD_STATIC
(nn
) && FIELD_FINAL
(nn
)
12337 && (JPRIMITIVE_TYPE_P
(TREE_TYPE
(nn
))
12338 || TREE_TYPE
(nn
) == string_ptr_type_node
))
12339 DECL_INITIAL
(nn
) = TREE_OPERAND
(node
, 1);
12341 CAN_COMPLETE_NORMALLY
(node
) = 1;
12353 case TRUNC_MOD_EXPR
:
12354 case TRUNC_DIV_EXPR
:
12356 case TRUTH_ANDIF_EXPR
:
12357 case TRUTH_ORIF_EXPR
:
12364 /* Operands 0 and 1 are WFL in certain cases only. patch_binop
12365 knows how to handle those cases. */
12366 wfl_op1
= TREE_OPERAND
(node
, 0);
12367 wfl_op2
= TREE_OPERAND
(node
, 1);
12369 CAN_COMPLETE_NORMALLY
(node
) = 1;
12370 /* Don't complete string nodes if dealing with the PLUS operand. */
12371 if
(TREE_CODE
(node
) != PLUS_EXPR ||
!JSTRING_P
(wfl_op1
))
12373 nn
= java_complete_tree
(wfl_op1
);
12374 if
(nn
== error_mark_node
)
12375 return error_mark_node
;
12377 TREE_OPERAND
(node
, 0) = nn
;
12379 if
(TREE_CODE
(node
) != PLUS_EXPR ||
!JSTRING_P
(wfl_op2
))
12381 nn
= java_complete_tree
(wfl_op2
);
12382 if
(nn
== error_mark_node
)
12383 return error_mark_node
;
12385 TREE_OPERAND
(node
, 1) = nn
;
12387 return patch_binop
(node
, wfl_op1
, wfl_op2
, 0);
12389 case INSTANCEOF_EXPR
:
12390 wfl_op1
= TREE_OPERAND
(node
, 0);
12391 COMPLETE_CHECK_OP_0
(node
);
12392 return patch_binop
(node
, wfl_op1
, TREE_OPERAND
(node
, 1), 0);
12394 case UNARY_PLUS_EXPR
:
12396 case TRUTH_NOT_EXPR
:
12398 case PREDECREMENT_EXPR
:
12399 case PREINCREMENT_EXPR
:
12400 case POSTDECREMENT_EXPR
:
12401 case POSTINCREMENT_EXPR
:
12403 /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
12404 how to handle those cases. */
12405 wfl_op1
= TREE_OPERAND
(node
, 0);
12406 CAN_COMPLETE_NORMALLY
(node
) = 1;
12407 if
(TREE_CODE
(node
) == PREDECREMENT_EXPR
12408 || TREE_CODE
(node
) == PREINCREMENT_EXPR
12409 || TREE_CODE
(node
) == POSTDECREMENT_EXPR
12410 || TREE_CODE
(node
) == POSTINCREMENT_EXPR
)
12411 { /* We don't want static finals to be resolved to their value
12412 to avoid ICEing later. It solves PR8923. */
12413 TREE_OPERAND
(node
, 0) = java_complete_lhs
(wfl_op1
);
12417 TREE_OPERAND
(node
, 0) = java_complete_tree
(wfl_op1
);
12419 if
(TREE_OPERAND
(node
, 0) == error_mark_node
)
12420 return error_mark_node
;
12421 node
= patch_unaryop
(node
, wfl_op1
);
12422 CAN_COMPLETE_NORMALLY
(node
) = 1;
12426 /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
12427 how to handle those cases. */
12428 wfl_op1
= TREE_OPERAND
(node
, 0);
12429 TREE_OPERAND
(node
, 0) = java_complete_tree
(wfl_op1
);
12430 if
(TREE_OPERAND
(node
, 0) == error_mark_node
)
12431 return error_mark_node
;
12432 if
(!flag_emit_class_files
)
12433 TREE_OPERAND
(node
, 0) = save_expr
(TREE_OPERAND
(node
, 0));
12434 /* The same applies to wfl_op2 */
12435 wfl_op2
= TREE_OPERAND
(node
, 1);
12436 TREE_OPERAND
(node
, 1) = java_complete_tree
(wfl_op2
);
12437 if
(TREE_OPERAND
(node
, 1) == error_mark_node
)
12438 return error_mark_node
;
12439 if
(!flag_emit_class_files
)
12440 TREE_OPERAND
(node
, 1) = save_expr
(TREE_OPERAND
(node
, 1));
12441 return patch_array_ref
(node
);
12446 case COMPONENT_REF
:
12447 /* The first step in the re-write of qualified name handling. FIXME.
12448 So far, this is only to support PRIMTYPE.class ->
12451 tree prim_class
= TREE_OPERAND
(node
, 0);
12452 tree name
= TREE_OPERAND
(node
, 1);
12455 gcc_assert
(TREE_CODE
(prim_class
) == NOP_EXPR
);
12456 prim_class
= java_complete_tree
(TREE_TYPE
(prim_class
));
12457 gcc_assert
(TREE_CODE
(prim_class
) == RECORD_TYPE
);
12458 field
= lookup_field_wrapper
(prim_class
, name
);
12460 if
(field
== NULL_TREE
)
12462 error ("missing static field %qs", IDENTIFIER_POINTER
(name
));
12463 return error_mark_node
;
12465 if
(! FIELD_STATIC
(field
))
12467 error ("not a static field %qs", IDENTIFIER_POINTER
(name
));
12468 return error_mark_node
;
12475 /* Can't use THIS in a static environment */
12478 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
12479 parse_error_context
(wfl_operator
,
12480 "Keyword %<this%> used outside allowed context");
12481 TREE_TYPE
(node
) = error_mark_node
;
12482 return error_mark_node
;
12484 if
(ctxp
->explicit_constructor_p
)
12486 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
12487 parse_error_context
12488 (wfl_operator
, "Can't reference %<this%> or %<super%> before the superclass constructor has been called");
12489 TREE_TYPE
(node
) = error_mark_node
;
12490 return error_mark_node
;
12492 return current_this
;
12494 case CLASS_LITERAL
:
12495 CAN_COMPLETE_NORMALLY
(node
) = 1;
12496 node
= patch_incomplete_class_ref
(node
);
12497 if
(node
== error_mark_node
)
12498 return error_mark_node
;
12502 CAN_COMPLETE_NORMALLY
(node
) = 1;
12503 /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
12504 and it's time to turn it into the appropriate String object */
12505 if
((nn
= patch_string
(node
)))
12508 internal_error
("No case for %s", tree_code_name
[TREE_CODE
(node
)]);
12513 /* Complete function call's argument. Return a nonzero value is an
12514 error was found. */
12517 complete_function_arguments
(tree node
)
12522 ctxp
->explicit_constructor_p
+= (CALL_EXPLICIT_CONSTRUCTOR_P
(node
) ?
1 : 0);
12523 for
(cn
= TREE_OPERAND
(node
, 1); cn
; cn
= TREE_CHAIN
(cn
))
12525 tree wfl
= TREE_VALUE
(cn
), parm
, temp
;
12526 parm
= java_complete_tree
(wfl
);
12528 if
(parm
== error_mark_node
)
12533 /* If we have a string literal that we haven't transformed yet or a
12534 crafted string buffer, as a result of the use of the String
12535 `+' operator. Build `parm.toString()' and expand it. */
12536 if
((temp
= patch_string
(parm
)))
12539 TREE_VALUE
(cn
) = parm
;
12541 ctxp
->explicit_constructor_p
-= (CALL_EXPLICIT_CONSTRUCTOR_P
(node
) ?
1 : 0);
12545 /* Sometimes (for loops and variable initialized during their
12546 declaration), we want to wrap a statement around a WFL and turn it
12550 build_debugable_stmt
(int location
, tree stmt
)
12552 if
(TREE_CODE
(stmt
) != EXPR_WITH_FILE_LOCATION
)
12554 #ifdef USE_MAPPED_LOCATION
12555 stmt
= expr_add_location
(stmt
, location
, 1);
12557 stmt
= build_expr_wfl
(stmt
, input_filename
, 0, 0);
12558 EXPR_WFL_LINECOL
(stmt
) = location
;
12559 JAVA_MAYBE_GENERATE_DEBUG_INFO
(stmt
);
12566 build_expr_block
(tree body
, tree decls
)
12568 tree node
= make_node
(BLOCK
);
12569 BLOCK_EXPR_DECLS
(node
) = decls
;
12570 BLOCK_EXPR_BODY
(node
) = body
;
12572 TREE_TYPE
(node
) = TREE_TYPE
(body
);
12573 TREE_SIDE_EFFECTS
(node
) = 1;
12577 /* Create a new function block and link it appropriately to current
12578 function block chain */
12583 tree b
= build_expr_block
(NULL_TREE
, NULL_TREE
);
12585 /* Link block B supercontext to the previous block. The current
12586 function DECL is used as supercontext when enter_a_block is called
12587 for the first time for a given function. The current function body
12588 (DECL_FUNCTION_BODY) is set to be block B. */
12590 tree fndecl
= current_function_decl
;
12593 BLOCK_SUPERCONTEXT
(b
) = current_static_block
;
12594 current_static_block
= b
;
12597 else if
(!DECL_FUNCTION_BODY
(fndecl
))
12599 BLOCK_SUPERCONTEXT
(b
) = fndecl
;
12600 DECL_FUNCTION_BODY
(fndecl
) = b
;
12604 BLOCK_SUPERCONTEXT
(b
) = DECL_FUNCTION_BODY
(fndecl
);
12605 DECL_FUNCTION_BODY
(fndecl
) = b
;
12610 /* Exit a block by changing the current function body
12611 (DECL_FUNCTION_BODY) to the current block super context, only if
12612 the block being exited isn't the method's top level one. */
12618 if
(current_function_decl
)
12620 b
= DECL_FUNCTION_BODY
(current_function_decl
);
12621 if
(BLOCK_SUPERCONTEXT
(b
) != current_function_decl
)
12622 DECL_FUNCTION_BODY
(current_function_decl
) = BLOCK_SUPERCONTEXT
(b
);
12626 b
= current_static_block
;
12628 if
(BLOCK_SUPERCONTEXT
(b
))
12629 current_static_block
= BLOCK_SUPERCONTEXT
(b
);
12634 /* Lookup for NAME in the nested function's blocks, all the way up to
12635 the current toplevel one. It complies with Java's local variable
12639 lookup_name_in_blocks
(tree name
)
12641 tree b
= GET_CURRENT_BLOCK
(current_function_decl
);
12643 while
(b
!= current_function_decl
)
12647 /* Paranoid sanity check. To be removed */
12648 if
(TREE_CODE
(b
) != BLOCK
)
12651 for
(current
= BLOCK_EXPR_DECLS
(b
); current
;
12652 current
= TREE_CHAIN
(current
))
12653 if
(DECL_NAME
(current
) == name
)
12655 b
= BLOCK_SUPERCONTEXT
(b
);
12661 maybe_absorb_scoping_blocks
(void)
12663 while
(BLOCK_IS_IMPLICIT
(GET_CURRENT_BLOCK
(current_function_decl
)))
12665 tree b
= exit_block
();
12666 java_method_add_stmt
(current_function_decl
, b
);
12667 SOURCE_FRONTEND_DEBUG
(("Absorbing scoping block at line %d", input_line
));
12672 /* This section of the source is reserved to build_* functions that
12673 are building incomplete tree nodes and the patch_* functions that
12674 are completing them. */
12676 /* Wrap a non WFL node around a WFL. */
12679 build_wfl_wrap
(tree node
, int location
)
12681 tree wfl
, node_to_insert
= node
;
12683 /* We want to process THIS . xxx symbolically, to keep it consistent
12684 with the way we're processing SUPER. A THIS from a primary as a
12685 different form than a SUPER. Turn THIS into something symbolic */
12686 if
(TREE_CODE
(node
) == THIS_EXPR
)
12687 node_to_insert
= wfl
= build_wfl_node
(this_identifier_node
);
12689 #ifdef USE_MAPPED_LOCATION
12690 wfl
= build_unknown_wfl
(NULL_TREE
);
12692 SET_EXPR_LOCATION
(wfl
, location
);
12694 wfl
= build_expr_wfl
(NULL_TREE
, ctxp
->filename
, 0, 0);
12696 EXPR_WFL_LINECOL
(wfl
) = location
;
12698 EXPR_WFL_QUALIFICATION
(wfl
) = build_tree_list
(node_to_insert
, NULL_TREE
);
12702 /* Build a super() constructor invocation. Returns an empty statement if
12703 we're currently dealing with the class java.lang.Object. */
12706 build_super_invocation
(tree mdecl
)
12708 if
(DECL_CONTEXT
(mdecl
) == object_type_node
)
12709 return build_java_empty_stmt
();
12712 tree super_wfl
= build_wfl_node
(super_identifier_node
);
12713 tree a
= NULL_TREE
, t
;
12715 /* This is called after parsing is done, so the parser context
12716 won't be accurate. Set location info from current_class decl. */
12717 tree class_wfl
= lookup_cl
(TYPE_NAME
(current_class
));
12718 EXPR_WFL_LINECOL
(super_wfl
) = EXPR_WFL_LINECOL
(class_wfl
);
12720 /* If we're dealing with an anonymous class, pass the arguments
12721 of the crafted constructor along. */
12722 if
(ANONYMOUS_CLASS_P
(DECL_CONTEXT
(mdecl
)))
12724 SKIP_THIS_AND_ARTIFICIAL_PARMS
(t
, mdecl
);
12725 for
(; t
!= end_params_node
; t
= TREE_CHAIN
(t
))
12726 a
= tree_cons
(NULL_TREE
, build_wfl_node
(TREE_PURPOSE
(t
)), a
);
12728 return build_method_invocation
(super_wfl
, a
);
12732 /* Build a SUPER/THIS qualified method invocation. */
12735 build_this_super_qualified_invocation
(int use_this
, tree name
, tree args
,
12736 int lloc
, int rloc
)
12740 build_wfl_node
(use_this ? this_identifier_node
: super_identifier_node
);
12741 EXPR_WFL_LINECOL
(wfl
) = lloc
;
12742 invok
= build_method_invocation
(name
, args
);
12743 return make_qualified_primary
(wfl
, invok
, rloc
);
12746 /* Build an incomplete CALL_EXPR node. */
12749 build_method_invocation
(tree name
, tree args
)
12751 tree call
= build3
(CALL_EXPR
, NULL_TREE
, name
, args
, NULL_TREE
);
12752 TREE_SIDE_EFFECTS
(call
) = 1;
12753 EXPR_WFL_LINECOL
(call
) = EXPR_WFL_LINECOL
(name
);
12757 /* Build an incomplete new xxx(...) node. */
12760 build_new_invocation
(tree name
, tree args
)
12762 tree call
= build3
(NEW_CLASS_EXPR
, NULL_TREE
, name
, args
, NULL_TREE
);
12763 TREE_SIDE_EFFECTS
(call
) = 1;
12764 EXPR_WFL_LINECOL
(call
) = EXPR_WFL_LINECOL
(name
);
12768 /* Build an incomplete assignment expression. */
12771 build_assignment
(int op
, int op_location
, tree lhs
, tree rhs
)
12774 /* Build the corresponding binop if we deal with a Compound
12775 Assignment operator. Mark the binop sub-tree as part of a
12776 Compound Assignment expression */
12777 if
(op
!= ASSIGN_TK
)
12779 rhs
= build_binop
(BINOP_LOOKUP
(op
), op_location
, lhs
, rhs
);
12780 COMPOUND_ASSIGN_P
(rhs
) = 1;
12782 assignment
= build2
(MODIFY_EXPR
, NULL_TREE
, lhs
, rhs
);
12783 TREE_SIDE_EFFECTS
(assignment
) = 1;
12784 EXPR_WFL_LINECOL
(assignment
) = op_location
;
12788 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12789 the buffer. This is used only for string conversion. */
12791 string_convert_int_cst
(tree node
)
12793 /* Long.MIN_VALUE is -9223372036854775808, 20 characters. */
12794 static char buffer
[21];
12796 unsigned HOST_WIDE_INT lo
= TREE_INT_CST_LOW
(node
);
12797 unsigned HOST_WIDE_INT hi
= TREE_INT_CST_HIGH
(node
);
12798 char *p
= buffer
+ sizeof
(buffer
);
12801 unsigned HOST_WIDE_INT hibit
= (((unsigned HOST_WIDE_INT
) 1)
12802 << (HOST_BITS_PER_WIDE_INT
- 1));
12806 /* If negative, note the fact and negate the value. */
12816 /* Divide by 10 until there are no bits left. */
12819 unsigned HOST_WIDE_INT acc
= 0;
12820 unsigned HOST_WIDE_INT outhi
= 0, outlo
= 0;
12823 /* Use long division to compute the result and the remainder. */
12824 for
(i
= 0; i
< 2 * HOST_BITS_PER_WIDE_INT
; ++i
)
12826 /* Shift a bit into accumulator. */
12831 /* Shift the value. */
12837 /* Shift the correct bit into the result. */
12839 if
((outlo
& hibit
))
12849 /* '0' == 060 in Java, but might not be here (think EBCDIC). */
12850 *--p
= '\060' + acc
;
12858 *--p
= '\055'; /* '-' == 055 in Java, but might not be here. */
12863 /* Print an INTEGER_CST node in a static buffer, and return the
12864 buffer. This is used only for error handling. */
12866 print_int_node
(tree node
)
12868 static char buffer
[80];
12869 if
(TREE_CONSTANT_OVERFLOW
(node
))
12870 sprintf
(buffer
, "<overflow>");
12872 if
(TREE_INT_CST_HIGH
(node
) == 0)
12873 sprintf
(buffer
, HOST_WIDE_INT_PRINT_UNSIGNED
,
12874 TREE_INT_CST_LOW
(node
));
12875 else if
(TREE_INT_CST_HIGH
(node
) == -1
12876 && TREE_INT_CST_LOW
(node
) != 0)
12877 sprintf
(buffer
, "-" HOST_WIDE_INT_PRINT_UNSIGNED
,
12878 -TREE_INT_CST_LOW
(node
));
12880 sprintf
(buffer
, HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
12881 TREE_INT_CST_HIGH
(node
), TREE_INT_CST_LOW
(node
));
12887 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12890 /* 15.25 Assignment operators. */
12893 patch_assignment
(tree node
, tree wfl_op1
)
12895 tree rhs
= TREE_OPERAND
(node
, 1);
12896 tree lvalue
= TREE_OPERAND
(node
, 0), llvalue
;
12897 tree lhs_type
= NULL_TREE
, rhs_type
, new_rhs
= NULL_TREE
;
12898 int error_found
= 0;
12899 int lvalue_from_array
= 0;
12902 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
12904 /* Lhs can be a named variable */
12905 if
(JDECL_P
(lvalue
))
12907 lhs_type
= TREE_TYPE
(lvalue
);
12909 /* Or Lhs can be an array access. */
12910 else if
(TREE_CODE
(lvalue
) == ARRAY_REF
)
12912 lhs_type
= TREE_TYPE
(lvalue
);
12913 lvalue_from_array
= 1;
12915 /* Or a field access */
12916 else if
(TREE_CODE
(lvalue
) == COMPONENT_REF
)
12917 lhs_type
= TREE_TYPE
(lvalue
);
12918 /* Or a function return slot */
12919 else if
(TREE_CODE
(lvalue
) == RESULT_DECL
)
12921 /* If the return type is an integral type, then we create the
12922 RESULT_DECL with a promoted type, but we need to do these
12923 checks against the unpromoted type to ensure type safety. So
12924 here we look at the real type, not the type of the decl we
12926 lhs_type
= TREE_TYPE
(TREE_TYPE
(current_function_decl
));
12929 /* Otherwise, we might want to try to write into an optimized static
12930 final, this is an of a different nature, reported further on. */
12931 else if
(TREE_CODE
(wfl_op1
) == EXPR_WITH_FILE_LOCATION
12932 && resolve_expression_name
(wfl_op1
, &llvalue
))
12934 lhs_type
= TREE_TYPE
(lvalue
);
12938 parse_error_context
(wfl_op1
, "Invalid left hand side of assignment");
12942 rhs_type
= TREE_TYPE
(rhs
);
12944 /* 5.1 Try the assignment conversion for builtin type. */
12945 new_rhs
= try_builtin_assignconv
(wfl_op1
, lhs_type
, rhs
);
12947 /* 5.2 If it failed, try a reference conversion */
12949 new_rhs
= try_reference_assignconv
(lhs_type
, rhs
);
12951 /* 15.25.2 If we have a compound assignment, convert RHS into the
12953 else if
(COMPOUND_ASSIGN_P
(TREE_OPERAND
(node
, 1)))
12954 new_rhs
= convert
(lhs_type
, rhs
);
12956 /* Explicit cast required. This is an error */
12959 char *t1
= xstrdup
(lang_printable_name
(TREE_TYPE
(rhs
), 0));
12960 char *t2
= xstrdup
(lang_printable_name
(lhs_type
, 0));
12962 char operation
[32]; /* Max size known */
12964 /* If the assignment is part of a declaration, we use the WFL of
12965 the declared variable to point out the error and call it a
12966 declaration problem. If the assignment is a genuine =
12967 operator, we call is a operator `=' problem, otherwise we
12968 call it an assignment problem. In both of these last cases,
12969 we use the WFL of the operator to indicate the error. */
12971 if
(MODIFY_EXPR_FROM_INITIALIZATION_P
(node
))
12974 strcpy
(operation
, "declaration");
12978 wfl
= wfl_operator
;
12979 if
(COMPOUND_ASSIGN_P
(TREE_OPERAND
(node
, 1)))
12980 strcpy
(operation
, "assignment");
12981 else if
(is_return
)
12982 strcpy
(operation
, "'return'");
12984 strcpy
(operation
, "'='");
12987 if
(!valid_cast_to_p
(rhs_type
, lhs_type
))
12988 parse_error_context
12989 (wfl
, "Incompatible type for %s. Can't convert %qs to %qs",
12990 operation
, t1
, t2
);
12992 parse_error_context
(wfl
, "Incompatible type for %s. Explicit cast needed to convert %qs to %qs",
12993 operation
, t1
, t2
);
12994 free
(t1
); free
(t2
);
12999 return error_mark_node
;
13001 /* If we're processing a `return' statement, promote the actual type
13002 to the promoted type. */
13004 new_rhs
= convert
(TREE_TYPE
(lvalue
), new_rhs
);
13006 /* 10.10: Array Store Exception runtime check */
13007 if
(!flag_emit_class_files
13008 && lvalue_from_array
13009 && JREFERENCE_TYPE_P
(TYPE_ARRAY_ELEMENT
(lhs_type
)))
13011 tree array
, store_check
, base
, index_expr
;
13013 /* Save RHS so that it doesn't get re-evaluated by the store check. */
13014 new_rhs
= save_expr
(new_rhs
);
13016 /* Get the INDIRECT_REF. */
13017 array
= TREE_OPERAND
(TREE_OPERAND
(lvalue
, 0), 0);
13018 /* Get the array pointer expr. */
13019 array
= TREE_OPERAND
(array
, 0);
13020 store_check
= build_java_arraystore_check
(array
, new_rhs
);
13022 index_expr
= TREE_OPERAND
(lvalue
, 1);
13024 if
(TREE_CODE
(index_expr
) == COMPOUND_EXPR
)
13026 /* A COMPOUND_EXPR here is a bounds check. The bounds check must
13027 happen before the store check, so prepare to insert the store
13028 check within the second operand of the existing COMPOUND_EXPR. */
13034 index_expr
= TREE_OPERAND
(base
, 1);
13035 TREE_OPERAND
(base
, 1) = build2
(COMPOUND_EXPR
, TREE_TYPE
(index_expr
),
13036 store_check
, index_expr
);
13039 /* Final locals can be used as case values in switch
13040 statement. Prepare them for this eventuality. */
13041 if
(TREE_CODE
(lvalue
) == VAR_DECL
13042 && DECL_FINAL
(lvalue
)
13043 && TREE_CONSTANT
(new_rhs
)
13044 && IDENTIFIER_LOCAL_VALUE
(DECL_NAME
(lvalue
))
13045 && JINTEGRAL_TYPE_P
(TREE_TYPE
(lvalue
))
13048 TREE_CONSTANT
(lvalue
) = 1;
13049 TREE_INVARIANT
(lvalue
) = 1;
13050 DECL_INITIAL
(lvalue
) = new_rhs
;
13053 /* Copy the rhs if it's a reference. */
13054 if
(! flag_check_references
&& ! flag_emit_class_files
&& optimize
> 0)
13056 switch
(TREE_CODE
(new_rhs
))
13060 case COMPONENT_REF
:
13061 /* Transform a = foo.bar
13062 into a = ({int tmp; tmp = foo.bar;}).
13063 We need to ensure that if a read from memory fails
13064 because of a NullPointerException, a destination variable
13065 will remain unchanged. An explicit temporary does what
13068 If flag_check_references is set, this is unnecessary
13069 because we'll check each reference before doing any
13070 reads. If optimize is not set the result will never be
13071 written to a stack slot that contains the LHS. */
13073 tree tmp
= build_decl
(VAR_DECL
, get_identifier
("<tmp>"),
13074 TREE_TYPE
(new_rhs
));
13075 tree block
= make_node
(BLOCK
);
13077 = build2
(MODIFY_EXPR
, TREE_TYPE
(new_rhs
), tmp
, fold
(new_rhs
));
13078 DECL_CONTEXT
(tmp
) = current_function_decl
;
13079 TREE_TYPE
(block
) = TREE_TYPE
(new_rhs
);
13080 BLOCK_VARS
(block
) = tmp
;
13081 BLOCK_EXPR_BODY
(block
) = assignment
;
13082 TREE_SIDE_EFFECTS
(block
) = 1;
13091 TREE_OPERAND
(node
, 0) = lvalue
;
13092 TREE_OPERAND
(node
, 1) = new_rhs
;
13093 TREE_TYPE
(node
) = lhs_type
;
13097 /* Check that type SOURCE can be cast into type DEST. If the cast
13098 can't occur at all, return NULL; otherwise, return a possibly
13102 try_reference_assignconv
(tree lhs_type
, tree rhs
)
13104 tree new_rhs
= NULL_TREE
;
13105 tree rhs_type
= TREE_TYPE
(rhs
);
13107 if
(!JPRIMITIVE_TYPE_P
(rhs_type
) && JREFERENCE_TYPE_P
(lhs_type
))
13109 /* `null' may be assigned to any reference type */
13110 if
(rhs
== null_pointer_node
)
13111 new_rhs
= null_pointer_node
;
13112 /* Try the reference assignment conversion */
13113 else if
(valid_ref_assignconv_cast_p
(rhs_type
, lhs_type
, 0))
13115 /* This is a magic assignment that we process differently */
13116 else if
(TREE_CODE
(rhs
) == JAVA_EXC_OBJ_EXPR
)
13122 /* Check that RHS can be converted into LHS_TYPE by the assignment
13123 conversion (5.2), for the cases of RHS being a builtin type. Return
13124 NULL_TREE if the conversion fails or if because RHS isn't of a
13125 builtin type. Return a converted RHS if the conversion is possible. */
13128 try_builtin_assignconv
(tree wfl_op1
, tree lhs_type
, tree rhs
)
13130 tree new_rhs
= NULL_TREE
;
13131 tree rhs_type
= TREE_TYPE
(rhs
);
13133 /* Handle boolean specially. */
13134 if
(TREE_CODE
(rhs_type
) == BOOLEAN_TYPE
13135 || TREE_CODE
(lhs_type
) == BOOLEAN_TYPE
)
13137 if
(TREE_CODE
(rhs_type
) == BOOLEAN_TYPE
13138 && TREE_CODE
(lhs_type
) == BOOLEAN_TYPE
)
13142 /* 5.1.1 Try Identity Conversion,
13143 5.1.2 Try Widening Primitive Conversion */
13144 else if
(valid_builtin_assignconv_identity_widening_p
(lhs_type
, rhs_type
))
13145 new_rhs
= convert
(lhs_type
, rhs
);
13147 /* Try a narrowing primitive conversion (5.1.3):
13148 - expression is a constant expression of type byte, short, char,
13150 - variable is byte, short or char AND
13151 - The value of the expression is representable in the type of the
13153 else if
((rhs_type
== byte_type_node || rhs_type
== short_type_node
13154 || rhs_type
== char_type_node || rhs_type
== int_type_node
)
13155 && TREE_CONSTANT
(rhs
)
13156 && (lhs_type
== byte_type_node || lhs_type
== char_type_node
13157 || lhs_type
== short_type_node
))
13159 if
(int_fits_type_p
(rhs
, lhs_type
))
13160 new_rhs
= convert
(lhs_type
, rhs
);
13161 else if
(wfl_op1
) /* Might be called with a NULL */
13162 parse_warning_context
13164 "Constant expression %qs too wide for narrowing primitive conversion to %qs",
13165 print_int_node
(rhs
), lang_printable_name
(lhs_type
, 0));
13166 /* Reported a warning that will turn into an error further
13167 down, so we don't return */
13173 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
13174 conversion (5.1.1) or widening primitive conversion (5.1.2). Return
13175 0 is the conversion test fails. This implements parts the method
13176 invocation conversion (5.3). */
13179 valid_builtin_assignconv_identity_widening_p
(tree lhs_type
, tree rhs_type
)
13181 /* 5.1.1: This is the identity conversion part. */
13182 if
(lhs_type
== rhs_type
)
13185 /* Reject non primitive types and boolean conversions. */
13186 if
(!JNUMERIC_TYPE_P
(lhs_type
) ||
!JNUMERIC_TYPE_P
(rhs_type
))
13189 /* 5.1.2: widening primitive conversion. byte, even if it's smaller
13190 than a char can't be converted into a char. Short can't too, but
13191 the < test below takes care of that */
13192 if
(lhs_type
== char_type_node
&& rhs_type
== byte_type_node
)
13195 /* Accept all promoted type here. Note, we can't use <= in the test
13196 below, because we still need to bounce out assignments of short
13197 to char and the likes */
13198 if
(lhs_type
== int_type_node
13199 && (rhs_type
== promoted_byte_type_node
13200 || rhs_type
== promoted_short_type_node
13201 || rhs_type
== promoted_char_type_node
13202 || rhs_type
== promoted_boolean_type_node
))
13205 /* From here, an integral is widened if its precision is smaller
13206 than the precision of the LHS or if the LHS is a floating point
13207 type, or the RHS is a float and the RHS a double. */
13208 if
((JINTEGRAL_TYPE_P
(rhs_type
) && JINTEGRAL_TYPE_P
(lhs_type
)
13209 && (TYPE_PRECISION
(rhs_type
) < TYPE_PRECISION
(lhs_type
)))
13210 ||
(JINTEGRAL_TYPE_P
(rhs_type
) && JFLOAT_TYPE_P
(lhs_type
))
13211 ||
(rhs_type
== float_type_node
&& lhs_type
== double_type_node
))
13217 /* Check that something of SOURCE type can be assigned or cast to
13218 something of DEST type at runtime. Return 1 if the operation is
13219 valid, 0 otherwise. If CAST is set to 1, we're treating the case
13220 were SOURCE is cast into DEST, which borrows a lot of the
13221 assignment check. */
13224 valid_ref_assignconv_cast_p
(tree source
, tree dest
, int cast
)
13226 /* SOURCE or DEST might be null if not from a declared entity. */
13227 if
(!source ||
!dest
)
13229 if
(JNULLP_TYPE_P
(source
))
13231 if
(TREE_CODE
(source
) == POINTER_TYPE
)
13232 source
= TREE_TYPE
(source
);
13233 if
(TREE_CODE
(dest
) == POINTER_TYPE
)
13234 dest
= TREE_TYPE
(dest
);
13236 /* If source and dest are being compiled from bytecode, they may need to
13238 if
(CLASS_P
(source
) && !CLASS_LOADED_P
(source
))
13240 load_class
(source
, 1);
13241 safe_layout_class
(source
);
13243 if
(CLASS_P
(dest
) && !CLASS_LOADED_P
(dest
))
13245 load_class
(dest
, 1);
13246 safe_layout_class
(dest
);
13249 /* Case where SOURCE is a class type */
13250 if
(TYPE_CLASS_P
(source
))
13252 if
(TYPE_CLASS_P
(dest
))
13253 return
(source
== dest
13254 || inherits_from_p
(source
, dest
)
13255 ||
(cast
&& inherits_from_p
(dest
, source
)));
13256 if
(TYPE_INTERFACE_P
(dest
))
13258 /* If doing a cast and SOURCE is final, the operation is
13259 always correct a compile time (because even if SOURCE
13260 does not implement DEST, a subclass of SOURCE might). */
13261 if
(cast
&& !CLASS_FINAL
(TYPE_NAME
(source
)))
13263 /* Otherwise, SOURCE must implement DEST */
13264 return interface_of_p
(dest
, source
);
13266 /* DEST is an array, cast permitted if SOURCE is of Object type */
13267 return
(cast
&& source
== object_type_node ?
1 : 0);
13269 if
(TYPE_INTERFACE_P
(source
))
13271 if
(TYPE_CLASS_P
(dest
))
13273 /* If not casting, DEST must be the Object type */
13275 return dest
== object_type_node
;
13276 /* We're doing a cast. The cast is always valid is class
13277 DEST is not final, otherwise, DEST must implement SOURCE */
13278 else if
(!CLASS_FINAL
(TYPE_NAME
(dest
)))
13281 return interface_of_p
(source
, dest
);
13283 if
(TYPE_INTERFACE_P
(dest
))
13285 /* If doing a cast, then if SOURCE and DEST contain method
13286 with the same signature but different return type, then
13287 this is a (compile time) error */
13290 tree method_source
, method_dest
;
13294 for
(method_source
= TYPE_METHODS
(source
); method_source
;
13295 method_source
= TREE_CHAIN
(method_source
))
13298 build_java_argument_signature
(TREE_TYPE
(method_source
));
13299 source_type
= TREE_TYPE
(TREE_TYPE
(method_source
));
13300 source_name
= DECL_NAME
(method_source
);
13301 for
(method_dest
= TYPE_METHODS
(dest
);
13302 method_dest
; method_dest
= TREE_CHAIN
(method_dest
))
13304 build_java_argument_signature
(TREE_TYPE
(method_dest
))
13305 && source_name
== DECL_NAME
(method_dest
)
13306 && source_type
!= TREE_TYPE
(TREE_TYPE
(method_dest
)))
13312 return source
== dest || interface_of_p
(dest
, source
);
13318 && (DECL_NAME
(TYPE_NAME
(source
))
13319 == java_lang_cloneable_identifier_node
13320 ||
(DECL_NAME
(TYPE_NAME
(source
))
13321 == java_io_serializable_identifier_node
)));
13324 if
(TYPE_ARRAY_P
(source
))
13326 if
(TYPE_CLASS_P
(dest
))
13327 return dest
== object_type_node
;
13328 /* Can't cast an array to an interface unless the interface is
13329 java.lang.Cloneable or java.io.Serializable. */
13330 if
(TYPE_INTERFACE_P
(dest
))
13331 return
(DECL_NAME
(TYPE_NAME
(dest
))
13332 == java_lang_cloneable_identifier_node
13333 ||
(DECL_NAME
(TYPE_NAME
(dest
))
13334 == java_io_serializable_identifier_node
));
13337 tree source_element_type
= TYPE_ARRAY_ELEMENT
(source
);
13338 tree dest_element_type
= TYPE_ARRAY_ELEMENT
(dest
);
13340 /* In case of severe errors, they turn out null */
13341 if
(!dest_element_type ||
!source_element_type
)
13343 if
(source_element_type
== dest_element_type
)
13345 return valid_ref_assignconv_cast_p
(source_element_type
,
13346 dest_element_type
, cast
);
13354 valid_cast_to_p
(tree source
, tree dest
)
13356 if
(TREE_CODE
(source
) == POINTER_TYPE
)
13357 source
= TREE_TYPE
(source
);
13358 if
(TREE_CODE
(dest
) == POINTER_TYPE
)
13359 dest
= TREE_TYPE
(dest
);
13361 if
(TREE_CODE
(source
) == RECORD_TYPE
&& TREE_CODE
(dest
) == RECORD_TYPE
)
13362 return valid_ref_assignconv_cast_p
(source
, dest
, 1);
13364 else if
(JNUMERIC_TYPE_P
(source
) && JNUMERIC_TYPE_P
(dest
))
13367 else if
(TREE_CODE
(source
) == BOOLEAN_TYPE
13368 && TREE_CODE
(dest
) == BOOLEAN_TYPE
)
13375 do_unary_numeric_promotion
(tree arg
)
13377 tree type
= TREE_TYPE
(arg
);
13378 if
(TREE_CODE
(type
) == INTEGER_TYPE
&& TYPE_PRECISION
(type
) < 32)
13379 arg
= convert
(int_type_node
, arg
);
13383 /* Return a nonzero value if SOURCE can be converted into DEST using
13384 the method invocation conversion rule (5.3). */
13386 valid_method_invocation_conversion_p
(tree dest
, tree source
)
13388 return
((JPRIMITIVE_TYPE_P
(source
) && JPRIMITIVE_TYPE_P
(dest
)
13389 && valid_builtin_assignconv_identity_widening_p
(dest
, source
))
13390 ||
((JREFERENCE_TYPE_P
(source
) || JNULLP_TYPE_P
(source
))
13391 && (JREFERENCE_TYPE_P
(dest
) || JNULLP_TYPE_P
(dest
))
13392 && valid_ref_assignconv_cast_p
(source
, dest
, 0)));
13395 /* Build an incomplete binop expression. */
13398 build_binop
(enum tree_code op
, int op_location
, tree op1
, tree op2
)
13400 tree binop
= build2
(op
, NULL_TREE
, op1
, op2
);
13401 TREE_SIDE_EFFECTS
(binop
) = 1;
13402 /* Store the location of the operator, for better error report. The
13403 string of the operator will be rebuild based on the OP value. */
13404 EXPR_WFL_LINECOL
(binop
) = op_location
;
13408 /* Build the string of the operator retained by NODE. If NODE is part
13409 of a compound expression, add an '=' at the end of the string. This
13410 function is called when an error needs to be reported on an
13411 operator. The string is returned as a pointer to a static character
13415 operator_string
(tree node
)
13417 #define BUILD_OPERATOR_STRING(S) \
13419 sprintf
(buffer
, "%s%s", S
, (COMPOUND_ASSIGN_P
(node
) ?
"=" : "")); \
13423 static char buffer
[10];
13424 switch
(TREE_CODE
(node
))
13426 case MULT_EXPR
: BUILD_OPERATOR_STRING
("*");
13427 case RDIV_EXPR
: BUILD_OPERATOR_STRING
("/");
13428 case TRUNC_MOD_EXPR
: BUILD_OPERATOR_STRING
("%");
13429 case PLUS_EXPR
: BUILD_OPERATOR_STRING
("+");
13430 case MINUS_EXPR
: BUILD_OPERATOR_STRING
("-");
13431 case LSHIFT_EXPR
: BUILD_OPERATOR_STRING
("<<");
13432 case RSHIFT_EXPR
: BUILD_OPERATOR_STRING
(">>");
13433 case URSHIFT_EXPR
: BUILD_OPERATOR_STRING
(">>>");
13434 case BIT_AND_EXPR
: BUILD_OPERATOR_STRING
("&");
13435 case BIT_XOR_EXPR
: BUILD_OPERATOR_STRING
("^");
13436 case BIT_IOR_EXPR
: BUILD_OPERATOR_STRING
("|");
13437 case TRUTH_ANDIF_EXPR
: BUILD_OPERATOR_STRING
("&&");
13438 case TRUTH_ORIF_EXPR
: BUILD_OPERATOR_STRING
("||");
13439 case EQ_EXPR
: BUILD_OPERATOR_STRING
("==");
13440 case NE_EXPR
: BUILD_OPERATOR_STRING
("!=");
13441 case GT_EXPR
: BUILD_OPERATOR_STRING
(">");
13442 case GE_EXPR
: BUILD_OPERATOR_STRING
(">=");
13443 case LT_EXPR
: BUILD_OPERATOR_STRING
("<");
13444 case LE_EXPR
: BUILD_OPERATOR_STRING
("<=");
13445 case UNARY_PLUS_EXPR
: BUILD_OPERATOR_STRING
("+");
13446 case NEGATE_EXPR
: BUILD_OPERATOR_STRING
("-");
13447 case TRUTH_NOT_EXPR
: BUILD_OPERATOR_STRING
("!");
13448 case BIT_NOT_EXPR
: BUILD_OPERATOR_STRING
("~");
13449 case PREINCREMENT_EXPR
: /* Fall through */
13450 case POSTINCREMENT_EXPR
: BUILD_OPERATOR_STRING
("++");
13451 case PREDECREMENT_EXPR
: /* Fall through */
13452 case POSTDECREMENT_EXPR
: BUILD_OPERATOR_STRING
("--");
13454 internal_error
("unregistered operator %s",
13455 tree_code_name
[TREE_CODE
(node
)]);
13458 #undef BUILD_OPERATOR_STRING
13461 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2. */
13464 java_decl_equiv
(tree var_acc1
, tree var_acc2
)
13466 if
(JDECL_P
(var_acc1
))
13467 return
(var_acc1
== var_acc2
);
13469 return
(TREE_CODE
(var_acc1
) == COMPONENT_REF
13470 && TREE_CODE
(var_acc2
) == COMPONENT_REF
13471 && TREE_OPERAND
(TREE_OPERAND
(var_acc1
, 0), 0)
13472 == TREE_OPERAND
(TREE_OPERAND
(var_acc2
, 0), 0)
13473 && TREE_OPERAND
(var_acc1
, 1) == TREE_OPERAND
(var_acc2
, 1));
13476 /* Return a nonzero value if CODE is one of the operators that can be
13477 used in conjunction with the `=' operator in a compound assignment. */
13480 binop_compound_p
(enum tree_code code
)
13483 for
(i
= 0; i
< BINOP_COMPOUND_CANDIDATES
; i
++)
13484 if
(binop_lookup
[i
] == code
)
13487 return i
< BINOP_COMPOUND_CANDIDATES
;
13490 /* Reorganize after a fold to get SAVE_EXPR to generate what we want. */
13493 java_refold
(tree t
)
13495 tree c
, b
, ns
, decl
;
13497 if
(TREE_CODE
(t
) != MODIFY_EXPR
)
13500 c
= TREE_OPERAND
(t
, 1);
13501 if
(! (c
&& TREE_CODE
(c
) == COMPOUND_EXPR
13502 && TREE_CODE
(TREE_OPERAND
(c
, 0)) == MODIFY_EXPR
13503 && binop_compound_p
(TREE_CODE
(TREE_OPERAND
(c
, 1)))))
13506 /* Now the left branch of the binary operator. */
13507 b
= TREE_OPERAND
(TREE_OPERAND
(c
, 1), 0);
13508 if
(! (b
&& TREE_CODE
(b
) == NOP_EXPR
13509 && TREE_CODE
(TREE_OPERAND
(b
, 0)) == SAVE_EXPR
))
13512 ns
= TREE_OPERAND
(TREE_OPERAND
(b
, 0), 0);
13513 if
(! (ns
&& TREE_CODE
(ns
) == NOP_EXPR
13514 && TREE_CODE
(TREE_OPERAND
(ns
, 0)) == SAVE_EXPR
))
13517 decl
= TREE_OPERAND
(TREE_OPERAND
(ns
, 0), 0);
13518 if
((JDECL_P
(decl
) || TREE_CODE
(decl
) == COMPONENT_REF
)
13519 /* It's got to be the an equivalent decl */
13520 && java_decl_equiv
(decl
, TREE_OPERAND
(TREE_OPERAND
(c
, 0), 0)))
13522 /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13523 TREE_OPERAND
(TREE_OPERAND
(c
, 1), 0) = TREE_OPERAND
(ns
, 0);
13524 /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13525 TREE_OPERAND
(t
, 1) = TREE_OPERAND
(c
, 1);
13526 /* Change the right part of the BINOP_EXPR */
13527 TREE_OPERAND
(TREE_OPERAND
(t
, 1), 1) = TREE_OPERAND
(c
, 0);
13533 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13534 errors but we modify NODE so that it contains the type computed
13535 according to the expression, when it's fixed. Otherwise, we write
13536 error_mark_node as the type. It allows us to further the analysis
13537 of remaining nodes and detects more errors in certain cases. */
13540 patch_binop
(tree node
, tree wfl_op1
, tree wfl_op2
, int folding
)
13542 tree op1
= TREE_OPERAND
(node
, 0);
13543 tree op2
= TREE_OPERAND
(node
, 1);
13544 tree op1_type
= TREE_TYPE
(op1
);
13545 tree op2_type
= TREE_TYPE
(op2
);
13546 tree prom_type
= NULL_TREE
, cn
;
13547 enum tree_code code
= TREE_CODE
(node
);
13549 /* If 1, tell the routine that we have to return error_mark_node
13550 after checking for the initialization of the RHS */
13551 int error_found
= 0;
13553 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
13555 /* If either op<n>_type are NULL, this might be early signs of an
13556 error situation, unless it's too early to tell (in case we're
13557 handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13558 correctly so the error can be later on reported accurately. */
13559 if
(! (code
== PLUS_EXPR || code
== NE_EXPR
13560 || code
== EQ_EXPR || code
== INSTANCEOF_EXPR
))
13565 n
= java_complete_tree
(op1
);
13566 op1_type
= TREE_TYPE
(n
);
13570 n
= java_complete_tree
(op2
);
13571 op2_type
= TREE_TYPE
(n
);
13577 /* 15.16 Multiplicative operators */
13578 case MULT_EXPR
: /* 15.16.1 Multiplication Operator * */
13579 case RDIV_EXPR
: /* 15.16.2 Division Operator / */
13580 case TRUNC_DIV_EXPR
: /* 15.16.2 Integral type Division Operator / */
13581 case TRUNC_MOD_EXPR
: /* 15.16.3 Remainder operator % */
13582 if
(!JNUMERIC_TYPE_P
(op1_type
) ||
!JNUMERIC_TYPE_P
(op2_type
))
13584 if
(!JNUMERIC_TYPE_P
(op1_type
))
13585 ERROR_CANT_CONVERT_TO_NUMERIC
(wfl_operator
, node
, op1_type
);
13586 if
(!JNUMERIC_TYPE_P
(op2_type
) && (op1_type
!= op2_type
))
13587 ERROR_CANT_CONVERT_TO_NUMERIC
(wfl_operator
, node
, op2_type
);
13588 TREE_TYPE
(node
) = error_mark_node
;
13592 prom_type
= binary_numeric_promotion
(op1_type
, op2_type
, &op1
, &op2
);
13594 /* Detect integral division by zero */
13595 if
((code
== RDIV_EXPR || code
== TRUNC_MOD_EXPR
)
13596 && TREE_CODE
(prom_type
) == INTEGER_TYPE
13597 && (op2
== integer_zero_node || op2
== long_zero_node ||
13598 (TREE_CODE
(op2
) == INTEGER_CST
&&
13599 ! TREE_INT_CST_LOW
(op2
) && ! TREE_INT_CST_HIGH
(op2
))))
13601 parse_warning_context
13603 "Evaluating this expression will result in an arithmetic exception being thrown");
13604 TREE_CONSTANT
(node
) = 0;
13605 TREE_INVARIANT
(node
) = 0;
13608 /* Change the division operator if necessary */
13609 if
(code
== RDIV_EXPR
&& TREE_CODE
(prom_type
) == INTEGER_TYPE
)
13610 TREE_SET_CODE
(node
, TRUNC_DIV_EXPR
);
13612 /* Before divisions as is disappear, try to simplify and bail if
13613 applicable, otherwise we won't perform even simple
13614 simplifications like (1-1)/3. We can't do that with floating
13615 point number, folds can't handle them at this stage. */
13616 if
(code
== RDIV_EXPR
&& TREE_CONSTANT
(op1
) && TREE_CONSTANT
(op2
)
13617 && JINTEGRAL_TYPE_P
(op1
) && JINTEGRAL_TYPE_P
(op2
))
13619 TREE_TYPE
(node
) = prom_type
;
13620 node
= fold
(node
);
13621 if
(TREE_CODE
(node
) != code
)
13625 if
(TREE_CODE
(prom_type
) == INTEGER_TYPE
13626 && flag_use_divide_subroutine
13627 && ! flag_emit_class_files
13628 && (code
== RDIV_EXPR || code
== TRUNC_MOD_EXPR
))
13629 return build_java_soft_divmod
(TREE_CODE
(node
), prom_type
, op1
, op2
);
13631 /* This one is more complicated. FLOATs are processed by a
13632 function call to soft_fmod. Duplicate the value of the
13633 COMPOUND_ASSIGN_P flag. */
13634 if
(code
== TRUNC_MOD_EXPR
)
13636 tree mod
= build_java_binop
(TRUNC_MOD_EXPR
, prom_type
, op1
, op2
);
13637 COMPOUND_ASSIGN_P
(mod
) = COMPOUND_ASSIGN_P
(node
);
13642 /* 15.17 Additive Operators */
13643 case PLUS_EXPR
: /* 15.17.1 String Concatenation Operator + */
13645 /* Operation is valid if either one argument is a string
13646 constant, a String object or a StringBuffer crafted for the
13647 purpose of the a previous usage of the String concatenation
13650 if
(TREE_CODE
(op1
) == STRING_CST
13651 || TREE_CODE
(op2
) == STRING_CST
13652 || JSTRING_TYPE_P
(op1_type
)
13653 || JSTRING_TYPE_P
(op2_type
)
13654 || IS_CRAFTED_STRING_BUFFER_P
(op1
)
13655 || IS_CRAFTED_STRING_BUFFER_P
(op2
))
13656 return build_string_concatenation
(op1
, op2
);
13658 case MINUS_EXPR
: /* 15.17.2 Additive Operators (+ and -) for
13660 if
(!JNUMERIC_TYPE_P
(op1_type
) ||
!JNUMERIC_TYPE_P
(op2_type
))
13662 if
(!JNUMERIC_TYPE_P
(op1_type
))
13663 ERROR_CANT_CONVERT_TO_NUMERIC
(wfl_operator
, node
, op1_type
);
13664 if
(!JNUMERIC_TYPE_P
(op2_type
) && (op1_type
!= op2_type
))
13665 ERROR_CANT_CONVERT_TO_NUMERIC
(wfl_operator
, node
, op2_type
);
13666 TREE_TYPE
(node
) = error_mark_node
;
13670 prom_type
= binary_numeric_promotion
(op1_type
, op2_type
, &op1
, &op2
);
13673 /* 15.18 Shift Operators */
13677 if
(!JINTEGRAL_TYPE_P
(op1_type
) ||
!JINTEGRAL_TYPE_P
(op2_type
))
13679 if
(!JINTEGRAL_TYPE_P
(op1_type
))
13680 ERROR_CAST_NEEDED_TO_INTEGRAL
(wfl_operator
, node
, op1_type
);
13683 if
(JNUMERIC_TYPE_P
(op2_type
))
13684 parse_error_context
(wfl_operator
,
13685 "Incompatible type for %qs. Explicit cast needed to convert shift distance from %qs to integral",
13686 operator_string
(node
),
13687 lang_printable_name
(op2_type
, 0));
13689 parse_error_context
(wfl_operator
,
13690 "Incompatible type for %qs. Can't convert shift distance from %qs to integral",
13691 operator_string
(node
),
13692 lang_printable_name
(op2_type
, 0));
13694 TREE_TYPE
(node
) = error_mark_node
;
13699 /* Unary numeric promotion (5.6.1) is performed on each operand
13701 op1
= do_unary_numeric_promotion
(op1
);
13702 op2
= do_unary_numeric_promotion
(op2
);
13704 /* If the right hand side is of type `long', first cast it to
13706 if
(TREE_TYPE
(op2
) == long_type_node
)
13707 op2
= build1
(CONVERT_EXPR
, int_type_node
, op2
);
13709 /* The type of the shift expression is the type of the promoted
13710 type of the left-hand operand */
13711 prom_type
= TREE_TYPE
(op1
);
13713 /* Shift int only up to 0x1f and long up to 0x3f */
13714 if
(prom_type
== int_type_node
)
13715 op2
= fold_build2
(BIT_AND_EXPR
, int_type_node
, op2
,
13716 build_int_cst
(NULL_TREE
, 0x1f));
13718 op2
= fold_build2
(BIT_AND_EXPR
, int_type_node
, op2
,
13719 build_int_cst
(NULL_TREE
, 0x3f));
13721 /* The >>> operator is a >> operating on unsigned quantities */
13722 if
(code
== URSHIFT_EXPR
&& (folding ||
! flag_emit_class_files
))
13725 tree utype
= java_unsigned_type
(prom_type
);
13726 op1
= convert
(utype
, op1
);
13728 to_return
= fold_build2
(RSHIFT_EXPR
, utype
, op1
, op2
);
13729 to_return
= convert
(prom_type
, to_return
);
13730 /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13731 COMPOUND_ASSIGN_P
(to_return
) = COMPOUND_ASSIGN_P
(node
);
13732 TREE_SIDE_EFFECTS
(to_return
)
13733 = TREE_SIDE_EFFECTS
(op1
) | TREE_SIDE_EFFECTS
(op2
);
13738 /* 15.19.1 Type Comparison Operator instanceof */
13739 case INSTANCEOF_EXPR
:
13741 TREE_TYPE
(node
) = boolean_type_node
;
13743 /* OP1_TYPE might be NULL when OP1 is a string constant. */
13744 if
((cn
= patch_string
(op1
)))
13747 op1_type
= TREE_TYPE
(op1
);
13749 if
(op1_type
== NULL_TREE
)
13752 if
(!(op2_type
= resolve_type_during_patch
(op2
)))
13753 return error_mark_node
;
13755 /* The first operand must be a reference type or the null type */
13756 if
(!JREFERENCE_TYPE_P
(op1_type
) && op1
!= null_pointer_node
)
13757 error_found
= 1; /* Error reported further below */
13759 /* The second operand must be a reference type */
13760 if
(!JREFERENCE_TYPE_P
(op2_type
))
13762 SET_WFL_OPERATOR
(wfl_operator
, node
, wfl_op2
);
13763 parse_error_context
13764 (wfl_operator
, "Invalid argument %qs for %<instanceof%>",
13765 lang_printable_name
(op2_type
, 0));
13769 if
(!error_found
&& valid_ref_assignconv_cast_p
(op1_type
, op2_type
, 1))
13771 /* If the first operand is null, the result is always false */
13772 if
(op1
== null_pointer_node
)
13773 return boolean_false_node
;
13774 else if
(flag_emit_class_files
)
13776 TREE_OPERAND
(node
, 1) = op2_type
;
13777 TREE_SIDE_EFFECTS
(node
) = TREE_SIDE_EFFECTS
(op1
);
13780 /* Otherwise we have to invoke instance of to figure it out */
13782 return build_instanceof
(op1
, op2_type
);
13784 /* There is no way the expression operand can be an instance of
13785 the type operand. This is a compile time error. */
13788 char *t1
= xstrdup
(lang_printable_name
(op1_type
, 0));
13789 SET_WFL_OPERATOR
(wfl_operator
, node
, wfl_op1
);
13790 parse_error_context
13791 (wfl_operator
, "Impossible for %qs to be instance of %qs",
13792 t1
, lang_printable_name
(op2_type
, 0));
13799 /* 15.21 Bitwise and Logical Operators */
13803 if
(JINTEGRAL_TYPE_P
(op1_type
) && JINTEGRAL_TYPE_P
(op2_type
))
13804 /* Binary numeric promotion is performed on both operand and the
13805 expression retain that type */
13806 prom_type
= binary_numeric_promotion
(op1_type
, op2_type
, &op1
, &op2
);
13808 else if
(TREE_CODE
(op1_type
) == BOOLEAN_TYPE
13809 && TREE_CODE
(op1_type
) == BOOLEAN_TYPE
)
13810 /* The type of the bitwise operator expression is BOOLEAN */
13811 prom_type
= boolean_type_node
;
13814 if
(!JINTEGRAL_TYPE_P
(op1_type
))
13815 ERROR_CAST_NEEDED_TO_INTEGRAL
(wfl_operator
, node
, op1_type
);
13816 if
(!JINTEGRAL_TYPE_P
(op2_type
) && (op1_type
!= op2_type
))
13817 ERROR_CAST_NEEDED_TO_INTEGRAL
(wfl_operator
, node
, op2_type
);
13818 TREE_TYPE
(node
) = error_mark_node
;
13820 /* Insert a break here if adding thing before the switch's
13821 break for this case */
13825 /* 15.22 Conditional-And Operator */
13826 case TRUTH_ANDIF_EXPR
:
13827 /* 15.23 Conditional-Or Operator */
13828 case TRUTH_ORIF_EXPR
:
13829 /* Operands must be of BOOLEAN type */
13830 if
(TREE_CODE
(op1_type
) != BOOLEAN_TYPE ||
13831 TREE_CODE
(op2_type
) != BOOLEAN_TYPE
)
13833 if
(TREE_CODE
(op1_type
) != BOOLEAN_TYPE
)
13834 ERROR_CANT_CONVERT_TO_BOOLEAN
(wfl_operator
, node
, op1_type
);
13835 if
(TREE_CODE
(op2_type
) != BOOLEAN_TYPE
&& (op1_type
!= op2_type
))
13836 ERROR_CANT_CONVERT_TO_BOOLEAN
(wfl_operator
, node
, op2_type
);
13837 TREE_TYPE
(node
) = boolean_type_node
;
13841 else if
(integer_zerop
(op1
))
13843 return code
== TRUTH_ANDIF_EXPR ? op1
: op2
;
13845 else if
(integer_onep
(op1
))
13847 return code
== TRUTH_ANDIF_EXPR ? op2
: op1
;
13849 /* The type of the conditional operators is BOOLEAN */
13850 prom_type
= boolean_type_node
;
13853 /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13858 /* The type of each of the operands must be a primitive numeric
13860 if
(!JNUMERIC_TYPE_P
(op1_type
) ||
! JNUMERIC_TYPE_P
(op2_type
))
13862 if
(!JNUMERIC_TYPE_P
(op1_type
))
13863 ERROR_CANT_CONVERT_TO_NUMERIC
(wfl_operator
, node
, op1_type
);
13864 if
(!JNUMERIC_TYPE_P
(op2_type
) && (op1_type
!= op2_type
))
13865 ERROR_CANT_CONVERT_TO_NUMERIC
(wfl_operator
, node
, op2_type
);
13866 TREE_TYPE
(node
) = boolean_type_node
;
13870 /* Binary numeric promotion is performed on the operands */
13871 binary_numeric_promotion
(op1_type
, op2_type
, &op1
, &op2
);
13872 /* The type of the relation expression is always BOOLEAN */
13873 prom_type
= boolean_type_node
;
13876 /* 15.20 Equality Operator */
13879 /* It's time for us to patch the strings. */
13880 if
((cn
= patch_string
(op1
)))
13883 op1_type
= TREE_TYPE
(op1
);
13885 if
((cn
= patch_string
(op2
)))
13888 op2_type
= TREE_TYPE
(op2
);
13891 /* 15.20.1 Numerical Equality Operators == and != */
13892 /* Binary numeric promotion is performed on the operands */
13893 if
(JNUMERIC_TYPE_P
(op1_type
) && JNUMERIC_TYPE_P
(op2_type
))
13894 binary_numeric_promotion
(op1_type
, op2_type
, &op1
, &op2
);
13896 /* 15.20.2 Boolean Equality Operators == and != */
13897 else if
(TREE_CODE
(op1_type
) == BOOLEAN_TYPE
&&
13898 TREE_CODE
(op2_type
) == BOOLEAN_TYPE
)
13899 ; /* Nothing to do here */
13901 /* 15.20.3 Reference Equality Operators == and != */
13902 /* Types have to be either references or the null type. If
13903 they're references, it must be possible to convert either
13904 type to the other by casting conversion. */
13905 else if
((op1
== null_pointer_node
&& op2
== null_pointer_node
)
13906 ||
(op1
== null_pointer_node
&& JREFERENCE_TYPE_P
(op2_type
))
13907 ||
(JREFERENCE_TYPE_P
(op1_type
) && op2
== null_pointer_node
)
13908 ||
(JREFERENCE_TYPE_P
(op1_type
) && JREFERENCE_TYPE_P
(op2_type
)
13909 && (valid_ref_assignconv_cast_p
(op1_type
, op2_type
, 1)
13910 || valid_ref_assignconv_cast_p
(op2_type
,
13912 ; /* Nothing to do here */
13914 /* Else we have an error figure what can't be converted into
13915 what and report the error */
13919 t1
= xstrdup
(lang_printable_name
(op1_type
, 0));
13920 parse_error_context
13922 "Incompatible type for %qs. Can't convert %qs to %qs",
13923 operator_string
(node
), t1
,
13924 lang_printable_name
(op2_type
, 0));
13926 TREE_TYPE
(node
) = boolean_type_node
;
13930 prom_type
= boolean_type_node
;
13937 return error_mark_node
;
13939 TREE_OPERAND
(node
, 0) = op1
;
13940 TREE_OPERAND
(node
, 1) = op2
;
13941 TREE_TYPE
(node
) = prom_type
;
13942 TREE_SIDE_EFFECTS
(node
) = TREE_SIDE_EFFECTS
(op1
) | TREE_SIDE_EFFECTS
(op2
);
13944 /* fold does not respect side-effect order as required for Java but not C.
13945 * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13948 if
(flag_emit_class_files ?
(TREE_CONSTANT
(op1
) && TREE_CONSTANT
(op2
))
13949 : ! TREE_SIDE_EFFECTS
(node
))
13950 node
= fold
(node
);
13954 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13955 zero value, the value of CSTE comes after the valude of STRING */
13958 do_merge_string_cste
(tree cste
, const char *string, int string_len
, int after
)
13960 const char *old
= TREE_STRING_POINTER
(cste
);
13961 int old_len
= TREE_STRING_LENGTH
(cste
);
13962 int len
= old_len
+ string_len
;
13963 char *new
= alloca
(len
+1);
13967 memcpy
(new
, string, string_len
);
13968 memcpy
(&new
[string_len
], old
, old_len
);
13972 memcpy
(new
, old
, old_len
);
13973 memcpy
(&new
[old_len
], string, string_len
);
13976 return build_string
(len
, new
);
13979 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13980 new STRING_CST on success, NULL_TREE on failure. */
13983 merge_string_cste
(tree op1
, tree op2
, int after
)
13985 /* Handle two string constants right away. */
13986 if
(TREE_CODE
(op2
) == STRING_CST
)
13987 return do_merge_string_cste
(op1
, TREE_STRING_POINTER
(op2
),
13988 TREE_STRING_LENGTH
(op2
), after
);
13990 /* Reasonable integer constant can be treated right away. */
13991 if
(TREE_CODE
(op2
) == INTEGER_CST
&& !TREE_CONSTANT_OVERFLOW
(op2
))
13993 static const char *const boolean_true
= "true";
13994 static const char *const boolean_false
= "false";
13995 static const char *const null_pointer
= "null";
13997 const char *string;
13999 if
(op2
== boolean_true_node
)
14000 string = boolean_true
;
14001 else if
(op2
== boolean_false_node
)
14002 string = boolean_false
;
14003 else if
(op2
== null_pointer_node
14004 ||
(integer_zerop
(op2
)
14005 && TREE_CODE
(TREE_TYPE
(op2
)) == POINTER_TYPE
))
14006 /* FIXME: null is not a compile-time constant, so it is only safe to
14007 merge if the overall expression is non-constant. However, this
14008 code always merges without checking the overall expression. */
14009 string = null_pointer
;
14010 else if
(TREE_TYPE
(op2
) == char_type_node
)
14012 /* Convert the character into UTF-8. */
14013 unsigned int c
= (unsigned int) TREE_INT_CST_LOW
(op2
);
14014 unsigned char *p
= (unsigned char *) ch
;
14015 if
(0x01 <= c
&& c
<= 0x7f)
14016 *p
++ = (unsigned char) c
;
14017 else if
(c
< 0x7ff)
14019 *p
++ = (unsigned char) (c
>> 6 |
0xc0);
14020 *p
++ = (unsigned char) ((c
& 0x3f) |
0x80);
14024 *p
++ = (unsigned char) (c
>> 12 |
0xe0);
14025 *p
++ = (unsigned char) (((c
>> 6) & 0x3f) |
0x80);
14026 *p
++ = (unsigned char) ((c
& 0x3f) |
0x80);
14033 string = string_convert_int_cst
(op2
);
14035 return do_merge_string_cste
(op1
, string, strlen
(string), after
);
14040 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
14041 has to be a STRING_CST and the other part must be a STRING_CST or a
14042 INTEGRAL constant. Return a new STRING_CST if the operation
14043 succeed, NULL_TREE otherwise.
14045 If the case we want to optimize for space, we might want to return
14046 NULL_TREE for each invocation of this routine. FIXME */
14049 string_constant_concatenation
(tree op1
, tree op2
)
14051 if
(TREE_CODE
(op1
) == STRING_CST ||
(TREE_CODE
(op2
) == STRING_CST
))
14056 string = (TREE_CODE
(op1
) == STRING_CST ? op1
: op2
);
14057 rest
= (string == op1 ? op2
: op1
);
14058 invert
= (string == op1 ?
0 : 1 );
14060 /* Walk REST, only if it looks reasonable */
14061 if
(TREE_CODE
(rest
) != STRING_CST
14062 && !IS_CRAFTED_STRING_BUFFER_P
(rest
)
14063 && !JSTRING_TYPE_P
(TREE_TYPE
(rest
))
14064 && TREE_CODE
(rest
) == EXPR_WITH_FILE_LOCATION
)
14066 rest
= java_complete_tree
(rest
);
14067 if
(rest
== error_mark_node
)
14068 return error_mark_node
;
14069 rest
= fold
(rest
);
14071 return merge_string_cste
(string, rest
, invert
);
14076 /* Implement the `+' operator. Does static optimization if possible,
14077 otherwise create (if necessary) and append elements to a
14078 StringBuffer. The StringBuffer will be carried around until it is
14079 used for a function call or an assignment. Then toString() will be
14080 called on it to turn it into a String object. */
14083 build_string_concatenation
(tree op1
, tree op2
)
14086 int side_effects
= TREE_SIDE_EFFECTS
(op1
) | TREE_SIDE_EFFECTS
(op2
);
14088 /* Try to do some static optimization */
14089 if
((result
= string_constant_concatenation
(op1
, op2
)))
14092 /* Discard empty strings on either side of the expression */
14093 if
(TREE_CODE
(op1
) == STRING_CST
&& TREE_STRING_LENGTH
(op1
) == 0)
14098 else if
(TREE_CODE
(op2
) == STRING_CST
&& TREE_STRING_LENGTH
(op2
) == 0)
14101 /* If operands are string constant, turn then into object references */
14102 if
(TREE_CODE
(op1
) == STRING_CST
)
14103 op1
= patch_string_cst
(op1
);
14104 if
(op2
&& TREE_CODE
(op2
) == STRING_CST
)
14105 op2
= patch_string_cst
(op2
);
14107 /* If either one of the constant is null and the other non null
14108 operand is a String constant, return it. */
14109 if
((TREE_CODE
(op1
) == STRING_CST
) && !op2
)
14112 /* If OP1 isn't already a StringBuffer, create and
14113 initialize a new one */
14114 if
(!IS_CRAFTED_STRING_BUFFER_P
(op1
))
14116 /* Two solutions here:
14117 1) OP1 is a constant string reference, we call new StringBuffer(OP1)
14118 2) OP1 is something else, we call new StringBuffer().append(OP1). */
14119 if
(TREE_CONSTANT
(op1
) && JSTRING_TYPE_P
(TREE_TYPE
(op1
)))
14120 op1
= BUILD_STRING_BUFFER
(op1
);
14123 tree aNew
= BUILD_STRING_BUFFER
(NULL_TREE
);
14124 op1
= make_qualified_primary
(aNew
, BUILD_APPEND
(op1
), 0);
14130 /* OP1 is no longer the last node holding a crafted StringBuffer */
14131 IS_CRAFTED_STRING_BUFFER_P
(op1
) = 0;
14132 /* Create a node for `{new...,xxx}.append (op2)' */
14133 op1
= make_qualified_primary
(op1
, BUILD_APPEND
(op2
), 0);
14136 /* Mark the last node holding a crafted StringBuffer */
14137 IS_CRAFTED_STRING_BUFFER_P
(op1
) = 1;
14139 TREE_SIDE_EFFECTS
(op1
) = side_effects
;
14143 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
14144 StringBuffer. If no string were found to be patched, return
14148 patch_string
(tree node
)
14150 if
(node
== error_mark_node
)
14151 return error_mark_node
;
14152 if
(TREE_CODE
(node
) == STRING_CST
)
14153 return patch_string_cst
(node
);
14154 else if
(IS_CRAFTED_STRING_BUFFER_P
(node
))
14156 int saved
= ctxp
->explicit_constructor_p
;
14157 tree invoke
= build_method_invocation
(wfl_to_string
, NULL_TREE
);
14159 /* Temporary disable forbid the use of `this'. */
14160 ctxp
->explicit_constructor_p
= 0;
14161 ret
= java_complete_tree
(make_qualified_primary
(node
, invoke
, 0));
14162 /* String concatenation arguments must be evaluated in order too. */
14163 ret
= force_evaluation_order
(ret
);
14164 /* Restore it at its previous value */
14165 ctxp
->explicit_constructor_p
= saved
;
14171 /* Build the internal representation of a string constant. */
14174 patch_string_cst
(tree node
)
14177 if
(! flag_emit_class_files
)
14179 node
= get_identifier
(TREE_STRING_POINTER
(node
));
14180 location
= alloc_name_constant
(CONSTANT_String
, node
);
14181 node
= build_ref_from_constant_pool
(location
);
14183 TREE_CONSTANT
(node
) = 1;
14184 TREE_INVARIANT
(node
) = 1;
14186 /* ??? Guessing that the class file code can't handle casts. */
14187 if
(! flag_emit_class_files
)
14188 node
= convert
(string_ptr_type_node
, node
);
14190 TREE_TYPE
(node
) = string_ptr_type_node
;
14195 /* Build an incomplete unary operator expression. */
14198 build_unaryop
(int op_token
, int op_location
, tree op1
)
14204 case PLUS_TK
: op
= UNARY_PLUS_EXPR
; break
;
14205 case MINUS_TK
: op
= NEGATE_EXPR
; break
;
14206 case NEG_TK
: op
= TRUTH_NOT_EXPR
; break
;
14207 case NOT_TK
: op
= BIT_NOT_EXPR
; break
;
14211 unaryop
= build1
(op
, NULL_TREE
, op1
);
14212 TREE_SIDE_EFFECTS
(unaryop
) = 1;
14213 /* Store the location of the operator, for better error report. The
14214 string of the operator will be rebuild based on the OP value. */
14215 EXPR_WFL_LINECOL
(unaryop
) = op_location
;
14219 /* Special case for the ++/-- operators, since they require an extra
14220 argument to build, which is set to NULL and patched
14221 later. IS_POST_P is 1 if the operator, 0 otherwise. */
14224 build_incdec
(int op_token
, int op_location
, tree op1
, int is_post_p
)
14226 static const enum tree_code lookup
[2][2] =
14228 { PREDECREMENT_EXPR
, PREINCREMENT_EXPR
, },
14229 { POSTDECREMENT_EXPR
, POSTINCREMENT_EXPR
, },
14231 tree node
= build2
(lookup
[is_post_p
][(op_token
- DECR_TK
)],
14232 NULL_TREE
, op1
, NULL_TREE
);
14233 TREE_SIDE_EFFECTS
(node
) = 1;
14234 /* Store the location of the operator, for better error report. The
14235 string of the operator will be rebuild based on the OP value. */
14236 EXPR_WFL_LINECOL
(node
) = op_location
;
14238 /* Report an error if the operand is a constant. */
14239 if
(TREE_CONSTANT
(op1
)) {
14240 parse_error_context
(node
, "%qs cannot be used with a constant",
14241 operator_string
(node
));
14242 return error_mark_node
;
14248 /* Build an incomplete cast operator, based on the use of the
14249 CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
14250 set. java_complete_tree is trained to walk a CONVERT_EXPR even
14251 though its type is already set. */
14254 build_cast
(int location
, tree type
, tree exp
)
14256 tree node
= build1
(CONVERT_EXPR
, type
, exp
);
14257 EXPR_WFL_LINECOL
(node
) = location
;
14261 /* Build an incomplete class reference operator. */
14263 build_incomplete_class_ref
(int location
, tree class_name
)
14265 tree node
= build1
(CLASS_LITERAL
, NULL_TREE
, class_name
);
14266 tree class_decl
= GET_CPC
();
14267 tree this_class
= TREE_TYPE
(class_decl
);
14269 /* Generate the synthetic static method `class$'. (Previously we
14270 deferred this, causing different method tables to be emitted
14271 for native code and bytecode.) */
14272 if
(!TYPE_DOT_CLASS
(this_class
)
14273 && !JPRIMITIVE_TYPE_P
(class_name
)
14274 && !(TREE_CODE
(class_name
) == VOID_TYPE
))
14276 tree cpc_list
= GET_CPC_LIST
();
14277 tree cpc
= cpc_list
;
14280 /* For inner classes, add a 'class$' method to their outermost
14281 context, creating it if necessary. */
14283 while
(GET_NEXT_ENCLOSING_CPC
(cpc
))
14284 cpc
= GET_NEXT_ENCLOSING_CPC
(cpc
);
14285 class_decl
= TREE_VALUE
(cpc
);
14287 target_class
= TREE_TYPE
(class_decl
);
14289 if
(CLASS_INTERFACE
(TYPE_NAME
(target_class
)))
14291 /* For interfaces, adding a static 'class$' method directly
14292 is illegal. So create an inner class to contain the new
14293 method. Empirically this matches the behavior of javac. */
14295 /* We want the generated inner class inside the outermost class. */
14296 GET_CPC_LIST
() = cpc
;
14297 t
= build_wfl_node
(DECL_NAME
(TYPE_NAME
(object_type_node
)));
14298 inner
= create_anonymous_class
(t
);
14299 target_class
= TREE_TYPE
(inner
);
14300 end_class_declaration
(1);
14301 GET_CPC_LIST
() = cpc_list
;
14304 if
(TYPE_DOT_CLASS
(target_class
) == NULL_TREE
)
14305 build_dot_class_method
(target_class
);
14307 if
(this_class
!= target_class
)
14308 TYPE_DOT_CLASS
(this_class
) = TYPE_DOT_CLASS
(target_class
);
14311 EXPR_WFL_LINECOL
(node
) = location
;
14315 /* Complete an incomplete class reference operator. */
14317 patch_incomplete_class_ref
(tree node
)
14319 tree type
= TREE_OPERAND
(node
, 0);
14322 if
(!(ref_type
= resolve_type_during_patch
(type
)))
14323 return error_mark_node
;
14325 /* If we're not emitting class files and we know ref_type is a
14326 compiled class, build a direct reference. */
14327 if
((! flag_emit_class_files
&& is_compiled_class
(ref_type
))
14328 || JPRIMITIVE_TYPE_P
(ref_type
)
14329 || TREE_CODE
(ref_type
) == VOID_TYPE
)
14331 tree dot
= build_class_ref
(ref_type
);
14332 /* A class referenced by `foo.class' is initialized. */
14333 if
(!flag_emit_class_files
)
14334 dot
= build_class_init
(ref_type
, dot
);
14335 return java_complete_tree
(dot
);
14338 /* If we're emitting class files and we have to deal with non
14339 primitive types, we invoke the synthetic static method `class$'. */
14340 ref_type
= build_dot_class_method_invocation
(current_class
, ref_type
);
14341 return java_complete_tree
(ref_type
);
14344 /* 15.14 Unary operators. We return error_mark_node in case of error,
14345 but preserve the type of NODE if the type is fixed. */
14348 patch_unaryop
(tree node
, tree wfl_op
)
14350 tree op
= TREE_OPERAND
(node
, 0);
14351 tree op_type
= TREE_TYPE
(op
);
14352 tree prom_type
= NULL_TREE
, value
, decl
;
14353 int nested_field_flag
= 0;
14354 int code
= TREE_CODE
(node
);
14355 int error_found
= 0;
14357 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
14361 /* 15.13.2 Postfix Increment Operator ++ */
14362 case POSTINCREMENT_EXPR
:
14363 /* 15.13.3 Postfix Increment Operator -- */
14364 case POSTDECREMENT_EXPR
:
14365 /* 15.14.1 Prefix Increment Operator ++ */
14366 case PREINCREMENT_EXPR
:
14367 /* 15.14.2 Prefix Decrement Operator -- */
14368 case PREDECREMENT_EXPR
:
14369 op
= decl
= extract_field_decl
(op
);
14371 = nested_field_expanded_access_p
(op
, NULL
, NULL
, NULL
);
14372 /* We might be trying to change an outer field accessed using
14374 if
(nested_field_flag
)
14376 /* Retrieve the decl of the field we're trying to access. We
14377 do that by first retrieving the function we would call to
14378 access the field. It has been already verified that this
14379 field isn't final */
14380 if
(flag_emit_class_files
)
14381 decl
= TREE_OPERAND
(op
, 0);
14383 decl
= TREE_OPERAND
(TREE_OPERAND
(TREE_OPERAND
(op
, 0), 0), 0);
14384 decl
= DECL_FUNCTION_ACCESS_DECL
(decl
);
14386 /* We really should have a JAVA_ARRAY_EXPR to avoid this */
14387 else if
(!JDECL_P
(decl
)
14388 && TREE_CODE
(decl
) != COMPONENT_REF
14389 && !(flag_emit_class_files
&& TREE_CODE
(decl
) == ARRAY_REF
)
14390 && TREE_CODE
(decl
) != INDIRECT_REF
14391 && !(TREE_CODE
(decl
) == COMPOUND_EXPR
14392 && TREE_OPERAND
(decl
, 1)
14393 && (TREE_CODE
(TREE_OPERAND
(decl
, 1)) == INDIRECT_REF
)))
14395 TREE_TYPE
(node
) = error_mark_node
;
14399 /* From now on, we know that op is a variable and that it has a
14400 valid wfl. We use wfl_op to locate errors related to the
14402 if
(!JNUMERIC_TYPE_P
(op_type
))
14404 parse_error_context
14405 (wfl_op
, "Invalid argument type %qs to %qs",
14406 lang_printable_name
(op_type
, 0), operator_string
(node
));
14407 TREE_TYPE
(node
) = error_mark_node
;
14412 /* Before the addition, binary numeric promotion is performed on
14413 both operands, if really necessary */
14414 if
(JINTEGRAL_TYPE_P
(op_type
))
14416 value
= build_int_cst
(op_type
, 1);
14417 TREE_TYPE
(node
) = op_type
;
14421 value
= build_int_cst
(NULL_TREE
, 1);
14423 binary_numeric_promotion
(op_type
,
14424 TREE_TYPE
(value
), &op
, &value
);
14427 /* We remember we might be accessing an outer field */
14428 if
(nested_field_flag
)
14430 /* We re-generate an access to the field */
14431 value
= build2
(PLUS_EXPR
, TREE_TYPE
(op
),
14432 build_nested_field_access
(wfl_op
, decl
), value
);
14434 /* And we patch the original access$() into a write
14435 with plus_op as a rhs */
14436 return nested_field_access_fix
(node
, op
, value
);
14439 /* And write back into the node. */
14440 TREE_OPERAND
(node
, 0) = op
;
14441 TREE_OPERAND
(node
, 1) = value
;
14442 /* Convert the overall back into its original type, if
14443 necessary, and return */
14444 if
(JINTEGRAL_TYPE_P
(op_type
))
14445 return fold
(node
);
14447 return fold
(convert
(op_type
, node
));
14451 /* 15.14.3 Unary Plus Operator + */
14452 case UNARY_PLUS_EXPR
:
14453 /* 15.14.4 Unary Minus Operator - */
14455 if
(!JNUMERIC_TYPE_P
(op_type
))
14457 ERROR_CANT_CONVERT_TO_NUMERIC
(wfl_operator
, node
, op_type
);
14458 TREE_TYPE
(node
) = error_mark_node
;
14461 /* Unary numeric promotion is performed on operand */
14464 op
= do_unary_numeric_promotion
(op
);
14465 prom_type
= TREE_TYPE
(op
);
14466 if
(code
== UNARY_PLUS_EXPR
)
14471 /* 15.14.5 Bitwise Complement Operator ~ */
14473 if
(!JINTEGRAL_TYPE_P
(op_type
))
14475 ERROR_CAST_NEEDED_TO_INTEGRAL
(wfl_operator
, node
, op_type
);
14476 TREE_TYPE
(node
) = error_mark_node
;
14481 op
= do_unary_numeric_promotion
(op
);
14482 prom_type
= TREE_TYPE
(op
);
14486 /* 15.14.6 Logical Complement Operator ! */
14487 case TRUTH_NOT_EXPR
:
14488 if
(TREE_CODE
(op_type
) != BOOLEAN_TYPE
)
14490 ERROR_CANT_CONVERT_TO_BOOLEAN
(wfl_operator
, node
, op_type
);
14491 /* But the type is known. We will report an error if further
14492 attempt of a assignment is made with this rhs */
14493 TREE_TYPE
(node
) = boolean_type_node
;
14497 prom_type
= boolean_type_node
;
14500 /* 15.15 Cast Expression */
14502 value
= patch_cast
(node
, wfl_operator
);
14503 if
(value
== error_mark_node
)
14505 /* If this cast is part of an assignment, we tell the code
14506 that deals with it not to complain about a mismatch,
14507 because things have been cast, anyways */
14508 TREE_TYPE
(node
) = error_mark_node
;
14513 value
= fold
(value
);
14519 /* This can only happen when the type is already known. */
14520 gcc_assert
(TREE_TYPE
(node
) != NULL_TREE
);
14521 prom_type
= TREE_TYPE
(node
);
14526 return error_mark_node
;
14528 /* There are cases where node has been replaced by something else
14529 and we don't end up returning here: UNARY_PLUS_EXPR,
14530 CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14531 TREE_OPERAND
(node
, 0) = fold
(op
);
14532 TREE_TYPE
(node
) = prom_type
;
14533 TREE_SIDE_EFFECTS
(node
) = TREE_SIDE_EFFECTS
(op
);
14534 return fold
(node
);
14537 /* Generic type resolution that sometimes takes place during node
14538 patching. Returned the resolved type or generate an error
14539 message. Return the resolved type or NULL_TREE. */
14542 resolve_type_during_patch
(tree type
)
14544 if
(unresolved_type_p
(type
, NULL
))
14546 tree type_decl
= resolve_and_layout
(EXPR_WFL_NODE
(type
), type
);
14549 parse_error_context
(type
,
14550 "Class %qs not found in type declaration",
14551 IDENTIFIER_POINTER
(EXPR_WFL_NODE
(type
)));
14555 check_deprecation
(type
, type_decl
);
14557 return TREE_TYPE
(type_decl
);
14562 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14563 found. Otherwise NODE or something meant to replace it is returned. */
14566 patch_cast
(tree node
, tree wfl_op
)
14568 tree op
= TREE_OPERAND
(node
, 0);
14569 tree cast_type
= TREE_TYPE
(node
);
14570 tree patched
, op_type
;
14573 /* Some string patching might be necessary at this stage */
14574 if
((patched
= patch_string
(op
)))
14575 TREE_OPERAND
(node
, 0) = op
= patched
;
14576 op_type
= TREE_TYPE
(op
);
14578 /* First resolve OP_TYPE if unresolved */
14579 if
(!(cast_type
= resolve_type_during_patch
(cast_type
)))
14580 return error_mark_node
;
14582 /* Check on cast that are proven correct at compile time */
14583 if
(JNUMERIC_TYPE_P
(cast_type
) && JNUMERIC_TYPE_P
(op_type
))
14586 if
(cast_type
== op_type
)
14589 /* A narrowing conversion from a floating-point number to an
14590 integral type requires special handling (5.1.3). */
14591 if
(JFLOAT_TYPE_P
(op_type
) && JINTEGRAL_TYPE_P
(cast_type
))
14592 if
(cast_type
!= long_type_node
)
14593 op
= convert
(integer_type_node
, op
);
14595 /* Try widening/narrowing conversion. Potentially, things need
14596 to be worked out in gcc so we implement the extreme cases
14597 correctly. fold_convert() needs to be fixed. */
14598 return convert
(cast_type
, op
);
14601 /* It's also valid to cast a boolean into a boolean */
14602 if
(op_type
== boolean_type_node
&& cast_type
== boolean_type_node
)
14605 /* null can be casted to references */
14606 if
(op
== null_pointer_node
&& JREFERENCE_TYPE_P
(cast_type
))
14607 return build_null_of_type
(cast_type
);
14609 /* The remaining legal casts involve conversion between reference
14610 types. Check for their compile time correctness. */
14611 if
(JREFERENCE_TYPE_P
(op_type
) && JREFERENCE_TYPE_P
(cast_type
)
14612 && valid_ref_assignconv_cast_p
(op_type
, cast_type
, 1))
14614 TREE_TYPE
(node
) = promote_type
(cast_type
);
14615 /* Now, the case can be determined correct at compile time if
14616 OP_TYPE can be converted into CAST_TYPE by assignment
14617 conversion (5.2) */
14619 if
(valid_ref_assignconv_cast_p
(op_type
, cast_type
, 0))
14621 TREE_SET_CODE
(node
, NOP_EXPR
);
14625 if
(flag_emit_class_files
)
14627 TREE_SET_CODE
(node
, CONVERT_EXPR
);
14631 /* The cast requires a run-time check */
14632 return build3
(CALL_EXPR
, promote_type
(cast_type
),
14633 build_address_of
(soft_checkcast_node
),
14634 tree_cons
(NULL_TREE
, build_class_ref
(cast_type
),
14635 build_tree_list
(NULL_TREE
, op
)),
14639 /* Any other casts are proven incorrect at compile time */
14640 t1
= xstrdup
(lang_printable_name
(op_type
, 0));
14641 parse_error_context
(wfl_op
, "Invalid cast from %qs to %qs",
14642 t1
, lang_printable_name
(cast_type
, 0));
14644 return error_mark_node
;
14647 /* Build a null constant and give it the type TYPE. */
14650 build_null_of_type
(tree type
)
14652 tree node
= build_int_cst
(promote_type
(type
), 0);
14656 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14657 a list of indices. */
14659 build_array_ref
(int location
, tree array
, tree index
)
14661 tree node
= build4
(ARRAY_REF
, NULL_TREE
, array
, index
,
14662 NULL_TREE
, NULL_TREE
);
14663 EXPR_WFL_LINECOL
(node
) = location
;
14667 /* 15.12 Array Access Expression */
14670 patch_array_ref
(tree node
)
14672 tree array
= TREE_OPERAND
(node
, 0);
14673 tree array_type
= TREE_TYPE
(array
);
14674 tree index
= TREE_OPERAND
(node
, 1);
14675 tree index_type
= TREE_TYPE
(index
);
14676 int error_found
= 0;
14678 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
14680 if
(TREE_CODE
(array_type
) == POINTER_TYPE
)
14681 array_type
= TREE_TYPE
(array_type
);
14683 /* The array reference must be an array */
14684 if
(!TYPE_ARRAY_P
(array_type
))
14686 parse_error_context
14688 "%<[]%> can only be applied to arrays. It can't be applied to %qs",
14689 lang_printable_name
(array_type
, 0));
14690 TREE_TYPE
(node
) = error_mark_node
;
14694 /* The array index undergoes unary numeric promotion. The promoted
14695 type must be int */
14696 index
= do_unary_numeric_promotion
(index
);
14697 if
(TREE_TYPE
(index
) != int_type_node
)
14699 if
(valid_cast_to_p
(index_type
, int_type_node
))
14700 parse_error_context
(wfl_operator
,
14701 "Incompatible type for %<[]%>. Explicit cast needed to convert %qs to %<int%>",
14702 lang_printable_name
(index_type
, 0));
14704 parse_error_context
(wfl_operator
,
14705 "Incompatible type for %<[]%>. Can't convert %qs to %<int%>",
14706 lang_printable_name
(index_type
, 0));
14707 TREE_TYPE
(node
) = error_mark_node
;
14712 return error_mark_node
;
14714 array_type
= TYPE_ARRAY_ELEMENT
(array_type
);
14716 if
(flag_emit_class_files
)
14718 TREE_OPERAND
(node
, 0) = array
;
14719 TREE_OPERAND
(node
, 1) = index
;
14722 node
= build_java_arrayaccess
(array
, array_type
, index
);
14723 TREE_TYPE
(node
) = array_type
;
14727 /* 15.9 Array Creation Expressions */
14730 build_newarray_node
(tree type
, tree dims
, int extra_dims
)
14732 tree node
= build3
(NEW_ARRAY_EXPR
, NULL_TREE
, type
,
14734 build_int_cst
(NULL_TREE
, extra_dims
));
14739 patch_newarray
(tree node
)
14741 tree type
= TREE_OPERAND
(node
, 0);
14742 tree dims
= TREE_OPERAND
(node
, 1);
14743 tree cdim
, array_type
;
14744 int error_found
= 0;
14746 int xdims
= TREE_INT_CST_LOW
(TREE_OPERAND
(node
, 2));
14748 /* Dimension types are verified. It's better for the types to be
14749 verified in order. */
14750 for
(cdim
= dims
, ndims
= 0; cdim
; cdim
= TREE_CHAIN
(cdim
), ndims
++ )
14753 tree dim
= TREE_VALUE
(cdim
);
14755 /* Dim might have been saved during its evaluation */
14756 dim
= (TREE_CODE
(dim
) == SAVE_EXPR ? TREE_OPERAND
(dim
, 0) : dim
);
14758 /* The type of each specified dimension must be an integral type. */
14759 if
(!JINTEGRAL_TYPE_P
(TREE_TYPE
(dim
)))
14762 /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14763 promoted type must be int. */
14766 dim
= do_unary_numeric_promotion
(dim
);
14767 if
(TREE_TYPE
(dim
) != int_type_node
)
14771 /* Report errors on types here */
14774 parse_error_context
14775 (TREE_PURPOSE
(cdim
),
14776 "Incompatible type for dimension in array creation expression. %s convert %qs to %<int%>",
14777 (valid_cast_to_p
(TREE_TYPE
(dim
), int_type_node
) ?
14778 "Explicit cast needed to" : "Can't"),
14779 lang_printable_name
(TREE_TYPE
(dim
), 0));
14783 TREE_PURPOSE
(cdim
) = NULL_TREE
;
14786 /* Resolve array base type if unresolved */
14787 if
(!(type
= resolve_type_during_patch
(type
)))
14792 /* We don't want further evaluation of this bogus array creation
14794 TREE_TYPE
(node
) = error_mark_node
;
14795 return error_mark_node
;
14798 /* Set array_type to the actual (promoted) array type of the result. */
14799 if
(TREE_CODE
(type
) == RECORD_TYPE
)
14800 type
= build_pointer_type
(type
);
14801 while
(--xdims
>= 0)
14803 type
= promote_type
(build_java_array_type
(type
, -1));
14805 dims
= nreverse
(dims
);
14807 for
(cdim
= dims
; cdim
; cdim
= TREE_CHAIN
(cdim
))
14811 = build_java_array_type
(type
,
14812 TREE_CODE
(cdim
) == INTEGER_CST
14813 ?
(HOST_WIDE_INT
) TREE_INT_CST_LOW
(cdim
)
14815 array_type
= promote_type
(array_type
);
14817 dims
= nreverse
(dims
);
14819 /* The node is transformed into a function call. Things are done
14820 differently according to the number of dimensions. If the number
14821 of dimension is equal to 1, then the nature of the base type
14822 (primitive or not) matters. */
14824 return build_new_array
(type
, TREE_VALUE
(dims
));
14826 /* Can't reuse what's already written in expr.c because it uses the
14827 JVM stack representation. Provide a build_multianewarray. FIXME */
14828 return build3
(CALL_EXPR
, array_type
,
14829 build_address_of
(soft_multianewarray_node
),
14830 tree_cons
(NULL_TREE
,
14831 build_class_ref
(TREE_TYPE
(array_type
)),
14832 tree_cons
(NULL_TREE
,
14833 build_int_cst
(NULL_TREE
, ndims
),
14838 /* 10.6 Array initializer. */
14840 /* Build a wfl for array element that don't have one, so we can
14841 pin-point errors. */
14844 maybe_build_array_element_wfl
(tree node
)
14846 if
(TREE_CODE
(node
) != EXPR_WITH_FILE_LOCATION
)
14848 /* FIXME - old code used "prev_lc.line" and "elc.prev_col */
14849 return build_expr_wfl
(NULL_TREE
,
14850 #ifdef USE_MAPPED_LOCATION
14854 ctxp
->lexer
->token_start.line
,
14855 ctxp
->lexer
->token_start.col
14863 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14864 identification of initialized arrays easier to detect during walk
14868 build_new_array_init
(int location
, tree values
)
14870 tree constructor
= build_constructor_from_list
(NULL_TREE
,
14871 nreverse
(values
));
14872 tree to_return
= build1
(NEW_ARRAY_INIT
, NULL_TREE
, constructor
);
14873 EXPR_WFL_LINECOL
(to_return
) = location
;
14877 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14878 occurred. Otherwise return NODE after having set its type
14882 patch_new_array_init
(tree type
, tree node
)
14884 int error_seen
= 0;
14886 unsigned HOST_WIDE_INT length
;
14887 constructor_elt
*current
;
14888 int all_constant
= 1;
14889 tree init
= TREE_OPERAND
(node
, 0);
14891 if
(TREE_CODE
(type
) != POINTER_TYPE ||
! TYPE_ARRAY_P
(TREE_TYPE
(type
)))
14893 parse_error_context
(node
,
14894 "Invalid array initializer for non-array type %qs",
14895 lang_printable_name
(type
, 1));
14896 return error_mark_node
;
14898 type
= TREE_TYPE
(type
);
14899 element_type
= TYPE_ARRAY_ELEMENT
(type
);
14902 VEC_iterate
(constructor_elt
, CONSTRUCTOR_ELTS
(init
),
14906 tree elt
= current
->value
;
14907 if
(elt
== NULL_TREE || TREE_CODE
(elt
) != NEW_ARRAY_INIT
)
14909 error_seen |
= array_constructor_check_entry
(element_type
, current
);
14910 elt
= current
->value
;
14911 /* When compiling to native code, STRING_CST is converted to
14912 INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14913 if
(! TREE_CONSTANT
(elt
) || TREE_CODE
(elt
) == INDIRECT_REF
)
14918 current
->value
= patch_new_array_init
(element_type
, elt
);
14919 current
->index
= NULL_TREE
;
14922 if
(elt
&& TREE_CODE
(elt
) == TREE_LIST
14923 && TREE_VALUE
(elt
) == error_mark_node
)
14928 return error_mark_node
;
14930 /* Create a new type. We can't reuse the one we have here by
14931 patching its dimension because it originally is of dimension -1
14932 hence reused by gcc. This would prevent triangular arrays. */
14933 type
= build_java_array_type
(element_type
, length
);
14934 TREE_TYPE
(init
) = TREE_TYPE
(TREE_CHAIN
(TREE_CHAIN
(TYPE_FIELDS
(type
))));
14935 TREE_TYPE
(node
) = promote_type
(type
);
14936 TREE_CONSTANT
(init
) = all_constant
;
14937 TREE_INVARIANT
(init
) = all_constant
;
14938 TREE_CONSTANT
(node
) = all_constant
;
14939 TREE_INVARIANT
(node
) = all_constant
;
14943 /* Verify that one entry of the initializer element list can be
14944 assigned to the array base type. Report 1 if an error occurred, 0
14948 array_constructor_check_entry
(tree type
, constructor_elt
*entry
)
14950 char *array_type_string
= NULL
; /* For error reports */
14951 tree value
, type_value
, new_value
, wfl_value
, patched
;
14952 int error_seen
= 0;
14954 new_value
= NULL_TREE
;
14955 wfl_value
= entry
->value
;
14957 value
= java_complete_tree
(entry
->value
);
14958 /* patch_string return error_mark_node if arg is error_mark_node */
14959 if
((patched
= patch_string
(value
)))
14961 if
(value
== error_mark_node
)
14964 type_value
= TREE_TYPE
(value
);
14966 /* At anytime, try_builtin_assignconv can report a warning on
14967 constant overflow during narrowing. */
14968 SET_WFL_OPERATOR
(wfl_operator
, entry
->index
, wfl_value
);
14969 new_value
= try_builtin_assignconv
(wfl_operator
, type
, value
);
14970 if
(!new_value
&& (new_value
= try_reference_assignconv
(type
, value
)))
14971 type_value
= promote_type
(type
);
14973 /* Check and report errors */
14976 const char *const msg
= (!valid_cast_to_p
(type_value
, type
) ?
14977 "Can't" : "Explicit cast needed to");
14978 if
(!array_type_string
)
14979 array_type_string
= xstrdup
(lang_printable_name
(type
, 1));
14980 parse_error_context
14981 (wfl_operator
, "Incompatible type for array. %s convert %qs to %qs",
14982 msg
, lang_printable_name
(type_value
, 1), array_type_string
);
14987 entry
->value
= new_value
;
14989 if
(array_type_string
)
14990 free
(array_type_string
);
14992 entry
->index
= NULL_TREE
;
14997 build_this
(int location
)
14999 tree node
= build_wfl_node
(this_identifier_node
);
15000 TREE_SET_CODE
(node
, THIS_EXPR
);
15001 EXPR_WFL_LINECOL
(node
) = location
;
15005 /* 14.15 The return statement. It builds a modify expression that
15006 assigns the returned value to the RESULT_DECL that hold the value
15010 build_return
(int location
, tree op
)
15012 tree node
= build1
(RETURN_EXPR
, NULL_TREE
, op
);
15013 EXPR_WFL_LINECOL
(node
) = location
;
15014 node
= build_debugable_stmt
(location
, node
);
15019 patch_return
(tree node
)
15021 tree return_exp
= TREE_OPERAND
(node
, 0);
15022 tree meth
= current_function_decl
;
15023 tree mtype
= TREE_TYPE
(TREE_TYPE
(current_function_decl
));
15024 int error_found
= 0;
15026 TREE_TYPE
(node
) = error_mark_node
;
15027 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
15029 /* It's invalid to have a return value within a function that is
15030 declared with the keyword void or that is a constructor */
15031 if
(return_exp
&& (mtype
== void_type_node || DECL_CONSTRUCTOR_P
(meth
)))
15034 /* It's invalid to use a return statement in a static block */
15035 if
(DECL_CLINIT_P
(current_function_decl
))
15038 /* It's invalid to have a no return value within a function that
15039 isn't declared with the keyword `void' */
15040 if
(!return_exp
&& (mtype
!= void_type_node
&& !DECL_CONSTRUCTOR_P
(meth
)))
15043 if
(DECL_INSTINIT_P
(current_function_decl
))
15048 if
(DECL_INSTINIT_P
(current_function_decl
))
15049 parse_error_context
(wfl_operator
,
15050 "%<return%> inside instance initializer");
15052 else if
(DECL_CLINIT_P
(current_function_decl
))
15053 parse_error_context
(wfl_operator
,
15054 "%<return%> inside static initializer");
15056 else if
(!DECL_CONSTRUCTOR_P
(meth
))
15058 char *t
= xstrdup
(lang_printable_name
(mtype
, 0));
15059 parse_error_context
(wfl_operator
,
15060 "%<return%> with%s value from %<%s %s%>",
15061 (error_found
== 1 ?
"" : "out"),
15062 t
, lang_printable_name
(meth
, 2));
15066 parse_error_context
(wfl_operator
,
15067 "%<return%> with value from constructor %qs",
15068 lang_printable_name
(meth
, 2));
15069 return error_mark_node
;
15072 /* If we have a return_exp, build a modify expression and expand
15073 it. Note: at that point, the assignment is declared valid, but we
15074 may want to carry some more hacks */
15077 tree exp
= java_complete_tree
(return_exp
);
15078 tree modify
, patched
;
15080 if
((patched
= patch_string
(exp
)))
15083 modify
= build2
(MODIFY_EXPR
, NULL_TREE
, DECL_RESULT
(meth
), exp
);
15084 EXPR_WFL_LINECOL
(modify
) = EXPR_WFL_LINECOL
(node
);
15085 modify
= java_complete_tree
(modify
);
15087 if
(modify
!= error_mark_node
)
15089 TREE_SIDE_EFFECTS
(modify
) = 1;
15090 TREE_OPERAND
(node
, 0) = modify
;
15093 return error_mark_node
;
15095 TREE_TYPE
(node
) = void_type_node
;
15096 TREE_SIDE_EFFECTS
(node
) = 1;
15100 /* 14.8 The if Statement */
15103 build_if_else_statement
(int location
, tree expression
, tree if_body
,
15108 else_body
= build_java_empty_stmt
();
15109 node
= build3
(COND_EXPR
, NULL_TREE
, expression
, if_body
, else_body
);
15110 EXPR_WFL_LINECOL
(node
) = location
;
15111 node
= build_debugable_stmt
(location
, node
);
15116 patch_if_else_statement
(tree node
)
15118 tree expression
= TREE_OPERAND
(node
, 0);
15119 int can_complete_normally
15120 = (CAN_COMPLETE_NORMALLY
(TREE_OPERAND
(node
, 1))
15121 | CAN_COMPLETE_NORMALLY
(TREE_OPERAND
(node
, 2)));
15123 TREE_TYPE
(node
) = error_mark_node
;
15124 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
15126 /* The type of expression must be boolean */
15127 if
(TREE_TYPE
(expression
) != boolean_type_node
15128 && TREE_TYPE
(expression
) != promoted_boolean_type_node
)
15130 parse_error_context
15132 "Incompatible type for %<if%>. Can't convert %qs to %<boolean%>",
15133 lang_printable_name
(TREE_TYPE
(expression
), 0));
15134 return error_mark_node
;
15137 TREE_TYPE
(node
) = void_type_node
;
15138 TREE_SIDE_EFFECTS
(node
) = 1;
15139 CAN_COMPLETE_NORMALLY
(node
) = can_complete_normally
;
15143 /* 14.6 Labeled Statements */
15145 /* Action taken when a labeled statement is parsed. a new
15146 LABELED_BLOCK_EXPR is created. No statement is attached to the
15147 label, yet. LABEL can be NULL_TREE for artificially-generated blocks. */
15150 build_labeled_block
(int location
, tree label
)
15153 tree label_decl
, node
;
15154 if
(label
== NULL_TREE || label
== continue_identifier_node
)
15155 label_name
= label
;
15158 label_name
= merge_qualified_name
(label_id
, label
);
15159 /* Issue an error if we try to reuse a label that was previously
15161 if
(IDENTIFIER_LOCAL_VALUE
(label_name
))
15163 EXPR_WFL_LINECOL
(wfl_operator
) = location
;
15164 parse_error_context
(wfl_operator
,
15165 "Declaration of %qs shadows a previous label declaration",
15166 IDENTIFIER_POINTER
(label
));
15167 EXPR_WFL_LINECOL
(wfl_operator
) =
15168 EXPR_WFL_LINECOL
(IDENTIFIER_LOCAL_VALUE
(label_name
));
15169 parse_error_context
(wfl_operator
,
15170 "This is the location of the previous declaration of label %qs",
15171 IDENTIFIER_POINTER
(label
));
15172 java_error_count
--;
15176 label_decl
= create_label_decl
(label_name
);
15177 node
= build2
(LABELED_BLOCK_EXPR
, NULL_TREE
, label_decl
, NULL_TREE
);
15178 EXPR_WFL_LINECOL
(node
) = location
;
15179 TREE_SIDE_EFFECTS
(node
) = 1;
15183 /* A labeled statement LBE is attached a statement. */
15186 finish_labeled_statement
(tree lbe
, /* Labeled block expr */
15189 /* In anyways, tie the loop to its statement */
15190 LABELED_BLOCK_BODY
(lbe
) = statement
;
15191 pop_labeled_block
();
15192 POP_LABELED_BLOCK
();
15196 /* 14.10, 14.11, 14.12 Loop Statements */
15198 /* Create an empty LOOP_EXPR and make it the last in the nested loop
15202 build_new_loop
(tree loop_body
)
15204 tree loop
= build1
(LOOP_EXPR
, NULL_TREE
, loop_body
);
15205 TREE_SIDE_EFFECTS
(loop
) = 1;
15210 /* Create a loop body according to the following structure:
15212 COMPOUND_EXPR (loop main body)
15213 EXIT_EXPR (this order is for while/for loops.
15214 LABELED_BLOCK_EXPR the order is reversed for do loops)
15215 LABEL_DECL (a continue occurring here branches at the
15216 BODY end of this labeled block)
15219 REVERSED, if nonzero, tells that the loop condition expr comes
15220 after the body, like in the do-while loop.
15222 To obtain a loop, the loop body structure described above is
15223 encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
15226 LABEL_DECL (use this label to exit the loop)
15228 <structure described above> */
15231 build_loop_body
(int location
, tree condition
, int reversed
)
15233 tree first
, second
, body
;
15235 condition
= build1
(EXIT_EXPR
, NULL_TREE
, condition
); /* Force walk */
15236 EXPR_WFL_LINECOL
(condition
) = location
; /* For accurate error report */
15237 condition
= build_debugable_stmt
(location
, condition
);
15238 TREE_SIDE_EFFECTS
(condition
) = 1;
15240 body
= build_labeled_block
(0, continue_identifier_node
);
15241 first
= (reversed ? body
: condition
);
15242 second
= (reversed ? condition
: body
);
15243 return build2
(COMPOUND_EXPR
, NULL_TREE
,
15244 build2
(COMPOUND_EXPR
, NULL_TREE
, first
, second
),
15245 build_java_empty_stmt
());
15248 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
15249 their order) on the current loop. Unlink the current loop from the
15253 finish_loop_body
(int location
, tree condition
, tree body
, int reversed
)
15255 tree to_return
= ctxp
->current_loop
;
15256 tree loop_body
= LOOP_EXPR_BODY
(to_return
);
15259 tree cnode
= LOOP_EXPR_BODY_CONDITION_EXPR
(loop_body
, reversed
);
15260 /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
15261 The real EXIT_EXPR is one operand further. */
15262 EXPR_WFL_LINECOL
(cnode
) = location
;
15263 if
(TREE_CODE
(cnode
) == EXPR_WITH_FILE_LOCATION
)
15265 cnode
= EXPR_WFL_NODE
(cnode
);
15266 /* This one is for accurate error reports */
15267 EXPR_WFL_LINECOL
(cnode
) = location
;
15269 TREE_OPERAND
(cnode
, 0) = condition
;
15271 LOOP_EXPR_BODY_BODY_EXPR
(loop_body
, reversed
) = body
;
15276 /* Tailored version of finish_loop_body for FOR loops, when FOR
15277 loops feature the condition part */
15280 finish_for_loop
(int location
, tree condition
, tree update
, tree body
)
15282 /* Put the condition and the loop body in place */
15283 tree loop
= finish_loop_body
(location
, condition
, body
, 0);
15284 /* LOOP is the current loop which has been now popped of the loop
15285 stack. Mark the update block as reachable and install it. We do
15286 this because the (current interpretation of the) JLS requires
15287 that the update expression be considered reachable even if the
15288 for loop's body doesn't complete normally. */
15289 if
(update
!= NULL_TREE
&& !IS_EMPTY_STMT
(update
))
15292 if
(TREE_CODE
(up2
) == EXPR_WITH_FILE_LOCATION
)
15293 up2
= EXPR_WFL_NODE
(up2
);
15294 /* It is possible for the update expression to be an
15295 EXPR_WFL_NODE wrapping nothing. */
15296 if
(up2
!= NULL_TREE
&& !IS_EMPTY_STMT
(up2
))
15298 /* Try to detect constraint violations. These would be
15299 programming errors somewhere. */
15300 if
(! EXPR_P
(up2
) || TREE_CODE
(up2
) == LOOP_EXPR
)
15302 SUPPRESS_UNREACHABLE_ERROR
(up2
) = 1;
15305 LOOP_EXPR_BODY_UPDATE_BLOCK
(LOOP_EXPR_BODY
(loop
)) = update
;
15309 /* Try to find the loop a block might be related to. This comprises
15310 the case where the LOOP_EXPR is found as the second operand of a
15311 COMPOUND_EXPR, because the loop happens to have an initialization
15312 part, then expressed as the first operand of the COMPOUND_EXPR. If
15313 the search finds something, 1 is returned. Otherwise, 0 is
15314 returned. The search is assumed to start from a
15315 LABELED_BLOCK_EXPR's block. */
15318 search_loop
(tree statement
)
15320 if
(TREE_CODE
(statement
) == LOOP_EXPR
)
15323 if
(TREE_CODE
(statement
) == BLOCK
)
15324 statement
= BLOCK_SUBBLOCKS
(statement
);
15328 if
(statement
&& TREE_CODE
(statement
) == COMPOUND_EXPR
)
15329 while
(statement
&& TREE_CODE
(statement
) == COMPOUND_EXPR
)
15330 statement
= TREE_OPERAND
(statement
, 1);
15332 return
(TREE_CODE
(statement
) == LOOP_EXPR
15333 && FOR_LOOP_P
(statement
) ? statement
: NULL_TREE
);
15336 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
15337 returned otherwise. */
15340 labeled_block_contains_loop_p
(tree block
, tree loop
)
15345 if
(LABELED_BLOCK_BODY
(block
) == loop
)
15348 if
(FOR_LOOP_P
(loop
) && search_loop
(LABELED_BLOCK_BODY
(block
)) == loop
)
15354 /* If the loop isn't surrounded by a labeled statement, create one and
15355 insert LOOP as its body. */
15358 patch_loop_statement
(tree loop
)
15362 TREE_TYPE
(loop
) = void_type_node
;
15363 if
(labeled_block_contains_loop_p
(ctxp
->current_labeled_block
, loop
))
15366 loop_label
= build_labeled_block
(0, NULL_TREE
);
15367 /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
15368 that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
15369 LABELED_BLOCK_BODY
(loop_label
) = loop
;
15370 PUSH_LABELED_BLOCK
(loop_label
);
15374 /* 14.13, 14.14: break and continue Statements */
15376 /* Build a break or a continue statement. a null NAME indicates an
15377 unlabeled break/continue statement. */
15380 build_bc_statement
(int location
, int is_break
, tree name
)
15382 tree break_continue
, label_block_expr
= NULL_TREE
;
15386 if
(!(label_block_expr
= IDENTIFIER_LOCAL_VALUE
15387 (merge_qualified_name
(label_id
, EXPR_WFL_NODE
(name
)))))
15388 /* Null means that we don't have a target for this named
15389 break/continue. In this case, we make the target to be the
15390 label name, so that the error can be reported accurately in
15391 patch_bc_statement. */
15392 label_block_expr
= EXPR_WFL_NODE
(name
);
15394 /* Unlabeled break/continue will be handled during the
15395 break/continue patch operation */
15396 break_continue
= build1
(EXIT_BLOCK_EXPR
, NULL_TREE
, label_block_expr
);
15398 IS_BREAK_STMT_P
(break_continue
) = is_break
;
15399 TREE_SIDE_EFFECTS
(break_continue
) = 1;
15400 EXPR_WFL_LINECOL
(break_continue
) = location
;
15401 break_continue
= build_debugable_stmt
(location
, break_continue
);
15402 return break_continue
;
15405 /* Verification of a break/continue statement. */
15408 patch_bc_statement
(tree node
)
15410 tree bc_label
= EXIT_BLOCK_LABELED_BLOCK
(node
), target_stmt
;
15411 tree labeled_block
= ctxp
->current_labeled_block
;
15412 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
15414 /* Having an identifier here means that the target is unknown. */
15415 if
(bc_label
!= NULL_TREE
&& TREE_CODE
(bc_label
) == IDENTIFIER_NODE
)
15417 parse_error_context
(wfl_operator
, "No label definition found for %qs",
15418 IDENTIFIER_POINTER
(bc_label
));
15419 return error_mark_node
;
15421 if
(! IS_BREAK_STMT_P
(node
))
15423 /* It's a continue statement. */
15424 for
(;; labeled_block
= TREE_CHAIN
(labeled_block
))
15426 if
(labeled_block
== NULL_TREE
)
15428 if
(bc_label
== NULL_TREE
)
15429 parse_error_context
(wfl_operator
,
15430 "%<continue%> must be in loop");
15432 parse_error_context
15433 (wfl_operator
, "continue label %qs does not name a loop",
15434 IDENTIFIER_POINTER
(bc_label
));
15435 return error_mark_node
;
15437 if
((DECL_NAME
(LABELED_BLOCK_LABEL
(labeled_block
))
15438 == continue_identifier_node
)
15439 && (bc_label
== NULL_TREE
15440 || TREE_CHAIN
(labeled_block
) == bc_label
))
15442 bc_label
= labeled_block
;
15447 else if
(!bc_label
)
15449 for
(;; labeled_block
= TREE_CHAIN
(labeled_block
))
15451 if
(labeled_block
== NULL_TREE
)
15453 parse_error_context
(wfl_operator
,
15454 "%<break%> must be in loop or switch");
15455 return error_mark_node
;
15457 target_stmt
= LABELED_BLOCK_BODY
(labeled_block
);
15458 if
(TREE_CODE
(target_stmt
) == SWITCH_EXPR
15459 || search_loop
(target_stmt
))
15461 bc_label
= labeled_block
;
15467 EXIT_BLOCK_LABELED_BLOCK
(node
) = bc_label
;
15468 CAN_COMPLETE_NORMALLY
(bc_label
) = 1;
15470 /* Our break/continue don't return values. */
15471 TREE_TYPE
(node
) = void_type_node
;
15472 /* Encapsulate the break within a compound statement so that it's
15473 expanded all the times by expand_expr (and not clobbered
15474 sometimes, like after a if statement) */
15475 node
= add_stmt_to_compound
(NULL_TREE
, void_type_node
, node
);
15476 TREE_SIDE_EFFECTS
(node
) = 1;
15480 /* Process the exit expression belonging to a loop. Its type must be
15484 patch_exit_expr
(tree node
)
15486 tree expression
= TREE_OPERAND
(node
, 0);
15487 TREE_TYPE
(node
) = error_mark_node
;
15488 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
15490 /* The type of expression must be boolean */
15491 if
(TREE_TYPE
(expression
) != boolean_type_node
)
15493 parse_error_context
15495 "Incompatible type for loop conditional. Can't convert %qs to %<boolean%>",
15496 lang_printable_name
(TREE_TYPE
(expression
), 0));
15497 return error_mark_node
;
15499 /* Now we know things are allright, invert the condition, fold and
15501 TREE_OPERAND
(node
, 0) =
15502 fold_build1
(TRUTH_NOT_EXPR
, boolean_type_node
, expression
);
15504 if
(! integer_zerop
(TREE_OPERAND
(node
, 0))
15505 && ctxp
->current_loop
!= NULL_TREE
15506 && TREE_CODE
(ctxp
->current_loop
) == LOOP_EXPR
)
15507 CAN_COMPLETE_NORMALLY
(ctxp
->current_loop
) = 1;
15508 if
(! integer_onep
(TREE_OPERAND
(node
, 0)))
15509 CAN_COMPLETE_NORMALLY
(node
) = 1;
15512 TREE_TYPE
(node
) = void_type_node
;
15516 /* 14.9 Switch statement */
15519 patch_switch_statement
(tree node
)
15521 tree se
= TREE_OPERAND
(node
, 0), se_type
;
15524 /* Complete the switch expression */
15525 se
= TREE_OPERAND
(node
, 0) = java_complete_tree
(se
);
15526 se_type
= TREE_TYPE
(se
);
15527 /* The type of the switch expression must be char, byte, short or
15529 if
(! JINTEGRAL_TYPE_P
(se_type
) || se_type
== long_type_node
)
15531 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(node
);
15532 parse_error_context
(wfl_operator
,
15533 "Incompatible type for %<switch%>. Can't convert %qs to %<int%>",
15534 lang_printable_name
(se_type
, 0));
15535 /* This is what java_complete_tree will check */
15536 TREE_OPERAND
(node
, 0) = error_mark_node
;
15537 return error_mark_node
;
15540 /* Save and restore the outer case label list. */
15541 save
= case_label_list
;
15542 case_label_list
= NULL_TREE
;
15544 TREE_OPERAND
(node
, 1) = java_complete_tree
(TREE_OPERAND
(node
, 1));
15546 /* See if we've found a duplicate label. We can't leave this until
15547 code generation, because in `--syntax-only' and `-C' modes we
15548 don't do ordinary code generation. */
15549 for
(iter
= case_label_list
; iter
!= NULL_TREE
; iter
= TREE_CHAIN
(iter
))
15551 HOST_WIDE_INT val
= TREE_INT_CST_LOW
(TREE_VALUE
(iter
));
15553 for
(subiter
= TREE_CHAIN
(iter
);
15554 subiter
!= NULL_TREE
;
15555 subiter
= TREE_CHAIN
(subiter
))
15557 HOST_WIDE_INT subval
= TREE_INT_CST_LOW
(TREE_VALUE
(subiter
));
15560 EXPR_WFL_LINECOL
(wfl_operator
)
15561 = EXPR_WFL_LINECOL
(TREE_PURPOSE
(iter
));
15562 /* The case_label_list is in reverse order, so print the
15563 outer label first. */
15564 parse_error_context
(wfl_operator
, "duplicate case label: %<"
15565 HOST_WIDE_INT_PRINT_DEC
"%>", subval
);
15566 EXPR_WFL_LINECOL
(wfl_operator
)
15567 = EXPR_WFL_LINECOL
(TREE_PURPOSE
(subiter
));
15568 parse_error_context
(wfl_operator
, "original label is here");
15575 case_label_list
= save
;
15577 /* Ready to return */
15578 if
(TREE_CODE
(TREE_OPERAND
(node
, 1)) == ERROR_MARK
)
15580 TREE_TYPE
(node
) = error_mark_node
;
15581 return error_mark_node
;
15583 TREE_TYPE
(node
) = void_type_node
;
15584 TREE_SIDE_EFFECTS
(node
) = 1;
15585 CAN_COMPLETE_NORMALLY
(node
)
15586 = CAN_COMPLETE_NORMALLY
(TREE_OPERAND
(node
, 1))
15587 ||
! SWITCH_HAS_DEFAULT
(node
);
15593 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15594 might be NULL_TREE. */
15597 #ifdef USE_MAPPED_LOCATION
15598 source_location location
,
15602 tree condition
, tree value
)
15605 tree klass
= GET_CPC
();
15607 if
(! enable_assertions
(klass
))
15609 condition
= build2
(TRUTH_ANDIF_EXPR
, NULL_TREE
,
15610 boolean_false_node
, condition
);
15611 if
(value
== NULL_TREE
)
15612 value
= build_java_empty_stmt
();
15613 return build_if_else_statement
(location
, condition
,
15617 if
(! CLASS_USES_ASSERTIONS
(klass
))
15619 tree field
, classdollar
, id
, call
;
15620 tree class_type
= TREE_TYPE
(klass
);
15622 field
= add_field
(class_type
,
15623 get_identifier
("$assertionsDisabled"),
15625 ACC_PRIVATE | ACC_STATIC | ACC_FINAL
);
15626 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC
(field
);
15627 FIELD_SYNTHETIC
(field
) = 1;
15629 classdollar
= build_incomplete_class_ref
(location
, class_type
);
15631 /* Call CLASS.desiredAssertionStatus(). */
15632 id
= build_wfl_node
(get_identifier
("desiredAssertionStatus"));
15633 call
= build3
(CALL_EXPR
, NULL_TREE
, id
, NULL_TREE
, NULL_TREE
);
15634 call
= make_qualified_primary
(classdollar
, call
, location
);
15635 TREE_SIDE_EFFECTS
(call
) = 1;
15637 /* Invert to obtain !CLASS.desiredAssertionStatus(). This may
15638 seem odd, but we do it to generate code identical to that of
15640 call
= build1
(TRUTH_NOT_EXPR
, NULL_TREE
, call
);
15641 TREE_SIDE_EFFECTS
(call
) = 1;
15642 DECL_INITIAL
(field
) = call
;
15644 /* Record the initializer in the initializer statement list. */
15645 call
= build2
(MODIFY_EXPR
, NULL_TREE
, field
, call
);
15646 TREE_CHAIN
(call
) = CPC_STATIC_INITIALIZER_STMT
(ctxp
);
15647 SET_CPC_STATIC_INITIALIZER_STMT
(ctxp
, call
);
15648 MODIFY_EXPR_FROM_INITIALIZATION_P
(call
) = 1;
15650 CLASS_USES_ASSERTIONS
(klass
) = 1;
15653 if
(value
!= NULL_TREE
)
15654 value
= tree_cons
(NULL_TREE
, value
, NULL_TREE
);
15656 node
= build_wfl_node
(get_identifier
("java"));
15657 node
= make_qualified_name
(node
, build_wfl_node
(get_identifier
("lang")),
15659 node
= make_qualified_name
(node
, build_wfl_node
(get_identifier
("AssertionError")),
15662 node
= build3
(NEW_CLASS_EXPR
, NULL_TREE
, node
, value
, NULL_TREE
);
15663 TREE_SIDE_EFFECTS
(node
) = 1;
15664 /* It is too early to use BUILD_THROW. */
15665 node
= build1
(THROW_EXPR
, NULL_TREE
, node
);
15666 TREE_SIDE_EFFECTS
(node
) = 1;
15668 /* We invert the condition; if we just put NODE as the `else' part
15669 then we generate weird-looking bytecode. */
15670 condition
= build1
(TRUTH_NOT_EXPR
, NULL_TREE
, condition
);
15671 /* Check $assertionsDisabled. */
15673 = build2
(TRUTH_ANDIF_EXPR
, NULL_TREE
,
15674 build1
(TRUTH_NOT_EXPR
, NULL_TREE
,
15675 build_wfl_node
(get_identifier
("$assertionsDisabled"))),
15677 node
= build_if_else_statement
(location
, condition
, node
, NULL_TREE
);
15681 /* 14.18 The try/catch statements */
15683 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15684 catches TYPE and executes CATCH_STMTS. */
15687 encapsulate_with_try_catch
(int location
, tree type_or_name
, tree try_stmts
,
15690 tree try_block
, catch_clause_param
, catch_block
, catch
;
15692 /* First build a try block */
15693 try_block
= build_expr_block
(try_stmts
, NULL_TREE
);
15695 /* Build a catch block: we need a catch clause parameter */
15696 if
(TREE_CODE
(type_or_name
) == EXPR_WITH_FILE_LOCATION
)
15698 tree catch_type
= obtain_incomplete_type
(type_or_name
);
15700 catch_clause_param
= build_decl
(VAR_DECL
, wpv_id
, catch_type
);
15701 register_incomplete_type
(JDEP_VARIABLE
, type_or_name
,
15702 catch_clause_param
, catch_type
);
15703 dep
= CLASSD_LAST
(ctxp
->classd_list
);
15704 JDEP_GET_PATCH
(dep
) = &TREE_TYPE
(catch_clause_param
);
15707 catch_clause_param
= build_decl
(VAR_DECL
, wpv_id
,
15708 build_pointer_type
(type_or_name
));
15711 catch_block
= build_expr_block
(NULL_TREE
, catch_clause_param
);
15713 /* Initialize the variable and store in the block */
15714 catch
= build2
(MODIFY_EXPR
, NULL_TREE
, catch_clause_param
,
15715 build0
(JAVA_EXC_OBJ_EXPR
, ptr_type_node
));
15716 add_stmt_to_block
(catch_block
, NULL_TREE
, catch
);
15718 /* Add the catch statements */
15719 add_stmt_to_block
(catch_block
, NULL_TREE
, catch_stmts
);
15721 /* Now we can build a JAVA_CATCH_EXPR */
15722 catch_block
= build1
(JAVA_CATCH_EXPR
, NULL_TREE
, catch_block
);
15724 return build_try_statement
(location
, try_block
, catch_block
);
15728 build_try_statement
(int location
, tree try_block
, tree catches
)
15730 tree node
= build2
(TRY_EXPR
, NULL_TREE
, try_block
, catches
);
15731 EXPR_WFL_LINECOL
(node
) = location
;
15736 build_try_finally_statement
(int location
, tree try_block
, tree finally
)
15738 tree node
= build2
(TRY_FINALLY_EXPR
, NULL_TREE
, try_block
, finally
);
15739 EXPR_WFL_LINECOL
(node
) = location
;
15744 patch_try_statement
(tree node
)
15746 int error_found
= 0;
15747 tree try
= TREE_OPERAND
(node
, 0);
15748 /* Exception handlers are considered in left to right order */
15749 tree catch
= nreverse
(TREE_OPERAND
(node
, 1));
15750 tree current
, caught_type_list
= NULL_TREE
;
15752 /* Check catch clauses, if any. Every time we find an error, we try
15753 to process the next catch clause. We process the catch clause before
15754 the try block so that when processing the try block we can check thrown
15755 exceptions against the caught type list. */
15756 for
(current
= catch
; current
; current
= TREE_CHAIN
(current
))
15758 tree carg_decl
, carg_type
;
15759 tree sub_current
, catch_block
, catch_clause
;
15762 /* At this point, the structure of the catch clause is
15763 JAVA_CATCH_EXPR (catch node)
15764 BLOCK (with the decl of the parameter)
15766 MODIFY_EXPR (assignment of the catch parameter)
15767 BLOCK (catch clause block)
15769 catch_clause
= TREE_OPERAND
(current
, 0);
15770 carg_decl
= BLOCK_EXPR_DECLS
(catch_clause
);
15771 carg_type
= TREE_TYPE
(TREE_TYPE
(carg_decl
));
15773 /* Catch clauses can't have more than one parameter declared,
15774 but it's already enforced by the grammar. Make sure that the
15775 only parameter of the clause statement in of class Throwable
15776 or a subclass of Throwable, but that was done earlier. The
15777 catch clause parameter type has also been resolved. */
15779 /* Just make sure that the catch clause parameter type inherits
15780 from java.lang.Throwable */
15781 if
(!inherits_from_p
(carg_type
, throwable_type_node
))
15783 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(current
);
15784 parse_error_context
(wfl_operator
,
15785 "Can't catch class %qs. Catch clause parameter type must be a subclass of class %<java.lang.Throwable%>",
15786 lang_printable_name
(carg_type
, 0));
15791 /* Partial check for unreachable catch statement: The catch
15792 clause is reachable iff is no earlier catch block A in
15793 the try statement such that the type of the catch
15794 clause's parameter is the same as or a subclass of the
15795 type of A's parameter */
15797 for
(sub_current
= catch
;
15798 sub_current
!= current
; sub_current
= TREE_CHAIN
(sub_current
))
15800 tree sub_catch_clause
, decl
;
15801 sub_catch_clause
= TREE_OPERAND
(sub_current
, 0);
15802 decl
= BLOCK_EXPR_DECLS
(sub_catch_clause
);
15804 if
(inherits_from_p
(carg_type
, TREE_TYPE
(TREE_TYPE
(decl
))))
15806 EXPR_WFL_LINECOL
(wfl_operator
) = EXPR_WFL_LINECOL
(current
);
15807 parse_error_context
15809 "%<catch%> not reached because of the catch clause at line %d",
15810 EXPR_WFL_LINENO
(sub_current
));
15811 unreachable
= error_found
= 1;
15815 /* Complete the catch clause block */
15816 catch_block
= java_complete_tree
(TREE_OPERAND
(current
, 0));
15817 if
(catch_block
== error_mark_node
)
15822 if
(CAN_COMPLETE_NORMALLY
(catch_block
))
15823 CAN_COMPLETE_NORMALLY
(node
) = 1;
15824 TREE_OPERAND
(current
, 0) = catch_block
;
15829 /* Things to do here: the exception must be thrown */
15831 /* Link this type to the caught type list */
15832 caught_type_list
= tree_cons
(NULL_TREE
, carg_type
, caught_type_list
);
15835 PUSH_EXCEPTIONS
(caught_type_list
);
15836 if
((try
= java_complete_tree
(try
)) == error_mark_node
)
15838 if
(CAN_COMPLETE_NORMALLY
(try
))
15839 CAN_COMPLETE_NORMALLY
(node
) = 1;
15842 /* Verification ends here */
15844 return error_mark_node
;
15846 TREE_OPERAND
(node
, 0) = try
;
15847 TREE_OPERAND
(node
, 1) = catch
;
15848 TREE_TYPE
(node
) = void_type_node
;
15852 /* 14.17 The synchronized Statement */
15855 patch_synchronized_statement
(tree node
, tree wfl_op1
)
15857 tree expr
= java_complete_tree
(TREE_OPERAND
(node
, 0));
15858 tree block
= TREE_OPERAND
(node
, 1);
15860 tree tmp
, enter
, exit
, expr_decl
, assignment
;
15862 if
(expr
== error_mark_node
)
15864 block
= java_complete_tree
(block
);
15868 /* We might be trying to synchronize on a STRING_CST */
15869 if
((tmp
= patch_string
(expr
)))
15872 /* The TYPE of expr must be a reference type */
15873 if
(!JREFERENCE_TYPE_P
(TREE_TYPE
(expr
)))
15875 SET_WFL_OPERATOR
(wfl_operator
, node
, wfl_op1
);
15876 parse_error_context
(wfl_operator
, "Incompatible type for %<synchronized%>. Can't convert %qs to %<java.lang.Object%>",
15877 lang_printable_name
(TREE_TYPE
(expr
), 0));
15878 return error_mark_node
;
15881 /* Generate a try-finally for the synchronized statement, except
15882 that the handler that catches all throw exception calls
15883 _Jv_MonitorExit and then rethrow the exception.
15884 The synchronized statement is then implemented as:
15887 _Jv_MonitorEnter (expression)
15889 _Jv_MonitorExit (expression)
15893 e = _Jv_exception_info ();
15894 _Jv_MonitorExit (expression)
15898 expr_decl
= build_decl
(VAR_DECL
, generate_name
(), TREE_TYPE
(expr
));
15899 BUILD_MONITOR_ENTER
(enter
, expr_decl
);
15900 BUILD_MONITOR_EXIT
(exit
, expr_decl
);
15901 CAN_COMPLETE_NORMALLY
(enter
) = 1;
15902 CAN_COMPLETE_NORMALLY
(exit
) = 1;
15903 assignment
= build2
(MODIFY_EXPR
, NULL_TREE
, expr_decl
, expr
);
15904 TREE_SIDE_EFFECTS
(assignment
) = 1;
15905 node
= build2
(COMPOUND_EXPR
, NULL_TREE
,
15906 build2
(COMPOUND_EXPR
, NULL_TREE
, assignment
, enter
),
15907 build2
(TRY_FINALLY_EXPR
, NULL_TREE
, block
, exit
));
15908 node
= build_expr_block
(node
, expr_decl
);
15910 return java_complete_tree
(node
);
15913 /* 14.16 The throw Statement */
15916 patch_throw_statement
(tree node
, tree wfl_op1
)
15918 tree expr
= TREE_OPERAND
(node
, 0);
15919 tree type
= TREE_TYPE
(expr
);
15920 int unchecked_ok
= 0, tryblock_throws_ok
= 0;
15922 /* Thrown expression must be assignable to java.lang.Throwable */
15923 if
(!try_reference_assignconv
(throwable_type_node
, expr
))
15925 SET_WFL_OPERATOR
(wfl_operator
, node
, wfl_op1
);
15926 parse_error_context
(wfl_operator
,
15927 "Can't throw %qs; it must be a subclass of class %<java.lang.Throwable%>",
15928 lang_printable_name
(type
, 0));
15929 /* If the thrown expression was a reference, we further the
15930 compile-time check. */
15931 if
(!JREFERENCE_TYPE_P
(type
))
15932 return error_mark_node
;
15935 /* At least one of the following must be true */
15937 /* The type of the throw expression is a not checked exception,
15938 i.e. is a unchecked expression. */
15939 unchecked_ok
= IS_UNCHECKED_EXCEPTION_P
(TREE_TYPE
(type
));
15941 SET_WFL_OPERATOR
(wfl_operator
, node
, wfl_op1
);
15942 /* An instance can't throw a checked exception unless that exception
15943 is explicitly declared in the `throws' clause of each
15944 constructor. This doesn't apply to anonymous classes, since they
15945 don't have declared constructors. */
15947 && DECL_INSTINIT_P
(current_function_decl
)
15948 && !ANONYMOUS_CLASS_P
(current_class
))
15951 for
(current
= TYPE_METHODS
(current_class
); current
;
15952 current
= TREE_CHAIN
(current
))
15953 if
(DECL_CONSTRUCTOR_P
(current
)
15954 && !check_thrown_exceptions_do
(TREE_TYPE
(expr
)))
15956 parse_error_context
(wfl_operator
, "Checked exception %qs can't be thrown in instance initializer (not all declared constructor are declaring it in their %<throws%> clause)",
15957 lang_printable_name
(TREE_TYPE
(expr
), 0));
15958 return error_mark_node
;
15962 /* Throw is contained in a try statement and at least one catch
15963 clause can receive the thrown expression or the current method is
15964 declared to throw such an exception. Or, the throw statement is
15965 contained in a method or constructor declaration and the type of
15966 the Expression is assignable to at least one type listed in the
15967 throws clause the declaration. */
15969 tryblock_throws_ok
= check_thrown_exceptions_do
(TREE_TYPE
(expr
));
15970 if
(!(unchecked_ok || tryblock_throws_ok
))
15972 /* If there is a surrounding try block that has no matching
15973 clatch clause, report it first. A surrounding try block exits
15974 only if there is something after the list of checked
15975 exception thrown by the current function (if any). */
15976 if
(IN_TRY_BLOCK_P
())
15977 parse_error_context
(wfl_operator
, "Checked exception %qs can't be caught by any of the catch clause(s) of the surrounding %<try%> block",
15978 lang_printable_name
(type
, 0));
15979 /* If we have no surrounding try statement and the method doesn't have
15980 any throws, report it now. FIXME */
15982 /* We report that the exception can't be throw from a try block
15983 in all circumstances but when the `throw' is inside a static
15985 else if
(!EXCEPTIONS_P
(currently_caught_type_list
)
15986 && !tryblock_throws_ok
)
15988 if
(DECL_CLINIT_P
(current_function_decl
))
15989 parse_error_context
(wfl_operator
,
15990 "Checked exception %qs can't be thrown in initializer",
15991 lang_printable_name
(type
, 0));
15993 parse_error_context
(wfl_operator
,
15994 "Checked exception %qs isn't thrown from a %<try%> block",
15995 lang_printable_name
(type
, 0));
15997 /* Otherwise, the current method doesn't have the appropriate
15998 throws declaration */
16000 parse_error_context
(wfl_operator
, "Checked exception %qs doesn't match any of current method's %<throws%> declaration(s)",
16001 lang_printable_name
(type
, 0));
16002 return error_mark_node
;
16005 if
(! flag_emit_class_files
)
16006 BUILD_THROW
(node
, expr
);
16011 /* Add EXCEPTION to the throws clause of MDECL. If MDECL already throws
16012 a super-class of EXCEPTION, keep the superclass instead. If MDECL already
16013 throws a sub-class of EXCEPTION, replace the sub-class with EXCEPTION. */
16015 add_exception_to_throws
(tree mdecl
, tree exception
)
16019 /* Ignore unchecked exceptions. */
16020 if
(IS_UNCHECKED_EXCEPTION_P
(exception
))
16023 for
(mthrows
= DECL_FUNCTION_THROWS
(mdecl
);
16024 mthrows
; mthrows
= TREE_CHAIN
(mthrows
))
16026 if
(inherits_from_p
(exception
, TREE_VALUE
(mthrows
)))
16028 if
(inherits_from_p
(TREE_VALUE
(mthrows
), exception
))
16030 TREE_VALUE
(mthrows
) = exception
;
16035 mthrows
= DECL_FUNCTION_THROWS
(mdecl
);
16036 DECL_FUNCTION_THROWS
(mdecl
) = build_tree_list
(mthrows
, exception
);
16039 /* Check that exception said to be thrown by method DECL can be
16040 effectively caught from where DECL is invoked. THIS_EXPR is the
16041 expression that computes `this' for the method call. */
16043 check_thrown_exceptions
(
16044 #ifdef USE_MAPPED_LOCATION
16045 source_location location
,
16050 tree decl
, tree this_expr
)
16053 int is_array_call
= 0;
16055 /* Skip check within generated methods, such as access$<n>. */
16056 if
(NESTED_FIELD_ACCESS_IDENTIFIER_P
(DECL_NAME
(current_function_decl
)))
16059 if
(this_expr
!= NULL_TREE
16060 && TREE_CODE
(TREE_TYPE
(this_expr
)) == POINTER_TYPE
16061 && TYPE_ARRAY_P
(TREE_TYPE
(TREE_TYPE
(this_expr
))))
16064 /* For all the unchecked exceptions thrown by DECL. */
16065 for
(throws
= DECL_FUNCTION_THROWS
(decl
); throws
;
16066 throws
= TREE_CHAIN
(throws
))
16067 if
(!check_thrown_exceptions_do
(TREE_VALUE
(throws
)))
16069 /* Suppress errors about cloning arrays. */
16070 if
(is_array_call
&& DECL_NAME
(decl
) == get_identifier
("clone"))
16073 #ifdef USE_MAPPED_LOCATION
16074 SET_EXPR_LOCATION
(wfl_operator
, location
);
16076 EXPR_WFL_LINECOL
(wfl_operator
) = location
;
16078 if
(ANONYMOUS_CLASS_P
(DECL_CONTEXT
(current_function_decl
))
16079 && (DECL_FINIT_P
(current_function_decl
)
16080 || DECL_INIT_P
(current_function_decl
)
16081 || DECL_CONSTRUCTOR_P
(current_function_decl
)))
16083 /* Add "throws" to the initializer's exception list */
16084 tree exception
= TREE_VALUE
(throws
);
16085 add_exception_to_throws
(current_function_decl
, exception
);
16087 else if
(DECL_FINIT_P
(current_function_decl
))
16089 parse_error_context
16090 (wfl_operator
, "Exception %qs can't be thrown in initializer",
16091 lang_printable_name
(TREE_VALUE
(throws
), 0));
16095 parse_error_context
16096 (wfl_operator
, "Exception %qs must be caught, or it must be declared in the %<throws%> clause of %qs",
16097 lang_printable_name
(TREE_VALUE
(throws
), 0),
16098 (DECL_INIT_P
(current_function_decl
) ?
16099 IDENTIFIER_POINTER
(DECL_NAME
(TYPE_NAME
(current_class
))) :
16100 IDENTIFIER_POINTER
(DECL_NAME
(current_function_decl
))));
16105 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
16106 try-catch blocks, OR is listed in the `throws' clause of the
16110 check_thrown_exceptions_do
(tree exception
)
16112 tree list
= currently_caught_type_list
;
16113 resolve_and_layout
(exception
, NULL_TREE
);
16114 /* First, all the nested try-catch-finally at that stage. The
16115 last element contains `throws' clause exceptions, if any. */
16116 if
(IS_UNCHECKED_EXCEPTION_P
(exception
))
16121 for
(caught
= TREE_VALUE
(list
); caught
; caught
= TREE_CHAIN
(caught
))
16122 if
(valid_ref_assignconv_cast_p
(exception
, TREE_VALUE
(caught
), 0))
16124 list
= TREE_CHAIN
(list
);
16129 /* This function goes over all of CLASS_TYPE ctors and checks whether
16130 each of them features at least one unchecked exception in its
16131 `throws' clause. If it's the case, it returns `true', `false'
16135 ctors_unchecked_throws_clause_p
(tree class_type
)
16139 for
(current
= TYPE_METHODS
(class_type
); current
;
16140 current
= TREE_CHAIN
(current
))
16142 bool ctu
= false
; /* Ctor Throws Unchecked */
16143 if
(DECL_CONSTRUCTOR_P
(current
))
16146 for
(throws
= DECL_FUNCTION_THROWS
(current
); throws
&& !ctu
;
16147 throws
= TREE_CHAIN
(throws
))
16148 if
(inherits_from_p
(TREE_VALUE
(throws
), exception_type_node
))
16151 /* We return false as we found one ctor that is unfit. */
16152 if
(!ctu
&& DECL_CONSTRUCTOR_P
(current
))
16155 /* All ctors feature at least one unchecked exception in their
16156 `throws' clause. */
16160 /* 15.24 Conditional Operator ?: */
16163 patch_conditional_expr
(tree node
, tree wfl_cond
, tree wfl_op1
)
16165 tree cond
= TREE_OPERAND
(node
, 0);
16166 tree op1
= TREE_OPERAND
(node
, 1);
16167 tree op2
= TREE_OPERAND
(node
, 2);
16168 tree resulting_type
= NULL_TREE
;
16169 tree t1
, t2
, patched
;
16170 int error_found
= 0;
16172 /* The condition and operands of ?: might be StringBuffers crafted
16173 as a result of a string concatenation. Obtain decent ones here. */
16174 if
((patched
= patch_string
(cond
)))
16175 TREE_OPERAND
(node
, 0) = cond
= patched
;
16176 if
((patched
= patch_string
(op1
)))
16177 TREE_OPERAND
(node
, 1) = op1
= patched
;
16178 if
((patched
= patch_string
(op2
)))
16179 TREE_OPERAND
(node
, 2) = op2
= patched
;
16181 t1
= TREE_TYPE
(op1
);
16182 t2
= TREE_TYPE
(op2
);
16184 /* The first expression must be a boolean */
16185 if
(TREE_TYPE
(cond
) != boolean_type_node
)
16187 SET_WFL_OPERATOR
(wfl_operator
, node
, wfl_cond
);
16188 parse_error_context
(wfl_operator
,
16189 "Incompatible type for %<?:%>. Can't convert %qs to %<boolean%>",
16190 lang_printable_name
(TREE_TYPE
(cond
), 0));
16194 /* Second and third can be numeric, boolean (i.e. primitive),
16195 references or null. Anything else results in an error */
16196 if
(!((JNUMERIC_TYPE_P
(t1
) && JNUMERIC_TYPE_P
(t2
))
16197 ||
((JREFERENCE_TYPE_P
(t1
) || op1
== null_pointer_node
)
16198 && (JREFERENCE_TYPE_P
(t2
) || op2
== null_pointer_node
))
16199 ||
(t1
== boolean_type_node
&& t2
== boolean_type_node
)))
16202 /* Determine the type of the conditional expression. Same types are
16203 easy to deal with */
16205 resulting_type
= t1
;
16207 /* There are different rules for numeric types */
16208 else if
(JNUMERIC_TYPE_P
(t1
))
16210 /* if byte/short found, the resulting type is short */
16211 if
((t1
== byte_type_node
&& t2
== short_type_node
)
16212 ||
(t1
== short_type_node
&& t2
== byte_type_node
))
16213 resulting_type
= short_type_node
;
16215 /* If t1 is a constant int and t2 is of type byte, short or char
16216 and t1's value fits in t2, then the resulting type is t2 */
16217 else if
((t1
== int_type_node
&& TREE_CONSTANT
(TREE_OPERAND
(node
, 1)))
16218 && JBSC_TYPE_P
(t2
) && int_fits_type_p
(TREE_OPERAND
(node
, 1), t2
))
16219 resulting_type
= t2
;
16221 /* If t2 is a constant int and t1 is of type byte, short or char
16222 and t2's value fits in t1, then the resulting type is t1 */
16223 else if
((t2
== int_type_node
&& TREE_CONSTANT
(TREE_OPERAND
(node
, 2)))
16224 && JBSC_TYPE_P
(t1
) && int_fits_type_p
(TREE_OPERAND
(node
, 2), t1
))
16225 resulting_type
= t1
;
16227 /* Otherwise, binary numeric promotion is applied and the
16228 resulting type is the promoted type of operand 1 and 2 */
16230 resulting_type
= binary_numeric_promotion
(t1
, t2
,
16231 &TREE_OPERAND
(node
, 1),
16232 &TREE_OPERAND
(node
, 2));
16235 /* Cases of a reference and a null type */
16236 else if
(JREFERENCE_TYPE_P
(t1
) && op2
== null_pointer_node
)
16237 resulting_type
= t1
;
16239 else if
(JREFERENCE_TYPE_P
(t2
) && op1
== null_pointer_node
)
16240 resulting_type
= t2
;
16242 /* Last case: different reference types. If a type can be converted
16243 into the other one by assignment conversion, the latter
16244 determines the type of the expression */
16245 else if
((resulting_type
= try_reference_assignconv
(t1
, op2
)))
16246 resulting_type
= promote_type
(t1
);
16248 else if
((resulting_type
= try_reference_assignconv
(t2
, op1
)))
16249 resulting_type
= promote_type
(t2
);
16251 /* If we don't have any resulting type, we're in trouble */
16252 if
(!resulting_type
)
16254 char *t
= xstrdup
(lang_printable_name
(t1
, 0));
16255 SET_WFL_OPERATOR
(wfl_operator
, node
, wfl_op1
);
16256 parse_error_context
(wfl_operator
,
16257 "Incompatible type for %<?:%>. Can't convert %qs to %qs",
16258 t
, lang_printable_name
(t2
, 0));
16265 TREE_TYPE
(node
) = error_mark_node
;
16266 return error_mark_node
;
16269 TREE_TYPE
(node
) = resulting_type
;
16270 TREE_SET_CODE
(node
, COND_EXPR
);
16271 CAN_COMPLETE_NORMALLY
(node
) = 1;
16275 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
16278 maybe_build_class_init_for_field
(tree decl
, tree expr
)
16280 tree clas
= DECL_CONTEXT
(decl
);
16281 if
(flag_emit_class_files
)
16284 if
(TREE_CODE
(decl
) == VAR_DECL
&& FIELD_STATIC
(decl
)
16285 && FIELD_FINAL
(decl
))
16287 tree init
= DECL_INITIAL
(decl
);
16288 if
(init
!= NULL_TREE
)
16289 init
= fold_constant_for_init
(init
, decl
);
16290 if
(init
!= NULL_TREE
&& CONSTANT_VALUE_P
(init
))
16294 return build_class_init
(clas
, expr
);
16297 /* Try to constant fold NODE.
16298 If NODE is not a constant expression, return NULL_EXPR.
16299 CONTEXT is a static final VAR_DECL whose initializer we are folding. */
16302 fold_constant_for_init
(tree node
, tree context
)
16304 tree op0
, op1
, val
;
16305 enum tree_code code
= TREE_CODE
(node
);
16310 if
(node
== null_pointer_node
)
16319 case TRUNC_MOD_EXPR
:
16327 case TRUTH_ANDIF_EXPR
:
16328 case TRUTH_ORIF_EXPR
:
16335 op0
= TREE_OPERAND
(node
, 0);
16336 op1
= TREE_OPERAND
(node
, 1);
16337 val
= fold_constant_for_init
(op0
, context
);
16338 if
(val
== NULL_TREE ||
! TREE_CONSTANT
(val
))
16340 TREE_OPERAND
(node
, 0) = val
;
16341 val
= fold_constant_for_init
(op1
, context
);
16342 if
(val
== NULL_TREE ||
! TREE_CONSTANT
(val
))
16344 TREE_OPERAND
(node
, 1) = val
;
16345 return patch_binop
(node
, op0
, op1
, 1);
16347 case UNARY_PLUS_EXPR
:
16349 case TRUTH_NOT_EXPR
:
16353 op0
= TREE_OPERAND
(node
, 0);
16354 val
= fold_constant_for_init
(op0
, context
);
16355 if
(val
== NULL_TREE ||
! TREE_CONSTANT
(val
))
16357 TREE_OPERAND
(node
, 0) = val
;
16358 val
= patch_unaryop
(node
, op0
);
16359 if
(! TREE_CONSTANT
(val
))
16366 val
= fold_constant_for_init
(TREE_OPERAND
(node
, 0), context
);
16367 if
(val
== NULL_TREE ||
! TREE_CONSTANT
(val
))
16369 TREE_OPERAND
(node
, 0) = val
;
16370 val
= fold_constant_for_init
(TREE_OPERAND
(node
, 1), context
);
16371 if
(val
== NULL_TREE ||
! TREE_CONSTANT
(val
))
16373 TREE_OPERAND
(node
, 1) = val
;
16374 val
= fold_constant_for_init
(TREE_OPERAND
(node
, 2), context
);
16375 if
(val
== NULL_TREE ||
! TREE_CONSTANT
(val
))
16377 TREE_OPERAND
(node
, 2) = val
;
16378 return integer_zerop
(TREE_OPERAND
(node
, 0)) ? TREE_OPERAND
(node
, 2)
16379 : TREE_OPERAND
(node
, 1);
16383 if
(! FIELD_FINAL
(node
)
16384 || DECL_INITIAL
(node
) == NULL_TREE
)
16386 val
= DECL_INITIAL
(node
);
16387 /* Guard against infinite recursion. */
16388 DECL_INITIAL
(node
) = NULL_TREE
;
16389 val
= fold_constant_for_init
(val
, node
);
16390 if
(val
!= NULL_TREE
&& TREE_CODE
(val
) != STRING_CST
)
16391 val
= try_builtin_assignconv
(NULL_TREE
, TREE_TYPE
(node
), val
);
16392 DECL_INITIAL
(node
) = val
;
16395 case EXPR_WITH_FILE_LOCATION
:
16396 /* Compare java_complete_tree and resolve_expression_name. */
16397 if
(!EXPR_WFL_NODE
(node
) /* Or a PRIMARY flag ? */
16398 || TREE_CODE
(EXPR_WFL_NODE
(node
)) == IDENTIFIER_NODE
)
16400 tree name
= EXPR_WFL_NODE
(node
);
16402 if
(PRIMARY_P
(node
))
16404 else if
(! QUALIFIED_P
(name
))
16406 decl
= lookup_field_wrapper
(DECL_CONTEXT
(context
), name
);
16407 if
(decl
== NULL_TREE
16408 ||
(! FIELD_STATIC
(decl
) && ! FIELD_FINAL
(decl
)))
16410 return fold_constant_for_init
(decl
, decl
);
16414 tree r
= NULL_TREE
;
16415 /* Install the proper context for the field resolution. */
16416 tree saved_current_class
= current_class
;
16417 /* Wait until the USE_COMPONENT_REF re-write. FIXME. */
16418 current_class
= DECL_CONTEXT
(context
);
16419 qualify_ambiguous_name
(node
);
16420 r
= resolve_field_access
(node
, &decl
, NULL
);
16421 /* Restore prior context. */
16422 current_class
= saved_current_class
;
16423 if
(r
!= error_mark_node
&& decl
!= NULL_TREE
)
16424 return fold_constant_for_init
(decl
, decl
);
16430 op0
= TREE_OPERAND
(node
, 0);
16431 val
= fold_constant_for_init
(op0
, context
);
16432 if
(val
== NULL_TREE ||
! TREE_CONSTANT
(val
))
16434 TREE_OPERAND
(node
, 0) = val
;
16438 #ifdef USE_COMPONENT_REF
16440 case COMPONENT_REF
:
16449 #ifdef USE_COMPONENT_REF
16450 /* Context is 'T' for TypeName, 'P' for PackageName,
16451 'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16454 resolve_simple_name
(tree name
, int context
)
16459 resolve_qualified_name
(tree name
, int context
)
16465 init_src_parse
(void)
16467 /* Sanity check; we've been bit by this before. */
16468 if
(ARRAY_SIZE
(ctxp
->modifier_ctx
) != MODIFIER_TK
- PUBLIC_TK
)
16474 /* This section deals with the functions that are called when tables
16475 recording class initialization information are traversed. */
16477 /* This function is called for each class that is known definitely
16478 initialized when a given static method was called. This function
16479 augments a compound expression (INFO) storing all assignment to
16480 initialized static class flags if a flag already existed, otherwise
16481 a new one is created. */
16484 emit_test_initialization
(void **entry_p
, void *info
)
16486 tree l
= (tree
) info
;
16488 tree key
= (tree
) *entry_p
;
16490 htab_t cf_ht
= DECL_FUNCTION_INIT_TEST_TABLE
(current_function_decl
);
16492 /* If we haven't found a flag and we're dealing with self registered
16493 with current_function_decl, then don't do anything. Self is
16494 always added as definitely initialized but this information is
16495 valid only if used outside the current function. */
16496 if
(current_function_decl
== TREE_PURPOSE
(l
)
16497 && java_treetreehash_find
(cf_ht
, key
) == NULL
)
16500 ite
= java_treetreehash_new
(cf_ht
, key
);
16502 /* If we don't have a variable, create one and install it. */
16507 decl
= build_decl
(VAR_DECL
, NULL_TREE
, boolean_type_node
);
16508 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC
(decl
);
16509 LOCAL_CLASS_INITIALIZATION_FLAG
(decl
) = 1;
16510 DECL_CONTEXT
(decl
) = current_function_decl
;
16511 DECL_INITIAL
(decl
) = boolean_true_node
;
16512 /* Don't emit any symbolic debugging info for this decl. */
16513 DECL_IGNORED_P
(decl
) = 1;
16515 /* The trick is to find the right context for it. */
16516 block
= BLOCK_SUBBLOCKS
(GET_CURRENT_BLOCK
(current_function_decl
));
16517 TREE_CHAIN
(decl
) = BLOCK_EXPR_DECLS
(block
);
16518 BLOCK_EXPR_DECLS
(block
) = decl
;
16524 /* Now simply augment the compound that holds all the assignments
16525 pertaining to this method invocation. */
16526 init
= build2
(MODIFY_EXPR
, boolean_type_node
, decl
, boolean_true_node
);
16527 TREE_SIDE_EFFECTS
(init
) = 1;
16528 TREE_VALUE
(l
) = add_stmt_to_compound
(TREE_VALUE
(l
), void_type_node
, init
);
16529 TREE_SIDE_EFFECTS
(TREE_VALUE
(l
)) = 1;
16534 #ifdef __XGETTEXT__
16535 /* Depending on the version of Bison used to compile this grammar,
16536 it may issue generic diagnostics spelled "syntax error" or
16537 "parse error". To prevent this from changing the translation
16538 template randomly, we list all the variants of this particular
16539 diagnostic here. Translators: there is no fine distinction
16540 between diagnostics with "syntax error" in them, and diagnostics
16541 with "parse error" in them. It's okay to give them both the same
16543 const char d1
[] = N_
("syntax error");
16544 const char d2
[] = N_
("parse error");
16545 const char d3
[] = N_
("syntax error; also virtual memory exhausted");
16546 const char d4
[] = N_
("parse error; also virtual memory exhausted");
16547 const char d5
[] = N_
("syntax error: cannot back up");
16548 const char d6
[] = N_
("parse error: cannot back up");
16551 #include "gt-java-parse.h"
16552 #include "gtype-java.h"