OSDN Git Service

* parse.y (build_super_invocation): Adjust declaration order to
[pf3gnuchains/gcc-fork.git] / gcc / java / parse.y
1 /* Source code parsing and tree node generation for the GNU compiler
2    for the Java(TM) language.
3    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
4    Free Software Foundation, Inc.
5    Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
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.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING.  If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA.
23
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.  */
27
28 /* This file parses java source code and issues a tree node image
29 suitable for code generation (byte code and targeted CPU assembly
30 language).
31
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"
35
36 The following modifications were brought to the original grammar:
37
38 method_body: added the rule '| block SC_TK'
39 static_initializer: added the rule 'static block SC_TK'.
40
41 Note: All the extra rules described above should go away when the
42       empty_statement rule will work.
43
44 statement_nsi: 'nsi' should be read no_short_if.
45
46 Some rules have been modified to support JDK1.1 inner classes
47 definitions and other extensions.  */
48
49 %{
50 #include "config.h"
51 #include "system.h"
52 #include "coretypes.h"
53 #include "tm.h"
54 #include <dirent.h>
55 #include "tree.h"
56 #include "rtl.h"
57 #include "real.h"
58 #include "obstack.h"
59 #include "toplev.h"
60 #include "flags.h"
61 #include "java-tree.h"
62 #include "jcf.h"
63 #include "lex.h"
64 #include "parse.h"
65 #include "zipfile.h"
66 #include "convert.h"
67 #include "buffer.h"
68 #include "xref.h"
69 #include "function.h"
70 #include "except.h"
71 #include "ggc.h"
72 #include "debug.h"
73 #include "tree-inline.h"
74 #include "cgraph.h"
75 #include "target.h"
76
77 /* Local function prototypes */
78 static char *java_accstring_lookup (int);
79 static const char *accessibility_string (int);
80 static void  classitf_redefinition_error (const char *,tree, tree, tree);
81 static void  variable_redefinition_error (tree, tree, tree, int);
82 static tree  create_class (int, tree, tree, tree);
83 static tree  create_interface (int, tree, tree);
84 static void  end_class_declaration (int);
85 static tree  find_field (tree, tree);
86 static tree lookup_field_wrapper (tree, tree);
87 static int   duplicate_declaration_error_p (tree, tree, tree);
88 static void  register_fields (int, tree, tree);
89 static tree parser_qualified_classname (tree);
90 static int  parser_check_super (tree, tree, tree);
91 static int  parser_check_super_interface (tree, tree, tree);
92 static void check_modifiers_consistency (int);
93 static tree lookup_cl (tree);
94 static tree lookup_java_method2 (tree, tree, int);
95 static tree method_header (int, tree, tree, tree);
96 static void fix_method_argument_names (tree ,tree);
97 static tree method_declarator (tree, tree);
98 static void parse_warning_context (tree cl, const char *msg, ...)
99   ATTRIBUTE_PRINTF_2;
100 static void issue_warning_error_from_context (tree, const char *msg, va_list)
101   ATTRIBUTE_PRINTF (2, 0);
102 static void parse_ctor_invocation_error (void);
103 static tree parse_jdk1_1_error (const char *);
104 static void complete_class_report_errors (jdep *);
105 static int process_imports (void);
106 static void read_import_dir (tree);
107 static int find_in_imports_on_demand (tree, tree);
108 static void find_in_imports (tree, tree);
109 static void check_inner_class_access (tree, tree, tree);
110 static int check_pkg_class_access (tree, tree, bool, tree);
111 static void register_package (tree);
112 static tree resolve_package (tree, tree *, tree *);
113 static tree resolve_class (tree, tree, tree, tree);
114 static void declare_local_variables (int, tree, tree);
115 static void dump_java_tree (enum tree_dump_index, tree);
116 static void source_start_java_method (tree);
117 static void source_end_java_method (void);
118 static tree find_name_in_single_imports (tree);
119 static void check_abstract_method_header (tree);
120 static tree lookup_java_interface_method2 (tree, tree);
121 static tree resolve_expression_name (tree, tree *);
122 static tree maybe_create_class_interface_decl (tree, tree, tree, tree);
123 static int check_class_interface_creation (int, int, tree, tree, tree, tree);
124 static tree patch_method_invocation (tree, tree, tree, int, int *, tree *);
125 static tree resolve_and_layout (tree, tree);
126 static tree qualify_and_find (tree, tree, tree);
127 static tree resolve_no_layout (tree, tree);
128 static int invocation_mode (tree, int);
129 static tree find_applicable_accessible_methods_list (int, tree, tree, tree);
130 static void search_applicable_methods_list (int, tree, tree, tree, tree *, tree *);
131 static tree find_most_specific_methods_list (tree);
132 static int argument_types_convertible (tree, tree);
133 static tree patch_invoke (tree, tree, tree);
134 static int maybe_use_access_method (int, tree *, tree *);
135 static tree lookup_method_invoke (int, tree, tree, tree, tree);
136 static tree register_incomplete_type (int, tree, tree, tree);
137 static tree check_inner_circular_reference (tree, tree);
138 static tree check_circular_reference (tree);
139 static tree obtain_incomplete_type (tree);
140 static tree java_complete_lhs (tree);
141 static tree java_complete_tree (tree);
142 static tree maybe_generate_pre_expand_clinit (tree);
143 static int analyze_clinit_body (tree, tree);
144 static int maybe_yank_clinit (tree);
145 static void start_complete_expand_method (tree);
146 static void java_complete_expand_method (tree);
147 static void java_expand_method_bodies (tree);
148 static int  unresolved_type_p (tree, tree *);
149 static void create_jdep_list (struct parser_ctxt *);
150 static tree build_expr_block (tree, tree);
151 static tree enter_block (void);
152 static tree exit_block (void);
153 static tree lookup_name_in_blocks (tree);
154 static void maybe_absorb_scoping_blocks (void);
155 static tree build_method_invocation (tree, tree);
156 static tree build_new_invocation (tree, tree);
157 static tree build_assignment (int, int, tree, tree);
158 static tree build_binop (enum tree_code, int, tree, tree);
159 static tree patch_assignment (tree, tree);
160 static tree patch_binop (tree, tree, tree);
161 static tree build_unaryop (int, int, tree);
162 static tree build_incdec (int, int, tree, int);
163 static tree patch_unaryop (tree, tree);
164 static tree build_cast (int, tree, tree);
165 static tree build_null_of_type (tree);
166 static tree patch_cast (tree, tree);
167 static int valid_ref_assignconv_cast_p (tree, tree, int);
168 static int valid_builtin_assignconv_identity_widening_p (tree, tree);
169 static int valid_cast_to_p (tree, tree);
170 static int valid_method_invocation_conversion_p (tree, tree);
171 static tree try_builtin_assignconv (tree, tree, tree);
172 static tree try_reference_assignconv (tree, tree);
173 static tree build_unresolved_array_type (tree);
174 static int build_type_name_from_array_name (tree, tree *);
175 static tree build_array_from_name (tree, tree, tree, tree *);
176 static tree build_array_ref (int, tree, tree);
177 static tree patch_array_ref (tree);
178 static tree make_qualified_name (tree, tree, int);
179 static tree merge_qualified_name (tree, tree);
180 static tree make_qualified_primary (tree, tree, int);
181 static int resolve_qualified_expression_name (tree, tree *, tree *, tree *);
182 static void qualify_ambiguous_name (tree);
183 static tree resolve_field_access (tree, tree *, tree *);
184 static tree build_newarray_node (tree, tree, int);
185 static tree patch_newarray (tree);
186 static tree resolve_type_during_patch (tree);
187 static tree build_this (int);
188 static tree build_wfl_wrap (tree, int);
189 static tree build_return (int, tree);
190 static tree patch_return (tree);
191 static tree maybe_access_field (tree, tree, tree);
192 static int complete_function_arguments (tree);
193 static int check_for_static_method_reference (tree, tree, tree, tree, tree);
194 static int not_accessible_p (tree, tree, tree, int);
195 static void check_deprecation (tree, tree);
196 static int class_in_current_package (tree);
197 static tree build_if_else_statement (int, tree, tree, tree);
198 static tree patch_if_else_statement (tree);
199 static tree add_stmt_to_block (tree, tree, tree);
200 static tree patch_exit_expr (tree);
201 static tree build_labeled_block (int, tree);
202 static tree finish_labeled_statement (tree, tree);
203 static tree build_bc_statement (int, int, tree);
204 static tree patch_bc_statement (tree);
205 static tree patch_loop_statement (tree);
206 static tree build_new_loop (tree);
207 static tree build_loop_body (int, tree, int);
208 static tree finish_loop_body (int, tree, tree, int);
209 static tree build_debugable_stmt (int, tree);
210 static tree finish_for_loop (int, tree, tree, tree);
211 static tree patch_switch_statement (tree);
212 static tree string_constant_concatenation (tree, tree);
213 static tree build_string_concatenation (tree, tree);
214 static tree patch_string_cst (tree);
215 static tree patch_string (tree);
216 static tree encapsulate_with_try_catch (int, tree, tree, tree);
217 static tree build_assertion (int, tree, tree);
218 static tree build_try_statement (int, tree, tree);
219 static tree build_try_finally_statement (int, tree, tree);
220 static tree patch_try_statement (tree);
221 static tree patch_synchronized_statement (tree, tree);
222 static tree patch_throw_statement (tree, tree);
223 static void check_thrown_exceptions (int, tree, tree);
224 static int check_thrown_exceptions_do (tree);
225 static void purge_unchecked_exceptions (tree);
226 static bool ctors_unchecked_throws_clause_p (tree);
227 static void check_concrete_throws_clauses (tree, tree, tree, tree);
228 static void check_throws_clauses (tree, tree, tree);
229 static void finish_method_declaration (tree);
230 static tree build_super_invocation (tree);
231 static int verify_constructor_circularity (tree, tree);
232 static char *constructor_circularity_msg (tree, tree);
233 static tree build_this_super_qualified_invocation (int, tree, tree, int, int);
234 static const char *get_printable_method_name (tree);
235 static tree patch_conditional_expr (tree, tree, tree);
236 static tree generate_finit (tree);
237 static tree generate_instinit (tree);
238 static tree build_instinit_invocation (tree);
239 static void fix_constructors (tree);
240 static tree build_alias_initializer_parameter_list (int, tree, tree, int *);
241 static tree craft_constructor (tree, tree);
242 static int verify_constructor_super (tree);
243 static tree create_artificial_method (tree, int, tree, tree, tree);
244 static void start_artificial_method_body (tree);
245 static void end_artificial_method_body (tree);
246 static int check_method_redefinition (tree, tree);
247 static int check_method_types_complete (tree);
248 static bool hack_is_accessible_p (tree, tree);
249 static void java_check_regular_methods (tree);
250 static void check_interface_throws_clauses (tree, tree);
251 static void java_check_abstract_methods (tree);
252 static void unreachable_stmt_error (tree);
253 static int not_accessible_field_error (tree, tree);
254 static tree find_expr_with_wfl (tree);
255 static void missing_return_error (tree);
256 static tree build_new_array_init (int, tree);
257 static tree patch_new_array_init (tree, tree);
258 static tree maybe_build_array_element_wfl (tree);
259 static int array_constructor_check_entry (tree, tree);
260 static const char *purify_type_name (const char *);
261 static tree fold_constant_for_init (tree, tree);
262 static tree strip_out_static_field_access_decl (tree);
263 static jdeplist *reverse_jdep_list (struct parser_ctxt *);
264 static void static_ref_err (tree, tree, tree);
265 static void parser_add_interface (tree, tree, tree);
266 static void add_superinterfaces (tree, tree);
267 static tree jdep_resolve_class (jdep *);
268 static int note_possible_classname (const char *, int);
269 static void java_complete_expand_classes (void);
270 static void java_complete_expand_class (tree);
271 static void java_complete_expand_methods (tree);
272 static tree cut_identifier_in_qualified (tree);
273 static tree java_stabilize_reference (tree);
274 static tree do_unary_numeric_promotion (tree);
275 static char * operator_string (tree);
276 static tree do_merge_string_cste (tree, const char *, int, int);
277 static tree merge_string_cste (tree, tree, int);
278 static tree java_refold (tree);
279 static int java_decl_equiv (tree, tree);
280 static int binop_compound_p (enum tree_code);
281 static tree search_loop (tree);
282 static int labeled_block_contains_loop_p (tree, tree);
283 static int check_abstract_method_definitions (int, tree, tree);
284 static void java_check_abstract_method_definitions (tree);
285 static void java_debug_context_do (int);
286 static void java_parser_context_push_initialized_field (void);
287 static void java_parser_context_pop_initialized_field (void);
288 static tree reorder_static_initialized (tree);
289 static void java_parser_context_suspend (void);
290 static void java_parser_context_resume (void);
291 static int pop_current_osb (struct parser_ctxt *);
292
293 /* JDK 1.1 work. FIXME */
294
295 static tree maybe_make_nested_class_name (tree);
296 static int make_nested_class_name (tree);
297 static void link_nested_class_to_enclosing (void);
298 static tree resolve_inner_class (htab_t, tree, tree *, tree *, tree);
299 static tree find_as_inner_class (tree, tree, tree);
300 static tree find_as_inner_class_do (tree, tree);
301 static int check_inner_class_redefinition (tree, tree);
302
303 static tree build_thisn_assign (void);
304 static tree build_current_thisn (tree);
305 static tree build_access_to_thisn (tree, tree, int);
306 static tree maybe_build_thisn_access_method (tree);
307
308 static tree build_outer_field_access (tree, tree);
309 static tree build_outer_field_access_methods (tree);
310 static tree build_outer_field_access_expr (int, tree, tree,
311                                                   tree, tree);
312 static tree build_outer_method_access_method (tree);
313 static tree build_new_access_id (void);
314 static tree build_outer_field_access_method (tree, tree, tree,
315                                                     tree, tree);
316
317 static int outer_field_access_p (tree, tree);
318 static int outer_field_expanded_access_p (tree, tree *,
319                                                  tree *, tree *);
320 static tree outer_field_access_fix (tree, tree, tree);
321 static tree build_incomplete_class_ref (int, tree);
322 static tree patch_incomplete_class_ref (tree);
323 static tree create_anonymous_class (tree);
324 static void patch_anonymous_class (tree, tree, tree);
325 static void add_inner_class_fields (tree, tree);
326
327 static tree build_dot_class_method (tree);
328 static tree build_dot_class_method_invocation (tree, tree);
329 static void create_new_parser_context (int);
330 static tree maybe_build_class_init_for_field (tree, tree);
331
332 static int attach_init_test_initialization_flags (void **, void *);
333 static int emit_test_initialization (void **, void *);
334
335 static char *string_convert_int_cst (tree);
336
337 /* Number of error found so far. */
338 int java_error_count;
339 /* Number of warning found so far. */
340 int java_warning_count;
341 /* Tell when not to fold, when doing xrefs */
342 int do_not_fold;
343 /* Cyclic inheritance report, as it can be set by layout_class */
344 const char *cyclic_inheritance_report;
345
346 /* The current parser context */
347 struct parser_ctxt *ctxp;
348
349 /* List of things that were analyzed for which code will be generated */
350 struct parser_ctxt *ctxp_for_generation = NULL;
351
352 /* binop_lookup maps token to tree_code. It is used where binary
353    operations are involved and required by the parser. RDIV_EXPR
354    covers both integral/floating point division. The code is changed
355    once the type of both operator is worked out.  */
356
357 static const enum tree_code binop_lookup[19] =
358   {
359     PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR,
360     LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR,
361     BIT_AND_EXPR, BIT_XOR_EXPR, BIT_IOR_EXPR,
362     TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR,
363     EQ_EXPR, NE_EXPR, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR,
364    };
365 #define BINOP_LOOKUP(VALUE)                                             \
366   binop_lookup [((VALUE) - PLUS_TK) % ARRAY_SIZE (binop_lookup)]
367
368 /* This is the end index for binary operators that can also be used
369    in compound assignments. */
370 #define BINOP_COMPOUND_CANDIDATES 11
371
372 /* The "$L" identifier we use to create labels.  */
373 static GTY(()) tree label_id;
374
375 /* The "StringBuffer" identifier used for the String `+' operator. */
376 static GTY(()) tree wfl_string_buffer;
377
378 /* The "append" identifier used for String `+' operator.  */
379 static GTY(()) tree wfl_append;
380
381 /* The "toString" identifier used for String `+' operator. */
382 static GTY(()) tree wfl_to_string;
383
384 /* The "java.lang" import qualified name.  */
385 static GTY(()) tree java_lang_id;
386
387 /* The generated `inst$' identifier used for generated enclosing
388    instance/field access functions.  */
389 static GTY(()) tree inst_id;
390
391 /* Context and flag for static blocks */
392 static GTY(()) tree current_static_block;
393
394 /* The generated `write_parm_value$' identifier.  */
395 static GTY(()) tree wpv_id;
396
397 /* The list of all packages we've seen so far */
398 static GTY(()) tree package_list;
399
400 /* Hold THIS for the scope of the current method decl.  */
401 static GTY(()) tree current_this;
402
403 /* Hold a list of catch clauses list. The first element of this list is
404    the list of the catch clauses of the currently analyzed try block. */
405 static GTY(()) tree currently_caught_type_list;
406
407 /* This holds a linked list of all the case labels for the current
408    switch statement.  It is only used when checking to see if there
409    are duplicate labels.  FIXME: probably this should just be attached
410    to the switch itself; then it could be referenced via
411    `ctxp->current_loop'.  */
412 static GTY(()) tree case_label_list;
413
414 /* Anonymous class counter. Will be reset to 1 every time a non
415    anonymous class gets created. */
416 static int anonymous_class_counter = 1;
417
418 static GTY(()) tree src_parse_roots[1];
419
420 /* All classes seen from source code */
421 #define gclass_list src_parse_roots[0]
422
423 /* Check modifiers. If one doesn't fit, retrieve it in its declaration
424    line and point it out.  */
425 /* Should point out the one that don't fit. ASCII/unicode, going
426    backward. FIXME */
427
428 #define check_modifiers(__message, __value, __mask) do {        \
429   if ((__value) & ~(__mask))                                    \
430     {                                                           \
431       size_t i, remainder = (__value) & ~(__mask);              \
432       for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)     \
433         if ((1 << i) & remainder)                               \
434           parse_error_context (ctxp->modifier_ctx [i], (__message), \
435                                java_accstring_lookup (1 << i)); \
436     }                                                           \
437 } while (0)
438
439 %}
440
441 %union {
442   tree node;
443   int sub_token;
444   struct {
445     int token;
446     int location;
447   } operator;
448   int value;
449 }
450
451 %{
452 #include "lex.c"
453 %}
454
455 %pure_parser
456
457 /* Things defined here have to match the order of what's in the
458    binop_lookup table.  */
459
460 %token   PLUS_TK         MINUS_TK        MULT_TK         DIV_TK    REM_TK
461 %token   LS_TK           SRS_TK          ZRS_TK
462 %token   AND_TK          XOR_TK          OR_TK
463 %token   BOOL_AND_TK BOOL_OR_TK
464 %token   EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
465
466 /* This maps to the same binop_lookup entry than the token above */
467
468 %token   PLUS_ASSIGN_TK  MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
469 %token   REM_ASSIGN_TK
470 %token   LS_ASSIGN_TK    SRS_ASSIGN_TK   ZRS_ASSIGN_TK
471 %token   AND_ASSIGN_TK   XOR_ASSIGN_TK   OR_ASSIGN_TK
472
473
474 /* Modifier TOKEN have to be kept in this order. Don't scramble it */
475
476 %token   PUBLIC_TK       PRIVATE_TK         PROTECTED_TK
477 %token   STATIC_TK       FINAL_TK           SYNCHRONIZED_TK
478 %token   VOLATILE_TK     TRANSIENT_TK       NATIVE_TK
479 %token   PAD_TK          ABSTRACT_TK        STRICT_TK
480 %token   MODIFIER_TK
481
482 /* Keep those two in order, too */
483 %token   DECR_TK INCR_TK
484
485 /* From now one, things can be in any order */
486
487 %token   DEFAULT_TK      IF_TK              THROW_TK
488 %token   BOOLEAN_TK      DO_TK              IMPLEMENTS_TK
489 %token   THROWS_TK       BREAK_TK           IMPORT_TK
490 %token   ELSE_TK         INSTANCEOF_TK      RETURN_TK
491 %token   VOID_TK         CATCH_TK           INTERFACE_TK
492 %token   CASE_TK         EXTENDS_TK         FINALLY_TK
493 %token   SUPER_TK        WHILE_TK           CLASS_TK
494 %token   SWITCH_TK       CONST_TK           TRY_TK
495 %token   FOR_TK          NEW_TK             CONTINUE_TK
496 %token   GOTO_TK         PACKAGE_TK         THIS_TK
497 %token   ASSERT_TK
498
499 %token   BYTE_TK         SHORT_TK           INT_TK            LONG_TK
500 %token   CHAR_TK         INTEGRAL_TK
501
502 %token   FLOAT_TK        DOUBLE_TK          FP_TK
503
504 %token   ID_TK
505
506 %token   REL_QM_TK         REL_CL_TK NOT_TK  NEG_TK
507
508 %token   ASSIGN_ANY_TK   ASSIGN_TK
509 %token   OP_TK  CP_TK  OCB_TK  CCB_TK  OSB_TK  CSB_TK  SC_TK  C_TK DOT_TK
510
511 %token   STRING_LIT_TK   CHAR_LIT_TK        INT_LIT_TK        FP_LIT_TK
512 %token   TRUE_TK         FALSE_TK           BOOL_LIT_TK       NULL_TK
513
514 %type    <value>        modifiers MODIFIER_TK final synchronized
515
516 %type    <node>         super ID_TK identifier
517 %type    <node>         name simple_name qualified_name
518 %type    <node>         type_declaration compilation_unit
519                         field_declaration method_declaration extends_interfaces
520                         interfaces interface_type_list
521                         import_declarations package_declaration
522                         type_declarations interface_body
523                         interface_member_declaration constant_declaration
524                         interface_member_declarations interface_type
525                         abstract_method_declaration
526 %type    <node>         class_body_declaration class_member_declaration
527                         static_initializer constructor_declaration block
528 %type    <node>         class_body_declarations constructor_header
529 %type    <node>         class_or_interface_type class_type class_type_list
530                         constructor_declarator explicit_constructor_invocation
531 %type    <node>         dim_expr dim_exprs this_or_super throws
532
533 %type    <node>         variable_declarator_id variable_declarator
534                         variable_declarators variable_initializer
535                         variable_initializers constructor_body
536                         array_initializer
537
538 %type    <node>         class_body block_end constructor_block_end
539 %type    <node>         statement statement_without_trailing_substatement
540                         labeled_statement if_then_statement label_decl
541                         if_then_else_statement while_statement for_statement
542                         statement_nsi labeled_statement_nsi do_statement
543                         if_then_else_statement_nsi while_statement_nsi
544                         for_statement_nsi statement_expression_list for_init
545                         for_update statement_expression expression_statement
546                         primary_no_new_array expression primary
547                         array_creation_expression array_type
548                         class_instance_creation_expression field_access
549                         method_invocation array_access something_dot_new
550                         argument_list postfix_expression while_expression
551                         post_increment_expression post_decrement_expression
552                         unary_expression_not_plus_minus unary_expression
553                         pre_increment_expression pre_decrement_expression
554                         cast_expression
555                         multiplicative_expression additive_expression
556                         shift_expression relational_expression
557                         equality_expression and_expression
558                         exclusive_or_expression inclusive_or_expression
559                         conditional_and_expression conditional_or_expression
560                         conditional_expression assignment_expression
561                         left_hand_side assignment for_header for_begin
562                         constant_expression do_statement_begin empty_statement
563                         switch_statement synchronized_statement throw_statement
564                         try_statement assert_statement
565                         switch_expression switch_block
566                         catches catch_clause catch_clause_parameter finally
567                         anonymous_class_creation trap_overflow_corner_case
568 %type    <node>         return_statement break_statement continue_statement
569
570 %type    <operator>     ASSIGN_TK      MULT_ASSIGN_TK  DIV_ASSIGN_TK
571 %type    <operator>     REM_ASSIGN_TK  PLUS_ASSIGN_TK  MINUS_ASSIGN_TK
572 %type    <operator>     LS_ASSIGN_TK   SRS_ASSIGN_TK   ZRS_ASSIGN_TK
573 %type    <operator>     AND_ASSIGN_TK  XOR_ASSIGN_TK   OR_ASSIGN_TK
574 %type    <operator>     ASSIGN_ANY_TK  assignment_operator
575 %token   <operator>     EQ_TK GTE_TK ZRS_TK SRS_TK GT_TK LTE_TK LS_TK
576 %token   <operator>     BOOL_AND_TK AND_TK BOOL_OR_TK OR_TK INCR_TK PLUS_TK
577 %token   <operator>     DECR_TK MINUS_TK MULT_TK DIV_TK XOR_TK REM_TK NEQ_TK
578 %token   <operator>     NEG_TK REL_QM_TK REL_CL_TK NOT_TK LT_TK OCB_TK CCB_TK
579 %token   <operator>     OP_TK OSB_TK DOT_TK THROW_TK INSTANCEOF_TK
580 %type    <operator>     THIS_TK SUPER_TK RETURN_TK BREAK_TK CONTINUE_TK
581 %type    <operator>     CASE_TK DEFAULT_TK TRY_TK CATCH_TK SYNCHRONIZED_TK
582 %type    <operator>     NEW_TK ASSERT_TK
583
584 %type    <node>         method_body
585
586 %type    <node>         literal INT_LIT_TK FP_LIT_TK BOOL_LIT_TK CHAR_LIT_TK
587                         STRING_LIT_TK NULL_TK VOID_TK
588
589 %type    <node>         IF_TK WHILE_TK FOR_TK
590
591 %type    <node>         formal_parameter_list formal_parameter
592                         method_declarator method_header
593
594 %type    <node>         primitive_type reference_type type
595                         BOOLEAN_TK INTEGRAL_TK FP_TK
596
597 /* Added or modified JDK 1.1 rule types  */
598 %type    <node>         type_literals
599
600 %%
601 /* 19.2 Production from 2.3: The Syntactic Grammar  */
602 goal:  compilation_unit
603                 {}
604 ;
605
606 /* 19.3 Productions from 3: Lexical structure  */
607 literal:
608         INT_LIT_TK
609 |       FP_LIT_TK
610 |       BOOL_LIT_TK
611 |       CHAR_LIT_TK
612 |       STRING_LIT_TK
613 |       NULL_TK
614 ;
615
616 /* 19.4 Productions from 4: Types, Values and Variables  */
617 type:
618         primitive_type
619 |       reference_type
620 ;
621
622 primitive_type:
623         INTEGRAL_TK
624 |       FP_TK
625 |       BOOLEAN_TK
626 ;
627
628 reference_type:
629         class_or_interface_type
630 |       array_type
631 ;
632
633 class_or_interface_type:
634         name
635 ;
636
637 class_type:
638         class_or_interface_type /* Default rule */
639 ;
640
641 interface_type:
642          class_or_interface_type
643 ;
644
645 array_type:
646         primitive_type dims
647                 {
648                   int osb = pop_current_osb (ctxp);
649                   tree t = build_java_array_type (($1), -1);
650                   while (--osb)
651                     t = build_unresolved_array_type (t);
652                   $$ = t;
653                 }
654 |       name dims
655                 {
656                   int osb = pop_current_osb (ctxp);
657                   tree t = $1;
658                   while (osb--)
659                     t = build_unresolved_array_type (t);
660                   $$ = t;
661                 }
662 ;
663
664 /* 19.5 Productions from 6: Names  */
665 name:
666         simple_name             /* Default rule */
667 |       qualified_name          /* Default rule */
668 ;
669
670 simple_name:
671         identifier              /* Default rule */
672 ;
673
674 qualified_name:
675         name DOT_TK identifier
676                 { $$ = make_qualified_name ($1, $3, $2.location); }
677 ;
678
679 identifier:
680         ID_TK
681 ;
682
683 /* 19.6: Production from 7: Packages  */
684 compilation_unit:
685                 {$$ = NULL;}
686 |       package_declaration
687 |       import_declarations
688 |       type_declarations
689 |       package_declaration import_declarations
690 |       package_declaration type_declarations
691 |       import_declarations type_declarations
692 |       package_declaration import_declarations type_declarations
693 ;
694
695 import_declarations:
696         import_declaration
697                 {
698                   $$ = NULL;
699                 }
700 |       import_declarations import_declaration
701                 {
702                   $$ = NULL;
703                 }
704 ;
705
706 type_declarations:
707         type_declaration
708 |       type_declarations type_declaration
709 ;
710
711 package_declaration:
712         PACKAGE_TK name SC_TK
713                 {
714                   ctxp->package = EXPR_WFL_NODE ($2);
715                   register_package (ctxp->package);
716                 }
717 |       PACKAGE_TK error
718                 {yyerror ("Missing name"); RECOVER;}
719 |       PACKAGE_TK name error
720                 {yyerror ("';' expected"); RECOVER;}
721 ;
722
723 import_declaration:
724         single_type_import_declaration
725 |       type_import_on_demand_declaration
726 ;
727
728 single_type_import_declaration:
729         IMPORT_TK name SC_TK
730                 {
731                   tree name = EXPR_WFL_NODE ($2), last_name;
732                   int   i = IDENTIFIER_LENGTH (name)-1;
733                   const char *last = &IDENTIFIER_POINTER (name)[i];
734                   while (last != IDENTIFIER_POINTER (name))
735                     {
736                       if (last [0] == '.')
737                         break;
738                       last--;
739                     }
740                   last_name = get_identifier (++last);
741                   if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (last_name))
742                     {
743                       tree err = find_name_in_single_imports (last_name);
744                       if (err && err != name)
745                         parse_error_context
746                           ($2, "Ambiguous class: `%s' and `%s'",
747                            IDENTIFIER_POINTER (name),
748                            IDENTIFIER_POINTER (err));
749                       else
750                         REGISTER_IMPORT ($2, last_name);
751                     }
752                   else
753                     REGISTER_IMPORT ($2, last_name);
754                 }
755 |       IMPORT_TK error
756                 {yyerror ("Missing name"); RECOVER;}
757 |       IMPORT_TK name error
758                 {yyerror ("';' expected"); RECOVER;}
759 ;
760
761 type_import_on_demand_declaration:
762         IMPORT_TK name DOT_TK MULT_TK SC_TK
763                 {
764                   tree name = EXPR_WFL_NODE ($2);
765                   tree it;
766                   /* Search for duplicates. */
767                   for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it))
768                     if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name)
769                       break;
770                   /* Don't import the same thing more than once, just ignore
771                      duplicates (7.5.2) */
772                   if (! it)
773                     {
774                       read_import_dir ($2);
775                       ctxp->import_demand_list =
776                         chainon (ctxp->import_demand_list,
777                                  build_tree_list ($2, NULL_TREE));
778                     }
779                 }
780 |       IMPORT_TK name DOT_TK error
781                 {yyerror ("'*' expected"); RECOVER;}
782 |       IMPORT_TK name DOT_TK MULT_TK error
783                 {yyerror ("';' expected"); RECOVER;}
784 ;
785
786 type_declaration:
787         class_declaration
788                 { end_class_declaration (0); }
789 |       interface_declaration
790                 { end_class_declaration (0); }
791 |       empty_statement
792 |       error
793                 {
794                   YYERROR_NOW;
795                   yyerror ("Class or interface declaration expected");
796                 }
797 ;
798
799 /* 19.7 Shortened from the original:
800    modifiers: modifier | modifiers modifier
801    modifier: any of public...  */
802 modifiers:
803         MODIFIER_TK
804                 {
805                   $$ = (1 << $1);
806                 }
807 |       modifiers MODIFIER_TK
808                 {
809                   int acc = (1 << $2);
810                   if ($$ & acc)
811                     parse_error_context
812                       (ctxp->modifier_ctx [$2], "Modifier `%s' declared twice",
813                        java_accstring_lookup (acc));
814                   else
815                     {
816                       $$ |= acc;
817                     }
818                 }
819 ;
820
821 /* 19.8.1 Production from $8.1: Class Declaration */
822 class_declaration:
823         modifiers CLASS_TK identifier super interfaces
824                 { create_class ($1, $3, $4, $5); }
825         class_body
826                 {;}
827 |       CLASS_TK identifier super interfaces
828                 { create_class (0, $2, $3, $4); }
829         class_body
830                 {;}
831 |       modifiers CLASS_TK error
832                 { yyerror ("Missing class name"); RECOVER; }
833 |       CLASS_TK error
834                 { yyerror ("Missing class name"); RECOVER; }
835 |       CLASS_TK identifier error
836                 {
837                   if (!ctxp->class_err) yyerror ("'{' expected");
838                   DRECOVER(class1);
839                 }
840 |       modifiers CLASS_TK identifier error
841                 { if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER; }
842 ;
843
844 super:
845                 { $$ = NULL; }
846 |       EXTENDS_TK class_type
847                 { $$ = $2; }
848 |       EXTENDS_TK class_type error
849                 {yyerror ("'{' expected"); ctxp->class_err=1;}
850 |       EXTENDS_TK error
851                 {yyerror ("Missing super class name"); ctxp->class_err=1;}
852 ;
853
854 interfaces:
855                 { $$ = NULL_TREE; }
856 |       IMPLEMENTS_TK interface_type_list
857                 { $$ = $2; }
858 |       IMPLEMENTS_TK error
859                 {
860                   ctxp->class_err=1;
861                   yyerror ("Missing interface name");
862                 }
863 ;
864
865 interface_type_list:
866         interface_type
867                 {
868                   ctxp->interface_number = 1;
869                   $$ = build_tree_list ($1, NULL_TREE);
870                 }
871 |       interface_type_list C_TK interface_type
872                 {
873                   ctxp->interface_number++;
874                   $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
875                 }
876 |       interface_type_list C_TK error
877                 {yyerror ("Missing interface name"); RECOVER;}
878 ;
879
880 class_body:
881         OCB_TK CCB_TK
882                 {
883                   /* Store the location of the `}' when doing xrefs */
884                   if (flag_emit_xref)
885                     DECL_END_SOURCE_LINE (GET_CPC ()) =
886                       EXPR_WFL_ADD_COL ($2.location, 1);
887                   $$ = GET_CPC ();
888                 }
889 |       OCB_TK class_body_declarations CCB_TK
890                 {
891                   /* Store the location of the `}' when doing xrefs */
892                   if (flag_emit_xref)
893                     DECL_END_SOURCE_LINE (GET_CPC ()) =
894                       EXPR_WFL_ADD_COL ($3.location, 1);
895                   $$ = GET_CPC ();
896                 }
897 ;
898
899 class_body_declarations:
900         class_body_declaration
901 |       class_body_declarations class_body_declaration
902 ;
903
904 class_body_declaration:
905         class_member_declaration
906 |       static_initializer
907 |       constructor_declaration
908 |       block                   /* Added, JDK1.1, instance initializer */
909                 {
910                   if (!IS_EMPTY_STMT ($1))
911                     {
912                       TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
913                       SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
914                     }
915                 }
916 ;
917
918 class_member_declaration:
919         field_declaration
920 |       method_declaration
921 |       class_declaration       /* Added, JDK1.1 inner classes */
922                 { end_class_declaration (1); }
923 |       interface_declaration   /* Added, JDK1.1 inner interfaces */
924                 { end_class_declaration (1); }
925 |       empty_statement
926 ;
927
928 /* 19.8.2 Productions from 8.3: Field Declarations  */
929 field_declaration:
930         type variable_declarators SC_TK
931                 { register_fields (0, $1, $2); }
932 |       modifiers type variable_declarators SC_TK
933                 {
934                   check_modifiers
935                     ("Illegal modifier `%s' for field declaration",
936                      $1, FIELD_MODIFIERS);
937                   check_modifiers_consistency ($1);
938                   register_fields ($1, $2, $3);
939                 }
940 ;
941
942 variable_declarators:
943         /* Should we use build_decl_list () instead ? FIXME */
944         variable_declarator     /* Default rule */
945 |       variable_declarators C_TK variable_declarator
946                 { $$ = chainon ($1, $3); }
947 |       variable_declarators C_TK error
948                 {yyerror ("Missing term"); RECOVER;}
949 ;
950
951 variable_declarator:
952         variable_declarator_id
953                 { $$ = build_tree_list ($1, NULL_TREE); }
954 |       variable_declarator_id ASSIGN_TK variable_initializer
955                 {
956                   if (java_error_count)
957                     $3 = NULL_TREE;
958                   $$ = build_tree_list
959                     ($1, build_assignment ($2.token, $2.location, $1, $3));
960                 }
961 |       variable_declarator_id ASSIGN_TK error
962                 {
963                   yyerror ("Missing variable initializer");
964                   $$ = build_tree_list ($1, NULL_TREE);
965                   RECOVER;
966                 }
967 |       variable_declarator_id ASSIGN_TK variable_initializer error
968                 {
969                   yyerror ("';' expected");
970                   $$ = build_tree_list ($1, NULL_TREE);
971                   RECOVER;
972                 }
973 ;
974
975 variable_declarator_id:
976         identifier
977 |       variable_declarator_id OSB_TK CSB_TK
978                 { $$ = build_unresolved_array_type ($1); }
979 |       identifier error
980                 {yyerror ("Invalid declaration"); DRECOVER(vdi);}
981 |       variable_declarator_id OSB_TK error
982                 {
983                   yyerror ("']' expected");
984                   DRECOVER(vdi);
985                 }
986 |       variable_declarator_id CSB_TK error
987                 {yyerror ("Unbalanced ']'"); DRECOVER(vdi);}
988 ;
989
990 variable_initializer:
991         expression
992 |       array_initializer
993 ;
994
995 /* 19.8.3 Productions from 8.4: Method Declarations  */
996 method_declaration:
997         method_header
998                 {
999                   current_function_decl = $1;
1000                   if (current_function_decl
1001                       && TREE_CODE (current_function_decl) == FUNCTION_DECL)
1002                     source_start_java_method (current_function_decl);
1003                   else
1004                     current_function_decl = NULL_TREE;
1005                 }
1006         method_body
1007                 { finish_method_declaration ($3); }
1008 |       method_header error
1009                 {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;}
1010 ;
1011
1012 method_header:
1013         type method_declarator throws
1014                 { $$ = method_header (0, $1, $2, $3); }
1015 |       VOID_TK method_declarator throws
1016                 { $$ = method_header (0, void_type_node, $2, $3); }
1017 |       modifiers type method_declarator throws
1018                 { $$ = method_header ($1, $2, $3, $4); }
1019 |       modifiers VOID_TK method_declarator throws
1020                 { $$ = method_header ($1, void_type_node, $3, $4); }
1021 |       type error
1022                 {
1023                   yyerror ("Invalid method declaration, method name required");
1024                   RECOVER;
1025                 }
1026 |       modifiers type error
1027                 {
1028                   yyerror ("Identifier expected");
1029                   RECOVER;
1030                 }
1031 |       VOID_TK error
1032                 {
1033                   yyerror ("Identifier expected");
1034                   RECOVER;
1035                 }
1036 |       modifiers VOID_TK error
1037                 {
1038                   yyerror ("Identifier expected");
1039                   RECOVER;
1040                 }
1041 |       modifiers error
1042                 {
1043                   yyerror ("Invalid method declaration, return type required");
1044                   RECOVER;
1045                 }
1046 ;
1047
1048 method_declarator:
1049         identifier OP_TK CP_TK
1050                 {
1051                   ctxp->formal_parameter_number = 0;
1052                   $$ = method_declarator ($1, NULL_TREE);
1053                 }
1054 |       identifier OP_TK formal_parameter_list CP_TK
1055                 { $$ = method_declarator ($1, $3); }
1056 |       method_declarator OSB_TK CSB_TK
1057                 {
1058                   EXPR_WFL_LINECOL (wfl_operator) = $2.location;
1059                   TREE_PURPOSE ($1) =
1060                     build_unresolved_array_type (TREE_PURPOSE ($1));
1061                   parse_warning_context
1062                     (wfl_operator,
1063                      "Discouraged form of returned type specification");
1064                 }
1065 |       identifier OP_TK error
1066                 {yyerror ("')' expected"); DRECOVER(method_declarator);}
1067 |       method_declarator OSB_TK error
1068                 {yyerror ("']' expected"); RECOVER;}
1069 ;
1070
1071 formal_parameter_list:
1072         formal_parameter
1073                 {
1074                   ctxp->formal_parameter_number = 1;
1075                 }
1076 |       formal_parameter_list C_TK formal_parameter
1077                 {
1078                   ctxp->formal_parameter_number += 1;
1079                   $$ = chainon ($1, $3);
1080                 }
1081 |       formal_parameter_list C_TK error
1082                 { yyerror ("Missing formal parameter term"); RECOVER; }
1083 ;
1084
1085 formal_parameter:
1086         type variable_declarator_id
1087                 {
1088                   $$ = build_tree_list ($2, $1);
1089                 }
1090 |       final type variable_declarator_id /* Added, JDK1.1 final parms */
1091                 {
1092                   $$ = build_tree_list ($3, $2);
1093                   ARG_FINAL_P ($$) = 1;
1094                 }
1095 |       type error
1096                 {
1097                   yyerror ("Missing identifier"); RECOVER;
1098                   $$ = NULL_TREE;
1099                 }
1100 |       final type error
1101                 {
1102                   yyerror ("Missing identifier"); RECOVER;
1103                   $$ = NULL_TREE;
1104                 }
1105 ;
1106
1107 final:
1108         modifiers
1109                 {
1110                   check_modifiers ("Illegal modifier `%s'. Only `final' was expected here",
1111                                    $1, ACC_FINAL);
1112                   if ($1 != ACC_FINAL)
1113                     MODIFIER_WFL (FINAL_TK) = build_wfl_node (NULL_TREE);
1114                 }
1115 ;
1116
1117 throws:
1118                 { $$ = NULL_TREE; }
1119 |       THROWS_TK class_type_list
1120                 { $$ = $2; }
1121 |       THROWS_TK error
1122                 {yyerror ("Missing class type term"); RECOVER;}
1123 ;
1124
1125 class_type_list:
1126         class_type
1127                 { $$ = build_tree_list ($1, $1); }
1128 |       class_type_list C_TK class_type
1129                 { $$ = tree_cons ($3, $3, $1); }
1130 |       class_type_list C_TK error
1131                 {yyerror ("Missing class type term"); RECOVER;}
1132 ;
1133
1134 method_body:
1135         block
1136 |       SC_TK { $$ = NULL_TREE; }
1137 ;
1138
1139 /* 19.8.4 Productions from 8.5: Static Initializers  */
1140 static_initializer:
1141         static block
1142                 {
1143                   TREE_CHAIN ($2) = CPC_STATIC_INITIALIZER_STMT (ctxp);
1144                   SET_CPC_STATIC_INITIALIZER_STMT (ctxp, $2);
1145                   current_static_block = NULL_TREE;
1146                 }
1147 ;
1148
1149 static:                         /* Test lval.sub_token here */
1150         modifiers
1151                 {
1152                   check_modifiers ("Illegal modifier `%s' for static initializer", $1, ACC_STATIC);
1153                   /* Can't have a static initializer in an innerclass */
1154                   if ($1 | ACC_STATIC &&
1155                       GET_CPC_LIST () && !TOPLEVEL_CLASS_DECL_P (GET_CPC ()))
1156                     parse_error_context
1157                       (MODIFIER_WFL (STATIC_TK),
1158                        "Can't define static initializer in class `%s'. Static initializer can only be defined in top-level classes",
1159                        IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())));
1160                   SOURCE_FRONTEND_DEBUG (("Modifiers: %d", $1));
1161                 }
1162 ;
1163
1164 /* 19.8.5 Productions from 8.6: Constructor Declarations  */
1165 constructor_declaration:
1166         constructor_header
1167                 {
1168                   current_function_decl = $1;
1169                   source_start_java_method (current_function_decl);
1170                 }
1171         constructor_body
1172                 { finish_method_declaration ($3); }
1173 ;
1174
1175 constructor_header:
1176         constructor_declarator throws
1177                 { $$ = method_header (0, NULL_TREE, $1, $2); }
1178 |       modifiers constructor_declarator throws
1179                 { $$ = method_header ($1, NULL_TREE, $2, $3); }
1180 ;
1181
1182 constructor_declarator:
1183         simple_name OP_TK CP_TK
1184                 {
1185                   ctxp->formal_parameter_number = 0;
1186                   $$ = method_declarator ($1, NULL_TREE);
1187                 }
1188 |       simple_name OP_TK formal_parameter_list CP_TK
1189                 { $$ = method_declarator ($1, $3); }
1190 ;
1191
1192 constructor_body:
1193         /* Unlike regular method, we always need a complete (empty)
1194            body so we can safely perform all the required code
1195            addition (super invocation and field initialization) */
1196         block_begin constructor_block_end
1197                 {
1198                   BLOCK_EXPR_BODY ($2) = build_java_empty_stmt ();
1199                   $$ = $2;
1200                 }
1201 |       block_begin explicit_constructor_invocation constructor_block_end
1202                 { $$ = $3; }
1203 |       block_begin block_statements constructor_block_end
1204                 { $$ = $3; }
1205 |       block_begin explicit_constructor_invocation block_statements constructor_block_end
1206                 { $$ = $4; }
1207 ;
1208
1209 constructor_block_end:
1210         block_end
1211 ;
1212
1213 /* Error recovery for that rule moved down expression_statement: rule.  */
1214 explicit_constructor_invocation:
1215         this_or_super OP_TK CP_TK SC_TK
1216                 {
1217                   $$ = build_method_invocation ($1, NULL_TREE);
1218                   $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1219                   $$ = java_method_add_stmt (current_function_decl, $$);
1220                 }
1221 |       this_or_super OP_TK argument_list CP_TK SC_TK
1222                 {
1223                   $$ = build_method_invocation ($1, $3);
1224                   $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $$);
1225                   $$ = java_method_add_stmt (current_function_decl, $$);
1226                 }
1227         /* Added, JDK1.1 inner classes. Modified because the rule
1228            'primary' couldn't work.  */
1229 |       name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
1230                 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1231 |       name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
1232                 {$$ = parse_jdk1_1_error ("explicit constructor invocation"); }
1233 ;
1234
1235 this_or_super:                  /* Added, simplifies error diagnostics */
1236         THIS_TK
1237                 {
1238                   tree wfl = build_wfl_node (this_identifier_node);
1239                   EXPR_WFL_LINECOL (wfl) = $1.location;
1240                   $$ = wfl;
1241                 }
1242 |       SUPER_TK
1243                 {
1244                   tree wfl = build_wfl_node (super_identifier_node);
1245                   EXPR_WFL_LINECOL (wfl) = $1.location;
1246                   $$ = wfl;
1247                 }
1248 ;
1249
1250 /* 19.9 Productions from 9: Interfaces  */
1251 /* 19.9.1 Productions from 9.1: Interfaces Declarations  */
1252 interface_declaration:
1253         INTERFACE_TK identifier
1254                 { create_interface (0, $2, NULL_TREE); }
1255         interface_body
1256                 { ; }
1257 |       modifiers INTERFACE_TK identifier
1258                 { create_interface ($1, $3, NULL_TREE); }
1259         interface_body
1260                 { ; }
1261 |       INTERFACE_TK identifier extends_interfaces
1262                 { create_interface (0, $2, $3); }
1263         interface_body
1264                 { ; }
1265 |       modifiers INTERFACE_TK identifier extends_interfaces
1266                 { create_interface ($1, $3, $4); }
1267         interface_body
1268                 { ; }
1269 |       INTERFACE_TK identifier error
1270                 { yyerror ("'{' expected"); RECOVER; }
1271 |       modifiers INTERFACE_TK identifier error
1272                 { yyerror ("'{' expected"); RECOVER; }
1273 ;
1274
1275 extends_interfaces:
1276         EXTENDS_TK interface_type
1277                 {
1278                   ctxp->interface_number = 1;
1279                   $$ = build_tree_list ($2, NULL_TREE);
1280                 }
1281 |       extends_interfaces C_TK interface_type
1282                 {
1283                   ctxp->interface_number++;
1284                   $$ = chainon ($1, build_tree_list ($3, NULL_TREE));
1285                 }
1286 |       EXTENDS_TK error
1287                 {yyerror ("Invalid interface type"); RECOVER;}
1288 |       extends_interfaces C_TK error
1289                 {yyerror ("Missing term"); RECOVER;}
1290 ;
1291
1292 interface_body:
1293         OCB_TK CCB_TK
1294                 { $$ = NULL_TREE; }
1295 |       OCB_TK interface_member_declarations CCB_TK
1296                 { $$ = NULL_TREE; }
1297 ;
1298
1299 interface_member_declarations:
1300         interface_member_declaration
1301 |       interface_member_declarations interface_member_declaration
1302 ;
1303
1304 interface_member_declaration:
1305         constant_declaration
1306 |       abstract_method_declaration
1307 |       class_declaration       /* Added, JDK1.1 inner classes */
1308                 { end_class_declaration (1); }
1309 |       interface_declaration   /* Added, JDK1.1 inner interfaces */
1310                 { end_class_declaration (1); }
1311 ;
1312
1313 constant_declaration:
1314         field_declaration
1315 ;
1316
1317 abstract_method_declaration:
1318         method_header SC_TK
1319                 {
1320                   check_abstract_method_header ($1);
1321                   current_function_decl = NULL_TREE; /* FIXME ? */
1322                 }
1323 |       method_header error
1324                 {yyerror ("';' expected"); RECOVER;}
1325 ;
1326
1327 /* 19.10 Productions from 10: Arrays  */
1328 array_initializer:
1329         OCB_TK CCB_TK
1330                 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1331 |       OCB_TK C_TK CCB_TK
1332                 { $$ = build_new_array_init ($1.location, NULL_TREE); }
1333 |       OCB_TK variable_initializers CCB_TK
1334                 { $$ = build_new_array_init ($1.location, $2); }
1335 |       OCB_TK variable_initializers C_TK CCB_TK
1336                 { $$ = build_new_array_init ($1.location, $2); }
1337 ;
1338
1339 variable_initializers:
1340         variable_initializer
1341                 {
1342                   $$ = tree_cons (maybe_build_array_element_wfl ($1),
1343                                   $1, NULL_TREE);
1344                 }
1345 |       variable_initializers C_TK variable_initializer
1346                 {
1347                   $$ = tree_cons (maybe_build_array_element_wfl ($3), $3, $1);
1348                 }
1349 |       variable_initializers C_TK error
1350                 {yyerror ("Missing term"); RECOVER;}
1351 ;
1352
1353 /* 19.11 Production from 14: Blocks and Statements  */
1354 block:
1355         block_begin block_end
1356                 { $$ = $2; }
1357 |       block_begin block_statements block_end
1358                 { $$ = $3; }
1359 ;
1360
1361 block_begin:
1362         OCB_TK
1363                 { enter_block (); }
1364 ;
1365
1366 block_end:
1367         CCB_TK
1368                 {
1369                   maybe_absorb_scoping_blocks ();
1370                   /* Store the location of the `}' when doing xrefs */
1371                   if (current_function_decl && flag_emit_xref)
1372                     DECL_END_SOURCE_LINE (current_function_decl) =
1373                       EXPR_WFL_ADD_COL ($1.location, 1);
1374                   $$ = exit_block ();
1375                   if (!BLOCK_SUBBLOCKS ($$))
1376                     BLOCK_SUBBLOCKS ($$) = build_java_empty_stmt ();
1377                 }
1378 ;
1379
1380 block_statements:
1381         block_statement
1382 |       block_statements block_statement
1383 ;
1384
1385 block_statement:
1386         local_variable_declaration_statement
1387 |       statement
1388                 { java_method_add_stmt (current_function_decl, $1); }
1389 |       class_declaration       /* Added, JDK1.1 local classes */
1390                 {
1391                   LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1;
1392                   end_class_declaration (1);
1393                 }
1394 ;
1395
1396 local_variable_declaration_statement:
1397         local_variable_declaration SC_TK /* Can't catch missing ';' here */
1398 ;
1399
1400 local_variable_declaration:
1401         type variable_declarators
1402                 { declare_local_variables (0, $1, $2); }
1403 |       final type variable_declarators /* Added, JDK1.1 final locals */
1404                 { declare_local_variables ($1, $2, $3); }
1405 ;
1406
1407 statement:
1408         statement_without_trailing_substatement
1409 |       labeled_statement
1410 |       if_then_statement
1411 |       if_then_else_statement
1412 |       while_statement
1413 |       for_statement
1414                 { $$ = exit_block (); }
1415 ;
1416
1417 statement_nsi:
1418         statement_without_trailing_substatement
1419 |       labeled_statement_nsi
1420 |       if_then_else_statement_nsi
1421 |       while_statement_nsi
1422 |       for_statement_nsi
1423                 { $$ = exit_block (); }
1424 ;
1425
1426 statement_without_trailing_substatement:
1427         block
1428 |       empty_statement
1429 |       expression_statement
1430 |       switch_statement
1431 |       do_statement
1432 |       break_statement
1433 |       continue_statement
1434 |       return_statement
1435 |       synchronized_statement
1436 |       throw_statement
1437 |       try_statement
1438 |       assert_statement
1439 ;
1440
1441 empty_statement:
1442         SC_TK
1443                 {
1444                   if (flag_extraneous_semicolon
1445                       && ! current_static_block
1446                       && (! current_function_decl ||
1447                           /* Verify we're not in a inner class declaration */
1448                           (GET_CPC () != TYPE_NAME
1449                            (DECL_CONTEXT (current_function_decl)))))
1450
1451                     {
1452                       EXPR_WFL_SET_LINECOL (wfl_operator, input_line, -1);
1453                       parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used");
1454                     }
1455                   $$ = build_java_empty_stmt ();
1456                 }
1457 ;
1458
1459 label_decl:
1460         identifier REL_CL_TK
1461                 {
1462                   $$ = build_labeled_block (EXPR_WFL_LINECOL ($1),
1463                                             EXPR_WFL_NODE ($1));
1464                   pushlevel (2);
1465                   push_labeled_block ($$);
1466                   PUSH_LABELED_BLOCK ($$);
1467                 }
1468 ;
1469
1470 labeled_statement:
1471         label_decl statement
1472                 { $$ = finish_labeled_statement ($1, $2); }
1473 |       identifier error
1474                 {yyerror ("':' expected"); RECOVER;}
1475 ;
1476
1477 labeled_statement_nsi:
1478         label_decl statement_nsi
1479                 { $$ = finish_labeled_statement ($1, $2); }
1480 ;
1481
1482 /* We concentrate here a bunch of error handling rules that we couldn't write
1483    earlier, because expression_statement catches a missing ';'.  */
1484 expression_statement:
1485         statement_expression SC_TK
1486                 {
1487                   /* We have a statement. Generate a WFL around it so
1488                      we can debug it */
1489                   $$ = build_expr_wfl ($1, input_filename, input_line, 0);
1490                   /* We know we have a statement, so set the debug
1491                      info to be eventually generate here. */
1492                   $$ = JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
1493                 }
1494 |       error SC_TK
1495                 {
1496                   YYNOT_TWICE yyerror ("Invalid expression statement");
1497                   DRECOVER (expr_stmt);
1498                 }
1499 |       error OCB_TK
1500                 {
1501                   YYNOT_TWICE yyerror ("Invalid expression statement");
1502                   DRECOVER (expr_stmt);
1503                 }
1504 |       error CCB_TK
1505                 {
1506                   YYNOT_TWICE yyerror ("Invalid expression statement");
1507                   DRECOVER (expr_stmt);
1508                 }
1509 |       this_or_super OP_TK error
1510                 {yyerror ("')' expected"); RECOVER;}
1511 |       this_or_super OP_TK CP_TK error
1512                 {
1513                   parse_ctor_invocation_error ();
1514                   RECOVER;
1515                 }
1516 |       this_or_super OP_TK argument_list error
1517                 {yyerror ("')' expected"); RECOVER;}
1518 |       this_or_super OP_TK argument_list CP_TK error
1519                 {
1520                   parse_ctor_invocation_error ();
1521                   RECOVER;
1522                 }
1523 |       name DOT_TK SUPER_TK error
1524                 {yyerror ("'(' expected"); RECOVER;}
1525 |       name DOT_TK SUPER_TK OP_TK error
1526                 {yyerror ("')' expected"); RECOVER;}
1527 |       name DOT_TK SUPER_TK OP_TK argument_list error
1528                 {yyerror ("')' expected"); RECOVER;}
1529 |       name DOT_TK SUPER_TK OP_TK argument_list CP_TK error
1530                 {yyerror ("';' expected"); RECOVER;}
1531 |       name DOT_TK SUPER_TK OP_TK CP_TK error
1532                 {yyerror ("';' expected"); RECOVER;}
1533 ;
1534
1535 statement_expression:
1536         assignment
1537 |       pre_increment_expression
1538 |       pre_decrement_expression
1539 |       post_increment_expression
1540 |       post_decrement_expression
1541 |       method_invocation
1542 |       class_instance_creation_expression
1543 ;
1544
1545 if_then_statement:
1546         IF_TK OP_TK expression CP_TK statement
1547                 {
1548                   $$ = build_if_else_statement ($2.location, $3,
1549                                                 $5, NULL_TREE);
1550                 }
1551 |       IF_TK error
1552                 {yyerror ("'(' expected"); RECOVER;}
1553 |       IF_TK OP_TK error
1554                 {yyerror ("Missing term"); RECOVER;}
1555 |       IF_TK OP_TK expression error
1556                 {yyerror ("')' expected"); RECOVER;}
1557 ;
1558
1559 if_then_else_statement:
1560         IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
1561                 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1562 ;
1563
1564 if_then_else_statement_nsi:
1565         IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
1566                 { $$ = build_if_else_statement ($2.location, $3, $5, $7); }
1567 ;
1568
1569 switch_statement:
1570         switch_expression
1571                 {
1572                   enter_block ();
1573                 }
1574         switch_block
1575                 {
1576                   /* Make into "proper list" of COMPOUND_EXPRs.
1577                      I.e. make the last statement also have its own
1578                      COMPOUND_EXPR. */
1579                   maybe_absorb_scoping_blocks ();
1580                   TREE_OPERAND ($1, 1) = exit_block ();
1581                   $$ = build_debugable_stmt (EXPR_WFL_LINECOL ($1), $1);
1582                 }
1583 ;
1584
1585 switch_expression:
1586         SWITCH_TK OP_TK expression CP_TK
1587                 {
1588                   $$ = build (SWITCH_EXPR, NULL_TREE, $3, NULL_TREE, NULL_TREE);
1589                   EXPR_WFL_LINECOL ($$) = $2.location;
1590                 }
1591 |       SWITCH_TK error
1592                 {yyerror ("'(' expected"); RECOVER;}
1593 |       SWITCH_TK OP_TK error
1594                 {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);}
1595 |       SWITCH_TK OP_TK expression CP_TK error
1596                 {yyerror ("'{' expected"); RECOVER;}
1597 ;
1598
1599 /* Default assignment is there to avoid type node on switch_block
1600    node. */
1601
1602 switch_block:
1603         OCB_TK CCB_TK
1604                 { $$ = NULL_TREE; }
1605 |       OCB_TK switch_labels CCB_TK
1606                 { $$ = NULL_TREE; }
1607 |       OCB_TK switch_block_statement_groups CCB_TK
1608                 { $$ = NULL_TREE; }
1609 |       OCB_TK switch_block_statement_groups switch_labels CCB_TK
1610                 { $$ = NULL_TREE; }
1611 ;
1612
1613 switch_block_statement_groups:
1614         switch_block_statement_group
1615 |       switch_block_statement_groups switch_block_statement_group
1616 ;
1617
1618 switch_block_statement_group:
1619         switch_labels block_statements
1620 ;
1621
1622 switch_labels:
1623         switch_label
1624 |       switch_labels switch_label
1625 ;
1626
1627 switch_label:
1628         CASE_TK constant_expression REL_CL_TK
1629                 {
1630                   tree lab = build1 (CASE_EXPR, NULL_TREE, $2);
1631                   EXPR_WFL_LINECOL (lab) = $1.location;
1632                   java_method_add_stmt (current_function_decl, lab);
1633                 }
1634 |       DEFAULT_TK REL_CL_TK
1635                 {
1636                   tree lab = make_node (DEFAULT_EXPR);
1637                   EXPR_WFL_LINECOL (lab) = $1.location;
1638                   java_method_add_stmt (current_function_decl, lab);
1639                 }
1640 |       CASE_TK error
1641                 {yyerror ("Missing or invalid constant expression"); RECOVER;}
1642 |       CASE_TK constant_expression error
1643                 {yyerror ("':' expected"); RECOVER;}
1644 |       DEFAULT_TK error
1645                 {yyerror ("':' expected"); RECOVER;}
1646 ;
1647
1648 while_expression:
1649         WHILE_TK OP_TK expression CP_TK
1650                 {
1651                   tree body = build_loop_body ($2.location, $3, 0);
1652                   $$ = build_new_loop (body);
1653                 }
1654 ;
1655
1656 while_statement:
1657         while_expression statement
1658                 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1659 |       WHILE_TK error
1660                 {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;}
1661 |       WHILE_TK OP_TK error
1662                 {yyerror ("Missing term and ')' expected"); RECOVER;}
1663 |       WHILE_TK OP_TK expression error
1664                 {yyerror ("')' expected"); RECOVER;}
1665 ;
1666
1667 while_statement_nsi:
1668         while_expression statement_nsi
1669                 { $$ = finish_loop_body (0, NULL_TREE, $2, 0); }
1670 ;
1671
1672 do_statement_begin:
1673         DO_TK
1674                 {
1675                   tree body = build_loop_body (0, NULL_TREE, 1);
1676                   $$ = build_new_loop (body);
1677                 }
1678         /* Need error handing here. FIXME */
1679 ;
1680
1681 do_statement:
1682         do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
1683                 { $$ = finish_loop_body ($4.location, $5, $2, 1); }
1684 ;
1685
1686 for_statement:
1687         for_begin SC_TK expression SC_TK for_update CP_TK statement
1688                 {
1689                   if (TREE_CODE_CLASS (TREE_CODE ($3)) == 'c')
1690                     $3 = build_wfl_node ($3);
1691                   $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);
1692                 }
1693 |       for_begin SC_TK SC_TK for_update CP_TK statement
1694                 {
1695                   $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1696                   /* We have not condition, so we get rid of the EXIT_EXPR */
1697                   LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1698                     build_java_empty_stmt ();
1699                 }
1700 |       for_begin SC_TK error
1701                 {yyerror ("Invalid control expression"); RECOVER;}
1702 |       for_begin SC_TK expression SC_TK error
1703                 {yyerror ("Invalid update expression"); RECOVER;}
1704 |       for_begin SC_TK SC_TK error
1705                 {yyerror ("Invalid update expression"); RECOVER;}
1706 ;
1707
1708 for_statement_nsi:
1709         for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
1710                 { $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);}
1711 |       for_begin SC_TK SC_TK for_update CP_TK statement_nsi
1712                 {
1713                   $$ = finish_for_loop (0, NULL_TREE, $4, $6);
1714                   /* We have not condition, so we get rid of the EXIT_EXPR */
1715                   LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY ($$), 0) =
1716                     build_java_empty_stmt ();
1717                 }
1718 ;
1719
1720 for_header:
1721         FOR_TK OP_TK
1722                 {
1723                   /* This scope defined for local variable that may be
1724                      defined within the scope of the for loop */
1725                   enter_block ();
1726                 }
1727 |       FOR_TK error
1728                 {yyerror ("'(' expected"); DRECOVER(for_1);}
1729 |       FOR_TK OP_TK error
1730                 {yyerror ("Invalid init statement"); RECOVER;}
1731 ;
1732
1733 for_begin:
1734         for_header for_init
1735                 {
1736                   /* We now declare the loop body. The loop is
1737                      declared as a for loop. */
1738                   tree body = build_loop_body (0, NULL_TREE, 0);
1739                   $$ =  build_new_loop (body);
1740                   FOR_LOOP_P ($$) = 1;
1741                   /* The loop is added to the current block the for
1742                      statement is defined within */
1743                   java_method_add_stmt (current_function_decl, $$);
1744                 }
1745 ;
1746 for_init:                       /* Can be empty */
1747                 { $$ = build_java_empty_stmt (); }
1748 |       statement_expression_list
1749                 {
1750                   /* Init statement recorded within the previously
1751                      defined block scope */
1752                   $$ = java_method_add_stmt (current_function_decl, $1);
1753                 }
1754 |       local_variable_declaration
1755                 {
1756                   /* Local variable are recorded within the previously
1757                      defined block scope */
1758                   $$ = NULL_TREE;
1759                 }
1760 |       statement_expression_list error
1761                 {yyerror ("';' expected"); DRECOVER(for_init_1);}
1762 ;
1763
1764 for_update:                     /* Can be empty */
1765                 {$$ = build_java_empty_stmt ();}
1766 |       statement_expression_list
1767                 { $$ = build_debugable_stmt (BUILD_LOCATION (), $1); }
1768 ;
1769
1770 statement_expression_list:
1771         statement_expression
1772                 { $$ = add_stmt_to_compound (NULL_TREE, NULL_TREE, $1); }
1773 |       statement_expression_list C_TK statement_expression
1774                 { $$ = add_stmt_to_compound ($1, NULL_TREE, $3); }
1775 |       statement_expression_list C_TK error
1776                 {yyerror ("Missing term"); RECOVER;}
1777 ;
1778
1779 break_statement:
1780         BREAK_TK SC_TK
1781                 { $$ = build_bc_statement ($1.location, 1, NULL_TREE); }
1782 |       BREAK_TK identifier SC_TK
1783                 { $$ = build_bc_statement ($1.location, 1, $2); }
1784 |       BREAK_TK error
1785                 {yyerror ("Missing term"); RECOVER;}
1786 |       BREAK_TK identifier error
1787                 {yyerror ("';' expected"); RECOVER;}
1788 ;
1789
1790 continue_statement:
1791         CONTINUE_TK SC_TK
1792                 { $$ = build_bc_statement ($1.location, 0, NULL_TREE); }
1793 |       CONTINUE_TK identifier SC_TK
1794                 { $$ = build_bc_statement ($1.location, 0, $2); }
1795 |       CONTINUE_TK error
1796                 {yyerror ("Missing term"); RECOVER;}
1797 |       CONTINUE_TK identifier error
1798                 {yyerror ("';' expected"); RECOVER;}
1799 ;
1800
1801 return_statement:
1802         RETURN_TK SC_TK
1803                 { $$ = build_return ($1.location, NULL_TREE); }
1804 |       RETURN_TK expression SC_TK
1805                 { $$ = build_return ($1.location, $2); }
1806 |       RETURN_TK error
1807                 {yyerror ("Missing term"); RECOVER;}
1808 |       RETURN_TK expression error
1809                 {yyerror ("';' expected"); RECOVER;}
1810 ;
1811
1812 throw_statement:
1813         THROW_TK expression SC_TK
1814                 {
1815                   $$ = build1 (THROW_EXPR, NULL_TREE, $2);
1816                   EXPR_WFL_LINECOL ($$) = $1.location;
1817                 }
1818 |       THROW_TK error
1819                 {yyerror ("Missing term"); RECOVER;}
1820 |       THROW_TK expression error
1821                 {yyerror ("';' expected"); RECOVER;}
1822 ;
1823
1824 assert_statement:
1825         ASSERT_TK expression REL_CL_TK expression SC_TK
1826                 {
1827                   $$ = build_assertion ($1.location, $2, $4);
1828                 }
1829 |       ASSERT_TK expression SC_TK
1830                 {
1831                   $$ = build_assertion ($1.location, $2, NULL_TREE);
1832                 }
1833 |       ASSERT_TK error
1834                 {yyerror ("Missing term"); RECOVER;}
1835 |       ASSERT_TK expression error
1836                 {yyerror ("';' expected"); RECOVER;}
1837 ;
1838
1839 synchronized_statement:
1840         synchronized OP_TK expression CP_TK block
1841                 {
1842                   $$ = build (SYNCHRONIZED_EXPR, NULL_TREE, $3, $5);
1843                   EXPR_WFL_LINECOL ($$) =
1844                     EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK));
1845                 }
1846 |       synchronized OP_TK expression CP_TK error
1847                 {yyerror ("'{' expected"); RECOVER;}
1848 |       synchronized error
1849                 {yyerror ("'(' expected"); RECOVER;}
1850 |       synchronized OP_TK error CP_TK
1851                 {yyerror ("Missing term"); RECOVER;}
1852 |       synchronized OP_TK error
1853                 {yyerror ("Missing term"); RECOVER;}
1854 ;
1855
1856 synchronized:
1857         modifiers
1858                 {
1859                   check_modifiers (
1860              "Illegal modifier `%s'. Only `synchronized' was expected here",
1861                                    $1, ACC_SYNCHRONIZED);
1862                   if ($1 != ACC_SYNCHRONIZED)
1863                     MODIFIER_WFL (SYNCHRONIZED_TK) =
1864                       build_wfl_node (NULL_TREE);
1865                 }
1866 ;
1867
1868 try_statement:
1869         TRY_TK block catches
1870                 { $$ = build_try_statement ($1.location, $2, $3); }
1871 |       TRY_TK block finally
1872                 { $$ = build_try_finally_statement ($1.location, $2, $3); }
1873 |       TRY_TK block catches finally
1874                 { $$ = build_try_finally_statement
1875                     ($1.location, build_try_statement ($1.location,
1876                                                        $2, $3), $4);
1877                 }
1878 |       TRY_TK error
1879                 {yyerror ("'{' expected"); DRECOVER (try_statement);}
1880 ;
1881
1882 catches:
1883         catch_clause
1884 |       catches catch_clause
1885                 {
1886                   TREE_CHAIN ($2) = $1;
1887                   $$ = $2;
1888                 }
1889 ;
1890
1891 catch_clause:
1892         catch_clause_parameter block
1893                 {
1894                   java_method_add_stmt (current_function_decl, $2);
1895                   exit_block ();
1896                   $$ = $1;
1897                 }
1898 ;
1899
1900 catch_clause_parameter:
1901         CATCH_TK OP_TK formal_parameter CP_TK
1902                 {
1903                   /* We add a block to define a scope for
1904                      formal_parameter (CCBP). The formal parameter is
1905                      declared initialized by the appropriate function
1906                      call */
1907                   tree ccpb;
1908                   tree init;
1909                   if ($3)
1910                     {
1911                       ccpb = enter_block ();
1912                       init = build_assignment
1913                         (ASSIGN_TK, $2.location, TREE_PURPOSE ($3),
1914                          build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
1915                       declare_local_variables (0, TREE_VALUE ($3),
1916                                                build_tree_list 
1917                                                (TREE_PURPOSE ($3), init));
1918                       $$ = build1 (JAVA_CATCH_EXPR, NULL_TREE, ccpb);
1919                       EXPR_WFL_LINECOL ($$) = $1.location;
1920                     }
1921                   else
1922                     {
1923                       $$ = error_mark_node;
1924                     }
1925                 }
1926 |       CATCH_TK error
1927                 {yyerror ("'(' expected"); RECOVER; $$ = NULL_TREE;}
1928 |       CATCH_TK OP_TK error
1929                 {
1930                   yyerror ("Missing term or ')' expected");
1931                   RECOVER; $$ = NULL_TREE;
1932                 }
1933 |       CATCH_TK OP_TK error CP_TK /* That's for () */
1934                 {yyerror ("Missing term"); RECOVER; $$ = NULL_TREE;}
1935 ;
1936
1937 finally:
1938         FINALLY_TK block
1939                 { $$ = $2; }
1940 |       FINALLY_TK error
1941                 {yyerror ("'{' expected"); RECOVER; }
1942 ;
1943
1944 /* 19.12 Production from 15: Expressions  */
1945 primary:
1946         primary_no_new_array
1947 |       array_creation_expression
1948 ;
1949
1950 primary_no_new_array:
1951         literal
1952 |       THIS_TK
1953                 { $$ = build_this ($1.location); }
1954 |       OP_TK expression CP_TK
1955                 {$$ = $2;}
1956 |       class_instance_creation_expression
1957 |       field_access
1958 |       method_invocation
1959 |       array_access
1960 |       type_literals
1961         /* Added, JDK1.1 inner classes. Documentation is wrong
1962            refering to a 'ClassName' (class_name) rule that doesn't
1963            exist. Used name: instead.  */
1964 |       name DOT_TK THIS_TK
1965                 {
1966                   tree wfl = build_wfl_node (this_identifier_node);
1967                   $$ = make_qualified_primary ($1, wfl, EXPR_WFL_LINECOL ($1));
1968                 }
1969 |       OP_TK expression error
1970                 {yyerror ("')' expected"); RECOVER;}
1971 |       name DOT_TK error
1972                 {yyerror ("'class' or 'this' expected" ); RECOVER;}
1973 |       primitive_type DOT_TK error
1974                 {yyerror ("'class' expected" ); RECOVER;}
1975 |       VOID_TK DOT_TK error
1976                 {yyerror ("'class' expected" ); RECOVER;}
1977 ;
1978
1979 type_literals:
1980         name DOT_TK CLASS_TK
1981                 { $$ = build_incomplete_class_ref ($2.location, $1); }
1982 |       array_type DOT_TK CLASS_TK
1983                 { $$ = build_incomplete_class_ref ($2.location, $1); }
1984 |       primitive_type DOT_TK CLASS_TK
1985                 { $$ = build_incomplete_class_ref ($2.location, $1); }
1986 |       VOID_TK DOT_TK CLASS_TK
1987                 {
1988                    $$ = build_incomplete_class_ref ($2.location,
1989                                                    void_type_node);
1990                 }
1991 ;
1992
1993 class_instance_creation_expression:
1994         NEW_TK class_type OP_TK argument_list CP_TK
1995                 { $$ = build_new_invocation ($2, $4); }
1996 |       NEW_TK class_type OP_TK CP_TK
1997                 { $$ = build_new_invocation ($2, NULL_TREE); }
1998 |       anonymous_class_creation
1999         /* Added, JDK1.1 inner classes, modified to use name or
2000            primary instead of primary solely which couldn't work in
2001            all situations.  */
2002 |       something_dot_new identifier OP_TK CP_TK
2003                 {
2004                   tree ctor = build_new_invocation ($2, NULL_TREE);
2005                   $$ = make_qualified_primary ($1, ctor,
2006                                                EXPR_WFL_LINECOL ($1));
2007                 }
2008 |       something_dot_new identifier OP_TK CP_TK class_body
2009 |       something_dot_new identifier OP_TK argument_list CP_TK
2010                 {
2011                   tree ctor = build_new_invocation ($2, $4);
2012                   $$ = make_qualified_primary ($1, ctor,
2013                                                EXPR_WFL_LINECOL ($1));
2014                 }
2015 |       something_dot_new identifier OP_TK argument_list CP_TK class_body
2016 |       NEW_TK error SC_TK
2017                 {yyerror ("'(' expected"); DRECOVER(new_1);}
2018 |       NEW_TK class_type error
2019                 {yyerror ("'(' expected"); RECOVER;}
2020 |       NEW_TK class_type OP_TK error
2021                 {yyerror ("')' or term expected"); RECOVER;}
2022 |       NEW_TK class_type OP_TK argument_list error
2023                 {yyerror ("')' expected"); RECOVER;}
2024 |       something_dot_new error
2025                 {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;}
2026 |       something_dot_new identifier error
2027                 {yyerror ("'(' expected"); RECOVER;}
2028 ;
2029
2030 /* Created after JDK1.1 rules originally added to
2031    class_instance_creation_expression, but modified to use
2032    'class_type' instead of 'TypeName' (type_name) which is mentioned
2033    in the documentation but doesn't exist. */
2034
2035 anonymous_class_creation:
2036         NEW_TK class_type OP_TK argument_list CP_TK
2037                 { create_anonymous_class ($2); }
2038         class_body
2039                 {
2040                   tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2041                   EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2042
2043                   end_class_declaration (1);
2044
2045                   /* Now we can craft the new expression */
2046                   $$ = build_new_invocation (id, $4);
2047
2048                   /* Note that we can't possibly be here if
2049                      `class_type' is an interface (in which case the
2050                      anonymous class extends Object and implements
2051                      `class_type', hence its constructor can't have
2052                      arguments.) */
2053
2054                   /* Otherwise, the innerclass must feature a
2055                      constructor matching `argument_list'. Anonymous
2056                      classes are a bit special: it's impossible to
2057                      define constructor for them, hence constructors
2058                      must be generated following the hints provided by
2059                      the `new' expression. Whether a super constructor
2060                      of that nature exists or not is to be verified
2061                      later on in verify_constructor_super.
2062
2063                      It's during the expansion of a `new' statement
2064                      refering to an anonymous class that a ctor will
2065                      be generated for the anonymous class, with the
2066                      right arguments. */
2067
2068                 }
2069 |       NEW_TK class_type OP_TK CP_TK
2070                 { create_anonymous_class ($2); }
2071         class_body
2072                 {
2073                   tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
2074                   EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL ($2);
2075
2076                   end_class_declaration (1);
2077
2078                   /* Now we can craft the new expression. The
2079                      statement doesn't need to be remember so that a
2080                      constructor can be generated, since its signature
2081                      is already known. */
2082                   $$ = build_new_invocation (id, NULL_TREE);
2083                 }
2084 ;
2085
2086 something_dot_new:              /* Added, not part of the specs. */
2087         name DOT_TK NEW_TK
2088                 { $$ = $1; }
2089 |       primary DOT_TK NEW_TK
2090                 { $$ = $1; }
2091 ;
2092
2093 argument_list:
2094         expression
2095                 {
2096                   $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
2097                   ctxp->formal_parameter_number = 1;
2098                 }
2099 |       argument_list C_TK expression
2100                 {
2101                   ctxp->formal_parameter_number += 1;
2102                   $$ = tree_cons (NULL_TREE, $3, $1);
2103                 }
2104 |       argument_list C_TK error
2105                 {yyerror ("Missing term"); RECOVER;}
2106 ;
2107
2108 array_creation_expression:
2109         NEW_TK primitive_type dim_exprs
2110                 { $$ = build_newarray_node ($2, $3, 0); }
2111 |       NEW_TK class_or_interface_type dim_exprs
2112                 { $$ = build_newarray_node ($2, $3, 0); }
2113 |       NEW_TK primitive_type dim_exprs dims
2114                 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2115 |       NEW_TK class_or_interface_type dim_exprs dims
2116                 { $$ = build_newarray_node ($2, $3, pop_current_osb (ctxp));}
2117         /* Added, JDK1.1 anonymous array. Initial documentation rule
2118            modified */
2119 |       NEW_TK class_or_interface_type dims array_initializer
2120                 {
2121                   char *sig;
2122                   int osb = pop_current_osb (ctxp);
2123                   while (osb--)
2124                     obstack_grow (&temporary_obstack, "[]", 2);
2125                   obstack_1grow (&temporary_obstack, '\0');
2126                   sig = obstack_finish (&temporary_obstack);
2127                   $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2128                               $2, get_identifier (sig), $4);
2129                 }
2130 |       NEW_TK primitive_type dims array_initializer
2131                 {
2132                   int osb = pop_current_osb (ctxp);
2133                   tree type = $2;
2134                   while (osb--)
2135                     type = build_java_array_type (type, -1);
2136                   $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
2137                               build_pointer_type (type), NULL_TREE, $4);
2138                 }
2139 |       NEW_TK error CSB_TK
2140                 {yyerror ("'[' expected"); DRECOVER ("]");}
2141 |       NEW_TK error OSB_TK
2142                 {yyerror ("']' expected"); RECOVER;}
2143 ;
2144
2145 dim_exprs:
2146         dim_expr
2147                 { $$ = build_tree_list (NULL_TREE, $1); }
2148 |       dim_exprs dim_expr
2149                 { $$ = tree_cons (NULL_TREE, $2, $$); }
2150 ;
2151
2152 dim_expr:
2153         OSB_TK expression CSB_TK
2154                 {
2155                   if (JNUMERIC_TYPE_P (TREE_TYPE ($2)))
2156                     {
2157                       $2 = build_wfl_node ($2);
2158                       TREE_TYPE ($2) = NULL_TREE;
2159                     }
2160                   EXPR_WFL_LINECOL ($2) = $1.location;
2161                   $$ = $2;
2162                 }
2163 |       OSB_TK expression error
2164                 {yyerror ("']' expected"); RECOVER;}
2165 |       OSB_TK error
2166                 {
2167                   yyerror ("Missing term");
2168                   yyerror ("']' expected");
2169                   RECOVER;
2170                 }
2171 ;
2172
2173 dims:
2174         OSB_TK CSB_TK
2175                 {
2176                   int allocate = 0;
2177                   /* If not initialized, allocate memory for the osb
2178                      numbers stack */
2179                   if (!ctxp->osb_limit)
2180                     {
2181                       allocate = ctxp->osb_limit = 32;
2182                       ctxp->osb_depth = -1;
2183                     }
2184                   /* If capacity overflown, reallocate a bigger chunk */
2185                   else if (ctxp->osb_depth+1 == ctxp->osb_limit)
2186                     allocate = ctxp->osb_limit << 1;
2187
2188                   if (allocate)
2189                     {
2190                       allocate *= sizeof (int);
2191                       if (ctxp->osb_number)
2192                         ctxp->osb_number = xrealloc (ctxp->osb_number,
2193                                                      allocate);
2194                       else
2195                         ctxp->osb_number = xmalloc (allocate);
2196                     }
2197                   ctxp->osb_depth++;
2198                   CURRENT_OSB (ctxp) = 1;
2199                 }
2200 |       dims OSB_TK CSB_TK
2201                 { CURRENT_OSB (ctxp)++; }
2202 |       dims OSB_TK error
2203                 { yyerror ("']' expected"); RECOVER;}
2204 ;
2205
2206 field_access:
2207         primary DOT_TK identifier
2208                 { $$ = make_qualified_primary ($1, $3, $2.location); }
2209                 /*  FIXME - REWRITE TO:
2210                 { $$ = build_binop (COMPONENT_REF, $2.location, $1, $3); } */
2211 |       SUPER_TK DOT_TK identifier
2212                 {
2213                   tree super_wfl = build_wfl_node (super_identifier_node);
2214                   EXPR_WFL_LINECOL (super_wfl) = $1.location;
2215                   $$ = make_qualified_name (super_wfl, $3, $2.location);
2216                 }
2217 |       SUPER_TK error
2218                 {yyerror ("Field expected"); DRECOVER (super_field_acces);}
2219 ;
2220
2221 method_invocation:
2222         name OP_TK CP_TK
2223                 { $$ = build_method_invocation ($1, NULL_TREE); }
2224 |       name OP_TK argument_list CP_TK
2225                 { $$ = build_method_invocation ($1, $3); }
2226 |       primary DOT_TK identifier OP_TK CP_TK
2227                 {
2228                   if (TREE_CODE ($1) == THIS_EXPR)
2229                     $$ = build_this_super_qualified_invocation
2230                       (1, $3, NULL_TREE, 0, $2.location);
2231                   else
2232                     {
2233                       tree invok = build_method_invocation ($3, NULL_TREE);
2234                       $$ = make_qualified_primary ($1, invok, $2.location);
2235                     }
2236                 }
2237 |       primary DOT_TK identifier OP_TK argument_list CP_TK
2238                 {
2239                   if (TREE_CODE ($1) == THIS_EXPR)
2240                     $$ = build_this_super_qualified_invocation
2241                       (1, $3, $5, 0, $2.location);
2242                   else
2243                     {
2244                       tree invok = build_method_invocation ($3, $5);
2245                       $$ = make_qualified_primary ($1, invok, $2.location);
2246                     }
2247                 }
2248 |       SUPER_TK DOT_TK identifier OP_TK CP_TK
2249                 {
2250                   $$ = build_this_super_qualified_invocation
2251                     (0, $3, NULL_TREE, $1.location, $2.location);
2252                 }
2253 |       SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
2254                 {
2255                   $$ = build_this_super_qualified_invocation
2256                     (0, $3, $5, $1.location, $2.location);
2257                 }
2258         /* Screws up thing. I let it here until I'm convinced it can
2259            be removed. FIXME
2260 |       primary DOT_TK error
2261                 {yyerror ("'(' expected"); DRECOVER(bad);} */
2262 |       SUPER_TK DOT_TK error CP_TK
2263                 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2264 |       SUPER_TK DOT_TK error DOT_TK
2265                 { yyerror ("'(' expected"); DRECOVER (method_invocation); }
2266 ;
2267
2268 array_access:
2269         name OSB_TK expression CSB_TK
2270                 { $$ = build_array_ref ($2.location, $1, $3); }
2271 |       primary_no_new_array OSB_TK expression CSB_TK
2272                 { $$ = build_array_ref ($2.location, $1, $3); }
2273 |       name OSB_TK error
2274                 {
2275                   yyerror ("Missing term and ']' expected");
2276                   DRECOVER(array_access);
2277                 }
2278 |       name OSB_TK expression error
2279                 {
2280                   yyerror ("']' expected");
2281                   DRECOVER(array_access);
2282                 }
2283 |       primary_no_new_array OSB_TK error
2284                 {
2285                   yyerror ("Missing term and ']' expected");
2286                   DRECOVER(array_access);
2287                 }
2288 |       primary_no_new_array OSB_TK expression error
2289                 {
2290                   yyerror ("']' expected");
2291                   DRECOVER(array_access);
2292                 }
2293 ;
2294
2295 postfix_expression:
2296         primary
2297 |       name
2298 |       post_increment_expression
2299 |       post_decrement_expression
2300 ;
2301
2302 post_increment_expression:
2303         postfix_expression INCR_TK
2304                 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2305 ;
2306
2307 post_decrement_expression:
2308         postfix_expression DECR_TK
2309                 { $$ = build_incdec ($2.token, $2.location, $1, 1); }
2310 ;
2311
2312 trap_overflow_corner_case:
2313         pre_increment_expression
2314 |       pre_decrement_expression
2315 |       PLUS_TK unary_expression
2316                 {$$ = build_unaryop ($1.token, $1.location, $2); }
2317 |       unary_expression_not_plus_minus
2318 |       PLUS_TK error
2319                 {yyerror ("Missing term"); RECOVER}
2320 ;
2321
2322 unary_expression:
2323         trap_overflow_corner_case
2324                 {
2325                   error_if_numeric_overflow ($1);
2326                   $$ = $1;
2327                 }
2328 |       MINUS_TK trap_overflow_corner_case
2329                 {$$ = build_unaryop ($1.token, $1.location, $2); }
2330 |       MINUS_TK error
2331                 {yyerror ("Missing term"); RECOVER}
2332 ;
2333
2334 pre_increment_expression:
2335         INCR_TK unary_expression
2336                 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2337 |       INCR_TK error
2338                 {yyerror ("Missing term"); RECOVER}
2339 ;
2340
2341 pre_decrement_expression:
2342         DECR_TK unary_expression
2343                 {$$ = build_incdec ($1.token, $1.location, $2, 0); }
2344 |       DECR_TK error
2345                 {yyerror ("Missing term"); RECOVER}
2346 ;
2347
2348 unary_expression_not_plus_minus:
2349         postfix_expression
2350 |       NOT_TK unary_expression
2351                 {$$ = build_unaryop ($1.token, $1.location, $2); }
2352 |       NEG_TK unary_expression
2353                 {$$ = build_unaryop ($1.token, $1.location, $2); }
2354 |       cast_expression
2355 |       NOT_TK error
2356                 {yyerror ("Missing term"); RECOVER}
2357 |       NEG_TK error
2358                 {yyerror ("Missing term"); RECOVER}
2359 ;
2360
2361 cast_expression:                /* Error handling here is potentially weak */
2362         OP_TK primitive_type dims CP_TK unary_expression
2363                 {
2364                   tree type = $2;
2365                   int osb = pop_current_osb (ctxp);
2366                   while (osb--)
2367                     type = build_java_array_type (type, -1);
2368                   $$ = build_cast ($1.location, type, $5);
2369                 }
2370 |       OP_TK primitive_type CP_TK unary_expression
2371                 { $$ = build_cast ($1.location, $2, $4); }
2372 |       OP_TK expression CP_TK unary_expression_not_plus_minus
2373                 { $$ = build_cast ($1.location, $2, $4); }
2374 |       OP_TK name dims CP_TK unary_expression_not_plus_minus
2375                 {
2376                   const char *ptr;
2377                   int osb = pop_current_osb (ctxp);
2378                   obstack_grow (&temporary_obstack,
2379                                 IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)),
2380                                 IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2)));
2381                   while (osb--)
2382                     obstack_grow (&temporary_obstack, "[]", 2);
2383                   obstack_1grow (&temporary_obstack, '\0');
2384                   ptr = obstack_finish (&temporary_obstack);
2385                   EXPR_WFL_NODE ($2) = get_identifier (ptr);
2386                   $$ = build_cast ($1.location, $2, $5);
2387                 }
2388 |       OP_TK primitive_type OSB_TK error
2389                 {yyerror ("']' expected, invalid type expression");}
2390 |       OP_TK error
2391                 {
2392                   YYNOT_TWICE yyerror ("Invalid type expression"); RECOVER;
2393                   RECOVER;
2394                 }
2395 |       OP_TK primitive_type dims CP_TK error
2396                 {yyerror ("Missing term"); RECOVER;}
2397 |       OP_TK primitive_type CP_TK error
2398                 {yyerror ("Missing term"); RECOVER;}
2399 |       OP_TK name dims CP_TK error
2400                 {yyerror ("Missing term"); RECOVER;}
2401 ;
2402
2403 multiplicative_expression:
2404         unary_expression
2405 |       multiplicative_expression MULT_TK unary_expression
2406                 {
2407                   $$ = build_binop (BINOP_LOOKUP ($2.token),
2408                                     $2.location, $1, $3);
2409                 }
2410 |       multiplicative_expression DIV_TK unary_expression
2411                 {
2412                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2413                                     $1, $3);
2414                 }
2415 |       multiplicative_expression REM_TK unary_expression
2416                 {
2417                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2418                                     $1, $3);
2419                 }
2420 |       multiplicative_expression MULT_TK error
2421                 {yyerror ("Missing term"); RECOVER;}
2422 |       multiplicative_expression DIV_TK error
2423                 {yyerror ("Missing term"); RECOVER;}
2424 |       multiplicative_expression REM_TK error
2425                 {yyerror ("Missing term"); RECOVER;}
2426 ;
2427
2428 additive_expression:
2429         multiplicative_expression
2430 |       additive_expression PLUS_TK multiplicative_expression
2431                 {
2432                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2433                                     $1, $3);
2434                 }
2435 |       additive_expression MINUS_TK multiplicative_expression
2436                 {
2437                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2438                                     $1, $3);
2439                 }
2440 |       additive_expression PLUS_TK error
2441                 {yyerror ("Missing term"); RECOVER;}
2442 |       additive_expression MINUS_TK error
2443                 {yyerror ("Missing term"); RECOVER;}
2444 ;
2445
2446 shift_expression:
2447         additive_expression
2448 |       shift_expression LS_TK additive_expression
2449                 {
2450                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2451                                     $1, $3);
2452                 }
2453 |       shift_expression SRS_TK additive_expression
2454                 {
2455                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2456                                     $1, $3);
2457                 }
2458 |       shift_expression ZRS_TK additive_expression
2459                 {
2460                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2461                                     $1, $3);
2462                 }
2463 |       shift_expression LS_TK error
2464                 {yyerror ("Missing term"); RECOVER;}
2465 |       shift_expression SRS_TK error
2466                 {yyerror ("Missing term"); RECOVER;}
2467 |       shift_expression ZRS_TK error
2468                 {yyerror ("Missing term"); RECOVER;}
2469 ;
2470
2471 relational_expression:
2472         shift_expression
2473 |       relational_expression LT_TK shift_expression
2474                 {
2475                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2476                                     $1, $3);
2477                 }
2478 |       relational_expression GT_TK shift_expression
2479                 {
2480                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2481                                     $1, $3);
2482                 }
2483 |       relational_expression LTE_TK shift_expression
2484                 {
2485                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2486                                     $1, $3);
2487                 }
2488 |       relational_expression GTE_TK shift_expression
2489                 {
2490                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2491                                     $1, $3);
2492                 }
2493 |       relational_expression INSTANCEOF_TK reference_type
2494                 { $$ = build_binop (INSTANCEOF_EXPR, $2.location, $1, $3); }
2495 |       relational_expression LT_TK error
2496                 {yyerror ("Missing term"); RECOVER;}
2497 |       relational_expression GT_TK error
2498                 {yyerror ("Missing term"); RECOVER;}
2499 |       relational_expression LTE_TK error
2500                 {yyerror ("Missing term"); RECOVER;}
2501 |       relational_expression GTE_TK error
2502                 {yyerror ("Missing term"); RECOVER;}
2503 |       relational_expression INSTANCEOF_TK error
2504                 {yyerror ("Invalid reference type"); RECOVER;}
2505 ;
2506
2507 equality_expression:
2508         relational_expression
2509 |       equality_expression EQ_TK relational_expression
2510                 {
2511                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2512                                     $1, $3);
2513                 }
2514 |       equality_expression NEQ_TK relational_expression
2515                 {
2516                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2517                                     $1, $3);
2518                 }
2519 |       equality_expression EQ_TK error
2520                 {yyerror ("Missing term"); RECOVER;}
2521 |       equality_expression NEQ_TK error
2522                 {yyerror ("Missing term"); RECOVER;}
2523 ;
2524
2525 and_expression:
2526         equality_expression
2527 |       and_expression AND_TK equality_expression
2528                 {
2529                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2530                                     $1, $3);
2531                 }
2532 |       and_expression AND_TK error
2533                 {yyerror ("Missing term"); RECOVER;}
2534 ;
2535
2536 exclusive_or_expression:
2537         and_expression
2538 |       exclusive_or_expression XOR_TK and_expression
2539                 {
2540                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2541                                     $1, $3);
2542                 }
2543 |       exclusive_or_expression XOR_TK error
2544                 {yyerror ("Missing term"); RECOVER;}
2545 ;
2546
2547 inclusive_or_expression:
2548         exclusive_or_expression
2549 |       inclusive_or_expression OR_TK exclusive_or_expression
2550                 {
2551                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2552                                     $1, $3);
2553                 }
2554 |       inclusive_or_expression OR_TK error
2555                 {yyerror ("Missing term"); RECOVER;}
2556 ;
2557
2558 conditional_and_expression:
2559         inclusive_or_expression
2560 |       conditional_and_expression BOOL_AND_TK inclusive_or_expression
2561                 {
2562                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2563                                     $1, $3);
2564                 }
2565 |       conditional_and_expression BOOL_AND_TK error
2566                 {yyerror ("Missing term"); RECOVER;}
2567 ;
2568
2569 conditional_or_expression:
2570         conditional_and_expression
2571 |       conditional_or_expression BOOL_OR_TK conditional_and_expression
2572                 {
2573                   $$ = build_binop (BINOP_LOOKUP ($2.token), $2.location,
2574                                     $1, $3);
2575                 }
2576 |       conditional_or_expression BOOL_OR_TK error
2577                 {yyerror ("Missing term"); RECOVER;}
2578 ;
2579
2580 conditional_expression:         /* Error handling here is weak */
2581         conditional_or_expression
2582 |       conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
2583                 {
2584                   $$ = build (CONDITIONAL_EXPR, NULL_TREE, $1, $3, $5);
2585                   EXPR_WFL_LINECOL ($$) = $2.location;
2586                 }
2587 |       conditional_or_expression REL_QM_TK REL_CL_TK error
2588                 {
2589                   YYERROR_NOW;
2590                   yyerror ("Missing term");
2591                   DRECOVER (1);
2592                 }
2593 |       conditional_or_expression REL_QM_TK error
2594                 {yyerror ("Missing term"); DRECOVER (2);}
2595 |       conditional_or_expression REL_QM_TK expression REL_CL_TK error
2596                 {yyerror ("Missing term"); DRECOVER (3);}
2597 ;
2598
2599 assignment_expression:
2600         conditional_expression
2601 |       assignment
2602 ;
2603
2604 assignment:
2605         left_hand_side assignment_operator assignment_expression
2606                 { $$ = build_assignment ($2.token, $2.location, $1, $3); }
2607 |       left_hand_side assignment_operator error
2608                 {
2609                   YYNOT_TWICE yyerror ("Missing term");
2610                   DRECOVER (assign);
2611                 }
2612 ;
2613
2614 left_hand_side:
2615         name
2616 |       field_access
2617 |       array_access
2618 ;
2619
2620 assignment_operator:
2621         ASSIGN_ANY_TK
2622 |       ASSIGN_TK
2623 ;
2624
2625 expression:
2626         assignment_expression
2627 ;
2628
2629 constant_expression:
2630         expression
2631 ;
2632
2633 %%
2634
2635 /* Helper function to retrieve an OSB count. Should be used when the
2636    `dims:' rule is being used.  */
2637
2638 static int
2639 pop_current_osb (struct parser_ctxt *ctxp)
2640 {
2641   int to_return;
2642
2643   if (ctxp->osb_depth < 0)
2644     abort ();
2645
2646   to_return = CURRENT_OSB (ctxp);
2647   ctxp->osb_depth--;
2648
2649   return to_return;
2650 }
2651
2652 \f
2653
2654 /* This section of the code deal with save/restoring parser contexts.
2655    Add mode documentation here. FIXME */
2656
2657 /* Helper function. Create a new parser context. With
2658    COPY_FROM_PREVIOUS set to a nonzero value, content of the previous
2659    context is copied, otherwise, the new context is zeroed. The newly
2660    created context becomes the current one.  */
2661
2662 static void
2663 create_new_parser_context (int copy_from_previous)
2664 {
2665   struct parser_ctxt *new;
2666
2667   new = ggc_alloc (sizeof (struct parser_ctxt));
2668   if (copy_from_previous)
2669     {
2670       memcpy (new, ctxp, sizeof (struct parser_ctxt));
2671       /* This flag, indicating the context saves global values,
2672          should only be set by java_parser_context_save_global.  */
2673       new->saved_data_ctx = 0;
2674     }
2675   else
2676     memset (new, 0, sizeof (struct parser_ctxt));
2677
2678   new->next = ctxp;
2679   ctxp = new;
2680 }
2681
2682 /* Create a new parser context and make it the current one. */
2683
2684 void
2685 java_push_parser_context (void)
2686 {
2687   create_new_parser_context (0);
2688 }
2689
2690 void
2691 java_pop_parser_context (int generate)
2692 {
2693   tree current;
2694   struct parser_ctxt *toFree, *next;
2695
2696   if (!ctxp)
2697     return;
2698
2699   toFree = ctxp;
2700   next = ctxp->next;
2701   if (next)
2702     {
2703       input_line = ctxp->lineno;
2704       current_class = ctxp->class_type;
2705     }
2706
2707   /* If the old and new lexers differ, then free the old one.  */
2708   if (ctxp->lexer && next && ctxp->lexer != next->lexer)
2709     java_destroy_lexer (ctxp->lexer);
2710
2711   /* Set the single import class file flag to 0 for the current list
2712      of imported things */
2713   for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2714     IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 0;
2715
2716   /* And restore those of the previous context */
2717   if ((ctxp = next))            /* Assignment is really meant here */
2718     for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
2719       IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 1;
2720
2721   /* If we pushed a context to parse a class intended to be generated,
2722      we keep it so we can remember the class. What we could actually
2723      do is to just update a list of class names.  */
2724   if (generate)
2725     {
2726       toFree->next = ctxp_for_generation;
2727       ctxp_for_generation = toFree;
2728     }
2729 }
2730
2731 /* Create a parser context for the use of saving some global
2732    variables.  */
2733
2734 void
2735 java_parser_context_save_global (void)
2736 {
2737   if (!ctxp)
2738     {
2739       java_push_parser_context ();
2740       ctxp->saved_data_ctx = 1;
2741     }
2742
2743   /* If this context already stores data, create a new one suitable
2744      for data storage. */
2745   else if (ctxp->saved_data)
2746     {
2747       create_new_parser_context (1);
2748       ctxp->saved_data_ctx = 1;
2749     }
2750
2751   ctxp->lineno = input_line;
2752   ctxp->class_type = current_class;
2753   ctxp->filename = input_filename;
2754   ctxp->function_decl = current_function_decl;
2755   ctxp->saved_data = 1;
2756 }
2757
2758 /* Restore some global variables from the previous context. Make the
2759    previous context the current one.  */
2760
2761 void
2762 java_parser_context_restore_global (void)
2763 {
2764   input_line = ctxp->lineno;
2765   current_class = ctxp->class_type;
2766   input_filename = ctxp->filename;
2767   if (wfl_operator)
2768     EXPR_WFL_FILENAME_NODE (wfl_operator) = get_identifier (input_filename);
2769   current_function_decl = ctxp->function_decl;
2770   ctxp->saved_data = 0;
2771   if (ctxp->saved_data_ctx)
2772     java_pop_parser_context (0);
2773 }
2774
2775 /* Suspend vital data for the current class/function being parsed so
2776    that an other class can be parsed. Used to let local/anonymous
2777    classes be parsed.  */
2778
2779 static void
2780 java_parser_context_suspend (void)
2781 {
2782   /* This makes debugging through java_debug_context easier */
2783   static const char *const name = "<inner buffer context>";
2784
2785   /* Duplicate the previous context, use it to save the globals we're
2786      interested in */
2787   create_new_parser_context (1);
2788   ctxp->function_decl = current_function_decl;
2789   ctxp->class_type = current_class;
2790
2791   /* Then create a new context which inherits all data from the
2792      previous one. This will be the new current context  */
2793   create_new_parser_context (1);
2794
2795   /* Help debugging */
2796   ctxp->next->filename = name;
2797 }
2798
2799 /* Resume vital data for the current class/function being parsed so
2800    that an other class can be parsed. Used to let local/anonymous
2801    classes be parsed.  The trick is the data storing file position
2802    informations must be restored to their current value, so parsing
2803    can resume as if no context was ever saved. */
2804
2805 static void
2806 java_parser_context_resume (void)
2807 {
2808   struct parser_ctxt *old = ctxp;             /* This one is to be discarded */
2809   struct parser_ctxt *saver = old->next;      /* This one contain saved info */
2810   struct parser_ctxt *restored = saver->next; /* This one is the old current */
2811
2812   /* We need to inherit the list of classes to complete/generate */
2813   restored->classd_list = old->classd_list;
2814   restored->class_list = old->class_list;
2815
2816   /* Restore the current class and function from the saver */
2817   current_class = saver->class_type;
2818   current_function_decl = saver->function_decl;
2819
2820   /* Retrieve the restored context */
2821   ctxp = restored;
2822
2823   /* Re-installed the data for the parsing to carry on */
2824   memcpy (&ctxp->marker_begining, &old->marker_begining,
2825           (size_t)(&ctxp->marker_end - &ctxp->marker_begining));
2826 }
2827
2828 /* Add a new anchor node to which all statement(s) initializing static
2829    and non static initialized upon declaration field(s) will be
2830    linked.  */
2831
2832 static void
2833 java_parser_context_push_initialized_field (void)
2834 {
2835   tree node;
2836
2837   node = build_tree_list (NULL_TREE, NULL_TREE);
2838   TREE_CHAIN (node) = CPC_STATIC_INITIALIZER_LIST (ctxp);
2839   CPC_STATIC_INITIALIZER_LIST (ctxp) = node;
2840
2841   node = build_tree_list (NULL_TREE, NULL_TREE);
2842   TREE_CHAIN (node) = CPC_INITIALIZER_LIST (ctxp);
2843   CPC_INITIALIZER_LIST (ctxp) = node;
2844
2845   node = build_tree_list (NULL_TREE, NULL_TREE);
2846   TREE_CHAIN (node) = CPC_INSTANCE_INITIALIZER_LIST (ctxp);
2847   CPC_INSTANCE_INITIALIZER_LIST (ctxp) = node;
2848 }
2849
2850 /* Pop the lists of initialized field. If this lists aren't empty,
2851    remember them so we can use it to create and populate the finit$
2852    or <clinit> functions. */
2853
2854 static void
2855 java_parser_context_pop_initialized_field (void)
2856 {
2857   tree stmts;
2858   tree class_type = TREE_TYPE (GET_CPC ());
2859
2860   if (CPC_INITIALIZER_LIST (ctxp))
2861     {
2862       stmts = CPC_INITIALIZER_STMT (ctxp);
2863       CPC_INITIALIZER_LIST (ctxp) = TREE_CHAIN (CPC_INITIALIZER_LIST (ctxp));
2864       if (stmts && !java_error_count)
2865         TYPE_FINIT_STMT_LIST (class_type) = reorder_static_initialized (stmts);
2866     }
2867
2868   if (CPC_STATIC_INITIALIZER_LIST (ctxp))
2869     {
2870       stmts = CPC_STATIC_INITIALIZER_STMT (ctxp);
2871       CPC_STATIC_INITIALIZER_LIST (ctxp) =
2872         TREE_CHAIN (CPC_STATIC_INITIALIZER_LIST (ctxp));
2873       /* Keep initialization in order to enforce 8.5 */
2874       if (stmts && !java_error_count)
2875         TYPE_CLINIT_STMT_LIST (class_type) = nreverse (stmts);
2876     }
2877
2878   /* JDK 1.1 instance initializers */
2879   if (CPC_INSTANCE_INITIALIZER_LIST (ctxp))
2880     {
2881       stmts = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
2882       CPC_INSTANCE_INITIALIZER_LIST (ctxp) =
2883         TREE_CHAIN (CPC_INSTANCE_INITIALIZER_LIST (ctxp));
2884       if (stmts && !java_error_count)
2885         TYPE_II_STMT_LIST (class_type) = nreverse (stmts);
2886     }
2887 }
2888
2889 static tree
2890 reorder_static_initialized (tree list)
2891 {
2892   /* We have to keep things in order. The alias initializer have to
2893      come first, then the initialized regular field, in reverse to
2894      keep them in lexical order. */
2895   tree marker, previous = NULL_TREE;
2896   for (marker = list; marker; previous = marker, marker = TREE_CHAIN (marker))
2897     if (TREE_CODE (marker) == TREE_LIST
2898         && !TREE_VALUE (marker) && !TREE_PURPOSE (marker))
2899       break;
2900
2901   /* No static initialized, the list is fine as is */
2902   if (!previous)
2903     list = TREE_CHAIN (marker);
2904
2905   /* No marker? reverse the whole list */
2906   else if (!marker)
2907     list = nreverse (list);
2908
2909   /* Otherwise, reverse what's after the marker and the new reordered
2910      sublist will replace the marker. */
2911   else
2912     {
2913       TREE_CHAIN (previous) = NULL_TREE;
2914       list = nreverse (list);
2915       list = chainon (TREE_CHAIN (marker), list);
2916     }
2917   return list;
2918 }
2919
2920 /* Helper functions to dump the parser context stack.  */
2921
2922 #define TAB_CONTEXT(C) \
2923   {int i; for (i = 0; i < (C); i++) fputc (' ', stderr);}
2924
2925 static void
2926 java_debug_context_do (int tab)
2927 {
2928   struct parser_ctxt *copy = ctxp;
2929   while (copy)
2930     {
2931       TAB_CONTEXT (tab);
2932       fprintf (stderr, "ctxt: 0x%0lX\n", (unsigned long)copy);
2933       TAB_CONTEXT (tab);
2934       fprintf (stderr, "filename: %s\n", copy->filename);
2935       TAB_CONTEXT (tab);
2936       fprintf (stderr, "lineno: %d\n", copy->lineno);
2937       TAB_CONTEXT (tab);
2938       fprintf (stderr, "package: %s\n",
2939                (copy->package ?
2940                 IDENTIFIER_POINTER (copy->package) : "<none>"));
2941       TAB_CONTEXT (tab);
2942       fprintf (stderr, "context for saving: %d\n", copy->saved_data_ctx);
2943       TAB_CONTEXT (tab);
2944       fprintf (stderr, "saved data: %d\n", copy->saved_data);
2945       copy = copy->next;
2946       tab += 2;
2947     }
2948 }
2949
2950 /* Dump the stacked up parser contexts. Intended to be called from a
2951    debugger.  */
2952
2953 void
2954 java_debug_context (void)
2955 {
2956   java_debug_context_do (0);
2957 }
2958
2959 \f
2960
2961 /* Flag for the error report routine to issue the error the first time
2962    it's called (overriding the default behavior which is to drop the
2963    first invocation and honor the second one, taking advantage of a
2964    richer context.  */
2965 static int force_error = 0;
2966
2967 /* Reporting an constructor invocation error.  */
2968 static void
2969 parse_ctor_invocation_error (void)
2970 {
2971   if (DECL_CONSTRUCTOR_P (current_function_decl))
2972     yyerror ("Constructor invocation must be first thing in a constructor");
2973   else
2974     yyerror ("Only constructors can invoke constructors");
2975 }
2976
2977 /* Reporting JDK1.1 features not implemented.  */
2978
2979 static tree
2980 parse_jdk1_1_error (const char *msg)
2981 {
2982   sorry (": `%s' JDK1.1(TM) feature", msg);
2983   java_error_count++;
2984   return build_java_empty_stmt ();
2985 }
2986
2987 static int do_warning = 0;
2988
2989 void
2990 yyerror (const char *msg)
2991 {
2992   static java_lc elc;
2993   static int  prev_lineno;
2994   static const char *prev_msg;
2995
2996   int save_lineno;
2997   char *remainder, *code_from_source;
2998
2999   if (!force_error && prev_lineno == input_line)
3000     return;
3001
3002   /* Save current error location but report latter, when the context is
3003      richer.  */
3004   if (ctxp->java_error_flag == 0)
3005     {
3006       ctxp->java_error_flag = 1;
3007       elc = ctxp->elc;
3008       /* Do something to use the previous line if we're reaching the
3009          end of the file... */
3010 #ifdef VERBOSE_SKELETON
3011       printf ("* Error detected (%s)\n", (msg ? msg : "(null)"));
3012 #endif
3013       return;
3014     }
3015
3016   /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
3017   if (!force_error && msg == prev_msg && prev_lineno == elc.line)
3018     return;
3019
3020   ctxp->java_error_flag = 0;
3021   if (do_warning)
3022     java_warning_count++;
3023   else
3024     java_error_count++;
3025
3026   if (elc.col == 0 && msg && msg[1] == ';')
3027     {
3028       elc.col  = ctxp->p_line->char_col-1;
3029       elc.line = ctxp->p_line->lineno;
3030     }
3031
3032   save_lineno = input_line;
3033   prev_lineno = input_line = elc.line;
3034   prev_msg = msg;
3035
3036   code_from_source = java_get_line_col (ctxp->filename, elc.line, elc.col);
3037   obstack_grow0 (&temporary_obstack,
3038                  code_from_source, strlen (code_from_source));
3039   remainder = obstack_finish (&temporary_obstack);
3040   if (do_warning)
3041     warning ("%s.\n%s", msg, remainder);
3042   else
3043     error ("%s.\n%s", msg, remainder);
3044
3045   /* This allow us to cheaply avoid an extra 'Invalid expression
3046      statement' error report when errors have been already reported on
3047      the same line. This occurs when we report an error but don't have
3048      a synchronization point other than ';', which
3049      expression_statement is the only one to take care of.  */
3050   ctxp->prevent_ese = input_line = save_lineno;
3051 }
3052
3053 static void
3054 issue_warning_error_from_context (tree cl, const char *msg, va_list ap)
3055 {
3056   const char *saved, *saved_input_filename;
3057   char buffer [4096];
3058   vsprintf (buffer, msg, ap);
3059   force_error = 1;
3060
3061   ctxp->elc.line = EXPR_WFL_LINENO (cl);
3062   ctxp->elc.col  = (EXPR_WFL_COLNO (cl) == 0xfff ? -1 :
3063                     (EXPR_WFL_COLNO (cl) == 0xffe ? -2 : EXPR_WFL_COLNO (cl)));
3064
3065   /* We have a CL, that's a good reason for using it if it contains data */
3066   saved = ctxp->filename;
3067   if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
3068     ctxp->filename = EXPR_WFL_FILENAME (cl);
3069   saved_input_filename = input_filename;
3070   input_filename = ctxp->filename;
3071   java_error (NULL);
3072   java_error (buffer);
3073   ctxp->filename = saved;
3074   input_filename = saved_input_filename;
3075   force_error = 0;
3076 }
3077
3078 /* Issue an error message at a current source line CL */
3079
3080 void
3081 parse_error_context (tree cl, const char *msg, ...)
3082 {
3083   va_list ap;
3084   va_start (ap, msg);
3085   issue_warning_error_from_context (cl, msg, ap);
3086   va_end (ap);
3087 }
3088
3089 /* Issue a warning at a current source line CL */
3090
3091 static void
3092 parse_warning_context (tree cl, const char *msg, ...)
3093 {
3094   va_list ap;
3095   va_start (ap, msg);
3096
3097   force_error = do_warning = 1;
3098   issue_warning_error_from_context (cl, msg, ap);
3099   do_warning = force_error = 0;
3100   va_end (ap);
3101 }
3102
3103 static tree
3104 find_expr_with_wfl (tree node)
3105 {
3106   while (node)
3107     {
3108       char code;
3109       tree to_return;
3110
3111       switch (TREE_CODE (node))
3112         {
3113         case BLOCK:
3114           node = BLOCK_EXPR_BODY (node);
3115           continue;
3116
3117         case COMPOUND_EXPR:
3118           to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
3119           if (to_return)
3120             return to_return;
3121           node = TREE_OPERAND (node, 1);
3122           continue;
3123
3124         case LOOP_EXPR:
3125           node = TREE_OPERAND (node, 0);
3126           continue;
3127
3128         case LABELED_BLOCK_EXPR:
3129           node = TREE_OPERAND (node, 1);
3130           continue;
3131
3132         default:
3133           code = TREE_CODE_CLASS (TREE_CODE (node));
3134           if (((code == '1') || (code == '2') || (code == 'e'))
3135               && EXPR_WFL_LINECOL (node))
3136             return node;
3137           return NULL_TREE;
3138         }
3139     }
3140   return NULL_TREE;
3141 }
3142
3143 /* Issue a missing return statement error. Uses METHOD to figure the
3144    last line of the method the error occurs in.  */
3145
3146 static void
3147 missing_return_error (tree method)
3148 {
3149   EXPR_WFL_SET_LINECOL (wfl_operator, DECL_FUNCTION_LAST_LINE (method), -2);
3150   parse_error_context (wfl_operator, "Missing return statement");
3151 }
3152
3153 /* Issue an unreachable statement error. From NODE, find the next
3154    statement to report appropriately.  */
3155 static void
3156 unreachable_stmt_error (tree node)
3157 {
3158   /* Browse node to find the next expression node that has a WFL. Use
3159      the location to report the error */
3160   if (TREE_CODE (node) == COMPOUND_EXPR)
3161     node = find_expr_with_wfl (TREE_OPERAND (node, 1));
3162   else
3163     node = find_expr_with_wfl (node);
3164
3165   if (node)
3166     {
3167       EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
3168       parse_error_context (wfl_operator, "Unreachable statement");
3169     }
3170   else
3171     abort ();
3172 }
3173
3174 static int
3175 not_accessible_field_error (tree wfl, tree decl)
3176 {
3177   parse_error_context 
3178     (wfl, "Can't access %s field `%s.%s' from `%s'",
3179      accessibility_string (get_access_flags_from_decl (decl)),
3180      GET_TYPE_NAME (DECL_CONTEXT (decl)),
3181      IDENTIFIER_POINTER (DECL_NAME (decl)),
3182      IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
3183   return 1;
3184 }
3185
3186 int
3187 java_report_errors (void)
3188 {
3189   if (java_error_count)
3190     fprintf (stderr, "%d error%s",
3191              java_error_count, (java_error_count == 1 ? "" : "s"));
3192   if (java_warning_count)
3193     fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
3194              java_warning_count, (java_warning_count == 1 ? "" : "s"));
3195   if (java_error_count || java_warning_count)
3196     putc ('\n', stderr);
3197   return java_error_count;
3198 }
3199
3200 static char *
3201 java_accstring_lookup (int flags)
3202 {
3203   static char buffer [80];
3204 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
3205
3206   /* Access modifier looked-up first for easier report on forbidden
3207      access. */
3208   if (flags & ACC_PUBLIC) COPY_RETURN ("public");
3209   if (flags & ACC_PRIVATE) COPY_RETURN ("private");
3210   if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
3211   if (flags & ACC_STATIC) COPY_RETURN ("static");
3212   if (flags & ACC_FINAL) COPY_RETURN ("final");
3213   if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
3214   if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
3215   if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
3216   if (flags & ACC_NATIVE) COPY_RETURN ("native");
3217   if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
3218   if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
3219
3220   buffer [0] = '\0';
3221   return buffer;
3222 #undef COPY_RETURN
3223 }
3224
3225 /* Returns a string denoting the accessibility of a class or a member as
3226    indicated by FLAGS.  We need a separate function from
3227    java_accstring_lookup, as the latter can return spurious "static", etc.
3228    if package-private access is defined (in which case none of the
3229    relevant access control bits in FLAGS is set).  */
3230
3231 static const char *
3232 accessibility_string (int flags)
3233 {
3234   if (flags & ACC_PRIVATE) return "private";
3235   if (flags & ACC_PROTECTED) return "protected";
3236   if (flags & ACC_PUBLIC) return "public";
3237
3238   return "package-private";
3239 }
3240
3241 /* Issuing error messages upon redefinition of classes, interfaces or
3242    variables. */
3243
3244 static void
3245 classitf_redefinition_error (const char *context, tree id, tree decl, tree cl)
3246 {
3247   parse_error_context (cl, "%s `%s' already defined in %s:%d",
3248                        context, IDENTIFIER_POINTER (id),
3249                        DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3250   /* Here we should point out where its redefined. It's a unicode. FIXME */
3251 }
3252
3253 static void
3254 variable_redefinition_error (tree context, tree name, tree type, int line)
3255 {
3256   const char *type_name;
3257
3258   /* Figure a proper name for type. We might haven't resolved it */
3259   if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
3260     type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
3261   else
3262     type_name = lang_printable_name (type, 0);
3263
3264   parse_error_context (context,
3265                        "Variable `%s' is already defined in this method and was declared `%s %s' at line %d",
3266                        IDENTIFIER_POINTER (name),
3267                        type_name, IDENTIFIER_POINTER (name), line);
3268 }
3269
3270 /* If ANAME is terminated with `[]', it indicates an array. This
3271    function returns the number of `[]' found and if this number is
3272    greater than zero, it extracts the array type name and places it in
3273    the node pointed to by TRIMMED unless TRIMMED is null.  */
3274
3275 static int
3276 build_type_name_from_array_name (tree aname, tree *trimmed)
3277 {
3278   const char *name = IDENTIFIER_POINTER (aname);
3279   int len = IDENTIFIER_LENGTH (aname);
3280   int array_dims;
3281
3282   STRING_STRIP_BRACKETS (name, len, array_dims);
3283
3284   if (array_dims && trimmed)
3285     *trimmed = get_identifier_with_length (name, len);
3286
3287   return array_dims;
3288 }
3289
3290 static tree
3291 build_array_from_name (tree type, tree type_wfl, tree name, tree *ret_name)
3292 {
3293   int more_dims = 0;
3294
3295   /* Eventually get more dims */
3296   more_dims = build_type_name_from_array_name (name, &name);
3297
3298   /* If we have, then craft a new type for this variable */
3299   if (more_dims)
3300     {
3301       tree save = type;
3302
3303       /* If we have a pointer, use its type */
3304       if (TREE_CODE (type) == POINTER_TYPE)
3305         type = TREE_TYPE (type);
3306
3307       /* Building the first dimension of a primitive type uses this
3308          function */
3309       if (JPRIMITIVE_TYPE_P (type))
3310         {
3311           type = build_java_array_type (type, -1);
3312           more_dims--;
3313         }
3314       /* Otherwise, if we have a WFL for this type, use it (the type
3315          is already an array on an unresolved type, and we just keep
3316          on adding dimensions) */
3317       else if (type_wfl)
3318         {
3319           type = type_wfl;
3320           more_dims += build_type_name_from_array_name (TYPE_NAME (save),
3321                                                         NULL);
3322         }
3323
3324       /* Add all the dimensions */
3325       while (more_dims--)
3326         type = build_unresolved_array_type (type);
3327
3328       /* The type may have been incomplete in the first place */
3329       if (type_wfl)
3330         type = obtain_incomplete_type (type);
3331     }
3332
3333   if (ret_name)
3334     *ret_name = name;
3335   return type;
3336 }
3337
3338 /* Build something that the type identifier resolver will identify as
3339    being an array to an unresolved type. TYPE_WFL is a WFL on a
3340    identifier. */
3341
3342 static tree
3343 build_unresolved_array_type (tree type_or_wfl)
3344 {
3345   const char *ptr;
3346   tree wfl;
3347
3348   /* TYPE_OR_WFL might be an array on a resolved type. In this case,
3349      just create a array type */
3350   if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
3351     return build_java_array_type (type_or_wfl, -1);
3352
3353   obstack_grow (&temporary_obstack,
3354                  IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
3355                  IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
3356   obstack_grow0 (&temporary_obstack, "[]", 2);
3357   ptr = obstack_finish (&temporary_obstack);
3358   wfl = build_expr_wfl (get_identifier (ptr),
3359                         EXPR_WFL_FILENAME (type_or_wfl),
3360                         EXPR_WFL_LINENO (type_or_wfl),
3361                         EXPR_WFL_COLNO (type_or_wfl));
3362   /* Re-install the existing qualifications so that the type can be
3363      resolved properly. */
3364   EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl);
3365   return wfl;
3366 }
3367
3368 static void
3369 parser_add_interface (tree class_decl, tree interface_decl, tree wfl)
3370 {
3371   if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
3372     parse_error_context (wfl, "Interface `%s' repeated",
3373                          IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
3374 }
3375
3376 /* Bulk of common class/interface checks. Return 1 if an error was
3377    encountered. TAG is 0 for a class, 1 for an interface.  */
3378
3379 static int
3380 check_class_interface_creation (int is_interface, int flags, tree raw_name,
3381                                 tree qualified_name, tree decl, tree cl)
3382 {
3383   tree node;
3384   int sca = 0;                  /* Static class allowed */
3385   int icaf = 0;                 /* Inner class allowed flags */
3386   int uaaf = CLASS_MODIFIERS;   /* Usually allowed access flags */
3387
3388   if (!quiet_flag)
3389     fprintf (stderr, " %s%s %s",
3390              (CPC_INNER_P () ? "inner" : ""),
3391              (is_interface ? "interface" : "class"),
3392              IDENTIFIER_POINTER (qualified_name));
3393
3394   /* Scope of an interface/class type name:
3395        - Can't be imported by a single type import
3396        - Can't already exists in the package */
3397   if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
3398       && (node = find_name_in_single_imports (raw_name))
3399       && !CPC_INNER_P ())
3400     {
3401       parse_error_context
3402         (cl, "%s name `%s' clashes with imported type `%s'",
3403          (is_interface ? "Interface" : "Class"),
3404          IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
3405       return 1;
3406     }
3407   if (decl && CLASS_COMPLETE_P (decl))
3408     {
3409       classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
3410                                    qualified_name, decl, cl);
3411       return 1;
3412     }
3413
3414   if (check_inner_class_redefinition (raw_name, cl))
3415     return 1;
3416
3417   /* If public, file name should match class/interface name, except
3418      when dealing with an inner class */
3419   if (!CPC_INNER_P () && (flags & ACC_PUBLIC ))
3420     {
3421       const char *f;
3422
3423       for (f = &input_filename [strlen (input_filename)];
3424            f != input_filename && ! IS_DIR_SEPARATOR (f[0]);
3425            f--)
3426         ;
3427       if (IS_DIR_SEPARATOR (f[0]))
3428         f++;
3429       if (strncmp (IDENTIFIER_POINTER (raw_name),
3430                    f , IDENTIFIER_LENGTH (raw_name)) ||
3431           f [IDENTIFIER_LENGTH (raw_name)] != '.')
3432         parse_error_context
3433           (cl, "Public %s `%s' must be defined in a file called `%s.java'",
3434                              (is_interface ? "interface" : "class"),
3435                              IDENTIFIER_POINTER (qualified_name),
3436                              IDENTIFIER_POINTER (raw_name));
3437     }
3438
3439   /* Static classes can be declared only in top level classes. Note:
3440      once static, a inner class is a top level class. */
3441   if (flags & ACC_STATIC)
3442     {
3443       /* Catch the specific error of declaring an class inner class
3444          with no toplevel enclosing class. Prevent check_modifiers from
3445          complaining a second time */
3446       if (CPC_INNER_P () && !TOPLEVEL_CLASS_DECL_P (GET_CPC()))
3447         {
3448           parse_error_context (cl, "Inner class `%s' can't be static. Static classes can only occur in interfaces and top-level classes",
3449                                IDENTIFIER_POINTER (qualified_name));
3450           sca = ACC_STATIC;
3451         }
3452       /* Else, in the context of a top-level class declaration, let
3453          `check_modifiers' do its job, otherwise, give it a go */
3454       else
3455         sca = (GET_CPC_LIST () ? ACC_STATIC : 0);
3456     }
3457
3458   /* Inner classes can be declared private or protected
3459      within their enclosing classes. */
3460   if (CPC_INNER_P ())
3461     {
3462       /* A class which is local to a block can't be public, private,
3463          protected or static. But it is created final, so allow this
3464          one. */
3465       if (current_function_decl)
3466         icaf = sca = uaaf = ACC_FINAL;
3467       else
3468         {
3469           check_modifiers_consistency (flags);
3470           icaf = ACC_PROTECTED;
3471           if (! CLASS_INTERFACE (GET_CPC ()))
3472             icaf |= ACC_PRIVATE;
3473         }
3474     }
3475
3476   if (is_interface)
3477     {
3478       if (CPC_INNER_P ())
3479         uaaf = INTERFACE_INNER_MODIFIERS;
3480       else
3481         uaaf = INTERFACE_MODIFIERS;
3482
3483       check_modifiers ("Illegal modifier `%s' for interface declaration",
3484                        flags, uaaf);
3485     }
3486   else
3487     check_modifiers ((current_function_decl ?
3488                       "Illegal modifier `%s' for local class declaration" :
3489                       "Illegal modifier `%s' for class declaration"),
3490                      flags, uaaf|sca|icaf);
3491   return 0;
3492 }
3493
3494 /* Construct a nested class name.  If the final component starts with
3495    a digit, return true.  Otherwise return false.  */
3496 static int
3497 make_nested_class_name (tree cpc_list)
3498 {
3499   tree name;
3500
3501   if (!cpc_list)
3502     return 0;
3503
3504   make_nested_class_name (TREE_CHAIN (cpc_list));
3505
3506   /* Pick the qualified name when dealing with the first upmost
3507      enclosing class */
3508   name = (TREE_CHAIN (cpc_list)
3509           ? TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list)));
3510   obstack_grow (&temporary_obstack,
3511                 IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name));
3512   obstack_1grow (&temporary_obstack, '$');
3513
3514   return ISDIGIT (IDENTIFIER_POINTER (name)[0]);
3515 }
3516
3517 /* Can't redefine a class already defined in an earlier scope. */
3518
3519 static int
3520 check_inner_class_redefinition (tree raw_name, tree cl)
3521 {
3522   tree scope_list;
3523
3524   for (scope_list = GET_CPC_LIST (); scope_list;
3525        scope_list = GET_NEXT_ENCLOSING_CPC (scope_list))
3526     if (raw_name == GET_CPC_UN_NODE (scope_list))
3527       {
3528         parse_error_context
3529           (cl, "The class name `%s' is already defined in this scope. An inner class may not have the same simple name as any of its enclosing classes",
3530            IDENTIFIER_POINTER (raw_name));
3531         return 1;
3532       }
3533   return 0;
3534 }
3535
3536 /* Tries to find a decl for CLASS_TYPE within ENCLOSING. If we fail,
3537    we remember ENCLOSING and SUPER.  */
3538
3539 static tree
3540 resolve_inner_class (htab_t circularity_hash, tree cl, tree *enclosing,
3541                      tree *super, tree class_type)
3542 {
3543   tree local_enclosing = *enclosing;
3544   tree local_super = NULL_TREE;
3545
3546   while (local_enclosing)
3547     {
3548       tree intermediate, decl;
3549
3550       *htab_find_slot (circularity_hash, local_enclosing, INSERT) =
3551         local_enclosing;
3552
3553       if ((decl = find_as_inner_class (local_enclosing, class_type, cl)))
3554         return decl;
3555
3556       intermediate = local_enclosing;
3557       /* Explore enclosing contexts. */
3558       while (INNER_CLASS_DECL_P (intermediate))
3559         {
3560           intermediate = DECL_CONTEXT (intermediate);
3561           if ((decl = find_as_inner_class (intermediate, class_type, cl)))
3562             return decl;
3563         }
3564
3565       /* Now go to the upper classes, bail out if necessary.  We will
3566          analyze the returned SUPER and act accordingly (see
3567          do_resolve_class).  */
3568       if (JPRIMITIVE_TYPE_P (TREE_TYPE (local_enclosing))
3569           || TREE_TYPE (local_enclosing) == void_type_node)
3570         {
3571           parse_error_context (cl, "Qualifier must be a reference");
3572           local_enclosing = NULL_TREE;
3573           break;
3574         }
3575       local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing));
3576       if (!local_super || local_super == object_type_node)
3577         break;
3578
3579       if (TREE_CODE (local_super) == POINTER_TYPE)
3580         local_super = do_resolve_class (NULL, local_super, NULL, NULL);
3581       else
3582         local_super = TYPE_NAME (local_super);
3583
3584       /* We may not have checked for circular inheritance yet, so do so
3585          here to prevent an infinite loop. */
3586       if (htab_find (circularity_hash, local_super) != NULL)
3587         {
3588           if (!cl)
3589             cl = lookup_cl (local_enclosing);
3590
3591           parse_error_context
3592             (cl, "Cyclic inheritance involving %s",
3593              IDENTIFIER_POINTER (DECL_NAME (local_enclosing)));
3594           local_enclosing = NULL_TREE;
3595         }
3596       else
3597         local_enclosing = local_super;
3598     }
3599
3600   /* We failed. Return LOCAL_SUPER and LOCAL_ENCLOSING. */
3601   *super = local_super;
3602   *enclosing = local_enclosing;
3603
3604   return NULL_TREE;
3605 }
3606
3607 /* Within ENCLOSING, find a decl for NAME and return it. NAME can be
3608    qualified. */
3609
3610 static tree
3611 find_as_inner_class (tree enclosing, tree name, tree cl)
3612 {
3613   tree qual, to_return;
3614   if (!enclosing)
3615     return NULL_TREE;
3616
3617   name = TYPE_NAME (name);
3618
3619   /* First search: within the scope of `enclosing', search for name */
3620   if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3621     qual = EXPR_WFL_QUALIFICATION (cl);
3622   else if (cl)
3623     qual = build_tree_list (cl, NULL_TREE);
3624   else
3625     qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3626
3627   if ((to_return = find_as_inner_class_do (qual, enclosing)))
3628     return to_return;
3629
3630   /* We're dealing with a qualified name. Try to resolve thing until
3631      we get something that is an enclosing class. */
3632   if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3633     {
3634       tree acc = NULL_TREE, decl = NULL_TREE, ptr;
3635
3636       for (qual = EXPR_WFL_QUALIFICATION (cl); qual && !decl;
3637            qual = TREE_CHAIN (qual))
3638         {
3639           acc = merge_qualified_name (acc,
3640                                       EXPR_WFL_NODE (TREE_PURPOSE (qual)));
3641           BUILD_PTR_FROM_NAME (ptr, acc);
3642           decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl);
3643         }
3644
3645       /* A NULL qual and a decl means that the search ended
3646          successfully?!? We have to do something then. FIXME */
3647
3648       if (decl)
3649         enclosing = decl;
3650       else
3651         qual = EXPR_WFL_QUALIFICATION (cl);
3652     }
3653   /* Otherwise, create a qual for the other part of the resolution. */
3654   else
3655     qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3656
3657   return find_as_inner_class_do (qual, enclosing);
3658 }
3659
3660 /* We go inside the list of sub classes and try to find a way
3661    through. */
3662
3663 static tree
3664 find_as_inner_class_do (tree qual, tree enclosing)
3665 {
3666   if (!qual)
3667     return NULL_TREE;
3668
3669   for (; qual && enclosing; qual = TREE_CHAIN (qual))
3670     {
3671       tree name_to_match = EXPR_WFL_NODE (TREE_PURPOSE (qual));
3672       tree next_enclosing = NULL_TREE;
3673       tree inner_list;
3674
3675       for (inner_list = DECL_INNER_CLASS_LIST (enclosing);
3676            inner_list; inner_list = TREE_CHAIN (inner_list))
3677         {
3678           if (TREE_VALUE (inner_list) == name_to_match)
3679             {
3680               next_enclosing = TREE_PURPOSE (inner_list);
3681               break;
3682             }
3683         }
3684       enclosing = next_enclosing;
3685     }
3686
3687   return (!qual && enclosing ? enclosing : NULL_TREE);
3688 }
3689
3690 static void
3691 link_nested_class_to_enclosing (void)
3692 {
3693   if (GET_ENCLOSING_CPC ())
3694     {
3695       tree enclosing = GET_ENCLOSING_CPC_CONTEXT ();
3696       DECL_INNER_CLASS_LIST (enclosing) =
3697         tree_cons (GET_CPC (), GET_CPC_UN (),
3698                    DECL_INNER_CLASS_LIST (enclosing));
3699     }
3700 }
3701
3702 static tree
3703 maybe_make_nested_class_name (tree name)
3704 {
3705   tree id = NULL_TREE;
3706
3707   if (CPC_INNER_P ())
3708     {
3709       /* If we're in a function, we must append a number to create the
3710          nested class name.  However, we don't do this if the class we
3711          are constructing is anonymous, because in that case we'll
3712          already have a number as the class name.  */
3713       if (! make_nested_class_name (GET_CPC_LIST ())
3714           && current_function_decl != NULL_TREE
3715           && ! ISDIGIT (IDENTIFIER_POINTER (name)[0]))
3716         {
3717           char buf[10];
3718           sprintf (buf, "%d", anonymous_class_counter);
3719           ++anonymous_class_counter;
3720           obstack_grow (&temporary_obstack, buf, strlen (buf));
3721           obstack_1grow (&temporary_obstack, '$');
3722         }
3723       obstack_grow0 (&temporary_obstack,
3724                      IDENTIFIER_POINTER (name),
3725                      IDENTIFIER_LENGTH (name));
3726       id = get_identifier (obstack_finish (&temporary_obstack));
3727       if (ctxp->package)
3728         QUALIFIED_P (id) = 1;
3729     }
3730   return id;
3731 }
3732
3733 /* If DECL is NULL, create and push a new DECL, record the current
3734    line CL and do other maintenance things.  */
3735
3736 static tree
3737 maybe_create_class_interface_decl (tree decl, tree raw_name,
3738                                    tree qualified_name, tree cl)
3739 {
3740   if (!decl)
3741     decl = push_class (make_class (), qualified_name);
3742
3743   /* Take care of the file and line business */
3744   DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
3745   /* If we're emitting xrefs, store the line/col number information */
3746   if (flag_emit_xref)
3747     DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
3748   else
3749     DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
3750   CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
3751   CLASS_PARSED_P (TREE_TYPE (decl)) = 1;
3752   CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
3753     IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
3754
3755   PUSH_CPC (decl, raw_name);
3756   DECL_CONTEXT (decl) = GET_ENCLOSING_CPC_CONTEXT ();
3757
3758   /* Link the declaration to the already seen ones */
3759   TREE_CHAIN (decl) = ctxp->class_list;
3760   ctxp->class_list = decl;
3761
3762   /* Create a new nodes in the global lists */
3763   gclass_list = tree_cons (NULL_TREE, decl, gclass_list);
3764   all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
3765
3766   /* Install a new dependency list element */
3767   create_jdep_list (ctxp);
3768
3769   SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
3770                           IDENTIFIER_POINTER (qualified_name)));
3771   return decl;
3772 }
3773
3774 static void
3775 add_superinterfaces (tree decl, tree interface_list)
3776 {
3777   tree node;
3778   /* Superinterface(s): if present and defined, parser_check_super_interface ()
3779      takes care of ensuring that:
3780        - This is an accessible interface type,
3781        - Circularity detection.
3782    parser_add_interface is then called. If present but not defined,
3783    the check operation is delayed until the super interface gets
3784    defined.  */
3785   for (node = interface_list; node; node = TREE_CHAIN (node))
3786     {
3787       tree current = TREE_PURPOSE (node);
3788       tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
3789       if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
3790         {
3791           if (!parser_check_super_interface (idecl, decl, current))
3792             parser_add_interface (decl, idecl, current);
3793         }
3794       else
3795         register_incomplete_type (JDEP_INTERFACE,
3796                                   current, decl, NULL_TREE);
3797     }
3798 }
3799
3800 /* Create an interface in pass1 and return its decl. Return the
3801    interface's decl in pass 2.  */
3802
3803 static tree
3804 create_interface (int flags, tree id, tree super)
3805 {
3806   tree raw_name = EXPR_WFL_NODE (id);
3807   tree q_name = parser_qualified_classname (raw_name);
3808   tree decl = IDENTIFIER_CLASS_VALUE (q_name);
3809
3810   /* Certain syntax errors are making SUPER be like ID. Avoid this
3811      case. */
3812   if (ctxp->class_err && id == super)
3813     super = NULL;
3814
3815   EXPR_WFL_NODE (id) = q_name;  /* Keep source location, even if refined. */
3816
3817   /* Basic checks: scope, redefinition, modifiers */
3818   if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
3819     {
3820       PUSH_ERROR ();
3821       return NULL_TREE;
3822     }
3823
3824   /* Suspend the current parsing context if we're parsing an inner
3825      interface */
3826   if (CPC_INNER_P ())
3827     {
3828       java_parser_context_suspend ();
3829       /* Interface members are public. */
3830       if (CLASS_INTERFACE (GET_CPC ()))
3831         flags |= ACC_PUBLIC;
3832     }
3833
3834   /* Push a new context for (static) initialized upon declaration fields */
3835   java_parser_context_push_initialized_field ();
3836
3837   /* Interface modifiers check
3838        - public/abstract allowed (already done at that point)
3839        - abstract is obsolete (comes first, it's a warning, or should be)
3840        - Can't use twice the same (checked in the modifier rule) */
3841   if ((flags & ACC_ABSTRACT) && flag_redundant)
3842     parse_warning_context
3843       (MODIFIER_WFL (ABSTRACT_TK),
3844        "Redundant use of `abstract' modifier. Interface `%s' is implicitly abstract", IDENTIFIER_POINTER (raw_name));
3845
3846   /* Create a new decl if DECL is NULL, otherwise fix it */
3847   decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id);
3848
3849   /* Interfaces are always abstract. */
3850   flags |= ACC_ABSTRACT;
3851
3852   /* Inner interfaces are always static.  */
3853   if (INNER_CLASS_DECL_P (decl))
3854     flags |= ACC_STATIC;
3855
3856   /* Set super info and mark the class a complete */
3857   set_super_info (ACC_INTERFACE | flags, TREE_TYPE (decl),
3858                   object_type_node, ctxp->interface_number);
3859   ctxp->interface_number = 0;
3860   CLASS_COMPLETE_P (decl) = 1;
3861   add_superinterfaces (decl, super);
3862
3863   /* Eventually sets the @deprecated tag flag */
3864   CHECK_DEPRECATED (decl);
3865
3866   return decl;
3867 }
3868
3869 /* Patch anonymous class CLASS, by either extending or implementing
3870    DEP.  */
3871
3872 static void
3873 patch_anonymous_class (tree type_decl, tree class_decl, tree wfl)
3874 {
3875   tree class = TREE_TYPE (class_decl);
3876   tree type =  TREE_TYPE (type_decl);
3877   tree binfo = TYPE_BINFO (class);
3878
3879   /* If it's an interface, implement it */
3880   if (CLASS_INTERFACE (type_decl))
3881     {
3882       if (parser_check_super_interface (type_decl, class_decl, wfl))
3883         return;
3884
3885       if (VEC_space (tree, BINFO_BASE_BINFOS (binfo), 1))
3886         {
3887            /* Extend the binfo - by reallocating and copying it. */
3888           tree new_binfo;
3889           tree base_binfo;
3890           int i;
3891           
3892           new_binfo = make_tree_binfo ((BINFO_N_BASE_BINFOS (binfo) + 1) * 2);
3893           for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
3894             BINFO_BASE_APPEND (new_binfo, base_binfo);
3895           CLASS_HAS_SUPER_FLAG (new_binfo) = CLASS_HAS_SUPER_FLAG (binfo);
3896           BINFO_VTABLE (new_binfo) = BINFO_VTABLE (binfo);
3897           TYPE_BINFO (class) = new_binfo;
3898         }
3899       
3900       /* And add the interface */
3901       parser_add_interface (class_decl, type_decl, wfl);
3902     }
3903   /* Otherwise, it's a type we want to extend */
3904   else
3905     {
3906       if (parser_check_super (type_decl, class_decl, wfl))
3907         return;
3908       BINFO_TYPE (BINFO_BASE_BINFO (binfo, 0)) = type;
3909     }
3910 }
3911
3912 /* Create an anonymous class which extends/implements TYPE_NAME, and return
3913    its decl.  */
3914
3915 static tree
3916 create_anonymous_class (tree type_name)
3917 {
3918   char buffer [80];
3919   tree super = NULL_TREE, itf = NULL_TREE;
3920   tree id, type_decl, class;
3921
3922   /* The unqualified name of the anonymous class. It's just a number. */
3923   sprintf (buffer, "%d", anonymous_class_counter++);
3924   id = build_wfl_node (get_identifier (buffer));
3925   EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (type_name);
3926
3927   /* We know about the type to extend/implement. We go ahead */
3928   if ((type_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (type_name))))
3929     {
3930       /* Create a class which either implements on extends the designated
3931          class. The class bears an inaccessible name. */
3932       if (CLASS_INTERFACE (type_decl))
3933         {
3934           /* It's OK to modify it here. It's been already used and
3935              shouldn't be reused */
3936           ctxp->interface_number = 1;
3937           /* Interfaces should presented as a list of WFLs */
3938           itf = build_tree_list (type_name, NULL_TREE);
3939         }
3940       else
3941         super = type_name;
3942     }
3943
3944   class = create_class (ACC_FINAL, id, super, itf);
3945
3946   /* We didn't know anything about the stuff. We register a dependence. */
3947   if (!type_decl)
3948     register_incomplete_type (JDEP_ANONYMOUS, type_name, class, NULL_TREE);
3949
3950   ANONYMOUS_CLASS_P (TREE_TYPE (class)) = 1;
3951   return class;
3952 }
3953
3954 /* Create a class in pass1 and return its decl. Return class
3955    interface's decl in pass 2.  */
3956
3957 static tree
3958 create_class (int flags, tree id, tree super, tree interfaces)
3959 {
3960   tree raw_name = EXPR_WFL_NODE (id);
3961   tree class_id, decl;
3962   tree super_decl_type;
3963
3964   /* Certain syntax errors are making SUPER be like ID. Avoid this
3965      case. */
3966   if (ctxp->class_err && id == super)
3967     super = NULL;
3968
3969   class_id = parser_qualified_classname (raw_name);
3970   decl = IDENTIFIER_CLASS_VALUE (class_id);
3971   EXPR_WFL_NODE (id) = class_id;
3972
3973   /* Basic check: scope, redefinition, modifiers */
3974   if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
3975     {
3976       PUSH_ERROR ();
3977       return NULL_TREE;
3978     }
3979
3980   /* Suspend the current parsing context if we're parsing an inner
3981      class or an anonymous class. */
3982   if (CPC_INNER_P ())
3983     {
3984       java_parser_context_suspend ();
3985       /* Interface members are public. */
3986       if (CLASS_INTERFACE (GET_CPC ()))
3987         flags |= ACC_PUBLIC;
3988     }
3989
3990   /* Push a new context for (static) initialized upon declaration fields */
3991   java_parser_context_push_initialized_field ();
3992
3993   /* Class modifier check:
3994        - Allowed modifier (already done at that point)
3995        - abstract AND final forbidden
3996        - Public classes defined in the correct file */
3997   if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
3998     parse_error_context
3999       (id, "Class `%s' can't be declared both abstract and final",
4000        IDENTIFIER_POINTER (raw_name));
4001
4002   /* Create a new decl if DECL is NULL, otherwise fix it */
4003   decl = maybe_create_class_interface_decl (decl, raw_name, class_id, id);
4004
4005   /* If SUPER exists, use it, otherwise use Object */
4006   if (super)
4007     {
4008       /* java.lang.Object can't extend anything.  */
4009       if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
4010         {
4011           parse_error_context (id, "`java.lang.Object' can't extend anything");
4012           return NULL_TREE;
4013         }
4014
4015       super_decl_type =
4016         register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
4017     }
4018   else if (TREE_TYPE (decl) != object_type_node)
4019     super_decl_type = object_type_node;
4020   /* We're defining java.lang.Object */
4021   else
4022     super_decl_type = NULL_TREE;
4023
4024   /* A class nested in an interface is implicitly static. */
4025   if (INNER_CLASS_DECL_P (decl)
4026       && CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (DECL_CONTEXT (decl)))))
4027     {
4028       flags |= ACC_STATIC;
4029     }
4030
4031   /* Set super info and mark the class as complete. */
4032   set_super_info (flags, TREE_TYPE (decl), super_decl_type,
4033                   ctxp->interface_number);
4034   ctxp->interface_number = 0;
4035   CLASS_COMPLETE_P (decl) = 1;
4036   add_superinterfaces (decl, interfaces);
4037
4038   /* TYPE_VFIELD' is a compiler-generated field used to point to
4039      virtual function tables.  In gcj, every class has a common base
4040      virtual function table in java.lang.object.  */
4041   TYPE_VFIELD (TREE_TYPE (decl)) = TYPE_VFIELD (object_type_node);
4042
4043   /* Add the private this$<n> field, Replicate final locals still in
4044      scope as private final fields mangled like val$<local_name>.
4045      This does not occur for top level (static) inner classes. */
4046   if (PURE_INNER_CLASS_DECL_P (decl))
4047     add_inner_class_fields (decl, current_function_decl);
4048
4049   /* If doing xref, store the location at which the inherited class
4050      (if any) was seen. */
4051   if (flag_emit_xref && super)
4052     DECL_INHERITED_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (super);
4053
4054   /* Eventually sets the @deprecated tag flag */
4055   CHECK_DEPRECATED (decl);
4056
4057   /* Reset the anonymous class counter when declaring non inner classes */
4058   if (!INNER_CLASS_DECL_P (decl))
4059     anonymous_class_counter = 1;
4060
4061   return decl;
4062 }
4063
4064 /* End a class declaration: register the statements used to create
4065    finit$ and <clinit>, pop the current class and resume the prior
4066    parser context if necessary.  */
4067
4068 static void
4069 end_class_declaration (int resume)
4070 {
4071   /* If an error occurred, context weren't pushed and won't need to be
4072      popped by a resume. */
4073   int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node;
4074
4075   if (GET_CPC () != error_mark_node)
4076     dump_java_tree (TDI_class, GET_CPC ());
4077
4078   java_parser_context_pop_initialized_field ();
4079   POP_CPC ();
4080   if (resume && no_error_occurred)
4081     java_parser_context_resume ();
4082
4083   /* We're ending a class declaration, this is a good time to reset
4084      the interface cout. Note that might have been already done in
4085      create_interface, but if at that time an inner class was being
4086      dealt with, the interface count was reset in a context created
4087      for the sake of handling inner classes declaration. */
4088   ctxp->interface_number = 0;
4089 }
4090
4091 static void
4092 add_inner_class_fields (tree class_decl, tree fct_decl)
4093 {
4094   tree block, marker, f;
4095
4096   f = add_field (TREE_TYPE (class_decl),
4097                  build_current_thisn (TREE_TYPE (class_decl)),
4098                  build_pointer_type (TREE_TYPE (DECL_CONTEXT (class_decl))),
4099                  ACC_PRIVATE);
4100   FIELD_THISN (f) = 1;
4101
4102   if (!fct_decl)
4103     return;
4104
4105   for (block = GET_CURRENT_BLOCK (fct_decl);
4106        block && TREE_CODE (block) == BLOCK; block = BLOCK_SUPERCONTEXT (block))
4107     {
4108       tree decl;
4109       for (decl = BLOCK_EXPR_DECLS (block); decl; decl = TREE_CHAIN (decl))
4110         {
4111           tree name, pname;
4112           tree wfl, init, list;
4113
4114           /* Avoid non final arguments. */
4115           if (!LOCAL_FINAL_P (decl))
4116             continue;
4117
4118           MANGLE_OUTER_LOCAL_VARIABLE_NAME (name, DECL_NAME (decl));
4119           MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID (pname, DECL_NAME (decl));
4120           wfl = build_wfl_node (name);
4121           init = build_wfl_node (pname);
4122           /* Build an initialization for the field: it will be
4123              initialized by a parameter added to finit$, bearing a
4124              mangled name of the field itself (param$<n>.) The
4125              parameter is provided to finit$ by the constructor
4126              invoking it (hence the constructor will also feature a
4127              hidden parameter, set to the value of the outer context
4128              local at the time the inner class is created.)
4129
4130              Note: we take into account all possible locals that can
4131              be accessed by the inner class. It's actually not trivial
4132              to minimize these aliases down to the ones really
4133              used. One way to do that would be to expand all regular
4134              methods first, then finit$ to get a picture of what's
4135              used.  It works with the exception that we would have to
4136              go back on all constructor invoked in regular methods to
4137              have their invocation reworked (to include the right amount
4138              of alias initializer parameters.)
4139
4140              The only real way around, I think, is a first pass to
4141              identify locals really used in the inner class. We leave
4142              the flag FIELD_LOCAL_ALIAS_USED around for that future
4143              use.
4144
4145              On the other hand, it only affect local inner classes,
4146              whose constructors (and finit$ call) will be featuring
4147              unnecessary arguments. It's easy for a developer to keep
4148              this number of parameter down by using the `final'
4149              keyword only when necessary. For the time being, we can
4150              issue a warning on unnecessary finals. FIXME */
4151           init = build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (wfl),
4152                                    wfl, init);
4153
4154           /* Register the field. The TREE_LIST holding the part
4155              initialized/initializer will be marked ARG_FINAL_P so
4156              that the created field can be marked
4157              FIELD_LOCAL_ALIAS. */
4158           list = build_tree_list (wfl, init);
4159           ARG_FINAL_P (list) = 1;
4160           register_fields (ACC_PRIVATE | ACC_FINAL, TREE_TYPE (decl), list);
4161         }
4162     }
4163
4164   if (!CPC_INITIALIZER_STMT (ctxp))
4165     return;
4166
4167   /* If we ever registered an alias field, insert and marker to
4168      remember where the list ends. The second part of the list (the one
4169      featuring initialized fields) so it can be later reversed to
4170      enforce 8.5. The marker will be removed during that operation. */
4171   marker = build_tree_list (NULL_TREE, NULL_TREE);
4172   TREE_CHAIN (marker) = CPC_INITIALIZER_STMT (ctxp);
4173   SET_CPC_INITIALIZER_STMT (ctxp, marker);
4174 }
4175
4176 /* Can't use lookup_field () since we don't want to load the class and
4177    can't set the CLASS_LOADED_P flag */
4178
4179 static tree
4180 find_field (tree class, tree name)
4181 {
4182   tree decl;
4183   for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
4184     {
4185       if (DECL_NAME (decl) == name)
4186         return decl;
4187     }
4188   return NULL_TREE;
4189 }
4190
4191 /* Wrap around lookup_field that doesn't potentially upset the value
4192    of CLASS */
4193
4194 static tree
4195 lookup_field_wrapper (tree class, tree name)
4196 {
4197   tree type = class;
4198   tree decl = NULL_TREE;
4199   java_parser_context_save_global ();
4200
4201   /* Last chance: if we're within the context of an inner class, we
4202      might be trying to access a local variable defined in an outer
4203      context. We try to look for it now. */
4204   if (INNER_CLASS_TYPE_P (class) && TREE_CODE (name) == IDENTIFIER_NODE)
4205     {
4206       tree new_name;
4207       MANGLE_OUTER_LOCAL_VARIABLE_NAME (new_name, name);
4208       decl = lookup_field (&type, new_name);
4209       if (decl && decl != error_mark_node)
4210         FIELD_LOCAL_ALIAS_USED (decl) = 1;
4211     }
4212   if (!decl || decl == error_mark_node)
4213     {
4214       type = class;
4215       decl = lookup_field (&type, name);
4216     }
4217
4218   /* If the field still hasn't been found, try the next enclosing context. */
4219   if (!decl && INNER_CLASS_TYPE_P (class))
4220     {
4221       tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class)));
4222       decl = lookup_field_wrapper (outer_type, name);
4223     }
4224
4225   java_parser_context_restore_global ();
4226   return decl == error_mark_node ? NULL : decl;
4227 }
4228
4229 /* Find duplicate field within the same class declarations and report
4230    the error. Returns 1 if a duplicated field was found, 0
4231    otherwise.  */
4232
4233 static int
4234 duplicate_declaration_error_p (tree new_field_name, tree new_type, tree cl)
4235 {
4236   /* This might be modified to work with method decl as well */
4237   tree decl = find_field (TREE_TYPE (GET_CPC ()), new_field_name);
4238   if (decl)
4239     {
4240       char *t1 = xstrdup (purify_type_name
4241                          ((TREE_CODE (new_type) == POINTER_TYPE
4242                            && TREE_TYPE (new_type) == NULL_TREE) ?
4243                           IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
4244                           lang_printable_name (new_type, 1)));
4245       /* The type may not have been completed by the time we report
4246          the error */
4247       char *t2 = xstrdup (purify_type_name
4248                          ((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
4249                            && TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
4250                           IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
4251                           lang_printable_name (TREE_TYPE (decl), 1)));
4252       parse_error_context
4253         (cl , "Duplicate variable declaration: `%s %s' was `%s %s' (%s:%d)",
4254          t1, IDENTIFIER_POINTER (new_field_name),
4255          t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
4256          DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4257       free (t1);
4258       free (t2);
4259       return 1;
4260     }
4261   return 0;
4262 }
4263
4264 /* Field registration routine. If TYPE doesn't exist, field
4265    declarations are linked to the undefined TYPE dependency list, to
4266    be later resolved in java_complete_class () */
4267
4268 static void
4269 register_fields (int flags, tree type, tree variable_list)
4270 {
4271   tree current, saved_type;
4272   tree class_type = NULL_TREE;
4273   int saved_lineno = input_line;
4274   int must_chain = 0;
4275   tree wfl = NULL_TREE;
4276
4277   if (GET_CPC ())
4278     class_type = TREE_TYPE (GET_CPC ());
4279
4280   if (!class_type || class_type == error_mark_node)
4281     return;
4282
4283   /* If we're adding fields to interfaces, those fields are public,
4284      static, final */
4285   if (CLASS_INTERFACE (TYPE_NAME (class_type)))
4286     {
4287       OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
4288                                  flags, ACC_PUBLIC, "interface field(s)");
4289       OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
4290                                  flags, ACC_STATIC, "interface field(s)");
4291       OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
4292                                  flags, ACC_FINAL, "interface field(s)");
4293       check_modifiers ("Illegal interface member modifier `%s'", flags,
4294                        INTERFACE_FIELD_MODIFIERS);
4295       flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
4296     }
4297
4298   /* Obtain a suitable type for resolution, if necessary */
4299   SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
4300
4301   /* If TYPE is fully resolved and we don't have a reference, make one */
4302   PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4303
4304   for (current = variable_list, saved_type = type; current;
4305        current = TREE_CHAIN (current), type = saved_type)
4306     {
4307       tree real_type;
4308       tree field_decl;
4309       tree cl = TREE_PURPOSE (current);
4310       tree init = TREE_VALUE (current);
4311       tree current_name = EXPR_WFL_NODE (cl);
4312
4313       /* Can't declare non-final static fields in inner classes */
4314       if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (class_type)
4315           && !(flags & ACC_FINAL))
4316         parse_error_context
4317           (cl, "Field `%s' can't be static in inner class `%s' unless it is final",
4318            IDENTIFIER_POINTER (EXPR_WFL_NODE (cl)),
4319            lang_printable_name (class_type, 0));
4320
4321       /* Process NAME, as it may specify extra dimension(s) for it */
4322       type = build_array_from_name (type, wfl, current_name, &current_name);
4323
4324       /* Type adjustment. We may have just readjusted TYPE because
4325          the variable specified more dimensions. Make sure we have
4326          a reference if we can and don't have one already. Also
4327          change the name if we have an init. */
4328       if (type != saved_type)
4329         {
4330           PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4331           if (init)
4332             EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
4333         }
4334
4335       real_type = GET_REAL_TYPE (type);
4336       /* Check for redeclarations */
4337       if (duplicate_declaration_error_p (current_name, real_type, cl))
4338         continue;
4339
4340       /* Set input_line to the line the field was found and create a
4341          declaration for it. Eventually sets the @deprecated tag flag. */
4342       if (flag_emit_xref)
4343         input_line = EXPR_WFL_LINECOL (cl);
4344       else
4345         input_line = EXPR_WFL_LINENO (cl);
4346       field_decl = add_field (class_type, current_name, real_type, flags);
4347       CHECK_DEPRECATED_NO_RESET (field_decl);
4348
4349       /* If the field denotes a final instance variable, then we
4350          allocate a LANG_DECL_SPECIFIC part to keep track of its
4351          initialization. We also mark whether the field was
4352          initialized upon its declaration. We don't do that if the
4353          created field is an alias to a final local. */
4354       if (!ARG_FINAL_P (current) && (flags & ACC_FINAL))
4355         {
4356           MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl);
4357           DECL_FIELD_FINAL_WFL (field_decl) = cl;
4358         }
4359
4360       /* If the couple initializer/initialized is marked ARG_FINAL_P,
4361          we mark the created field FIELD_LOCAL_ALIAS, so that we can
4362          hide parameters to this inner class finit$ and
4363          constructors. It also means that the field isn't final per
4364          say. */
4365       if (ARG_FINAL_P (current))
4366         {
4367           FIELD_LOCAL_ALIAS (field_decl) = 1;
4368           FIELD_FINAL (field_decl) = 0;
4369         }
4370
4371       /* Check if we must chain. */
4372       if (must_chain)
4373         register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
4374
4375       /* If we have an initialization value tied to the field */
4376       if (init)
4377         {
4378           /* The field is declared static */
4379           if (flags & ACC_STATIC)
4380             {
4381               /* We include the field and its initialization part into
4382                  a list used to generate <clinit>. After <clinit> is
4383                  walked, field initializations will be processed and
4384                  fields initialized with known constants will be taken
4385                  out of <clinit> and have their DECL_INITIAL set
4386                  appropriately. */
4387               TREE_CHAIN (init) = CPC_STATIC_INITIALIZER_STMT (ctxp);
4388               SET_CPC_STATIC_INITIALIZER_STMT (ctxp, init);
4389               if (TREE_OPERAND (init, 1)
4390                   && TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
4391                 TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
4392             }
4393           /* A non-static field declared with an immediate initialization is
4394              to be initialized in <init>, if any.  This field is remembered
4395              to be processed at the time of the generation of <init>. */
4396           else
4397             {
4398               TREE_CHAIN (init) = CPC_INITIALIZER_STMT (ctxp);
4399               SET_CPC_INITIALIZER_STMT (ctxp, init);
4400             }
4401           MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
4402           DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
4403         }
4404     }
4405
4406   CLEAR_DEPRECATED;
4407   input_line = saved_lineno;
4408 }
4409
4410 /* Generate finit$, using the list of initialized fields to populate
4411    its body. finit$'s parameter(s) list is adjusted to include the
4412    one(s) used to initialized the field(s) caching outer context
4413    local(s).  */
4414
4415 static tree
4416 generate_finit (tree class_type)
4417 {
4418   int count = 0;
4419   tree list = TYPE_FINIT_STMT_LIST (class_type);
4420   tree mdecl, current, parms;
4421
4422   parms = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
4423                                                   class_type, NULL_TREE,
4424                                                   &count);
4425   CRAFTED_PARAM_LIST_FIXUP (parms);
4426   mdecl = create_artificial_method (class_type, ACC_PRIVATE, void_type_node,
4427                                     finit_identifier_node, parms);
4428   fix_method_argument_names (parms, mdecl);
4429   layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4430                        mdecl, NULL_TREE);
4431   DECL_FUNCTION_NAP (mdecl) = count;
4432   start_artificial_method_body (mdecl);
4433
4434   for (current = list; current; current = TREE_CHAIN (current))
4435     java_method_add_stmt (mdecl,
4436                           build_debugable_stmt (EXPR_WFL_LINECOL (current),
4437                                                 current));
4438   end_artificial_method_body (mdecl);
4439   return mdecl;
4440 }
4441
4442 /* Generate a function to run the instance initialization code. The
4443    private method is called `instinit$'. Unless we're dealing with an
4444    anonymous class, we determine whether all ctors of CLASS_TYPE
4445    declare a checked exception in their `throws' clause in order to
4446    see whether it's necessary to encapsulate the instance initializer
4447    statements in a try/catch/rethrow sequence.  */
4448
4449 static tree
4450 generate_instinit (tree class_type)
4451 {
4452   tree current;
4453   tree compound = NULL_TREE;
4454   tree parms = tree_cons (this_identifier_node,
4455                           build_pointer_type (class_type), end_params_node);
4456   tree mdecl = create_artificial_method (class_type, ACC_PRIVATE,
4457                                          void_type_node,
4458                                          instinit_identifier_node, parms);
4459
4460   layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4461                        mdecl, NULL_TREE);
4462
4463   /* Gather all the statements in a compound */
4464   for (current = TYPE_II_STMT_LIST (class_type);
4465        current; current = TREE_CHAIN (current))
4466     compound = add_stmt_to_compound (compound, NULL_TREE, current);
4467
4468   /* We need to encapsulate COMPOUND by a try/catch statement to
4469      rethrow exceptions that might occur in the instance initializer.
4470      We do that only if all ctors of CLASS_TYPE are set to catch a
4471      checked exception. This doesn't apply to anonymous classes (since
4472      they don't have declared ctors.) */
4473   if (!ANONYMOUS_CLASS_P (class_type) &&
4474       ctors_unchecked_throws_clause_p (class_type))
4475     {
4476       compound = encapsulate_with_try_catch (0, exception_type_node, compound,
4477                                              build1 (THROW_EXPR, NULL_TREE,
4478                                                      build_wfl_node (wpv_id)));
4479       DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE,
4480                                                       exception_type_node);
4481     }
4482
4483   start_artificial_method_body (mdecl);
4484   java_method_add_stmt (mdecl, compound);
4485   end_artificial_method_body (mdecl);
4486
4487   return mdecl;
4488 }
4489
4490 /* FIXME */
4491 static tree
4492 build_instinit_invocation (tree class_type)
4493 {
4494   tree to_return = NULL_TREE;
4495
4496   if (TYPE_II_STMT_LIST (class_type))
4497     {
4498       tree parm = build_tree_list (NULL_TREE,
4499                                    build_wfl_node (this_identifier_node));
4500       to_return =
4501         build_method_invocation (build_wfl_node (instinit_identifier_node),
4502                                  parm);
4503     }
4504   return to_return;
4505 }
4506
4507 /* Shared across method_declarator and method_header to remember the
4508    patch stage that was reached during the declaration of the method.
4509    A method DECL is built differently is there is no patch
4510    (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
4511    pending on the currently defined method.  */
4512
4513 static int patch_stage;
4514
4515 /* Check the method declaration and add the method to its current
4516    class.  If the argument list is known to contain incomplete types,
4517    the method is partially added and the registration will be resume
4518    once the method arguments resolved. If TYPE is NULL, we're dealing
4519    with a constructor.  */
4520
4521 static tree
4522 method_header (int flags, tree type, tree mdecl, tree throws)
4523 {
4524   tree type_wfl = NULL_TREE;
4525   tree meth_name = NULL_TREE;
4526   tree current, orig_arg, this_class = NULL;
4527   tree id, meth;
4528   int saved_lineno;
4529   int constructor_ok = 0, must_chain;
4530   int count;
4531
4532   if (mdecl == error_mark_node)
4533     return error_mark_node;
4534   meth = TREE_VALUE (mdecl);
4535   id = TREE_PURPOSE (mdecl);
4536
4537   check_modifiers_consistency (flags);
4538
4539   if (GET_CPC ())
4540     this_class = TREE_TYPE (GET_CPC ());
4541
4542   if (!this_class || this_class == error_mark_node)
4543     return NULL_TREE;
4544
4545   /* There are some forbidden modifiers for an abstract method and its
4546      class must be abstract as well.  */
4547   if (type && (flags & ACC_ABSTRACT))
4548     {
4549       ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
4550       ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
4551       ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
4552       ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
4553       ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized");
4554       ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp");
4555       if (!CLASS_ABSTRACT (TYPE_NAME (this_class))
4556           && !CLASS_INTERFACE (TYPE_NAME (this_class)))
4557         parse_error_context
4558           (id, "Class `%s' must be declared abstract to define abstract method `%s'",
4559            IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())),
4560            IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4561     }
4562
4563   /* A native method can't be strictfp.  */
4564   if ((flags & ACC_NATIVE) && (flags & ACC_STRICT))
4565     parse_error_context (id, "native method `%s' can't be strictfp",
4566                          IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4567   /* No such thing as a transient or volatile method.  */
4568   if ((flags & ACC_TRANSIENT))
4569     parse_error_context (id, "method `%s' can't be transient",
4570                          IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4571   if ((flags & ACC_VOLATILE))
4572     parse_error_context (id, "method `%s' can't be volatile",
4573                          IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4574
4575   /* Things to be checked when declaring a constructor */
4576   if (!type)
4577     {
4578       int ec = java_error_count;
4579       /* 8.6: Constructor declarations: we might be trying to define a
4580          method without specifying a return type. */
4581       if (EXPR_WFL_NODE (id) != GET_CPC_UN ())
4582         parse_error_context
4583           (id, "Invalid method declaration, return type required");
4584       /* 8.6.3: Constructor modifiers */
4585       else
4586         {
4587           JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
4588           JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
4589           JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
4590           JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
4591           JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
4592           JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp");
4593         }
4594       /* If we found error here, we don't consider it's OK to tread
4595          the method definition as a constructor, for the rest of this
4596          function */
4597       if (ec == java_error_count)
4598         constructor_ok = 1;
4599     }
4600
4601   /* Method declared within the scope of an interface are implicitly
4602      abstract and public. Conflicts with other erroneously provided
4603      modifiers are checked right after. */
4604
4605   if (CLASS_INTERFACE (TYPE_NAME (this_class)))
4606     {
4607       /* If FLAGS isn't set because of a modifier, turn the
4608          corresponding modifier WFL to NULL so we issue a warning on
4609          the obsolete use of the modifier */
4610       if (!(flags & ACC_PUBLIC))
4611         MODIFIER_WFL (PUBLIC_TK) = NULL;
4612       if (!(flags & ACC_ABSTRACT))
4613         MODIFIER_WFL (ABSTRACT_TK) = NULL;
4614       flags |= ACC_PUBLIC;
4615       flags |= ACC_ABSTRACT;
4616     }
4617
4618   /* Inner class can't declare static methods */
4619   if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (this_class))
4620     {
4621       parse_error_context
4622         (id, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
4623          IDENTIFIER_POINTER (EXPR_WFL_NODE (id)),
4624          lang_printable_name (this_class, 0));
4625     }
4626
4627   /* Modifiers context reset moved up, so abstract method declaration
4628      modifiers can be later checked.  */
4629
4630   /* Set constructor returned type to void and method name to <init>,
4631      unless we found an error identifier the constructor (in which
4632      case we retain the original name) */
4633   if (!type)
4634     {
4635       type = void_type_node;
4636       if (constructor_ok)
4637         meth_name = init_identifier_node;
4638     }
4639   else
4640     meth_name = EXPR_WFL_NODE (id);
4641
4642   /* Do the returned type resolution and registration if necessary */
4643   SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4644
4645   if (meth_name)
4646     type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
4647   EXPR_WFL_NODE (id) = meth_name;
4648   PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4649
4650   if (must_chain)
4651     {
4652       patch_stage = JDEP_METHOD_RETURN;
4653       register_incomplete_type (patch_stage, type_wfl, id, type);
4654       TREE_TYPE (meth) = GET_REAL_TYPE (type);
4655     }
4656   else
4657     TREE_TYPE (meth) = type;
4658
4659   saved_lineno = input_line;
4660   /* When defining an abstract or interface method, the curly
4661      bracket at level 1 doesn't exist because there is no function
4662      body */
4663   input_line = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
4664             EXPR_WFL_LINENO (id));
4665
4666   /* Remember the original argument list */
4667   orig_arg = TYPE_ARG_TYPES (meth);
4668
4669   if (patch_stage)              /* includes ret type and/or all args */
4670     {
4671       jdep *jdep;
4672       meth = add_method_1 (this_class, flags, meth_name, meth);
4673       /* Patch for the return type */
4674       if (patch_stage == JDEP_METHOD_RETURN)
4675         {
4676           jdep = CLASSD_LAST (ctxp->classd_list);
4677           JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
4678         }
4679       /* This is the stop JDEP. METH allows the function's signature
4680          to be computed. */
4681       register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
4682     }
4683   else
4684     meth = add_method (this_class, flags, meth_name,
4685                        build_java_signature (meth));
4686
4687   /* Remember final parameters */
4688   MARK_FINAL_PARMS (meth, orig_arg);
4689
4690   /* Fix the method argument list so we have the argument name
4691      information */
4692   fix_method_argument_names (orig_arg, meth);
4693
4694   /* Register the parameter number and re-install the current line
4695      number */
4696   DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
4697   input_line = saved_lineno;
4698
4699   /* Register exception specified by the `throws' keyword for
4700      resolution and set the method decl appropriate field to the list.
4701      Note: the grammar ensures that what we get here are class
4702      types. */
4703   if (throws)
4704     {
4705       throws = nreverse (throws);
4706       for (current = throws; current; current = TREE_CHAIN (current))
4707         {
4708           register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
4709                                     NULL_TREE, NULL_TREE);
4710           JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
4711             &TREE_VALUE (current);
4712         }
4713       DECL_FUNCTION_THROWS (meth) = throws;
4714     }
4715
4716   if (TREE_TYPE (GET_CPC ()) != object_type_node)
4717     DECL_FUNCTION_WFL (meth) = id;
4718
4719   /* Set the flag if we correctly processed a constructor */
4720   if (constructor_ok)
4721     {
4722       DECL_CONSTRUCTOR_P (meth) = 1;
4723       /* Compute and store the number of artificial parameters declared
4724          for this constructor */
4725       for (count = 0, current = TYPE_FIELDS (this_class); current;
4726            current = TREE_CHAIN (current))
4727         if (FIELD_LOCAL_ALIAS (current))
4728           count++;
4729       DECL_FUNCTION_NAP (meth) = count;
4730     }
4731
4732   /* Eventually set the @deprecated tag flag */
4733   CHECK_DEPRECATED (meth);
4734
4735   /* If doing xref, store column and line number information instead
4736      of the line number only. */
4737   if (flag_emit_xref)
4738     DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
4739
4740   return meth;
4741 }
4742
4743 static void
4744 fix_method_argument_names (tree orig_arg, tree meth)
4745 {
4746   tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
4747   if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
4748     {
4749       TREE_PURPOSE (arg) = this_identifier_node;
4750       arg = TREE_CHAIN (arg);
4751     }
4752   while (orig_arg != end_params_node)
4753     {
4754       TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
4755       orig_arg = TREE_CHAIN (orig_arg);
4756       arg = TREE_CHAIN (arg);
4757     }
4758 }
4759
4760 /* Complete the method declaration with METHOD_BODY.  */
4761
4762 static void
4763 finish_method_declaration (tree method_body)
4764 {
4765   int flags;
4766
4767   if (!current_function_decl)
4768     return;
4769
4770   flags = get_access_flags_from_decl (current_function_decl);
4771
4772   /* 8.4.5 Method Body */
4773   if ((flags & ACC_ABSTRACT || flags & ACC_NATIVE) && method_body)
4774     {
4775       tree name = DECL_NAME (current_function_decl);
4776       parse_error_context (DECL_FUNCTION_WFL (current_function_decl),
4777                            "%s method `%s' can't have a body defined",
4778                            (METHOD_NATIVE (current_function_decl) ?
4779                             "Native" : "Abstract"),
4780                            IDENTIFIER_POINTER (name));
4781       method_body = NULL_TREE;
4782     }
4783   else if (!(flags & ACC_ABSTRACT) && !(flags & ACC_NATIVE) && !method_body)
4784     {
4785       tree name = DECL_NAME (current_function_decl);
4786       parse_error_context
4787         (DECL_FUNCTION_WFL (current_function_decl),
4788          "Non native and non abstract method `%s' must have a body defined",
4789          IDENTIFIER_POINTER (name));
4790       method_body = NULL_TREE;
4791     }
4792
4793   if (flag_emit_class_files && method_body
4794       && TREE_CODE (method_body) == NOP_EXPR
4795       && TREE_TYPE (current_function_decl)
4796       && TREE_TYPE (TREE_TYPE (current_function_decl)) == void_type_node)
4797     method_body = build1 (RETURN_EXPR, void_type_node, NULL);
4798
4799   BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
4800   maybe_absorb_scoping_blocks ();
4801   /* Exit function's body */
4802   exit_block ();
4803   /* Merge last line of the function with first line, directly in the
4804      function decl. It will be used to emit correct debug info. */
4805   if (!flag_emit_xref)
4806     DECL_FUNCTION_LAST_LINE (current_function_decl) = ctxp->last_ccb_indent1;
4807
4808   /* Since function's argument's list are shared, reset the
4809      ARG_FINAL_P parameter that might have been set on some of this
4810      function parameters. */
4811   UNMARK_FINAL_PARMS (current_function_decl);
4812
4813   /* So we don't have an irrelevant function declaration context for
4814      the next static block we'll see. */
4815   current_function_decl = NULL_TREE;
4816 }
4817
4818 /* Build a an error message for constructor circularity errors.  */
4819
4820 static char *
4821 constructor_circularity_msg (tree from, tree to)
4822 {
4823   static char string [4096];
4824   char *t = xstrdup (lang_printable_name (from, 0));
4825   sprintf (string, "`%s' invokes `%s'", t, lang_printable_name (to, 0));
4826   free (t);
4827   return string;
4828 }
4829
4830 /* Verify a circular call to METH. Return 1 if an error is found, 0
4831    otherwise.  */
4832
4833 static GTY(()) tree vcc_list;
4834 static int
4835 verify_constructor_circularity (tree meth, tree current)
4836 {
4837   tree c;
4838
4839   for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4840     {
4841       if (TREE_VALUE (c) == meth)
4842         {
4843           char *t;
4844           if (vcc_list)
4845             {
4846               tree liste;
4847               vcc_list = nreverse (vcc_list);
4848               for (liste = vcc_list; liste; liste = TREE_CHAIN (liste))
4849                 {
4850                   parse_error_context
4851                     (TREE_PURPOSE (TREE_PURPOSE (liste)), "%s",
4852                      constructor_circularity_msg
4853                       (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
4854                   java_error_count--;
4855                 }
4856             }
4857           t = xstrdup (lang_printable_name (meth, 0));
4858           parse_error_context (TREE_PURPOSE (c),
4859                                "%s: recursive invocation of constructor `%s'",
4860                                constructor_circularity_msg (current, meth), t);
4861           free (t);
4862           vcc_list = NULL_TREE;
4863           return 1;
4864         }
4865     }
4866   for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4867     {
4868       vcc_list = tree_cons (c, current, vcc_list);
4869       if (verify_constructor_circularity (meth, TREE_VALUE (c)))
4870         return 1;
4871       vcc_list = TREE_CHAIN (vcc_list);
4872     }
4873   return 0;
4874 }
4875
4876 /* Check modifiers that can be declared but exclusively */
4877
4878 static void
4879 check_modifiers_consistency (int flags)
4880 {
4881   int acc_count = 0;
4882   tree cl = NULL_TREE;
4883
4884   THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, PUBLIC_TK, acc_count, cl);
4885   THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, PRIVATE_TK, acc_count, cl);
4886   THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, PROTECTED_TK, acc_count, cl);
4887   if (acc_count > 1)
4888     parse_error_context
4889       (cl, "Inconsistent member declaration.  At most one of `public', `private', or `protected' may be specified");
4890
4891   acc_count = 0;
4892   cl = NULL_TREE;
4893   THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK, acc_count, cl);
4894   THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK, acc_count, cl);
4895   if (acc_count > 1)
4896     parse_error_context (cl,
4897                          "Inconsistent member declaration.  At most one of `final' or `volatile' may be specified");
4898 }
4899
4900 /* Check the methode header METH for abstract specifics features */
4901
4902 static void
4903 check_abstract_method_header (tree meth)
4904 {
4905   int flags = get_access_flags_from_decl (meth);
4906
4907   OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (ABSTRACT_TK), flags,
4908                               ACC_ABSTRACT, "abstract method",
4909                               IDENTIFIER_POINTER (DECL_NAME (meth)));
4910   OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (PUBLIC_TK), flags,
4911                               ACC_PUBLIC, "abstract method",
4912                               IDENTIFIER_POINTER (DECL_NAME (meth)));
4913
4914   check_modifiers ("Illegal modifier `%s' for interface method",
4915                   flags, INTERFACE_METHOD_MODIFIERS);
4916 }
4917
4918 /* Create a FUNCTION_TYPE node and start augmenting it with the
4919    declared function arguments. Arguments type that can't be resolved
4920    are left as they are, but the returned node is marked as containing
4921    incomplete types.  */
4922
4923 static tree
4924 method_declarator (tree id, tree list)
4925 {
4926   tree arg_types = NULL_TREE, current, node;
4927   tree meth = make_node (FUNCTION_TYPE);
4928   jdep *jdep;
4929
4930   patch_stage = JDEP_NO_PATCH;
4931
4932   if (GET_CPC () == error_mark_node)
4933     return error_mark_node;
4934
4935   /* If we're dealing with an inner class constructor, we hide the
4936      this$<n> decl in the name field of its parameter declaration.  We
4937      also might have to hide the outer context local alias
4938      initializers. Not done when the class is a toplevel class. */
4939   if (PURE_INNER_CLASS_DECL_P (GET_CPC ())
4940       && EXPR_WFL_NODE (id) == GET_CPC_UN ())
4941     {
4942       tree aliases_list, type, thisn;
4943       /* First the aliases, linked to the regular parameters */
4944       aliases_list =
4945         build_alias_initializer_parameter_list (AIPL_FUNCTION_DECLARATION,
4946                                                 TREE_TYPE (GET_CPC ()),
4947                                                 NULL_TREE, NULL);
4948       list = chainon (nreverse (aliases_list), list);
4949
4950       /* Then this$<n> */
4951       type = TREE_TYPE (DECL_CONTEXT (GET_CPC ()));
4952       thisn = build_current_thisn (TREE_TYPE (GET_CPC ()));
4953       list = tree_cons (build_wfl_node (thisn), build_pointer_type (type),
4954                         list);
4955     }
4956
4957   for (current = list; current; current = TREE_CHAIN (current))
4958     {
4959       int must_chain = 0;
4960       tree wfl_name = TREE_PURPOSE (current);
4961       tree type = TREE_VALUE (current);
4962       tree name = EXPR_WFL_NODE (wfl_name);
4963       tree already, arg_node;
4964       tree type_wfl = NULL_TREE;
4965       tree real_type;
4966
4967       /* Obtain a suitable type for resolution, if necessary */
4968       SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4969
4970       /* Process NAME, as it may specify extra dimension(s) for it */
4971       type = build_array_from_name (type, type_wfl, name, &name);
4972       EXPR_WFL_NODE (wfl_name) = name;
4973
4974       real_type = GET_REAL_TYPE (type);
4975       if (TREE_CODE (real_type) == RECORD_TYPE)
4976         {
4977           real_type = promote_type (real_type);
4978           if (TREE_CODE (type) == TREE_LIST)
4979             TREE_PURPOSE (type) = real_type;
4980         }
4981
4982       /* Check redefinition */
4983       for (already = arg_types; already; already = TREE_CHAIN (already))
4984         if (TREE_PURPOSE (already) == name)
4985           {
4986             parse_error_context
4987               (wfl_name, "Variable `%s' is used more than once in the argument list of method `%s'",
4988                IDENTIFIER_POINTER (name),
4989                IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4990             break;
4991           }
4992
4993       /* If we've an incomplete argument type, we know there is a location
4994          to patch when the type get resolved, later.  */
4995       jdep = NULL;
4996       if (must_chain)
4997         {
4998           patch_stage = JDEP_METHOD;
4999           type = register_incomplete_type (patch_stage,
5000                                            type_wfl, wfl_name, type);
5001           jdep = CLASSD_LAST (ctxp->classd_list);
5002           JDEP_MISC (jdep) = id;
5003         }
5004
5005       /* The argument node: a name and a (possibly) incomplete type.  */
5006       arg_node = build_tree_list (name, real_type);
5007       /* Remember arguments declared final. */
5008       ARG_FINAL_P (arg_node) = ARG_FINAL_P (current);
5009
5010       if (jdep)
5011         JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
5012       TREE_CHAIN (arg_node) = arg_types;
5013       arg_types = arg_node;
5014     }
5015   TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
5016   node = build_tree_list (id, meth);
5017   return node;
5018 }
5019
5020 static int
5021 unresolved_type_p (tree wfl, tree *returned)
5022 {
5023   if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
5024     {
5025       if (returned)
5026         {
5027           tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
5028           if (decl && current_class && (decl == TYPE_NAME (current_class)))
5029             *returned = TREE_TYPE (decl);
5030           else if (GET_CPC_UN () == EXPR_WFL_NODE (wfl))
5031             *returned = TREE_TYPE (GET_CPC ());
5032           else
5033             *returned = NULL_TREE;
5034         }
5035       return 1;
5036     }
5037   if (returned)
5038     *returned = wfl;
5039   return 0;
5040 }
5041
5042 /* From NAME, build a qualified identifier node using the
5043    qualification from the current package definition. */
5044
5045 static tree
5046 parser_qualified_classname (tree name)
5047 {
5048   tree nested_class_name;
5049
5050   if ((nested_class_name = maybe_make_nested_class_name (name)))
5051     return nested_class_name;
5052
5053   if (ctxp->package)
5054     return merge_qualified_name (ctxp->package, name);
5055   else
5056     return name;
5057 }
5058
5059 /* Called once the type a interface extends is resolved. Returns 0 if
5060    everything is OK.  */
5061
5062 static int
5063 parser_check_super_interface (tree super_decl, tree this_decl, tree this_wfl)
5064 {
5065   tree super_type = TREE_TYPE (super_decl);
5066
5067   /* Has to be an interface */
5068   if (!CLASS_INTERFACE (super_decl))
5069     {
5070       parse_error_context
5071         (this_wfl, "%s `%s' can't implement/extend %s `%s'",
5072          (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
5073           "Interface" : "Class"),
5074          IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5075          (TYPE_ARRAY_P (super_type) ? "array" : "class"),
5076          IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5077       return 1;
5078     }
5079
5080   /* Check top-level interface access. Inner classes are subject to member
5081      access rules (6.6.1). */
5082   if (! INNER_CLASS_P (super_type)
5083       && check_pkg_class_access (DECL_NAME (super_decl),
5084                                  NULL_TREE, true, this_decl))
5085     return 1;
5086
5087   SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
5088                           IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5089                           IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5090   return 0;
5091 }
5092
5093 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
5094    0 if everything is OK.  */
5095
5096 static int
5097 parser_check_super (tree super_decl, tree this_decl, tree wfl)
5098 {
5099   tree super_type = TREE_TYPE (super_decl);
5100
5101   /* SUPER should be a CLASS (neither an array nor an interface) */
5102   if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
5103     {
5104       parse_error_context
5105         (wfl, "Class `%s' can't subclass %s `%s'",
5106          IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5107          (CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
5108          IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5109       return 1;
5110     }
5111
5112   if (CLASS_FINAL (TYPE_NAME (super_type)))
5113     {
5114       parse_error_context (wfl, "Can't subclass final classes: %s",
5115                            IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5116       return 1;
5117     }
5118
5119   /* Check top-level class scope. Inner classes are subject to member access
5120      rules (6.6.1). */
5121   if (! INNER_CLASS_P (super_type)
5122       && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true, NULL_TREE)))
5123     return 1;
5124
5125   SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
5126                           IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5127                           IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5128   return 0;
5129 }
5130
5131 /* Create a new dependency list and link it (in a LIFO manner) to the
5132    CTXP list of type dependency list.  */
5133
5134 static void
5135 create_jdep_list (struct parser_ctxt *ctxp)
5136 {
5137   jdeplist *new = xmalloc (sizeof (jdeplist));
5138   new->first = new->last = NULL;
5139   new->next = ctxp->classd_list;
5140   ctxp->classd_list = new;
5141 }
5142
5143 static jdeplist *
5144 reverse_jdep_list (struct parser_ctxt *ctxp)
5145 {
5146   jdeplist *prev = NULL, *current, *next;
5147   for (current = ctxp->classd_list; current; current = next)
5148     {
5149       next = current->next;
5150       current->next = prev;
5151       prev = current;
5152     }
5153   return prev;
5154 }
5155
5156 /* Create a fake pointer based on the ID stored in
5157    TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
5158    registered again. */
5159
5160 static tree
5161 obtain_incomplete_type (tree type_name)
5162 {
5163   tree ptr = NULL_TREE, name;
5164
5165   if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
5166     name = EXPR_WFL_NODE (type_name);
5167   else if (INCOMPLETE_TYPE_P (type_name))
5168     name = TYPE_NAME (type_name);
5169   else
5170     abort ();
5171
5172   /* Workaround from build_pointer_type for incomplete types.  */
5173   BUILD_PTR_FROM_NAME (ptr, name);
5174   TYPE_MODE (ptr) = ptr_mode;
5175   layout_type (ptr);
5176
5177   return ptr;
5178 }
5179
5180 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
5181    non NULL instead of computing a new fake type based on WFL. The new
5182    dependency is inserted in the current type dependency list, in FIFO
5183    manner.  */
5184
5185 static tree
5186 register_incomplete_type (int kind, tree wfl, tree decl, tree ptr)
5187 {
5188   jdep *new = xmalloc (sizeof (jdep));
5189
5190   if (!ptr && kind != JDEP_METHOD_END) /* JDEP_METHOD_END is a mere marker */
5191     ptr = obtain_incomplete_type (wfl);
5192
5193   JDEP_KIND (new) = kind;
5194   JDEP_DECL (new) = decl;
5195   JDEP_TO_RESOLVE (new) = ptr;
5196   JDEP_WFL (new) = wfl;
5197   JDEP_CHAIN (new) = NULL;
5198   JDEP_MISC (new) = NULL_TREE;
5199   /* For some dependencies, set the enclosing class of the current
5200      class to be the enclosing context */
5201   if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS || kind == JDEP_SUPER)
5202       && GET_ENCLOSING_CPC ())
5203     JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ());
5204   else
5205     JDEP_ENCLOSING (new) = GET_CPC ();
5206   JDEP_GET_PATCH (new) = (tree *)NULL;
5207
5208   JDEP_INSERT (ctxp->classd_list, new);
5209
5210   return ptr;
5211 }
5212
5213 /* This checks for circular references with innerclasses. We start
5214    from SOURCE and should never reach TARGET. Extended/implemented
5215    types in SOURCE have their enclosing context checked not to reach
5216    TARGET. When the last enclosing context of SOURCE is reached, its
5217    extended/implemented types are also checked not to reach TARGET.
5218    In case of error, WFL of the offending type is returned; NULL_TREE
5219    otherwise.  */
5220
5221 static tree
5222 check_inner_circular_reference (tree source, tree target)
5223 {
5224   tree base_binfo;
5225   tree ctx, cl;
5226   int i;
5227
5228   for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (source), i, base_binfo); i++)
5229     {
5230       tree su;
5231
5232       /* We can end up with a NULL_TREE or an incomplete type here if
5233          we encountered previous type resolution errors. It's safe to
5234          simply ignore these cases.  */
5235       su = BINFO_TYPE (base_binfo);
5236       if (INCOMPLETE_TYPE_P (su))
5237         continue;
5238
5239       if (inherits_from_p (su, target))
5240         return lookup_cl (TYPE_NAME (su));
5241
5242       for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx))
5243         {
5244           /* An enclosing context shouldn't be TARGET */
5245           if (ctx == TYPE_NAME (target))
5246             return lookup_cl (TYPE_NAME (su));
5247
5248           /* When we reach the enclosing last context, start a check
5249              on it, with the same target */
5250           if (! DECL_CONTEXT (ctx) &&
5251               (cl = check_inner_circular_reference (TREE_TYPE (ctx), target)))
5252             return cl;
5253         }
5254     }
5255   return NULL_TREE;
5256 }
5257
5258 /* Explore TYPE's `extends' clause member(s) and return the WFL of the
5259    offending type if a circularity is detected. NULL_TREE is returned
5260    otherwise. TYPE can be an interface or a class.   */
5261
5262 static tree
5263 check_circular_reference (tree type)
5264 {
5265   tree base_binfo;
5266   int i;
5267
5268   if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
5269     return NULL_TREE;
5270
5271   if (! CLASS_INTERFACE (TYPE_NAME (type)))
5272     {
5273       if (inherits_from_p (CLASSTYPE_SUPER (type), type))
5274         return lookup_cl (TYPE_NAME (type));
5275       return NULL_TREE;
5276     }
5277
5278   for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (type), i, base_binfo); i++)
5279     {
5280       if (BINFO_TYPE (base_binfo) != object_type_node
5281           && interface_of_p (type, BINFO_TYPE (base_binfo)))
5282         return lookup_cl (TYPE_NAME (BINFO_TYPE (base_binfo)));
5283     }
5284   return NULL_TREE;
5285 }
5286
5287 void
5288 java_check_circular_reference (void)
5289 {
5290   tree current;
5291   for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5292     {
5293       tree type = TREE_TYPE (current);
5294       tree cl;
5295
5296       cl = check_circular_reference (type);
5297       if (! cl)
5298         cl = check_inner_circular_reference (type, type);
5299       if (cl)
5300         parse_error_context (cl, "Cyclic class inheritance%s",
5301                              (cyclic_inheritance_report ?
5302                               cyclic_inheritance_report : ""));
5303     }
5304 }
5305
5306 /* Augment the parameter list PARM with parameters crafted to
5307    initialize outer context locals aliases. Through ARTIFICIAL, a
5308    count is kept of the number of crafted parameters. MODE governs
5309    what eventually gets created: something suitable for a function
5310    creation or a function invocation, either the constructor or
5311    finit$.  */
5312
5313 static tree
5314 build_alias_initializer_parameter_list (int mode, tree class_type, tree parm,
5315                                         int *artificial)
5316 {
5317   tree field;
5318   tree additional_parms = NULL_TREE;
5319
5320   for (field = TYPE_FIELDS (class_type); field; field = TREE_CHAIN (field))
5321     if (FIELD_LOCAL_ALIAS (field))
5322       {
5323         const char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
5324         tree purpose = NULL_TREE, value = NULL_TREE, name = NULL_TREE;
5325         tree mangled_id;
5326
5327         switch (mode)
5328           {
5329           case AIPL_FUNCTION_DECLARATION:
5330             MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5331                                                          &buffer [4]);
5332             purpose = build_wfl_node (mangled_id);
5333             if (TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE)
5334               value = build_wfl_node (TYPE_NAME (TREE_TYPE (field)));
5335             else
5336               value = TREE_TYPE (field);
5337             break;
5338
5339           case AIPL_FUNCTION_CREATION:
5340             MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (purpose,
5341                                                          &buffer [4]);
5342             value = TREE_TYPE (field);
5343             break;
5344
5345           case AIPL_FUNCTION_FINIT_INVOCATION:
5346             MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5347                                                          &buffer [4]);
5348             /* Now, this is wrong. purpose should always be the NAME
5349                of something and value its matching value (decl, type,
5350                etc...) FIXME -- but there is a lot to fix. */
5351
5352             /* When invoked for this kind of operation, we already
5353                know whether a field is used or not. */
5354             purpose = TREE_TYPE (field);
5355             value = build_wfl_node (mangled_id);
5356             break;
5357
5358           case AIPL_FUNCTION_CTOR_INVOCATION:
5359             /* There are two case: the constructor invocation happens
5360                outside the local inner, in which case, locales from the outer
5361                context are directly used.
5362
5363                Otherwise, we fold to using the alias directly. */
5364             if (class_type == current_class)
5365               value = field;
5366             else
5367               {
5368                 name = get_identifier (&buffer[4]);
5369                 value = IDENTIFIER_LOCAL_VALUE (name);
5370               }
5371             break;
5372           }
5373         additional_parms = tree_cons (purpose, value, additional_parms);
5374         if (artificial)
5375           *artificial +=1;
5376       }
5377   if (additional_parms)
5378     {
5379       if (ANONYMOUS_CLASS_P (class_type)
5380           && mode == AIPL_FUNCTION_CTOR_INVOCATION)
5381         additional_parms = nreverse (additional_parms);
5382       parm = chainon (additional_parms, parm);
5383     }
5384
5385    return parm;
5386 }
5387
5388 /* Craft a constructor for CLASS_DECL -- what we should do when none
5389    where found. ARGS is non NULL when a special signature must be
5390    enforced. This is the case for anonymous classes.  */
5391
5392 static tree
5393 craft_constructor (tree class_decl, tree args)
5394 {
5395   tree class_type = TREE_TYPE (class_decl);
5396   tree parm = NULL_TREE;
5397   /* Inherit access flags for the constructor from its enclosing class. */
5398   int valid_ctor_flags = ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE;
5399   int flags = (get_access_flags_from_decl (class_decl) & valid_ctor_flags);
5400   int i = 0, artificial = 0;
5401   tree decl, ctor_name;
5402   char buffer [80];
5403
5404   /* The constructor name is <init> unless we're dealing with an
5405      anonymous class, in which case the name will be fixed after having
5406      be expanded. */
5407   if (ANONYMOUS_CLASS_P (class_type))
5408     ctor_name = DECL_NAME (class_decl);
5409   else
5410     ctor_name = init_identifier_node;
5411
5412   /* If we're dealing with an inner class constructor, we hide the
5413      this$<n> decl in the name field of its parameter declaration. */
5414   if (PURE_INNER_CLASS_TYPE_P (class_type))
5415     {
5416       tree type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_type)));
5417       parm = tree_cons (build_current_thisn (class_type),
5418                         build_pointer_type (type), parm);
5419
5420       /* Some more arguments to be hidden here. The values of the local
5421          variables of the outer context that the inner class needs to see. */
5422       parm = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
5423                                                      class_type, parm,
5424                                                      &artificial);
5425     }
5426
5427   /* Then if there are any args to be enforced, enforce them now */
5428   for (; args && args != end_params_node; args = TREE_CHAIN (args))
5429     {
5430       sprintf (buffer, "parm%d", i++);
5431       parm = tree_cons (get_identifier (buffer), TREE_VALUE (args), parm);
5432     }
5433
5434   CRAFTED_PARAM_LIST_FIXUP (parm);
5435   decl = create_artificial_method (class_type, flags, void_type_node,
5436                                    ctor_name, parm);
5437   fix_method_argument_names (parm, decl);
5438   /* Now, mark the artificial parameters. */
5439   DECL_FUNCTION_NAP (decl) = artificial;
5440   DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1;
5441   DECL_INLINE (decl) = 1;
5442   return decl;
5443 }
5444
5445
5446 /* Fix the constructors. This will be called right after circular
5447    references have been checked. It is necessary to fix constructors
5448    early even if no code generation will take place for that class:
5449    some generated constructor might be required by the class whose
5450    compilation triggered this one to be simply loaded.  */
5451
5452 void
5453 java_fix_constructors (void)
5454 {
5455   tree current;
5456
5457   for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5458     {
5459       tree class_type = TREE_TYPE (current);
5460       int saw_ctor = 0;
5461       tree decl;
5462
5463       if (CLASS_INTERFACE (TYPE_NAME (class_type)))
5464         continue;
5465
5466       output_class = current_class = class_type;
5467       for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
5468         {
5469           if (DECL_CONSTRUCTOR_P (decl))
5470             {
5471               fix_constructors (decl);
5472               saw_ctor = 1;
5473             }
5474         }
5475
5476       /* Anonymous class constructor can't be generated that early. */
5477       if (!saw_ctor && !ANONYMOUS_CLASS_P (class_type))
5478         craft_constructor (current, NULL_TREE);
5479     }
5480 }
5481
5482 /* safe_layout_class just makes sure that we can load a class without
5483    disrupting the current_class, input_file, input_line, etc, information
5484    about the class processed currently.  */
5485
5486 void
5487 safe_layout_class (tree class)
5488 {
5489   tree save_current_class = current_class;
5490   location_t save_location = input_location;
5491
5492   layout_class (class);
5493
5494   current_class = save_current_class;
5495   input_location = save_location;
5496 }
5497
5498 static tree
5499 jdep_resolve_class (jdep *dep)
5500 {
5501   tree decl;
5502
5503   if (JDEP_RESOLVED_P (dep))
5504     decl = JDEP_RESOLVED_DECL (dep);
5505   else
5506     {
5507       decl = resolve_class (JDEP_ENCLOSING (dep), JDEP_TO_RESOLVE (dep),
5508                             JDEP_DECL (dep), JDEP_WFL (dep));
5509       JDEP_RESOLVED (dep, decl);
5510       /* If there is no WFL, that's ok.  We generate this warning
5511          elsewhere.  */
5512       if (decl && JDEP_WFL (dep) != NULL_TREE)
5513         check_deprecation (JDEP_WFL (dep), decl);
5514     }
5515
5516   if (!decl)
5517     complete_class_report_errors (dep);
5518   else if (INNER_CLASS_DECL_P (decl))
5519     {
5520       tree inner = TREE_TYPE (decl);
5521       if (! CLASS_LOADED_P (inner))
5522         {
5523           safe_layout_class (inner);
5524           if (TYPE_SIZE (inner) == error_mark_node)
5525             TYPE_SIZE (inner) = NULL_TREE;
5526         }
5527       check_inner_class_access (decl, JDEP_ENCLOSING (dep), JDEP_WFL (dep));
5528     }
5529   return decl;
5530 }
5531
5532 /* Complete unsatisfied class declaration and their dependencies */
5533
5534 void
5535 java_complete_class (void)
5536 {
5537   tree cclass;
5538   jdeplist *cclassd;
5539   int error_found;
5540   tree type;
5541
5542   /* Process imports */
5543   process_imports ();
5544
5545   /* Reverse things so we have the right order */
5546   ctxp->class_list = nreverse (ctxp->class_list);
5547   ctxp->classd_list = reverse_jdep_list (ctxp);
5548
5549   for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
5550        cclass && cclassd;
5551        cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
5552     {
5553       jdep *dep;
5554
5555       /* We keep the compilation unit imports in the class so that
5556          they can be used later to resolve type dependencies that
5557          aren't necessary to solve now. */
5558       TYPE_IMPORT_LIST (TREE_TYPE (cclass)) = ctxp->import_list;
5559       TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (cclass)) = ctxp->import_demand_list;
5560
5561       for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
5562         {
5563           tree decl;
5564           if (!(decl = jdep_resolve_class (dep)))
5565             continue;
5566
5567           /* Now it's time to patch */
5568           switch (JDEP_KIND (dep))
5569             {
5570             case JDEP_SUPER:
5571               /* Simply patch super */
5572               if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
5573                 continue;
5574               BINFO_TYPE (BINFO_BASE_BINFO
5575                           (TYPE_BINFO (TREE_TYPE (JDEP_DECL (dep))), 0))
5576                 = TREE_TYPE (decl);
5577               break;
5578
5579             case JDEP_FIELD:
5580               {
5581                 /* We do part of the job done in add_field */
5582                 tree field_decl = JDEP_DECL (dep);
5583                 tree field_type = TREE_TYPE (decl);
5584                 if (TREE_CODE (field_type) == RECORD_TYPE)
5585                   field_type = promote_type (field_type);
5586                 TREE_TYPE (field_decl) = field_type;
5587                 DECL_ALIGN (field_decl) = 0;
5588                 DECL_USER_ALIGN (field_decl) = 0;
5589                 layout_decl (field_decl, 0);
5590                 SOURCE_FRONTEND_DEBUG
5591                   (("Completed field/var decl `%s' with `%s'",
5592                     IDENTIFIER_POINTER (DECL_NAME (field_decl)),
5593                     IDENTIFIER_POINTER (DECL_NAME (decl))));
5594                 break;
5595               }
5596             case JDEP_METHOD:   /* We start patching a method */
5597             case JDEP_METHOD_RETURN:
5598               error_found = 0;
5599               while (1)
5600                 {
5601                   if (decl)
5602                     {
5603                       type = TREE_TYPE(decl);
5604                       if (TREE_CODE (type) == RECORD_TYPE)
5605                         type = promote_type (type);
5606                       JDEP_APPLY_PATCH (dep, type);
5607                       SOURCE_FRONTEND_DEBUG
5608                         (((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
5609                            "Completing fct `%s' with ret type `%s'":
5610                            "Completing arg `%s' with type `%s'"),
5611                           IDENTIFIER_POINTER (EXPR_WFL_NODE
5612                                               (JDEP_DECL_WFL (dep))),
5613                           IDENTIFIER_POINTER (DECL_NAME (decl))));
5614                     }
5615                   else
5616                     error_found = 1;
5617                   dep = JDEP_CHAIN (dep);
5618                   if (JDEP_KIND (dep) == JDEP_METHOD_END)
5619                     break;
5620                   else
5621                     decl = jdep_resolve_class (dep);
5622                 }
5623               if (!error_found)
5624                 {
5625                   tree mdecl = JDEP_DECL (dep), signature;
5626                   /* Recompute and reset the signature, check first that
5627                      all types are now defined. If they're not,
5628                      don't build the signature. */
5629                   if (check_method_types_complete (mdecl))
5630                     {
5631                       signature = build_java_signature (TREE_TYPE (mdecl));
5632                       set_java_signature (TREE_TYPE (mdecl), signature);
5633                     }
5634                 }
5635               else
5636                 continue;
5637               break;
5638
5639             case JDEP_INTERFACE:
5640               if (parser_check_super_interface (decl, JDEP_DECL (dep),
5641                                                 JDEP_WFL (dep)))
5642                 continue;
5643               parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
5644               break;
5645
5646             case JDEP_PARM:
5647             case JDEP_VARIABLE:
5648               type = TREE_TYPE(decl);
5649               if (TREE_CODE (type) == RECORD_TYPE)
5650                 type = promote_type (type);
5651               JDEP_APPLY_PATCH (dep, type);
5652               break;
5653
5654             case JDEP_TYPE:
5655               JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5656               SOURCE_FRONTEND_DEBUG
5657                 (("Completing a random type dependency on a '%s' node",
5658                   tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
5659               break;
5660
5661             case JDEP_EXCEPTION:
5662               JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5663               SOURCE_FRONTEND_DEBUG
5664                 (("Completing `%s' `throws' argument node",
5665                   IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
5666               break;
5667
5668             case JDEP_ANONYMOUS:
5669               patch_anonymous_class (decl, JDEP_DECL (dep), JDEP_WFL (dep));
5670               break;
5671
5672             default:
5673               abort ();
5674             }
5675         }
5676     }
5677   return;
5678 }
5679
5680 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
5681    array.  */
5682
5683 static tree
5684 resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5685 {
5686   tree tname = TYPE_NAME (class_type);
5687   tree resolved_type = TREE_TYPE (class_type);
5688   int array_dims = 0;
5689   tree resolved_type_decl;
5690
5691   if (resolved_type != NULL_TREE)
5692     {
5693       tree resolved_type_decl = TYPE_NAME (resolved_type);
5694       if (resolved_type_decl == NULL_TREE
5695           || TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
5696         {
5697           resolved_type_decl = build_decl (TYPE_DECL,
5698                                            TYPE_NAME (class_type),
5699                                            resolved_type);
5700         }
5701       return resolved_type_decl;
5702     }
5703
5704   /* 1- Check to see if we have an array. If true, find what we really
5705      want to resolve  */
5706   if ((array_dims = build_type_name_from_array_name (tname,
5707                                                      &TYPE_NAME (class_type))))
5708     WFL_STRIP_BRACKET (cl, cl);
5709
5710   /* 2- Resolve the bare type */
5711   if (!(resolved_type_decl = do_resolve_class (enclosing, class_type,
5712                                                decl, cl)))
5713     return NULL_TREE;
5714   resolved_type = TREE_TYPE (resolved_type_decl);
5715
5716   /* 3- If we have an array, reconstruct the array down to its nesting */
5717   if (array_dims)
5718     {
5719       for (; array_dims; array_dims--)
5720         resolved_type = build_java_array_type (resolved_type, -1);
5721       resolved_type_decl = TYPE_NAME (resolved_type);
5722     }
5723   TREE_TYPE (class_type) = resolved_type;
5724   return resolved_type_decl;
5725 }
5726
5727 /* Effectively perform the resolution of class CLASS_TYPE.  DECL or CL
5728    are used to report error messages; CL must either be NULL_TREE or a
5729    WFL wrapping a class.  Do not try to replace TYPE_NAME (class_type)
5730    by a variable, since it is changed by find_in_imports{_on_demand}
5731    and (but it doesn't really matter) qualify_and_find.  */
5732
5733 tree
5734 do_resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5735 {
5736   tree new_class_decl = NULL_TREE, super = NULL_TREE;
5737   tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
5738   tree decl_result;
5739   htab_t circularity_hash;
5740
5741   if (QUALIFIED_P (TYPE_NAME (class_type)))
5742     {
5743       /* If the type name is of the form `Q . Id', then Q is either a
5744          package name or a class name.  First we try to find Q as a
5745          class and then treat Id as a member type.  If we can't find Q
5746          as a class then we fall through.  */
5747       tree q, left, left_type, right;
5748       if (split_qualified_name (&left, &right, TYPE_NAME (class_type)) == 0)
5749         {
5750           BUILD_PTR_FROM_NAME (left_type, left);
5751           q = do_resolve_class (enclosing, left_type, decl, cl);
5752           if (q)
5753             {
5754               enclosing = q;
5755               saved_enclosing_type = TREE_TYPE (q);
5756               BUILD_PTR_FROM_NAME (class_type, right);
5757             }
5758         }
5759     }
5760
5761   if (enclosing)
5762     {
5763       /* This hash table is used to register the classes we're going
5764          through when searching the current class as an inner class, in
5765          order to detect circular references. Remember to free it before
5766          returning the section 0- of this function. */
5767       circularity_hash = htab_create (20, htab_hash_pointer, htab_eq_pointer,
5768                                       NULL);
5769
5770       /* 0- Search in the current class as an inner class.
5771          Maybe some code here should be added to load the class or
5772          something, at least if the class isn't an inner class and ended
5773          being loaded from class file. FIXME. */
5774       while (enclosing)
5775         {
5776           new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing,
5777                                                 &super, class_type);
5778           if (new_class_decl)
5779             break;
5780
5781           /* If we haven't found anything because SUPER reached Object and
5782              ENCLOSING happens to be an innerclass, try the enclosing context. */
5783           if ((!super || super == object_type_node) &&
5784               enclosing && INNER_CLASS_DECL_P (enclosing))
5785             enclosing = DECL_CONTEXT (enclosing);
5786           else
5787             enclosing = NULL_TREE;
5788         }
5789
5790       htab_delete (circularity_hash);
5791
5792       if (new_class_decl)
5793         return new_class_decl;
5794     }
5795
5796   /* 1- Check for the type in single imports. This will change
5797      TYPE_NAME() if something relevant is found */
5798   find_in_imports (saved_enclosing_type, class_type);
5799
5800   /* 2- And check for the type in the current compilation unit */
5801   if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5802     {
5803       if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)))
5804         load_class (TYPE_NAME (class_type), 0);
5805       return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5806     }
5807
5808   /* 3- Search according to the current package definition */
5809   if (!QUALIFIED_P (TYPE_NAME (class_type)))
5810     {
5811       if ((new_class_decl = qualify_and_find (class_type, ctxp->package,
5812                                              TYPE_NAME (class_type))))
5813         return new_class_decl;
5814     }
5815
5816   /* 4- Check the import on demands. Don't allow bar.baz to be
5817      imported from foo.* */
5818   if (!QUALIFIED_P (TYPE_NAME (class_type)))
5819     if (find_in_imports_on_demand (saved_enclosing_type, class_type))
5820       return NULL_TREE;
5821
5822   /* If found in find_in_imports_on_demand, the type has already been
5823      loaded. */
5824   if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5825     return new_class_decl;
5826
5827   /* 5- Try with a name qualified with the package name we've seen so far */
5828   if (!QUALIFIED_P (TYPE_NAME (class_type)))
5829     {
5830       tree package;
5831
5832       /* If there is a current package (ctxp->package), it's the first
5833          element of package_list and we can skip it. */
5834       for (package = (ctxp->package ?
5835                       TREE_CHAIN (package_list) : package_list);
5836            package; package = TREE_CHAIN (package))
5837         if ((new_class_decl = qualify_and_find (class_type,
5838                                                TREE_PURPOSE (package),
5839                                                TYPE_NAME (class_type))))
5840           return new_class_decl;
5841     }
5842
5843   /* 5- Check another compilation unit that bears the name of type */
5844   load_class (TYPE_NAME (class_type), 0);
5845
5846   if (!cl)
5847     cl = lookup_cl (decl);
5848
5849   /* If we don't have a value for CL, then we're being called recursively.
5850      We can't check package access just yet, but it will be taken care of
5851      by the caller. */
5852   if (cl)
5853     {
5854       if (check_pkg_class_access (TYPE_NAME (class_type), cl, true, NULL_TREE))
5855         return NULL_TREE;
5856     }
5857
5858   /* 6- Last call for a resolution */
5859   decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5860
5861   /* The final lookup might have registered a.b.c into a.b$c If we
5862      failed at the first lookup, progressively change the name if
5863      applicable and use the matching DECL instead. */
5864   if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
5865     {
5866       char *separator;
5867       tree name = TYPE_NAME (class_type);
5868       char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1);
5869
5870       strcpy (namebuffer, IDENTIFIER_POINTER (name));
5871
5872       do {
5873
5874        /* Reach the last '.', and if applicable, replace it by a `$' and
5875           see if this exists as a type. */
5876        if ((separator = strrchr (namebuffer, '.')))
5877          {
5878            *separator = '$';
5879            name = get_identifier (namebuffer);
5880            decl_result = IDENTIFIER_CLASS_VALUE (name);
5881          }
5882       } while (!decl_result && separator);
5883     }
5884   return decl_result;
5885 }
5886
5887 static tree
5888 qualify_and_find (tree class_type, tree package, tree name)
5889 {
5890   tree new_qualified = merge_qualified_name (package, name);
5891   tree new_class_decl;
5892
5893   if (!IDENTIFIER_CLASS_VALUE (new_qualified))
5894     load_class (new_qualified, 0);
5895   if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_qualified)))
5896     {
5897       if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)))
5898         load_class (TREE_TYPE (new_class_decl), 0);
5899       TYPE_NAME (class_type) = new_qualified;
5900       return IDENTIFIER_CLASS_VALUE (new_qualified);
5901     }
5902   return NULL_TREE;
5903 }
5904
5905 /* Resolve NAME and lay it out (if not done and if not the current
5906    parsed class). Return a decl node. This function is meant to be
5907    called when type resolution is necessary during the walk pass.  */
5908
5909 static tree
5910 resolve_and_layout (tree something, tree cl)
5911 {
5912   tree decl, decl_type;
5913
5914   /* Don't do that on the current class */
5915   if (something == current_class)
5916     return TYPE_NAME (current_class);
5917
5918   /* Don't do anything for void and other primitive types */
5919   if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5920     return NULL_TREE;
5921
5922   /* Pointer types can be reall pointer types or fake pointers. When
5923      finding a real pointer, recheck for primitive types */
5924   if (TREE_CODE (something) == POINTER_TYPE)
5925     {
5926       if (TREE_TYPE (something))
5927         {
5928           something = TREE_TYPE (something);
5929           if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5930             return NULL_TREE;
5931         }
5932       else
5933         something = TYPE_NAME (something);
5934     }
5935
5936   /* Don't do anything for arrays of primitive types */
5937   if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
5938       && JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
5939     return NULL_TREE;
5940
5941   /* Something might be a WFL */
5942   if (TREE_CODE (something) == EXPR_WITH_FILE_LOCATION)
5943     something = EXPR_WFL_NODE (something);
5944
5945   /* Otherwise, if something is not and IDENTIFIER_NODE, it can be a a
5946      TYPE_DECL or a real TYPE */
5947   else if (TREE_CODE (something) != IDENTIFIER_NODE)
5948     something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
5949             DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
5950
5951   if (!(decl = resolve_no_layout (something, cl)))
5952     return NULL_TREE;
5953
5954   /* Resolve and layout if necessary */
5955   decl_type = TREE_TYPE (decl);
5956   layout_class_methods (decl_type);
5957   /* Check methods */
5958   if (CLASS_FROM_SOURCE_P (decl_type))
5959     java_check_methods (decl);
5960   /* Layout the type if necessary */
5961   if (decl_type != current_class && !CLASS_LOADED_P (decl_type))
5962     safe_layout_class (decl_type);
5963
5964   return decl;
5965 }
5966
5967 /* Resolve a class, returns its decl but doesn't perform any
5968    layout. The current parsing context is saved and restored */
5969
5970 static tree
5971 resolve_no_layout (tree name, tree cl)
5972 {
5973   tree ptr, decl;
5974   BUILD_PTR_FROM_NAME (ptr, name);
5975   java_parser_context_save_global ();
5976   decl = resolve_class (TYPE_NAME (current_class), ptr, NULL_TREE, cl);
5977   java_parser_context_restore_global ();
5978
5979   return decl;
5980 }
5981
5982 /* Called when reporting errors. Skip the '[]'s in a complex array
5983    type description that failed to be resolved. purify_type_name can't
5984    use an identifier tree.  */
5985
5986 static const char *
5987 purify_type_name (const char *name)
5988 {
5989   int len = strlen (name);
5990   int bracket_found;
5991
5992   STRING_STRIP_BRACKETS (name, len, bracket_found);
5993   if (bracket_found)
5994     {
5995       char *stripped_name = xmemdup (name, len, len+1);
5996       stripped_name [len] = '\0';
5997       return stripped_name;
5998     }
5999   return name;
6000 }
6001
6002 /* The type CURRENT refers to can't be found. We print error messages.  */
6003
6004 static void
6005 complete_class_report_errors (jdep *dep)
6006 {
6007   const char *name;
6008
6009   if (!JDEP_WFL (dep))
6010     return;
6011
6012   name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
6013   switch (JDEP_KIND (dep))
6014     {
6015     case JDEP_SUPER:
6016       parse_error_context
6017         (JDEP_WFL (dep), "Superclass `%s' of class `%s' not found",
6018          purify_type_name (name),
6019          IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6020       break;
6021     case JDEP_FIELD:
6022       parse_error_context
6023         (JDEP_WFL (dep), "Type `%s' not found in declaration of field `%s'",
6024          purify_type_name (name),
6025          IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6026       break;
6027     case JDEP_METHOD:           /* Covers arguments */
6028       parse_error_context
6029         (JDEP_WFL (dep), "Type `%s' not found in the declaration of the argument `%s' of method `%s'",
6030          purify_type_name (name),
6031          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
6032          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
6033       break;
6034     case JDEP_METHOD_RETURN:    /* Covers return type */
6035       parse_error_context
6036         (JDEP_WFL (dep), "Type `%s' not found in the declaration of the return type of method `%s'",
6037          purify_type_name (name),
6038          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
6039       break;
6040     case JDEP_INTERFACE:
6041       parse_error_context
6042         (JDEP_WFL (dep), "Superinterface `%s' of %s `%s' not found",
6043          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
6044          (CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
6045          IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6046       break;
6047     case JDEP_VARIABLE:
6048       parse_error_context
6049         (JDEP_WFL (dep), "Type `%s' not found in the declaration of the local variable `%s'",
6050          purify_type_name (IDENTIFIER_POINTER
6051                            (EXPR_WFL_NODE (JDEP_WFL (dep)))),
6052          IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6053       break;
6054     case JDEP_EXCEPTION:        /* As specified by `throws' */
6055       parse_error_context
6056           (JDEP_WFL (dep), "Class `%s' not found in `throws'",
6057          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
6058       break;
6059     default:
6060       /* Fix for -Wall. Just break doing nothing. The error will be
6061          caught later */
6062       break;
6063     }
6064 }
6065
6066 /* Return a static string containing the DECL prototype string. If
6067    DECL is a constructor, use the class name instead of the form
6068    <init> */
6069
6070 static const char *
6071 get_printable_method_name (tree decl)
6072 {
6073   const char *to_return;
6074   tree name = NULL_TREE;
6075
6076   if (DECL_CONSTRUCTOR_P (decl))
6077     {
6078       name = DECL_NAME (decl);
6079       DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
6080     }
6081
6082   to_return = lang_printable_name (decl, 0);
6083   if (DECL_CONSTRUCTOR_P (decl))
6084     DECL_NAME (decl) = name;
6085
6086   return to_return;
6087 }
6088
6089 /* Track method being redefined inside the same class. As a side
6090    effect, set DECL_NAME to an IDENTIFIER (prior entering this
6091    function it's a FWL, so we can track errors more accurately.)  */
6092
6093 static int
6094 check_method_redefinition (tree class, tree method)
6095 {
6096   tree redef, sig;
6097
6098   /* There's no need to verify <clinit> and finit$ and instinit$ */
6099   if (DECL_CLINIT_P (method)
6100       || DECL_FINIT_P (method) || DECL_INSTINIT_P (method))
6101     return 0;
6102
6103   sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
6104   for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
6105     {
6106       if (redef == method)
6107         break;
6108       if (DECL_NAME (redef) == DECL_NAME (method)
6109           && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))
6110           && !DECL_ARTIFICIAL (method))
6111         {
6112           parse_error_context
6113             (DECL_FUNCTION_WFL (method), "Duplicate %s declaration `%s'",
6114              (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
6115              get_printable_method_name (redef));
6116           return 1;
6117         }
6118     }
6119   return 0;
6120 }
6121
6122 /* Return 1 if check went ok, 0 otherwise.  */
6123 static int
6124 check_abstract_method_definitions (int do_interface, tree class_decl,
6125                                    tree type)
6126 {
6127   tree class = TREE_TYPE (class_decl);
6128   tree method, end_type;
6129   int ok = 1;
6130
6131   end_type = (do_interface ? object_type_node : type);
6132   for (method = TYPE_METHODS (type); method; method = TREE_CHAIN (method))
6133     {
6134       tree other_super, other_method, method_sig, method_name;
6135       int found = 0;
6136       int end_type_reached = 0;
6137
6138       if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
6139         continue;
6140
6141       /* Now verify that somewhere in between TYPE and CLASS,
6142          abstract method METHOD gets a non abstract definition
6143          that is inherited by CLASS.  */
6144
6145       method_sig = build_java_signature (TREE_TYPE (method));
6146       method_name = DECL_NAME (method);
6147       if (TREE_CODE (method_name) == EXPR_WITH_FILE_LOCATION)
6148         method_name = EXPR_WFL_NODE (method_name);
6149
6150       other_super = class;
6151       do {
6152         if (other_super == end_type)
6153           end_type_reached = 1;
6154
6155         /* Method search */
6156         for (other_method = TYPE_METHODS (other_super); other_method;
6157             other_method = TREE_CHAIN (other_method))
6158           {
6159             tree s = build_java_signature (TREE_TYPE (other_method));
6160             tree other_name = DECL_NAME (other_method);
6161
6162             if (TREE_CODE (other_name) == EXPR_WITH_FILE_LOCATION)
6163               other_name = EXPR_WFL_NODE (other_name);
6164             if (!DECL_CLINIT_P (other_method)
6165                 && !DECL_CONSTRUCTOR_P (other_method)
6166                 && method_name == other_name
6167                 && method_sig == s
6168                 && !METHOD_ABSTRACT (other_method))
6169              {
6170                found = 1;
6171                break;
6172              }
6173           }
6174         other_super = CLASSTYPE_SUPER (other_super);
6175       } while (!end_type_reached);
6176
6177       /* Report that abstract METHOD didn't find an implementation
6178          that CLASS can use. */
6179       if (!found)
6180         {
6181           char *t = xstrdup (lang_printable_name
6182                             (TREE_TYPE (TREE_TYPE (method)), 0));
6183           tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
6184
6185           parse_error_context
6186             (lookup_cl (class_decl),
6187              "Class `%s' doesn't define the abstract method `%s %s' from %s `%s'. This method must be defined or %s `%s' must be declared abstract",
6188              IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6189              t, lang_printable_name (method, 0),
6190              (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))) ?
6191               "interface" : "class"),
6192              IDENTIFIER_POINTER (ccn),
6193              (CLASS_INTERFACE (class_decl) ? "interface" : "class"),
6194              IDENTIFIER_POINTER (DECL_NAME (class_decl)));
6195           ok = 0;
6196           free (t);
6197         }
6198     }
6199
6200   if (ok && do_interface)
6201     {
6202       /* Check for implemented interfaces. */
6203       int i;
6204       tree base_binfo;
6205       
6206       for (i = 1;
6207            ok && BINFO_BASE_ITERATE (TYPE_BINFO (type), i, base_binfo);
6208            i++)
6209         ok = check_abstract_method_definitions (1, class_decl,
6210                                                 BINFO_TYPE (base_binfo));
6211     }
6212
6213   return ok;
6214 }
6215
6216 /* Check that CLASS_DECL somehow implements all inherited abstract
6217    methods.  */
6218
6219 static void
6220 java_check_abstract_method_definitions (tree class_decl)
6221 {
6222   tree class = TREE_TYPE (class_decl);
6223   tree super, base_binfo;
6224   int i;
6225
6226   if (CLASS_ABSTRACT (class_decl))
6227     return;
6228
6229   /* Check for inherited types */
6230   super = class;
6231   do {
6232     super = CLASSTYPE_SUPER (super);
6233     check_abstract_method_definitions (0, class_decl, super);
6234   } while (super != object_type_node);
6235
6236   /* Check for implemented interfaces. */
6237   for (i = 1; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
6238     check_abstract_method_definitions (1, class_decl, BINFO_TYPE (base_binfo));
6239 }
6240
6241 /* Check all the types method DECL uses and return 1 if all of them
6242    are now complete, 0 otherwise. This is used to check whether its
6243    safe to build a method signature or not.  */
6244
6245 static int
6246 check_method_types_complete (tree decl)
6247 {
6248   tree type = TREE_TYPE (decl);
6249   tree args;
6250
6251   if (!INCOMPLETE_TYPE_P (TREE_TYPE (type)))
6252     return 0;
6253
6254   args = TYPE_ARG_TYPES (type);
6255   if (TREE_CODE (type) == METHOD_TYPE)
6256     args = TREE_CHAIN (args);
6257   for (; args != end_params_node; args = TREE_CHAIN (args))
6258     if (INCOMPLETE_TYPE_P (TREE_VALUE (args)))
6259       return 0;
6260
6261   return 1;
6262 }
6263
6264 /* Visible interface to check methods contained in CLASS_DECL */
6265
6266 void
6267 java_check_methods (tree class_decl)
6268 {
6269   if (CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)))
6270     return;
6271
6272   if (CLASS_INTERFACE (class_decl))
6273     java_check_abstract_methods (class_decl);
6274   else
6275     java_check_regular_methods (class_decl);
6276
6277   CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)) = 1;
6278 }
6279
6280 /* Like not_accessible_p, but doesn't refer to the current class at
6281    all.  */
6282 static bool
6283 hack_is_accessible_p (tree member, tree from_where)
6284 {
6285   int flags = get_access_flags_from_decl (member);
6286
6287   if (from_where == DECL_CONTEXT (member)
6288       || (flags & ACC_PUBLIC))
6289     return true;
6290
6291   if ((flags & ACC_PROTECTED))
6292     {
6293       if (inherits_from_p (from_where, DECL_CONTEXT (member)))
6294         return true;
6295     }
6296
6297   if ((flags & ACC_PRIVATE))
6298     return false;
6299
6300   /* Package private, or protected.  */
6301   return in_same_package (TYPE_NAME (from_where),
6302                           TYPE_NAME (DECL_CONTEXT (member)));
6303 }
6304
6305 /* Check all the methods of CLASS_DECL. Methods are first completed
6306    then checked according to regular method existence rules.  If no
6307    constructor for CLASS_DECL were encountered, then build its
6308    declaration.  */
6309 static void
6310 java_check_regular_methods (tree class_decl)
6311 {
6312   int saw_constructor = ANONYMOUS_CLASS_P (TREE_TYPE (class_decl));
6313   tree method;
6314   tree class = TREE_TYPE (class_decl);
6315   tree found = NULL_TREE;
6316   tree mthrows;
6317
6318   /* It is not necessary to check methods defined in java.lang.Object */
6319   if (class == object_type_node)
6320     return;
6321
6322   if (!TYPE_NVIRTUALS (class))
6323     TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6324
6325   /* Should take interfaces into account. FIXME */
6326   for (method = TYPE_METHODS (class); method; method = TREE_CHAIN (method))
6327     {
6328       tree sig;
6329       tree method_wfl = DECL_FUNCTION_WFL (method);
6330       int aflags;
6331
6332       /* Check for redefinitions */
6333       if (check_method_redefinition (class, method))
6334         continue;
6335
6336       /* We verify things thrown by the method.  They must inherit from
6337          java.lang.Throwable.  */
6338       for (mthrows = DECL_FUNCTION_THROWS (method);
6339            mthrows; mthrows = TREE_CHAIN (mthrows))
6340         {
6341           if (!inherits_from_p (TREE_VALUE (mthrows), throwable_type_node))
6342             parse_error_context
6343               (TREE_PURPOSE (mthrows), "Class `%s' in `throws' clause must be a subclass of class `java.lang.Throwable'",
6344                IDENTIFIER_POINTER
6345                  (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))));
6346         }
6347
6348       /* If we see one constructor a mark so we don't generate the
6349          default one.  Also skip other verifications: constructors
6350          can't be inherited hence hidden or overridden.  */
6351       if (DECL_CONSTRUCTOR_P (method))
6352         {
6353           saw_constructor = 1;
6354           continue;
6355         }
6356
6357       sig = build_java_argument_signature (TREE_TYPE (method));
6358       found = lookup_argument_method_generic (class, DECL_NAME (method), sig,
6359                                               SEARCH_SUPER | SEARCH_INTERFACE);
6360
6361       /* Inner class can't declare static methods */
6362       if (METHOD_STATIC (method) && !TOPLEVEL_CLASS_DECL_P (class_decl))
6363         {
6364           char *t = xstrdup (lang_printable_name (class, 0));
6365           parse_error_context
6366             (method_wfl, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
6367              lang_printable_name (method, 0), t);
6368           free (t);
6369         }
6370
6371       /* Nothing overrides or it's a private method. */
6372       if (!found)
6373         continue;
6374       if (METHOD_PRIVATE (found))
6375         {
6376           found = NULL_TREE;
6377           continue;
6378         }
6379
6380       /* If `found' is declared in an interface, make sure the
6381          modifier matches. */
6382       if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6383           && clinit_identifier_node != DECL_NAME (found)
6384           && !METHOD_PUBLIC (method))
6385         {
6386           tree found_decl = TYPE_NAME (DECL_CONTEXT (found));
6387           parse_error_context (method_wfl, "Class `%s' must override `%s' with a public method in order to implement interface `%s'",
6388                                IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6389                                lang_printable_name (method, 0),
6390                                IDENTIFIER_POINTER (DECL_NAME (found_decl)));
6391         }
6392
6393       /* Can't override a method with the same name and different return
6394          types. */
6395       if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
6396         {
6397           char *t = xstrdup
6398             (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6399           parse_error_context
6400             (method_wfl,
6401              "Method `%s' was defined with return type `%s' in class `%s'",
6402              lang_printable_name (found, 0), t,
6403              IDENTIFIER_POINTER
6404                (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6405           free (t);
6406         }
6407
6408       aflags = get_access_flags_from_decl (found);
6409
6410       /* Can't override final. Can't override static. */
6411       if (METHOD_FINAL (found) || METHOD_STATIC (found))
6412         {
6413           /* Static *can* override static */
6414           if (METHOD_STATIC (found) && METHOD_STATIC (method))
6415             continue;
6416           parse_error_context
6417             (method_wfl,
6418              "%s methods can't be overridden. Method `%s' is %s in class `%s'",
6419              (METHOD_FINAL (found) ? "Final" : "Static"),
6420              lang_printable_name (found, 0),
6421              (METHOD_FINAL (found) ? "final" : "static"),
6422              IDENTIFIER_POINTER
6423                (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6424           continue;
6425         }
6426
6427       /* Static method can't override instance method. */
6428       if (METHOD_STATIC (method))
6429         {
6430           parse_error_context
6431             (method_wfl,
6432              "Instance methods can't be overridden by a static method. Method `%s' is an instance method in class `%s'",
6433              lang_printable_name (found, 0),
6434              IDENTIFIER_POINTER
6435                (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6436           continue;
6437         }
6438
6439       /* - Overriding/hiding public must be public
6440          - Overriding/hiding protected must be protected or public
6441          - If the overridden or hidden method has default (package)
6442            access, then the overriding or hiding method must not be
6443            private; otherwise, a compile-time error occurs.  If
6444            `found' belongs to an interface, things have been already
6445            taken care of.  */
6446       if (!CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
6447           && ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
6448               || (METHOD_PROTECTED (found)
6449                   && !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
6450               || (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
6451                   && METHOD_PRIVATE (method))))
6452         {
6453           parse_error_context
6454             (method_wfl,
6455              "Methods can't be overridden to be more private. Method `%s' is not %s in class `%s'", lang_printable_name (method, 0),
6456              (METHOD_PUBLIC (method) ? "public" :
6457               (METHOD_PRIVATE (method) ? "private" : "protected")),
6458              IDENTIFIER_POINTER (DECL_NAME
6459                                  (TYPE_NAME (DECL_CONTEXT (found)))));
6460           continue;
6461         }
6462
6463       /* Check this method against all the other implementations it
6464          overrides.  Here we only check the class hierarchy; the rest
6465          of the checking is done later.  If this method is just a
6466          Miranda method, we can skip the check.  */
6467       if (! METHOD_INVISIBLE (method))
6468         check_concrete_throws_clauses (class, method, DECL_NAME (method), sig);
6469     }
6470
6471   /* The above throws clause check only looked at superclasses.  Now
6472      we must also make sure that all methods declared in interfaces
6473      have compatible throws clauses.  FIXME: there are more efficient
6474      ways to organize this checking; we should implement one.  */
6475   check_interface_throws_clauses (class, class);
6476
6477   if (!TYPE_NVIRTUALS (class))
6478     TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
6479
6480   /* Search for inherited abstract method not yet implemented in this
6481      class.  */
6482   java_check_abstract_method_definitions (class_decl);
6483
6484   if (!saw_constructor)
6485     abort ();
6486 }
6487
6488 /* Check to make sure that all the methods in all the interfaces
6489    implemented by CLASS_DECL are compatible with the concrete
6490    implementations available in CHECK_CLASS_DECL.  */
6491 static void
6492 check_interface_throws_clauses (tree check_class_decl, tree class_decl)
6493 {
6494   for (; class_decl != NULL_TREE; class_decl = CLASSTYPE_SUPER (class_decl))
6495     {
6496       int i;
6497
6498       if (! CLASS_LOADED_P (class_decl))
6499         {
6500           if (CLASS_FROM_SOURCE_P (class_decl))
6501             safe_layout_class (class_decl);
6502           else
6503             load_class (class_decl, 1);
6504         }
6505
6506       for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (class_decl)) - 1; i > 0; --i)
6507         {
6508           tree interface
6509             = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (class_decl), i));
6510           tree iface_method;
6511
6512           for (iface_method = TYPE_METHODS (interface);
6513                iface_method != NULL_TREE;
6514                iface_method = TREE_CHAIN (iface_method))
6515             {
6516               tree sig, method;
6517
6518               /* First look for a concrete method implemented or
6519                  inherited by this class.  No need to search
6520                  interfaces here, since we're already looking through
6521                  all of them.  */
6522               sig = build_java_argument_signature (TREE_TYPE (iface_method));
6523               method
6524                 = lookup_argument_method_generic (check_class_decl,
6525                                                   DECL_NAME (iface_method),
6526                                                   sig, SEARCH_VISIBLE);
6527               /* If we don't find an implementation, that is ok.  Any
6528                  potential errors from that are diagnosed elsewhere.
6529                  Also, multiple inheritance with conflicting throws
6530                  clauses is fine in the absence of a concrete
6531                  implementation.  */
6532               if (method != NULL_TREE && !METHOD_ABSTRACT (method)
6533                   && !METHOD_INVISIBLE (iface_method))
6534                 {
6535                   tree method_wfl = DECL_FUNCTION_WFL (method);
6536                   check_throws_clauses (method, method_wfl, iface_method);
6537                 }
6538             }
6539
6540           /* Now check superinterfaces.  */
6541           check_interface_throws_clauses (check_class_decl, interface);
6542         }
6543     }
6544 }
6545
6546 /* Check throws clauses of a method against the clauses of all the
6547    methods it overrides.  We do this by searching up the class
6548    hierarchy, examining all matching accessible methods.  */
6549 static void
6550 check_concrete_throws_clauses (tree class, tree self_method,
6551                                tree name, tree signature)
6552 {
6553   tree method = lookup_argument_method_generic (class, name, signature,
6554                                                 SEARCH_SUPER | SEARCH_VISIBLE);
6555   while (method != NULL_TREE)
6556     {
6557       if (! METHOD_INVISIBLE (method) && hack_is_accessible_p (method, class))
6558         check_throws_clauses (self_method, DECL_FUNCTION_WFL (self_method),
6559                               method);
6560
6561       method = lookup_argument_method_generic (DECL_CONTEXT (method),
6562                                                name, signature,
6563                                                SEARCH_SUPER | SEARCH_VISIBLE);
6564     }
6565 }
6566
6567 /* Generate an error if the `throws' clause of METHOD (if any) is
6568    incompatible with the `throws' clause of FOUND (if any).  */
6569 static void
6570 check_throws_clauses (tree method, tree method_wfl, tree found)
6571 {
6572   tree mthrows;
6573
6574   /* Can't check these things with class loaded from bytecode. FIXME */
6575   if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
6576     return;
6577
6578   for (mthrows = DECL_FUNCTION_THROWS (method);
6579        mthrows; mthrows = TREE_CHAIN (mthrows))
6580     {
6581       tree fthrows;
6582
6583       /* We don't verify unchecked expressions */
6584       if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
6585         continue;
6586       /* Checked expression must be compatible */
6587       for (fthrows = DECL_FUNCTION_THROWS (found);
6588            fthrows; fthrows = TREE_CHAIN (fthrows))
6589         {
6590           if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
6591             break;
6592         }
6593       if (!fthrows)
6594         {
6595           parse_error_context
6596             (method_wfl, "Invalid checked exception class `%s' in `throws' clause.  The exception must be a subclass of an exception thrown by `%s' from class `%s'",
6597              IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
6598              lang_printable_name (found, 0),
6599              IDENTIFIER_POINTER
6600              (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6601         }
6602     }
6603 }
6604
6605 /* Check abstract method of interface INTERFACE */
6606 static void
6607 java_check_abstract_methods (tree interface_decl)
6608 {
6609   int i;
6610   tree method, found;
6611   tree interface = TREE_TYPE (interface_decl);
6612   tree base_binfo;
6613
6614   for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
6615     {
6616       /* 2- Check for double definition inside the defining interface */
6617       if (check_method_redefinition (interface, method))
6618         continue;
6619
6620       /* 3- Overriding is OK as far as we preserve the return type.  */
6621       found = lookup_java_interface_method2 (interface, method);
6622       if (found)
6623         {
6624           char *t;
6625           t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6626           parse_error_context
6627             (DECL_FUNCTION_WFL (found),
6628              "Method `%s' was defined with return type `%s' in class `%s'",
6629              lang_printable_name (found, 0), t,
6630              IDENTIFIER_POINTER
6631                (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6632           free (t);
6633           continue;
6634         }
6635     }
6636
6637   /* 4- Inherited methods can't differ by their returned types */
6638   for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (interface), i, base_binfo); i++)
6639     {
6640       tree sub_interface_method, sub_interface;
6641
6642       sub_interface = BINFO_TYPE (base_binfo);
6643       for (sub_interface_method = TYPE_METHODS (sub_interface);
6644            sub_interface_method;
6645            sub_interface_method = TREE_CHAIN (sub_interface_method))
6646         {
6647           found = lookup_java_interface_method2 (interface,
6648                                                  sub_interface_method);
6649           if (found && (found != sub_interface_method))
6650             {
6651               parse_error_context
6652                 (lookup_cl (sub_interface_method),
6653                  "Interface `%s' inherits method `%s' from interface `%s'. This method is redefined with a different return type in interface `%s'",
6654                  IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
6655                  lang_printable_name (found, 0),
6656                  IDENTIFIER_POINTER
6657                    (DECL_NAME (TYPE_NAME
6658                                (DECL_CONTEXT (sub_interface_method)))),
6659                  IDENTIFIER_POINTER
6660                    (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6661             }
6662         }
6663     }
6664 }
6665
6666 /* Lookup methods in interfaces using their name and partial
6667    signature. Return a matching method only if their types differ.  */
6668
6669 static tree
6670 lookup_java_interface_method2 (tree class, tree method_decl)
6671 {
6672   int i;
6673   tree base_binfo;
6674   tree to_return;
6675
6676   for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
6677     {
6678       if ((BINFO_TYPE (base_binfo) != object_type_node)
6679           && (to_return =
6680               lookup_java_method2 (BINFO_TYPE (base_binfo), method_decl, 1)))
6681         return to_return;
6682     }
6683   for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
6684     {
6685       to_return = lookup_java_interface_method2
6686         (BINFO_TYPE (base_binfo), method_decl);
6687       if (to_return)
6688         return to_return;
6689     }
6690
6691   return NULL_TREE;
6692 }
6693
6694 /* Lookup method using their name and partial signature. Return a
6695    matching method only if their types differ.  */
6696
6697 static tree
6698 lookup_java_method2 (tree clas, tree method_decl, int do_interface)
6699 {
6700   tree method, method_signature, method_name, method_type, name;
6701
6702   method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
6703   name = DECL_NAME (method_decl);
6704   method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6705                  EXPR_WFL_NODE (name) : name);
6706   method_type = TREE_TYPE (TREE_TYPE (method_decl));
6707
6708   while (clas != NULL_TREE)
6709     {
6710       for (method = TYPE_METHODS (clas);
6711            method != NULL_TREE;  method = TREE_CHAIN (method))
6712         {
6713           tree method_sig = build_java_argument_signature (TREE_TYPE (method));
6714           tree name = DECL_NAME (method);
6715           if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6716                EXPR_WFL_NODE (name) : name) == method_name
6717               && method_sig == method_signature
6718               && TREE_TYPE (TREE_TYPE (method)) != method_type)
6719             return method;
6720         }
6721       clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
6722     }
6723   return NULL_TREE;
6724 }
6725
6726 /* Return the line that matches DECL line number, and try its best to
6727    position the column number. Used during error reports.  */
6728
6729 static GTY(()) tree cl_v;
6730 static tree
6731 lookup_cl (tree decl)
6732 {
6733   char *line, *found;
6734
6735   if (!decl)
6736     return NULL_TREE;
6737
6738   if (cl_v == NULL_TREE)
6739     {
6740       cl_v = build_expr_wfl (NULL_TREE, NULL, 0, 0);
6741     }
6742
6743   EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
6744   EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE (decl), -1);
6745
6746   line = java_get_line_col (EXPR_WFL_FILENAME (cl_v),
6747                             EXPR_WFL_LINENO (cl_v), EXPR_WFL_COLNO (cl_v));
6748
6749   found = strstr ((const char *)line,
6750                   (const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
6751   if (found)
6752     EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
6753
6754   return cl_v;
6755 }
6756
6757 /* Look for a simple name in the single-type import list */
6758
6759 static tree
6760 find_name_in_single_imports (tree name)
6761 {
6762   tree node;
6763
6764   for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
6765     if (TREE_VALUE (node) == name)
6766       return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
6767
6768   return NULL_TREE;
6769 }
6770
6771 /* Process all single-type import. */
6772
6773 static int
6774 process_imports (void)
6775 {
6776   tree import;
6777   int error_found;
6778
6779   for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
6780     {
6781       tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
6782       char *original_name;
6783
6784       original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
6785                                IDENTIFIER_LENGTH (to_be_found),
6786                                IDENTIFIER_LENGTH (to_be_found) + 1);
6787
6788       /* Don't load twice something already defined. */
6789       if (IDENTIFIER_CLASS_VALUE (to_be_found))
6790         continue;
6791
6792       while (1)
6793         {
6794           tree left;
6795
6796           QUALIFIED_P (to_be_found) = 1;
6797           load_class (to_be_found, 0);
6798           error_found =
6799             check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true, NULL_TREE);
6800
6801           /* We found it, we can bail out */
6802           if (IDENTIFIER_CLASS_VALUE (to_be_found))
6803             {
6804               check_deprecation (TREE_PURPOSE (import),
6805                                  IDENTIFIER_CLASS_VALUE (to_be_found));
6806               break;
6807             }
6808
6809           /* We haven't found it. Maybe we're trying to access an
6810              inner class.  The only way for us to know is to try again
6811              after having dropped a qualifier. If we can't break it further,
6812              we have an error. */
6813           if (split_qualified_name (&left, NULL, to_be_found))
6814             break;
6815
6816           to_be_found = left;
6817         }
6818       if (!IDENTIFIER_CLASS_VALUE (to_be_found))
6819         {
6820           parse_error_context (TREE_PURPOSE (import),
6821                                "Class or interface `%s' not found in import",
6822                                original_name);
6823           error_found = 1;
6824         }
6825
6826       free (original_name);
6827       if (error_found)
6828         return 1;
6829     }
6830   return 0;
6831 }
6832
6833 /* Possibly find and mark a class imported by a single-type import
6834    statement.  */
6835
6836 static void
6837 find_in_imports (tree enclosing_type, tree class_type)
6838 {
6839   tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) :
6840                  ctxp->import_list);
6841   while (import)
6842     {
6843       if (TREE_VALUE (import) == TYPE_NAME (class_type))
6844         {
6845           TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
6846           QUALIFIED_P (TYPE_NAME (class_type)) = 1;
6847           return;
6848         }
6849       import = TREE_CHAIN (import);
6850     }
6851 }
6852
6853 static int
6854 note_possible_classname (const char *name, int len)
6855 {
6856   tree node;
6857   if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
6858     len = len - 5;
6859   else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
6860     len = len - 6;
6861   else
6862     return 0;
6863   node = ident_subst (name, len, "", '/', '.', "");
6864   IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
6865   QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
6866   return 1;
6867 }
6868
6869 /* Read a import directory, gathering potential match for further type
6870    references. Indifferently reads a filesystem or a ZIP archive
6871    directory.  */
6872
6873 static void
6874 read_import_dir (tree wfl)
6875 {
6876   tree package_id = EXPR_WFL_NODE (wfl);
6877   const char *package_name = IDENTIFIER_POINTER (package_id);
6878   int package_length = IDENTIFIER_LENGTH (package_id);
6879   DIR *dirp = NULL;
6880   JCF *saved_jcf = current_jcf;
6881
6882   int found = 0;
6883   int k;
6884   void *entry;
6885   struct buffer filename[1];
6886
6887   if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
6888     return;
6889   IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
6890
6891   BUFFER_INIT (filename);
6892   buffer_grow (filename, package_length + 100);
6893
6894   for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
6895     {
6896       const char *entry_name = jcf_path_name (entry);
6897       int entry_length = strlen (entry_name);
6898       if (jcf_path_is_zipfile (entry))
6899         {
6900           ZipFile *zipf;
6901           buffer_grow (filename, entry_length);
6902           memcpy (filename->data, entry_name, entry_length - 1);
6903           filename->data[entry_length-1] = '\0';
6904           zipf = opendir_in_zip ((const char *) filename->data, jcf_path_is_system (entry));
6905           if (zipf == NULL)
6906             error ("malformed .zip archive in CLASSPATH: %s", entry_name);
6907           else
6908             {
6909               ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
6910               BUFFER_RESET (filename);
6911               for (k = 0; k < package_length; k++)
6912                 {
6913                   char ch = package_name[k];
6914                   *filename->ptr++ = ch == '.' ? '/' : ch;
6915                 }
6916               *filename->ptr++ = '/';
6917
6918               for (k = 0; k < zipf->count;  k++, zipd = ZIPDIR_NEXT (zipd))
6919                 {
6920                   const char *current_entry = ZIPDIR_FILENAME (zipd);
6921                   int current_entry_len = zipd->filename_length;
6922
6923                   if (current_entry_len >= BUFFER_LENGTH (filename)
6924                       && strncmp ((const char *) filename->data, current_entry,
6925                                   BUFFER_LENGTH (filename)) != 0)
6926                     continue;
6927                   found |= note_possible_classname (current_entry,
6928                                                     current_entry_len);
6929                 }
6930             }
6931         }
6932       else
6933         {
6934           BUFFER_RESET (filename);
6935           buffer_grow (filename, entry_length + package_length + 4);
6936           strcpy ((char *) filename->data, entry_name);
6937           filename->ptr = filename->data + entry_length;
6938           for (k = 0; k < package_length; k++)
6939             {
6940               char ch = package_name[k];
6941               *filename->ptr++ = ch == '.' ? '/' : ch;
6942             }
6943           *filename->ptr = '\0';
6944
6945           dirp = opendir ((const char *) filename->data);
6946           if (dirp == NULL)
6947             continue;
6948           *filename->ptr++ = '/';
6949           for (;;)
6950             {
6951               int len;
6952               const char *d_name;
6953               struct dirent *direntp = readdir (dirp);
6954               if (!direntp)
6955                 break;
6956               d_name = direntp->d_name;
6957               len = strlen (direntp->d_name);
6958               buffer_grow (filename, len+1);
6959               strcpy ((char *) filename->ptr, d_name);
6960               found |= note_possible_classname ((const char *) filename->data + entry_length,
6961                                                 package_length+len+1);
6962             }
6963           if (dirp)
6964             closedir (dirp);
6965         }
6966     }
6967
6968   free (filename->data);
6969
6970   /* Here we should have a unified way of retrieving an entry, to be
6971      indexed. */
6972   if (!found)
6973     {
6974       static int first = 1;
6975       if (first)
6976         {
6977           error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives", package_name);
6978           java_error_count++;
6979           first = 0;
6980         }
6981       else
6982         parse_error_context (wfl, "Package `%s' not found in import",
6983                              package_name);
6984       current_jcf = saved_jcf;
6985       return;
6986     }
6987   current_jcf = saved_jcf;
6988 }
6989
6990 /* Possibly find a type in the import on demands specified
6991    types. Returns 1 if an error occurred, 0 otherwise. Run through the
6992    entire list, to detected potential double definitions.  */
6993
6994 static int
6995 find_in_imports_on_demand (tree enclosing_type, tree class_type)
6996 {
6997   tree class_type_name = TYPE_NAME (class_type);
6998   tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) :
6999                   ctxp->import_demand_list);
7000   tree cl = NULL_TREE;
7001   int seen_once = -1;   /* -1 when not set, 1 if seen once, >1 otherwise. */
7002   int to_return = -1;   /* -1 when not set, 0 or 1 otherwise */
7003   tree node;
7004
7005   for (; import; import = TREE_CHAIN (import))
7006     {
7007       int saved_lineno = input_line;
7008       int access_check;
7009       const char *id_name;
7010       tree decl, type_name_copy;
7011
7012       obstack_grow (&temporary_obstack,
7013                     IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
7014                     IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
7015       obstack_1grow (&temporary_obstack, '.');
7016       obstack_grow0 (&temporary_obstack,
7017                      IDENTIFIER_POINTER (class_type_name),
7018                      IDENTIFIER_LENGTH (class_type_name));
7019       id_name = obstack_finish (&temporary_obstack);
7020
7021       if (! (node = maybe_get_identifier (id_name)))
7022         continue;
7023
7024       /* Setup input_line so that it refers to the line of the import (in
7025          case we parse a class file and encounter errors */
7026       input_line = EXPR_WFL_LINENO (TREE_PURPOSE (import));
7027
7028       type_name_copy = TYPE_NAME (class_type);
7029       TYPE_NAME (class_type) = node;
7030       QUALIFIED_P (node) = 1;
7031       decl = IDENTIFIER_CLASS_VALUE (node);
7032       access_check = -1;
7033       /* If there is no DECL set for the class or if the class isn't
7034          loaded and not seen in source yet, then load */
7035       if (!decl || ! CLASS_LOADED_P (TREE_TYPE (decl)))
7036         {
7037           load_class (node, 0);
7038           decl = IDENTIFIER_CLASS_VALUE (node);
7039         }
7040       if (decl && ! INNER_CLASS_P (TREE_TYPE (decl)))
7041         access_check = check_pkg_class_access (node, TREE_PURPOSE (import),
7042                                                false, NULL_TREE);
7043       else
7044         /* 6.6.1: Inner classes are subject to member access rules. */
7045         access_check = 0;
7046
7047       input_line = saved_lineno;
7048
7049       /* If the loaded class is not accessible or couldn't be loaded,
7050          we restore the original TYPE_NAME and process the next
7051          import. */
7052       if (access_check || !decl)
7053         {
7054           TYPE_NAME (class_type) = type_name_copy;
7055           continue;
7056         }
7057
7058       /* If the loaded class is accessible, we keep a tab on it to
7059          detect and report multiple inclusions. */
7060       if (IS_A_CLASSFILE_NAME (node))
7061         {
7062           if (seen_once < 0)
7063             {
7064               cl = TREE_PURPOSE (import);
7065               seen_once = 1;
7066             }
7067           else if (seen_once >= 0)
7068             {
7069               tree location = (cl ? cl : TREE_PURPOSE (import));
7070               tree package = (cl ? EXPR_WFL_NODE (cl) :
7071                               EXPR_WFL_NODE (TREE_PURPOSE (import)));
7072               seen_once++;
7073               parse_error_context
7074                 (location,
7075                  "Type `%s' also potentially defined in package `%s'",
7076                  IDENTIFIER_POINTER (TYPE_NAME (class_type)),
7077                  IDENTIFIER_POINTER (package));
7078             }
7079         }
7080       to_return = access_check;
7081     }
7082
7083   if (seen_once == 1)
7084     return to_return;
7085   else
7086     return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
7087 }
7088
7089 /* Add package NAME to the list of packages encountered so far. To
7090    speed up class lookup in do_resolve_class, we make sure a
7091    particular package is added only once.  */
7092
7093 static void
7094 register_package (tree name)
7095 {
7096   static htab_t pht;
7097   void **e;
7098
7099   if (pht == NULL)
7100     pht = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
7101
7102   e = htab_find_slot (pht, name, INSERT);
7103   if (*e == NULL)
7104     {
7105       package_list = chainon (package_list, build_tree_list (name, NULL));
7106       *e = name;
7107     }
7108 }
7109
7110 static tree
7111 resolve_package (tree pkg, tree *next, tree *type_name)
7112 {
7113   tree current;
7114   tree decl = NULL_TREE;
7115   *type_name = NULL_TREE;
7116
7117   /* The trick is to determine when the package name stops and were
7118      the name of something contained in the package starts. Then we
7119      return a fully qualified name of what we want to get. */
7120
7121   *next = EXPR_WFL_QUALIFICATION (pkg);
7122
7123   /* Try to progressively construct a type name */
7124   if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION)
7125     for (current = EXPR_WFL_QUALIFICATION (pkg);
7126          current; current = TREE_CHAIN (current))
7127       {
7128         /* If we don't have what we're expecting, exit now. TYPE_NAME
7129            will be null and the error caught later. */
7130         if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION)
7131           break;
7132         *type_name =
7133           merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current)));
7134         if ((decl = resolve_no_layout (*type_name, NULL_TREE)))
7135           {
7136             /* resolve_package should be used in a loop, hence we
7137                point at this one to naturally process the next one at
7138                the next iteration. */
7139             *next = current;
7140             break;
7141           }
7142       }
7143   return decl;
7144 }
7145
7146
7147 /* Check accessibility of inner classes according to member access rules.
7148    DECL is the inner class, ENCLOSING_DECL is the class from which the
7149    access is being attempted. */
7150
7151 static void
7152 check_inner_class_access (tree decl, tree enclosing_decl, tree cl)
7153 {
7154   const char *access;
7155   tree enclosing_decl_type;
7156
7157   /* We don't issue an error message when CL is null. CL can be null
7158      as a result of processing a JDEP crafted by source_start_java_method
7159      for the purpose of patching its parm decl. But the error would
7160      have been already trapped when fixing the method's signature.
7161      DECL can also be NULL in case of earlier errors. */
7162   if (!decl || !cl)
7163     return;
7164
7165   enclosing_decl_type = TREE_TYPE (enclosing_decl);
7166
7167   if (CLASS_PRIVATE (decl))
7168     {
7169       /* Access is permitted only within the body of the top-level
7170          class in which DECL is declared. */
7171       tree top_level = decl;
7172       while (DECL_CONTEXT (top_level))
7173         top_level = DECL_CONTEXT (top_level);
7174       while (DECL_CONTEXT (enclosing_decl))
7175         enclosing_decl = DECL_CONTEXT (enclosing_decl);
7176       if (top_level == enclosing_decl)
7177         return;
7178       access = "private";
7179     }
7180   else if (CLASS_PROTECTED (decl))
7181     {
7182       tree decl_context;
7183       /* Access is permitted from within the same package... */
7184       if (in_same_package (decl, enclosing_decl))
7185         return;
7186
7187       /* ... or from within the body of a subtype of the context in which
7188          DECL is declared. */
7189       decl_context = DECL_CONTEXT (decl);
7190       while (enclosing_decl)
7191         {
7192           if (CLASS_INTERFACE (decl))
7193             {
7194               if (interface_of_p (TREE_TYPE (decl_context),
7195                                   enclosing_decl_type))
7196                 return;
7197             }
7198           else
7199             {
7200               /* Eww. The order of the arguments is different!! */
7201               if (inherits_from_p (enclosing_decl_type,
7202                                    TREE_TYPE (decl_context)))
7203                 return;
7204             }
7205           enclosing_decl = DECL_CONTEXT (enclosing_decl);
7206         }
7207       access = "protected";
7208     }
7209   else if (! CLASS_PUBLIC (decl))
7210     {
7211       /* Access is permitted only from within the same package as DECL. */
7212       if (in_same_package (decl, enclosing_decl))
7213         return;
7214       access = "non-public";
7215     }
7216   else
7217     /* Class is public. */
7218     return;
7219
7220   parse_error_context (cl, "Nested %s %s is %s; cannot be accessed from here",
7221                        (CLASS_INTERFACE (decl) ? "interface" : "class"),
7222                        lang_printable_name (decl, 0), access);
7223 }
7224
7225 /* Accessibility check for top-level classes. If CLASS_NAME is in a
7226    foreign package, it must be PUBLIC. Return 0 if no access
7227    violations were found, 1 otherwise. If VERBOSE is true and an error
7228    was found, it is reported and accounted for.  If CL is NULL then 
7229    look it up with THIS_DECL.  */
7230
7231 static int
7232 check_pkg_class_access (tree class_name, tree cl, bool verbose, tree this_decl)
7233 {
7234   tree type;
7235
7236   if (!IDENTIFIER_CLASS_VALUE (class_name))
7237     return 0;
7238
7239   if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
7240     return 0;
7241
7242   if (!CLASS_PUBLIC (TYPE_NAME (type)))
7243     {
7244       /* Access to a private class within the same package is
7245          allowed. */
7246       tree l, r;
7247       split_qualified_name (&l, &r, class_name);
7248       if (!QUALIFIED_P (class_name) && !ctxp->package)
7249         /* Both in the empty package. */
7250         return 0;
7251       if (l == ctxp->package)
7252         /* Both in the same package. */
7253         return 0;
7254
7255       if (verbose)
7256         parse_error_context
7257           (cl == NULL ? lookup_cl (this_decl): cl,
7258            "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed",
7259            (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
7260            IDENTIFIER_POINTER (class_name));
7261       return 1;
7262     }
7263   return 0;
7264 }
7265
7266 /* Local variable declaration. */
7267
7268 static void
7269 declare_local_variables (int modifier, tree type, tree vlist)
7270 {
7271   tree decl, current, saved_type;
7272   tree type_wfl = NULL_TREE;
7273   int must_chain = 0;
7274   int final_p = 0;
7275
7276   /* Push a new block if statements were seen between the last time we
7277      pushed a block and now. Keep a count of blocks to close */
7278   if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
7279     {
7280       tree b = enter_block ();
7281       BLOCK_IS_IMPLICIT (b) = 1;
7282     }
7283
7284   if (modifier)
7285     {
7286       size_t i;
7287       for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)
7288         if (1 << i & modifier)
7289           break;
7290       if (modifier == ACC_FINAL)
7291         final_p = 1;
7292       else
7293         {
7294           parse_error_context
7295             (ctxp->modifier_ctx [i],
7296              "Only `final' is allowed as a local variables modifier");
7297           return;
7298         }
7299     }
7300
7301   /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
7302      hold the TYPE value if a new incomplete has to be created (as
7303      opposed to being found already existing and reused). */
7304   SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
7305
7306   /* If TYPE is fully resolved and we don't have a reference, make one */
7307   PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7308
7309   /* Go through all the declared variables */
7310   for (current = vlist, saved_type = type; current;
7311        current = TREE_CHAIN (current), type = saved_type)
7312     {
7313       tree other, real_type;
7314       tree wfl  = TREE_PURPOSE (current);
7315       tree name = EXPR_WFL_NODE (wfl);
7316       tree init = TREE_VALUE (current);
7317
7318       /* Process NAME, as it may specify extra dimension(s) for it */
7319       type = build_array_from_name (type, type_wfl, name, &name);
7320
7321       /* Variable redefinition check */
7322       if ((other = lookup_name_in_blocks (name)))
7323         {
7324           variable_redefinition_error (wfl, name, TREE_TYPE (other),
7325                                        DECL_SOURCE_LINE (other));
7326           continue;
7327         }
7328
7329       /* Type adjustment. We may have just readjusted TYPE because
7330          the variable specified more dimensions. Make sure we have
7331          a reference if we can and don't have one already. */
7332       PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7333
7334       real_type = GET_REAL_TYPE (type);
7335       /* Never layout this decl. This will be done when its scope
7336          will be entered */
7337       decl = build_decl (VAR_DECL, name, real_type);
7338       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
7339       DECL_FINAL (decl) = final_p;
7340       BLOCK_CHAIN_DECL (decl);
7341
7342       /* If doing xreferencing, replace the line number with the WFL
7343          compound value */
7344       if (flag_emit_xref)
7345         DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
7346
7347       /* Don't try to use an INIT statement when an error was found */
7348       if (init && java_error_count)
7349         init = NULL_TREE;
7350
7351       /* Remember it if this is an initialized-upon-declaration final
7352          variable.  */
7353       if (init && final_p)
7354         {
7355           DECL_LOCAL_FINAL_IUD (decl) = 1;
7356         }
7357
7358       /* Add the initialization function to the current function's code */
7359       if (init)
7360         {
7361           /* Name might have been readjusted */
7362           EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
7363           MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
7364           java_method_add_stmt (current_function_decl,
7365                                 build_debugable_stmt (EXPR_WFL_LINECOL (init),
7366                                                       init));
7367         }
7368
7369       /* Setup dependency the type of the decl */
7370       if (must_chain)
7371         {
7372           jdep *dep;
7373           register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
7374           dep = CLASSD_LAST (ctxp->classd_list);
7375           JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
7376         }
7377     }
7378   SOURCE_FRONTEND_DEBUG (("Defined locals"));
7379 }
7380
7381 /* Called during parsing. Build decls from argument list.  */
7382
7383 static void
7384 source_start_java_method (tree fndecl)
7385 {
7386   tree tem;
7387   tree parm_decl;
7388   int i;
7389
7390   if (!fndecl)
7391     return;
7392
7393   current_function_decl = fndecl;
7394
7395   /* New scope for the function */
7396   enter_block ();
7397   for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
7398        tem != end_params_node; tem = TREE_CHAIN (tem), i++)
7399     {
7400       tree type = TREE_VALUE (tem);
7401       tree name = TREE_PURPOSE (tem);
7402
7403       /* If type is incomplete. Create an incomplete decl and ask for
7404          the decl to be patched later */
7405       if (INCOMPLETE_TYPE_P (type))
7406         {
7407           jdep *jdep;
7408           tree real_type = GET_REAL_TYPE (type);
7409           parm_decl = build_decl (PARM_DECL, name, real_type);
7410           type = obtain_incomplete_type (type);
7411           register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
7412           jdep = CLASSD_LAST (ctxp->classd_list);
7413           JDEP_MISC (jdep) = name;
7414           JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
7415         }
7416       else
7417         parm_decl = build_decl (PARM_DECL, name, type);
7418
7419       /* Remember if a local variable was declared final (via its
7420          TREE_LIST of type/name.) Set DECL_FINAL accordingly. */
7421       if (ARG_FINAL_P (tem))
7422         {
7423           MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl);
7424           DECL_FINAL (parm_decl) = 1;
7425         }
7426
7427       BLOCK_CHAIN_DECL (parm_decl);
7428     }
7429   tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7430   BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
7431     nreverse (tem);
7432   DECL_ARG_SLOT_COUNT (current_function_decl) = i;
7433   DECL_MAX_LOCALS (current_function_decl) = i;
7434 }
7435
7436 /* Called during parsing. Creates an artificial method declaration.  */
7437
7438 static tree
7439 create_artificial_method (tree class, int flags, tree type,
7440                           tree name, tree args)
7441 {
7442   tree mdecl;
7443
7444   java_parser_context_save_global ();
7445   input_line = 0;
7446   mdecl = make_node (FUNCTION_TYPE);
7447   TREE_TYPE (mdecl) = type;
7448   TYPE_ARG_TYPES (mdecl) = args;
7449   mdecl = add_method (class, flags, name, build_java_signature (mdecl));
7450   java_parser_context_restore_global ();
7451   DECL_ARTIFICIAL (mdecl) = 1;
7452   return mdecl;
7453 }
7454
7455 /* Starts the body if an artificial method.  */
7456
7457 static void
7458 start_artificial_method_body (tree mdecl)
7459 {
7460   DECL_SOURCE_LINE (mdecl) = 1;
7461   DECL_FUNCTION_LAST_LINE (mdecl) = 1;
7462   source_start_java_method (mdecl);
7463   enter_block ();
7464 }
7465
7466 static void
7467 end_artificial_method_body (tree mdecl)
7468 {
7469   /* exit_block modifies DECL_FUNCTION_BODY (current_function_decl).
7470      It has to be evaluated first. (if mdecl is current_function_decl,
7471      we have an undefined behavior if no temporary variable is used.) */
7472   tree b = exit_block ();
7473   BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = b;
7474   exit_block ();
7475 }
7476
7477 /* Dump a tree of some kind.  This is a convenience wrapper for the
7478    dump_* functions in tree-dump.c.  */
7479 static void
7480 dump_java_tree (enum tree_dump_index phase, tree t)
7481 {
7482   FILE *stream;
7483   int flags;
7484
7485   stream = dump_begin (phase, &flags);
7486   flags |= TDF_SLIM;
7487   if (stream)
7488     {
7489       dump_node (t, flags, stream);
7490       dump_end (phase, stream);
7491     }
7492 }
7493
7494 /* Terminate a function and expand its body.  */
7495
7496 static void
7497 source_end_java_method (void)
7498 {
7499   tree fndecl = current_function_decl;
7500
7501   if (!fndecl)
7502     return;
7503
7504   java_parser_context_save_global ();
7505   input_line = ctxp->last_ccb_indent1;
7506
7507   /* Turn function bodies with only a NOP expr null, so they don't get
7508      generated at all and we won't get warnings when using the -W
7509      -Wall flags. */
7510   if (IS_EMPTY_STMT (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))))
7511     BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
7512
7513   if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))
7514       && ! flag_emit_class_files
7515       && ! flag_emit_xref)
7516     finish_method (fndecl);
7517
7518   current_function_decl = NULL_TREE;
7519   java_parser_context_restore_global ();
7520   current_function_decl = NULL_TREE;
7521 }
7522
7523 /* Record EXPR in the current function block. Complements compound
7524    expression second operand if necessary.  */
7525
7526 tree
7527 java_method_add_stmt (tree fndecl, tree expr)
7528 {
7529   if (!GET_CURRENT_BLOCK (fndecl))
7530     return NULL_TREE;
7531   return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
7532 }
7533
7534 static tree
7535 add_stmt_to_block (tree b, tree type, tree stmt)
7536 {
7537   tree body = BLOCK_EXPR_BODY (b), c;
7538
7539   if (java_error_count)
7540     return body;
7541
7542   if ((c = add_stmt_to_compound (body, type, stmt)) == body)
7543     return body;
7544
7545   BLOCK_EXPR_BODY (b) = c;
7546   TREE_SIDE_EFFECTS (c) = 1;
7547   return c;
7548 }
7549
7550 /* Lays out the methods for the classes seen so far.  */
7551
7552 void
7553 java_layout_seen_class_methods (void)
7554 {
7555   tree previous_list = all_class_list;
7556   tree end = NULL_TREE;
7557   tree current;
7558
7559   while (1)
7560     {
7561       for (current = previous_list;
7562            current != end; current = TREE_CHAIN (current))
7563         {
7564           tree cls = TREE_TYPE (TREE_VALUE (current));
7565
7566           if (! CLASS_LOADED_P (cls))
7567             load_class (cls, 0);
7568
7569           layout_class_methods (cls);
7570         }
7571
7572       /* Note that new classes might have been added while laying out
7573          methods, changing the value of all_class_list.  */
7574
7575       if (previous_list != all_class_list)
7576         {
7577           end = previous_list;
7578           previous_list = all_class_list;
7579         }
7580       else
7581         break;
7582     }
7583 }
7584
7585 static GTY(()) tree stop_reordering;
7586 void
7587 java_reorder_fields (void)
7588 {
7589   tree current;
7590
7591   for (current = gclass_list; current; current = TREE_CHAIN (current))
7592     {
7593       output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7594
7595       if (current_class == stop_reordering)
7596         break;
7597
7598       /* Reverse the fields, but leave the dummy field in front.
7599          Fields are already ordered for Object and Class */
7600       if (TYPE_FIELDS (current_class) && current_class != object_type_node
7601           && current_class != class_type_node)
7602       {
7603         /* If the dummy field is there, reverse the right fields and
7604            just layout the type for proper fields offset */
7605         if (!DECL_NAME (TYPE_FIELDS (current_class)))
7606           {
7607             tree fields = TYPE_FIELDS (current_class);
7608             TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
7609             TYPE_SIZE (current_class) = NULL_TREE;
7610           }
7611         /* We don't have a dummy field, we need to layout the class,
7612            after having reversed the fields */
7613         else
7614           {
7615             TYPE_FIELDS (current_class) =
7616               nreverse (TYPE_FIELDS (current_class));
7617             TYPE_SIZE (current_class) = NULL_TREE;
7618           }
7619       }
7620     }
7621   /* There are cases were gclass_list will be empty. */
7622   if (gclass_list)
7623     stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list));
7624 }
7625
7626 /* Layout the methods of all classes loaded in one way or another.
7627    Check methods of source parsed classes. Then reorder the
7628    fields and layout the classes or the type of all source parsed
7629    classes */
7630
7631 void
7632 java_layout_classes (void)
7633 {
7634   tree current;
7635   int save_error_count = java_error_count;
7636
7637   /* Layout the methods of all classes seen so far */
7638   java_layout_seen_class_methods ();
7639   java_parse_abort_on_error ();
7640   all_class_list = NULL_TREE;
7641
7642   /* Then check the methods of all parsed classes */
7643   for (current = gclass_list; current; current = TREE_CHAIN (current))
7644     if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
7645       java_check_methods (TREE_VALUE (current));
7646   java_parse_abort_on_error ();
7647
7648   for (current = gclass_list; current; current = TREE_CHAIN (current))
7649     {
7650       output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7651       layout_class (current_class);
7652
7653       /* Error reported by the caller */
7654       if (java_error_count)
7655         return;
7656     }
7657
7658   /* We might have reloaded classes durign the process of laying out
7659      classes for code generation. We must layout the methods of those
7660      late additions, as constructor checks might use them */
7661   java_layout_seen_class_methods ();
7662   java_parse_abort_on_error ();
7663 }
7664
7665 /* Expand methods in the current set of classes remembered for
7666    generation.  */
7667
7668 static void
7669 java_complete_expand_classes (void)
7670 {
7671   tree current;
7672
7673   do_not_fold = flag_emit_xref;
7674
7675   for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
7676     if (!INNER_CLASS_DECL_P (current))
7677       java_complete_expand_class (current);
7678 }
7679
7680 /* Expand the methods found in OUTER, starting first by OUTER's inner
7681    classes, if any.  */
7682
7683 static void
7684 java_complete_expand_class (tree outer)
7685 {
7686   tree inner_list;
7687
7688   /* We need to go after all inner classes and start expanding them,
7689      starting with most nested ones. We have to do that because nested
7690      classes might add functions to outer classes */
7691
7692   for (inner_list = DECL_INNER_CLASS_LIST (outer);
7693        inner_list; inner_list = TREE_CHAIN (inner_list))
7694     java_complete_expand_class (TREE_PURPOSE (inner_list));
7695
7696   java_complete_expand_methods (outer);
7697 }
7698
7699 /* Expand methods registered in CLASS_DECL. The general idea is that
7700    we expand regular methods first. This allows us get an estimate on
7701    how outer context local alias fields are really used so we can add
7702    to the constructor just enough code to initialize them properly (it
7703    also lets us generate finit$ correctly.) Then we expand the
7704    constructors and then <clinit>.  */
7705
7706 static void
7707 java_complete_expand_methods (tree class_decl)
7708 {
7709   tree clinit, decl, first_decl;
7710
7711   output_class = current_class = TREE_TYPE (class_decl);
7712
7713   /* Pre-expand <clinit> to figure whether we really need it or
7714      not. If we do need it, we pre-expand the static fields so they're
7715      ready to be used somewhere else. <clinit> will be fully expanded
7716      after we processed the constructors. */
7717   first_decl = TYPE_METHODS (current_class);
7718   clinit = maybe_generate_pre_expand_clinit (current_class);
7719
7720   /* Then generate finit$ (if we need to) because constructors will
7721    try to use it.*/
7722   if (TYPE_FINIT_STMT_LIST (current_class))
7723     java_complete_expand_method (generate_finit (current_class));
7724
7725   /* Then generate instinit$ (if we need to) because constructors will
7726      try to use it. */
7727   if (TYPE_II_STMT_LIST (current_class))
7728     java_complete_expand_method (generate_instinit (current_class));
7729
7730   /* Now do the constructors */
7731   for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl))
7732     {
7733       if (!DECL_CONSTRUCTOR_P (decl))
7734         continue;
7735       java_complete_expand_method (decl);
7736     }
7737
7738   /* First, do the ordinary methods. */
7739   for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
7740     {
7741       /* Ctors aren't part of this batch. */
7742       if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
7743         continue;
7744
7745       /* Skip abstract or native methods -- but do handle native
7746          methods when generating JNI stubs.  */
7747       if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl)))
7748         {
7749           DECL_FUNCTION_BODY (decl) = NULL_TREE;
7750           continue;
7751         }
7752
7753       if (METHOD_NATIVE (decl))
7754         {
7755           tree body;
7756           current_function_decl = decl;
7757           body = build_jni_stub (decl);
7758           BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
7759         }
7760
7761       java_complete_expand_method (decl);
7762     }
7763
7764   /* If there is indeed a <clinit>, fully expand it now */
7765   if (clinit)
7766     {
7767       /* Prevent the use of `this' inside <clinit> */
7768       ctxp->explicit_constructor_p = 1;
7769       java_complete_expand_method (clinit);
7770       ctxp->explicit_constructor_p = 0;
7771     }
7772
7773   /* We might have generated a class$ that we now want to expand */
7774   if (TYPE_DOT_CLASS (current_class))
7775     java_complete_expand_method (TYPE_DOT_CLASS (current_class));
7776
7777   /* Now verify constructor circularity (stop after the first one we
7778      prove wrong.) */
7779   if (!CLASS_INTERFACE (class_decl))
7780     for (decl = TYPE_METHODS (current_class); decl; decl = TREE_CHAIN (decl))
7781       if (DECL_CONSTRUCTOR_P (decl)
7782           && verify_constructor_circularity (decl, decl))
7783         break;
7784 }
7785
7786 /* Attempt to create <clinit>. Pre-expand static fields so they can be
7787    safely used in some other methods/constructors.  */
7788
7789 static tree
7790 maybe_generate_pre_expand_clinit (tree class_type)
7791 {
7792   tree current, mdecl;
7793
7794   if (!TYPE_CLINIT_STMT_LIST (class_type))
7795     return NULL_TREE;
7796
7797   /* Go through all static fields and pre expand them */
7798   for (current = TYPE_FIELDS (class_type); current;
7799        current = TREE_CHAIN (current))
7800     if (FIELD_STATIC (current))
7801       build_field_ref (NULL_TREE, class_type, DECL_NAME (current));
7802
7803   /* Then build the <clinit> method */
7804   mdecl = create_artificial_method (class_type, ACC_STATIC, void_type_node,
7805                                     clinit_identifier_node, end_params_node);
7806   layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
7807                        mdecl, NULL_TREE);
7808   start_artificial_method_body (mdecl);
7809
7810   /* We process the list of assignment we produced as the result of
7811      the declaration of initialized static field and add them as
7812      statement to the <clinit> method. */
7813   for (current = TYPE_CLINIT_STMT_LIST (class_type); current;
7814        current = TREE_CHAIN (current))
7815     {
7816       tree stmt = current;
7817       /* We build the assignment expression that will initialize the
7818          field to its value. There are strict rules on static
7819          initializers (8.5). FIXME */
7820       if (TREE_CODE (stmt) != BLOCK && !IS_EMPTY_STMT (stmt))
7821         stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt);
7822       java_method_add_stmt (mdecl, stmt);
7823     }
7824
7825   end_artificial_method_body (mdecl);
7826
7827   /* Now we want to place <clinit> as the last method (because we need
7828      it at least for interface so that it doesn't interfere with the
7829      dispatch table based lookup. */
7830   if (TREE_CHAIN (TYPE_METHODS (class_type)))
7831     {
7832       current = TREE_CHAIN (TYPE_METHODS (class_type));
7833       TYPE_METHODS (class_type) = current;
7834
7835       while (TREE_CHAIN (current))
7836         current = TREE_CHAIN (current);
7837
7838       TREE_CHAIN (current) = mdecl;
7839       TREE_CHAIN (mdecl) = NULL_TREE;
7840     }
7841
7842   return mdecl;
7843 }
7844
7845 /* Analyzes a method body and look for something that isn't a
7846    MODIFY_EXPR with a constant value.  */
7847
7848 static int
7849 analyze_clinit_body (tree this_class, tree bbody)
7850 {
7851   while (bbody)
7852     switch (TREE_CODE (bbody))
7853       {
7854       case BLOCK:
7855         bbody = BLOCK_EXPR_BODY (bbody);
7856         break;
7857
7858       case EXPR_WITH_FILE_LOCATION:
7859         bbody = EXPR_WFL_NODE (bbody);
7860         break;
7861
7862       case COMPOUND_EXPR:
7863         if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0)))
7864           return 1;
7865         bbody = TREE_OPERAND (bbody, 1);
7866         break;
7867
7868       case MODIFY_EXPR:
7869         /* If we're generating to class file and we're dealing with an
7870            array initialization, we return 1 to keep <clinit> */
7871         if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT
7872             && flag_emit_class_files)
7873           return 1;
7874
7875         /* There are a few cases where we're required to keep
7876            <clinit>:
7877            - If this is an assignment whose operand is not constant,
7878            - If this is an assignment to a non-initialized field,
7879            - If this field is not a member of the current class.
7880         */
7881         return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1))
7882                 || ! DECL_INITIAL (TREE_OPERAND (bbody, 0))
7883                 || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class);
7884
7885       default:
7886         return 1;
7887       }
7888   return 0;
7889 }
7890
7891
7892 /* See whether we could get rid of <clinit>. Criteria are: all static
7893    final fields have constant initial values and the body of <clinit>
7894    is empty. Return 1 if <clinit> was discarded, 0 otherwise. */
7895
7896 static int
7897 maybe_yank_clinit (tree mdecl)
7898 {
7899   tree type, current;
7900   tree fbody, bbody;
7901
7902   if (!DECL_CLINIT_P (mdecl))
7903     return 0;
7904
7905   /* If the body isn't empty, then we keep <clinit>. Note that if
7906      we're emitting classfiles, this isn't enough not to rule it
7907      out. */
7908   fbody = DECL_FUNCTION_BODY (mdecl);
7909   bbody = BLOCK_EXPR_BODY (fbody);
7910   if (bbody && bbody != error_mark_node)
7911     bbody = BLOCK_EXPR_BODY (bbody);
7912   else
7913     return 0;
7914   if (bbody && ! flag_emit_class_files && !IS_EMPTY_STMT (bbody))
7915     return 0;
7916
7917   type = DECL_CONTEXT (mdecl);
7918   current = TYPE_FIELDS (type);
7919
7920   for (current = (current ? TREE_CHAIN (current) : current);
7921        current; current = TREE_CHAIN (current))
7922     {
7923       tree f_init;
7924
7925       /* We're not interested in non-static fields.  */
7926       if (!FIELD_STATIC (current))
7927         continue;
7928
7929       /* Nor in fields without initializers. */
7930       f_init = DECL_INITIAL (current);
7931       if (f_init == NULL_TREE)
7932         continue;
7933
7934       /* Anything that isn't String or a basic type is ruled out -- or
7935          if we know how to deal with it (when doing things natively) we
7936          should generated an empty <clinit> so that SUID are computed
7937          correctly. */
7938       if (! JSTRING_TYPE_P (TREE_TYPE (current))
7939           && ! JNUMERIC_TYPE_P (TREE_TYPE (current)))
7940         return 0;
7941
7942       if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init))
7943         return 0;
7944     }
7945
7946   /* Now we analyze the method body and look for something that
7947      isn't a MODIFY_EXPR */
7948   if (!IS_EMPTY_STMT (bbody) && analyze_clinit_body (type, bbody))
7949     return 0;
7950
7951   /* Get rid of <clinit> in the class' list of methods */
7952   if (TYPE_METHODS (type) == mdecl)
7953     TYPE_METHODS (type) = TREE_CHAIN (mdecl);
7954   else
7955     for (current = TYPE_METHODS (type); current;
7956          current = TREE_CHAIN (current))
7957       if (TREE_CHAIN (current) == mdecl)
7958         {
7959           TREE_CHAIN (current) = TREE_CHAIN (mdecl);
7960           break;
7961         }
7962
7963   return 1;
7964 }
7965
7966 /* Install the argument from MDECL. Suitable to completion and
7967    expansion of mdecl's body.  */
7968
7969 void
7970 start_complete_expand_method (tree mdecl)
7971 {
7972   tree tem;
7973
7974   pushlevel (1);                /* Prepare for a parameter push */
7975   tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7976   DECL_ARGUMENTS (mdecl) = tem;
7977
7978   for (; tem; tem = TREE_CHAIN (tem))
7979     {
7980       /* TREE_CHAIN (tem) will change after pushdecl. */
7981       tree next = TREE_CHAIN (tem);
7982       tree type = TREE_TYPE (tem);
7983       if (targetm.calls.promote_prototypes (type)
7984           && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
7985           && INTEGRAL_TYPE_P (type))
7986         type = integer_type_node;
7987       DECL_ARG_TYPE (tem) = type;
7988       layout_decl (tem, 0);
7989       pushdecl (tem);
7990       /* Re-install the next so that the list is kept and the loop
7991          advances. */
7992       TREE_CHAIN (tem) = next;
7993     }
7994   pushdecl_force_head (DECL_ARGUMENTS (mdecl));
7995   input_line = DECL_SOURCE_LINE (mdecl);
7996   build_result_decl (mdecl);
7997 }
7998
7999
8000 /* Complete and expand a method.  */
8001
8002 static void
8003 java_complete_expand_method (tree mdecl)
8004 {
8005   tree fbody, block_body, exception_copy;
8006
8007   current_function_decl = mdecl;
8008   /* Fix constructors before expanding them */
8009   if (DECL_CONSTRUCTOR_P (mdecl))
8010     fix_constructors (mdecl);
8011
8012   /* Expand functions that have a body */
8013   if (!DECL_FUNCTION_BODY (mdecl))
8014     return;
8015
8016   fbody = DECL_FUNCTION_BODY (mdecl);
8017   block_body = BLOCK_EXPR_BODY (fbody);
8018   exception_copy = NULL_TREE;
8019
8020   current_function_decl = mdecl;
8021
8022   if (! quiet_flag)
8023     fprintf (stderr, " [%s.",
8024              lang_printable_name (DECL_CONTEXT (mdecl), 0));
8025   announce_function (mdecl);
8026   if (! quiet_flag)
8027     fprintf (stderr, "]");
8028
8029   /* Prepare the function for tree completion */
8030   start_complete_expand_method (mdecl);
8031
8032   /* Install the current this */
8033   current_this = (!METHOD_STATIC (mdecl) ?
8034                   BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
8035
8036   /* Purge the `throws' list of unchecked exceptions (we save a copy
8037      of the list and re-install it later.) */
8038   exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl));
8039   purge_unchecked_exceptions (mdecl);
8040
8041   /* Install exceptions thrown with `throws' */
8042   PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
8043
8044   if (block_body != NULL_TREE)
8045     {
8046       block_body = java_complete_tree (block_body);
8047
8048       /* Before we check initialization, attached all class initialization
8049          variable to the block_body */
8050       htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (mdecl),
8051                      attach_init_test_initialization_flags, block_body);
8052
8053       if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
8054         {
8055           check_for_initialization (block_body, mdecl);
8056
8057           /* Go through all the flags marking the initialization of
8058              static variables and see whether they're definitively
8059              assigned, in which case the type is remembered as
8060              definitively initialized in MDECL. */
8061           if (STATIC_CLASS_INIT_OPT_P ())
8062             {
8063               /* Always register the context as properly initialized in
8064                  MDECL. This used with caution helps removing extra
8065                  initialization of self. */
8066               if (METHOD_STATIC (mdecl))
8067                 {
8068                   *(htab_find_slot
8069                     (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl),
8070                      DECL_CONTEXT (mdecl), INSERT)) = DECL_CONTEXT (mdecl);
8071                 }
8072             }
8073         }
8074       ctxp->explicit_constructor_p = 0;
8075     }
8076
8077   BLOCK_EXPR_BODY (fbody) = block_body;
8078
8079   /* If we saw a return but couldn't evaluate it properly, we'll have
8080      an error_mark_node here. */
8081   if (block_body != error_mark_node
8082       && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
8083       && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE
8084       && !flag_emit_xref)
8085     missing_return_error (current_function_decl);
8086
8087   /* See if we can get rid of <clinit> if MDECL happens to be <clinit> */
8088   maybe_yank_clinit (mdecl);
8089
8090   /* Pop the current level, with special measures if we found errors. */
8091   if (java_error_count)
8092     pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8093   poplevel (1, 0, 1);
8094
8095   /* Pop the exceptions and sanity check */
8096   POP_EXCEPTIONS();
8097   if (currently_caught_type_list)
8098     abort ();
8099
8100   /* Restore the copy of the list of exceptions if emitting xrefs. */
8101   DECL_FUNCTION_THROWS (mdecl) = exception_copy;
8102 }
8103
8104 /* For with each class for which there's code to generate. */
8105
8106 static void
8107 java_expand_method_bodies (tree class)
8108 {
8109   tree decl;
8110   for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl))
8111     {
8112       tree block;
8113
8114       if (! DECL_FUNCTION_BODY (decl))
8115         continue;
8116
8117       current_function_decl = decl;
8118
8119       block = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
8120
8121       /* Save the function body for gimplify and inlining.  */
8122       DECL_SAVED_TREE (decl) = block;
8123
8124       /* It's time to assign the variable flagging static class
8125          initialization based on which classes invoked static methods
8126          are definitely initializing. This should be flagged. */
8127       if (STATIC_CLASS_INIT_OPT_P ())
8128         {
8129           tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl);
8130           for (; list != NULL_TREE;  list = TREE_CHAIN (list))
8131             {
8132               /* Executed for each statement calling a static function.
8133                  LIST is a TREE_LIST whose PURPOSE is the called function
8134                  and VALUE is a compound whose second operand can be patched
8135                  with static class initialization flag assignments.  */
8136
8137               tree called_method = TREE_PURPOSE (list);
8138               tree compound = TREE_VALUE (list);
8139               tree assignment_compound_list
8140                 = build_tree_list (called_method, NULL);
8141
8142               /* For each class definitely initialized in
8143                  CALLED_METHOD, fill ASSIGNMENT_COMPOUND with
8144                  assignment to the class initialization flag. */
8145               htab_traverse (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method),
8146                              emit_test_initialization,
8147                              assignment_compound_list);
8148
8149               if (TREE_VALUE (assignment_compound_list))
8150                 TREE_OPERAND (compound, 1)
8151                   = TREE_VALUE (assignment_compound_list);
8152             }
8153         }
8154
8155       /* Expand the function body.  */
8156       source_end_java_method ();
8157     }
8158 }
8159
8160 \f
8161
8162 /* This section of the code deals with accessing enclosing context
8163    fields either directly by using the relevant access to this$<n> or
8164    by invoking an access method crafted for that purpose.  */
8165
8166 /* Build the necessary access from an inner class to an outer
8167    class. This routine could be optimized to cache previous result
8168    (decl, current_class and returned access).  When an access method
8169    needs to be generated, it always takes the form of a read. It might
8170    be later turned into a write by calling outer_field_access_fix.  */
8171
8172 static tree
8173 build_outer_field_access (tree id, tree decl)
8174 {
8175   tree access = NULL_TREE;
8176   tree ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
8177   tree decl_ctx = DECL_CONTEXT (decl);
8178
8179   /* If the immediate enclosing context of the current class is the
8180      field decl's class or inherits from it; build the access as
8181      `this$<n>.<field>'. Note that we will break the `private' barrier
8182      if we're not emitting bytecodes. */
8183   if ((ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
8184       && (!FIELD_PRIVATE (decl) || !flag_emit_class_files ))
8185     {
8186       tree thisn = build_current_thisn (current_class);
8187       access = make_qualified_primary (build_wfl_node (thisn),
8188                                        id, EXPR_WFL_LINECOL (id));
8189     }
8190   /* Otherwise, generate access methods to outer this and access the
8191      field (either using an access method or by direct access.) */
8192   else
8193     {
8194       int lc = EXPR_WFL_LINECOL (id);
8195
8196       /* Now we chain the required number of calls to the access$0 to
8197          get a hold to the enclosing instance we need, and then we
8198          build the field access. */
8199       access = build_access_to_thisn (current_class, decl_ctx, lc);
8200
8201       /* If the field is private and we're generating bytecode, then
8202          we generate an access method */
8203       if (FIELD_PRIVATE (decl) && flag_emit_class_files )
8204         {
8205           tree name = build_outer_field_access_methods (decl);
8206           access = build_outer_field_access_expr (lc, decl_ctx,
8207                                                   name, access, NULL_TREE);
8208         }
8209       /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'.
8210          Once again we break the `private' access rule from a foreign
8211          class. */
8212       else
8213         access = make_qualified_primary (access, id, lc);
8214     }
8215   return resolve_expression_name (access, NULL);
8216 }
8217
8218 /* Return a nonzero value if NODE describes an outer field inner
8219    access.  */
8220
8221 static int
8222 outer_field_access_p (tree type, tree decl)
8223 {
8224   if (!INNER_CLASS_TYPE_P (type)
8225       || TREE_CODE (decl) != FIELD_DECL
8226       || DECL_CONTEXT (decl) == type)
8227     return 0;
8228
8229   /* If the inner class extends the declaration context of the field
8230      we're trying to access, then this isn't an outer field access */
8231   if (inherits_from_p (type, DECL_CONTEXT (decl)))
8232     return 0;
8233
8234   for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ;
8235        type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))))
8236     {
8237       if (type == DECL_CONTEXT (decl))
8238         return 1;
8239
8240       if (!DECL_CONTEXT (TYPE_NAME (type)))
8241         {
8242           /* Before we give up, see whether the field is inherited from
8243              the enclosing context we're considering. */
8244           if (inherits_from_p (type, DECL_CONTEXT (decl)))
8245             return 1;
8246           break;
8247         }
8248     }
8249
8250   return 0;
8251 }
8252
8253 /* Return a nonzero value if NODE represents an outer field inner
8254    access that was been already expanded. As a side effect, it returns
8255    the name of the field being accessed and the argument passed to the
8256    access function, suitable for a regeneration of the access method
8257    call if necessary. */
8258
8259 static int
8260 outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
8261                                tree *arg)
8262 {
8263   int identified = 0;
8264
8265   if (TREE_CODE (node) != CALL_EXPR)
8266     return 0;
8267
8268   /* Well, gcj generates slightly different tree nodes when compiling
8269      to native or bytecodes. It's the case for function calls. */
8270
8271   if (flag_emit_class_files
8272       && TREE_CODE (node) == CALL_EXPR
8273       && OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
8274     identified = 1;
8275   else if (!flag_emit_class_files)
8276     {
8277       node = TREE_OPERAND (node, 0);
8278
8279       if (node && TREE_OPERAND (node, 0)
8280           && TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)
8281         {
8282           node = TREE_OPERAND (node, 0);
8283           if (TREE_OPERAND (node, 0)
8284               && TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
8285               && (OUTER_FIELD_ACCESS_IDENTIFIER_P
8286                   (DECL_NAME (TREE_OPERAND (node, 0)))))
8287             identified = 1;
8288         }
8289     }
8290
8291   if (identified && name && arg_type && arg)
8292     {
8293       tree argument = TREE_OPERAND (node, 1);
8294       *name = DECL_NAME (TREE_OPERAND (node, 0));
8295       *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
8296       *arg = TREE_VALUE (argument);
8297     }
8298   return identified;
8299 }
8300
8301 /* Detect in NODE an outer field read access from an inner class and
8302    transform it into a write with RHS as an argument. This function is
8303    called from the java_complete_lhs when an assignment to a LHS can
8304    be identified. */
8305
8306 static tree
8307 outer_field_access_fix (tree wfl, tree node, tree rhs)
8308 {
8309   tree name, arg_type, arg;
8310
8311   if (outer_field_expanded_access_p (node, &name, &arg_type, &arg))
8312     {
8313       node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl),
8314                                             arg_type, name, arg, rhs);
8315       return java_complete_tree (node);
8316     }
8317   return NULL_TREE;
8318 }
8319
8320 /* Construct the expression that calls an access method:
8321      <type>.access$<n>(<arg1> [, <arg2>]);
8322
8323    ARG2 can be NULL and will be omitted in that case. It will denote a
8324    read access.  */
8325
8326 static tree
8327 build_outer_field_access_expr (int lc, tree type, tree access_method_name,
8328                                tree arg1, tree arg2)
8329 {
8330   tree args, cn, access;
8331
8332   args = arg1 ? arg1 :
8333     build_wfl_node (build_current_thisn (current_class));
8334   args = build_tree_list (NULL_TREE, args);
8335
8336   if (arg2)
8337     args = tree_cons (NULL_TREE, arg2, args);
8338
8339   access = build_method_invocation (build_wfl_node (access_method_name), args);
8340   cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
8341   return make_qualified_primary (cn, access, lc);
8342 }
8343
8344 static tree
8345 build_new_access_id (void)
8346 {
8347   static int access_n_counter = 1;
8348   char buffer [128];
8349
8350   sprintf (buffer, "access$%d", access_n_counter++);
8351   return get_identifier (buffer);
8352 }
8353
8354 /* Create the static access functions for the outer field DECL. We define a
8355    read:
8356      TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
8357        return inst$.field;
8358      }
8359    and a write access:
8360      TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$,
8361                                      TREE_TYPE (<field>) value$) {
8362        return inst$.field = value$;
8363      }
8364    We should have a usage flags on the DECL so we can lazily turn the ones
8365    we're using for code generation. FIXME.
8366 */
8367
8368 static tree
8369 build_outer_field_access_methods (tree decl)
8370 {
8371   tree id, args, stmt, mdecl;
8372
8373   if (FIELD_INNER_ACCESS_P (decl))
8374     return FIELD_INNER_ACCESS (decl);
8375
8376   MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
8377
8378   /* Create the identifier and a function named after it. */
8379   id = build_new_access_id ();
8380
8381   /* The identifier is marked as bearing the name of a generated write
8382      access function for outer field accessed from inner classes. */
8383   OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8384
8385   /* Create the read access */
8386   args = build_tree_list (inst_id, build_pointer_type (DECL_CONTEXT (decl)));
8387   TREE_CHAIN (args) = end_params_node;
8388   stmt = make_qualified_primary (build_wfl_node (inst_id),
8389                                  build_wfl_node (DECL_NAME (decl)), 0);
8390   stmt = build_return (0, stmt);
8391   mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8392                                            TREE_TYPE (decl), id, args, stmt);
8393   DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8394
8395   /* Create the write access method. No write access for final variable */
8396   if (!FIELD_FINAL (decl))
8397     {
8398       args = build_tree_list (inst_id,
8399                               build_pointer_type (DECL_CONTEXT (decl)));
8400       TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
8401       TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
8402       stmt = make_qualified_primary (build_wfl_node (inst_id),
8403                                      build_wfl_node (DECL_NAME (decl)), 0);
8404       stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
8405                                                 build_wfl_node (wpv_id)));
8406       mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8407                                                TREE_TYPE (decl), id,
8408                                                args, stmt);
8409     }
8410   DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8411
8412   /* Return the access name */
8413   return FIELD_INNER_ACCESS (decl) = id;
8414 }
8415
8416 /* Build an field access method NAME.  */
8417
8418 static tree
8419 build_outer_field_access_method (tree class, tree type, tree name,
8420                                  tree args, tree body)
8421 {
8422   tree saved_current_function_decl, mdecl;
8423
8424   /* Create the method */
8425   mdecl = create_artificial_method (class, ACC_STATIC, type, name, args);
8426   fix_method_argument_names (args, mdecl);
8427   layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8428
8429   /* Attach the method body. */
8430   saved_current_function_decl = current_function_decl;
8431   start_artificial_method_body (mdecl);
8432   java_method_add_stmt (mdecl, body);
8433   end_artificial_method_body (mdecl);
8434   current_function_decl = saved_current_function_decl;
8435
8436   return mdecl;
8437 }
8438
8439 \f
8440 /* This section deals with building access function necessary for
8441    certain kinds of method invocation from inner classes.  */
8442
8443 static tree
8444 build_outer_method_access_method (tree decl)
8445 {
8446   tree saved_current_function_decl, mdecl;
8447   tree args = NULL_TREE, call_args = NULL_TREE;
8448   tree carg, id, body, class;
8449   char buffer [80];
8450   int parm_id_count = 0;
8451
8452   /* Test this abort with an access to a private field */
8453   if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "access$"))
8454     abort ();
8455
8456   /* Check the cache first */
8457   if (DECL_FUNCTION_INNER_ACCESS (decl))
8458     return DECL_FUNCTION_INNER_ACCESS (decl);
8459
8460   class = DECL_CONTEXT (decl);
8461
8462   /* Obtain an access identifier and mark it */
8463   id = build_new_access_id ();
8464   OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8465
8466   carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
8467   /* Create the arguments, as much as the original */
8468   for (; carg && carg != end_params_node;
8469        carg = TREE_CHAIN (carg))
8470     {
8471       sprintf (buffer, "write_parm_value$%d", parm_id_count++);
8472       args = chainon (args, build_tree_list (get_identifier (buffer),
8473                                              TREE_VALUE (carg)));
8474     }
8475   args = chainon (args, end_params_node);
8476
8477   /* Create the method */
8478   mdecl = create_artificial_method (class, ACC_STATIC,
8479                                     TREE_TYPE (TREE_TYPE (decl)), id, args);
8480   layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8481   /* There is a potential bug here. We should be able to use
8482      fix_method_argument_names, but then arg names get mixed up and
8483      eventually a constructor will have its this$0 altered and the
8484      outer context won't be assignment properly. The testcase is
8485      stub.java FIXME */
8486   TYPE_ARG_TYPES (TREE_TYPE (mdecl)) = args;
8487
8488   /* Attach the method body. */
8489   saved_current_function_decl = current_function_decl;
8490   start_artificial_method_body (mdecl);
8491
8492   /* The actual method invocation uses the same args. When invoking a
8493      static methods that way, we don't want to skip the first
8494      argument. */
8495   carg = args;
8496   if (!METHOD_STATIC (decl))
8497     carg = TREE_CHAIN (carg);
8498   for (; carg && carg != end_params_node; carg = TREE_CHAIN (carg))
8499     call_args = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (carg)),
8500                            call_args);
8501
8502   body = build_method_invocation (build_wfl_node (DECL_NAME (decl)),
8503                                   call_args);
8504   if (!METHOD_STATIC (decl))
8505     body = make_qualified_primary (build_wfl_node (TREE_PURPOSE (args)),
8506                                    body, 0);
8507   if (TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
8508     body = build_return (0, body);
8509   java_method_add_stmt (mdecl,body);
8510   end_artificial_method_body (mdecl);
8511   current_function_decl = saved_current_function_decl;
8512
8513   /* Back tag the access function so it know what it accesses */
8514   DECL_FUNCTION_ACCESS_DECL (decl) = mdecl;
8515
8516   /* Tag the current method so it knows it has an access generated */
8517   return DECL_FUNCTION_INNER_ACCESS (decl) = mdecl;
8518 }
8519
8520 \f
8521 /* This section of the code deals with building expressions to access
8522    the enclosing instance of an inner class. The enclosing instance is
8523    kept in a generated field called this$<n>, with <n> being the
8524    inner class nesting level (starting from 0.)  */
8525
8526 /* Build an access to a given this$<n>, always chaining access call to
8527    others. Access methods to this$<n> are build on the fly if
8528    necessary. This CAN'T be used to solely access this$<n-1> from
8529    this$<n> (which alway yield to special cases and optimization, see
8530    for example build_outer_field_access).  */
8531
8532 static tree
8533 build_access_to_thisn (tree from, tree to, int lc)
8534 {
8535   tree access = NULL_TREE;
8536
8537   while (from != to && PURE_INNER_CLASS_TYPE_P (from))
8538     {
8539       if (!access)
8540         {
8541           access = build_current_thisn (from);
8542           access = build_wfl_node (access);
8543         }
8544       else
8545         {
8546           tree access0_wfl, cn;
8547
8548           maybe_build_thisn_access_method (from);
8549           access0_wfl = build_wfl_node (access0_identifier_node);
8550           cn = build_wfl_node (DECL_NAME (TYPE_NAME (from)));
8551           EXPR_WFL_LINECOL (access0_wfl) = lc;
8552           access = build_tree_list (NULL_TREE, access);
8553           access = build_method_invocation (access0_wfl, access);
8554           access = make_qualified_primary (cn, access, lc);
8555         }
8556
8557       /* If FROM isn't an inner class, that's fine, we've done enough.
8558          What we're looking for can be accessed from there.  */
8559       from = DECL_CONTEXT (TYPE_NAME (from));
8560       if (!from)
8561         break;
8562       from = TREE_TYPE (from);
8563     }
8564   return access;
8565 }
8566
8567 /* Build an access function to the this$<n> local to TYPE. NULL_TREE
8568    is returned if nothing needs to be generated. Otherwise, the method
8569    generated and a method decl is returned.
8570
8571    NOTE: These generated methods should be declared in a class file
8572    attribute so that they can't be referred to directly.  */
8573
8574 static tree
8575 maybe_build_thisn_access_method (tree type)
8576 {
8577   tree mdecl, args, stmt, rtype;
8578   tree saved_current_function_decl;
8579
8580   /* If TYPE is a top-level class, no access method is required.
8581      If there already is such an access method, bail out. */
8582   if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type))
8583     return NULL_TREE;
8584
8585   /* We generate the method. The method looks like:
8586      static <outer_of_type> access$0 (<type> inst$) { return inst$.this$<n>; }
8587   */
8588   args = build_tree_list (inst_id, build_pointer_type (type));
8589   TREE_CHAIN (args) = end_params_node;
8590   rtype = build_pointer_type (TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))));
8591   mdecl = create_artificial_method (type, ACC_STATIC, rtype,
8592                                     access0_identifier_node, args);
8593   fix_method_argument_names (args, mdecl);
8594   layout_class_method (type, NULL_TREE, mdecl, NULL_TREE);
8595   stmt = build_current_thisn (type);
8596   stmt = make_qualified_primary (build_wfl_node (inst_id),
8597                                  build_wfl_node (stmt), 0);
8598   stmt = build_return (0, stmt);
8599
8600   saved_current_function_decl = current_function_decl;
8601   start_artificial_method_body (mdecl);
8602   java_method_add_stmt (mdecl, stmt);
8603   end_artificial_method_body (mdecl);
8604   current_function_decl = saved_current_function_decl;
8605
8606   CLASS_ACCESS0_GENERATED_P (type) = 1;
8607
8608   return mdecl;
8609 }
8610
8611 /* Craft an correctly numbered `this$<n>'string. this$0 is used for
8612    the first level of innerclassing. this$1 for the next one, etc...
8613    This function can be invoked with TYPE to NULL, available and then
8614    has to count the parser context.  */
8615
8616 static GTY(()) tree saved_thisn;
8617 static GTY(()) tree saved_type;
8618
8619 static tree
8620 build_current_thisn (tree type)
8621 {
8622   static int saved_i = -1;
8623   static int saved_type_i = 0;
8624   tree decl;
8625   char buffer [24];
8626   int i = 0;
8627
8628   if (type)
8629     {
8630       if (type == saved_type)
8631         i = saved_type_i;
8632       else
8633         {
8634           for (i = -1, decl = DECL_CONTEXT (TYPE_NAME (type));
8635                decl; decl = DECL_CONTEXT (decl), i++)
8636             ;
8637
8638           saved_type = type;
8639           saved_type_i = i;
8640         }
8641     }
8642   else
8643     i = list_length (GET_CPC_LIST ())-2;
8644
8645   if (i == saved_i)
8646     return saved_thisn;
8647
8648   sprintf (buffer, "this$%d", i);
8649   saved_i = i;
8650   saved_thisn = get_identifier (buffer);
8651   return saved_thisn;
8652 }
8653
8654 /* Return the assignment to the hidden enclosing context `this$<n>'
8655    by the second incoming parameter to the innerclass constructor. The
8656    form used is `this.this$<n> = this$<n>;'.  */
8657
8658 static tree
8659 build_thisn_assign (void)
8660 {
8661   if (current_class && PURE_INNER_CLASS_TYPE_P (current_class))
8662     {
8663       tree thisn = build_current_thisn (current_class);
8664       tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
8665                                          build_wfl_node (thisn), 0);
8666       tree rhs = build_wfl_node (thisn);
8667       EXPR_WFL_SET_LINECOL (lhs, input_line, 0);
8668       return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
8669     }
8670   return NULL_TREE;
8671 }
8672
8673 \f
8674 /* Building the synthetic `class$' used to implement the `.class' 1.1
8675    extension for non primitive types. This method looks like:
8676
8677     static Class class$(String type) throws NoClassDefFoundError
8678     {
8679       try {return (java.lang.Class.forName (String));}
8680       catch (ClassNotFoundException e) {
8681         throw new NoClassDefFoundError(e.getMessage());}
8682     } */
8683
8684 static GTY(()) tree get_message_wfl;
8685 static GTY(()) tree type_parm_wfl;
8686
8687 static tree
8688 build_dot_class_method (tree class)
8689 {
8690 #define BWF(S) build_wfl_node (get_identifier ((S)))
8691 #define MQN(X,Y) make_qualified_name ((X), (Y), 0)
8692   tree args, tmp, saved_current_function_decl, mdecl, qual_name;
8693   tree stmt, throw_stmt;
8694
8695   if (!get_message_wfl)
8696     {
8697       get_message_wfl = build_wfl_node (get_identifier ("getMessage"));
8698       type_parm_wfl = build_wfl_node (get_identifier ("type$"));
8699     }
8700
8701   /* Build the arguments */
8702   args = build_tree_list (get_identifier ("type$"),
8703                           build_pointer_type (string_type_node));
8704   TREE_CHAIN (args) = end_params_node;
8705
8706   /* Build the qualified name java.lang.Class.forName */
8707   tmp = MQN (MQN (MQN (BWF ("java"),
8708                        BWF ("lang")), BWF ("Class")), BWF ("forName"));
8709
8710   /* Create the "class$" function */
8711   mdecl = create_artificial_method (class, ACC_STATIC,
8712                                     build_pointer_type (class_type_node),
8713                                     classdollar_identifier_node, args);
8714   qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8715                    BWF ("NoClassDefFoundError"));
8716   DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, qual_name);
8717   register_incomplete_type (JDEP_EXCEPTION, qual_name, NULL_TREE, NULL_TREE);
8718   JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
8719     &TREE_VALUE (DECL_FUNCTION_THROWS (mdecl));
8720
8721   /* We start by building the try block. We need to build:
8722        return (java.lang.Class.forName (type)); */
8723   stmt = build_method_invocation (tmp,
8724                                   build_tree_list (NULL_TREE, type_parm_wfl));
8725   stmt = build_return (0, stmt);
8726
8727   /* Now onto the catch block. We start by building the expression
8728      throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
8729   throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
8730                                     get_message_wfl, 0);
8731   throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
8732
8733   /* Build new NoClassDefFoundError (_.getMessage) */
8734   throw_stmt = build_new_invocation
8735     (build_wfl_node (get_identifier ("NoClassDefFoundError")),
8736      build_tree_list (build_pointer_type (string_type_node), throw_stmt));
8737
8738   /* Build the throw, (it's too early to use BUILD_THROW) */
8739   throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt);
8740
8741   /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */
8742   qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8743                    BWF ("ClassNotFoundException"));
8744   stmt = encapsulate_with_try_catch (0, qual_name, stmt, throw_stmt);
8745
8746   fix_method_argument_names (args, mdecl);
8747   layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8748   saved_current_function_decl = current_function_decl;
8749   start_artificial_method_body (mdecl);
8750   java_method_add_stmt (mdecl, stmt);
8751   end_artificial_method_body (mdecl);
8752   current_function_decl = saved_current_function_decl;
8753   TYPE_DOT_CLASS (class) = mdecl;
8754
8755   return mdecl;
8756 }
8757
8758 static tree
8759 build_dot_class_method_invocation (tree this_class, tree type)
8760 {
8761   tree dot_class_method = TYPE_DOT_CLASS (this_class);
8762   tree sig_id, s, t;
8763
8764   if (TYPE_ARRAY_P (type))
8765     sig_id = build_java_signature (type);
8766   else
8767     sig_id = DECL_NAME (TYPE_NAME (type));
8768
8769   /* Ensure that the proper name separator is used */
8770   sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id),
8771                                IDENTIFIER_LENGTH (sig_id));
8772
8773   s = build_string (IDENTIFIER_LENGTH (sig_id),
8774                     IDENTIFIER_POINTER (sig_id));
8775   t = build_method_invocation (build_wfl_node (DECL_NAME (dot_class_method)),
8776                                build_tree_list (NULL_TREE, s));
8777   if (DECL_CONTEXT (dot_class_method) != this_class)
8778     {
8779       tree class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (dot_class_method)));
8780       t = make_qualified_primary (build_wfl_node (class_name), t, 0);
8781     }
8782   return t;
8783 }
8784
8785 /* This section of the code deals with constructor.  */
8786
8787 /* Craft a body for default constructor. Patch existing constructor
8788    bodies with call to super() and field initialization statements if
8789    necessary.  */
8790
8791 static void
8792 fix_constructors (tree mdecl)
8793 {
8794   tree iii;                     /* Instance Initializer Invocation */
8795   tree body = DECL_FUNCTION_BODY (mdecl);
8796   tree thisn_assign, compound = NULL_TREE;
8797   tree class_type = DECL_CONTEXT (mdecl);
8798
8799   if (DECL_FIXED_CONSTRUCTOR_P (mdecl))
8800     return;
8801   DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
8802
8803   if (!body)
8804     {
8805       /* It is an error for the compiler to generate a default
8806          constructor if the superclass doesn't have a constructor that
8807          takes no argument, or the same args for an anonymous class */
8808       if (verify_constructor_super (mdecl))
8809         {
8810           tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (class_type));
8811           tree save = DECL_NAME (mdecl);
8812           const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
8813           DECL_NAME (mdecl) = DECL_NAME (sclass_decl);
8814           parse_error_context
8815             (lookup_cl (TYPE_NAME (class_type)),
8816              "No constructor matching `%s' found in class `%s'",
8817              lang_printable_name (mdecl, 0), n);
8818           DECL_NAME (mdecl) = save;
8819         }
8820
8821       /* The constructor body must be crafted by hand. It's the
8822          constructor we defined when we realize we didn't have the
8823          CLASSNAME() constructor */
8824       start_artificial_method_body (mdecl);
8825
8826       /* Insert an assignment to the this$<n> hidden field, if
8827          necessary */
8828       if ((thisn_assign = build_thisn_assign ()))
8829         java_method_add_stmt (mdecl, thisn_assign);
8830
8831       /* We don't generate a super constructor invocation if we're
8832          compiling java.lang.Object. build_super_invocation takes care
8833          of that. */
8834       java_method_add_stmt (mdecl, build_super_invocation (mdecl));
8835
8836       /* FIXME */
8837       if ((iii = build_instinit_invocation (class_type)))
8838         java_method_add_stmt (mdecl, iii);
8839
8840       end_artificial_method_body (mdecl);
8841     }
8842   /* Search for an explicit constructor invocation */
8843   else
8844     {
8845       int found = 0;
8846       int invokes_this = 0;
8847       tree found_call = NULL_TREE;
8848       tree main_block = BLOCK_EXPR_BODY (body);
8849
8850       while (body)
8851         switch (TREE_CODE (body))
8852           {
8853           case CALL_EXPR:
8854             found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
8855             if (CALL_THIS_CONSTRUCTOR_P (body))
8856               invokes_this = 1;
8857             body = NULL_TREE;
8858             break;
8859           case COMPOUND_EXPR:
8860           case EXPR_WITH_FILE_LOCATION:
8861             found_call = body;
8862             body = TREE_OPERAND (body, 0);
8863             break;
8864           case BLOCK:
8865             found_call = body;
8866             body = BLOCK_EXPR_BODY (body);
8867             break;
8868           default:
8869             found = 0;
8870             body = NULL_TREE;
8871           }
8872
8873       /* Generate the assignment to this$<n>, if necessary */
8874       if ((thisn_assign = build_thisn_assign ()))
8875         compound = add_stmt_to_compound (compound, NULL_TREE, thisn_assign);
8876
8877       /* The constructor is missing an invocation of super() */
8878       if (!found)
8879         compound = add_stmt_to_compound (compound, NULL_TREE,
8880                                          build_super_invocation (mdecl));
8881       /* Explicit super() invocation should take place before the
8882          instance initializer blocks. */
8883       else
8884         {
8885           compound = add_stmt_to_compound (compound, NULL_TREE,
8886                                            TREE_OPERAND (found_call, 0));
8887           TREE_OPERAND (found_call, 0) = build_java_empty_stmt ();
8888         }
8889
8890       DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
8891
8892       /* Insert the instance initializer block right after. */
8893       if (!invokes_this && (iii = build_instinit_invocation (class_type)))
8894         compound = add_stmt_to_compound (compound, NULL_TREE, iii);
8895
8896       /* Fix the constructor main block if we're adding extra stmts */
8897       if (compound)
8898         {
8899           compound = add_stmt_to_compound (compound, NULL_TREE,
8900                                            BLOCK_EXPR_BODY (main_block));
8901           BLOCK_EXPR_BODY (main_block) = compound;
8902         }
8903     }
8904 }
8905
8906 /* Browse constructors in the super class, searching for a constructor
8907    that doesn't take any argument. Return 0 if one is found, 1
8908    otherwise.  If the current class is an anonymous inner class, look
8909    for something that has the same signature. */
8910
8911 static int
8912 verify_constructor_super (tree mdecl)
8913 {
8914   tree class = CLASSTYPE_SUPER (current_class);
8915   int super_inner = PURE_INNER_CLASS_TYPE_P (class);
8916   tree sdecl;
8917
8918   if (!class)
8919     return 0;
8920
8921   if (ANONYMOUS_CLASS_P (current_class))
8922     {
8923       tree mdecl_arg_type;
8924       SKIP_THIS_AND_ARTIFICIAL_PARMS (mdecl_arg_type, mdecl);
8925       for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
8926         if (DECL_CONSTRUCTOR_P (sdecl))
8927           {
8928             tree m_arg_type;
8929             tree arg_type = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
8930             if (super_inner)
8931               arg_type = TREE_CHAIN (arg_type);
8932             for (m_arg_type = mdecl_arg_type;
8933                  (arg_type != end_params_node
8934                   && m_arg_type != end_params_node);
8935                  arg_type = TREE_CHAIN (arg_type),
8936                    m_arg_type = TREE_CHAIN (m_arg_type))
8937               if (!valid_method_invocation_conversion_p
8938                      (TREE_VALUE (arg_type),
8939                       TREE_VALUE (m_arg_type)))
8940                 break;
8941
8942             if (arg_type == end_params_node && m_arg_type == end_params_node)
8943               return 0;
8944           }
8945     }
8946   else
8947     {
8948       for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
8949         {
8950           tree arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
8951           if (super_inner)
8952             arg = TREE_CHAIN (arg);
8953           if (DECL_CONSTRUCTOR_P (sdecl) && arg == end_params_node)
8954             return 0;
8955         }
8956     }
8957   return 1;
8958 }
8959
8960 /* Generate code for all context remembered for code generation.  */
8961
8962 static GTY(()) tree reversed_class_list;
8963 void
8964 java_expand_classes (void)
8965 {
8966   int save_error_count = 0;
8967   static struct parser_ctxt *cur_ctxp = NULL;
8968
8969   java_parse_abort_on_error ();
8970   if (!(ctxp = ctxp_for_generation))
8971     return;
8972   java_layout_classes ();
8973   java_parse_abort_on_error ();
8974
8975   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
8976     {
8977       tree current;
8978       for (current = cur_ctxp->class_list; 
8979            current; 
8980            current = TREE_CHAIN (current))
8981         gen_indirect_dispatch_tables (TREE_TYPE (current));
8982     }
8983   
8984   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
8985     {
8986       ctxp = cur_ctxp;
8987       input_filename = ctxp->filename;
8988       lang_init_source (2);            /* Error msgs have method prototypes */
8989       java_complete_expand_classes (); /* Complete and expand classes */
8990       java_parse_abort_on_error ();
8991     }
8992   input_filename = main_input_filename;
8993
8994   /* Find anonymous classes and expand their constructor. This extra pass is
8995      necessary because the constructor itself is only generated when the
8996      method in which it is defined is expanded. */
8997   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
8998     {
8999       tree current;
9000       ctxp = cur_ctxp;
9001       for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9002         {
9003           output_class = current_class = TREE_TYPE (current);
9004           if (ANONYMOUS_CLASS_P (current_class))
9005             {
9006               tree d;
9007               for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9008                 {
9009                   if (DECL_CONSTRUCTOR_P (d))
9010                     {
9011                       java_complete_expand_method (d);
9012                       break;    /* There is only one constructor. */
9013                     }
9014                 }
9015             }
9016         }
9017     }
9018
9019   /* Expanding the constructors of anonymous classes generates access
9020      methods.  Scan all the methods looking for null DECL_RESULTs --
9021      this will be the case if a method hasn't been expanded.  */
9022   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9023     {
9024       tree current;
9025       ctxp = cur_ctxp;
9026       for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9027         {
9028           tree d;
9029           output_class = current_class = TREE_TYPE (current);
9030           for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9031             {
9032               if (DECL_RESULT (d) == NULL_TREE)
9033                 java_complete_expand_method (d);
9034             }
9035         }
9036     }
9037
9038   /* ???  Instead of all this we could iterate around the list of
9039      classes until there were no more un-expanded methods.  It would
9040      take a little longer -- one pass over the whole list of methods
9041      -- but it would be simpler.  Like this:  */
9042 #if 0
9043     {
9044       int something_changed;
9045     
9046       do
9047         {
9048           something_changed = 0;
9049           for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9050             {
9051               tree current;
9052               ctxp = cur_ctxp;
9053               for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9054                 {
9055                   tree d;
9056                   output_class = current_class = TREE_TYPE (current);
9057                   for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9058                     {
9059                       if (DECL_RESULT (d) == NULL_TREE)
9060                         {
9061                           something_changed = 1;
9062                           java_complete_expand_method (d);
9063                         }
9064                     }
9065                 }
9066             }
9067         }
9068       while (something_changed);
9069     }
9070 #endif
9071
9072   /* If we've found error at that stage, don't try to generate
9073      anything, unless we're emitting xrefs or checking the syntax only
9074      (but not using -fsyntax-only for the purpose of generating
9075      bytecode. */
9076   if (java_error_count && !flag_emit_xref
9077       && (!flag_syntax_only && !flag_emit_class_files))
9078     return;
9079
9080   /* Now things are stable, go for generation of the class data. */
9081
9082   /* We pessimistically marked all methods and fields external until
9083      we knew what set of classes we were planning to compile.  Now mark
9084      those that will be generated locally as not external.  */
9085   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9086     {
9087       tree current;
9088       ctxp = cur_ctxp;
9089       for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9090         java_mark_class_local (TREE_TYPE (current));
9091     }
9092
9093   /* Compile the classes.  */
9094   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9095     {
9096       tree current;
9097       reversed_class_list = NULL;
9098
9099       ctxp = cur_ctxp;
9100
9101       /* We write out the classes in reverse order.  This ensures that
9102          inner classes are written before their containing classes,
9103          which is important for parallel builds.  Otherwise, the
9104          class file for the outer class may be found, but the class
9105          file for the inner class may not be present.  In that
9106          situation, the compiler cannot fall back to the original
9107          source, having already read the outer class, so we must
9108          prevent that situation.  */
9109       for (current = ctxp->class_list;
9110            current;
9111            current = TREE_CHAIN (current))
9112         reversed_class_list
9113           = tree_cons (NULL_TREE, current, reversed_class_list);
9114
9115       for (current = reversed_class_list;
9116            current;
9117            current = TREE_CHAIN (current))
9118         {
9119           output_class = current_class = TREE_TYPE (TREE_VALUE (current));
9120           if (flag_emit_class_files)
9121             write_classfile (current_class);
9122           if (flag_emit_xref)
9123             expand_xref (current_class);
9124           else if (! flag_syntax_only)
9125             java_expand_method_bodies (current_class);
9126         }
9127     }
9128 }
9129
9130 void
9131 java_finish_classes (void)
9132 {
9133   static struct parser_ctxt *cur_ctxp = NULL;
9134   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9135     {
9136       tree current;
9137       ctxp = cur_ctxp;
9138       for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9139         {
9140           output_class = current_class = TREE_TYPE (current);
9141           finish_class ();
9142         }
9143     }
9144 }
9145
9146 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
9147    a tree list node containing RIGHT. Fore coming RIGHTs will be
9148    chained to this hook. LOCATION contains the location of the
9149    separating `.' operator.  */
9150
9151 static tree
9152 make_qualified_primary (tree primary, tree right, int location)
9153 {
9154   tree wfl;
9155
9156   if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
9157     wfl = build_wfl_wrap (primary, location);
9158   else
9159     {
9160       wfl = primary;
9161       /* If wfl wasn't qualified, we build a first anchor */
9162       if (!EXPR_WFL_QUALIFICATION (wfl))
9163         EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (wfl, NULL_TREE);
9164     }
9165
9166   /* And chain them */
9167   EXPR_WFL_LINECOL (right) = location;
9168   chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
9169   PRIMARY_P (wfl) =  1;
9170   return wfl;
9171 }
9172
9173 /* Simple merge of two name separated by a `.' */
9174
9175 static tree
9176 merge_qualified_name (tree left, tree right)
9177 {
9178   tree node;
9179   if (!left && !right)
9180     return NULL_TREE;
9181
9182   if (!left)
9183     return right;
9184
9185   if (!right)
9186     return left;
9187
9188   obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
9189                 IDENTIFIER_LENGTH (left));
9190   obstack_1grow (&temporary_obstack, '.');
9191   obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
9192                  IDENTIFIER_LENGTH (right));
9193   node =  get_identifier (obstack_base (&temporary_obstack));
9194   obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
9195   QUALIFIED_P (node) = 1;
9196   return node;
9197 }
9198
9199 /* Merge the two parts of a qualified name into LEFT.  Set the
9200    location information of the resulting node to LOCATION, usually
9201    inherited from the location information of the `.' operator. */
9202
9203 static tree
9204 make_qualified_name (tree left, tree right, int location)
9205 {
9206 #ifdef USE_COMPONENT_REF
9207   tree node = build (COMPONENT_REF, NULL_TREE, left, right, NULL_TREE);
9208   EXPR_WFL_LINECOL (node) = location;
9209   return node;
9210 #else
9211   tree left_id = EXPR_WFL_NODE (left);
9212   tree right_id = EXPR_WFL_NODE (right);
9213   tree wfl, merge;
9214
9215   merge = merge_qualified_name (left_id, right_id);
9216
9217   /* Left wasn't qualified and is now qualified */
9218   if (!QUALIFIED_P (left_id))
9219     {
9220       tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
9221       EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
9222       EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
9223     }
9224
9225   wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
9226   EXPR_WFL_LINECOL (wfl) = location;
9227   chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
9228
9229   EXPR_WFL_NODE (left) = merge;
9230   return left;
9231 #endif
9232 }
9233
9234 /* Extract the last identifier component of the qualified in WFL. The
9235    last identifier is removed from the linked list */
9236
9237 static tree
9238 cut_identifier_in_qualified (tree wfl)
9239 {
9240   tree q;
9241   tree previous = NULL_TREE;
9242   for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
9243     if (!TREE_CHAIN (q))
9244       {
9245         if (!previous)
9246           /* Operating on a non qualified qualified WFL.  */
9247           abort ();
9248
9249         TREE_CHAIN (previous) = NULL_TREE;
9250         return TREE_PURPOSE (q);
9251       }
9252 }
9253
9254 /* Resolve the expression name NAME. Return its decl.  */
9255
9256 static tree
9257 resolve_expression_name (tree id, tree *orig)
9258 {
9259   tree name = EXPR_WFL_NODE (id);
9260   tree decl;
9261
9262   /* 6.5.5.1: Simple expression names */
9263   if (!PRIMARY_P (id) && !QUALIFIED_P (name))
9264     {
9265       /* 15.13.1: NAME can appear within the scope of a local variable
9266          declaration */
9267       if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
9268         return decl;
9269
9270       /* 15.13.1: NAME can appear within a class declaration */
9271       else
9272         {
9273           decl = lookup_field_wrapper (current_class, name);
9274           if (decl)
9275             {
9276               tree access = NULL_TREE;
9277               int fs = FIELD_STATIC (decl);
9278
9279               /* If we're accessing an outer scope local alias, make
9280                  sure we change the name of the field we're going to
9281                  build access to. */
9282               if (FIELD_LOCAL_ALIAS_USED (decl))
9283                 name = DECL_NAME (decl);
9284
9285               check_deprecation (id, decl);
9286
9287               /* Instance variable (8.3.1.1) can't appear within
9288                  static method, static initializer or initializer for
9289                  a static variable. */
9290               if (!fs && METHOD_STATIC (current_function_decl))
9291                 {
9292                   static_ref_err (id, name, current_class);
9293                   return error_mark_node;
9294                 }
9295               /* Instance variables can't appear as an argument of
9296                  an explicit constructor invocation */
9297               if (!fs && ctxp->explicit_constructor_p
9298                   && !enclosing_context_p (DECL_CONTEXT (decl), current_class))
9299                 {
9300                   parse_error_context
9301                     (id, "Can't reference `%s' before the superclass constructor has been called", IDENTIFIER_POINTER (name));
9302                   return error_mark_node;
9303                 }
9304
9305               /* If we're processing an inner class and we're trying
9306                  to access a field belonging to an outer class, build
9307                  the access to the field */
9308               if (!fs && outer_field_access_p (current_class, decl))
9309                 {
9310                   if (CLASS_STATIC (TYPE_NAME (current_class)))
9311                     {
9312                       static_ref_err (id, DECL_NAME (decl), current_class);
9313                       return error_mark_node;
9314                     }
9315                   access = build_outer_field_access (id, decl);
9316                   if (orig)
9317                     *orig = access;
9318                   return access;
9319                 }
9320
9321               /* Otherwise build what it takes to access the field */
9322               access = build_field_ref ((fs ? NULL_TREE : current_this),
9323                                         DECL_CONTEXT (decl), name);
9324               if (fs)
9325                 access = maybe_build_class_init_for_field (decl, access);
9326               /* We may be asked to save the real field access node */
9327               if (orig)
9328                 *orig = access;
9329               /* Last check: can we access the field? */
9330               if (not_accessible_p (current_class, decl, NULL_TREE, 0))
9331                 {
9332                   not_accessible_field_error (id, decl);
9333                   return error_mark_node;
9334                 }
9335               /* And we return what we got */
9336               return access;
9337             }
9338           /* Fall down to error report on undefined variable */
9339         }
9340     }
9341   /* 6.5.5.2 Qualified Expression Names */
9342   else
9343     {
9344       if (orig)
9345         *orig = NULL_TREE;
9346       qualify_ambiguous_name (id);
9347       /* 15.10.1 Field Access Using a Primary and/or Expression Name */
9348       /* 15.10.2: Accessing Superclass Members using super */
9349       return resolve_field_access (id, orig, NULL);
9350     }
9351
9352   /* We've got an error here */
9353   if (INNER_CLASS_TYPE_P (current_class))
9354     parse_error_context (id,
9355                          "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final",
9356                          IDENTIFIER_POINTER (name),
9357                          IDENTIFIER_POINTER (DECL_NAME
9358                                              (TYPE_NAME (current_class))));
9359   else
9360     parse_error_context (id, "Undefined variable `%s'",
9361                          IDENTIFIER_POINTER (name));
9362
9363   return error_mark_node;
9364 }
9365
9366 static void
9367 static_ref_err (tree wfl, tree field_id, tree class_type)
9368 {
9369   parse_error_context
9370     (wfl,
9371      "Can't make a static reference to nonstatic variable `%s' in class `%s'",
9372      IDENTIFIER_POINTER (field_id),
9373      IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
9374 }
9375
9376 /* 15.10.1 Field Access Using a Primary and/or Expression Name.
9377    We return something suitable to generate the field access. We also
9378    return the field decl in FIELD_DECL and its type in FIELD_TYPE.  If
9379    recipient's address can be null. */
9380
9381 static tree
9382 resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
9383 {
9384   int is_static = 0;
9385   tree field_ref;
9386   tree decl = NULL_TREE, where_found, type_found;
9387
9388   if (resolve_qualified_expression_name (qual_wfl, &decl,
9389                                          &where_found, &type_found))
9390     return error_mark_node;
9391
9392   /* Resolve the LENGTH field of an array here */
9393   if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node
9394       && type_found && TYPE_ARRAY_P (type_found)
9395       && ! flag_emit_class_files && ! flag_emit_xref)
9396     {
9397       tree length = build_java_array_length_access (where_found);
9398       field_ref = length;
9399
9400       /* In case we're dealing with a static array, we need to
9401          initialize its class before the array length can be fetched.
9402          It's also a good time to create a DECL_RTL for the field if
9403          none already exists, otherwise if the field was declared in a
9404          class found in an external file and hasn't been (and won't
9405          be) accessed for its value, none will be created. */
9406       if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
9407         {
9408           build_static_field_ref (where_found);
9409           field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9410         }
9411     }
9412   /* We might have been trying to resolve field.method(). In which
9413      case, the resolution is over and decl is the answer */
9414   else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
9415     field_ref = decl;
9416   else if (JDECL_P (decl))
9417     {
9418       if (!type_found)
9419         type_found = DECL_CONTEXT (decl);
9420       is_static = FIELD_STATIC (decl);
9421       field_ref = build_field_ref ((is_static && !flag_emit_xref?
9422                                     NULL_TREE : where_found),
9423                                    type_found, DECL_NAME (decl));
9424       if (field_ref == error_mark_node)
9425         return error_mark_node;
9426       if (is_static)
9427         field_ref = maybe_build_class_init_for_field (decl, field_ref);
9428
9429       /* If we're looking at a static field, we may need to generate a
9430          class initialization for it.  This can happen when the access
9431          looks like `field.ref', where `field' is a static field in an
9432          interface we implement.  */
9433       if (!flag_emit_class_files
9434           && !flag_emit_xref
9435           && TREE_CODE (where_found) == VAR_DECL
9436           && FIELD_STATIC (where_found))
9437         {
9438           build_static_field_ref (where_found);
9439           field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9440         }
9441     }
9442   else
9443     field_ref = decl;
9444
9445   if (field_decl)
9446     *field_decl = decl;
9447   if (field_type)
9448     *field_type = (QUAL_DECL_TYPE (decl) ?
9449                    QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
9450   return field_ref;
9451 }
9452
9453 /* If NODE is an access to f static field, strip out the class
9454    initialization part and return the field decl, otherwise, return
9455    NODE. */
9456
9457 static tree
9458 strip_out_static_field_access_decl (tree node)
9459 {
9460   if (TREE_CODE (node) == COMPOUND_EXPR)
9461     {
9462       tree op1 = TREE_OPERAND (node, 1);
9463       if (TREE_CODE (op1) == COMPOUND_EXPR)
9464          {
9465            tree call = TREE_OPERAND (op1, 0);
9466            if (TREE_CODE (call) == CALL_EXPR
9467                && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
9468                && TREE_OPERAND (TREE_OPERAND (call, 0), 0)
9469                == soft_initclass_node)
9470              return TREE_OPERAND (op1, 1);
9471          }
9472       else if (JDECL_P (op1))
9473         return op1;
9474     }
9475   return node;
9476 }
9477
9478 /* 6.5.5.2: Qualified Expression Names */
9479
9480 static int
9481 resolve_qualified_expression_name (tree wfl, tree *found_decl,
9482                                    tree *where_found, tree *type_found)
9483 {
9484   int from_type = 0;            /* Field search initiated from a type */
9485   int from_super = 0, from_cast = 0, from_qualified_this = 0;
9486   int previous_call_static = 0;
9487   int is_static;
9488   tree decl = NULL_TREE, type = NULL_TREE, q;
9489   /* For certain for of inner class instantiation */
9490   tree saved_current, saved_this;
9491 #define RESTORE_THIS_AND_CURRENT_CLASS                          \
9492   { current_class = saved_current; current_this = saved_this;}
9493
9494   *type_found = *where_found = NULL_TREE;
9495
9496   for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
9497     {
9498       tree qual_wfl = QUAL_WFL (q);
9499       tree ret_decl;            /* for EH checking */
9500       int location;             /* for EH checking */
9501
9502       /* 15.10.1 Field Access Using a Primary */
9503       switch (TREE_CODE (qual_wfl))
9504         {
9505         case CALL_EXPR:
9506         case NEW_CLASS_EXPR:
9507           /* If the access to the function call is a non static field,
9508              build the code to access it. */
9509           if (JDECL_P (decl) && !FIELD_STATIC (decl))
9510             {
9511               decl = maybe_access_field (decl, *where_found,
9512                                          DECL_CONTEXT (decl));
9513               if (decl == error_mark_node)
9514                 return 1;
9515             }
9516
9517           /* And code for the function call */
9518           if (complete_function_arguments (qual_wfl))
9519             return 1;
9520
9521           /* We might have to setup a new current class and a new this
9522              for the search of an inner class, relative to the type of
9523              a expression resolved as `decl'. The current values are
9524              saved and restored shortly after */
9525           saved_current = current_class;
9526           saved_this = current_this;
9527           if (decl
9528               && (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9529                   || from_qualified_this))
9530             {
9531               /* If we still have `from_qualified_this', we have the form
9532                  <T>.this.f() and we need to build <T>.this */
9533               if (from_qualified_this)
9534                 {
9535                   decl = build_access_to_thisn (current_class, type, 0);
9536                   decl = java_complete_tree (decl);
9537                   type = TREE_TYPE (TREE_TYPE (decl));
9538                 }
9539               current_class = type;
9540               current_this = decl;
9541               from_qualified_this = 0;
9542             }
9543
9544           if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
9545             CALL_USING_SUPER (qual_wfl) = 1;
9546           location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
9547                       EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
9548           *where_found = patch_method_invocation (qual_wfl, decl, type,
9549                                                   from_super,
9550                                                   &is_static, &ret_decl);
9551           from_super = 0;
9552           if (*where_found == error_mark_node)
9553             {
9554               RESTORE_THIS_AND_CURRENT_CLASS;
9555               return 1;
9556             }
9557           *type_found = type = QUAL_DECL_TYPE (*where_found);
9558
9559           *where_found = force_evaluation_order (*where_found);
9560
9561           /* If we're creating an inner class instance, check for that
9562              an enclosing instance is in scope */
9563           if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9564               && INNER_ENCLOSING_SCOPE_CHECK (type))
9565             {
9566               parse_error_context
9567                 (qual_wfl, "No enclosing instance for inner class `%s' is in scope%s",
9568                  lang_printable_name (type, 0),
9569                  (!current_this ? "" :
9570                   "; an explicit one must be provided when creating this inner class"));
9571               RESTORE_THIS_AND_CURRENT_CLASS;
9572               return 1;
9573             }
9574
9575           /* In case we had to change then to resolve a inner class
9576              instantiation using a primary qualified by a `new' */
9577           RESTORE_THIS_AND_CURRENT_CLASS;
9578
9579           if (location)
9580             {
9581               tree arguments = NULL_TREE;
9582               if (TREE_CODE (qual_wfl) == CALL_EXPR
9583                   && TREE_OPERAND (qual_wfl, 1) != NULL_TREE)
9584                 arguments = TREE_VALUE (TREE_OPERAND (qual_wfl, 1));
9585               check_thrown_exceptions (location, ret_decl, arguments);
9586             }
9587
9588           /* If the previous call was static and this one is too,
9589              build a compound expression to hold the two (because in
9590              that case, previous function calls aren't transported as
9591              forcoming function's argument. */
9592           if (previous_call_static && is_static)
9593             {
9594               decl = build (COMPOUND_EXPR, TREE_TYPE (*where_found),
9595                             decl, *where_found);
9596               TREE_SIDE_EFFECTS (decl) = 1;
9597             }
9598           else
9599             {
9600               previous_call_static = is_static;
9601               decl = *where_found;
9602             }
9603           from_type = 0;
9604           continue;
9605
9606         case NEW_ARRAY_EXPR:
9607         case NEW_ANONYMOUS_ARRAY_EXPR:
9608           *where_found = decl = java_complete_tree (qual_wfl);
9609           if (decl == error_mark_node)
9610             return 1;
9611           *type_found = type = QUAL_DECL_TYPE (decl);
9612           continue;
9613
9614         case CONVERT_EXPR:
9615           *where_found = decl = java_complete_tree (qual_wfl);
9616           if (decl == error_mark_node)
9617             return 1;
9618           *type_found = type = QUAL_DECL_TYPE (decl);
9619           from_cast = 1;
9620           continue;
9621
9622         case CONDITIONAL_EXPR:
9623         case STRING_CST:
9624         case MODIFY_EXPR:
9625           *where_found = decl = java_complete_tree (qual_wfl);
9626           if (decl == error_mark_node)
9627             return 1;
9628           *type_found = type = QUAL_DECL_TYPE (decl);
9629           continue;
9630
9631         case ARRAY_REF:
9632           /* If the access to the function call is a non static field,
9633              build the code to access it. */
9634           if (JDECL_P (decl) && !FIELD_STATIC (decl))
9635             {
9636               decl = maybe_access_field (decl, *where_found, type);
9637               if (decl == error_mark_node)
9638                 return 1;
9639             }
9640           /* And code for the array reference expression */
9641           decl = java_complete_tree (qual_wfl);
9642           if (decl == error_mark_node)
9643             return 1;
9644           type = QUAL_DECL_TYPE (decl);
9645           continue;
9646
9647         case PLUS_EXPR:
9648           if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9649             return 1;
9650           if ((type = patch_string (decl)))
9651             decl = type;
9652           *where_found = QUAL_RESOLUTION (q) = decl;
9653           *type_found = type = TREE_TYPE (decl);
9654           break;
9655
9656         case CLASS_LITERAL:
9657           if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9658             return 1;
9659           *where_found = QUAL_RESOLUTION (q) = decl;
9660           *type_found = type = TREE_TYPE (decl);
9661           break;
9662
9663         default:
9664           /* Fix for -Wall Just go to the next statement. Don't
9665              continue */
9666           break;
9667         }
9668
9669       /* If we fall here, we weren't processing a (static) function call. */
9670       previous_call_static = 0;
9671
9672       /* It can be the keyword THIS */
9673       if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9674           && EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
9675         {
9676           if (!current_this)
9677             {
9678               parse_error_context
9679                 (wfl, "Keyword `this' used outside allowed context");
9680               return 1;
9681             }
9682           if (ctxp->explicit_constructor_p
9683               && type == current_class)
9684             {
9685               parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
9686               return 1;
9687             }
9688           /* We have to generate code for intermediate access */
9689           if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type)
9690             {
9691               *where_found = decl = current_this;
9692               *type_found = type = QUAL_DECL_TYPE (decl);
9693             }
9694           /* We're trying to access the this from somewhere else. Make sure
9695              it's allowed before doing so. */
9696           else
9697             {
9698               if (!enclosing_context_p (type, current_class))
9699                 {
9700                   char *p  = xstrdup (lang_printable_name (type, 0));
9701                   parse_error_context (qual_wfl, "Can't use variable `%s.this': type `%s' isn't an outer type of type `%s'",
9702                                        p, p,
9703                                        lang_printable_name (current_class, 0));
9704                   free (p);
9705                   return 1;
9706                 }
9707               from_qualified_this = 1;
9708               /* If there's nothing else after that, we need to
9709                  produce something now, otherwise, the section of the
9710                  code that needs to produce <T>.this will generate
9711                  what is necessary. */
9712               if (!TREE_CHAIN (q))
9713                 {
9714                   decl = build_access_to_thisn (current_class, type, 0);
9715                   *where_found = decl = java_complete_tree (decl);
9716                   *type_found = type = TREE_TYPE (decl);
9717                 }
9718             }
9719
9720           from_type = 0;
9721           continue;
9722         }
9723
9724       /* 15.10.2 Accessing Superclass Members using SUPER */
9725       if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9726           && EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
9727         {
9728           tree node;
9729           /* Check on the restricted use of SUPER */
9730           if (METHOD_STATIC (current_function_decl)
9731               || current_class == object_type_node)
9732             {
9733               parse_error_context
9734                 (wfl, "Keyword `super' used outside allowed context");
9735               return 1;
9736             }
9737           /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
9738           node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
9739                              CLASSTYPE_SUPER (current_class),
9740                              build_this (EXPR_WFL_LINECOL (qual_wfl)));
9741           *where_found = decl = java_complete_tree (node);
9742           if (decl == error_mark_node)
9743             return 1;
9744           *type_found = type = QUAL_DECL_TYPE (decl);
9745           from_super = from_type = 1;
9746           continue;
9747         }
9748
9749       /* 15.13.1: Can't search for field name in packages, so we
9750          assume a variable/class name was meant. */
9751       if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
9752         {
9753           tree name;
9754           if ((decl = resolve_package (wfl, &q, &name)))
9755             {
9756               tree list;
9757               *where_found = decl;
9758
9759               check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
9760
9761               /* We want to be absolutely sure that the class is laid
9762                  out. We're going to search something inside it. */
9763               *type_found = type = TREE_TYPE (decl);
9764               layout_class (type);
9765               from_type = 1;
9766
9767               /* Fix them all the way down, if any are left. */
9768               if (q)
9769                 {
9770                   list = TREE_CHAIN (q);
9771                   while (list)
9772                     {
9773                       RESOLVE_PACKAGE_NAME_P (QUAL_WFL (list)) = 0;
9774                       list = TREE_CHAIN (list);
9775                     }
9776                 }
9777             }
9778           else
9779             {
9780               if (from_super || from_cast)
9781                 parse_error_context
9782                   ((from_cast ? qual_wfl : wfl),
9783                    "No variable `%s' defined in class `%s'",
9784                    IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9785                    lang_printable_name (type, 0));
9786               else
9787                 parse_error_context
9788                   (qual_wfl, "Undefined variable or class name: `%s'",
9789                    IDENTIFIER_POINTER (name));
9790               return 1;
9791             }
9792         }
9793
9794       /* We have a type name. It's been already resolved when the
9795          expression was qualified. */
9796       else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q))
9797         {
9798           decl = QUAL_RESOLUTION (q);
9799
9800           /* Sneak preview. If next we see a `new', we're facing a
9801              qualification which resulted in a type being selected
9802              instead of a field.  Report the error.  */
9803           if(TREE_CHAIN (q)
9804              && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR)
9805             {
9806               parse_error_context (qual_wfl, "Undefined variable `%s'",
9807                                    IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
9808               return 1;
9809             }
9810
9811           check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
9812           
9813           check_deprecation (qual_wfl, decl);
9814
9815           type = TREE_TYPE (decl);
9816           from_type = 1;
9817         }
9818       /* We resolve an expression name */
9819       else
9820         {
9821           tree field_decl = NULL_TREE;
9822
9823           /* If there exists an early resolution, use it. That occurs
9824              only once and we know that there are more things to
9825              come. Don't do that when processing something after SUPER
9826              (we need more thing to be put in place below */
9827           if (!from_super && QUAL_RESOLUTION (q))
9828             {
9829               decl = QUAL_RESOLUTION (q);
9830               if (!type)
9831                 {
9832                   if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
9833                     {
9834                       if (current_this)
9835                         *where_found = current_this;
9836                       else
9837                         {
9838                           static_ref_err (qual_wfl, DECL_NAME (decl),
9839                                           current_class);
9840                           return 1;
9841                         }
9842                       if (outer_field_access_p (current_class, decl))
9843                         decl = build_outer_field_access (qual_wfl, decl);
9844                     }
9845                   else
9846                     {
9847                       *where_found = TREE_TYPE (decl);
9848                       if (TREE_CODE (*where_found) == POINTER_TYPE)
9849                         *where_found = TREE_TYPE (*where_found);
9850                     }
9851                 }
9852             }
9853
9854           /* Report and error if we're using a numerical literal as a
9855              qualifier. It can only be an INTEGER_CST. */
9856           else if (TREE_CODE (qual_wfl) == INTEGER_CST)
9857             {
9858               parse_error_context
9859                 (wfl, "Can't use type `%s' as a qualifier",
9860                  lang_printable_name (TREE_TYPE (qual_wfl), 0));
9861               return 1;
9862             }
9863
9864           /* We have to search for a field, knowing the type of its
9865              container. The flag FROM_TYPE indicates that we resolved
9866              the last member of the expression as a type name, which
9867              means that for the resolution of this field, we'll look
9868              for other errors than if it was resolved as a member of
9869              an other field. */
9870           else
9871             {
9872               int is_static;
9873               tree field_decl_type; /* For layout */
9874
9875               if (!from_type && !JREFERENCE_TYPE_P (type))
9876                 {
9877                   parse_error_context
9878                     (qual_wfl, "Attempt to reference field `%s' in `%s %s'",
9879                      IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9880                      lang_printable_name (type, 0),
9881                      IDENTIFIER_POINTER (DECL_NAME (decl)));
9882                   return 1;
9883                 }
9884
9885               field_decl = lookup_field_wrapper (type,
9886                                                  EXPR_WFL_NODE (qual_wfl));
9887
9888               /* Maybe what we're trying to access to is an inner
9889                  class, only if decl is a TYPE_DECL. */
9890               if (!field_decl && TREE_CODE (decl) == TYPE_DECL)
9891                 {
9892                   tree ptr, inner_decl;
9893
9894                   BUILD_PTR_FROM_NAME (ptr, EXPR_WFL_NODE (qual_wfl));
9895                   inner_decl = resolve_class (decl, ptr, NULL_TREE, qual_wfl);
9896                   if (inner_decl)
9897                     {
9898                       check_inner_class_access (inner_decl, decl, qual_wfl);
9899                       type = TREE_TYPE (inner_decl);
9900                       decl = inner_decl;
9901                       from_type = 1;
9902                       continue;
9903                     }
9904                 }
9905
9906               if (field_decl == NULL_TREE)
9907                 {
9908                   parse_error_context
9909                     (qual_wfl, "No variable `%s' defined in type `%s'",
9910                      IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9911                      GET_TYPE_NAME (type));
9912                   return 1;
9913                 }
9914               if (field_decl == error_mark_node)
9915                 return 1;
9916
9917               /* Layout the type of field_decl, since we may need
9918                  it. Don't do primitive types or loaded classes. The
9919                  situation of non primitive arrays may not handled
9920                  properly here. FIXME */
9921               if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
9922                 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
9923               else
9924                 field_decl_type = TREE_TYPE (field_decl);
9925               if (!JPRIMITIVE_TYPE_P (field_decl_type)
9926                   && !CLASS_LOADED_P (field_decl_type)
9927                   && !TYPE_ARRAY_P (field_decl_type))
9928                 resolve_and_layout (field_decl_type, NULL_TREE);
9929
9930               /* Check on accessibility here */
9931               if (not_accessible_p (current_class, field_decl,
9932                                     *type_found, from_super))
9933                 return not_accessible_field_error (qual_wfl,field_decl);    
9934               check_deprecation (qual_wfl, field_decl);
9935
9936               /* There are things to check when fields are accessed
9937                  from type. There are no restrictions on a static
9938                  declaration of the field when it is accessed from an
9939                  interface */
9940               is_static = FIELD_STATIC (field_decl);
9941               if (!from_super && from_type
9942                   && !TYPE_INTERFACE_P (type)
9943                   && !is_static
9944                   && (current_function_decl
9945                       && METHOD_STATIC (current_function_decl)))
9946                 {
9947                   static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
9948                   return 1;
9949                 }
9950               from_cast = from_super = 0;
9951
9952               /* It's an access from a type but it isn't static, we
9953                  make it relative to `this'. */
9954               if (!is_static && from_type)
9955                 decl = current_this;
9956
9957               /* If we need to generate something to get a proper
9958                  handle on what this field is accessed from, do it
9959                  now. */
9960               if (!is_static)
9961                 {
9962                   decl = maybe_access_field (decl, *where_found, *type_found);
9963                   if (decl == error_mark_node)
9964                     return 1;
9965                 }
9966
9967               /* We want to keep the location were found it, and the type
9968                  we found. */
9969               *where_found = decl;
9970               *type_found = type;
9971
9972               /* Generate the correct expression for field access from
9973                  qualified this */
9974               if (from_qualified_this)
9975                 {
9976                   field_decl = build_outer_field_access (qual_wfl, field_decl);
9977                   from_qualified_this = 0;
9978                 }
9979
9980               /* This is the decl found and eventually the next one to
9981                  search from */
9982               decl = field_decl;
9983             }
9984           from_type = 0;
9985           type = QUAL_DECL_TYPE (decl);
9986
9987           /* Sneak preview. If decl is qualified by a `new', report
9988              the error here to be accurate on the peculiar construct */
9989           if (TREE_CHAIN (q)
9990               && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR
9991               && !JREFERENCE_TYPE_P (type))
9992             {
9993               parse_error_context (qual_wfl, "Attempt to reference field `new' in a `%s'",
9994                                    lang_printable_name (type, 0));
9995               return 1;
9996             }
9997         }
9998       /* `q' might have changed due to a after package resolution
9999          re-qualification */
10000       if (!q)
10001         break;
10002     }
10003   *found_decl = decl;
10004   return 0;
10005 }
10006
10007 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
10008    can't be accessed from REFERENCE (a record type). If MEMBER
10009    features a protected access, we then use WHERE which, if non null,
10010    holds the type of MEMBER's access that is checked against
10011    6.6.2.1. This function should be used when decl is a field or a
10012    method.  */
10013
10014 static int
10015 not_accessible_p (tree reference, tree member, tree where, int from_super)
10016 {
10017   int access_flag = get_access_flags_from_decl (member);
10018   bool is_static = false;
10019  
10020   if (TREE_CODE (member) == FIELD_DECL ||
10021       TREE_CODE (member) == VAR_DECL)
10022     is_static = FIELD_STATIC (member);
10023   else
10024     is_static = METHOD_STATIC (member);
10025
10026   /* Access always granted for members declared public */
10027   if (access_flag & ACC_PUBLIC)
10028     return 0;
10029
10030   /* Check access on protected members */
10031   if (access_flag & ACC_PROTECTED)
10032     {
10033       /* Access granted if it occurs from within the package
10034          containing the class in which the protected member is
10035          declared */
10036       if (class_in_current_package (DECL_CONTEXT (member)))
10037         return 0;
10038
10039       /* If accessed with the form `super.member', then access is granted */
10040       if (from_super)
10041         return 0;
10042
10043       /* If WHERE is active, access was made through a qualifier. For 
10044          non-static members, access is granted if the type of the qualifier 
10045          is or is a sublass of the type the access is made from (6.6.2.1.)  */
10046       if (where && !is_static)
10047         {
10048           while (reference)
10049             {
10050               if (inherits_from_p (where, reference))
10051                 return 0;
10052               if (PURE_INNER_CLASS_TYPE_P (reference))
10053                 reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10054               else
10055                 break;
10056             }
10057           return 1;
10058         }
10059
10060       /* Otherwise, access is granted if occurring from within the class
10061          where member is declared, or a subclass of it.  */
10062       while (reference)
10063         {
10064           if (inherits_from_p (reference, DECL_CONTEXT (member)))
10065             return 0;
10066           if (PURE_INNER_CLASS_TYPE_P (reference))
10067             reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10068           else
10069             break;
10070         }
10071       return 1;
10072     }
10073
10074   /* Check access on private members. Access is granted only if it
10075      occurs from within the class in which it is declared -- that does
10076      it for innerclasses too. */
10077   if (access_flag & ACC_PRIVATE)
10078     {
10079       if (reference == DECL_CONTEXT (member) ||
10080           common_enclosing_context_p (DECL_CONTEXT (member), reference))
10081         return 0;
10082       return 1;
10083     }
10084
10085   /* Default access is permitted only when occurring from within the
10086      package in which the context (MEMBER) is declared.  */
10087   return !class_in_current_package (DECL_CONTEXT (member));
10088 }
10089
10090 /* Test deprecated decl access.  */
10091 static void
10092 check_deprecation (tree wfl, tree decl)
10093 {
10094   const char *file;
10095   tree elt;
10096
10097   if (! flag_deprecated)
10098     return;
10099
10100   /* We want to look at the element type of arrays here, so we strip
10101      all surrounding array types.  */
10102   if (TYPE_ARRAY_P (TREE_TYPE (decl)))
10103     {
10104       elt = TREE_TYPE (decl);
10105       while (TYPE_ARRAY_P (elt))
10106         elt = TYPE_ARRAY_ELEMENT (elt);
10107       /* We'll end up with a pointer type, so we use TREE_TYPE to go
10108          to the record.  */
10109       decl = TYPE_NAME (TREE_TYPE (elt));
10110     }
10111   file = DECL_SOURCE_FILE (decl);
10112
10113   /* Complain if the field is deprecated and the file it was defined
10114      in isn't compiled at the same time the file which contains its
10115      use is */
10116   if (DECL_DEPRECATED (decl)
10117       && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
10118     {
10119       const char *the;
10120       switch (TREE_CODE (decl))
10121         {
10122         case FUNCTION_DECL:
10123           the = "method";
10124           break;
10125         case FIELD_DECL:
10126         case VAR_DECL:
10127           the = "field";
10128           break;
10129         case TYPE_DECL:
10130           parse_warning_context (wfl, "The class `%s' has been deprecated",
10131                                  IDENTIFIER_POINTER (DECL_NAME (decl)));
10132           return;
10133         default:
10134           abort ();
10135         }
10136       /* Don't issue a message if the context as been deprecated as a
10137          whole. */
10138       if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl))))
10139         parse_warning_context
10140           (wfl, "The %s `%s' in class `%s' has been deprecated",
10141            the, lang_printable_name (decl, 0),
10142            IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
10143     }
10144 }
10145
10146 /* Returns 1 if class was declared in the current package, 0 otherwise */
10147
10148 static GTY(()) tree cicp_cache;
10149 static int
10150 class_in_current_package (tree class)
10151 {
10152   int qualified_flag;
10153   tree left;
10154
10155   if (cicp_cache == class)
10156     return 1;
10157
10158   qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
10159
10160   /* If the current package is empty and the name of CLASS is
10161      qualified, class isn't in the current package.  If there is a
10162      current package and the name of the CLASS is not qualified, class
10163      isn't in the current package */
10164   if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
10165     return 0;
10166
10167   /* If there is not package and the name of CLASS isn't qualified,
10168      they belong to the same unnamed package */
10169   if (!ctxp->package && !qualified_flag)
10170     return 1;
10171
10172   /* Compare the left part of the name of CLASS with the package name */
10173   split_qualified_name (&left, NULL, DECL_NAME (TYPE_NAME (class)));
10174   if (ctxp->package == left)
10175     {
10176       cicp_cache = class;
10177       return 1;
10178     }
10179   return 0;
10180 }
10181
10182 /* This function may generate code to access DECL from WHERE. This is
10183    done only if certain conditions meet.  */
10184
10185 static tree
10186 maybe_access_field (tree decl, tree where, tree type)
10187 {
10188   if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
10189       && !FIELD_STATIC (decl))
10190     decl = build_field_ref (where ? where : current_this,
10191                             (type ? type : DECL_CONTEXT (decl)),
10192                             DECL_NAME (decl));
10193   return decl;
10194 }
10195
10196 /* Build a method invocation, by patching PATCH. If non NULL
10197    and according to the situation, PRIMARY and WHERE may be
10198    used. IS_STATIC is set to 1 if the invoked function is static. */
10199
10200 static tree
10201 patch_method_invocation (tree patch, tree primary, tree where, int from_super,
10202                          int *is_static, tree *ret_decl)
10203 {
10204   tree wfl = TREE_OPERAND (patch, 0);
10205   tree args = TREE_OPERAND (patch, 1);
10206   tree name = EXPR_WFL_NODE (wfl);
10207   tree list;
10208   int is_static_flag = 0;
10209   int is_super_init = 0;
10210   tree this_arg = NULL_TREE;
10211   int is_array_clone_call = 0;
10212
10213   /* Should be overridden if everything goes well. Otherwise, if
10214      something fails, it should keep this value. It stop the
10215      evaluation of a bogus assignment. See java_complete_tree,
10216      MODIFY_EXPR: for the reasons why we sometimes want to keep on
10217      evaluating an assignment */
10218   TREE_TYPE (patch) = error_mark_node;
10219
10220   /* Since lookup functions are messing with line numbers, save the
10221      context now.  */
10222   java_parser_context_save_global ();
10223
10224   /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
10225
10226   /* Resolution of qualified name, excluding constructors */
10227   if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
10228     {
10229       tree identifier, identifier_wfl, type, resolved;
10230       /* Extract the last IDENTIFIER of the qualified
10231          expression. This is a wfl and we will use it's location
10232          data during error report. */
10233       identifier_wfl = cut_identifier_in_qualified (wfl);
10234       identifier = EXPR_WFL_NODE (identifier_wfl);
10235
10236       /* Given the context, IDENTIFIER is syntactically qualified
10237          as a MethodName. We need to qualify what's before */
10238       qualify_ambiguous_name (wfl);
10239       resolved = resolve_field_access (wfl, NULL, NULL);
10240
10241       if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved)
10242          && FIELD_FINAL (resolved)
10243          && !inherits_from_p (DECL_CONTEXT (resolved), current_class)
10244          && !flag_emit_class_files && !flag_emit_xref)
10245        resolved = build_class_init (DECL_CONTEXT (resolved), resolved);
10246
10247       if (resolved == error_mark_node)
10248         PATCH_METHOD_RETURN_ERROR ();
10249
10250       type = GET_SKIP_TYPE (resolved);
10251       resolve_and_layout (type, NULL_TREE);
10252
10253       if (JPRIMITIVE_TYPE_P (type))
10254         {
10255           parse_error_context
10256             (identifier_wfl,
10257              "Can't invoke a method on primitive type `%s'",
10258              IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10259           PATCH_METHOD_RETURN_ERROR ();
10260         }
10261
10262       list = lookup_method_invoke (0, identifier_wfl, type, identifier, args);
10263       args = nreverse (args);
10264
10265       /* We're resolving a call from a type */
10266       if (TREE_CODE (resolved) == TYPE_DECL)
10267         {
10268           if (CLASS_INTERFACE (resolved))
10269             {
10270               parse_error_context
10271                 (identifier_wfl,
10272                 "Can't make static reference to method `%s' in interface `%s'",
10273                  IDENTIFIER_POINTER (identifier),
10274                  IDENTIFIER_POINTER (name));
10275               PATCH_METHOD_RETURN_ERROR ();
10276             }
10277           if (list && !METHOD_STATIC (list))
10278             {
10279               char *fct_name = xstrdup (lang_printable_name (list, 0));
10280               parse_error_context
10281                 (identifier_wfl,
10282                  "Can't make static reference to method `%s %s' in class `%s'",
10283                  lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
10284                  fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10285               free (fct_name);
10286               PATCH_METHOD_RETURN_ERROR ();
10287             }
10288         }
10289       else
10290         this_arg = primary = resolved;
10291
10292       if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
10293         is_array_clone_call = 1;
10294
10295       /* IDENTIFIER_WFL will be used to report any problem further */
10296       wfl = identifier_wfl;
10297     }
10298   /* Resolution of simple names, names generated after a primary: or
10299      constructors */
10300   else
10301     {
10302       tree class_to_search = NULL_TREE;
10303       int lc;                   /* Looking for Constructor */
10304
10305       /* We search constructor in their target class */
10306       if (CALL_CONSTRUCTOR_P (patch))
10307         {
10308           if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10309             class_to_search = EXPR_WFL_NODE (wfl);
10310           else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10311                    this_identifier_node)
10312             class_to_search = NULL_TREE;
10313           else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10314                    super_identifier_node)
10315             {
10316               is_super_init = 1;
10317               if (CLASSTYPE_SUPER (current_class))
10318                 class_to_search =
10319                   DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
10320               else
10321                 {
10322                   parse_error_context (wfl, "Can't invoke super constructor on java.lang.Object");
10323                   PATCH_METHOD_RETURN_ERROR ();
10324                 }
10325             }
10326
10327           /* Class to search is NULL if we're searching the current one */
10328           if (class_to_search)
10329             {
10330               class_to_search = resolve_and_layout (class_to_search, wfl);
10331
10332               if (!class_to_search)
10333                 {
10334                   parse_error_context
10335                     (wfl, "Class `%s' not found in type declaration",
10336                      IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10337                   PATCH_METHOD_RETURN_ERROR ();
10338                 }
10339
10340               /* Can't instantiate an abstract class, but we can
10341                  invoke it's constructor. It's use within the `new'
10342                  context is denied here. */
10343               if (CLASS_ABSTRACT (class_to_search)
10344                   && TREE_CODE (patch) == NEW_CLASS_EXPR)
10345                 {
10346                   parse_error_context
10347                     (wfl, "Class `%s' is an abstract class. It can't be instantiated",
10348                      IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10349                   PATCH_METHOD_RETURN_ERROR ();
10350                 }
10351
10352               class_to_search = TREE_TYPE (class_to_search);
10353             }
10354           else
10355             class_to_search = current_class;
10356           lc = 1;
10357         }
10358       /* This is a regular search in the local class, unless an
10359          alternate class is specified. */
10360       else
10361         {
10362           if (where != NULL_TREE)
10363             class_to_search = where;
10364           else if (QUALIFIED_P (name))
10365             class_to_search = current_class;
10366           else
10367             {
10368               class_to_search = current_class;
10369
10370               for (;;)
10371                 {
10372                   if (has_method (class_to_search, name))
10373                     break;
10374                   if (! INNER_CLASS_TYPE_P (class_to_search))
10375                     {
10376                       parse_error_context (wfl,
10377                                            "No method named `%s' in scope",
10378                                            IDENTIFIER_POINTER (name));
10379                       PATCH_METHOD_RETURN_ERROR ();
10380                     }
10381                   class_to_search
10382                     = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
10383                 }
10384             }
10385           lc = 0;
10386         }
10387
10388       /* NAME is a simple identifier or comes from a primary. Search
10389          in the class whose declaration contain the method being
10390          invoked. */
10391       resolve_and_layout (class_to_search, NULL_TREE);
10392
10393       list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
10394       /* Don't continue if no method were found, as the next statement
10395          can't be executed then. */
10396       if (!list)
10397         PATCH_METHOD_RETURN_ERROR ();
10398
10399       if (TYPE_ARRAY_P (class_to_search)
10400           && DECL_NAME (list) == get_identifier ("clone"))
10401         is_array_clone_call = 1;
10402
10403       /* Check for static reference if non static methods */
10404       if (check_for_static_method_reference (wfl, patch, list,
10405                                              class_to_search, primary))
10406         PATCH_METHOD_RETURN_ERROR ();
10407
10408       /* Check for inner classes creation from illegal contexts */
10409       if (lc && (INNER_CLASS_TYPE_P (class_to_search)
10410                  && !CLASS_STATIC (TYPE_NAME (class_to_search)))
10411           && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)
10412           && !DECL_INIT_P (current_function_decl))
10413         {
10414           parse_error_context
10415             (wfl, "No enclosing instance for inner class `%s' is in scope%s",
10416              lang_printable_name (class_to_search, 0),
10417              (!current_this ? "" :
10418               "; an explicit one must be provided when creating this inner class"));
10419           PATCH_METHOD_RETURN_ERROR ();
10420         }
10421
10422       /* Non static methods are called with the current object extra
10423          argument. If patch a `new TYPE()', the argument is the value
10424          returned by the object allocator. If method is resolved as a
10425          primary, use the primary otherwise use the current THIS. */
10426       args = nreverse (args);
10427       if (TREE_CODE (patch) != NEW_CLASS_EXPR)
10428         {
10429           this_arg = primary ? primary : current_this;
10430
10431           /* If we're using an access method, things are different.
10432              There are two family of cases:
10433
10434              1) We're not generating bytecodes:
10435
10436              - LIST is non static. It's invocation is transformed from
10437                x(a1,...,an) into this$<n>.x(a1,....an).
10438              - LIST is static. It's invocation is transformed from
10439                x(a1,...,an) into TYPE_OF(this$<n>).x(a1,....an)
10440
10441              2) We're generating bytecodes:
10442
10443              - LIST is non static. It's invocation is transformed from
10444                x(a1,....,an) into access$<n>(this$<n>,a1,...,an).
10445              - LIST is static. It's invocation is transformed from
10446                x(a1,....,an) into TYPE_OF(this$<n>).x(a1,....an).
10447
10448              Of course, this$<n> can be arbitrarily complex, ranging from
10449              this$0 (the immediate outer context) to
10450              access$0(access$0(...(this$0))).
10451
10452              maybe_use_access_method returns a nonzero value if the
10453              this_arg has to be moved into the (then generated) stub
10454              argument list. In the meantime, the selected function
10455              might have be replaced by a generated stub. */
10456           if (!primary &&
10457               maybe_use_access_method (is_super_init, &list, &this_arg))
10458             {
10459               args = tree_cons (NULL_TREE, this_arg, args);
10460               this_arg = NULL_TREE; /* So it doesn't get chained twice */
10461             }
10462         }
10463     }
10464
10465   /* Merge point of all resolution schemes. If we have nothing, this
10466      is an error, already signaled */
10467   if (!list)
10468     PATCH_METHOD_RETURN_ERROR ();
10469
10470   /* Check accessibility, position the is_static flag, build and
10471      return the call */
10472   if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
10473                         (primary ? TREE_TYPE (TREE_TYPE (primary)) :
10474                          NULL_TREE), from_super)
10475       /* Calls to clone() on array types are permitted as a special-case. */
10476       && !is_array_clone_call)
10477     {
10478       const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list));
10479       const char *const access =
10480         accessibility_string (get_access_flags_from_decl (list));
10481       const char *const klass =
10482         IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list))));
10483       const char *const refklass =
10484         IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
10485       const char *const what = (DECL_CONSTRUCTOR_P (list)
10486                                 ? "constructor" : "method");
10487       parse_error_context (wfl,
10488                            "Can't access %s %s `%s.%s' from `%s'",
10489                            access, what, klass, fct_name, refklass);
10490       PATCH_METHOD_RETURN_ERROR ();
10491     }
10492
10493   /* Deprecation check: check whether the method being invoked or the
10494      instance-being-created's type are deprecated.  */
10495   if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10496     check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list)));
10497   check_deprecation (wfl, list);
10498
10499   /* If invoking a innerclass constructor, there are hidden parameters
10500      to pass */
10501   if (TREE_CODE (patch) == NEW_CLASS_EXPR
10502       && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10503     {
10504       /* And make sure we add the accessed local variables to be saved
10505          in field aliases. */
10506       args = build_alias_initializer_parameter_list
10507         (AIPL_FUNCTION_CTOR_INVOCATION, DECL_CONTEXT (list), args, NULL);
10508
10509       /* Secretly pass the current_this/primary as a second argument */
10510       if (primary || current_this)
10511         {
10512           tree extra_arg;
10513           tree this_type = (current_this ?
10514                             TREE_TYPE (TREE_TYPE (current_this)) : NULL_TREE);
10515           /* Method's (list) enclosing context */
10516           tree mec = DECL_CONTEXT (TYPE_NAME (DECL_CONTEXT (list)));
10517           /* If we have a primary, use it. */
10518           if (primary)
10519             extra_arg = primary;
10520           /* The current `this' is an inner class but isn't a direct
10521              enclosing context for the inner class we're trying to
10522              create. Build an access to the proper enclosing context
10523              and use it. */
10524           else if (current_this && PURE_INNER_CLASS_TYPE_P (this_type)
10525                    && this_type != TREE_TYPE (mec))
10526             {
10527
10528               extra_arg = build_access_to_thisn (current_class,
10529                                                  TREE_TYPE (mec), 0);
10530               extra_arg = java_complete_tree (extra_arg);
10531             }
10532           /* Otherwise, just use the current `this' as an enclosing
10533              context. */
10534           else
10535             extra_arg = current_this;
10536           args = tree_cons (NULL_TREE, extra_arg, args);
10537         }
10538       else
10539         args = tree_cons (NULL_TREE, integer_zero_node, args);
10540     }
10541
10542   /* This handles the situation where a constructor invocation needs
10543      to have an enclosing context passed as a second parameter (the
10544      constructor is one of an inner class). */
10545   if ((is_super_init ||
10546        (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node))
10547       && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10548     {
10549       tree dest = TYPE_NAME (DECL_CONTEXT (list));
10550       tree extra_arg =
10551         build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0);
10552       extra_arg = java_complete_tree (extra_arg);
10553       args = tree_cons (NULL_TREE, extra_arg, args);
10554     }
10555
10556   is_static_flag = METHOD_STATIC (list);
10557   if (! is_static_flag && this_arg != NULL_TREE)
10558     args = tree_cons (NULL_TREE, this_arg, args);
10559
10560   /* In the context of an explicit constructor invocation, we can't
10561      invoke any method relying on `this'. Exceptions are: we're
10562      invoking a static function, primary exists and is not the current
10563      this, we're creating a new object. */
10564   if (ctxp->explicit_constructor_p
10565       && !is_static_flag
10566       && (!primary || primary == current_this)
10567       && (TREE_CODE (patch) != NEW_CLASS_EXPR))
10568     {
10569       parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
10570       PATCH_METHOD_RETURN_ERROR ();
10571     }
10572   java_parser_context_restore_global ();
10573   if (is_static)
10574     *is_static = is_static_flag;
10575   /* Sometimes, we want the decl of the selected method. Such as for
10576      EH checking */
10577   if (ret_decl)
10578     *ret_decl = list;
10579   patch = patch_invoke (patch, list, args);
10580
10581   /* Now is a good time to insert the call to finit$ */
10582   if (is_super_init && CLASS_HAS_FINIT_P (current_class))
10583     {
10584       tree finit_parms, finit_call;
10585
10586       /* Prepare to pass hidden parameters to finit$, if any. */
10587       finit_parms = build_alias_initializer_parameter_list
10588         (AIPL_FUNCTION_FINIT_INVOCATION, current_class, NULL_TREE, NULL);
10589
10590       finit_call =
10591         build_method_invocation (build_wfl_node (finit_identifier_node),
10592                                  finit_parms);
10593
10594       /* Generate the code used to initialize fields declared with an
10595          initialization statement and build a compound statement along
10596          with the super constructor invocation. */
10597       CAN_COMPLETE_NORMALLY (patch) = 1;
10598       patch = build (COMPOUND_EXPR, void_type_node, patch,
10599                      java_complete_tree (finit_call));
10600     }
10601   return patch;
10602 }
10603
10604 /* Check that we're not trying to do a static reference to a method in
10605    non static method. Return 1 if it's the case, 0 otherwise. */
10606
10607 static int
10608 check_for_static_method_reference (tree wfl, tree node, tree method,
10609                                    tree where, tree primary)
10610 {
10611   if (METHOD_STATIC (current_function_decl)
10612       && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
10613     {
10614       char *fct_name = xstrdup (lang_printable_name (method, 0));
10615       parse_error_context
10616         (wfl, "Can't make static reference to method `%s %s' in class `%s'",
10617          lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
10618          IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
10619       free (fct_name);
10620       return 1;
10621     }
10622   return 0;
10623 }
10624
10625 /* Fix the invocation of *MDECL if necessary in the case of a
10626    invocation from an inner class. *THIS_ARG might be modified
10627    appropriately and an alternative access to *MDECL might be
10628    returned.  */
10629
10630 static int
10631 maybe_use_access_method (int is_super_init, tree *mdecl, tree *this_arg)
10632 {
10633   tree ctx;
10634   tree md = *mdecl, ta = *this_arg;
10635   int to_return = 0;
10636   int non_static_context = !METHOD_STATIC (md);
10637
10638   if (is_super_init
10639       || DECL_CONTEXT (md) == current_class
10640       || !PURE_INNER_CLASS_TYPE_P (current_class)
10641       || DECL_FINIT_P (md)
10642       || DECL_INSTINIT_P (md))
10643     return 0;
10644
10645   /* If we're calling a method found in an enclosing class, generate
10646      what it takes to retrieve the right this. Don't do that if we're
10647      invoking a static method. Note that if MD's type is unrelated to
10648      CURRENT_CLASS, then the current this can be used. */
10649
10650   if (non_static_context && DECL_CONTEXT (md) != object_type_node)
10651     {
10652       ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
10653       if (inherits_from_p (ctx, DECL_CONTEXT (md)))
10654         {
10655           ta = build_current_thisn (current_class);
10656           ta = build_wfl_node (ta);
10657         }
10658       else
10659         {
10660           tree type = ctx;
10661           while (type)
10662             {
10663               maybe_build_thisn_access_method (type);
10664               if (inherits_from_p (type, DECL_CONTEXT (md)))
10665                 {
10666                   ta = build_access_to_thisn (ctx, type, 0);
10667                   break;
10668                 }
10669               type = (DECL_CONTEXT (TYPE_NAME (type)) ?
10670                       TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))) : NULL_TREE);
10671             }
10672         }
10673       ta = java_complete_tree (ta);
10674     }
10675
10676   /* We might have to use an access method to get to MD. We can
10677      break the method access rule as far as we're not generating
10678      bytecode */
10679   if (METHOD_PRIVATE (md) && flag_emit_class_files)
10680     {
10681       md = build_outer_method_access_method (md);
10682       to_return = 1;
10683     }
10684
10685   *mdecl = md;
10686   *this_arg = ta;
10687
10688   /* Returning a nonzero value indicates we were doing a non static
10689      method invocation that is now a static invocation. It will have
10690      callee displace `this' to insert it in the regular argument
10691      list. */
10692   return (non_static_context && to_return);
10693 }
10694
10695 /* Patch an invoke expression METHOD and ARGS, based on its invocation
10696    mode.  */
10697
10698 static tree
10699 patch_invoke (tree patch, tree method, tree args)
10700 {
10701   tree dtable, func;
10702   tree original_call, t, ta;
10703   tree check = NULL_TREE;
10704
10705   /* Last step for args: convert build-in types. If we're dealing with
10706      a new TYPE() type call, the first argument to the constructor
10707      isn't found in the incoming argument list, but delivered by
10708      `new' */
10709   t = TYPE_ARG_TYPES (TREE_TYPE (method));
10710   if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10711     t = TREE_CHAIN (t);
10712   for (ta = args; t != end_params_node && ta;
10713        t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
10714     if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
10715         TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
10716       TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
10717
10718   /* Resolve unresolved returned type issues */
10719   t = TREE_TYPE (TREE_TYPE (method));
10720   if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
10721     resolve_and_layout (TREE_TYPE (t), NULL);
10722
10723   if (flag_emit_class_files || flag_emit_xref)
10724     func = method;
10725   else
10726     {
10727       switch (invocation_mode (method, CALL_USING_SUPER (patch)))
10728         {
10729         case INVOKE_VIRTUAL:
10730           dtable = invoke_build_dtable (0, args);
10731           func = build_invokevirtual (dtable, method);
10732           break;
10733
10734         case INVOKE_NONVIRTUAL:
10735           /* If the object for the method call is null, we throw an
10736              exception.  We don't do this if the object is the current
10737              method's `this'.  In other cases we just rely on an
10738              optimization pass to eliminate redundant checks.  */
10739           if (TREE_VALUE (args) != current_this)
10740             {
10741               /* We use a save_expr here to make sure we only evaluate
10742                  the new `self' expression once.  */
10743               tree save_arg = save_expr (TREE_VALUE (args));
10744               TREE_VALUE (args) = save_arg;
10745               check = java_check_reference (save_arg, 1);
10746             }
10747           /* Fall through.  */
10748
10749         case INVOKE_SUPER:
10750         case INVOKE_STATIC:
10751           {
10752             tree signature = build_java_signature (TREE_TYPE (method));
10753             func = build_known_method_ref (method, TREE_TYPE (method),
10754                                            DECL_CONTEXT (method),
10755                                            signature, args);
10756           }
10757           break;
10758
10759         case INVOKE_INTERFACE:
10760           dtable = invoke_build_dtable (1, args);
10761           func = build_invokeinterface (dtable, method);
10762           break;
10763
10764         default:
10765           abort ();
10766         }
10767
10768       /* Ensure self_type is initialized, (invokestatic). FIXME */
10769       func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
10770     }
10771
10772   TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
10773   TREE_OPERAND (patch, 0) = func;
10774   TREE_OPERAND (patch, 1) = args;
10775   patch = check_for_builtin (method, patch);
10776   original_call = patch;
10777
10778   /* We're processing a `new TYPE ()' form. New is called and its
10779      returned value is the first argument to the constructor. We build
10780      a COMPOUND_EXPR and use saved expression so that the overall NEW
10781      expression value is a pointer to a newly created and initialized
10782      class. */
10783   if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
10784     {
10785       tree class = DECL_CONTEXT (method);
10786       tree c1, saved_new, size, new;
10787       tree alloc_node;
10788
10789       if (flag_emit_class_files || flag_emit_xref)
10790         {
10791           TREE_TYPE (patch) = build_pointer_type (class);
10792           return patch;
10793         }
10794       if (!TYPE_SIZE (class))
10795         safe_layout_class (class);
10796       size = size_in_bytes (class);
10797       alloc_node =
10798         (class_has_finalize_method (class) ? alloc_object_node
10799                                            : alloc_no_finalizer_node);
10800       new = build (CALL_EXPR, promote_type (class),
10801                      build_address_of (alloc_node),
10802                      build_tree_list (NULL_TREE, build_class_ref (class)),
10803                      NULL_TREE);
10804       saved_new = save_expr (new);
10805       c1 = build_tree_list (NULL_TREE, saved_new);
10806       TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
10807       TREE_OPERAND (original_call, 1) = c1;
10808       TREE_SET_CODE (original_call, CALL_EXPR);
10809       patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
10810     }
10811
10812   /* If CHECK is set, then we are building a check to see if the object
10813      is NULL.  */
10814   if (check != NULL_TREE)
10815     {
10816       /* We have to call force_evaluation_order now because creating a
10817          COMPOUND_EXPR wraps the arg list in a way that makes it
10818          unrecognizable by force_evaluation_order later.  Yuk.  */
10819       patch = build (COMPOUND_EXPR, TREE_TYPE (patch), check, 
10820                      force_evaluation_order (patch));
10821       TREE_SIDE_EFFECTS (patch) = 1;
10822     }
10823
10824   /* In order to be able to modify PATCH later, we SAVE_EXPR it and
10825      put it as the first expression of a COMPOUND_EXPR. The second
10826      expression being an empty statement to be later patched if
10827      necessary. We remember a TREE_LIST (the PURPOSE is the method,
10828      the VALUE is the compound) in a hashtable and return a
10829      COMPOUND_EXPR built so that the result of the evaluation of the
10830      original PATCH node is returned. */
10831   if (STATIC_CLASS_INIT_OPT_P ()
10832       && current_function_decl && METHOD_STATIC (method))
10833     {
10834       tree list;
10835       tree fndecl = current_function_decl;
10836       /* We have to call force_evaluation_order now because creating a
10837          COMPOUND_EXPR wraps the arg list in a way that makes it
10838          unrecognizable by force_evaluation_order later.  Yuk.  */
10839       tree save = force_evaluation_order (patch);
10840       tree type = TREE_TYPE (patch);
10841
10842       patch = build (COMPOUND_EXPR, type, save, build_java_empty_stmt ());
10843       list = tree_cons (method, patch,
10844                         DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl));
10845
10846       DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list;
10847
10848       patch = build (COMPOUND_EXPR, type, patch, save);
10849     }
10850
10851   return patch;
10852 }
10853
10854 static int
10855 invocation_mode (tree method, int super)
10856 {
10857   int access = get_access_flags_from_decl (method);
10858
10859   if (super)
10860     return INVOKE_SUPER;
10861
10862   if (access & ACC_STATIC)
10863     return INVOKE_STATIC;
10864
10865   /* We have to look for a constructor before we handle nonvirtual
10866      calls; otherwise the constructor will look nonvirtual.  */
10867   if (DECL_CONSTRUCTOR_P (method))
10868     return INVOKE_STATIC;
10869
10870   if (access & ACC_FINAL || access & ACC_PRIVATE)
10871     return INVOKE_NONVIRTUAL;
10872
10873   if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
10874     return INVOKE_NONVIRTUAL;
10875
10876   if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
10877     return INVOKE_INTERFACE;
10878
10879   return INVOKE_VIRTUAL;
10880 }
10881
10882 /* Retrieve a refined list of matching methods. It covers the step
10883    15.11.2 (Compile-Time Step 2) */
10884
10885 static tree
10886 lookup_method_invoke (int lc, tree cl, tree class, tree name, tree arg_list)
10887 {
10888   tree atl = end_params_node;           /* Arg Type List */
10889   tree method, signature, list, node;
10890   const char *candidates;               /* Used for error report */
10891   char *dup;
10892
10893   /* Fix the arguments */
10894   for (node = arg_list; node; node = TREE_CHAIN (node))
10895     {
10896       tree current_arg = TREE_TYPE (TREE_VALUE (node));
10897       /* Non primitive type may have to be resolved */
10898       if (!JPRIMITIVE_TYPE_P (current_arg))
10899         resolve_and_layout (current_arg, NULL_TREE);
10900       /* And promoted */
10901       if (TREE_CODE (current_arg) == RECORD_TYPE)
10902         current_arg = promote_type (current_arg);
10903       atl = tree_cons (NULL_TREE, current_arg, atl);
10904     }
10905
10906   /* Presto. If we're dealing with an anonymous class and a
10907      constructor call, generate the right constructor now, since we
10908      know the arguments' types. */
10909
10910   if (lc && ANONYMOUS_CLASS_P (class))
10911     {
10912       tree saved_current_class;
10913       tree mdecl = craft_constructor (TYPE_NAME (class), atl);
10914       saved_current_class = current_class;
10915       current_class = class;
10916       fix_constructors (mdecl);
10917       current_class = saved_current_class;
10918     }
10919
10920   /* Find all candidates and then refine the list, searching for the
10921      most specific method. */
10922   list = find_applicable_accessible_methods_list (lc, class, name, atl);
10923   list = find_most_specific_methods_list (list);
10924   if (list && !TREE_CHAIN (list))
10925     return TREE_VALUE (list);
10926
10927   /* Issue an error. List candidates if any. Candidates are listed
10928      only if accessible (non accessible methods may end-up here for
10929      the sake of a better error report). */
10930   candidates = NULL;
10931   if (list)
10932     {
10933       tree current;
10934       obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
10935       for (current = list; current; current = TREE_CHAIN (current))
10936         {
10937           tree cm = TREE_VALUE (current);
10938           char string [4096];
10939           if (!cm || not_accessible_p (class, cm, NULL_TREE, 0))
10940             continue;
10941           sprintf
10942             (string, "  `%s' in `%s'%s",
10943              get_printable_method_name (cm),
10944              IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
10945              (TREE_CHAIN (current) ? "\n" : ""));
10946           obstack_grow (&temporary_obstack, string, strlen (string));
10947         }
10948       obstack_1grow (&temporary_obstack, '\0');
10949       candidates = obstack_finish (&temporary_obstack);
10950     }
10951   /* Issue the error message */
10952   method = make_node (FUNCTION_TYPE);
10953   TYPE_ARG_TYPES (method) = atl;
10954   signature = build_java_argument_signature (method);
10955   dup = xstrdup (lang_printable_name (class, 0));
10956   parse_error_context (cl, "Can't find %s `%s(%s)' in type `%s'%s",
10957                        (lc ? "constructor" : "method"),
10958                        (lc ? dup : IDENTIFIER_POINTER (name)),
10959                        IDENTIFIER_POINTER (signature), dup,
10960                        (candidates ? candidates : ""));
10961   free (dup);
10962   return NULL_TREE;
10963 }
10964
10965 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
10966    when we're looking for a constructor. */
10967
10968 static tree
10969 find_applicable_accessible_methods_list (int lc, tree class, tree name,
10970                                          tree arglist)
10971 {
10972   static htab_t searched_classes;
10973   static int search_not_done = 0;
10974   tree list = NULL_TREE, all_list = NULL_TREE;
10975   tree base_binfo;
10976   int i;
10977
10978   /* Check the hash table to determine if this class has been searched
10979      already. */
10980   if (searched_classes)
10981     {
10982       if (htab_find (searched_classes, class) != NULL)
10983         return NULL;
10984     }
10985   else
10986     {
10987       searched_classes = htab_create (10, htab_hash_pointer,
10988                                       htab_eq_pointer, NULL);
10989     }
10990
10991   search_not_done++;
10992   *htab_find_slot (searched_classes, class, INSERT) = class;
10993
10994   if (!CLASS_LOADED_P (class))
10995     {
10996       load_class (class, 1);
10997       safe_layout_class (class);
10998     }
10999
11000   /* Search interfaces */
11001   if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL
11002       && CLASS_INTERFACE (TYPE_NAME (class)))
11003     {
11004       search_applicable_methods_list (lc, TYPE_METHODS (class),
11005                                       name, arglist, &list, &all_list);
11006       for (i = 1; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
11007         {
11008           tree t = BINFO_TYPE (base_binfo);
11009           tree rlist;
11010           
11011           rlist = find_applicable_accessible_methods_list (lc,  t, name,
11012                                                            arglist);
11013           list = chainon (rlist, list);
11014         }
11015     }
11016   /* Search classes */
11017   else
11018     {
11019       search_applicable_methods_list (lc, TYPE_METHODS (class),
11020                                       name, arglist, &list, &all_list);
11021
11022       /* When looking finit$, class$ or instinit$, we turn LC to 1 so
11023          that we only search in class. Note that we should have found
11024          something at this point. */
11025       if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name))
11026         {
11027           lc = 1;
11028           if (!list)
11029             abort ();
11030         }
11031
11032       /* We must search all interfaces of this class */
11033       if (!lc)
11034         {
11035           for (i = 1;
11036                BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
11037             {
11038               tree t = BINFO_TYPE (base_binfo);
11039               if (t != object_type_node)
11040                 {
11041                   tree rlist
11042                     = find_applicable_accessible_methods_list (lc, t,
11043                                                                name, arglist);
11044                   list = chainon (rlist, list);
11045                 }
11046             }
11047         }
11048
11049       /* Search superclass */
11050       if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
11051         {
11052           tree rlist;
11053           class = CLASSTYPE_SUPER (class);
11054           rlist = find_applicable_accessible_methods_list (lc, class,
11055                                                            name, arglist);
11056           list = chainon (rlist, list);
11057         }
11058     }
11059
11060   search_not_done--;
11061
11062   /* We're done. Reset the searched classes list and finally search
11063      java.lang.Object if it wasn't searched already. */
11064   if (!search_not_done)
11065     {
11066       if (!lc
11067           && TYPE_METHODS (object_type_node)
11068           && htab_find (searched_classes, object_type_node) == NULL)
11069         {
11070           search_applicable_methods_list (lc,
11071                                           TYPE_METHODS (object_type_node),
11072                                           name, arglist, &list, &all_list);
11073         }
11074       htab_delete (searched_classes);
11075       searched_classes = NULL;
11076     }
11077
11078   /* Either return the list obtained or all selected (but
11079      inaccessible) methods for better error report. */
11080   return (!list ? all_list : list);
11081 }
11082
11083 /* Effectively search for the appropriate method in method */
11084
11085 static void
11086 search_applicable_methods_list (int lc, tree method, tree name, tree arglist,
11087                                 tree *list, tree *all_list)
11088 {
11089   for (; method; method = TREE_CHAIN (method))
11090     {
11091       /* When dealing with constructor, stop here, otherwise search
11092          other classes */
11093       if (lc && !DECL_CONSTRUCTOR_P (method))
11094         continue;
11095       else if (!lc && (DECL_CONSTRUCTOR_P (method)
11096                        || (DECL_NAME (method) != name)))
11097         continue;
11098
11099       if (argument_types_convertible (method, arglist))
11100         {
11101           /* Retain accessible methods only */
11102           if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
11103                                  method, NULL_TREE, 0))
11104             *list = tree_cons (NULL_TREE, method, *list);
11105           else
11106             /* Also retain all selected method here */
11107             *all_list = tree_cons (NULL_TREE, method, *list);
11108         }
11109     }
11110 }
11111
11112 /* 15.11.2.2 Choose the Most Specific Method */
11113
11114 static tree
11115 find_most_specific_methods_list (tree list)
11116 {
11117   int max = 0;
11118   int abstract, candidates;
11119   tree current, new_list = NULL_TREE;
11120   for (current = list; current; current = TREE_CHAIN (current))
11121     {
11122       tree method;
11123       DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
11124
11125       for (method = list; method; method = TREE_CHAIN (method))
11126         {
11127           tree method_v, current_v;
11128           /* Don't test a method against itself */
11129           if (method == current)
11130             continue;
11131
11132           method_v = TREE_VALUE (method);
11133           current_v = TREE_VALUE (current);
11134
11135           /* Compare arguments and location where methods where declared */
11136           if (argument_types_convertible (method_v, current_v))
11137             {
11138               if (valid_method_invocation_conversion_p
11139                   (DECL_CONTEXT (method_v), DECL_CONTEXT (current_v))
11140                   || (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v))
11141                       && enclosing_context_p (DECL_CONTEXT (method_v),
11142                                               DECL_CONTEXT (current_v))))
11143                 {
11144                   int v = (DECL_SPECIFIC_COUNT (current_v) +=
11145                     (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v)) ? 2 : 1));
11146                   max = (v > max ? v : max);
11147                 }
11148             }
11149         }
11150     }
11151
11152   /* Review the list and select the maximally specific methods */
11153   for (current = list, abstract = -1, candidates = -1;
11154        current; current = TREE_CHAIN (current))
11155     if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11156       {
11157         new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11158         abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0);
11159         candidates++;
11160       }
11161
11162   /* If we have several and they're all abstract, just pick the
11163      closest one. */
11164   if (candidates > 0 && candidates == abstract)
11165     {
11166       /* FIXME: merge the throws clauses.  There is no convenient way
11167          to do this in gcj right now, since ideally we'd like to
11168          introduce a new METHOD_DECL here, but that is really not
11169          possible.  */
11170       new_list = nreverse (new_list);
11171       TREE_CHAIN (new_list) = NULL_TREE;
11172       return new_list;
11173     }
11174
11175   /* We have several (we couldn't find a most specific), all but one
11176      are abstract, we pick the only non abstract one. */
11177   if (candidates > 0 && (candidates == abstract+1))
11178     {
11179       for (current = new_list; current; current = TREE_CHAIN (current))
11180         if (!METHOD_ABSTRACT (TREE_VALUE (current)))
11181           {
11182             TREE_CHAIN (current) = NULL_TREE;
11183             new_list = current;
11184           }
11185     }
11186
11187   /* If we can't find one, lower expectations and try to gather multiple
11188      maximally specific methods */
11189   while (!new_list && max)
11190     {
11191       while (--max > 0)
11192         {
11193           if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11194             new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11195         }
11196     }
11197
11198   return new_list;
11199 }
11200
11201 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
11202    converted by method invocation conversion (5.3) to the type of the
11203    corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
11204    to change less often than M1. */
11205
11206 static GTY(()) tree m2_arg_value;
11207 static GTY(()) tree m2_arg_cache;
11208
11209 static int
11210 argument_types_convertible (tree m1, tree m2_or_arglist)
11211 {
11212   tree m1_arg, m2_arg;
11213
11214   SKIP_THIS_AND_ARTIFICIAL_PARMS (m1_arg, m1)
11215
11216   if (m2_arg_value == m2_or_arglist)
11217     m2_arg = m2_arg_cache;
11218   else
11219     {
11220       /* M2_OR_ARGLIST can be a function DECL or a raw list of
11221          argument types */
11222       if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
11223         {
11224           m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
11225           if (!METHOD_STATIC (m2_or_arglist))
11226             m2_arg = TREE_CHAIN (m2_arg);
11227         }
11228       else
11229         m2_arg = m2_or_arglist;
11230
11231       m2_arg_value = m2_or_arglist;
11232       m2_arg_cache = m2_arg;
11233     }
11234
11235   while (m1_arg != end_params_node && m2_arg != end_params_node)
11236     {
11237       resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
11238       if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
11239                                                  TREE_VALUE (m2_arg)))
11240         break;
11241       m1_arg = TREE_CHAIN (m1_arg);
11242       m2_arg = TREE_CHAIN (m2_arg);
11243     }
11244   return m1_arg == end_params_node && m2_arg == end_params_node;
11245 }
11246
11247 /* Qualification routines */
11248
11249 /* Given a name x.y.z, look up x locally.  If it's found, save the
11250    decl.  If it's not found, mark the name as RESOLVE_PACKAGE_NAME_P,
11251    so that we later try and load the appropriate classes.  */
11252 static void
11253 qualify_ambiguous_name (tree id)
11254 {
11255   tree name, decl;
11256
11257   /* We inspect the first item of the qualification list.  As a sanity
11258      check, make sure that it is an identfier node.  */
11259   tree qual = EXPR_WFL_QUALIFICATION (id);
11260   tree qual_wfl = QUAL_WFL (qual);
11261
11262   if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
11263     return;
11264
11265   name = EXPR_WFL_NODE (qual_wfl);
11266
11267   /* If we don't have an identifier, or we have a 'this' or 'super',
11268      then field access processing is all we need : there is nothing
11269      for us to do.  */
11270   if (!name || TREE_CODE (name) != IDENTIFIER_NODE ||
11271       name == this_identifier_node ||
11272       name == super_identifier_node)
11273     return;
11274
11275   /* If name appears within the scope of a local variable declaration
11276      or parameter declaration, or is a field within an enclosing
11277      class, then it is an expression name.  Save the decl and let
11278      resolve_field_access do it's work.  */
11279   if ((decl = IDENTIFIER_LOCAL_VALUE (name)) ||
11280       (decl = lookup_field_wrapper (current_class, name)))
11281     {
11282       QUAL_RESOLUTION (qual) = decl;
11283       return;
11284     }
11285
11286   /* If name is a known class name (either declared or imported), mark
11287      us as a type name.  */
11288   if ((decl = resolve_and_layout (name, NULL_TREE)))
11289     {
11290       RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
11291       QUAL_RESOLUTION (qual) = decl;
11292     }
11293
11294   /* Check here that NAME isn't declared by more than one
11295      type-import-on-demand declaration of the compilation unit
11296      containing NAME. FIXME */
11297
11298   /* We couldn't find a declaration for the name.  Assume for now that
11299      we have a qualified class name that needs to be loaded from an
11300      external class file.  */
11301   else
11302     RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
11303
11304   /* Propagate the qualification across other components of the
11305      qualified name */
11306   for (qual = TREE_CHAIN (qual); qual;
11307        qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
11308     {
11309       if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11310         RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
11311     }
11312
11313   /* Store the global qualification for the ambiguous part of ID back
11314      into ID fields */
11315   if (RESOLVE_TYPE_NAME_P (qual_wfl))
11316     RESOLVE_TYPE_NAME_P (id) = 1;
11317   else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11318     RESOLVE_PACKAGE_NAME_P (id) = 1;
11319 }
11320
11321 /* Patch tree nodes in a function body. When a BLOCK is found, push
11322    local variable decls if present.
11323    Same as java_complete_lhs, but does resolve static finals to values. */
11324
11325 static tree
11326 java_complete_tree (tree node)
11327 {
11328   node = java_complete_lhs (node);
11329   if (JDECL_P (node) && CLASS_FINAL_VARIABLE_P (node)
11330       && DECL_INITIAL (node) != NULL_TREE
11331       && !flag_emit_xref)
11332     {
11333       tree value = fold_constant_for_init (node, node);
11334       if (value != NULL_TREE)
11335         return value;
11336     }
11337   return node;
11338 }
11339
11340 static tree
11341 java_stabilize_reference (tree node)
11342 {
11343   if (TREE_CODE (node) == COMPOUND_EXPR)
11344     {
11345       tree op0 = TREE_OPERAND (node, 0);
11346       tree op1 = TREE_OPERAND (node, 1);
11347       TREE_OPERAND (node, 0) = save_expr (op0);
11348       TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
11349       return node;
11350     }
11351   return stabilize_reference (node);
11352 }
11353
11354 /* Patch tree nodes in a function body. When a BLOCK is found, push
11355    local variable decls if present.
11356    Same as java_complete_tree, but does not resolve static finals to values. */
11357
11358 static tree
11359 java_complete_lhs (tree node)
11360 {
11361   tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
11362   int flag;
11363
11364   /* CONVERT_EXPR always has its type set, even though it needs to be
11365      worked out. */
11366   if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
11367     return node;
11368
11369   /* The switch block implements cases processing container nodes
11370      first.  Contained nodes are always written back. Leaves come
11371      next and return a value. */
11372   switch (TREE_CODE (node))
11373     {
11374     case BLOCK:
11375
11376       /* 1- Block section.
11377          Set the local values on decl names so we can identify them
11378          faster when they're referenced. At that stage, identifiers
11379          are legal so we don't check for declaration errors. */
11380       for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11381         {
11382           DECL_CONTEXT (cn) = current_function_decl;
11383           IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
11384         }
11385       if (BLOCK_EXPR_BODY (node) == NULL_TREE)
11386           CAN_COMPLETE_NORMALLY (node) = 1;
11387       else
11388         {
11389           tree stmt = BLOCK_EXPR_BODY (node);
11390           tree *ptr;
11391           int error_seen = 0;
11392           if (TREE_CODE (stmt) == COMPOUND_EXPR)
11393             {
11394               /* Re-order from (((A; B); C); ...; Z) to
11395                  (A; (B; (C ; (...; Z)))).
11396                  This makes it easier to scan the statements left-to-right
11397                  without using recursion (which might overflow the stack
11398                  if the block has many statements. */
11399               for (;;)
11400                 {
11401                   tree left = TREE_OPERAND (stmt, 0);
11402                   if (TREE_CODE (left) != COMPOUND_EXPR)
11403                     break;
11404                   TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
11405                   TREE_OPERAND (left, 1) = stmt;
11406                   stmt = left;
11407                 }
11408               BLOCK_EXPR_BODY (node) = stmt;
11409             }
11410
11411           /* Now do the actual complete, without deep recursion for
11412              long blocks. */
11413           ptr = &BLOCK_EXPR_BODY (node);
11414           while (TREE_CODE (*ptr) == COMPOUND_EXPR
11415                  && !IS_EMPTY_STMT (TREE_OPERAND (*ptr, 1)))
11416             {
11417               tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
11418               tree *next = &TREE_OPERAND (*ptr, 1);
11419               TREE_OPERAND (*ptr, 0) = cur;
11420               if (IS_EMPTY_STMT (cur))
11421                 {
11422                   /* Optimization;  makes it easier to detect empty bodies.
11423                      Most useful for <clinit> with all-constant initializer. */
11424                   *ptr = *next;
11425                   continue;
11426                 }
11427               if (TREE_CODE (cur) == ERROR_MARK)
11428                 error_seen++;
11429               else if (! CAN_COMPLETE_NORMALLY (cur))
11430                 {
11431                   wfl_op2 = *next;
11432                   for (;;)
11433                     {
11434                       if (TREE_CODE (wfl_op2) == BLOCK)
11435                         wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
11436                       else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
11437                         wfl_op2 = TREE_OPERAND (wfl_op2, 0);
11438                       else
11439                         break;
11440                     }
11441                   if (TREE_CODE (wfl_op2) != CASE_EXPR
11442                       && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
11443                     unreachable_stmt_error (*ptr);
11444                 }
11445               if (TREE_TYPE (*ptr) == NULL_TREE)
11446                 TREE_TYPE (*ptr) = void_type_node;
11447               ptr = next;
11448             }
11449           *ptr = java_complete_tree (*ptr);
11450
11451           if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
11452             return error_mark_node;
11453           CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
11454         }
11455       /* Turn local bindings to null */
11456       for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11457         IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
11458
11459       TREE_TYPE (node) = void_type_node;
11460       break;
11461
11462       /* 2- They are expressions but ultimately deal with statements */
11463
11464     case THROW_EXPR:
11465       wfl_op1 = TREE_OPERAND (node, 0);
11466       COMPLETE_CHECK_OP_0 (node);
11467       /* 14.19 A throw statement cannot complete normally. */
11468       CAN_COMPLETE_NORMALLY (node) = 0;
11469       return patch_throw_statement (node, wfl_op1);
11470
11471     case SYNCHRONIZED_EXPR:
11472       wfl_op1 = TREE_OPERAND (node, 0);
11473       return patch_synchronized_statement (node, wfl_op1);
11474
11475     case TRY_EXPR:
11476       return patch_try_statement (node);
11477
11478     case TRY_FINALLY_EXPR:
11479       COMPLETE_CHECK_OP_0 (node);
11480       COMPLETE_CHECK_OP_1 (node);
11481       if (IS_EMPTY_STMT (TREE_OPERAND (node, 0)))
11482         /* Reduce try/finally nodes with an empty try block.  */
11483         return TREE_OPERAND (node, 1);
11484       if (IS_EMPTY_STMT (TREE_OPERAND (node, 1)))
11485         /* Likewise for an empty finally block.  */
11486         return TREE_OPERAND (node, 0);
11487       CAN_COMPLETE_NORMALLY (node)
11488         = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11489            && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11490       TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
11491       return node;
11492
11493     case LABELED_BLOCK_EXPR:
11494       PUSH_LABELED_BLOCK (node);
11495       if (LABELED_BLOCK_BODY (node))
11496         COMPLETE_CHECK_OP_1 (node);
11497       TREE_TYPE (node) = void_type_node;
11498       POP_LABELED_BLOCK ();
11499
11500       if (IS_EMPTY_STMT (LABELED_BLOCK_BODY (node)))
11501         {
11502           LABELED_BLOCK_BODY (node) = NULL_TREE;
11503           CAN_COMPLETE_NORMALLY (node) = 1;
11504         }
11505       else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
11506         CAN_COMPLETE_NORMALLY (node) = 1;
11507       return node;
11508
11509     case EXIT_BLOCK_EXPR:
11510       /* We don't complete operand 1, because it's the return value of
11511          the EXIT_BLOCK_EXPR which doesn't exist it Java */
11512       return patch_bc_statement (node);
11513
11514     case CASE_EXPR:
11515       cn = java_complete_tree (TREE_OPERAND (node, 0));
11516       if (cn == error_mark_node)
11517         return cn;
11518
11519       /* First, the case expression must be constant. Values of final
11520          fields are accepted. */
11521       cn = fold (cn);
11522       if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
11523           && JDECL_P (TREE_OPERAND (cn, 1))
11524           && FIELD_FINAL (TREE_OPERAND (cn, 1))
11525           && DECL_INITIAL (TREE_OPERAND (cn, 1)))
11526         {
11527           cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
11528                                        TREE_OPERAND (cn, 1));
11529         }
11530       /* Accept final locals too. */
11531       else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn) 
11532                && DECL_INITIAL (cn))
11533         cn = fold_constant_for_init (DECL_INITIAL (cn), cn);
11534
11535       if (!TREE_CONSTANT (cn) && !flag_emit_xref)
11536         {
11537           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11538           parse_error_context (node, "Constant expression required");
11539           return error_mark_node;
11540         }
11541
11542       nn = ctxp->current_loop;
11543
11544       /* It must be assignable to the type of the switch expression. */
11545       if (!try_builtin_assignconv (NULL_TREE,
11546                                    TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
11547         {
11548           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11549           parse_error_context
11550             (wfl_operator,
11551              "Incompatible type for case. Can't convert `%s' to `int'",
11552              lang_printable_name (TREE_TYPE (cn), 0));
11553           return error_mark_node;
11554         }
11555
11556       cn = fold (convert (int_type_node, cn));
11557       TREE_CONSTANT_OVERFLOW (cn) = 0;
11558       CAN_COMPLETE_NORMALLY (cn) = 1;
11559
11560       /* Save the label on a list so that we can later check for
11561          duplicates.  */
11562       case_label_list = tree_cons (node, cn, case_label_list);
11563
11564       /* Multiple instance of a case label bearing the same value is
11565          checked later. The case expression is all right so far. */
11566       if (TREE_CODE (cn) == VAR_DECL)
11567         cn = DECL_INITIAL (cn);
11568       TREE_OPERAND (node, 0) = cn;
11569       TREE_TYPE (node) = void_type_node;
11570       CAN_COMPLETE_NORMALLY (node) = 1;
11571       TREE_SIDE_EFFECTS (node) = 1;
11572       break;
11573
11574     case DEFAULT_EXPR:
11575       nn = ctxp->current_loop;
11576       /* Only one default label is allowed per switch statement */
11577       if (SWITCH_HAS_DEFAULT (nn))
11578         {
11579           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11580           parse_error_context (wfl_operator,
11581                                "Duplicate case label: `default'");
11582           return error_mark_node;
11583         }
11584       else
11585         SWITCH_HAS_DEFAULT (nn) = 1;
11586       TREE_TYPE (node) = void_type_node;
11587       TREE_SIDE_EFFECTS (node) = 1;
11588       CAN_COMPLETE_NORMALLY (node) = 1;
11589       break;
11590
11591     case SWITCH_EXPR:
11592     case LOOP_EXPR:
11593       PUSH_LOOP (node);
11594       /* Check whether the loop was enclosed in a labeled
11595          statement. If not, create one, insert the loop in it and
11596          return the node */
11597       nn = patch_loop_statement (node);
11598
11599       /* Anyways, walk the body of the loop */
11600       if (TREE_CODE (node) == LOOP_EXPR)
11601         TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11602       /* Switch statement: walk the switch expression and the cases */
11603       else
11604         node = patch_switch_statement (node);
11605
11606       if (node == error_mark_node || TREE_OPERAND (node, 0) == error_mark_node)
11607         nn = error_mark_node;
11608       else
11609         {
11610           TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
11611           /* If we returned something different, that's because we
11612              inserted a label. Pop the label too. */
11613           if (nn != node)
11614             {
11615               if (CAN_COMPLETE_NORMALLY (node))
11616                 CAN_COMPLETE_NORMALLY (nn) = 1;
11617               POP_LABELED_BLOCK ();
11618             }
11619         }
11620       POP_LOOP ();
11621       return nn;
11622
11623     case EXIT_EXPR:
11624       TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11625       return patch_exit_expr (node);
11626
11627     case COND_EXPR:
11628       /* Condition */
11629       TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11630       if (TREE_OPERAND (node, 0) == error_mark_node)
11631         return error_mark_node;
11632       /* then-else branches */
11633       TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11634       if (TREE_OPERAND (node, 1) == error_mark_node)
11635         return error_mark_node;
11636       TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
11637       if (TREE_OPERAND (node, 2) == error_mark_node)
11638         return error_mark_node;
11639       return patch_if_else_statement (node);
11640       break;
11641
11642     case CONDITIONAL_EXPR:
11643       /* Condition */
11644       wfl_op1 = TREE_OPERAND (node, 0);
11645       COMPLETE_CHECK_OP_0 (node);
11646       wfl_op2 = TREE_OPERAND (node, 1);
11647       COMPLETE_CHECK_OP_1 (node);
11648       wfl_op3 = TREE_OPERAND (node, 2);
11649       COMPLETE_CHECK_OP_2 (node);
11650       return patch_conditional_expr (node, wfl_op1, wfl_op2);
11651
11652       /* 3- Expression section */
11653     case COMPOUND_EXPR:
11654       wfl_op2 = TREE_OPERAND (node, 1);
11655       TREE_OPERAND (node, 0) = nn =
11656         java_complete_tree (TREE_OPERAND (node, 0));
11657       if (IS_EMPTY_STMT (wfl_op2))
11658         CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
11659       else
11660         {
11661           if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
11662             {
11663               /* An unreachable condition in a do-while statement
11664                  is *not* (technically) an unreachable statement. */
11665               nn = wfl_op2;
11666               if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
11667                 nn = EXPR_WFL_NODE (nn);
11668               /* NN can be NULL_TREE exactly when UPDATE is, in
11669                  finish_for_loop.  */
11670               if (nn != NULL_TREE && TREE_CODE (nn) != EXIT_EXPR)
11671                 {
11672                   SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
11673                   if (SUPPRESS_UNREACHABLE_ERROR (nn))
11674                     {
11675                       /* Perhaps this warning should have an
11676                          associated flag.  The code being compiled is
11677                          pedantically correct, but useless.  */
11678                       parse_warning_context (wfl_operator,
11679                                              "Unreachable statement");
11680                     }
11681                   else
11682                     parse_error_context (wfl_operator,
11683                                          "Unreachable statement");
11684                 }
11685             }
11686           TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11687           if (TREE_OPERAND (node, 1) == error_mark_node)
11688             return error_mark_node;
11689           /* Even though we might allow the case where the first
11690              operand doesn't return normally, we still should compute
11691              CAN_COMPLETE_NORMALLY correctly.  */
11692           CAN_COMPLETE_NORMALLY (node)
11693             = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11694                && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11695         }
11696       TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
11697       break;
11698
11699     case RETURN_EXPR:
11700       /* CAN_COMPLETE_NORMALLY (node) = 0; */
11701       return patch_return (node);
11702
11703     case EXPR_WITH_FILE_LOCATION:
11704       if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
11705           || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
11706         {
11707           tree wfl = node;
11708           node = resolve_expression_name (node, NULL);
11709           if (node == error_mark_node)
11710             return node;
11711           /* Keep line number information somewhere were it doesn't
11712              disrupt the completion process. */
11713           if (flag_emit_xref && TREE_CODE (node) != CALL_EXPR)
11714             {
11715               EXPR_WFL_NODE (wfl) = TREE_OPERAND (node, 1);
11716               TREE_OPERAND (node, 1) = wfl;
11717             }
11718           CAN_COMPLETE_NORMALLY (node) = 1;
11719         }
11720       else
11721         {
11722           tree body;
11723           int save_lineno = input_line;
11724           input_line = EXPR_WFL_LINENO (node);
11725           body = java_complete_tree (EXPR_WFL_NODE (node));
11726           input_line = save_lineno;
11727           EXPR_WFL_NODE (node) = body;
11728           TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
11729           CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
11730           if (IS_EMPTY_STMT (body) || TREE_CONSTANT (body))
11731             {
11732               /* Makes it easier to constant fold, detect empty bodies. */
11733               return body;
11734             }
11735           if (body == error_mark_node)
11736             {
11737               /* Its important for the evaluation of assignment that
11738                  this mark on the TREE_TYPE is propagated. */
11739               TREE_TYPE (node) = error_mark_node;
11740               return error_mark_node;
11741             }
11742           else
11743             TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
11744
11745         }
11746       break;
11747
11748     case NEW_ARRAY_EXPR:
11749       /* Patch all the dimensions */
11750       flag = 0;
11751       for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
11752         {
11753           int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
11754           tree dim = convert (int_type_node,
11755                               java_complete_tree (TREE_VALUE (cn)));
11756           if (dim == error_mark_node)
11757             {
11758               flag = 1;
11759               continue;
11760             }
11761           else
11762             {
11763               TREE_VALUE (cn) = dim;
11764               /* Setup the location of the current dimension, for
11765                  later error report. */
11766               TREE_PURPOSE (cn) =
11767                 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
11768               EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
11769             }
11770         }
11771       /* They complete the array creation expression, if no errors
11772          were found. */
11773       CAN_COMPLETE_NORMALLY (node) = 1;
11774       return (flag ? error_mark_node
11775               : force_evaluation_order (patch_newarray (node)));
11776
11777     case NEW_ANONYMOUS_ARRAY_EXPR:
11778       /* Create the array type if necessary. */
11779       if (ANONYMOUS_ARRAY_DIMS_SIG (node))
11780         {
11781           tree type = ANONYMOUS_ARRAY_BASE_TYPE (node);
11782           if (!(type = resolve_type_during_patch (type)))
11783             return error_mark_node;
11784           type = build_array_from_name (type, NULL_TREE,
11785                                         ANONYMOUS_ARRAY_DIMS_SIG (node), NULL);
11786           ANONYMOUS_ARRAY_BASE_TYPE (node) = build_pointer_type (type);
11787         }
11788       node = patch_new_array_init (ANONYMOUS_ARRAY_BASE_TYPE (node),
11789                                    ANONYMOUS_ARRAY_INITIALIZER (node));
11790       if (node == error_mark_node)
11791         return error_mark_node;
11792       CAN_COMPLETE_NORMALLY (node) = 1;
11793       return node;
11794
11795     case NEW_CLASS_EXPR:
11796     case CALL_EXPR:
11797       /* Complete function's argument(s) first */
11798       if (complete_function_arguments (node))
11799         return error_mark_node;
11800       else
11801         {
11802           tree decl, wfl = TREE_OPERAND (node, 0);
11803           int in_this = CALL_THIS_CONSTRUCTOR_P (node);
11804           int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
11805                            super_identifier_node);
11806           tree arguments;
11807           int location = EXPR_WFL_LINECOL (node);
11808
11809           node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
11810                                           from_super, 0, &decl);
11811           if (node == error_mark_node)
11812             return error_mark_node;
11813
11814           if (TREE_CODE (node) == CALL_EXPR
11815               && TREE_OPERAND (node, 1) != NULL_TREE)
11816             arguments = TREE_VALUE (TREE_OPERAND (node, 1));
11817           else
11818             arguments = NULL_TREE;
11819           check_thrown_exceptions (location, decl, arguments);
11820           /* If we call this(...), register signature and positions */
11821           if (in_this)
11822             DECL_CONSTRUCTOR_CALLS (current_function_decl) =
11823               tree_cons (wfl, decl,
11824                          DECL_CONSTRUCTOR_CALLS (current_function_decl));
11825           CAN_COMPLETE_NORMALLY (node) = 1;
11826           return force_evaluation_order (node);
11827         }
11828
11829     case MODIFY_EXPR:
11830       /* Save potential wfls */
11831       wfl_op1 = TREE_OPERAND (node, 0);
11832       TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
11833
11834       if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
11835           && TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
11836           && DECL_INITIAL (nn) != NULL_TREE)
11837         {
11838           tree value;
11839
11840           value = fold_constant_for_init (nn, nn);
11841
11842           /* When we have a primitype type, or a string and we're not
11843              emitting a class file, we actually don't want to generate
11844              anything for the assignment. */
11845           if (value != NULL_TREE && 
11846               (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) || 
11847                (TREE_TYPE (value) == string_ptr_type_node &&
11848                 ! flag_emit_class_files)))
11849             {
11850               /* Prepare node for patch_assignment */
11851               TREE_OPERAND (node, 1) = value;
11852               /* Call patch assignment to verify the assignment */
11853               if (patch_assignment (node, wfl_op1) == error_mark_node)
11854                 return error_mark_node;
11855               /* Set DECL_INITIAL properly (a conversion might have
11856                  been decided by patch_assignment) and return the
11857                  empty statement. */
11858               else
11859                 {
11860                   tree patched = patch_string (TREE_OPERAND (node, 1));
11861                   if (patched)
11862                     DECL_INITIAL (nn) = patched;
11863                   else
11864                     DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
11865                   DECL_FIELD_FINAL_IUD (nn) = 1;
11866                   return build_java_empty_stmt ();
11867                 }
11868             }
11869           if (! flag_emit_class_files)
11870             DECL_INITIAL (nn) = NULL_TREE;
11871         }
11872       wfl_op2 = TREE_OPERAND (node, 1);
11873
11874       if (TREE_OPERAND (node, 0) == error_mark_node)
11875         return error_mark_node;
11876
11877       flag = COMPOUND_ASSIGN_P (wfl_op2);
11878       if (flag)
11879         {
11880           /* This might break when accessing outer field from inner
11881              class. TESTME, FIXME */
11882           tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
11883
11884           /* Hand stabilize the lhs on both places */
11885           TREE_OPERAND (node, 0) = lvalue;
11886           TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
11887             (flag_emit_class_files ? lvalue : save_expr (lvalue));
11888
11889           /* 15.25.2.a: Left hand is not an array access. FIXME */
11890           /* Now complete the RHS. We write it back later on. */
11891           nn = java_complete_tree (TREE_OPERAND (node, 1));
11892
11893           if ((cn = patch_string (nn)))
11894             nn = cn;
11895
11896           /* The last part of the rewrite for E1 op= E2 is to have
11897              E1 = (T)(E1 op E2), with T being the type of E1. */
11898           nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
11899                                                TREE_TYPE (lvalue), nn));
11900
11901           /* If the assignment is compound and has reference type,
11902              then ensure the LHS has type String and nothing else.  */
11903           if (JREFERENCE_TYPE_P (TREE_TYPE (lvalue))
11904               && ! JSTRING_TYPE_P (TREE_TYPE (lvalue)))
11905             parse_error_context (wfl_op2,
11906                                  "Incompatible type for `+='. Can't convert `%s' to `java.lang.String'",
11907                                  lang_printable_name (TREE_TYPE (lvalue), 0));
11908
11909           /* 15.25.2.b: Left hand is an array access. FIXME */
11910         }
11911
11912       /* If we're about to patch a NEW_ARRAY_INIT, we call a special
11913          function to complete this RHS. Note that a NEW_ARRAY_INIT
11914          might have been already fully expanded if created as a result
11915          of processing an anonymous array initializer. We avoid doing
11916          the operation twice by testing whether the node already bears
11917          a type. */
11918       else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT && !TREE_TYPE (wfl_op2))
11919         nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
11920                                    TREE_OPERAND (node, 1));
11921       /* Otherwise we simply complete the RHS */
11922       else
11923         nn = java_complete_tree (TREE_OPERAND (node, 1));
11924
11925       if (nn == error_mark_node)
11926         return error_mark_node;
11927
11928       /* Write back the RHS as we evaluated it. */
11929       TREE_OPERAND (node, 1) = nn;
11930
11931       /* In case we're handling = with a String as a RHS, we need to
11932          produce a String out of the RHS (it might still be a
11933          STRING_CST or a StringBuffer at this stage */
11934       if ((nn = patch_string (TREE_OPERAND (node, 1))))
11935         TREE_OPERAND (node, 1) = nn;
11936
11937       if ((nn = outer_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
11938                                         TREE_OPERAND (node, 1))))
11939         {
11940           /* We return error_mark_node if outer_field_access_fix
11941              detects we write into a final. */
11942           if (nn == error_mark_node)
11943             return error_mark_node;
11944           node = nn;
11945         }
11946       else
11947         {
11948           node = patch_assignment (node, wfl_op1);
11949           if (node == error_mark_node)
11950             return error_mark_node;
11951           /* Reorganize the tree if necessary. */
11952           if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
11953                        || JSTRING_P (TREE_TYPE (node))))
11954             node = java_refold (node);
11955         }
11956
11957       /* Seek to set DECL_INITIAL to a proper value, since it might have
11958          undergone a conversion in patch_assignment. We do that only when
11959          it's necessary to have DECL_INITIAL properly set. */
11960       nn = TREE_OPERAND (node, 0);
11961       if (TREE_CODE (nn) == VAR_DECL
11962           && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn))
11963           && FIELD_STATIC (nn) && FIELD_FINAL (nn)
11964           && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn))
11965               || TREE_TYPE (nn) == string_ptr_type_node))
11966         DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
11967
11968       CAN_COMPLETE_NORMALLY (node) = 1;
11969       return node;
11970
11971     case MULT_EXPR:
11972     case PLUS_EXPR:
11973     case MINUS_EXPR:
11974     case LSHIFT_EXPR:
11975     case RSHIFT_EXPR:
11976     case URSHIFT_EXPR:
11977     case BIT_AND_EXPR:
11978     case BIT_XOR_EXPR:
11979     case BIT_IOR_EXPR:
11980     case TRUNC_MOD_EXPR:
11981     case TRUNC_DIV_EXPR:
11982     case RDIV_EXPR:
11983     case TRUTH_ANDIF_EXPR:
11984     case TRUTH_ORIF_EXPR:
11985     case EQ_EXPR:
11986     case NE_EXPR:
11987     case GT_EXPR:
11988     case GE_EXPR:
11989     case LT_EXPR:
11990     case LE_EXPR:
11991       /* Operands 0 and 1 are WFL in certain cases only. patch_binop
11992          knows how to handle those cases. */
11993       wfl_op1 = TREE_OPERAND (node, 0);
11994       wfl_op2 = TREE_OPERAND (node, 1);
11995
11996       CAN_COMPLETE_NORMALLY (node) = 1;
11997       /* Don't complete string nodes if dealing with the PLUS operand. */
11998       if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
11999         {
12000           nn = java_complete_tree (wfl_op1);
12001           if (nn == error_mark_node)
12002             return error_mark_node;
12003
12004           TREE_OPERAND (node, 0) = nn;
12005         }
12006       if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
12007         {
12008           nn = java_complete_tree (wfl_op2);
12009           if (nn == error_mark_node)
12010             return error_mark_node;
12011
12012           TREE_OPERAND (node, 1) = nn;
12013         }
12014       return patch_binop (node, wfl_op1, wfl_op2);
12015
12016     case INSTANCEOF_EXPR:
12017       wfl_op1 = TREE_OPERAND (node, 0);
12018       COMPLETE_CHECK_OP_0 (node);
12019       if (flag_emit_xref)
12020         {
12021           TREE_TYPE (node) = boolean_type_node;
12022           return node;
12023         }
12024       return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
12025
12026     case UNARY_PLUS_EXPR:
12027     case NEGATE_EXPR:
12028     case TRUTH_NOT_EXPR:
12029     case BIT_NOT_EXPR:
12030     case PREDECREMENT_EXPR:
12031     case PREINCREMENT_EXPR:
12032     case POSTDECREMENT_EXPR:
12033     case POSTINCREMENT_EXPR:
12034     case CONVERT_EXPR:
12035       /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
12036          how to handle those cases. */
12037       wfl_op1 = TREE_OPERAND (node, 0);
12038       CAN_COMPLETE_NORMALLY (node) = 1;
12039       TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12040       if (TREE_OPERAND (node, 0) == error_mark_node)
12041         return error_mark_node;
12042       node = patch_unaryop (node, wfl_op1);
12043       CAN_COMPLETE_NORMALLY (node) = 1;
12044       break;
12045
12046     case ARRAY_REF:
12047       /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
12048          how to handle those cases. */
12049       wfl_op1 = TREE_OPERAND (node, 0);
12050       TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12051       if (TREE_OPERAND (node, 0) == error_mark_node)
12052         return error_mark_node;
12053       if (!flag_emit_class_files && !flag_emit_xref)
12054         TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
12055       /* The same applies to wfl_op2 */
12056       wfl_op2 = TREE_OPERAND (node, 1);
12057       TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
12058       if (TREE_OPERAND (node, 1) == error_mark_node)
12059         return error_mark_node;
12060       if (!flag_emit_class_files && !flag_emit_xref)
12061         TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
12062       return patch_array_ref (node);
12063
12064     case RECORD_TYPE:
12065       return node;;
12066
12067     case COMPONENT_REF:
12068       /* The first step in the re-write of qualified name handling.  FIXME.
12069          So far, this is only to support PRIMTYPE.class -> PRIMCLASS.TYPE. */
12070       TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
12071       if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
12072         {
12073           tree name = TREE_OPERAND (node, 1);
12074           tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
12075           if (field == NULL_TREE)
12076             {
12077               error ("missing static field `%s'", IDENTIFIER_POINTER (name));
12078               return error_mark_node;
12079             }
12080           if (! FIELD_STATIC (field))
12081             {
12082               error ("not a static field `%s'", IDENTIFIER_POINTER (name));
12083               return error_mark_node;
12084             }
12085           return field;
12086         }
12087       else
12088         abort ();
12089       break;
12090
12091     case THIS_EXPR:
12092       /* Can't use THIS in a static environment */
12093       if (!current_this)
12094         {
12095           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12096           parse_error_context (wfl_operator,
12097                                "Keyword `this' used outside allowed context");
12098           TREE_TYPE (node) = error_mark_node;
12099           return error_mark_node;
12100         }
12101       if (ctxp->explicit_constructor_p)
12102         {
12103           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12104           parse_error_context
12105             (wfl_operator, "Can't reference `this' or `super' before the superclass constructor has been called");
12106           TREE_TYPE (node) = error_mark_node;
12107           return error_mark_node;
12108         }
12109       return current_this;
12110
12111     case CLASS_LITERAL:
12112       CAN_COMPLETE_NORMALLY (node) = 1;
12113       node = patch_incomplete_class_ref (node);
12114       if (node == error_mark_node)
12115         return error_mark_node;
12116       break;
12117
12118     default:
12119       CAN_COMPLETE_NORMALLY (node) = 1;
12120       /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
12121          and it's time to turn it into the appropriate String object */
12122       if ((nn = patch_string (node)))
12123         node = nn;
12124       else
12125         internal_error ("No case for %s", tree_code_name [TREE_CODE (node)]);
12126     }
12127   return node;
12128 }
12129
12130 /* Complete function call's argument. Return a nonzero value is an
12131    error was found.  */
12132
12133 static int
12134 complete_function_arguments (tree node)
12135 {
12136   int flag = 0;
12137   tree cn;
12138
12139   ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12140   for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
12141     {
12142       tree wfl = TREE_VALUE (cn), parm, temp;
12143       parm = java_complete_tree (wfl);
12144
12145       if (parm == error_mark_node)
12146         {
12147           flag = 1;
12148           continue;
12149         }
12150       /* If we have a string literal that we haven't transformed yet or a
12151          crafted string buffer, as a result of the use of the String
12152          `+' operator. Build `parm.toString()' and expand it. */
12153       if ((temp = patch_string (parm)))
12154         parm = temp;
12155
12156       TREE_VALUE (cn) = parm;
12157     }
12158   ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12159   return flag;
12160 }
12161
12162 /* Sometimes (for loops and variable initialized during their
12163    declaration), we want to wrap a statement around a WFL and turn it
12164    debugable.  */
12165
12166 static tree
12167 build_debugable_stmt (int location, tree stmt)
12168 {
12169   if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
12170     {
12171       stmt = build_expr_wfl (stmt, input_filename, 0, 0);
12172       EXPR_WFL_LINECOL (stmt) = location;
12173     }
12174   JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
12175   return stmt;
12176 }
12177
12178 static tree
12179 build_expr_block (tree body, tree decls)
12180 {
12181   tree node = make_node (BLOCK);
12182   BLOCK_EXPR_DECLS (node) = decls;
12183   BLOCK_EXPR_BODY (node) = body;
12184   if (body)
12185     TREE_TYPE (node) = TREE_TYPE (body);
12186   TREE_SIDE_EFFECTS (node) = 1;
12187   return node;
12188 }
12189
12190 /* Create a new function block and link it appropriately to current
12191    function block chain */
12192
12193 static tree
12194 enter_block (void)
12195 {
12196   tree b = build_expr_block (NULL_TREE, NULL_TREE);
12197
12198   /* Link block B supercontext to the previous block. The current
12199      function DECL is used as supercontext when enter_a_block is called
12200      for the first time for a given function. The current function body
12201      (DECL_FUNCTION_BODY) is set to be block B.  */
12202
12203   tree fndecl = current_function_decl;
12204
12205   if (!fndecl) {
12206     BLOCK_SUPERCONTEXT (b) = current_static_block;
12207     current_static_block = b;
12208   }
12209
12210   else if (!DECL_FUNCTION_BODY (fndecl))
12211     {
12212       BLOCK_SUPERCONTEXT (b) = fndecl;
12213       DECL_FUNCTION_BODY (fndecl) = b;
12214     }
12215   else
12216     {
12217       BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
12218       DECL_FUNCTION_BODY (fndecl) = b;
12219     }
12220   return b;
12221 }
12222
12223 /* Exit a block by changing the current function body
12224    (DECL_FUNCTION_BODY) to the current block super context, only if
12225    the block being exited isn't the method's top level one.  */
12226
12227 static tree
12228 exit_block (void)
12229 {
12230   tree b;
12231   if (current_function_decl)
12232     {
12233       b = DECL_FUNCTION_BODY (current_function_decl);
12234       if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
12235         DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
12236     }
12237   else
12238     {
12239       b = current_static_block;
12240
12241       if (BLOCK_SUPERCONTEXT (b))
12242         current_static_block = BLOCK_SUPERCONTEXT (b);
12243     }
12244   return b;
12245 }
12246
12247 /* Lookup for NAME in the nested function's blocks, all the way up to
12248    the current toplevel one. It complies with Java's local variable
12249    scoping rules.  */
12250
12251 static tree
12252 lookup_name_in_blocks (tree name)
12253 {
12254   tree b = GET_CURRENT_BLOCK (current_function_decl);
12255
12256   while (b != current_function_decl)
12257     {
12258       tree current;
12259
12260       /* Paranoid sanity check. To be removed */
12261       if (TREE_CODE (b) != BLOCK)
12262         abort ();
12263
12264       for (current = BLOCK_EXPR_DECLS (b); current;
12265            current = TREE_CHAIN (current))
12266         if (DECL_NAME (current) == name)
12267           return current;
12268       b = BLOCK_SUPERCONTEXT (b);
12269     }
12270   return NULL_TREE;
12271 }
12272
12273 static void
12274 maybe_absorb_scoping_blocks (void)
12275 {
12276   while (BLOCK_IS_IMPLICIT (GET_CURRENT_BLOCK (current_function_decl)))
12277     {
12278       tree b = exit_block ();
12279       java_method_add_stmt (current_function_decl, b);
12280       SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", input_line));
12281     }
12282 }
12283
12284 \f
12285 /* This section of the source is reserved to build_* functions that
12286    are building incomplete tree nodes and the patch_* functions that
12287    are completing them.  */
12288
12289 /* Wrap a non WFL node around a WFL.  */
12290
12291 static tree
12292 build_wfl_wrap (tree node, int location)
12293 {
12294   tree wfl, node_to_insert = node;
12295
12296   /* We want to process THIS . xxx symbolically, to keep it consistent
12297      with the way we're processing SUPER. A THIS from a primary as a
12298      different form than a SUPER. Turn THIS into something symbolic */
12299   if (TREE_CODE (node) == THIS_EXPR)
12300     node_to_insert = wfl = build_wfl_node (this_identifier_node);
12301   else
12302     wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
12303
12304   EXPR_WFL_LINECOL (wfl) = location;
12305   EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
12306   return wfl;
12307 }
12308
12309 /* Build a super() constructor invocation. Returns an empty statement if
12310    we're currently dealing with the class java.lang.Object. */
12311
12312 static tree
12313 build_super_invocation (tree mdecl)
12314 {
12315   if (DECL_CONTEXT (mdecl) == object_type_node)
12316     return build_java_empty_stmt ();
12317   else
12318     {
12319       tree super_wfl = build_wfl_node (super_identifier_node);
12320       tree a = NULL_TREE, t;
12321
12322       /* This is called after parsing is done, so the parser context
12323          won't be accurate. Set location info from current_class decl. */
12324       tree class_wfl = lookup_cl (TYPE_NAME (current_class));
12325       EXPR_WFL_LINECOL (super_wfl) = EXPR_WFL_LINECOL (class_wfl);
12326
12327       /* If we're dealing with an anonymous class, pass the arguments
12328          of the crafted constructor along. */
12329       if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
12330         {
12331           SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
12332           for (; t != end_params_node; t = TREE_CHAIN (t))
12333             a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
12334         }
12335       return build_method_invocation (super_wfl, a);
12336     }
12337 }
12338
12339 /* Build a SUPER/THIS qualified method invocation.  */
12340
12341 static tree
12342 build_this_super_qualified_invocation (int use_this, tree name, tree args,
12343                                        int lloc, int rloc)
12344 {
12345   tree invok;
12346   tree wfl =
12347     build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
12348   EXPR_WFL_LINECOL (wfl) = lloc;
12349   invok = build_method_invocation (name, args);
12350   return make_qualified_primary (wfl, invok, rloc);
12351 }
12352
12353 /* Build an incomplete CALL_EXPR node. */
12354
12355 static tree
12356 build_method_invocation (tree name, tree args)
12357 {
12358   tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
12359   TREE_SIDE_EFFECTS (call) = 1;
12360   EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12361   return call;
12362 }
12363
12364 /* Build an incomplete new xxx(...) node. */
12365
12366 static tree
12367 build_new_invocation (tree name, tree args)
12368 {
12369   tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
12370   TREE_SIDE_EFFECTS (call) = 1;
12371   EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12372   return call;
12373 }
12374
12375 /* Build an incomplete assignment expression. */
12376
12377 static tree
12378 build_assignment (int op, int op_location, tree lhs, tree rhs)
12379 {
12380   tree assignment;
12381   /* Build the corresponding binop if we deal with a Compound
12382      Assignment operator. Mark the binop sub-tree as part of a
12383      Compound Assignment expression */
12384   if (op != ASSIGN_TK)
12385     {
12386       rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
12387       COMPOUND_ASSIGN_P (rhs) = 1;
12388     }
12389   assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
12390   TREE_SIDE_EFFECTS (assignment) = 1;
12391   EXPR_WFL_LINECOL (assignment) = op_location;
12392   return assignment;
12393 }
12394
12395 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12396    the buffer.  This is used only for string conversion.  */
12397 static char *
12398 string_convert_int_cst (tree node)
12399 {
12400   /* Long.MIN_VALUE is -9223372036854775808, 20 characters.  */
12401   static char buffer[21];
12402
12403   unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
12404   unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
12405   char *p = buffer + sizeof (buffer);
12406   int neg = 0;
12407
12408   unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
12409                                   << (HOST_BITS_PER_WIDE_INT - 1));
12410
12411   *--p = '\0';
12412
12413   /* If negative, note the fact and negate the value.  */
12414   if ((hi & hibit))
12415     {
12416       lo = ~lo;
12417       hi = ~hi;
12418       if (++lo == 0)
12419         ++hi;
12420       neg = 1;
12421     }
12422
12423   /* Divide by 10 until there are no bits left.  */
12424   do
12425     {
12426       unsigned HOST_WIDE_INT acc = 0;
12427       unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
12428       unsigned int i;
12429
12430       /* Use long division to compute the result and the remainder.  */
12431       for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
12432         {
12433           /* Shift a bit into accumulator.  */
12434           acc <<= 1;
12435           if ((hi & hibit))
12436             acc |= 1;
12437
12438           /* Shift the value.  */
12439           hi <<= 1;
12440           if ((lo & hibit))
12441             hi |= 1;
12442           lo <<= 1;
12443
12444           /* Shift the correct bit into the result.  */
12445           outhi <<= 1;
12446           if ((outlo & hibit))
12447             outhi |= 1;
12448           outlo <<= 1;
12449           if (acc >= 10)
12450             {
12451               acc -= 10;
12452               outlo |= 1;
12453             }
12454         }
12455
12456       /* '0' == 060 in Java, but might not be here (think EBCDIC).  */
12457       *--p = '\060' + acc;
12458
12459       hi = outhi;
12460       lo = outlo;
12461     }
12462   while (hi || lo);
12463
12464   if (neg)
12465     *--p = '\055'; /* '-' == 055 in Java, but might not be here.  */
12466
12467   return p;
12468 }
12469
12470 /* Print an INTEGER_CST node in a static buffer, and return the
12471    buffer.  This is used only for error handling.  */
12472 char *
12473 print_int_node (tree node)
12474 {
12475   static char buffer [80];
12476   if (TREE_CONSTANT_OVERFLOW (node))
12477     sprintf (buffer, "<overflow>");
12478
12479   if (TREE_INT_CST_HIGH (node) == 0)
12480     sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
12481              TREE_INT_CST_LOW (node));
12482   else if (TREE_INT_CST_HIGH (node) == -1
12483            && TREE_INT_CST_LOW (node) != 0)
12484     sprintf (buffer, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
12485              -TREE_INT_CST_LOW (node));
12486   else
12487     sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
12488              TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
12489
12490   return buffer;
12491 }
12492
12493 \f
12494 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12495    context.  */
12496
12497 /* 15.25 Assignment operators. */
12498
12499 static tree
12500 patch_assignment (tree node, tree wfl_op1)
12501 {
12502   tree rhs = TREE_OPERAND (node, 1);
12503   tree lvalue = TREE_OPERAND (node, 0), llvalue;
12504   tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
12505   int error_found = 0;
12506   int lvalue_from_array = 0;
12507   int is_return = 0;
12508
12509   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12510
12511   /* Lhs can be a named variable */
12512   if (JDECL_P (lvalue))
12513     {
12514       lhs_type = TREE_TYPE (lvalue);
12515     }
12516   /* Or Lhs can be an array access. */
12517   else if (TREE_CODE (lvalue) == ARRAY_REF)
12518     {
12519       lhs_type = TREE_TYPE (lvalue);
12520       lvalue_from_array = 1;
12521     }
12522   /* Or a field access */
12523   else if (TREE_CODE (lvalue) == COMPONENT_REF)
12524     lhs_type = TREE_TYPE (lvalue);
12525   /* Or a function return slot */
12526   else if (TREE_CODE (lvalue) == RESULT_DECL)
12527     {
12528       /* If the return type is an integral type, then we create the
12529          RESULT_DECL with a promoted type, but we need to do these
12530          checks against the unpromoted type to ensure type safety.  So
12531          here we look at the real type, not the type of the decl we
12532          are modifying.  */
12533       lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
12534       is_return = 1;
12535     }
12536   /* Otherwise, we might want to try to write into an optimized static
12537      final, this is an of a different nature, reported further on. */
12538   else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
12539            && resolve_expression_name (wfl_op1, &llvalue))
12540     {
12541       lhs_type = TREE_TYPE (lvalue);
12542     }
12543   else
12544     {
12545       parse_error_context (wfl_op1, "Invalid left hand side of assignment");
12546       error_found = 1;
12547     }
12548
12549   rhs_type = TREE_TYPE (rhs);
12550
12551   /* 5.1 Try the assignment conversion for builtin type. */
12552   new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
12553
12554   /* 5.2 If it failed, try a reference conversion */
12555   if (!new_rhs)
12556     new_rhs = try_reference_assignconv (lhs_type, rhs);
12557
12558   /* 15.25.2 If we have a compound assignment, convert RHS into the
12559      type of the LHS */
12560   else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12561     new_rhs = convert (lhs_type, rhs);
12562
12563   /* Explicit cast required. This is an error */
12564   if (!new_rhs)
12565     {
12566       char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
12567       char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
12568       tree wfl;
12569       char operation [32];      /* Max size known */
12570
12571       /* If the assignment is part of a declaration, we use the WFL of
12572          the declared variable to point out the error and call it a
12573          declaration problem. If the assignment is a genuine =
12574          operator, we call is a operator `=' problem, otherwise we
12575          call it an assignment problem. In both of these last cases,
12576          we use the WFL of the operator to indicate the error. */
12577
12578       if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
12579         {
12580           wfl = wfl_op1;
12581           strcpy (operation, "declaration");
12582         }
12583       else
12584         {
12585           wfl = wfl_operator;
12586           if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12587             strcpy (operation, "assignment");
12588           else if (is_return)
12589             strcpy (operation, "`return'");
12590           else
12591             strcpy (operation, "`='");
12592         }
12593
12594       if (!valid_cast_to_p (rhs_type, lhs_type))
12595         parse_error_context
12596           (wfl, "Incompatible type for %s. Can't convert `%s' to `%s'",
12597            operation, t1, t2);
12598       else
12599         parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert `%s' to `%s'",
12600                              operation, t1, t2);
12601       free (t1); free (t2);
12602       error_found = 1;
12603     }
12604
12605   if (error_found)
12606     return error_mark_node;
12607
12608   /* If we're processing a `return' statement, promote the actual type
12609      to the promoted type.  */
12610   if (is_return)
12611     new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
12612
12613   /* 10.10: Array Store Exception runtime check */
12614   if (!flag_emit_class_files
12615       && !flag_emit_xref
12616       && lvalue_from_array
12617       && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
12618     {
12619       tree array, store_check, base, index_expr;
12620
12621       /* Save RHS so that it doesn't get re-evaluated by the store check. */
12622       new_rhs = save_expr (new_rhs);
12623
12624       /* Get the INDIRECT_REF. */
12625       array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
12626       /* Get the array pointer expr. */
12627       array = TREE_OPERAND (array, 0);
12628       store_check = build_java_arraystore_check (array, new_rhs);
12629
12630       index_expr = TREE_OPERAND (lvalue, 1);
12631
12632       if (TREE_CODE (index_expr) == COMPOUND_EXPR)
12633         {
12634           /* A COMPOUND_EXPR here is a bounds check. The bounds check must
12635              happen before the store check, so prepare to insert the store
12636              check within the second operand of the existing COMPOUND_EXPR. */
12637           base = index_expr;
12638         }
12639       else
12640         base = lvalue;
12641
12642       index_expr = TREE_OPERAND (base, 1);
12643       TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr),
12644                                       store_check, index_expr);
12645     }
12646
12647   /* Final locals can be used as case values in switch
12648      statement. Prepare them for this eventuality. */
12649   if (TREE_CODE (lvalue) == VAR_DECL
12650       && DECL_FINAL (lvalue)
12651       && TREE_CONSTANT (new_rhs)
12652       && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
12653       && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
12654       )
12655     {
12656       TREE_CONSTANT (lvalue) = 1;
12657       TREE_INVARIANT (lvalue) = 1;
12658       DECL_INITIAL (lvalue) = new_rhs;
12659     }
12660
12661   /* Copy the rhs if it's a reference.  */
12662   if (! flag_check_references && ! flag_emit_class_files && optimize > 0)
12663     {
12664       switch (TREE_CODE (new_rhs))
12665         {
12666         case ARRAY_REF:
12667         case INDIRECT_REF:
12668         case COMPONENT_REF:
12669           /* Transform a = foo.bar 
12670              into a = ({int tmp; tmp = foo.bar;}).
12671              We need to ensure that if a read from memory fails
12672              because of a NullPointerException, a destination variable
12673              will remain unchanged.  An explicit temporary does what
12674              we need.  
12675
12676              If flag_check_references is set, this is unnecessary
12677              because we'll check each reference before doing any
12678              reads.  If optimize is not set the result will never be
12679              written to a stack slot that contains the LHS.  */
12680           {
12681             tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"), 
12682                                    TREE_TYPE (new_rhs));
12683             tree block = make_node (BLOCK);
12684             tree assignment 
12685               = build (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
12686             DECL_CONTEXT (tmp) = current_function_decl;
12687             TREE_TYPE (block) = TREE_TYPE (new_rhs);
12688             BLOCK_VARS (block) = tmp;
12689             BLOCK_EXPR_BODY (block) = assignment;
12690             TREE_SIDE_EFFECTS (block) = 1;
12691             new_rhs = block;
12692           }
12693           break;
12694         default:
12695           break;
12696         }
12697     }
12698
12699   TREE_OPERAND (node, 0) = lvalue;
12700   TREE_OPERAND (node, 1) = new_rhs;
12701   TREE_TYPE (node) = lhs_type;
12702   return node;
12703 }
12704
12705 /* Check that type SOURCE can be cast into type DEST. If the cast
12706    can't occur at all, return NULL; otherwise, return a possibly
12707    modified rhs.  */
12708
12709 static tree
12710 try_reference_assignconv (tree lhs_type, tree rhs)
12711 {
12712   tree new_rhs = NULL_TREE;
12713   tree rhs_type = TREE_TYPE (rhs);
12714
12715   if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
12716     {
12717       /* `null' may be assigned to any reference type */
12718       if (rhs == null_pointer_node)
12719         new_rhs = null_pointer_node;
12720       /* Try the reference assignment conversion */
12721       else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
12722         new_rhs = rhs;
12723       /* This is a magic assignment that we process differently */
12724       else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
12725         new_rhs = rhs;
12726     }
12727   return new_rhs;
12728 }
12729
12730 /* Check that RHS can be converted into LHS_TYPE by the assignment
12731    conversion (5.2), for the cases of RHS being a builtin type. Return
12732    NULL_TREE if the conversion fails or if because RHS isn't of a
12733    builtin type. Return a converted RHS if the conversion is possible.  */
12734
12735 static tree
12736 try_builtin_assignconv (tree wfl_op1, tree lhs_type, tree rhs)
12737 {
12738   tree new_rhs = NULL_TREE;
12739   tree rhs_type = TREE_TYPE (rhs);
12740
12741   /* Handle boolean specially.  */
12742   if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12743       || TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12744     {
12745       if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12746           && TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12747         new_rhs = rhs;
12748     }
12749
12750   /* 5.1.1 Try Identity Conversion,
12751      5.1.2 Try Widening Primitive Conversion */
12752   else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
12753     new_rhs = convert (lhs_type, rhs);
12754
12755   /* Try a narrowing primitive conversion (5.1.3):
12756        - expression is a constant expression of type byte, short, char,
12757          or int, AND
12758        - variable is byte, short or char AND
12759        - The value of the expression is representable in the type of the
12760          variable */
12761   else if ((rhs_type == byte_type_node || rhs_type == short_type_node
12762             || rhs_type == char_type_node || rhs_type == int_type_node)
12763             && TREE_CONSTANT (rhs)
12764            && (lhs_type == byte_type_node || lhs_type == char_type_node
12765                || lhs_type == short_type_node))
12766     {
12767       if (int_fits_type_p (rhs, lhs_type))
12768         new_rhs = convert (lhs_type, rhs);
12769       else if (wfl_op1)         /* Might be called with a NULL */
12770         parse_warning_context
12771           (wfl_op1, "Constant expression `%s' too wide for narrowing primitive conversion to `%s'",
12772            print_int_node (rhs), lang_printable_name (lhs_type, 0));
12773       /* Reported a warning that will turn into an error further
12774          down, so we don't return */
12775     }
12776
12777   return new_rhs;
12778 }
12779
12780 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
12781    conversion (5.1.1) or widening primitive conversion (5.1.2).  Return
12782    0 is the conversion test fails.  This implements parts the method
12783    invocation conversion (5.3).  */
12784
12785 static int
12786 valid_builtin_assignconv_identity_widening_p (tree lhs_type, tree rhs_type)
12787 {
12788   /* 5.1.1: This is the identity conversion part. */
12789   if (lhs_type == rhs_type)
12790     return 1;
12791
12792   /* Reject non primitive types and boolean conversions.  */
12793   if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
12794     return 0;
12795
12796   /* 5.1.2: widening primitive conversion. byte, even if it's smaller
12797      than a char can't be converted into a char. Short can't too, but
12798      the < test below takes care of that */
12799   if (lhs_type == char_type_node && rhs_type == byte_type_node)
12800     return 0;
12801
12802   /* Accept all promoted type here. Note, we can't use <= in the test
12803      below, because we still need to bounce out assignments of short
12804      to char and the likes */
12805   if (lhs_type == int_type_node
12806       && (rhs_type == promoted_byte_type_node
12807           || rhs_type == promoted_short_type_node
12808           || rhs_type == promoted_char_type_node
12809           || rhs_type == promoted_boolean_type_node))
12810     return 1;
12811
12812   /* From here, an integral is widened if its precision is smaller
12813      than the precision of the LHS or if the LHS is a floating point
12814      type, or the RHS is a float and the RHS a double. */
12815   if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
12816        && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
12817       || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
12818       || (rhs_type == float_type_node && lhs_type == double_type_node))
12819     return 1;
12820
12821   return 0;
12822 }
12823
12824 /* Check that something of SOURCE type can be assigned or cast to
12825    something of DEST type at runtime. Return 1 if the operation is
12826    valid, 0 otherwise. If CAST is set to 1, we're treating the case
12827    were SOURCE is cast into DEST, which borrows a lot of the
12828    assignment check. */
12829
12830 static int
12831 valid_ref_assignconv_cast_p (tree source, tree dest, int cast)
12832 {
12833   /* SOURCE or DEST might be null if not from a declared entity. */
12834   if (!source || !dest)
12835     return 0;
12836   if (JNULLP_TYPE_P (source))
12837     return 1;
12838   if (TREE_CODE (source) == POINTER_TYPE)
12839     source = TREE_TYPE (source);
12840   if (TREE_CODE (dest) == POINTER_TYPE)
12841     dest = TREE_TYPE (dest);
12842
12843   /* If source and dest are being compiled from bytecode, they may need to
12844      be loaded. */
12845   if (CLASS_P (source) && !CLASS_LOADED_P (source))
12846     {
12847       load_class (source, 1);
12848       safe_layout_class (source);
12849     }
12850   if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
12851     {
12852       load_class (dest, 1);
12853       safe_layout_class (dest);
12854     }
12855
12856   /* Case where SOURCE is a class type */
12857   if (TYPE_CLASS_P (source))
12858     {
12859       if (TYPE_CLASS_P (dest))
12860         return  (source == dest
12861                  || inherits_from_p (source, dest)
12862                  || (cast && inherits_from_p (dest, source)));
12863       if (TYPE_INTERFACE_P (dest))
12864         {
12865           /* If doing a cast and SOURCE is final, the operation is
12866              always correct a compile time (because even if SOURCE
12867              does not implement DEST, a subclass of SOURCE might). */
12868           if (cast && !CLASS_FINAL (TYPE_NAME (source)))
12869             return 1;
12870           /* Otherwise, SOURCE must implement DEST */
12871           return interface_of_p (dest, source);
12872         }
12873       /* DEST is an array, cast permitted if SOURCE is of Object type */
12874       return (cast && source == object_type_node ? 1 : 0);
12875     }
12876   if (TYPE_INTERFACE_P (source))
12877     {
12878       if (TYPE_CLASS_P (dest))
12879         {
12880           /* If not casting, DEST must be the Object type */
12881           if (!cast)
12882             return dest == object_type_node;
12883           /* We're doing a cast. The cast is always valid is class
12884              DEST is not final, otherwise, DEST must implement SOURCE */
12885           else if (!CLASS_FINAL (TYPE_NAME (dest)))
12886             return 1;
12887           else
12888             return interface_of_p (source, dest);
12889         }
12890       if (TYPE_INTERFACE_P (dest))
12891         {
12892           /* If doing a cast, then if SOURCE and DEST contain method
12893              with the same signature but different return type, then
12894              this is a (compile time) error */
12895           if (cast)
12896             {
12897               tree method_source, method_dest;
12898               tree source_type;
12899               tree source_sig;
12900               tree source_name;
12901               for (method_source = TYPE_METHODS (source); method_source;
12902                    method_source = TREE_CHAIN (method_source))
12903                 {
12904                   source_sig =
12905                     build_java_argument_signature (TREE_TYPE (method_source));
12906                   source_type = TREE_TYPE (TREE_TYPE (method_source));
12907                   source_name = DECL_NAME (method_source);
12908                   for (method_dest = TYPE_METHODS (dest);
12909                        method_dest; method_dest = TREE_CHAIN (method_dest))
12910                     if (source_sig ==
12911                         build_java_argument_signature (TREE_TYPE (method_dest))
12912                         && source_name == DECL_NAME (method_dest)
12913                         && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
12914                       return 0;
12915                 }
12916               return 1;
12917             }
12918           else
12919             return source == dest || interface_of_p (dest, source);
12920         }
12921       else
12922         {
12923           /* Array */
12924           return (cast
12925                   && (DECL_NAME (TYPE_NAME (source))
12926                       == java_lang_cloneable_identifier_node
12927                       || (DECL_NAME (TYPE_NAME (source))
12928                           == java_io_serializable_identifier_node)));
12929         }
12930     }
12931   if (TYPE_ARRAY_P (source))
12932     {
12933       if (TYPE_CLASS_P (dest))
12934         return dest == object_type_node;
12935       /* Can't cast an array to an interface unless the interface is
12936          java.lang.Cloneable or java.io.Serializable.  */
12937       if (TYPE_INTERFACE_P (dest))
12938         return (DECL_NAME (TYPE_NAME (dest))
12939                 == java_lang_cloneable_identifier_node
12940                 || (DECL_NAME (TYPE_NAME (dest))
12941                     == java_io_serializable_identifier_node));
12942       else                      /* Arrays */
12943         {
12944           tree source_element_type = TYPE_ARRAY_ELEMENT (source);
12945           tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
12946
12947           /* In case of severe errors, they turn out null */
12948           if (!dest_element_type || !source_element_type)
12949             return 0;
12950           if (source_element_type == dest_element_type)
12951             return 1;
12952           return valid_ref_assignconv_cast_p (source_element_type,
12953                                               dest_element_type, cast);
12954         }
12955       return 0;
12956     }
12957   return 0;
12958 }
12959
12960 static int
12961 valid_cast_to_p (tree source, tree dest)
12962 {
12963   if (TREE_CODE (source) == POINTER_TYPE)
12964     source = TREE_TYPE (source);
12965   if (TREE_CODE (dest) == POINTER_TYPE)
12966     dest = TREE_TYPE (dest);
12967
12968   if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
12969     return valid_ref_assignconv_cast_p (source, dest, 1);
12970
12971   else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
12972     return 1;
12973
12974   else if (TREE_CODE (source) == BOOLEAN_TYPE
12975            && TREE_CODE (dest) == BOOLEAN_TYPE)
12976     return 1;
12977
12978   return 0;
12979 }
12980
12981 static tree
12982 do_unary_numeric_promotion (tree arg)
12983 {
12984   tree type = TREE_TYPE (arg);
12985   if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
12986       || TREE_CODE (type) == CHAR_TYPE)
12987     arg = convert (int_type_node, arg);
12988   return arg;
12989 }
12990
12991 /* Return a nonzero value if SOURCE can be converted into DEST using
12992    the method invocation conversion rule (5.3).  */
12993 static int
12994 valid_method_invocation_conversion_p (tree dest, tree source)
12995 {
12996   return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
12997            && valid_builtin_assignconv_identity_widening_p (dest, source))
12998           || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
12999               && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
13000               && valid_ref_assignconv_cast_p (source, dest, 0)));
13001 }
13002
13003 /* Build an incomplete binop expression. */
13004
13005 static tree
13006 build_binop (enum tree_code op, int op_location, tree op1, tree op2)
13007 {
13008   tree binop = build (op, NULL_TREE, op1, op2);
13009   TREE_SIDE_EFFECTS (binop) = 1;
13010   /* Store the location of the operator, for better error report. The
13011      string of the operator will be rebuild based on the OP value. */
13012   EXPR_WFL_LINECOL (binop) = op_location;
13013   return binop;
13014 }
13015
13016 /* Build the string of the operator retained by NODE. If NODE is part
13017    of a compound expression, add an '=' at the end of the string. This
13018    function is called when an error needs to be reported on an
13019    operator. The string is returned as a pointer to a static character
13020    buffer. */
13021
13022 static char *
13023 operator_string (tree node)
13024 {
13025 #define BUILD_OPERATOR_STRING(S)                                        \
13026   {                                                                     \
13027     sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
13028     return buffer;                                                      \
13029   }
13030
13031   static char buffer [10];
13032   switch (TREE_CODE (node))
13033     {
13034     case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
13035     case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
13036     case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
13037     case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13038     case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
13039     case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
13040     case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
13041     case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
13042     case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
13043     case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
13044     case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
13045     case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
13046     case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
13047     case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
13048     case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
13049     case GT_EXPR: BUILD_OPERATOR_STRING (">");
13050     case GE_EXPR: BUILD_OPERATOR_STRING (">=");
13051     case LT_EXPR: BUILD_OPERATOR_STRING ("<");
13052     case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
13053     case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13054     case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
13055     case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
13056     case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
13057     case PREINCREMENT_EXPR:     /* Fall through */
13058     case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
13059     case PREDECREMENT_EXPR:     /* Fall through */
13060     case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
13061     default:
13062       internal_error ("unregistered operator %s",
13063                       tree_code_name [TREE_CODE (node)]);
13064     }
13065   return NULL;
13066 #undef BUILD_OPERATOR_STRING
13067 }
13068
13069 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2.  */
13070
13071 static int
13072 java_decl_equiv (tree var_acc1, tree var_acc2)
13073 {
13074   if (JDECL_P (var_acc1))
13075     return (var_acc1 == var_acc2);
13076
13077   return (TREE_CODE (var_acc1) == COMPONENT_REF
13078           && TREE_CODE (var_acc2) == COMPONENT_REF
13079           && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
13080              == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
13081           && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
13082 }
13083
13084 /* Return a nonzero value if CODE is one of the operators that can be
13085    used in conjunction with the `=' operator in a compound assignment.  */
13086
13087 static int
13088 binop_compound_p (enum tree_code code)
13089 {
13090   int i;
13091   for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
13092     if (binop_lookup [i] == code)
13093       break;
13094
13095   return i < BINOP_COMPOUND_CANDIDATES;
13096 }
13097
13098 /* Reorganize after a fold to get SAVE_EXPR to generate what we want.  */
13099
13100 static tree
13101 java_refold (tree t)
13102 {
13103   tree c, b, ns, decl;
13104
13105   if (TREE_CODE (t) != MODIFY_EXPR)
13106     return t;
13107
13108   c = TREE_OPERAND (t, 1);
13109   if (! (c && TREE_CODE (c) == COMPOUND_EXPR
13110          && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
13111          && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
13112     return t;
13113
13114   /* Now the left branch of the binary operator. */
13115   b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
13116   if (! (b && TREE_CODE (b) == NOP_EXPR
13117          && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
13118     return t;
13119
13120   ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
13121   if (! (ns && TREE_CODE (ns) == NOP_EXPR
13122          && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
13123     return t;
13124
13125   decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
13126   if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
13127       /* It's got to be the an equivalent decl */
13128       && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
13129     {
13130       /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13131       TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
13132       /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13133       TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
13134       /* Change the right part of the BINOP_EXPR */
13135       TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
13136     }
13137
13138   return t;
13139 }
13140
13141 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13142    errors but we modify NODE so that it contains the type computed
13143    according to the expression, when it's fixed. Otherwise, we write
13144    error_mark_node as the type. It allows us to further the analysis
13145    of remaining nodes and detects more errors in certain cases.  */
13146
13147 static tree
13148 patch_binop (tree node, tree wfl_op1, tree wfl_op2)
13149 {
13150   tree op1 = TREE_OPERAND (node, 0);
13151   tree op2 = TREE_OPERAND (node, 1);
13152   tree op1_type = TREE_TYPE (op1);
13153   tree op2_type = TREE_TYPE (op2);
13154   tree prom_type = NULL_TREE, cn;
13155   enum tree_code code = TREE_CODE (node);
13156
13157   /* If 1, tell the routine that we have to return error_mark_node
13158      after checking for the initialization of the RHS */
13159   int error_found = 0;
13160
13161   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13162
13163   /* If either op<n>_type are NULL, this might be early signs of an
13164      error situation, unless it's too early to tell (in case we're
13165      handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13166      correctly so the error can be later on reported accurately. */
13167   if (! (code == PLUS_EXPR || code == NE_EXPR
13168          || code == EQ_EXPR || code == INSTANCEOF_EXPR))
13169     {
13170       tree n;
13171       if (! op1_type)
13172         {
13173           n = java_complete_tree (op1);
13174           op1_type = TREE_TYPE (n);
13175         }
13176       if (! op2_type)
13177         {
13178           n = java_complete_tree (op2);
13179           op2_type = TREE_TYPE (n);
13180         }
13181     }
13182
13183   switch (code)
13184     {
13185     /* 15.16 Multiplicative operators */
13186     case MULT_EXPR:             /* 15.16.1 Multiplication Operator * */
13187     case RDIV_EXPR:             /* 15.16.2 Division Operator / */
13188     case TRUNC_DIV_EXPR:        /* 15.16.2 Integral type Division Operator / */
13189     case TRUNC_MOD_EXPR:        /* 15.16.3 Remainder operator % */
13190       if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13191         {
13192           if (!JNUMERIC_TYPE_P (op1_type))
13193             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13194           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13195             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13196           TREE_TYPE (node) = error_mark_node;
13197           error_found = 1;
13198           break;
13199         }
13200       prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13201
13202       /* Detect integral division by zero */
13203       if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
13204           && TREE_CODE (prom_type) == INTEGER_TYPE
13205           && (op2 == integer_zero_node || op2 == long_zero_node ||
13206               (TREE_CODE (op2) == INTEGER_CST &&
13207                ! TREE_INT_CST_LOW (op2)  && ! TREE_INT_CST_HIGH (op2))))
13208         {
13209           parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown");
13210           TREE_CONSTANT (node) = 0;
13211           TREE_INVARIANT (node) = 0;
13212         }
13213
13214       /* Change the division operator if necessary */
13215       if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
13216         TREE_SET_CODE (node, TRUNC_DIV_EXPR);
13217
13218       /* Before divisions as is disappear, try to simplify and bail if
13219          applicable, otherwise we won't perform even simple
13220          simplifications like (1-1)/3. We can't do that with floating
13221          point number, folds can't handle them at this stage. */
13222       if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
13223           && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
13224         {
13225           TREE_TYPE (node) = prom_type;
13226           node = fold (node);
13227           if (TREE_CODE (node) != code)
13228             return node;
13229         }
13230
13231       if (TREE_CODE (prom_type) == INTEGER_TYPE
13232           && flag_use_divide_subroutine
13233           && ! flag_emit_class_files
13234           && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
13235         return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
13236
13237       /* This one is more complicated. FLOATs are processed by a
13238          function call to soft_fmod. Duplicate the value of the
13239          COMPOUND_ASSIGN_P flag. */
13240       if (code == TRUNC_MOD_EXPR)
13241         {
13242           tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
13243           COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
13244           TREE_SIDE_EFFECTS (mod)
13245             = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13246           return mod;
13247         }
13248       break;
13249
13250     /* 15.17 Additive Operators */
13251     case PLUS_EXPR:             /* 15.17.1 String Concatenation Operator + */
13252
13253       /* Operation is valid if either one argument is a string
13254          constant, a String object or a StringBuffer crafted for the
13255          purpose of the a previous usage of the String concatenation
13256          operator */
13257
13258       if (TREE_CODE (op1) == STRING_CST
13259           || TREE_CODE (op2) == STRING_CST
13260           || JSTRING_TYPE_P (op1_type)
13261           || JSTRING_TYPE_P (op2_type)
13262           || IS_CRAFTED_STRING_BUFFER_P (op1)
13263           || IS_CRAFTED_STRING_BUFFER_P (op2))
13264         return build_string_concatenation (op1, op2);
13265
13266     case MINUS_EXPR:            /* 15.17.2 Additive Operators (+ and -) for
13267                                    Numeric Types */
13268       if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13269         {
13270           if (!JNUMERIC_TYPE_P (op1_type))
13271             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13272           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13273             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13274           TREE_TYPE (node) = error_mark_node;
13275           error_found = 1;
13276           break;
13277         }
13278       prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13279       break;
13280
13281     /* 15.18 Shift Operators */
13282     case LSHIFT_EXPR:
13283     case RSHIFT_EXPR:
13284     case URSHIFT_EXPR:
13285       if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
13286         {
13287           if (!JINTEGRAL_TYPE_P (op1_type))
13288             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13289           else
13290             {
13291               if (JNUMERIC_TYPE_P (op2_type))
13292                 parse_error_context (wfl_operator,
13293                                      "Incompatible type for `%s'. Explicit cast needed to convert shift distance from `%s' to integral",
13294                                      operator_string (node),
13295                                      lang_printable_name (op2_type, 0));
13296               else
13297                 parse_error_context (wfl_operator,
13298                                      "Incompatible type for `%s'. Can't convert shift distance from `%s' to integral",
13299                                      operator_string (node),
13300                                      lang_printable_name (op2_type, 0));
13301             }
13302           TREE_TYPE (node) = error_mark_node;
13303           error_found = 1;
13304           break;
13305         }
13306
13307       /* Unary numeric promotion (5.6.1) is performed on each operand
13308          separately */
13309       op1 = do_unary_numeric_promotion (op1);
13310       op2 = do_unary_numeric_promotion (op2);
13311
13312       /* If the right hand side is of type `long', first cast it to
13313          `int'.  */
13314       if (TREE_TYPE (op2) == long_type_node)
13315         op2 = build1 (CONVERT_EXPR, int_type_node, op2);
13316
13317       /* The type of the shift expression is the type of the promoted
13318          type of the left-hand operand */
13319       prom_type = TREE_TYPE (op1);
13320
13321       /* Shift int only up to 0x1f and long up to 0x3f */
13322       if (prom_type == int_type_node)
13323         op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13324                            build_int_2 (0x1f, 0)));
13325       else
13326         op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13327                            build_int_2 (0x3f, 0)));
13328
13329       /* The >>> operator is a >> operating on unsigned quantities */
13330       if (code == URSHIFT_EXPR && ! flag_emit_class_files)
13331         {
13332           tree to_return;
13333           tree utype = java_unsigned_type (prom_type);
13334           op1 = convert (utype, op1);
13335           TREE_SET_CODE (node, RSHIFT_EXPR);
13336           TREE_OPERAND (node, 0) = op1;
13337           TREE_OPERAND (node, 1) = op2;
13338           TREE_TYPE (node) = utype;
13339           to_return = convert (prom_type, node);
13340           /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13341           COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
13342           TREE_SIDE_EFFECTS (to_return)
13343             = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13344           return to_return;
13345         }
13346       break;
13347
13348       /* 15.19.1 Type Comparison Operator instanceof */
13349     case INSTANCEOF_EXPR:
13350
13351       TREE_TYPE (node) = boolean_type_node;
13352
13353       /* OP1_TYPE might be NULL when OP1 is a string constant.  */
13354       if ((cn = patch_string (op1)))
13355         {
13356           op1 = cn;
13357           op1_type = TREE_TYPE (op1);
13358         }
13359       if (op1_type == NULL_TREE)
13360         abort ();
13361
13362       if (!(op2_type = resolve_type_during_patch (op2)))
13363         return error_mark_node;
13364
13365       /* The first operand must be a reference type or the null type */
13366       if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
13367         error_found = 1;        /* Error reported further below */
13368
13369       /* The second operand must be a reference type */
13370       if (!JREFERENCE_TYPE_P (op2_type))
13371         {
13372           SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
13373           parse_error_context
13374             (wfl_operator, "Invalid argument `%s' for `instanceof'",
13375              lang_printable_name (op2_type, 0));
13376           error_found = 1;
13377         }
13378
13379       if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
13380         {
13381           /* If the first operand is null, the result is always false */
13382           if (op1 == null_pointer_node)
13383             return boolean_false_node;
13384           else if (flag_emit_class_files)
13385             {
13386               TREE_OPERAND (node, 1) = op2_type;
13387               TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
13388               return node;
13389             }
13390           /* Otherwise we have to invoke instance of to figure it out */
13391           else
13392             return build_instanceof (op1, op2_type);
13393         }
13394       /* There is no way the expression operand can be an instance of
13395          the type operand. This is a compile time error. */
13396       else
13397         {
13398           char *t1 = xstrdup (lang_printable_name (op1_type, 0));
13399           SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
13400           parse_error_context
13401             (wfl_operator, "Impossible for `%s' to be instance of `%s'",
13402              t1, lang_printable_name (op2_type, 0));
13403           free (t1);
13404           error_found = 1;
13405         }
13406
13407       break;
13408
13409       /* 15.21 Bitwise and Logical Operators */
13410     case BIT_AND_EXPR:
13411     case BIT_XOR_EXPR:
13412     case BIT_IOR_EXPR:
13413       if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
13414         /* Binary numeric promotion is performed on both operand and the
13415            expression retain that type */
13416         prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13417
13418       else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
13419                && TREE_CODE (op1_type) == BOOLEAN_TYPE)
13420         /* The type of the bitwise operator expression is BOOLEAN */
13421         prom_type = boolean_type_node;
13422       else
13423         {
13424           if (!JINTEGRAL_TYPE_P (op1_type))
13425             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13426           if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
13427             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
13428           TREE_TYPE (node) = error_mark_node;
13429           error_found = 1;
13430           /* Insert a break here if adding thing before the switch's
13431              break for this case */
13432         }
13433       break;
13434
13435       /* 15.22 Conditional-And Operator */
13436     case TRUTH_ANDIF_EXPR:
13437       /* 15.23 Conditional-Or Operator */
13438     case TRUTH_ORIF_EXPR:
13439       /* Operands must be of BOOLEAN type */
13440       if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
13441           TREE_CODE (op2_type) != BOOLEAN_TYPE)
13442         {
13443           if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
13444             ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
13445           if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
13446             ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
13447           TREE_TYPE (node) = boolean_type_node;
13448           error_found = 1;
13449           break;
13450         }
13451       else if (integer_zerop (op1))
13452         {
13453           return code == TRUTH_ANDIF_EXPR ? op1 : op2;
13454         }
13455       else if (integer_onep (op1))
13456         {
13457           return code == TRUTH_ANDIF_EXPR ? op2 : op1;
13458         }
13459       /* The type of the conditional operators is BOOLEAN */
13460       prom_type = boolean_type_node;
13461       break;
13462
13463       /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13464     case LT_EXPR:
13465     case GT_EXPR:
13466     case LE_EXPR:
13467     case GE_EXPR:
13468       /* The type of each of the operands must be a primitive numeric
13469          type */
13470       if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
13471         {
13472           if (!JNUMERIC_TYPE_P (op1_type))
13473             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13474           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13475             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13476           TREE_TYPE (node) = boolean_type_node;
13477           error_found = 1;
13478           break;
13479         }
13480       /* Binary numeric promotion is performed on the operands */
13481       binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13482       /* The type of the relation expression is always BOOLEAN */
13483       prom_type = boolean_type_node;
13484       break;
13485
13486       /* 15.20 Equality Operator */
13487     case EQ_EXPR:
13488     case NE_EXPR:
13489       /* It's time for us to patch the strings. */
13490       if ((cn = patch_string (op1)))
13491        {
13492          op1 = cn;
13493          op1_type = TREE_TYPE (op1);
13494        }
13495       if ((cn = patch_string (op2)))
13496        {
13497          op2 = cn;
13498          op2_type = TREE_TYPE (op2);
13499        }
13500
13501       /* 15.20.1 Numerical Equality Operators == and != */
13502       /* Binary numeric promotion is performed on the operands */
13503       if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
13504         binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13505
13506       /* 15.20.2 Boolean Equality Operators == and != */
13507       else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
13508           TREE_CODE (op2_type) == BOOLEAN_TYPE)
13509         ;                       /* Nothing to do here */
13510
13511       /* 15.20.3 Reference Equality Operators == and != */
13512       /* Types have to be either references or the null type. If
13513          they're references, it must be possible to convert either
13514          type to the other by casting conversion. */
13515       else if (op1 == null_pointer_node || op2 == null_pointer_node
13516                || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
13517                    && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
13518                        || valid_ref_assignconv_cast_p (op2_type,
13519                                                        op1_type, 1))))
13520         ;                       /* Nothing to do here */
13521
13522       /* Else we have an error figure what can't be converted into
13523          what and report the error */
13524       else
13525         {
13526           char *t1;
13527           t1 = xstrdup (lang_printable_name (op1_type, 0));
13528           parse_error_context
13529             (wfl_operator,
13530              "Incompatible type for `%s'. Can't convert `%s' to `%s'",
13531              operator_string (node), t1,
13532              lang_printable_name (op2_type, 0));
13533           free (t1);
13534           TREE_TYPE (node) = boolean_type_node;
13535           error_found = 1;
13536           break;
13537         }
13538       prom_type = boolean_type_node;
13539       break;
13540     default:
13541       abort ();
13542     }
13543
13544   if (error_found)
13545     return error_mark_node;
13546
13547   TREE_OPERAND (node, 0) = op1;
13548   TREE_OPERAND (node, 1) = op2;
13549   TREE_TYPE (node) = prom_type;
13550   TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13551
13552   if (flag_emit_xref)
13553     return node;
13554
13555   /* fold does not respect side-effect order as required for Java but not C.
13556    * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13557    * bytecode.
13558    */
13559   if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
13560       : ! TREE_SIDE_EFFECTS (node))
13561     node = fold (node);
13562   return node;
13563 }
13564
13565 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13566    zero value, the value of CSTE comes after the valude of STRING */
13567
13568 static tree
13569 do_merge_string_cste (tree cste, const char *string, int string_len, int after)
13570 {
13571   const char *old = TREE_STRING_POINTER (cste);
13572   int old_len = TREE_STRING_LENGTH (cste);
13573   int len = old_len + string_len;
13574   char *new = alloca (len+1);
13575
13576   if (after)
13577     {
13578       memcpy (new, string, string_len);
13579       memcpy (&new [string_len], old, old_len);
13580     }
13581   else
13582     {
13583       memcpy (new, old, old_len);
13584       memcpy (&new [old_len], string, string_len);
13585     }
13586   new [len] = '\0';
13587   return build_string (len, new);
13588 }
13589
13590 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13591    new STRING_CST on success, NULL_TREE on failure.  */
13592
13593 static tree
13594 merge_string_cste (tree op1, tree op2, int after)
13595 {
13596   /* Handle two string constants right away.  */
13597   if (TREE_CODE (op2) == STRING_CST)
13598     return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
13599                                  TREE_STRING_LENGTH (op2), after);
13600
13601   /* Reasonable integer constant can be treated right away.  */
13602   if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
13603     {
13604       static const char *const boolean_true = "true";
13605       static const char *const boolean_false = "false";
13606       static const char *const null_pointer = "null";
13607       char ch[4];
13608       const char *string;
13609
13610       if (op2 == boolean_true_node)
13611         string = boolean_true;
13612       else if (op2 == boolean_false_node)
13613         string = boolean_false;
13614       else if (op2 == null_pointer_node
13615                || (integer_zerop (op2)
13616                    && TREE_CODE (TREE_TYPE (op2)) == POINTER_TYPE))
13617         /* FIXME: null is not a compile-time constant, so it is only safe to
13618            merge if the overall expression is non-constant. However, this
13619            code always merges without checking the overall expression.  */
13620         string = null_pointer;
13621       else if (TREE_TYPE (op2) == char_type_node)
13622         {
13623           /* Convert the character into UTF-8.  */
13624           unsigned int c = (unsigned int) TREE_INT_CST_LOW (op2);
13625           unsigned char *p = (unsigned char *) ch;
13626           if (0x01 <= c && c <= 0x7f)
13627             *p++ = (unsigned char) c;
13628           else if (c < 0x7ff)
13629             {
13630               *p++ = (unsigned char) (c >> 6 | 0xc0);
13631               *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13632             }
13633           else
13634             {
13635               *p++ = (unsigned char) (c >> 12 | 0xe0);
13636               *p++ = (unsigned char) (((c >> 6) & 0x3f) | 0x80);
13637               *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13638             }
13639           *p = '\0';
13640
13641           string = ch;
13642         }
13643       else
13644         string = string_convert_int_cst (op2);
13645
13646       return do_merge_string_cste (op1, string, strlen (string), after);
13647     }
13648   return NULL_TREE;
13649 }
13650
13651 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
13652    has to be a STRING_CST and the other part must be a STRING_CST or a
13653    INTEGRAL constant. Return a new STRING_CST if the operation
13654    succeed, NULL_TREE otherwise.
13655
13656    If the case we want to optimize for space, we might want to return
13657    NULL_TREE for each invocation of this routine. FIXME */
13658
13659 static tree
13660 string_constant_concatenation (tree op1, tree op2)
13661 {
13662   if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
13663     {
13664       tree string, rest;
13665       int invert;
13666
13667       string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
13668       rest   = (string == op1 ? op2 : op1);
13669       invert = (string == op1 ? 0 : 1 );
13670
13671       /* Walk REST, only if it looks reasonable */
13672       if (TREE_CODE (rest) != STRING_CST
13673           && !IS_CRAFTED_STRING_BUFFER_P (rest)
13674           && !JSTRING_TYPE_P (TREE_TYPE (rest))
13675           && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
13676         {
13677           rest = java_complete_tree (rest);
13678           if (rest == error_mark_node)
13679             return error_mark_node;
13680           rest = fold (rest);
13681         }
13682       return merge_string_cste (string, rest, invert);
13683     }
13684   return NULL_TREE;
13685 }
13686
13687 /* Implement the `+' operator. Does static optimization if possible,
13688    otherwise create (if necessary) and append elements to a
13689    StringBuffer. The StringBuffer will be carried around until it is
13690    used for a function call or an assignment. Then toString() will be
13691    called on it to turn it into a String object. */
13692
13693 static tree
13694 build_string_concatenation (tree op1, tree op2)
13695 {
13696   tree result;
13697   int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13698
13699   if (flag_emit_xref)
13700     return build (PLUS_EXPR, string_type_node, op1, op2);
13701
13702   /* Try to do some static optimization */
13703   if ((result = string_constant_concatenation (op1, op2)))
13704     return result;
13705
13706   /* Discard empty strings on either side of the expression */
13707   if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
13708     {
13709       op1 = op2;
13710       op2 = NULL_TREE;
13711     }
13712   else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
13713     op2 = NULL_TREE;
13714
13715   /* If operands are string constant, turn then into object references */
13716   if (TREE_CODE (op1) == STRING_CST)
13717     op1 = patch_string_cst (op1);
13718   if (op2 && TREE_CODE (op2) == STRING_CST)
13719     op2 = patch_string_cst (op2);
13720
13721   /* If either one of the constant is null and the other non null
13722      operand is a String constant, return it. */
13723   if ((TREE_CODE (op1) == STRING_CST) && !op2)
13724     return op1;
13725
13726   /* If OP1 isn't already a StringBuffer, create and
13727      initialize a new one */
13728   if (!IS_CRAFTED_STRING_BUFFER_P (op1))
13729     {
13730       /* Two solutions here:
13731          1) OP1 is a constant string reference, we call new StringBuffer(OP1)
13732          2) OP1 is something else, we call new StringBuffer().append(OP1).  */
13733       if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
13734         op1 = BUILD_STRING_BUFFER (op1);
13735       else
13736         {
13737           tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
13738           op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
13739         }
13740     }
13741
13742   if (op2)
13743     {
13744       /* OP1 is no longer the last node holding a crafted StringBuffer */
13745       IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
13746       /* Create a node for `{new...,xxx}.append (op2)' */
13747       if (op2)
13748         op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
13749     }
13750
13751   /* Mark the last node holding a crafted StringBuffer */
13752   IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
13753
13754   TREE_SIDE_EFFECTS (op1) = side_effects;
13755   return op1;
13756 }
13757
13758 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
13759    StringBuffer. If no string were found to be patched, return
13760    NULL. */
13761
13762 static tree
13763 patch_string (tree node)
13764 {
13765   if (node == error_mark_node)
13766     return error_mark_node;
13767   if (TREE_CODE (node) == STRING_CST)
13768     return patch_string_cst (node);
13769   else if (IS_CRAFTED_STRING_BUFFER_P (node))
13770     {
13771       int saved = ctxp->explicit_constructor_p;
13772       tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
13773       tree ret;
13774       /* Temporary disable forbid the use of `this'. */
13775       ctxp->explicit_constructor_p = 0;
13776       ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
13777       /* String concatenation arguments must be evaluated in order too. */
13778       ret = force_evaluation_order (ret);
13779       /* Restore it at its previous value */
13780       ctxp->explicit_constructor_p = saved;
13781       return ret;
13782     }
13783   return NULL_TREE;
13784 }
13785
13786 /* Build the internal representation of a string constant.  */
13787
13788 static tree
13789 patch_string_cst (tree node)
13790 {
13791   int location;
13792   if (! flag_emit_class_files)
13793     {
13794       node = get_identifier (TREE_STRING_POINTER (node));
13795       location = alloc_name_constant (CONSTANT_String, node);
13796       node = build_ref_from_constant_pool (location);
13797     }
13798   TREE_CONSTANT (node) = 1;
13799   TREE_INVARIANT (node) = 1;
13800
13801   /* ??? Guessing that the class file code can't handle casts.  */
13802   if (! flag_emit_class_files)
13803     node = convert (string_ptr_type_node, node);
13804   else
13805     TREE_TYPE (node) = string_ptr_type_node;
13806
13807   return node;
13808 }
13809
13810 /* Build an incomplete unary operator expression. */
13811
13812 static tree
13813 build_unaryop (int op_token, int op_location, tree op1)
13814 {
13815   enum tree_code op;
13816   tree unaryop;
13817   switch (op_token)
13818     {
13819     case PLUS_TK: op = UNARY_PLUS_EXPR; break;
13820     case MINUS_TK: op = NEGATE_EXPR; break;
13821     case NEG_TK: op = TRUTH_NOT_EXPR; break;
13822     case NOT_TK: op = BIT_NOT_EXPR; break;
13823     default: abort ();
13824     }
13825
13826   unaryop = build1 (op, NULL_TREE, op1);
13827   TREE_SIDE_EFFECTS (unaryop) = 1;
13828   /* Store the location of the operator, for better error report. The
13829      string of the operator will be rebuild based on the OP value. */
13830   EXPR_WFL_LINECOL (unaryop) = op_location;
13831   return unaryop;
13832 }
13833
13834 /* Special case for the ++/-- operators, since they require an extra
13835    argument to build, which is set to NULL and patched
13836    later. IS_POST_P is 1 if the operator, 0 otherwise.  */
13837
13838 static tree
13839 build_incdec (int op_token, int op_location, tree op1, int is_post_p)
13840 {
13841   static const enum tree_code lookup [2][2] =
13842     {
13843       { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
13844       { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
13845     };
13846   tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
13847                      NULL_TREE, op1, NULL_TREE);
13848   TREE_SIDE_EFFECTS (node) = 1;
13849   /* Store the location of the operator, for better error report. The
13850      string of the operator will be rebuild based on the OP value. */
13851   EXPR_WFL_LINECOL (node) = op_location;
13852   return node;
13853 }
13854
13855 /* Build an incomplete cast operator, based on the use of the
13856    CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
13857    set. java_complete_tree is trained to walk a CONVERT_EXPR even
13858    though its type is already set.  */
13859
13860 static tree
13861 build_cast (int location, tree type, tree exp)
13862 {
13863   tree node = build1 (CONVERT_EXPR, type, exp);
13864   EXPR_WFL_LINECOL (node) = location;
13865   return node;
13866 }
13867
13868 /* Build an incomplete class reference operator.  */
13869 static tree
13870 build_incomplete_class_ref (int location, tree class_name)
13871 {
13872   tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
13873   tree class_decl = GET_CPC ();
13874   tree this_class = TREE_TYPE (class_decl);
13875
13876   /* Generate the synthetic static method `class$'.  (Previously we
13877      deferred this, causing different method tables to be emitted
13878      for native code and bytecode.)  */
13879   if (!TYPE_DOT_CLASS (this_class)
13880       && !JPRIMITIVE_TYPE_P (class_name)
13881       && !(TREE_CODE (class_name) == VOID_TYPE))
13882     {
13883       tree cpc_list = GET_CPC_LIST();
13884       tree cpc = cpc_list;
13885       tree target_class;
13886
13887       /* For inner classes, add a 'class$' method to their outermost
13888          context, creating it if necessary.  */
13889       
13890       while (GET_NEXT_ENCLOSING_CPC(cpc))
13891         cpc = GET_NEXT_ENCLOSING_CPC(cpc);
13892       class_decl = TREE_VALUE (cpc);
13893
13894       target_class = TREE_TYPE (class_decl);
13895
13896       if (CLASS_INTERFACE (TYPE_NAME (target_class)))
13897         {
13898           /* For interfaces, adding a static 'class$' method directly 
13899              is illegal.  So create an inner class to contain the new
13900              method.  Empirically this matches the behavior of javac.  */
13901           tree t, inner;
13902           /* We want the generated inner class inside the outermost class. */
13903           GET_CPC_LIST() = cpc;
13904           t = build_wfl_node (DECL_NAME (TYPE_NAME (object_type_node)));
13905           inner = create_anonymous_class (t);
13906           target_class = TREE_TYPE (inner);
13907           end_class_declaration (1);
13908           GET_CPC_LIST() = cpc_list;
13909         }
13910
13911       if (TYPE_DOT_CLASS (target_class) == NULL_TREE)
13912         build_dot_class_method (target_class);
13913
13914       if (this_class != target_class)
13915         TYPE_DOT_CLASS (this_class) = TYPE_DOT_CLASS (target_class);
13916     }
13917
13918   EXPR_WFL_LINECOL (node) = location;
13919   return node;
13920 }
13921
13922 /* Complete an incomplete class reference operator.  */
13923 static tree
13924 patch_incomplete_class_ref (tree node)
13925 {
13926   tree type = TREE_OPERAND (node, 0);
13927   tree ref_type;
13928
13929   if (!(ref_type = resolve_type_during_patch (type)))
13930     return error_mark_node;
13931
13932   /* If we're not emitting class files and we know ref_type is a
13933      compiled class, build a direct reference.  */
13934   if ((! flag_emit_class_files && is_compiled_class (ref_type))
13935       || JPRIMITIVE_TYPE_P (ref_type)
13936       || TREE_CODE (ref_type) == VOID_TYPE)
13937     {
13938       tree dot = build_class_ref (ref_type);
13939       /* A class referenced by `foo.class' is initialized.  */
13940       if (!flag_emit_class_files)
13941        dot = build_class_init (ref_type, dot);
13942       return java_complete_tree (dot);
13943     }
13944
13945   /* If we're emitting class files and we have to deal with non
13946      primitive types, we invoke the synthetic static method `class$'.  */
13947   ref_type = build_dot_class_method_invocation (current_class, ref_type);
13948   return java_complete_tree (ref_type);
13949 }
13950
13951 /* 15.14 Unary operators. We return error_mark_node in case of error,
13952    but preserve the type of NODE if the type is fixed.  */
13953
13954 static tree
13955 patch_unaryop (tree node, tree wfl_op)
13956 {
13957   tree op = TREE_OPERAND (node, 0);
13958   tree op_type = TREE_TYPE (op);
13959   tree prom_type = NULL_TREE, value, decl;
13960   int outer_field_flag = 0;
13961   int code = TREE_CODE (node);
13962   int error_found = 0;
13963
13964   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13965
13966   switch (code)
13967     {
13968       /* 15.13.2 Postfix Increment Operator ++ */
13969     case POSTINCREMENT_EXPR:
13970       /* 15.13.3 Postfix Increment Operator -- */
13971     case POSTDECREMENT_EXPR:
13972       /* 15.14.1 Prefix Increment Operator ++ */
13973     case PREINCREMENT_EXPR:
13974       /* 15.14.2 Prefix Decrement Operator -- */
13975     case PREDECREMENT_EXPR:
13976       op = decl = strip_out_static_field_access_decl (op);
13977       outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
13978       /* We might be trying to change an outer field accessed using
13979          access method. */
13980       if (outer_field_flag)
13981         {
13982           /* Retrieve the decl of the field we're trying to access. We
13983              do that by first retrieving the function we would call to
13984              access the field. It has been already verified that this
13985              field isn't final */
13986           if (flag_emit_class_files)
13987             decl = TREE_OPERAND (op, 0);
13988           else
13989             decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
13990           decl = DECL_FUNCTION_ACCESS_DECL (decl);
13991         }
13992       /* We really should have a JAVA_ARRAY_EXPR to avoid this */
13993       else if (!JDECL_P (decl)
13994           && TREE_CODE (decl) != COMPONENT_REF
13995           && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
13996           && TREE_CODE (decl) != INDIRECT_REF
13997           && !(TREE_CODE (decl) == COMPOUND_EXPR
13998                && TREE_OPERAND (decl, 1)
13999                && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
14000         {
14001           TREE_TYPE (node) = error_mark_node;
14002           error_found = 1;
14003         }
14004
14005       /* From now on, we know that op if a variable and that it has a
14006          valid wfl. We use wfl_op to locate errors related to the
14007          ++/-- operand. */
14008       if (!JNUMERIC_TYPE_P (op_type))
14009         {
14010           parse_error_context
14011             (wfl_op, "Invalid argument type `%s' to `%s'",
14012              lang_printable_name (op_type, 0), operator_string (node));
14013           TREE_TYPE (node) = error_mark_node;
14014           error_found = 1;
14015         }
14016       else
14017         {
14018           /* Before the addition, binary numeric promotion is performed on
14019              both operands, if really necessary */
14020           if (JINTEGRAL_TYPE_P (op_type))
14021             {
14022               value = build_int_2 (1, 0);
14023               TREE_TYPE (value) = TREE_TYPE (node) = op_type;
14024             }
14025           else
14026             {
14027               value = build_int_2 (1, 0);
14028               TREE_TYPE (node) =
14029                 binary_numeric_promotion (op_type,
14030                                           TREE_TYPE (value), &op, &value);
14031             }
14032
14033           /* We remember we might be accessing an outer field */
14034           if (outer_field_flag)
14035             {
14036               /* We re-generate an access to the field */
14037               value = build (PLUS_EXPR, TREE_TYPE (op),
14038                              build_outer_field_access (wfl_op, decl), value);
14039
14040               /* And we patch the original access$() into a write
14041                  with plus_op as a rhs */
14042               return outer_field_access_fix (node, op, value);
14043             }
14044
14045           /* And write back into the node. */
14046           TREE_OPERAND (node, 0) = op;
14047           TREE_OPERAND (node, 1) = value;
14048           /* Convert the overall back into its original type, if
14049              necessary, and return */
14050           if (JINTEGRAL_TYPE_P (op_type))
14051             return fold (node);
14052           else
14053             return fold (convert (op_type, node));
14054         }
14055       break;
14056
14057       /* 15.14.3 Unary Plus Operator + */
14058     case UNARY_PLUS_EXPR:
14059       /* 15.14.4 Unary Minus Operator - */
14060     case NEGATE_EXPR:
14061       if (!JNUMERIC_TYPE_P (op_type))
14062         {
14063           ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
14064           TREE_TYPE (node) = error_mark_node;
14065           error_found = 1;
14066         }
14067       /* Unary numeric promotion is performed on operand */
14068       else
14069         {
14070           op = do_unary_numeric_promotion (op);
14071           prom_type = TREE_TYPE (op);
14072           if (code == UNARY_PLUS_EXPR)
14073             return fold (op);
14074         }
14075       break;
14076
14077       /* 15.14.5 Bitwise Complement Operator ~ */
14078     case BIT_NOT_EXPR:
14079       if (!JINTEGRAL_TYPE_P (op_type))
14080         {
14081           ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
14082           TREE_TYPE (node) = error_mark_node;
14083           error_found = 1;
14084         }
14085       else
14086         {
14087           op = do_unary_numeric_promotion (op);
14088           prom_type = TREE_TYPE (op);
14089         }
14090       break;
14091
14092       /* 15.14.6 Logical Complement Operator ! */
14093     case TRUTH_NOT_EXPR:
14094       if (TREE_CODE (op_type) != BOOLEAN_TYPE)
14095         {
14096           ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
14097           /* But the type is known. We will report an error if further
14098              attempt of a assignment is made with this rhs */
14099           TREE_TYPE (node) = boolean_type_node;
14100           error_found = 1;
14101         }
14102       else
14103         prom_type = boolean_type_node;
14104       break;
14105
14106       /* 15.15 Cast Expression */
14107     case CONVERT_EXPR:
14108       value = patch_cast (node, wfl_operator);
14109       if (value == error_mark_node)
14110         {
14111           /* If this cast is part of an assignment, we tell the code
14112              that deals with it not to complain about a mismatch,
14113              because things have been cast, anyways */
14114           TREE_TYPE (node) = error_mark_node;
14115           error_found = 1;
14116         }
14117       else
14118         {
14119           value = fold (value);
14120           TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
14121           return value;
14122         }
14123       break;
14124     }
14125
14126   if (error_found)
14127     return error_mark_node;
14128
14129   /* There are cases where node has been replaced by something else
14130      and we don't end up returning here: UNARY_PLUS_EXPR,
14131      CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14132   TREE_OPERAND (node, 0) = fold (op);
14133   TREE_TYPE (node) = prom_type;
14134   TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
14135   return fold (node);
14136 }
14137
14138 /* Generic type resolution that sometimes takes place during node
14139    patching. Returned the resolved type or generate an error
14140    message. Return the resolved type or NULL_TREE.  */
14141
14142 static tree
14143 resolve_type_during_patch (tree type)
14144 {
14145   if (unresolved_type_p (type, NULL))
14146     {
14147       tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
14148       if (!type_decl)
14149         {
14150           parse_error_context (type,
14151                                "Class `%s' not found in type declaration",
14152                                IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
14153           return NULL_TREE;
14154         }
14155
14156       check_deprecation (type, type_decl);
14157
14158       return TREE_TYPE (type_decl);
14159     }
14160   return type;
14161 }
14162
14163 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14164    found. Otherwise NODE or something meant to replace it is returned.  */
14165
14166 static tree
14167 patch_cast (tree node, tree wfl_op)
14168 {
14169   tree op = TREE_OPERAND (node, 0);
14170   tree cast_type = TREE_TYPE (node);
14171   tree patched, op_type;
14172   char *t1;
14173
14174   /* Some string patching might be necessary at this stage */
14175   if ((patched = patch_string (op)))
14176     TREE_OPERAND (node, 0) = op = patched;
14177   op_type = TREE_TYPE (op);
14178
14179   /* First resolve OP_TYPE if unresolved */
14180   if (!(cast_type = resolve_type_during_patch (cast_type)))
14181     return error_mark_node;
14182
14183   /* Check on cast that are proven correct at compile time */
14184   if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
14185     {
14186       /* Same type */
14187       if (cast_type == op_type)
14188         return node;
14189
14190       /* A narrowing conversion from a floating-point number to an
14191          integral type requires special handling (5.1.3).  */
14192       if (JFLOAT_TYPE_P (op_type) && JINTEGRAL_TYPE_P (cast_type))
14193         if (cast_type != long_type_node)
14194           op = convert (integer_type_node, op);
14195
14196       /* Try widening/narrowing conversion.  Potentially, things need
14197          to be worked out in gcc so we implement the extreme cases
14198          correctly.  fold_convert() needs to be fixed.  */
14199       return convert (cast_type, op);
14200     }
14201
14202   /* It's also valid to cast a boolean into a boolean */
14203   if (op_type == boolean_type_node && cast_type == boolean_type_node)
14204     return node;
14205
14206   /* null can be casted to references */
14207   if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
14208     return build_null_of_type (cast_type);
14209
14210   /* The remaining legal casts involve conversion between reference
14211      types. Check for their compile time correctness. */
14212   if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
14213       && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
14214     {
14215       TREE_TYPE (node) = promote_type (cast_type);
14216       /* Now, the case can be determined correct at compile time if
14217          OP_TYPE can be converted into CAST_TYPE by assignment
14218          conversion (5.2) */
14219
14220       if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
14221         {
14222           TREE_SET_CODE (node, NOP_EXPR);
14223           return node;
14224         }
14225
14226       if (flag_emit_class_files)
14227         {
14228           TREE_SET_CODE (node, CONVERT_EXPR);
14229           return node;
14230         }
14231
14232       /* The cast requires a run-time check */
14233       return build (CALL_EXPR, promote_type (cast_type),
14234                     build_address_of (soft_checkcast_node),
14235                     tree_cons (NULL_TREE, build_class_ref (cast_type),
14236                                build_tree_list (NULL_TREE, op)),
14237                     NULL_TREE);
14238     }
14239
14240   /* Any other casts are proven incorrect at compile time */
14241   t1 = xstrdup (lang_printable_name (op_type, 0));
14242   parse_error_context (wfl_op, "Invalid cast from `%s' to `%s'",
14243                        t1, lang_printable_name (cast_type, 0));
14244   free (t1);
14245   return error_mark_node;
14246 }
14247
14248 /* Build a null constant and give it the type TYPE.  */
14249
14250 static tree
14251 build_null_of_type (tree type)
14252 {
14253   tree node = build_int_2 (0, 0);
14254   TREE_TYPE (node) = promote_type (type);
14255   return node;
14256 }
14257
14258 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14259    a list of indices. */
14260 static tree
14261 build_array_ref (int location, tree array, tree index)
14262 {
14263   tree node = build (ARRAY_REF, NULL_TREE, array, index, NULL_TREE, NULL_TREE);
14264   EXPR_WFL_LINECOL (node) = location;
14265   return node;
14266 }
14267
14268 /* 15.12 Array Access Expression */
14269
14270 static tree
14271 patch_array_ref (tree node)
14272 {
14273   tree array = TREE_OPERAND (node, 0);
14274   tree array_type  = TREE_TYPE (array);
14275   tree index = TREE_OPERAND (node, 1);
14276   tree index_type = TREE_TYPE (index);
14277   int error_found = 0;
14278
14279   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14280
14281   if (TREE_CODE (array_type) == POINTER_TYPE)
14282     array_type = TREE_TYPE (array_type);
14283
14284   /* The array reference must be an array */
14285   if (!TYPE_ARRAY_P (array_type))
14286     {
14287       parse_error_context
14288         (wfl_operator,
14289          "`[]' can only be applied to arrays. It can't be applied to `%s'",
14290          lang_printable_name (array_type, 0));
14291       TREE_TYPE (node) = error_mark_node;
14292       error_found = 1;
14293     }
14294
14295   /* The array index undergoes unary numeric promotion. The promoted
14296      type must be int */
14297   index = do_unary_numeric_promotion (index);
14298   if (TREE_TYPE (index) != int_type_node)
14299     {
14300       if (valid_cast_to_p (index_type, int_type_node))
14301         parse_error_context (wfl_operator,
14302    "Incompatible type for `[]'. Explicit cast needed to convert `%s' to `int'",
14303                              lang_printable_name (index_type, 0));
14304       else
14305         parse_error_context (wfl_operator,
14306           "Incompatible type for `[]'. Can't convert `%s' to `int'",
14307                              lang_printable_name (index_type, 0));
14308       TREE_TYPE (node) = error_mark_node;
14309       error_found = 1;
14310     }
14311
14312   if (error_found)
14313     return error_mark_node;
14314
14315   array_type = TYPE_ARRAY_ELEMENT (array_type);
14316
14317   if (flag_emit_class_files || flag_emit_xref)
14318     {
14319       TREE_OPERAND (node, 0) = array;
14320       TREE_OPERAND (node, 1) = index;
14321     }
14322   else
14323     node = build_java_arrayaccess (array, array_type, index);
14324   TREE_TYPE (node) = array_type;
14325   return node;
14326 }
14327
14328 /* 15.9 Array Creation Expressions */
14329
14330 static tree
14331 build_newarray_node (tree type, tree dims, int extra_dims)
14332 {
14333   tree node =
14334     build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
14335            build_int_2 (extra_dims, 0));
14336   return node;
14337 }
14338
14339 static tree
14340 patch_newarray (tree node)
14341 {
14342   tree type = TREE_OPERAND (node, 0);
14343   tree dims = TREE_OPERAND (node, 1);
14344   tree cdim, array_type;
14345   int error_found = 0;
14346   int ndims = 0;
14347   int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
14348
14349   /* Dimension types are verified. It's better for the types to be
14350      verified in order. */
14351   for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
14352     {
14353       int dim_error = 0;
14354       tree dim = TREE_VALUE (cdim);
14355
14356       /* Dim might have been saved during its evaluation */
14357       dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
14358
14359       /* The type of each specified dimension must be an integral type. */
14360       if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
14361         dim_error = 1;
14362
14363       /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14364          promoted type must be int. */
14365       else
14366         {
14367           dim = do_unary_numeric_promotion (dim);
14368           if (TREE_TYPE (dim) != int_type_node)
14369             dim_error = 1;
14370         }
14371
14372       /* Report errors on types here */
14373       if (dim_error)
14374         {
14375           parse_error_context
14376             (TREE_PURPOSE (cdim),
14377              "Incompatible type for dimension in array creation expression. %s convert `%s' to `int'",
14378              (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
14379               "Explicit cast needed to" : "Can't"),
14380              lang_printable_name (TREE_TYPE (dim), 0));
14381           error_found = 1;
14382         }
14383
14384       TREE_PURPOSE (cdim) = NULL_TREE;
14385     }
14386
14387   /* Resolve array base type if unresolved */
14388   if (!(type = resolve_type_during_patch (type)))
14389     error_found = 1;
14390
14391   if (error_found)
14392     {
14393       /* We don't want further evaluation of this bogus array creation
14394          operation */
14395       TREE_TYPE (node) = error_mark_node;
14396       return error_mark_node;
14397     }
14398
14399   /* Set array_type to the actual (promoted) array type of the result. */
14400   if (TREE_CODE (type) == RECORD_TYPE)
14401     type = build_pointer_type (type);
14402   while (--xdims >= 0)
14403     {
14404       type = promote_type (build_java_array_type (type, -1));
14405     }
14406   dims = nreverse (dims);
14407   array_type = type;
14408   for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
14409     {
14410       type = array_type;
14411       array_type
14412         = build_java_array_type (type,
14413                                  TREE_CODE (cdim) == INTEGER_CST
14414                                  ? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
14415                                  : -1);
14416       array_type = promote_type (array_type);
14417     }
14418   dims = nreverse (dims);
14419
14420   /* The node is transformed into a function call. Things are done
14421      differently according to the number of dimensions. If the number
14422      of dimension is equal to 1, then the nature of the base type
14423      (primitive or not) matters. */
14424   if (ndims == 1)
14425     return build_new_array (type, TREE_VALUE (dims));
14426
14427   /* Can't reuse what's already written in expr.c because it uses the
14428      JVM stack representation. Provide a build_multianewarray. FIXME */
14429   return build (CALL_EXPR, array_type,
14430                 build_address_of (soft_multianewarray_node),
14431                 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
14432                            tree_cons (NULL_TREE,
14433                                       build_int_2 (ndims, 0), dims )),
14434                 NULL_TREE);
14435 }
14436
14437 /* 10.6 Array initializer.  */
14438
14439 /* Build a wfl for array element that don't have one, so we can
14440    pin-point errors.  */
14441
14442 static tree
14443 maybe_build_array_element_wfl (tree node)
14444 {
14445   if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
14446     return build_expr_wfl (NULL_TREE, ctxp->filename,
14447                            ctxp->elc.line, ctxp->elc.prev_col);
14448   else
14449     return NULL_TREE;
14450 }
14451
14452 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14453    identification of initialized arrays easier to detect during walk
14454    and expansion.  */
14455
14456 static tree
14457 build_new_array_init (int location, tree values)
14458 {
14459   tree constructor = build_constructor (NULL_TREE, values);
14460   tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
14461   EXPR_WFL_LINECOL (to_return) = location;
14462   return to_return;
14463 }
14464
14465 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14466    occurred.  Otherwise return NODE after having set its type
14467    appropriately.  */
14468
14469 static tree
14470 patch_new_array_init (tree type, tree node)
14471 {
14472   int error_seen = 0;
14473   tree current, element_type;
14474   HOST_WIDE_INT length;
14475   int all_constant = 1;
14476   tree init = TREE_OPERAND (node, 0);
14477
14478   if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
14479     {
14480       parse_error_context (node,
14481                            "Invalid array initializer for non-array type `%s'",
14482                            lang_printable_name (type, 1));
14483       return error_mark_node;
14484     }
14485   type = TREE_TYPE (type);
14486   element_type = TYPE_ARRAY_ELEMENT (type);
14487
14488   CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
14489
14490   for (length = 0, current = CONSTRUCTOR_ELTS (init);
14491        current;  length++, current = TREE_CHAIN (current))
14492     {
14493       tree elt = TREE_VALUE (current);
14494       if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
14495         {
14496           error_seen |= array_constructor_check_entry (element_type, current);
14497           elt = TREE_VALUE (current);
14498           /* When compiling to native code, STRING_CST is converted to
14499              INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14500           if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
14501             all_constant = 0;
14502         }
14503       else
14504         {
14505           TREE_VALUE (current) = patch_new_array_init (element_type, elt);
14506           TREE_PURPOSE (current) = NULL_TREE;
14507           all_constant = 0;
14508         }
14509       if (elt && TREE_CODE (elt) == TREE_LIST
14510           && TREE_VALUE (elt) == error_mark_node)
14511         error_seen = 1;
14512     }
14513
14514   if (error_seen)
14515     return error_mark_node;
14516
14517   /* Create a new type. We can't reuse the one we have here by
14518      patching its dimension because it originally is of dimension -1
14519      hence reused by gcc. This would prevent triangular arrays. */
14520   type = build_java_array_type (element_type, length);
14521   TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
14522   TREE_TYPE (node) = promote_type (type);
14523   TREE_CONSTANT (init) = all_constant;
14524   TREE_INVARIANT (init) = all_constant;
14525   TREE_CONSTANT (node) = all_constant;
14526   TREE_INVARIANT (node) = all_constant;
14527   return node;
14528 }
14529
14530 /* Verify that one entry of the initializer element list can be
14531    assigned to the array base type. Report 1 if an error occurred, 0
14532    otherwise.  */
14533
14534 static int
14535 array_constructor_check_entry (tree type, tree entry)
14536 {
14537   char *array_type_string = NULL;       /* For error reports */
14538   tree value, type_value, new_value, wfl_value, patched;
14539   int error_seen = 0;
14540
14541   new_value = NULL_TREE;
14542   wfl_value = TREE_VALUE (entry);
14543
14544   value = java_complete_tree (TREE_VALUE (entry));
14545   /* patch_string return error_mark_node if arg is error_mark_node */
14546   if ((patched = patch_string (value)))
14547     value = patched;
14548   if (value == error_mark_node)
14549     return 1;
14550
14551   type_value = TREE_TYPE (value);
14552
14553   /* At anytime, try_builtin_assignconv can report a warning on
14554      constant overflow during narrowing. */
14555   SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
14556   new_value = try_builtin_assignconv (wfl_operator, type, value);
14557   if (!new_value && (new_value = try_reference_assignconv (type, value)))
14558     type_value = promote_type (type);
14559
14560   /* Check and report errors */
14561   if (!new_value)
14562     {
14563       const char *const msg = (!valid_cast_to_p (type_value, type) ?
14564                    "Can't" : "Explicit cast needed to");
14565       if (!array_type_string)
14566         array_type_string = xstrdup (lang_printable_name (type, 1));
14567       parse_error_context
14568         (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
14569          msg, lang_printable_name (type_value, 1), array_type_string);
14570       error_seen = 1;
14571     }
14572
14573   if (new_value)
14574     TREE_VALUE (entry) = new_value;
14575
14576   if (array_type_string)
14577     free (array_type_string);
14578
14579   TREE_PURPOSE (entry) = NULL_TREE;
14580   return error_seen;
14581 }
14582
14583 static tree
14584 build_this (int location)
14585 {
14586   tree node = build_wfl_node (this_identifier_node);
14587   TREE_SET_CODE (node, THIS_EXPR);
14588   EXPR_WFL_LINECOL (node) = location;
14589   return node;
14590 }
14591
14592 /* 14.15 The return statement. It builds a modify expression that
14593    assigns the returned value to the RESULT_DECL that hold the value
14594    to be returned. */
14595
14596 static tree
14597 build_return (int location, tree op)
14598 {
14599   tree node = build1 (RETURN_EXPR, NULL_TREE, op);
14600   EXPR_WFL_LINECOL (node) = location;
14601   node = build_debugable_stmt (location, node);
14602   return node;
14603 }
14604
14605 static tree
14606 patch_return (tree node)
14607 {
14608   tree return_exp = TREE_OPERAND (node, 0);
14609   tree meth = current_function_decl;
14610   tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
14611   int error_found = 0;
14612
14613   TREE_TYPE (node) = error_mark_node;
14614   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14615
14616   /* It's invalid to have a return value within a function that is
14617      declared with the keyword void or that is a constructor */
14618   if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
14619     error_found = 1;
14620
14621   /* It's invalid to use a return statement in a static block */
14622   if (DECL_CLINIT_P (current_function_decl))
14623     error_found = 1;
14624
14625   /* It's invalid to have a no return value within a function that
14626      isn't declared with the keyword `void' */
14627   if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
14628     error_found = 2;
14629
14630   if (DECL_INSTINIT_P (current_function_decl))
14631     error_found = 1;
14632
14633   if (error_found)
14634     {
14635       if (DECL_INSTINIT_P (current_function_decl))
14636         parse_error_context (wfl_operator,
14637                              "`return' inside instance initializer");
14638
14639       else if (DECL_CLINIT_P (current_function_decl))
14640         parse_error_context (wfl_operator,
14641                              "`return' inside static initializer");
14642
14643       else if (!DECL_CONSTRUCTOR_P (meth))
14644         {
14645           char *t = xstrdup (lang_printable_name (mtype, 0));
14646           parse_error_context (wfl_operator,
14647                                "`return' with%s value from `%s %s'",
14648                                (error_found == 1 ? "" : "out"),
14649                                t, lang_printable_name (meth, 0));
14650           free (t);
14651         }
14652       else
14653         parse_error_context (wfl_operator,
14654                              "`return' with value from constructor `%s'",
14655                              lang_printable_name (meth, 0));
14656       return error_mark_node;
14657     }
14658
14659   /* If we have a return_exp, build a modify expression and expand
14660      it. Note: at that point, the assignment is declared valid, but we
14661      may want to carry some more hacks */
14662   if (return_exp)
14663     {
14664       tree exp = java_complete_tree (return_exp);
14665       tree modify, patched;
14666
14667       if ((patched = patch_string (exp)))
14668         exp = patched;
14669
14670       modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
14671       EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
14672       modify = java_complete_tree (modify);
14673
14674       if (modify != error_mark_node)
14675         {
14676           TREE_SIDE_EFFECTS (modify) = 1;
14677           TREE_OPERAND (node, 0) = modify;
14678         }
14679       else
14680         return error_mark_node;
14681     }
14682   TREE_TYPE (node) = void_type_node;
14683   TREE_SIDE_EFFECTS (node) = 1;
14684   return node;
14685 }
14686
14687 /* 14.8 The if Statement */
14688
14689 static tree
14690 build_if_else_statement (int location, tree expression, tree if_body,
14691                          tree else_body)
14692 {
14693   tree node;
14694   if (!else_body)
14695     else_body = build_java_empty_stmt ();
14696   node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
14697   EXPR_WFL_LINECOL (node) = location;
14698   node = build_debugable_stmt (location, node);
14699   return node;
14700 }
14701
14702 static tree
14703 patch_if_else_statement (tree node)
14704 {
14705   tree expression = TREE_OPERAND (node, 0);
14706   int can_complete_normally
14707     = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
14708        | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
14709
14710   TREE_TYPE (node) = error_mark_node;
14711   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14712
14713   /* The type of expression must be boolean */
14714   if (TREE_TYPE (expression) != boolean_type_node
14715       && TREE_TYPE (expression) != promoted_boolean_type_node)
14716     {
14717       parse_error_context
14718         (wfl_operator,
14719          "Incompatible type for `if'. Can't convert `%s' to `boolean'",
14720          lang_printable_name (TREE_TYPE (expression), 0));
14721       return error_mark_node;
14722     }
14723
14724   TREE_TYPE (node) = void_type_node;
14725   TREE_SIDE_EFFECTS (node) = 1;
14726   CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14727   return node;
14728 }
14729
14730 /* 14.6 Labeled Statements */
14731
14732 /* Action taken when a labeled statement is parsed. a new
14733    LABELED_BLOCK_EXPR is created. No statement is attached to the
14734    label, yet.  LABEL can be NULL_TREE for artificially-generated blocks. */
14735
14736 static tree
14737 build_labeled_block (int location, tree label)
14738 {
14739   tree label_name ;
14740   tree label_decl, node;
14741   if (label == NULL_TREE || label == continue_identifier_node)
14742     label_name = label;
14743   else
14744     {
14745       label_name = merge_qualified_name (label_id, label);
14746       /* Issue an error if we try to reuse a label that was previously
14747          declared */
14748       if (IDENTIFIER_LOCAL_VALUE (label_name))
14749         {
14750           EXPR_WFL_LINECOL (wfl_operator) = location;
14751           parse_error_context (wfl_operator,
14752             "Declaration of `%s' shadows a previous label declaration",
14753                                IDENTIFIER_POINTER (label));
14754           EXPR_WFL_LINECOL (wfl_operator) =
14755             EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
14756           parse_error_context (wfl_operator,
14757             "This is the location of the previous declaration of label `%s'",
14758                                IDENTIFIER_POINTER (label));
14759           java_error_count--;
14760         }
14761     }
14762
14763   label_decl = create_label_decl (label_name);
14764   node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
14765   EXPR_WFL_LINECOL (node) = location;
14766   TREE_SIDE_EFFECTS (node) = 1;
14767   return node;
14768 }
14769
14770 /* A labeled statement LBE is attached a statement.  */
14771
14772 static tree
14773 finish_labeled_statement (tree lbe, /* Labeled block expr */
14774                           tree statement)
14775 {
14776   /* In anyways, tie the loop to its statement */
14777   LABELED_BLOCK_BODY (lbe) = statement;
14778   pop_labeled_block ();
14779   POP_LABELED_BLOCK ();
14780   return lbe;
14781 }
14782
14783 /* 14.10, 14.11, 14.12 Loop Statements */
14784
14785 /* Create an empty LOOP_EXPR and make it the last in the nested loop
14786    list. */
14787
14788 static tree
14789 build_new_loop (tree loop_body)
14790 {
14791   tree loop =  build (LOOP_EXPR, NULL_TREE, loop_body);
14792   TREE_SIDE_EFFECTS (loop) = 1;
14793   PUSH_LOOP (loop);
14794   return loop;
14795 }
14796
14797 /* Create a loop body according to the following structure:
14798      COMPOUND_EXPR
14799        COMPOUND_EXPR            (loop main body)
14800          EXIT_EXPR              (this order is for while/for loops.
14801          LABELED_BLOCK_EXPR      the order is reversed for do loops)
14802            LABEL_DECL           (a continue occurring here branches at the
14803            BODY                  end of this labeled block)
14804        INCREMENT                (if any)
14805
14806   REVERSED, if nonzero, tells that the loop condition expr comes
14807   after the body, like in the do-while loop.
14808
14809   To obtain a loop, the loop body structure described above is
14810   encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
14811
14812    LABELED_BLOCK_EXPR
14813      LABEL_DECL                   (use this label to exit the loop)
14814      LOOP_EXPR
14815        <structure described above> */
14816
14817 static tree
14818 build_loop_body (int location, tree condition, int reversed)
14819 {
14820   tree first, second, body;
14821
14822   condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
14823   EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
14824   condition = build_debugable_stmt (location, condition);
14825   TREE_SIDE_EFFECTS (condition) = 1;
14826
14827   body = build_labeled_block (0, continue_identifier_node);
14828   first = (reversed ? body : condition);
14829   second = (reversed ? condition : body);
14830   return
14831     build (COMPOUND_EXPR, NULL_TREE,
14832            build (COMPOUND_EXPR, NULL_TREE, first, second),
14833                   build_java_empty_stmt ());
14834 }
14835
14836 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
14837    their order) on the current loop. Unlink the current loop from the
14838    loop list.  */
14839
14840 static tree
14841 finish_loop_body (int location, tree condition, tree body, int reversed)
14842 {
14843   tree to_return = ctxp->current_loop;
14844   tree loop_body = LOOP_EXPR_BODY (to_return);
14845   if (condition)
14846     {
14847       tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
14848       /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
14849          The real EXIT_EXPR is one operand further. */
14850       EXPR_WFL_LINECOL (cnode) = location;
14851       /* This one is for accurate error reports */
14852       EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
14853       TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
14854     }
14855   LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
14856   POP_LOOP ();
14857   return to_return;
14858 }
14859
14860 /* Tailored version of finish_loop_body for FOR loops, when FOR
14861    loops feature the condition part */
14862
14863 static tree
14864 finish_for_loop (int location, tree condition, tree update, tree body)
14865 {
14866   /* Put the condition and the loop body in place */
14867   tree loop = finish_loop_body (location, condition, body, 0);
14868   /* LOOP is the current loop which has been now popped of the loop
14869      stack.  Mark the update block as reachable and install it.  We do
14870      this because the (current interpretation of the) JLS requires
14871      that the update expression be considered reachable even if the
14872      for loop's body doesn't complete normally.  */
14873   if (update != NULL_TREE && !IS_EMPTY_STMT (update))
14874     {
14875       tree up2 = update;
14876       if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
14877         up2 = EXPR_WFL_NODE (up2);
14878       /* It is possible for the update expression to be an
14879          EXPR_WFL_NODE wrapping nothing.  */
14880       if (up2 != NULL_TREE && !IS_EMPTY_STMT (up2))
14881         {
14882           /* Try to detect constraint violations.  These would be
14883              programming errors somewhere.  */
14884           if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
14885               || TREE_CODE (up2) == LOOP_EXPR)
14886             abort ();
14887           SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
14888         }
14889     }
14890   LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
14891   return loop;
14892 }
14893
14894 /* Try to find the loop a block might be related to. This comprises
14895    the case where the LOOP_EXPR is found as the second operand of a
14896    COMPOUND_EXPR, because the loop happens to have an initialization
14897    part, then expressed as the first operand of the COMPOUND_EXPR. If
14898    the search finds something, 1 is returned. Otherwise, 0 is
14899    returned. The search is assumed to start from a
14900    LABELED_BLOCK_EXPR's block.  */
14901
14902 static tree
14903 search_loop (tree statement)
14904 {
14905   if (TREE_CODE (statement) == LOOP_EXPR)
14906     return statement;
14907
14908   if (TREE_CODE (statement) == BLOCK)
14909     statement = BLOCK_SUBBLOCKS (statement);
14910   else
14911     return NULL_TREE;
14912
14913   if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
14914     while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
14915       statement = TREE_OPERAND (statement, 1);
14916
14917   return (TREE_CODE (statement) == LOOP_EXPR
14918           && FOR_LOOP_P (statement) ? statement : NULL_TREE);
14919 }
14920
14921 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
14922    returned otherwise.  */
14923
14924 static int
14925 labeled_block_contains_loop_p (tree block, tree loop)
14926 {
14927   if (!block)
14928     return 0;
14929
14930   if (LABELED_BLOCK_BODY (block) == loop)
14931     return 1;
14932
14933   if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
14934     return 1;
14935
14936   return 0;
14937 }
14938
14939 /* If the loop isn't surrounded by a labeled statement, create one and
14940    insert LOOP as its body.  */
14941
14942 static tree
14943 patch_loop_statement (tree loop)
14944 {
14945   tree loop_label;
14946
14947   TREE_TYPE (loop) = void_type_node;
14948   if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
14949     return loop;
14950
14951   loop_label = build_labeled_block (0, NULL_TREE);
14952   /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
14953      that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
14954   LABELED_BLOCK_BODY (loop_label) = loop;
14955   PUSH_LABELED_BLOCK (loop_label);
14956   return loop_label;
14957 }
14958
14959 /* 14.13, 14.14: break and continue Statements */
14960
14961 /* Build a break or a continue statement. a null NAME indicates an
14962    unlabeled break/continue statement.  */
14963
14964 static tree
14965 build_bc_statement (int location, int is_break, tree name)
14966 {
14967   tree break_continue, label_block_expr = NULL_TREE;
14968
14969   if (name)
14970     {
14971       if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
14972             (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
14973         /* Null means that we don't have a target for this named
14974            break/continue. In this case, we make the target to be the
14975            label name, so that the error can be reported accurately in
14976            patch_bc_statement. */
14977         label_block_expr = EXPR_WFL_NODE (name);
14978     }
14979   /* Unlabeled break/continue will be handled during the
14980      break/continue patch operation */
14981   break_continue
14982     = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
14983
14984   IS_BREAK_STMT_P (break_continue) = is_break;
14985   TREE_SIDE_EFFECTS (break_continue) = 1;
14986   EXPR_WFL_LINECOL (break_continue) = location;
14987   break_continue = build_debugable_stmt (location, break_continue);
14988   return break_continue;
14989 }
14990
14991 /* Verification of a break/continue statement. */
14992
14993 static tree
14994 patch_bc_statement (tree node)
14995 {
14996   tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
14997   tree labeled_block = ctxp->current_labeled_block;
14998   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14999
15000   /* Having an identifier here means that the target is unknown. */
15001   if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
15002     {
15003       parse_error_context (wfl_operator, "No label definition found for `%s'",
15004                            IDENTIFIER_POINTER (bc_label));
15005       return error_mark_node;
15006     }
15007   if (! IS_BREAK_STMT_P (node))
15008     {
15009       /* It's a continue statement. */
15010       for (;; labeled_block = TREE_CHAIN (labeled_block))
15011         {
15012           if (labeled_block == NULL_TREE)
15013             {
15014               if (bc_label == NULL_TREE)
15015                 parse_error_context (wfl_operator,
15016                                      "`continue' must be in loop");
15017               else
15018                 parse_error_context
15019                   (wfl_operator, "continue label `%s' does not name a loop",
15020                    IDENTIFIER_POINTER (bc_label));
15021               return error_mark_node;
15022             }
15023           if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
15024                == continue_identifier_node)
15025               && (bc_label == NULL_TREE
15026                   || TREE_CHAIN (labeled_block) == bc_label))
15027             {
15028               bc_label = labeled_block;
15029               break;
15030             }
15031         }
15032     }
15033   else if (!bc_label)
15034     {
15035       for (;; labeled_block = TREE_CHAIN (labeled_block))
15036         {
15037           if (labeled_block == NULL_TREE)
15038             {
15039               parse_error_context (wfl_operator,
15040                                      "`break' must be in loop or switch");
15041               return error_mark_node;
15042             }
15043           target_stmt = LABELED_BLOCK_BODY (labeled_block);
15044           if (TREE_CODE (target_stmt) == SWITCH_EXPR
15045               || search_loop (target_stmt))
15046             {
15047               bc_label = labeled_block;
15048               break;
15049             }
15050         }
15051     }
15052
15053   EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
15054   CAN_COMPLETE_NORMALLY (bc_label) = 1;
15055
15056   /* Our break/continue don't return values. */
15057   TREE_TYPE (node) = void_type_node;
15058   /* Encapsulate the break within a compound statement so that it's
15059      expanded all the times by expand_expr (and not clobbered
15060      sometimes, like after a if statement) */
15061   node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
15062   TREE_SIDE_EFFECTS (node) = 1;
15063   return node;
15064 }
15065
15066 /* Process the exit expression belonging to a loop. Its type must be
15067    boolean.  */
15068
15069 static tree
15070 patch_exit_expr (tree node)
15071 {
15072   tree expression = TREE_OPERAND (node, 0);
15073   TREE_TYPE (node) = error_mark_node;
15074   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15075
15076   /* The type of expression must be boolean */
15077   if (TREE_TYPE (expression) != boolean_type_node)
15078     {
15079       parse_error_context
15080         (wfl_operator,
15081     "Incompatible type for loop conditional. Can't convert `%s' to `boolean'",
15082          lang_printable_name (TREE_TYPE (expression), 0));
15083       return error_mark_node;
15084     }
15085   /* Now we know things are allright, invert the condition, fold and
15086      return */
15087   TREE_OPERAND (node, 0) =
15088     fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
15089
15090   if (! integer_zerop (TREE_OPERAND (node, 0))
15091       && ctxp->current_loop != NULL_TREE
15092       && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
15093     CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
15094   if (! integer_onep (TREE_OPERAND (node, 0)))
15095     CAN_COMPLETE_NORMALLY (node) = 1;
15096
15097
15098   TREE_TYPE (node) = void_type_node;
15099   return node;
15100 }
15101
15102 /* 14.9 Switch statement */
15103
15104 static tree
15105 patch_switch_statement (tree node)
15106 {
15107   tree se = TREE_OPERAND (node, 0), se_type;
15108   tree save, iter;
15109
15110   /* Complete the switch expression */
15111   se = TREE_OPERAND (node, 0) = java_complete_tree (se);
15112   se_type = TREE_TYPE (se);
15113   /* The type of the switch expression must be char, byte, short or
15114      int */
15115   if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
15116     {
15117       EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15118       parse_error_context (wfl_operator,
15119           "Incompatible type for `switch'. Can't convert `%s' to `int'",
15120                            lang_printable_name (se_type, 0));
15121       /* This is what java_complete_tree will check */
15122       TREE_OPERAND (node, 0) = error_mark_node;
15123       return error_mark_node;
15124     }
15125
15126   /* Save and restore the outer case label list.  */
15127   save = case_label_list;
15128   case_label_list = NULL_TREE;
15129
15130   TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
15131
15132   /* See if we've found a duplicate label.  We can't leave this until
15133      code generation, because in `--syntax-only' and `-C' modes we
15134      don't do ordinary code generation.  */
15135   for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
15136     {
15137       HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
15138       tree subiter;
15139       for (subiter = TREE_CHAIN (iter);
15140            subiter != NULL_TREE;
15141            subiter = TREE_CHAIN (subiter))
15142         {
15143           HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
15144           if (val == subval)
15145             {
15146               EXPR_WFL_LINECOL (wfl_operator)
15147                 = EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
15148               /* The case_label_list is in reverse order, so print the
15149                  outer label first.  */
15150               parse_error_context (wfl_operator, "duplicate case label: `"
15151                                    HOST_WIDE_INT_PRINT_DEC "'", subval);
15152               EXPR_WFL_LINECOL (wfl_operator)
15153                 = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
15154               parse_error_context (wfl_operator, "original label is here");
15155
15156               break;
15157             }
15158         }
15159     }
15160
15161   case_label_list = save;
15162
15163   /* Ready to return */
15164   if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
15165     {
15166       TREE_TYPE (node) = error_mark_node;
15167       return error_mark_node;
15168     }
15169   TREE_TYPE (node) = void_type_node;
15170   TREE_SIDE_EFFECTS (node) = 1;
15171   CAN_COMPLETE_NORMALLY (node)
15172     = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15173       || ! SWITCH_HAS_DEFAULT (node);
15174   return node;
15175 }
15176
15177 /* Assertions.  */
15178
15179 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15180    might be NULL_TREE.  */
15181 static tree
15182 build_assertion (int location, tree condition, tree value)
15183 {
15184   tree node;
15185   tree klass = GET_CPC ();
15186
15187   if (! enable_assertions (klass))
15188     {
15189       condition = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15190                          boolean_false_node, condition);
15191       if (value == NULL_TREE)
15192         value = build_java_empty_stmt ();
15193       return build_if_else_statement (location, condition,
15194                                       value, NULL_TREE);
15195     }
15196
15197   if (! CLASS_USES_ASSERTIONS (klass))
15198     {
15199       tree field, classdollar, id, call;
15200       tree class_type = TREE_TYPE (klass);
15201
15202       field = add_field (class_type,
15203                          get_identifier ("$assertionsDisabled"),
15204                          boolean_type_node,
15205                          ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
15206       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
15207       FIELD_SYNTHETIC (field) = 1;
15208
15209       classdollar = build_incomplete_class_ref (location, class_type);
15210
15211       /* Call CLASS.desiredAssertionStatus().  */
15212       id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
15213       call = build (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
15214       call = make_qualified_primary (classdollar, call, location);
15215       TREE_SIDE_EFFECTS (call) = 1;
15216
15217       /* Invert to obtain !CLASS.desiredAssertionStatus().  This may
15218          seem odd, but we do it to generate code identical to that of
15219          the JDK.  */
15220       call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
15221       TREE_SIDE_EFFECTS (call) = 1;
15222       DECL_INITIAL (field) = call;
15223
15224       /* Record the initializer in the initializer statement list.  */
15225       call = build (MODIFY_EXPR, NULL_TREE, field, call);
15226       TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
15227       SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
15228       MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
15229
15230       CLASS_USES_ASSERTIONS (klass) = 1;
15231     }
15232
15233   if (value != NULL_TREE)
15234     value = tree_cons (NULL_TREE, value, NULL_TREE);
15235
15236   node = build_wfl_node (get_identifier ("java"));
15237   node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
15238                               location);
15239   node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
15240                               location);
15241
15242   node = build (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
15243   TREE_SIDE_EFFECTS (node) = 1;
15244   /* It is too early to use BUILD_THROW.  */
15245   node = build1 (THROW_EXPR, NULL_TREE, node);
15246   TREE_SIDE_EFFECTS (node) = 1;
15247
15248   /* We invert the condition; if we just put NODE as the `else' part
15249      then we generate weird-looking bytecode.  */
15250   condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
15251   /* Check $assertionsDisabled.  */
15252   condition
15253     = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15254              build1 (TRUTH_NOT_EXPR, NULL_TREE,
15255                      build_wfl_node (get_identifier ("$assertionsDisabled"))),
15256              condition);
15257   node = build_if_else_statement (location, condition, node, NULL_TREE);
15258   return node;
15259 }
15260
15261 /* 14.18 The try/catch statements */
15262
15263 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15264    catches TYPE and executes CATCH_STMTS.  */
15265
15266 static tree
15267 encapsulate_with_try_catch (int location, tree type_or_name, tree try_stmts,
15268                             tree catch_stmts)
15269 {
15270   tree try_block, catch_clause_param, catch_block, catch;
15271
15272   /* First build a try block */
15273   try_block = build_expr_block (try_stmts, NULL_TREE);
15274
15275   /* Build a catch block: we need a catch clause parameter */
15276   if (TREE_CODE (type_or_name) == EXPR_WITH_FILE_LOCATION)
15277     {
15278       tree catch_type = obtain_incomplete_type (type_or_name);
15279       jdep *dep;
15280       catch_clause_param = build_decl (VAR_DECL, wpv_id, catch_type);
15281       register_incomplete_type (JDEP_VARIABLE, type_or_name,
15282                                 catch_clause_param, catch_type);
15283       dep = CLASSD_LAST (ctxp->classd_list);
15284       JDEP_GET_PATCH (dep) = &TREE_TYPE (catch_clause_param);
15285     }
15286   else
15287     catch_clause_param = build_decl (VAR_DECL, wpv_id,
15288                                      build_pointer_type (type_or_name));
15289
15290   /* And a block */
15291   catch_block = build_expr_block (NULL_TREE, catch_clause_param);
15292
15293   /* Initialize the variable and store in the block */
15294   catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param,
15295                  build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
15296   add_stmt_to_block (catch_block, NULL_TREE, catch);
15297
15298   /* Add the catch statements */
15299   add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
15300
15301   /* Now we can build a JAVA_CATCH_EXPR */
15302   catch_block = build1 (JAVA_CATCH_EXPR, NULL_TREE, catch_block);
15303
15304   return build_try_statement (location, try_block, catch_block);
15305 }
15306
15307 static tree
15308 build_try_statement (int location, tree try_block, tree catches)
15309 {
15310   tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
15311   EXPR_WFL_LINECOL (node) = location;
15312   return node;
15313 }
15314
15315 static tree
15316 build_try_finally_statement (int location, tree try_block, tree finally)
15317 {
15318   tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
15319   EXPR_WFL_LINECOL (node) = location;
15320   return node;
15321 }
15322
15323 static tree
15324 patch_try_statement (tree node)
15325 {
15326   int error_found = 0;
15327   tree try = TREE_OPERAND (node, 0);
15328   /* Exception handlers are considered in left to right order */
15329   tree catch = nreverse (TREE_OPERAND (node, 1));
15330   tree current, caught_type_list = NULL_TREE;
15331
15332   /* Check catch clauses, if any. Every time we find an error, we try
15333      to process the next catch clause. We process the catch clause before
15334      the try block so that when processing the try block we can check thrown
15335      exceptions againts the caught type list. */
15336   for (current = catch; current; current = TREE_CHAIN (current))
15337     {
15338       tree carg_decl, carg_type;
15339       tree sub_current, catch_block, catch_clause;
15340       int unreachable;
15341
15342       /* At this point, the structure of the catch clause is
15343            JAVA_CATCH_EXPR              (catch node)
15344              BLOCK              (with the decl of the parameter)
15345                COMPOUND_EXPR
15346                  MODIFY_EXPR   (assignment of the catch parameter)
15347                  BLOCK          (catch clause block)
15348        */
15349       catch_clause = TREE_OPERAND (current, 0);
15350       carg_decl = BLOCK_EXPR_DECLS (catch_clause);
15351       carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
15352
15353       /* Catch clauses can't have more than one parameter declared,
15354          but it's already enforced by the grammar. Make sure that the
15355          only parameter of the clause statement in of class Throwable
15356          or a subclass of Throwable, but that was done earlier. The
15357          catch clause parameter type has also been resolved. */
15358
15359       /* Just make sure that the catch clause parameter type inherits
15360          from java.lang.Throwable */
15361       if (!inherits_from_p (carg_type, throwable_type_node))
15362         {
15363           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15364           parse_error_context (wfl_operator,
15365                                "Can't catch class `%s'. Catch clause parameter type must be a subclass of class `java.lang.Throwable'",
15366                                lang_printable_name (carg_type, 0));
15367           error_found = 1;
15368           continue;
15369         }
15370
15371       /* Partial check for unreachable catch statement: The catch
15372          clause is reachable iff is no earlier catch block A in
15373          the try statement such that the type of the catch
15374          clause's parameter is the same as or a subclass of the
15375          type of A's parameter */
15376       unreachable = 0;
15377       for (sub_current = catch;
15378            sub_current != current; sub_current = TREE_CHAIN (sub_current))
15379         {
15380           tree sub_catch_clause, decl;
15381           sub_catch_clause = TREE_OPERAND (sub_current, 0);
15382           decl = BLOCK_EXPR_DECLS (sub_catch_clause);
15383
15384           if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
15385             {
15386               EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15387               parse_error_context
15388                 (wfl_operator,
15389                  "`catch' not reached because of the catch clause at line %d",
15390                  EXPR_WFL_LINENO (sub_current));
15391               unreachable = error_found = 1;
15392               break;
15393             }
15394         }
15395       /* Complete the catch clause block */
15396       catch_block = java_complete_tree (TREE_OPERAND (current, 0));
15397       if (catch_block == error_mark_node)
15398         {
15399           error_found = 1;
15400           continue;
15401         }
15402       if (CAN_COMPLETE_NORMALLY (catch_block))
15403         CAN_COMPLETE_NORMALLY (node) = 1;
15404       TREE_OPERAND (current, 0) = catch_block;
15405
15406       if (unreachable)
15407         continue;
15408
15409       /* Things to do here: the exception must be thrown */
15410
15411       /* Link this type to the caught type list */
15412       caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
15413     }
15414
15415   PUSH_EXCEPTIONS (caught_type_list);
15416   if ((try = java_complete_tree (try)) == error_mark_node)
15417     error_found = 1;
15418   if (CAN_COMPLETE_NORMALLY (try))
15419     CAN_COMPLETE_NORMALLY (node) = 1;
15420   POP_EXCEPTIONS ();
15421
15422   /* Verification ends here */
15423   if (error_found)
15424     return error_mark_node;
15425
15426   TREE_OPERAND (node, 0) = try;
15427   TREE_OPERAND (node, 1) = catch;
15428   TREE_TYPE (node) = void_type_node;
15429   return node;
15430 }
15431
15432 /* 14.17 The synchronized Statement */
15433
15434 static tree
15435 patch_synchronized_statement (tree node, tree wfl_op1)
15436 {
15437   tree expr = java_complete_tree (TREE_OPERAND (node, 0));
15438   tree block = TREE_OPERAND (node, 1);
15439
15440   tree tmp, enter, exit, expr_decl, assignment;
15441
15442   if (expr == error_mark_node)
15443     {
15444       block = java_complete_tree (block);
15445       return expr;
15446     }
15447
15448   /* We might be trying to synchronize on a STRING_CST */
15449   if ((tmp = patch_string (expr)))
15450     expr = tmp;
15451
15452   /* The TYPE of expr must be a reference type */
15453   if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
15454     {
15455       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15456       parse_error_context (wfl_operator, "Incompatible type for `synchronized'. Can't convert `%s' to `java.lang.Object'",
15457                            lang_printable_name (TREE_TYPE (expr), 0));
15458       return error_mark_node;
15459     }
15460
15461   if (flag_emit_xref)
15462     {
15463       TREE_OPERAND (node, 0) = expr;
15464       TREE_OPERAND (node, 1) = java_complete_tree (block);
15465       CAN_COMPLETE_NORMALLY (node) = 1;
15466       return node;
15467     }
15468
15469   /* Generate a try-finally for the synchronized statement, except
15470      that the handler that catches all throw exception calls
15471      _Jv_MonitorExit and then rethrow the exception.
15472      The synchronized statement is then implemented as:
15473      TRY
15474        {
15475          _Jv_MonitorEnter (expression)
15476          synchronized_block
15477          _Jv_MonitorExit (expression)
15478        }
15479      CATCH_ALL
15480        {
15481          e = _Jv_exception_info ();
15482          _Jv_MonitorExit (expression)
15483          Throw (e);
15484        } */
15485
15486   expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
15487   BUILD_MONITOR_ENTER (enter, expr_decl);
15488   BUILD_MONITOR_EXIT (exit, expr_decl);
15489   CAN_COMPLETE_NORMALLY (enter) = 1;
15490   CAN_COMPLETE_NORMALLY (exit) = 1;
15491   assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
15492   TREE_SIDE_EFFECTS (assignment) = 1;
15493   node = build (COMPOUND_EXPR, NULL_TREE,
15494                 build (COMPOUND_EXPR, NULL_TREE, assignment, enter),
15495                 build (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
15496   node = build_expr_block (node, expr_decl);
15497
15498   return java_complete_tree (node);
15499 }
15500
15501 /* 14.16 The throw Statement */
15502
15503 static tree
15504 patch_throw_statement (tree node, tree wfl_op1)
15505 {
15506   tree expr = TREE_OPERAND (node, 0);
15507   tree type = TREE_TYPE (expr);
15508   int unchecked_ok = 0, tryblock_throws_ok = 0;
15509
15510   /* Thrown expression must be assignable to java.lang.Throwable */
15511   if (!try_reference_assignconv (throwable_type_node, expr))
15512     {
15513       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15514       parse_error_context (wfl_operator,
15515     "Can't throw `%s'; it must be a subclass of class `java.lang.Throwable'",
15516                            lang_printable_name (type, 0));
15517       /* If the thrown expression was a reference, we further the
15518          compile-time check. */
15519       if (!JREFERENCE_TYPE_P (type))
15520         return error_mark_node;
15521     }
15522
15523   /* At least one of the following must be true */
15524
15525   /* The type of the throw expression is a not checked exception,
15526      i.e. is a unchecked expression. */
15527   unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
15528
15529   SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15530   /* An instance can't throw a checked exception unless that exception
15531      is explicitly declared in the `throws' clause of each
15532      constructor. This doesn't apply to anonymous classes, since they
15533      don't have declared constructors. */
15534   if (!unchecked_ok
15535       && DECL_INSTINIT_P (current_function_decl)
15536       && !ANONYMOUS_CLASS_P (current_class))
15537     {
15538       tree current;
15539       for (current = TYPE_METHODS (current_class); current;
15540            current = TREE_CHAIN (current))
15541         if (DECL_CONSTRUCTOR_P (current)
15542             && !check_thrown_exceptions_do (TREE_TYPE (expr)))
15543           {
15544             parse_error_context (wfl_operator, "Checked exception `%s' can't be thrown in instance initializer (not all declared constructor are declaring it in their `throws' clause)",
15545                                  lang_printable_name (TREE_TYPE (expr), 0));
15546             return error_mark_node;
15547           }
15548     }
15549
15550   /* Throw is contained in a try statement and at least one catch
15551      clause can receive the thrown expression or the current method is
15552      declared to throw such an exception. Or, the throw statement is
15553      contained in a method or constructor declaration and the type of
15554      the Expression is assignable to at least one type listed in the
15555      throws clause the declaration. */
15556   if (!unchecked_ok)
15557     tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
15558   if (!(unchecked_ok || tryblock_throws_ok))
15559     {
15560       /* If there is a surrounding try block that has no matching
15561          clatch clause, report it first. A surrounding try block exits
15562          only if there is something after the list of checked
15563          exception thrown by the current function (if any). */
15564       if (IN_TRY_BLOCK_P ())
15565         parse_error_context (wfl_operator, "Checked exception `%s' can't be caught by any of the catch clause(s) of the surrounding `try' block",
15566                              lang_printable_name (type, 0));
15567       /* If we have no surrounding try statement and the method doesn't have
15568          any throws, report it now. FIXME */
15569
15570       /* We report that the exception can't be throw from a try block
15571          in all circumstances but when the `throw' is inside a static
15572          block. */
15573       else if (!EXCEPTIONS_P (currently_caught_type_list)
15574                && !tryblock_throws_ok)
15575         {
15576           if (DECL_CLINIT_P (current_function_decl))
15577             parse_error_context (wfl_operator,
15578                    "Checked exception `%s' can't be thrown in initializer",
15579                                  lang_printable_name (type, 0));
15580           else
15581             parse_error_context (wfl_operator,
15582                    "Checked exception `%s' isn't thrown from a `try' block",
15583                                  lang_printable_name (type, 0));
15584         }
15585       /* Otherwise, the current method doesn't have the appropriate
15586          throws declaration */
15587       else
15588         parse_error_context (wfl_operator, "Checked exception `%s' doesn't match any of current method's `throws' declaration(s)",
15589                              lang_printable_name (type, 0));
15590       return error_mark_node;
15591     }
15592
15593   if (! flag_emit_class_files && ! flag_emit_xref)
15594     BUILD_THROW (node, expr);
15595
15596   /* If doing xrefs, keep the location where the `throw' was seen. */
15597   if (flag_emit_xref)
15598     EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
15599   return node;
15600 }
15601
15602 /* Check that exception said to be thrown by method DECL can be
15603    effectively caught from where DECL is invoked.  THIS_EXPR is the
15604    expression that computes `this' for the method call.  */
15605 static void
15606 check_thrown_exceptions (int location, tree decl, tree this_expr)
15607 {
15608   tree throws;
15609   int is_array_call = 0;
15610
15611   /* Skip check within generated methods, such as access$<n>.  */
15612   if (OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
15613     return;
15614
15615   if (this_expr != NULL_TREE
15616       && TREE_CODE (TREE_TYPE (this_expr)) == POINTER_TYPE
15617       && TYPE_ARRAY_P (TREE_TYPE (TREE_TYPE (this_expr))))
15618     is_array_call = 1;
15619
15620   /* For all the unchecked exceptions thrown by DECL.  */
15621   for (throws = DECL_FUNCTION_THROWS (decl); throws;
15622        throws = TREE_CHAIN (throws))
15623     if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
15624       {
15625         /* Suppress errors about cloning arrays.  */
15626         if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
15627           continue;
15628
15629         EXPR_WFL_LINECOL (wfl_operator) = location;
15630         if (DECL_FINIT_P (current_function_decl))
15631           parse_error_context
15632             (wfl_operator, "Exception `%s' can't be thrown in initializer",
15633              lang_printable_name (TREE_VALUE (throws), 0));
15634         else
15635           {
15636             parse_error_context
15637               (wfl_operator, "Exception `%s' must be caught, or it must be declared in the `throws' clause of `%s'",
15638                lang_printable_name (TREE_VALUE (throws), 0),
15639                (DECL_INIT_P (current_function_decl) ?
15640                 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
15641                 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
15642           }
15643       }
15644 }
15645
15646 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
15647    try-catch blocks, OR is listed in the `throws' clause of the
15648    current method.  */
15649
15650 static int
15651 check_thrown_exceptions_do (tree exception)
15652 {
15653   tree list = currently_caught_type_list;
15654   resolve_and_layout (exception, NULL_TREE);
15655   /* First, all the nested try-catch-finally at that stage. The
15656      last element contains `throws' clause exceptions, if any. */
15657   if (IS_UNCHECKED_EXCEPTION_P (exception))
15658     return 1;
15659   while (list)
15660     {
15661       tree caught;
15662       for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
15663         if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
15664           return 1;
15665       list = TREE_CHAIN (list);
15666     }
15667   return 0;
15668 }
15669
15670 static void
15671 purge_unchecked_exceptions (tree mdecl)
15672 {
15673   tree throws = DECL_FUNCTION_THROWS (mdecl);
15674   tree new = NULL_TREE;
15675
15676   while (throws)
15677     {
15678       tree next = TREE_CHAIN (throws);
15679       if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
15680         {
15681           TREE_CHAIN (throws) = new;
15682           new = throws;
15683         }
15684       throws = next;
15685     }
15686   /* List is inverted here, but it doesn't matter */
15687   DECL_FUNCTION_THROWS (mdecl) = new;
15688 }
15689
15690 /* This function goes over all of CLASS_TYPE ctors and checks whether
15691    each of them features at least one unchecked exception in its
15692    `throws' clause. If it's the case, it returns `true', `false'
15693    otherwise.  */
15694
15695 static bool
15696 ctors_unchecked_throws_clause_p (tree class_type)
15697 {
15698   tree current;
15699
15700   for (current = TYPE_METHODS (class_type); current;
15701        current = TREE_CHAIN (current))
15702     {
15703       bool ctu = false; /* Ctor Throws Unchecked */
15704       if (DECL_CONSTRUCTOR_P (current))
15705         {
15706           tree throws;
15707           for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
15708                throws = TREE_CHAIN (throws))
15709             if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
15710               ctu = true;
15711         }
15712       /* We return false as we found one ctor that is unfit. */
15713       if (!ctu && DECL_CONSTRUCTOR_P (current))
15714         return false;
15715     }
15716   /* All ctors feature at least one unchecked exception in their
15717      `throws' clause. */
15718   return true;
15719 }
15720
15721 /* 15.24 Conditional Operator ?: */
15722
15723 static tree
15724 patch_conditional_expr (tree node, tree wfl_cond, tree wfl_op1)
15725 {
15726   tree cond = TREE_OPERAND (node, 0);
15727   tree op1 = TREE_OPERAND (node, 1);
15728   tree op2 = TREE_OPERAND (node, 2);
15729   tree resulting_type = NULL_TREE;
15730   tree t1, t2, patched;
15731   int error_found = 0;
15732
15733   /* Operands of ?: might be StringBuffers crafted as a result of a
15734      string concatenation. Obtain a descent operand here.  */
15735   if ((patched = patch_string (op1)))
15736     TREE_OPERAND (node, 1) = op1 = patched;
15737   if ((patched = patch_string (op2)))
15738     TREE_OPERAND (node, 2) = op2 = patched;
15739
15740   t1 = TREE_TYPE (op1);
15741   t2 = TREE_TYPE (op2);
15742
15743   /* The first expression must be a boolean */
15744   if (TREE_TYPE (cond) != boolean_type_node)
15745     {
15746       SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
15747       parse_error_context (wfl_operator,
15748                "Incompatible type for `?:'. Can't convert `%s' to `boolean'",
15749                            lang_printable_name (TREE_TYPE (cond), 0));
15750       error_found = 1;
15751     }
15752
15753   /* Second and third can be numeric, boolean (i.e. primitive),
15754      references or null. Anything else results in an error */
15755   if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
15756         || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
15757             && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
15758         || (t1 == boolean_type_node && t2 == boolean_type_node)))
15759     error_found = 1;
15760
15761   /* Determine the type of the conditional expression. Same types are
15762      easy to deal with */
15763   else if (t1 == t2)
15764     resulting_type = t1;
15765
15766   /* There are different rules for numeric types */
15767   else if (JNUMERIC_TYPE_P (t1))
15768     {
15769       /* if byte/short found, the resulting type is short */
15770       if ((t1 == byte_type_node && t2 == short_type_node)
15771           || (t1 == short_type_node && t2 == byte_type_node))
15772         resulting_type = short_type_node;
15773
15774       /* If t1 is a constant int and t2 is of type byte, short or char
15775          and t1's value fits in t2, then the resulting type is t2 */
15776       else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
15777           && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
15778         resulting_type = t2;
15779
15780       /* If t2 is a constant int and t1 is of type byte, short or char
15781          and t2's value fits in t1, then the resulting type is t1 */
15782       else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
15783           && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
15784         resulting_type = t1;
15785
15786       /* Otherwise, binary numeric promotion is applied and the
15787          resulting type is the promoted type of operand 1 and 2 */
15788       else
15789         resulting_type = binary_numeric_promotion (t1, t2,
15790                                                    &TREE_OPERAND (node, 1),
15791                                                    &TREE_OPERAND (node, 2));
15792     }
15793
15794   /* Cases of a reference and a null type */
15795   else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
15796     resulting_type = t1;
15797
15798   else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
15799     resulting_type = t2;
15800
15801   /* Last case: different reference types. If a type can be converted
15802      into the other one by assignment conversion, the latter
15803      determines the type of the expression */
15804   else if ((resulting_type = try_reference_assignconv (t1, op2)))
15805     resulting_type = promote_type (t1);
15806
15807   else if ((resulting_type = try_reference_assignconv (t2, op1)))
15808     resulting_type = promote_type (t2);
15809
15810   /* If we don't have any resulting type, we're in trouble */
15811   if (!resulting_type)
15812     {
15813       char *t = xstrdup (lang_printable_name (t1, 0));
15814       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15815       parse_error_context (wfl_operator,
15816                  "Incompatible type for `?:'. Can't convert `%s' to `%s'",
15817                            t, lang_printable_name (t2, 0));
15818       free (t);
15819       error_found = 1;
15820     }
15821
15822   if (error_found)
15823     {
15824       TREE_TYPE (node) = error_mark_node;
15825       return error_mark_node;
15826     }
15827
15828   TREE_TYPE (node) = resulting_type;
15829   TREE_SET_CODE (node, COND_EXPR);
15830   CAN_COMPLETE_NORMALLY (node) = 1;
15831   return node;
15832 }
15833
15834 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
15835
15836 static tree
15837 maybe_build_class_init_for_field (tree decl, tree expr)
15838 {
15839   tree clas = DECL_CONTEXT (decl);
15840   if (flag_emit_class_files || flag_emit_xref)
15841     return expr;
15842
15843   if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
15844       && FIELD_FINAL (decl))
15845     {
15846       tree init = DECL_INITIAL (decl);
15847       if (init != NULL_TREE)
15848         init = fold_constant_for_init (init, decl);
15849       if (init != NULL_TREE && CONSTANT_VALUE_P (init))
15850         return expr;
15851     }
15852
15853   return build_class_init (clas, expr);
15854 }
15855
15856 /* Try to constant fold NODE.
15857    If NODE is not a constant expression, return NULL_EXPR.
15858    CONTEXT is a static final VAR_DECL whose initializer we are folding. */
15859
15860 static tree
15861 fold_constant_for_init (tree node, tree context)
15862 {
15863   tree op0, op1, val;
15864   enum tree_code code = TREE_CODE (node);
15865
15866   switch (code)
15867     {
15868     case INTEGER_CST:
15869       if (node == null_pointer_node)
15870         return NULL_TREE;
15871     case STRING_CST:
15872     case REAL_CST:
15873       return node;
15874
15875     case PLUS_EXPR:
15876     case MINUS_EXPR:
15877     case MULT_EXPR:
15878     case TRUNC_MOD_EXPR:
15879     case RDIV_EXPR:
15880     case LSHIFT_EXPR:
15881     case RSHIFT_EXPR:
15882     case URSHIFT_EXPR:
15883     case BIT_AND_EXPR:
15884     case BIT_XOR_EXPR:
15885     case BIT_IOR_EXPR:
15886     case TRUTH_ANDIF_EXPR:
15887     case TRUTH_ORIF_EXPR:
15888     case EQ_EXPR:
15889     case NE_EXPR:
15890     case GT_EXPR:
15891     case GE_EXPR:
15892     case LT_EXPR:
15893     case LE_EXPR:
15894       op0 = TREE_OPERAND (node, 0);
15895       op1 = TREE_OPERAND (node, 1);
15896       val = fold_constant_for_init (op0, context);
15897       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15898         return NULL_TREE;
15899       TREE_OPERAND (node, 0) = val;
15900       val = fold_constant_for_init (op1, context);
15901       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15902         return NULL_TREE;
15903       TREE_OPERAND (node, 1) = val;
15904       return patch_binop (node, op0, op1);
15905
15906     case UNARY_PLUS_EXPR:
15907     case NEGATE_EXPR:
15908     case TRUTH_NOT_EXPR:
15909     case BIT_NOT_EXPR:
15910     case CONVERT_EXPR:
15911       op0 = TREE_OPERAND (node, 0);
15912       val = fold_constant_for_init (op0, context);
15913       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15914         return NULL_TREE;
15915       TREE_OPERAND (node, 0) = val;
15916       val = patch_unaryop (node, op0);
15917       if (! TREE_CONSTANT (val))
15918         return NULL_TREE;
15919       return val;
15920
15921       break;
15922
15923     case COND_EXPR:
15924       val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
15925       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15926         return NULL_TREE;
15927       TREE_OPERAND (node, 0) = val;
15928       val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
15929       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15930         return NULL_TREE;
15931       TREE_OPERAND (node, 1) = val;
15932       val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
15933       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15934         return NULL_TREE;
15935       TREE_OPERAND (node, 2) = val;
15936       return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
15937         : TREE_OPERAND (node, 2);
15938
15939     case VAR_DECL:
15940     case FIELD_DECL:
15941       if (! FIELD_FINAL (node)
15942           || DECL_INITIAL (node) == NULL_TREE)
15943         return NULL_TREE;
15944       val = DECL_INITIAL (node);
15945       /* Guard against infinite recursion. */
15946       DECL_INITIAL (node) = NULL_TREE;
15947       val = fold_constant_for_init (val, node);
15948       if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
15949         val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
15950       DECL_INITIAL (node) = val;
15951       return val;
15952
15953     case EXPR_WITH_FILE_LOCATION:
15954       /* Compare java_complete_tree and resolve_expression_name. */
15955       if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
15956           || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
15957         {
15958           tree name = EXPR_WFL_NODE (node);
15959           tree decl;
15960           if (PRIMARY_P (node))
15961             return NULL_TREE;
15962           else if (! QUALIFIED_P (name))
15963             {
15964               decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
15965               if (decl == NULL_TREE
15966                   || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
15967                 return NULL_TREE;
15968               return fold_constant_for_init (decl, decl);
15969             }
15970           else
15971             {
15972               /* Install the proper context for the field resolution.
15973                  The prior context is restored once the name is
15974                  properly qualified. */
15975               tree saved_current_class = current_class;
15976               /* Wait until the USE_COMPONENT_REF re-write.  FIXME. */
15977               current_class = DECL_CONTEXT (context);
15978               qualify_ambiguous_name (node);
15979               current_class = saved_current_class;
15980               if (resolve_field_access (node, &decl, NULL)
15981                   && decl != NULL_TREE)
15982                 return fold_constant_for_init (decl, decl);
15983               return NULL_TREE;
15984             }
15985         }
15986       else
15987         {
15988           op0 = TREE_OPERAND (node, 0);
15989           val = fold_constant_for_init (op0, context);
15990           if (val == NULL_TREE || ! TREE_CONSTANT (val))
15991             return NULL_TREE;
15992           TREE_OPERAND (node, 0) = val;
15993           return val;
15994         }
15995
15996 #ifdef USE_COMPONENT_REF
15997     case IDENTIFIER:
15998     case COMPONENT_REF:
15999       ?;
16000 #endif
16001
16002     default:
16003       return NULL_TREE;
16004     }
16005 }
16006
16007 #ifdef USE_COMPONENT_REF
16008 /* Context is 'T' for TypeName, 'P' for PackageName,
16009    'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16010
16011 tree
16012 resolve_simple_name (tree name, int context)
16013 {
16014 }
16015
16016 tree
16017 resolve_qualified_name (tree name, int context)
16018 {
16019 }
16020 #endif
16021
16022 void
16023 init_src_parse (void)
16024 {
16025   /* Sanity check; we've been bit by this before.  */
16026   if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
16027     abort ();
16028 }
16029
16030 \f
16031
16032 /* This section deals with the functions that are called when tables
16033    recording class initialization information are traversed.  */
16034
16035 /* Attach to PTR (a block) the declaration found in ENTRY. */
16036
16037 static int
16038 attach_init_test_initialization_flags (void **entry, void *ptr)
16039 {
16040   tree block = (tree)ptr;
16041   struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
16042
16043   if (block != error_mark_node)
16044     {
16045       TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
16046       BLOCK_EXPR_DECLS (block) = ite->value;
16047     }
16048   return true;
16049 }
16050
16051 /* This function is called for each class that is known definitely
16052    initialized when a given static method was called. This function
16053    augments a compound expression (INFO) storing all assignment to
16054    initialized static class flags if a flag already existed, otherwise
16055    a new one is created.  */
16056
16057 static int
16058 emit_test_initialization (void **entry_p, void *info)
16059 {
16060   tree l = (tree) info;
16061   tree decl, init;
16062   tree key = (tree) *entry_p;
16063   tree *ite;
16064   htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
16065
16066   /* If we haven't found a flag and we're dealing with self registered
16067      with current_function_decl, then don't do anything. Self is
16068      always added as definitely initialized but this information is
16069      valid only if used outside the current function. */
16070   if (current_function_decl == TREE_PURPOSE (l)
16071       && java_treetreehash_find (cf_ht, key) == NULL)
16072     return true;
16073
16074   ite = java_treetreehash_new (cf_ht, key);
16075
16076   /* If we don't have a variable, create one and install it. */
16077   if (*ite == NULL)
16078     {
16079       tree block;
16080
16081       decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
16082       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
16083       LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
16084       DECL_CONTEXT (decl) = current_function_decl;
16085       DECL_INITIAL (decl) = boolean_true_node;
16086       /* Don't emit any symbolic debugging info for this decl.  */
16087       DECL_IGNORED_P (decl) = 1;
16088
16089       /* The trick is to find the right context for it. */
16090       block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
16091       TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
16092       BLOCK_EXPR_DECLS (block) = decl;
16093       *ite = decl;
16094     }
16095   else
16096     decl = *ite;
16097
16098   /* Now simply augment the compound that holds all the assignments
16099      pertaining to this method invocation. */
16100   init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
16101   TREE_SIDE_EFFECTS (init) = 1;
16102   TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
16103   TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
16104
16105   return true;
16106 }
16107
16108 #include "gt-java-parse.h"
16109 #include "gtype-java.h"