OSDN Git Service

.:
[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 (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 (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 (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 (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 (filename->ptr, d_name);
6960               found |= note_possible_classname (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       /* This is called after parsing is done, so the parser context
12321          won't be accurate. Set location info from current_class decl. */
12322       tree class_wfl = lookup_cl (TYPE_NAME (current_class));
12323       EXPR_WFL_LINECOL (super_wfl) = EXPR_WFL_LINECOL (class_wfl);
12324       tree a = NULL_TREE, t;
12325       /* If we're dealing with an anonymous class, pass the arguments
12326          of the crafted constructor along. */
12327       if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
12328         {
12329           SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
12330           for (; t != end_params_node; t = TREE_CHAIN (t))
12331             a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
12332         }
12333       return build_method_invocation (super_wfl, a);
12334     }
12335 }
12336
12337 /* Build a SUPER/THIS qualified method invocation.  */
12338
12339 static tree
12340 build_this_super_qualified_invocation (int use_this, tree name, tree args,
12341                                        int lloc, int rloc)
12342 {
12343   tree invok;
12344   tree wfl =
12345     build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
12346   EXPR_WFL_LINECOL (wfl) = lloc;
12347   invok = build_method_invocation (name, args);
12348   return make_qualified_primary (wfl, invok, rloc);
12349 }
12350
12351 /* Build an incomplete CALL_EXPR node. */
12352
12353 static tree
12354 build_method_invocation (tree name, tree args)
12355 {
12356   tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
12357   TREE_SIDE_EFFECTS (call) = 1;
12358   EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12359   return call;
12360 }
12361
12362 /* Build an incomplete new xxx(...) node. */
12363
12364 static tree
12365 build_new_invocation (tree name, tree args)
12366 {
12367   tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
12368   TREE_SIDE_EFFECTS (call) = 1;
12369   EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12370   return call;
12371 }
12372
12373 /* Build an incomplete assignment expression. */
12374
12375 static tree
12376 build_assignment (int op, int op_location, tree lhs, tree rhs)
12377 {
12378   tree assignment;
12379   /* Build the corresponding binop if we deal with a Compound
12380      Assignment operator. Mark the binop sub-tree as part of a
12381      Compound Assignment expression */
12382   if (op != ASSIGN_TK)
12383     {
12384       rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
12385       COMPOUND_ASSIGN_P (rhs) = 1;
12386     }
12387   assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
12388   TREE_SIDE_EFFECTS (assignment) = 1;
12389   EXPR_WFL_LINECOL (assignment) = op_location;
12390   return assignment;
12391 }
12392
12393 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12394    the buffer.  This is used only for string conversion.  */
12395 static char *
12396 string_convert_int_cst (tree node)
12397 {
12398   /* Long.MIN_VALUE is -9223372036854775808, 20 characters.  */
12399   static char buffer[21];
12400
12401   unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
12402   unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
12403   char *p = buffer + sizeof (buffer);
12404   int neg = 0;
12405
12406   unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
12407                                   << (HOST_BITS_PER_WIDE_INT - 1));
12408
12409   *--p = '\0';
12410
12411   /* If negative, note the fact and negate the value.  */
12412   if ((hi & hibit))
12413     {
12414       lo = ~lo;
12415       hi = ~hi;
12416       if (++lo == 0)
12417         ++hi;
12418       neg = 1;
12419     }
12420
12421   /* Divide by 10 until there are no bits left.  */
12422   do
12423     {
12424       unsigned HOST_WIDE_INT acc = 0;
12425       unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
12426       unsigned int i;
12427
12428       /* Use long division to compute the result and the remainder.  */
12429       for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
12430         {
12431           /* Shift a bit into accumulator.  */
12432           acc <<= 1;
12433           if ((hi & hibit))
12434             acc |= 1;
12435
12436           /* Shift the value.  */
12437           hi <<= 1;
12438           if ((lo & hibit))
12439             hi |= 1;
12440           lo <<= 1;
12441
12442           /* Shift the correct bit into the result.  */
12443           outhi <<= 1;
12444           if ((outlo & hibit))
12445             outhi |= 1;
12446           outlo <<= 1;
12447           if (acc >= 10)
12448             {
12449               acc -= 10;
12450               outlo |= 1;
12451             }
12452         }
12453
12454       /* '0' == 060 in Java, but might not be here (think EBCDIC).  */
12455       *--p = '\060' + acc;
12456
12457       hi = outhi;
12458       lo = outlo;
12459     }
12460   while (hi || lo);
12461
12462   if (neg)
12463     *--p = '\055'; /* '-' == 055 in Java, but might not be here.  */
12464
12465   return p;
12466 }
12467
12468 /* Print an INTEGER_CST node in a static buffer, and return the
12469    buffer.  This is used only for error handling.  */
12470 char *
12471 print_int_node (tree node)
12472 {
12473   static char buffer [80];
12474   if (TREE_CONSTANT_OVERFLOW (node))
12475     sprintf (buffer, "<overflow>");
12476
12477   if (TREE_INT_CST_HIGH (node) == 0)
12478     sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
12479              TREE_INT_CST_LOW (node));
12480   else if (TREE_INT_CST_HIGH (node) == -1
12481            && TREE_INT_CST_LOW (node) != 0)
12482     sprintf (buffer, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
12483              -TREE_INT_CST_LOW (node));
12484   else
12485     sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
12486              TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
12487
12488   return buffer;
12489 }
12490
12491 \f
12492 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12493    context.  */
12494
12495 /* 15.25 Assignment operators. */
12496
12497 static tree
12498 patch_assignment (tree node, tree wfl_op1)
12499 {
12500   tree rhs = TREE_OPERAND (node, 1);
12501   tree lvalue = TREE_OPERAND (node, 0), llvalue;
12502   tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
12503   int error_found = 0;
12504   int lvalue_from_array = 0;
12505   int is_return = 0;
12506
12507   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12508
12509   /* Lhs can be a named variable */
12510   if (JDECL_P (lvalue))
12511     {
12512       lhs_type = TREE_TYPE (lvalue);
12513     }
12514   /* Or Lhs can be an array access. */
12515   else if (TREE_CODE (lvalue) == ARRAY_REF)
12516     {
12517       lhs_type = TREE_TYPE (lvalue);
12518       lvalue_from_array = 1;
12519     }
12520   /* Or a field access */
12521   else if (TREE_CODE (lvalue) == COMPONENT_REF)
12522     lhs_type = TREE_TYPE (lvalue);
12523   /* Or a function return slot */
12524   else if (TREE_CODE (lvalue) == RESULT_DECL)
12525     {
12526       /* If the return type is an integral type, then we create the
12527          RESULT_DECL with a promoted type, but we need to do these
12528          checks against the unpromoted type to ensure type safety.  So
12529          here we look at the real type, not the type of the decl we
12530          are modifying.  */
12531       lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
12532       is_return = 1;
12533     }
12534   /* Otherwise, we might want to try to write into an optimized static
12535      final, this is an of a different nature, reported further on. */
12536   else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
12537            && resolve_expression_name (wfl_op1, &llvalue))
12538     {
12539       lhs_type = TREE_TYPE (lvalue);
12540     }
12541   else
12542     {
12543       parse_error_context (wfl_op1, "Invalid left hand side of assignment");
12544       error_found = 1;
12545     }
12546
12547   rhs_type = TREE_TYPE (rhs);
12548
12549   /* 5.1 Try the assignment conversion for builtin type. */
12550   new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
12551
12552   /* 5.2 If it failed, try a reference conversion */
12553   if (!new_rhs)
12554     new_rhs = try_reference_assignconv (lhs_type, rhs);
12555
12556   /* 15.25.2 If we have a compound assignment, convert RHS into the
12557      type of the LHS */
12558   else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12559     new_rhs = convert (lhs_type, rhs);
12560
12561   /* Explicit cast required. This is an error */
12562   if (!new_rhs)
12563     {
12564       char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
12565       char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
12566       tree wfl;
12567       char operation [32];      /* Max size known */
12568
12569       /* If the assignment is part of a declaration, we use the WFL of
12570          the declared variable to point out the error and call it a
12571          declaration problem. If the assignment is a genuine =
12572          operator, we call is a operator `=' problem, otherwise we
12573          call it an assignment problem. In both of these last cases,
12574          we use the WFL of the operator to indicate the error. */
12575
12576       if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
12577         {
12578           wfl = wfl_op1;
12579           strcpy (operation, "declaration");
12580         }
12581       else
12582         {
12583           wfl = wfl_operator;
12584           if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12585             strcpy (operation, "assignment");
12586           else if (is_return)
12587             strcpy (operation, "`return'");
12588           else
12589             strcpy (operation, "`='");
12590         }
12591
12592       if (!valid_cast_to_p (rhs_type, lhs_type))
12593         parse_error_context
12594           (wfl, "Incompatible type for %s. Can't convert `%s' to `%s'",
12595            operation, t1, t2);
12596       else
12597         parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert `%s' to `%s'",
12598                              operation, t1, t2);
12599       free (t1); free (t2);
12600       error_found = 1;
12601     }
12602
12603   if (error_found)
12604     return error_mark_node;
12605
12606   /* If we're processing a `return' statement, promote the actual type
12607      to the promoted type.  */
12608   if (is_return)
12609     new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
12610
12611   /* 10.10: Array Store Exception runtime check */
12612   if (!flag_emit_class_files
12613       && !flag_emit_xref
12614       && lvalue_from_array
12615       && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
12616     {
12617       tree array, store_check, base, index_expr;
12618
12619       /* Save RHS so that it doesn't get re-evaluated by the store check. */
12620       new_rhs = save_expr (new_rhs);
12621
12622       /* Get the INDIRECT_REF. */
12623       array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
12624       /* Get the array pointer expr. */
12625       array = TREE_OPERAND (array, 0);
12626       store_check = build_java_arraystore_check (array, new_rhs);
12627
12628       index_expr = TREE_OPERAND (lvalue, 1);
12629
12630       if (TREE_CODE (index_expr) == COMPOUND_EXPR)
12631         {
12632           /* A COMPOUND_EXPR here is a bounds check. The bounds check must
12633              happen before the store check, so prepare to insert the store
12634              check within the second operand of the existing COMPOUND_EXPR. */
12635           base = index_expr;
12636         }
12637       else
12638         base = lvalue;
12639
12640       index_expr = TREE_OPERAND (base, 1);
12641       TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr),
12642                                       store_check, index_expr);
12643     }
12644
12645   /* Final locals can be used as case values in switch
12646      statement. Prepare them for this eventuality. */
12647   if (TREE_CODE (lvalue) == VAR_DECL
12648       && DECL_FINAL (lvalue)
12649       && TREE_CONSTANT (new_rhs)
12650       && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
12651       && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
12652       )
12653     {
12654       TREE_CONSTANT (lvalue) = 1;
12655       TREE_INVARIANT (lvalue) = 1;
12656       DECL_INITIAL (lvalue) = new_rhs;
12657     }
12658
12659   /* Copy the rhs if it's a reference.  */
12660   if (! flag_check_references && ! flag_emit_class_files && optimize > 0)
12661     {
12662       switch (TREE_CODE (new_rhs))
12663         {
12664         case ARRAY_REF:
12665         case INDIRECT_REF:
12666         case COMPONENT_REF:
12667           /* Transform a = foo.bar 
12668              into a = ({int tmp; tmp = foo.bar;}).
12669              We need to ensure that if a read from memory fails
12670              because of a NullPointerException, a destination variable
12671              will remain unchanged.  An explicit temporary does what
12672              we need.  
12673
12674              If flag_check_references is set, this is unnecessary
12675              because we'll check each reference before doing any
12676              reads.  If optimize is not set the result will never be
12677              written to a stack slot that contains the LHS.  */
12678           {
12679             tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"), 
12680                                    TREE_TYPE (new_rhs));
12681             tree block = make_node (BLOCK);
12682             tree assignment 
12683               = build (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
12684             DECL_CONTEXT (tmp) = current_function_decl;
12685             TREE_TYPE (block) = TREE_TYPE (new_rhs);
12686             BLOCK_VARS (block) = tmp;
12687             BLOCK_EXPR_BODY (block) = assignment;
12688             TREE_SIDE_EFFECTS (block) = 1;
12689             new_rhs = block;
12690           }
12691           break;
12692         default:
12693           break;
12694         }
12695     }
12696
12697   TREE_OPERAND (node, 0) = lvalue;
12698   TREE_OPERAND (node, 1) = new_rhs;
12699   TREE_TYPE (node) = lhs_type;
12700   return node;
12701 }
12702
12703 /* Check that type SOURCE can be cast into type DEST. If the cast
12704    can't occur at all, return NULL; otherwise, return a possibly
12705    modified rhs.  */
12706
12707 static tree
12708 try_reference_assignconv (tree lhs_type, tree rhs)
12709 {
12710   tree new_rhs = NULL_TREE;
12711   tree rhs_type = TREE_TYPE (rhs);
12712
12713   if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
12714     {
12715       /* `null' may be assigned to any reference type */
12716       if (rhs == null_pointer_node)
12717         new_rhs = null_pointer_node;
12718       /* Try the reference assignment conversion */
12719       else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
12720         new_rhs = rhs;
12721       /* This is a magic assignment that we process differently */
12722       else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
12723         new_rhs = rhs;
12724     }
12725   return new_rhs;
12726 }
12727
12728 /* Check that RHS can be converted into LHS_TYPE by the assignment
12729    conversion (5.2), for the cases of RHS being a builtin type. Return
12730    NULL_TREE if the conversion fails or if because RHS isn't of a
12731    builtin type. Return a converted RHS if the conversion is possible.  */
12732
12733 static tree
12734 try_builtin_assignconv (tree wfl_op1, tree lhs_type, tree rhs)
12735 {
12736   tree new_rhs = NULL_TREE;
12737   tree rhs_type = TREE_TYPE (rhs);
12738
12739   /* Handle boolean specially.  */
12740   if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12741       || TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12742     {
12743       if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12744           && TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12745         new_rhs = rhs;
12746     }
12747
12748   /* 5.1.1 Try Identity Conversion,
12749      5.1.2 Try Widening Primitive Conversion */
12750   else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
12751     new_rhs = convert (lhs_type, rhs);
12752
12753   /* Try a narrowing primitive conversion (5.1.3):
12754        - expression is a constant expression of type byte, short, char,
12755          or int, AND
12756        - variable is byte, short or char AND
12757        - The value of the expression is representable in the type of the
12758          variable */
12759   else if ((rhs_type == byte_type_node || rhs_type == short_type_node
12760             || rhs_type == char_type_node || rhs_type == int_type_node)
12761             && TREE_CONSTANT (rhs)
12762            && (lhs_type == byte_type_node || lhs_type == char_type_node
12763                || lhs_type == short_type_node))
12764     {
12765       if (int_fits_type_p (rhs, lhs_type))
12766         new_rhs = convert (lhs_type, rhs);
12767       else if (wfl_op1)         /* Might be called with a NULL */
12768         parse_warning_context
12769           (wfl_op1, "Constant expression `%s' too wide for narrowing primitive conversion to `%s'",
12770            print_int_node (rhs), lang_printable_name (lhs_type, 0));
12771       /* Reported a warning that will turn into an error further
12772          down, so we don't return */
12773     }
12774
12775   return new_rhs;
12776 }
12777
12778 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
12779    conversion (5.1.1) or widening primitive conversion (5.1.2).  Return
12780    0 is the conversion test fails.  This implements parts the method
12781    invocation conversion (5.3).  */
12782
12783 static int
12784 valid_builtin_assignconv_identity_widening_p (tree lhs_type, tree rhs_type)
12785 {
12786   /* 5.1.1: This is the identity conversion part. */
12787   if (lhs_type == rhs_type)
12788     return 1;
12789
12790   /* Reject non primitive types and boolean conversions.  */
12791   if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
12792     return 0;
12793
12794   /* 5.1.2: widening primitive conversion. byte, even if it's smaller
12795      than a char can't be converted into a char. Short can't too, but
12796      the < test below takes care of that */
12797   if (lhs_type == char_type_node && rhs_type == byte_type_node)
12798     return 0;
12799
12800   /* Accept all promoted type here. Note, we can't use <= in the test
12801      below, because we still need to bounce out assignments of short
12802      to char and the likes */
12803   if (lhs_type == int_type_node
12804       && (rhs_type == promoted_byte_type_node
12805           || rhs_type == promoted_short_type_node
12806           || rhs_type == promoted_char_type_node
12807           || rhs_type == promoted_boolean_type_node))
12808     return 1;
12809
12810   /* From here, an integral is widened if its precision is smaller
12811      than the precision of the LHS or if the LHS is a floating point
12812      type, or the RHS is a float and the RHS a double. */
12813   if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
12814        && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
12815       || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
12816       || (rhs_type == float_type_node && lhs_type == double_type_node))
12817     return 1;
12818
12819   return 0;
12820 }
12821
12822 /* Check that something of SOURCE type can be assigned or cast to
12823    something of DEST type at runtime. Return 1 if the operation is
12824    valid, 0 otherwise. If CAST is set to 1, we're treating the case
12825    were SOURCE is cast into DEST, which borrows a lot of the
12826    assignment check. */
12827
12828 static int
12829 valid_ref_assignconv_cast_p (tree source, tree dest, int cast)
12830 {
12831   /* SOURCE or DEST might be null if not from a declared entity. */
12832   if (!source || !dest)
12833     return 0;
12834   if (JNULLP_TYPE_P (source))
12835     return 1;
12836   if (TREE_CODE (source) == POINTER_TYPE)
12837     source = TREE_TYPE (source);
12838   if (TREE_CODE (dest) == POINTER_TYPE)
12839     dest = TREE_TYPE (dest);
12840
12841   /* If source and dest are being compiled from bytecode, they may need to
12842      be loaded. */
12843   if (CLASS_P (source) && !CLASS_LOADED_P (source))
12844     {
12845       load_class (source, 1);
12846       safe_layout_class (source);
12847     }
12848   if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
12849     {
12850       load_class (dest, 1);
12851       safe_layout_class (dest);
12852     }
12853
12854   /* Case where SOURCE is a class type */
12855   if (TYPE_CLASS_P (source))
12856     {
12857       if (TYPE_CLASS_P (dest))
12858         return  (source == dest
12859                  || inherits_from_p (source, dest)
12860                  || (cast && inherits_from_p (dest, source)));
12861       if (TYPE_INTERFACE_P (dest))
12862         {
12863           /* If doing a cast and SOURCE is final, the operation is
12864              always correct a compile time (because even if SOURCE
12865              does not implement DEST, a subclass of SOURCE might). */
12866           if (cast && !CLASS_FINAL (TYPE_NAME (source)))
12867             return 1;
12868           /* Otherwise, SOURCE must implement DEST */
12869           return interface_of_p (dest, source);
12870         }
12871       /* DEST is an array, cast permitted if SOURCE is of Object type */
12872       return (cast && source == object_type_node ? 1 : 0);
12873     }
12874   if (TYPE_INTERFACE_P (source))
12875     {
12876       if (TYPE_CLASS_P (dest))
12877         {
12878           /* If not casting, DEST must be the Object type */
12879           if (!cast)
12880             return dest == object_type_node;
12881           /* We're doing a cast. The cast is always valid is class
12882              DEST is not final, otherwise, DEST must implement SOURCE */
12883           else if (!CLASS_FINAL (TYPE_NAME (dest)))
12884             return 1;
12885           else
12886             return interface_of_p (source, dest);
12887         }
12888       if (TYPE_INTERFACE_P (dest))
12889         {
12890           /* If doing a cast, then if SOURCE and DEST contain method
12891              with the same signature but different return type, then
12892              this is a (compile time) error */
12893           if (cast)
12894             {
12895               tree method_source, method_dest;
12896               tree source_type;
12897               tree source_sig;
12898               tree source_name;
12899               for (method_source = TYPE_METHODS (source); method_source;
12900                    method_source = TREE_CHAIN (method_source))
12901                 {
12902                   source_sig =
12903                     build_java_argument_signature (TREE_TYPE (method_source));
12904                   source_type = TREE_TYPE (TREE_TYPE (method_source));
12905                   source_name = DECL_NAME (method_source);
12906                   for (method_dest = TYPE_METHODS (dest);
12907                        method_dest; method_dest = TREE_CHAIN (method_dest))
12908                     if (source_sig ==
12909                         build_java_argument_signature (TREE_TYPE (method_dest))
12910                         && source_name == DECL_NAME (method_dest)
12911                         && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
12912                       return 0;
12913                 }
12914               return 1;
12915             }
12916           else
12917             return source == dest || interface_of_p (dest, source);
12918         }
12919       else
12920         {
12921           /* Array */
12922           return (cast
12923                   && (DECL_NAME (TYPE_NAME (source))
12924                       == java_lang_cloneable_identifier_node
12925                       || (DECL_NAME (TYPE_NAME (source))
12926                           == java_io_serializable_identifier_node)));
12927         }
12928     }
12929   if (TYPE_ARRAY_P (source))
12930     {
12931       if (TYPE_CLASS_P (dest))
12932         return dest == object_type_node;
12933       /* Can't cast an array to an interface unless the interface is
12934          java.lang.Cloneable or java.io.Serializable.  */
12935       if (TYPE_INTERFACE_P (dest))
12936         return (DECL_NAME (TYPE_NAME (dest))
12937                 == java_lang_cloneable_identifier_node
12938                 || (DECL_NAME (TYPE_NAME (dest))
12939                     == java_io_serializable_identifier_node));
12940       else                      /* Arrays */
12941         {
12942           tree source_element_type = TYPE_ARRAY_ELEMENT (source);
12943           tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
12944
12945           /* In case of severe errors, they turn out null */
12946           if (!dest_element_type || !source_element_type)
12947             return 0;
12948           if (source_element_type == dest_element_type)
12949             return 1;
12950           return valid_ref_assignconv_cast_p (source_element_type,
12951                                               dest_element_type, cast);
12952         }
12953       return 0;
12954     }
12955   return 0;
12956 }
12957
12958 static int
12959 valid_cast_to_p (tree source, tree dest)
12960 {
12961   if (TREE_CODE (source) == POINTER_TYPE)
12962     source = TREE_TYPE (source);
12963   if (TREE_CODE (dest) == POINTER_TYPE)
12964     dest = TREE_TYPE (dest);
12965
12966   if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
12967     return valid_ref_assignconv_cast_p (source, dest, 1);
12968
12969   else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
12970     return 1;
12971
12972   else if (TREE_CODE (source) == BOOLEAN_TYPE
12973            && TREE_CODE (dest) == BOOLEAN_TYPE)
12974     return 1;
12975
12976   return 0;
12977 }
12978
12979 static tree
12980 do_unary_numeric_promotion (tree arg)
12981 {
12982   tree type = TREE_TYPE (arg);
12983   if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
12984       || TREE_CODE (type) == CHAR_TYPE)
12985     arg = convert (int_type_node, arg);
12986   return arg;
12987 }
12988
12989 /* Return a nonzero value if SOURCE can be converted into DEST using
12990    the method invocation conversion rule (5.3).  */
12991 static int
12992 valid_method_invocation_conversion_p (tree dest, tree source)
12993 {
12994   return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
12995            && valid_builtin_assignconv_identity_widening_p (dest, source))
12996           || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
12997               && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
12998               && valid_ref_assignconv_cast_p (source, dest, 0)));
12999 }
13000
13001 /* Build an incomplete binop expression. */
13002
13003 static tree
13004 build_binop (enum tree_code op, int op_location, tree op1, tree op2)
13005 {
13006   tree binop = build (op, NULL_TREE, op1, op2);
13007   TREE_SIDE_EFFECTS (binop) = 1;
13008   /* Store the location of the operator, for better error report. The
13009      string of the operator will be rebuild based on the OP value. */
13010   EXPR_WFL_LINECOL (binop) = op_location;
13011   return binop;
13012 }
13013
13014 /* Build the string of the operator retained by NODE. If NODE is part
13015    of a compound expression, add an '=' at the end of the string. This
13016    function is called when an error needs to be reported on an
13017    operator. The string is returned as a pointer to a static character
13018    buffer. */
13019
13020 static char *
13021 operator_string (tree node)
13022 {
13023 #define BUILD_OPERATOR_STRING(S)                                        \
13024   {                                                                     \
13025     sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
13026     return buffer;                                                      \
13027   }
13028
13029   static char buffer [10];
13030   switch (TREE_CODE (node))
13031     {
13032     case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
13033     case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
13034     case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
13035     case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13036     case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
13037     case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
13038     case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
13039     case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
13040     case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
13041     case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
13042     case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
13043     case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
13044     case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
13045     case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
13046     case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
13047     case GT_EXPR: BUILD_OPERATOR_STRING (">");
13048     case GE_EXPR: BUILD_OPERATOR_STRING (">=");
13049     case LT_EXPR: BUILD_OPERATOR_STRING ("<");
13050     case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
13051     case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13052     case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
13053     case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
13054     case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
13055     case PREINCREMENT_EXPR:     /* Fall through */
13056     case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
13057     case PREDECREMENT_EXPR:     /* Fall through */
13058     case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
13059     default:
13060       internal_error ("unregistered operator %s",
13061                       tree_code_name [TREE_CODE (node)]);
13062     }
13063   return NULL;
13064 #undef BUILD_OPERATOR_STRING
13065 }
13066
13067 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2.  */
13068
13069 static int
13070 java_decl_equiv (tree var_acc1, tree var_acc2)
13071 {
13072   if (JDECL_P (var_acc1))
13073     return (var_acc1 == var_acc2);
13074
13075   return (TREE_CODE (var_acc1) == COMPONENT_REF
13076           && TREE_CODE (var_acc2) == COMPONENT_REF
13077           && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
13078              == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
13079           && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
13080 }
13081
13082 /* Return a nonzero value if CODE is one of the operators that can be
13083    used in conjunction with the `=' operator in a compound assignment.  */
13084
13085 static int
13086 binop_compound_p (enum tree_code code)
13087 {
13088   int i;
13089   for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
13090     if (binop_lookup [i] == code)
13091       break;
13092
13093   return i < BINOP_COMPOUND_CANDIDATES;
13094 }
13095
13096 /* Reorganize after a fold to get SAVE_EXPR to generate what we want.  */
13097
13098 static tree
13099 java_refold (tree t)
13100 {
13101   tree c, b, ns, decl;
13102
13103   if (TREE_CODE (t) != MODIFY_EXPR)
13104     return t;
13105
13106   c = TREE_OPERAND (t, 1);
13107   if (! (c && TREE_CODE (c) == COMPOUND_EXPR
13108          && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
13109          && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
13110     return t;
13111
13112   /* Now the left branch of the binary operator. */
13113   b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
13114   if (! (b && TREE_CODE (b) == NOP_EXPR
13115          && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
13116     return t;
13117
13118   ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
13119   if (! (ns && TREE_CODE (ns) == NOP_EXPR
13120          && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
13121     return t;
13122
13123   decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
13124   if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
13125       /* It's got to be the an equivalent decl */
13126       && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
13127     {
13128       /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13129       TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
13130       /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13131       TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
13132       /* Change the right part of the BINOP_EXPR */
13133       TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
13134     }
13135
13136   return t;
13137 }
13138
13139 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13140    errors but we modify NODE so that it contains the type computed
13141    according to the expression, when it's fixed. Otherwise, we write
13142    error_mark_node as the type. It allows us to further the analysis
13143    of remaining nodes and detects more errors in certain cases.  */
13144
13145 static tree
13146 patch_binop (tree node, tree wfl_op1, tree wfl_op2)
13147 {
13148   tree op1 = TREE_OPERAND (node, 0);
13149   tree op2 = TREE_OPERAND (node, 1);
13150   tree op1_type = TREE_TYPE (op1);
13151   tree op2_type = TREE_TYPE (op2);
13152   tree prom_type = NULL_TREE, cn;
13153   enum tree_code code = TREE_CODE (node);
13154
13155   /* If 1, tell the routine that we have to return error_mark_node
13156      after checking for the initialization of the RHS */
13157   int error_found = 0;
13158
13159   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13160
13161   /* If either op<n>_type are NULL, this might be early signs of an
13162      error situation, unless it's too early to tell (in case we're
13163      handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13164      correctly so the error can be later on reported accurately. */
13165   if (! (code == PLUS_EXPR || code == NE_EXPR
13166          || code == EQ_EXPR || code == INSTANCEOF_EXPR))
13167     {
13168       tree n;
13169       if (! op1_type)
13170         {
13171           n = java_complete_tree (op1);
13172           op1_type = TREE_TYPE (n);
13173         }
13174       if (! op2_type)
13175         {
13176           n = java_complete_tree (op2);
13177           op2_type = TREE_TYPE (n);
13178         }
13179     }
13180
13181   switch (code)
13182     {
13183     /* 15.16 Multiplicative operators */
13184     case MULT_EXPR:             /* 15.16.1 Multiplication Operator * */
13185     case RDIV_EXPR:             /* 15.16.2 Division Operator / */
13186     case TRUNC_DIV_EXPR:        /* 15.16.2 Integral type Division Operator / */
13187     case TRUNC_MOD_EXPR:        /* 15.16.3 Remainder operator % */
13188       if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13189         {
13190           if (!JNUMERIC_TYPE_P (op1_type))
13191             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13192           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13193             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13194           TREE_TYPE (node) = error_mark_node;
13195           error_found = 1;
13196           break;
13197         }
13198       prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13199
13200       /* Detect integral division by zero */
13201       if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
13202           && TREE_CODE (prom_type) == INTEGER_TYPE
13203           && (op2 == integer_zero_node || op2 == long_zero_node ||
13204               (TREE_CODE (op2) == INTEGER_CST &&
13205                ! TREE_INT_CST_LOW (op2)  && ! TREE_INT_CST_HIGH (op2))))
13206         {
13207           parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown");
13208           TREE_CONSTANT (node) = 0;
13209           TREE_INVARIANT (node) = 0;
13210         }
13211
13212       /* Change the division operator if necessary */
13213       if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
13214         TREE_SET_CODE (node, TRUNC_DIV_EXPR);
13215
13216       /* Before divisions as is disappear, try to simplify and bail if
13217          applicable, otherwise we won't perform even simple
13218          simplifications like (1-1)/3. We can't do that with floating
13219          point number, folds can't handle them at this stage. */
13220       if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
13221           && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
13222         {
13223           TREE_TYPE (node) = prom_type;
13224           node = fold (node);
13225           if (TREE_CODE (node) != code)
13226             return node;
13227         }
13228
13229       if (TREE_CODE (prom_type) == INTEGER_TYPE
13230           && flag_use_divide_subroutine
13231           && ! flag_emit_class_files
13232           && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
13233         return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
13234
13235       /* This one is more complicated. FLOATs are processed by a
13236          function call to soft_fmod. Duplicate the value of the
13237          COMPOUND_ASSIGN_P flag. */
13238       if (code == TRUNC_MOD_EXPR)
13239         {
13240           tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
13241           COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
13242           TREE_SIDE_EFFECTS (mod)
13243             = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13244           return mod;
13245         }
13246       break;
13247
13248     /* 15.17 Additive Operators */
13249     case PLUS_EXPR:             /* 15.17.1 String Concatenation Operator + */
13250
13251       /* Operation is valid if either one argument is a string
13252          constant, a String object or a StringBuffer crafted for the
13253          purpose of the a previous usage of the String concatenation
13254          operator */
13255
13256       if (TREE_CODE (op1) == STRING_CST
13257           || TREE_CODE (op2) == STRING_CST
13258           || JSTRING_TYPE_P (op1_type)
13259           || JSTRING_TYPE_P (op2_type)
13260           || IS_CRAFTED_STRING_BUFFER_P (op1)
13261           || IS_CRAFTED_STRING_BUFFER_P (op2))
13262         return build_string_concatenation (op1, op2);
13263
13264     case MINUS_EXPR:            /* 15.17.2 Additive Operators (+ and -) for
13265                                    Numeric Types */
13266       if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13267         {
13268           if (!JNUMERIC_TYPE_P (op1_type))
13269             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13270           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13271             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13272           TREE_TYPE (node) = error_mark_node;
13273           error_found = 1;
13274           break;
13275         }
13276       prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13277       break;
13278
13279     /* 15.18 Shift Operators */
13280     case LSHIFT_EXPR:
13281     case RSHIFT_EXPR:
13282     case URSHIFT_EXPR:
13283       if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
13284         {
13285           if (!JINTEGRAL_TYPE_P (op1_type))
13286             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13287           else
13288             {
13289               if (JNUMERIC_TYPE_P (op2_type))
13290                 parse_error_context (wfl_operator,
13291                                      "Incompatible type for `%s'. Explicit cast needed to convert shift distance from `%s' to integral",
13292                                      operator_string (node),
13293                                      lang_printable_name (op2_type, 0));
13294               else
13295                 parse_error_context (wfl_operator,
13296                                      "Incompatible type for `%s'. Can't convert shift distance from `%s' to integral",
13297                                      operator_string (node),
13298                                      lang_printable_name (op2_type, 0));
13299             }
13300           TREE_TYPE (node) = error_mark_node;
13301           error_found = 1;
13302           break;
13303         }
13304
13305       /* Unary numeric promotion (5.6.1) is performed on each operand
13306          separately */
13307       op1 = do_unary_numeric_promotion (op1);
13308       op2 = do_unary_numeric_promotion (op2);
13309
13310       /* If the right hand side is of type `long', first cast it to
13311          `int'.  */
13312       if (TREE_TYPE (op2) == long_type_node)
13313         op2 = build1 (CONVERT_EXPR, int_type_node, op2);
13314
13315       /* The type of the shift expression is the type of the promoted
13316          type of the left-hand operand */
13317       prom_type = TREE_TYPE (op1);
13318
13319       /* Shift int only up to 0x1f and long up to 0x3f */
13320       if (prom_type == int_type_node)
13321         op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13322                            build_int_2 (0x1f, 0)));
13323       else
13324         op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13325                            build_int_2 (0x3f, 0)));
13326
13327       /* The >>> operator is a >> operating on unsigned quantities */
13328       if (code == URSHIFT_EXPR && ! flag_emit_class_files)
13329         {
13330           tree to_return;
13331           tree utype = java_unsigned_type (prom_type);
13332           op1 = convert (utype, op1);
13333           TREE_SET_CODE (node, RSHIFT_EXPR);
13334           TREE_OPERAND (node, 0) = op1;
13335           TREE_OPERAND (node, 1) = op2;
13336           TREE_TYPE (node) = utype;
13337           to_return = convert (prom_type, node);
13338           /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13339           COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
13340           TREE_SIDE_EFFECTS (to_return)
13341             = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13342           return to_return;
13343         }
13344       break;
13345
13346       /* 15.19.1 Type Comparison Operator instanceof */
13347     case INSTANCEOF_EXPR:
13348
13349       TREE_TYPE (node) = boolean_type_node;
13350
13351       /* OP1_TYPE might be NULL when OP1 is a string constant.  */
13352       if ((cn = patch_string (op1)))
13353         {
13354           op1 = cn;
13355           op1_type = TREE_TYPE (op1);
13356         }
13357       if (op1_type == NULL_TREE)
13358         abort ();
13359
13360       if (!(op2_type = resolve_type_during_patch (op2)))
13361         return error_mark_node;
13362
13363       /* The first operand must be a reference type or the null type */
13364       if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
13365         error_found = 1;        /* Error reported further below */
13366
13367       /* The second operand must be a reference type */
13368       if (!JREFERENCE_TYPE_P (op2_type))
13369         {
13370           SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
13371           parse_error_context
13372             (wfl_operator, "Invalid argument `%s' for `instanceof'",
13373              lang_printable_name (op2_type, 0));
13374           error_found = 1;
13375         }
13376
13377       if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
13378         {
13379           /* If the first operand is null, the result is always false */
13380           if (op1 == null_pointer_node)
13381             return boolean_false_node;
13382           else if (flag_emit_class_files)
13383             {
13384               TREE_OPERAND (node, 1) = op2_type;
13385               TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
13386               return node;
13387             }
13388           /* Otherwise we have to invoke instance of to figure it out */
13389           else
13390             return build_instanceof (op1, op2_type);
13391         }
13392       /* There is no way the expression operand can be an instance of
13393          the type operand. This is a compile time error. */
13394       else
13395         {
13396           char *t1 = xstrdup (lang_printable_name (op1_type, 0));
13397           SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
13398           parse_error_context
13399             (wfl_operator, "Impossible for `%s' to be instance of `%s'",
13400              t1, lang_printable_name (op2_type, 0));
13401           free (t1);
13402           error_found = 1;
13403         }
13404
13405       break;
13406
13407       /* 15.21 Bitwise and Logical Operators */
13408     case BIT_AND_EXPR:
13409     case BIT_XOR_EXPR:
13410     case BIT_IOR_EXPR:
13411       if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
13412         /* Binary numeric promotion is performed on both operand and the
13413            expression retain that type */
13414         prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13415
13416       else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
13417                && TREE_CODE (op1_type) == BOOLEAN_TYPE)
13418         /* The type of the bitwise operator expression is BOOLEAN */
13419         prom_type = boolean_type_node;
13420       else
13421         {
13422           if (!JINTEGRAL_TYPE_P (op1_type))
13423             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13424           if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
13425             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
13426           TREE_TYPE (node) = error_mark_node;
13427           error_found = 1;
13428           /* Insert a break here if adding thing before the switch's
13429              break for this case */
13430         }
13431       break;
13432
13433       /* 15.22 Conditional-And Operator */
13434     case TRUTH_ANDIF_EXPR:
13435       /* 15.23 Conditional-Or Operator */
13436     case TRUTH_ORIF_EXPR:
13437       /* Operands must be of BOOLEAN type */
13438       if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
13439           TREE_CODE (op2_type) != BOOLEAN_TYPE)
13440         {
13441           if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
13442             ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
13443           if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
13444             ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
13445           TREE_TYPE (node) = boolean_type_node;
13446           error_found = 1;
13447           break;
13448         }
13449       else if (integer_zerop (op1))
13450         {
13451           return code == TRUTH_ANDIF_EXPR ? op1 : op2;
13452         }
13453       else if (integer_onep (op1))
13454         {
13455           return code == TRUTH_ANDIF_EXPR ? op2 : op1;
13456         }
13457       /* The type of the conditional operators is BOOLEAN */
13458       prom_type = boolean_type_node;
13459       break;
13460
13461       /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13462     case LT_EXPR:
13463     case GT_EXPR:
13464     case LE_EXPR:
13465     case GE_EXPR:
13466       /* The type of each of the operands must be a primitive numeric
13467          type */
13468       if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
13469         {
13470           if (!JNUMERIC_TYPE_P (op1_type))
13471             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13472           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13473             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13474           TREE_TYPE (node) = boolean_type_node;
13475           error_found = 1;
13476           break;
13477         }
13478       /* Binary numeric promotion is performed on the operands */
13479       binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13480       /* The type of the relation expression is always BOOLEAN */
13481       prom_type = boolean_type_node;
13482       break;
13483
13484       /* 15.20 Equality Operator */
13485     case EQ_EXPR:
13486     case NE_EXPR:
13487       /* It's time for us to patch the strings. */
13488       if ((cn = patch_string (op1)))
13489        {
13490          op1 = cn;
13491          op1_type = TREE_TYPE (op1);
13492        }
13493       if ((cn = patch_string (op2)))
13494        {
13495          op2 = cn;
13496          op2_type = TREE_TYPE (op2);
13497        }
13498
13499       /* 15.20.1 Numerical Equality Operators == and != */
13500       /* Binary numeric promotion is performed on the operands */
13501       if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
13502         binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13503
13504       /* 15.20.2 Boolean Equality Operators == and != */
13505       else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
13506           TREE_CODE (op2_type) == BOOLEAN_TYPE)
13507         ;                       /* Nothing to do here */
13508
13509       /* 15.20.3 Reference Equality Operators == and != */
13510       /* Types have to be either references or the null type. If
13511          they're references, it must be possible to convert either
13512          type to the other by casting conversion. */
13513       else if (op1 == null_pointer_node || op2 == null_pointer_node
13514                || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
13515                    && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
13516                        || valid_ref_assignconv_cast_p (op2_type,
13517                                                        op1_type, 1))))
13518         ;                       /* Nothing to do here */
13519
13520       /* Else we have an error figure what can't be converted into
13521          what and report the error */
13522       else
13523         {
13524           char *t1;
13525           t1 = xstrdup (lang_printable_name (op1_type, 0));
13526           parse_error_context
13527             (wfl_operator,
13528              "Incompatible type for `%s'. Can't convert `%s' to `%s'",
13529              operator_string (node), t1,
13530              lang_printable_name (op2_type, 0));
13531           free (t1);
13532           TREE_TYPE (node) = boolean_type_node;
13533           error_found = 1;
13534           break;
13535         }
13536       prom_type = boolean_type_node;
13537       break;
13538     default:
13539       abort ();
13540     }
13541
13542   if (error_found)
13543     return error_mark_node;
13544
13545   TREE_OPERAND (node, 0) = op1;
13546   TREE_OPERAND (node, 1) = op2;
13547   TREE_TYPE (node) = prom_type;
13548   TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13549
13550   if (flag_emit_xref)
13551     return node;
13552
13553   /* fold does not respect side-effect order as required for Java but not C.
13554    * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13555    * bytecode.
13556    */
13557   if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
13558       : ! TREE_SIDE_EFFECTS (node))
13559     node = fold (node);
13560   return node;
13561 }
13562
13563 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13564    zero value, the value of CSTE comes after the valude of STRING */
13565
13566 static tree
13567 do_merge_string_cste (tree cste, const char *string, int string_len, int after)
13568 {
13569   const char *old = TREE_STRING_POINTER (cste);
13570   int old_len = TREE_STRING_LENGTH (cste);
13571   int len = old_len + string_len;
13572   char *new = alloca (len+1);
13573
13574   if (after)
13575     {
13576       memcpy (new, string, string_len);
13577       memcpy (&new [string_len], old, old_len);
13578     }
13579   else
13580     {
13581       memcpy (new, old, old_len);
13582       memcpy (&new [old_len], string, string_len);
13583     }
13584   new [len] = '\0';
13585   return build_string (len, new);
13586 }
13587
13588 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13589    new STRING_CST on success, NULL_TREE on failure.  */
13590
13591 static tree
13592 merge_string_cste (tree op1, tree op2, int after)
13593 {
13594   /* Handle two string constants right away.  */
13595   if (TREE_CODE (op2) == STRING_CST)
13596     return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
13597                                  TREE_STRING_LENGTH (op2), after);
13598
13599   /* Reasonable integer constant can be treated right away.  */
13600   if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
13601     {
13602       static const char *const boolean_true = "true";
13603       static const char *const boolean_false = "false";
13604       static const char *const null_pointer = "null";
13605       char ch[4];
13606       const char *string;
13607
13608       if (op2 == boolean_true_node)
13609         string = boolean_true;
13610       else if (op2 == boolean_false_node)
13611         string = boolean_false;
13612       else if (op2 == null_pointer_node
13613                || (integer_zerop (op2)
13614                    && TREE_CODE (TREE_TYPE (op2)) == POINTER_TYPE))
13615         /* FIXME: null is not a compile-time constant, so it is only safe to
13616            merge if the overall expression is non-constant. However, this
13617            code always merges without checking the overall expression.  */
13618         string = null_pointer;
13619       else if (TREE_TYPE (op2) == char_type_node)
13620         {
13621           /* Convert the character into UTF-8.  */
13622           unsigned int c = (unsigned int) TREE_INT_CST_LOW (op2);
13623           unsigned char *p = (unsigned char *) ch;
13624           if (0x01 <= c && c <= 0x7f)
13625             *p++ = (unsigned char) c;
13626           else if (c < 0x7ff)
13627             {
13628               *p++ = (unsigned char) (c >> 6 | 0xc0);
13629               *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13630             }
13631           else
13632             {
13633               *p++ = (unsigned char) (c >> 12 | 0xe0);
13634               *p++ = (unsigned char) (((c >> 6) & 0x3f) | 0x80);
13635               *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13636             }
13637           *p = '\0';
13638
13639           string = ch;
13640         }
13641       else
13642         string = string_convert_int_cst (op2);
13643
13644       return do_merge_string_cste (op1, string, strlen (string), after);
13645     }
13646   return NULL_TREE;
13647 }
13648
13649 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
13650    has to be a STRING_CST and the other part must be a STRING_CST or a
13651    INTEGRAL constant. Return a new STRING_CST if the operation
13652    succeed, NULL_TREE otherwise.
13653
13654    If the case we want to optimize for space, we might want to return
13655    NULL_TREE for each invocation of this routine. FIXME */
13656
13657 static tree
13658 string_constant_concatenation (tree op1, tree op2)
13659 {
13660   if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
13661     {
13662       tree string, rest;
13663       int invert;
13664
13665       string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
13666       rest   = (string == op1 ? op2 : op1);
13667       invert = (string == op1 ? 0 : 1 );
13668
13669       /* Walk REST, only if it looks reasonable */
13670       if (TREE_CODE (rest) != STRING_CST
13671           && !IS_CRAFTED_STRING_BUFFER_P (rest)
13672           && !JSTRING_TYPE_P (TREE_TYPE (rest))
13673           && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
13674         {
13675           rest = java_complete_tree (rest);
13676           if (rest == error_mark_node)
13677             return error_mark_node;
13678           rest = fold (rest);
13679         }
13680       return merge_string_cste (string, rest, invert);
13681     }
13682   return NULL_TREE;
13683 }
13684
13685 /* Implement the `+' operator. Does static optimization if possible,
13686    otherwise create (if necessary) and append elements to a
13687    StringBuffer. The StringBuffer will be carried around until it is
13688    used for a function call or an assignment. Then toString() will be
13689    called on it to turn it into a String object. */
13690
13691 static tree
13692 build_string_concatenation (tree op1, tree op2)
13693 {
13694   tree result;
13695   int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13696
13697   if (flag_emit_xref)
13698     return build (PLUS_EXPR, string_type_node, op1, op2);
13699
13700   /* Try to do some static optimization */
13701   if ((result = string_constant_concatenation (op1, op2)))
13702     return result;
13703
13704   /* Discard empty strings on either side of the expression */
13705   if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
13706     {
13707       op1 = op2;
13708       op2 = NULL_TREE;
13709     }
13710   else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
13711     op2 = NULL_TREE;
13712
13713   /* If operands are string constant, turn then into object references */
13714   if (TREE_CODE (op1) == STRING_CST)
13715     op1 = patch_string_cst (op1);
13716   if (op2 && TREE_CODE (op2) == STRING_CST)
13717     op2 = patch_string_cst (op2);
13718
13719   /* If either one of the constant is null and the other non null
13720      operand is a String constant, return it. */
13721   if ((TREE_CODE (op1) == STRING_CST) && !op2)
13722     return op1;
13723
13724   /* If OP1 isn't already a StringBuffer, create and
13725      initialize a new one */
13726   if (!IS_CRAFTED_STRING_BUFFER_P (op1))
13727     {
13728       /* Two solutions here:
13729          1) OP1 is a constant string reference, we call new StringBuffer(OP1)
13730          2) OP1 is something else, we call new StringBuffer().append(OP1).  */
13731       if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
13732         op1 = BUILD_STRING_BUFFER (op1);
13733       else
13734         {
13735           tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
13736           op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
13737         }
13738     }
13739
13740   if (op2)
13741     {
13742       /* OP1 is no longer the last node holding a crafted StringBuffer */
13743       IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
13744       /* Create a node for `{new...,xxx}.append (op2)' */
13745       if (op2)
13746         op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
13747     }
13748
13749   /* Mark the last node holding a crafted StringBuffer */
13750   IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
13751
13752   TREE_SIDE_EFFECTS (op1) = side_effects;
13753   return op1;
13754 }
13755
13756 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
13757    StringBuffer. If no string were found to be patched, return
13758    NULL. */
13759
13760 static tree
13761 patch_string (tree node)
13762 {
13763   if (node == error_mark_node)
13764     return error_mark_node;
13765   if (TREE_CODE (node) == STRING_CST)
13766     return patch_string_cst (node);
13767   else if (IS_CRAFTED_STRING_BUFFER_P (node))
13768     {
13769       int saved = ctxp->explicit_constructor_p;
13770       tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
13771       tree ret;
13772       /* Temporary disable forbid the use of `this'. */
13773       ctxp->explicit_constructor_p = 0;
13774       ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
13775       /* String concatenation arguments must be evaluated in order too. */
13776       ret = force_evaluation_order (ret);
13777       /* Restore it at its previous value */
13778       ctxp->explicit_constructor_p = saved;
13779       return ret;
13780     }
13781   return NULL_TREE;
13782 }
13783
13784 /* Build the internal representation of a string constant.  */
13785
13786 static tree
13787 patch_string_cst (tree node)
13788 {
13789   int location;
13790   if (! flag_emit_class_files)
13791     {
13792       node = get_identifier (TREE_STRING_POINTER (node));
13793       location = alloc_name_constant (CONSTANT_String, node);
13794       node = build_ref_from_constant_pool (location);
13795     }
13796   TREE_CONSTANT (node) = 1;
13797   TREE_INVARIANT (node) = 1;
13798
13799   /* ??? Guessing that the class file code can't handle casts.  */
13800   if (! flag_emit_class_files)
13801     node = convert (string_ptr_type_node, node);
13802   else
13803     TREE_TYPE (node) = string_ptr_type_node;
13804
13805   return node;
13806 }
13807
13808 /* Build an incomplete unary operator expression. */
13809
13810 static tree
13811 build_unaryop (int op_token, int op_location, tree op1)
13812 {
13813   enum tree_code op;
13814   tree unaryop;
13815   switch (op_token)
13816     {
13817     case PLUS_TK: op = UNARY_PLUS_EXPR; break;
13818     case MINUS_TK: op = NEGATE_EXPR; break;
13819     case NEG_TK: op = TRUTH_NOT_EXPR; break;
13820     case NOT_TK: op = BIT_NOT_EXPR; break;
13821     default: abort ();
13822     }
13823
13824   unaryop = build1 (op, NULL_TREE, op1);
13825   TREE_SIDE_EFFECTS (unaryop) = 1;
13826   /* Store the location of the operator, for better error report. The
13827      string of the operator will be rebuild based on the OP value. */
13828   EXPR_WFL_LINECOL (unaryop) = op_location;
13829   return unaryop;
13830 }
13831
13832 /* Special case for the ++/-- operators, since they require an extra
13833    argument to build, which is set to NULL and patched
13834    later. IS_POST_P is 1 if the operator, 0 otherwise.  */
13835
13836 static tree
13837 build_incdec (int op_token, int op_location, tree op1, int is_post_p)
13838 {
13839   static const enum tree_code lookup [2][2] =
13840     {
13841       { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
13842       { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
13843     };
13844   tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
13845                      NULL_TREE, op1, NULL_TREE);
13846   TREE_SIDE_EFFECTS (node) = 1;
13847   /* Store the location of the operator, for better error report. The
13848      string of the operator will be rebuild based on the OP value. */
13849   EXPR_WFL_LINECOL (node) = op_location;
13850   return node;
13851 }
13852
13853 /* Build an incomplete cast operator, based on the use of the
13854    CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
13855    set. java_complete_tree is trained to walk a CONVERT_EXPR even
13856    though its type is already set.  */
13857
13858 static tree
13859 build_cast (int location, tree type, tree exp)
13860 {
13861   tree node = build1 (CONVERT_EXPR, type, exp);
13862   EXPR_WFL_LINECOL (node) = location;
13863   return node;
13864 }
13865
13866 /* Build an incomplete class reference operator.  */
13867 static tree
13868 build_incomplete_class_ref (int location, tree class_name)
13869 {
13870   tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
13871   tree class_decl = GET_CPC ();
13872   tree this_class = TREE_TYPE (class_decl);
13873
13874   /* Generate the synthetic static method `class$'.  (Previously we
13875      deferred this, causing different method tables to be emitted
13876      for native code and bytecode.)  */
13877   if (!TYPE_DOT_CLASS (this_class)
13878       && !JPRIMITIVE_TYPE_P (class_name)
13879       && !(TREE_CODE (class_name) == VOID_TYPE))
13880     {
13881       tree cpc_list = GET_CPC_LIST();
13882       tree cpc = cpc_list;
13883       tree target_class;
13884
13885       /* For inner classes, add a 'class$' method to their outermost
13886          context, creating it if necessary.  */
13887       
13888       while (GET_NEXT_ENCLOSING_CPC(cpc))
13889         cpc = GET_NEXT_ENCLOSING_CPC(cpc);
13890       class_decl = TREE_VALUE (cpc);
13891
13892       target_class = TREE_TYPE (class_decl);
13893
13894       if (CLASS_INTERFACE (TYPE_NAME (target_class)))
13895         {
13896           /* For interfaces, adding a static 'class$' method directly 
13897              is illegal.  So create an inner class to contain the new
13898              method.  Empirically this matches the behavior of javac.  */
13899           tree t, inner;
13900           /* We want the generated inner class inside the outermost class. */
13901           GET_CPC_LIST() = cpc;
13902           t = build_wfl_node (DECL_NAME (TYPE_NAME (object_type_node)));
13903           inner = create_anonymous_class (t);
13904           target_class = TREE_TYPE (inner);
13905           end_class_declaration (1);
13906           GET_CPC_LIST() = cpc_list;
13907         }
13908
13909       if (TYPE_DOT_CLASS (target_class) == NULL_TREE)
13910         build_dot_class_method (target_class);
13911
13912       if (this_class != target_class)
13913         TYPE_DOT_CLASS (this_class) = TYPE_DOT_CLASS (target_class);
13914     }
13915
13916   EXPR_WFL_LINECOL (node) = location;
13917   return node;
13918 }
13919
13920 /* Complete an incomplete class reference operator.  */
13921 static tree
13922 patch_incomplete_class_ref (tree node)
13923 {
13924   tree type = TREE_OPERAND (node, 0);
13925   tree ref_type;
13926
13927   if (!(ref_type = resolve_type_during_patch (type)))
13928     return error_mark_node;
13929
13930   /* If we're not emitting class files and we know ref_type is a
13931      compiled class, build a direct reference.  */
13932   if ((! flag_emit_class_files && is_compiled_class (ref_type))
13933       || JPRIMITIVE_TYPE_P (ref_type)
13934       || TREE_CODE (ref_type) == VOID_TYPE)
13935     {
13936       tree dot = build_class_ref (ref_type);
13937       /* A class referenced by `foo.class' is initialized.  */
13938       if (!flag_emit_class_files)
13939        dot = build_class_init (ref_type, dot);
13940       return java_complete_tree (dot);
13941     }
13942
13943   /* If we're emitting class files and we have to deal with non
13944      primitive types, we invoke the synthetic static method `class$'.  */
13945   ref_type = build_dot_class_method_invocation (current_class, ref_type);
13946   return java_complete_tree (ref_type);
13947 }
13948
13949 /* 15.14 Unary operators. We return error_mark_node in case of error,
13950    but preserve the type of NODE if the type is fixed.  */
13951
13952 static tree
13953 patch_unaryop (tree node, tree wfl_op)
13954 {
13955   tree op = TREE_OPERAND (node, 0);
13956   tree op_type = TREE_TYPE (op);
13957   tree prom_type = NULL_TREE, value, decl;
13958   int outer_field_flag = 0;
13959   int code = TREE_CODE (node);
13960   int error_found = 0;
13961
13962   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13963
13964   switch (code)
13965     {
13966       /* 15.13.2 Postfix Increment Operator ++ */
13967     case POSTINCREMENT_EXPR:
13968       /* 15.13.3 Postfix Increment Operator -- */
13969     case POSTDECREMENT_EXPR:
13970       /* 15.14.1 Prefix Increment Operator ++ */
13971     case PREINCREMENT_EXPR:
13972       /* 15.14.2 Prefix Decrement Operator -- */
13973     case PREDECREMENT_EXPR:
13974       op = decl = strip_out_static_field_access_decl (op);
13975       outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
13976       /* We might be trying to change an outer field accessed using
13977          access method. */
13978       if (outer_field_flag)
13979         {
13980           /* Retrieve the decl of the field we're trying to access. We
13981              do that by first retrieving the function we would call to
13982              access the field. It has been already verified that this
13983              field isn't final */
13984           if (flag_emit_class_files)
13985             decl = TREE_OPERAND (op, 0);
13986           else
13987             decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
13988           decl = DECL_FUNCTION_ACCESS_DECL (decl);
13989         }
13990       /* We really should have a JAVA_ARRAY_EXPR to avoid this */
13991       else if (!JDECL_P (decl)
13992           && TREE_CODE (decl) != COMPONENT_REF
13993           && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
13994           && TREE_CODE (decl) != INDIRECT_REF
13995           && !(TREE_CODE (decl) == COMPOUND_EXPR
13996                && TREE_OPERAND (decl, 1)
13997                && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
13998         {
13999           TREE_TYPE (node) = error_mark_node;
14000           error_found = 1;
14001         }
14002
14003       /* From now on, we know that op if a variable and that it has a
14004          valid wfl. We use wfl_op to locate errors related to the
14005          ++/-- operand. */
14006       if (!JNUMERIC_TYPE_P (op_type))
14007         {
14008           parse_error_context
14009             (wfl_op, "Invalid argument type `%s' to `%s'",
14010              lang_printable_name (op_type, 0), operator_string (node));
14011           TREE_TYPE (node) = error_mark_node;
14012           error_found = 1;
14013         }
14014       else
14015         {
14016           /* Before the addition, binary numeric promotion is performed on
14017              both operands, if really necessary */
14018           if (JINTEGRAL_TYPE_P (op_type))
14019             {
14020               value = build_int_2 (1, 0);
14021               TREE_TYPE (value) = TREE_TYPE (node) = op_type;
14022             }
14023           else
14024             {
14025               value = build_int_2 (1, 0);
14026               TREE_TYPE (node) =
14027                 binary_numeric_promotion (op_type,
14028                                           TREE_TYPE (value), &op, &value);
14029             }
14030
14031           /* We remember we might be accessing an outer field */
14032           if (outer_field_flag)
14033             {
14034               /* We re-generate an access to the field */
14035               value = build (PLUS_EXPR, TREE_TYPE (op),
14036                              build_outer_field_access (wfl_op, decl), value);
14037
14038               /* And we patch the original access$() into a write
14039                  with plus_op as a rhs */
14040               return outer_field_access_fix (node, op, value);
14041             }
14042
14043           /* And write back into the node. */
14044           TREE_OPERAND (node, 0) = op;
14045           TREE_OPERAND (node, 1) = value;
14046           /* Convert the overall back into its original type, if
14047              necessary, and return */
14048           if (JINTEGRAL_TYPE_P (op_type))
14049             return fold (node);
14050           else
14051             return fold (convert (op_type, node));
14052         }
14053       break;
14054
14055       /* 15.14.3 Unary Plus Operator + */
14056     case UNARY_PLUS_EXPR:
14057       /* 15.14.4 Unary Minus Operator - */
14058     case NEGATE_EXPR:
14059       if (!JNUMERIC_TYPE_P (op_type))
14060         {
14061           ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
14062           TREE_TYPE (node) = error_mark_node;
14063           error_found = 1;
14064         }
14065       /* Unary numeric promotion is performed on operand */
14066       else
14067         {
14068           op = do_unary_numeric_promotion (op);
14069           prom_type = TREE_TYPE (op);
14070           if (code == UNARY_PLUS_EXPR)
14071             return fold (op);
14072         }
14073       break;
14074
14075       /* 15.14.5 Bitwise Complement Operator ~ */
14076     case BIT_NOT_EXPR:
14077       if (!JINTEGRAL_TYPE_P (op_type))
14078         {
14079           ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
14080           TREE_TYPE (node) = error_mark_node;
14081           error_found = 1;
14082         }
14083       else
14084         {
14085           op = do_unary_numeric_promotion (op);
14086           prom_type = TREE_TYPE (op);
14087         }
14088       break;
14089
14090       /* 15.14.6 Logical Complement Operator ! */
14091     case TRUTH_NOT_EXPR:
14092       if (TREE_CODE (op_type) != BOOLEAN_TYPE)
14093         {
14094           ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
14095           /* But the type is known. We will report an error if further
14096              attempt of a assignment is made with this rhs */
14097           TREE_TYPE (node) = boolean_type_node;
14098           error_found = 1;
14099         }
14100       else
14101         prom_type = boolean_type_node;
14102       break;
14103
14104       /* 15.15 Cast Expression */
14105     case CONVERT_EXPR:
14106       value = patch_cast (node, wfl_operator);
14107       if (value == error_mark_node)
14108         {
14109           /* If this cast is part of an assignment, we tell the code
14110              that deals with it not to complain about a mismatch,
14111              because things have been cast, anyways */
14112           TREE_TYPE (node) = error_mark_node;
14113           error_found = 1;
14114         }
14115       else
14116         {
14117           value = fold (value);
14118           TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
14119           return value;
14120         }
14121       break;
14122     }
14123
14124   if (error_found)
14125     return error_mark_node;
14126
14127   /* There are cases where node has been replaced by something else
14128      and we don't end up returning here: UNARY_PLUS_EXPR,
14129      CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14130   TREE_OPERAND (node, 0) = fold (op);
14131   TREE_TYPE (node) = prom_type;
14132   TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
14133   return fold (node);
14134 }
14135
14136 /* Generic type resolution that sometimes takes place during node
14137    patching. Returned the resolved type or generate an error
14138    message. Return the resolved type or NULL_TREE.  */
14139
14140 static tree
14141 resolve_type_during_patch (tree type)
14142 {
14143   if (unresolved_type_p (type, NULL))
14144     {
14145       tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
14146       if (!type_decl)
14147         {
14148           parse_error_context (type,
14149                                "Class `%s' not found in type declaration",
14150                                IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
14151           return NULL_TREE;
14152         }
14153
14154       check_deprecation (type, type_decl);
14155
14156       return TREE_TYPE (type_decl);
14157     }
14158   return type;
14159 }
14160
14161 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14162    found. Otherwise NODE or something meant to replace it is returned.  */
14163
14164 static tree
14165 patch_cast (tree node, tree wfl_op)
14166 {
14167   tree op = TREE_OPERAND (node, 0);
14168   tree cast_type = TREE_TYPE (node);
14169   tree patched, op_type;
14170   char *t1;
14171
14172   /* Some string patching might be necessary at this stage */
14173   if ((patched = patch_string (op)))
14174     TREE_OPERAND (node, 0) = op = patched;
14175   op_type = TREE_TYPE (op);
14176
14177   /* First resolve OP_TYPE if unresolved */
14178   if (!(cast_type = resolve_type_during_patch (cast_type)))
14179     return error_mark_node;
14180
14181   /* Check on cast that are proven correct at compile time */
14182   if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
14183     {
14184       /* Same type */
14185       if (cast_type == op_type)
14186         return node;
14187
14188       /* A narrowing conversion from a floating-point number to an
14189          integral type requires special handling (5.1.3).  */
14190       if (JFLOAT_TYPE_P (op_type) && JINTEGRAL_TYPE_P (cast_type))
14191         if (cast_type != long_type_node)
14192           op = convert (integer_type_node, op);
14193
14194       /* Try widening/narrowing conversion.  Potentially, things need
14195          to be worked out in gcc so we implement the extreme cases
14196          correctly.  fold_convert() needs to be fixed.  */
14197       return convert (cast_type, op);
14198     }
14199
14200   /* It's also valid to cast a boolean into a boolean */
14201   if (op_type == boolean_type_node && cast_type == boolean_type_node)
14202     return node;
14203
14204   /* null can be casted to references */
14205   if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
14206     return build_null_of_type (cast_type);
14207
14208   /* The remaining legal casts involve conversion between reference
14209      types. Check for their compile time correctness. */
14210   if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
14211       && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
14212     {
14213       TREE_TYPE (node) = promote_type (cast_type);
14214       /* Now, the case can be determined correct at compile time if
14215          OP_TYPE can be converted into CAST_TYPE by assignment
14216          conversion (5.2) */
14217
14218       if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
14219         {
14220           TREE_SET_CODE (node, NOP_EXPR);
14221           return node;
14222         }
14223
14224       if (flag_emit_class_files)
14225         {
14226           TREE_SET_CODE (node, CONVERT_EXPR);
14227           return node;
14228         }
14229
14230       /* The cast requires a run-time check */
14231       return build (CALL_EXPR, promote_type (cast_type),
14232                     build_address_of (soft_checkcast_node),
14233                     tree_cons (NULL_TREE, build_class_ref (cast_type),
14234                                build_tree_list (NULL_TREE, op)),
14235                     NULL_TREE);
14236     }
14237
14238   /* Any other casts are proven incorrect at compile time */
14239   t1 = xstrdup (lang_printable_name (op_type, 0));
14240   parse_error_context (wfl_op, "Invalid cast from `%s' to `%s'",
14241                        t1, lang_printable_name (cast_type, 0));
14242   free (t1);
14243   return error_mark_node;
14244 }
14245
14246 /* Build a null constant and give it the type TYPE.  */
14247
14248 static tree
14249 build_null_of_type (tree type)
14250 {
14251   tree node = build_int_2 (0, 0);
14252   TREE_TYPE (node) = promote_type (type);
14253   return node;
14254 }
14255
14256 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14257    a list of indices. */
14258 static tree
14259 build_array_ref (int location, tree array, tree index)
14260 {
14261   tree node = build (ARRAY_REF, NULL_TREE, array, index, NULL_TREE, NULL_TREE);
14262   EXPR_WFL_LINECOL (node) = location;
14263   return node;
14264 }
14265
14266 /* 15.12 Array Access Expression */
14267
14268 static tree
14269 patch_array_ref (tree node)
14270 {
14271   tree array = TREE_OPERAND (node, 0);
14272   tree array_type  = TREE_TYPE (array);
14273   tree index = TREE_OPERAND (node, 1);
14274   tree index_type = TREE_TYPE (index);
14275   int error_found = 0;
14276
14277   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14278
14279   if (TREE_CODE (array_type) == POINTER_TYPE)
14280     array_type = TREE_TYPE (array_type);
14281
14282   /* The array reference must be an array */
14283   if (!TYPE_ARRAY_P (array_type))
14284     {
14285       parse_error_context
14286         (wfl_operator,
14287          "`[]' can only be applied to arrays. It can't be applied to `%s'",
14288          lang_printable_name (array_type, 0));
14289       TREE_TYPE (node) = error_mark_node;
14290       error_found = 1;
14291     }
14292
14293   /* The array index undergoes unary numeric promotion. The promoted
14294      type must be int */
14295   index = do_unary_numeric_promotion (index);
14296   if (TREE_TYPE (index) != int_type_node)
14297     {
14298       if (valid_cast_to_p (index_type, int_type_node))
14299         parse_error_context (wfl_operator,
14300    "Incompatible type for `[]'. Explicit cast needed to convert `%s' to `int'",
14301                              lang_printable_name (index_type, 0));
14302       else
14303         parse_error_context (wfl_operator,
14304           "Incompatible type for `[]'. Can't convert `%s' to `int'",
14305                              lang_printable_name (index_type, 0));
14306       TREE_TYPE (node) = error_mark_node;
14307       error_found = 1;
14308     }
14309
14310   if (error_found)
14311     return error_mark_node;
14312
14313   array_type = TYPE_ARRAY_ELEMENT (array_type);
14314
14315   if (flag_emit_class_files || flag_emit_xref)
14316     {
14317       TREE_OPERAND (node, 0) = array;
14318       TREE_OPERAND (node, 1) = index;
14319     }
14320   else
14321     node = build_java_arrayaccess (array, array_type, index);
14322   TREE_TYPE (node) = array_type;
14323   return node;
14324 }
14325
14326 /* 15.9 Array Creation Expressions */
14327
14328 static tree
14329 build_newarray_node (tree type, tree dims, int extra_dims)
14330 {
14331   tree node =
14332     build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
14333            build_int_2 (extra_dims, 0));
14334   return node;
14335 }
14336
14337 static tree
14338 patch_newarray (tree node)
14339 {
14340   tree type = TREE_OPERAND (node, 0);
14341   tree dims = TREE_OPERAND (node, 1);
14342   tree cdim, array_type;
14343   int error_found = 0;
14344   int ndims = 0;
14345   int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
14346
14347   /* Dimension types are verified. It's better for the types to be
14348      verified in order. */
14349   for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
14350     {
14351       int dim_error = 0;
14352       tree dim = TREE_VALUE (cdim);
14353
14354       /* Dim might have been saved during its evaluation */
14355       dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
14356
14357       /* The type of each specified dimension must be an integral type. */
14358       if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
14359         dim_error = 1;
14360
14361       /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14362          promoted type must be int. */
14363       else
14364         {
14365           dim = do_unary_numeric_promotion (dim);
14366           if (TREE_TYPE (dim) != int_type_node)
14367             dim_error = 1;
14368         }
14369
14370       /* Report errors on types here */
14371       if (dim_error)
14372         {
14373           parse_error_context
14374             (TREE_PURPOSE (cdim),
14375              "Incompatible type for dimension in array creation expression. %s convert `%s' to `int'",
14376              (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
14377               "Explicit cast needed to" : "Can't"),
14378              lang_printable_name (TREE_TYPE (dim), 0));
14379           error_found = 1;
14380         }
14381
14382       TREE_PURPOSE (cdim) = NULL_TREE;
14383     }
14384
14385   /* Resolve array base type if unresolved */
14386   if (!(type = resolve_type_during_patch (type)))
14387     error_found = 1;
14388
14389   if (error_found)
14390     {
14391       /* We don't want further evaluation of this bogus array creation
14392          operation */
14393       TREE_TYPE (node) = error_mark_node;
14394       return error_mark_node;
14395     }
14396
14397   /* Set array_type to the actual (promoted) array type of the result. */
14398   if (TREE_CODE (type) == RECORD_TYPE)
14399     type = build_pointer_type (type);
14400   while (--xdims >= 0)
14401     {
14402       type = promote_type (build_java_array_type (type, -1));
14403     }
14404   dims = nreverse (dims);
14405   array_type = type;
14406   for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
14407     {
14408       type = array_type;
14409       array_type
14410         = build_java_array_type (type,
14411                                  TREE_CODE (cdim) == INTEGER_CST
14412                                  ? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
14413                                  : -1);
14414       array_type = promote_type (array_type);
14415     }
14416   dims = nreverse (dims);
14417
14418   /* The node is transformed into a function call. Things are done
14419      differently according to the number of dimensions. If the number
14420      of dimension is equal to 1, then the nature of the base type
14421      (primitive or not) matters. */
14422   if (ndims == 1)
14423     return build_new_array (type, TREE_VALUE (dims));
14424
14425   /* Can't reuse what's already written in expr.c because it uses the
14426      JVM stack representation. Provide a build_multianewarray. FIXME */
14427   return build (CALL_EXPR, array_type,
14428                 build_address_of (soft_multianewarray_node),
14429                 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
14430                            tree_cons (NULL_TREE,
14431                                       build_int_2 (ndims, 0), dims )),
14432                 NULL_TREE);
14433 }
14434
14435 /* 10.6 Array initializer.  */
14436
14437 /* Build a wfl for array element that don't have one, so we can
14438    pin-point errors.  */
14439
14440 static tree
14441 maybe_build_array_element_wfl (tree node)
14442 {
14443   if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
14444     return build_expr_wfl (NULL_TREE, ctxp->filename,
14445                            ctxp->elc.line, ctxp->elc.prev_col);
14446   else
14447     return NULL_TREE;
14448 }
14449
14450 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14451    identification of initialized arrays easier to detect during walk
14452    and expansion.  */
14453
14454 static tree
14455 build_new_array_init (int location, tree values)
14456 {
14457   tree constructor = build_constructor (NULL_TREE, values);
14458   tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
14459   EXPR_WFL_LINECOL (to_return) = location;
14460   return to_return;
14461 }
14462
14463 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14464    occurred.  Otherwise return NODE after having set its type
14465    appropriately.  */
14466
14467 static tree
14468 patch_new_array_init (tree type, tree node)
14469 {
14470   int error_seen = 0;
14471   tree current, element_type;
14472   HOST_WIDE_INT length;
14473   int all_constant = 1;
14474   tree init = TREE_OPERAND (node, 0);
14475
14476   if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
14477     {
14478       parse_error_context (node,
14479                            "Invalid array initializer for non-array type `%s'",
14480                            lang_printable_name (type, 1));
14481       return error_mark_node;
14482     }
14483   type = TREE_TYPE (type);
14484   element_type = TYPE_ARRAY_ELEMENT (type);
14485
14486   CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
14487
14488   for (length = 0, current = CONSTRUCTOR_ELTS (init);
14489        current;  length++, current = TREE_CHAIN (current))
14490     {
14491       tree elt = TREE_VALUE (current);
14492       if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
14493         {
14494           error_seen |= array_constructor_check_entry (element_type, current);
14495           elt = TREE_VALUE (current);
14496           /* When compiling to native code, STRING_CST is converted to
14497              INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14498           if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
14499             all_constant = 0;
14500         }
14501       else
14502         {
14503           TREE_VALUE (current) = patch_new_array_init (element_type, elt);
14504           TREE_PURPOSE (current) = NULL_TREE;
14505           all_constant = 0;
14506         }
14507       if (elt && TREE_CODE (elt) == TREE_LIST
14508           && TREE_VALUE (elt) == error_mark_node)
14509         error_seen = 1;
14510     }
14511
14512   if (error_seen)
14513     return error_mark_node;
14514
14515   /* Create a new type. We can't reuse the one we have here by
14516      patching its dimension because it originally is of dimension -1
14517      hence reused by gcc. This would prevent triangular arrays. */
14518   type = build_java_array_type (element_type, length);
14519   TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
14520   TREE_TYPE (node) = promote_type (type);
14521   TREE_CONSTANT (init) = all_constant;
14522   TREE_INVARIANT (init) = all_constant;
14523   TREE_CONSTANT (node) = all_constant;
14524   TREE_INVARIANT (node) = all_constant;
14525   return node;
14526 }
14527
14528 /* Verify that one entry of the initializer element list can be
14529    assigned to the array base type. Report 1 if an error occurred, 0
14530    otherwise.  */
14531
14532 static int
14533 array_constructor_check_entry (tree type, tree entry)
14534 {
14535   char *array_type_string = NULL;       /* For error reports */
14536   tree value, type_value, new_value, wfl_value, patched;
14537   int error_seen = 0;
14538
14539   new_value = NULL_TREE;
14540   wfl_value = TREE_VALUE (entry);
14541
14542   value = java_complete_tree (TREE_VALUE (entry));
14543   /* patch_string return error_mark_node if arg is error_mark_node */
14544   if ((patched = patch_string (value)))
14545     value = patched;
14546   if (value == error_mark_node)
14547     return 1;
14548
14549   type_value = TREE_TYPE (value);
14550
14551   /* At anytime, try_builtin_assignconv can report a warning on
14552      constant overflow during narrowing. */
14553   SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
14554   new_value = try_builtin_assignconv (wfl_operator, type, value);
14555   if (!new_value && (new_value = try_reference_assignconv (type, value)))
14556     type_value = promote_type (type);
14557
14558   /* Check and report errors */
14559   if (!new_value)
14560     {
14561       const char *const msg = (!valid_cast_to_p (type_value, type) ?
14562                    "Can't" : "Explicit cast needed to");
14563       if (!array_type_string)
14564         array_type_string = xstrdup (lang_printable_name (type, 1));
14565       parse_error_context
14566         (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
14567          msg, lang_printable_name (type_value, 1), array_type_string);
14568       error_seen = 1;
14569     }
14570
14571   if (new_value)
14572     TREE_VALUE (entry) = new_value;
14573
14574   if (array_type_string)
14575     free (array_type_string);
14576
14577   TREE_PURPOSE (entry) = NULL_TREE;
14578   return error_seen;
14579 }
14580
14581 static tree
14582 build_this (int location)
14583 {
14584   tree node = build_wfl_node (this_identifier_node);
14585   TREE_SET_CODE (node, THIS_EXPR);
14586   EXPR_WFL_LINECOL (node) = location;
14587   return node;
14588 }
14589
14590 /* 14.15 The return statement. It builds a modify expression that
14591    assigns the returned value to the RESULT_DECL that hold the value
14592    to be returned. */
14593
14594 static tree
14595 build_return (int location, tree op)
14596 {
14597   tree node = build1 (RETURN_EXPR, NULL_TREE, op);
14598   EXPR_WFL_LINECOL (node) = location;
14599   node = build_debugable_stmt (location, node);
14600   return node;
14601 }
14602
14603 static tree
14604 patch_return (tree node)
14605 {
14606   tree return_exp = TREE_OPERAND (node, 0);
14607   tree meth = current_function_decl;
14608   tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
14609   int error_found = 0;
14610
14611   TREE_TYPE (node) = error_mark_node;
14612   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14613
14614   /* It's invalid to have a return value within a function that is
14615      declared with the keyword void or that is a constructor */
14616   if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
14617     error_found = 1;
14618
14619   /* It's invalid to use a return statement in a static block */
14620   if (DECL_CLINIT_P (current_function_decl))
14621     error_found = 1;
14622
14623   /* It's invalid to have a no return value within a function that
14624      isn't declared with the keyword `void' */
14625   if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
14626     error_found = 2;
14627
14628   if (DECL_INSTINIT_P (current_function_decl))
14629     error_found = 1;
14630
14631   if (error_found)
14632     {
14633       if (DECL_INSTINIT_P (current_function_decl))
14634         parse_error_context (wfl_operator,
14635                              "`return' inside instance initializer");
14636
14637       else if (DECL_CLINIT_P (current_function_decl))
14638         parse_error_context (wfl_operator,
14639                              "`return' inside static initializer");
14640
14641       else if (!DECL_CONSTRUCTOR_P (meth))
14642         {
14643           char *t = xstrdup (lang_printable_name (mtype, 0));
14644           parse_error_context (wfl_operator,
14645                                "`return' with%s value from `%s %s'",
14646                                (error_found == 1 ? "" : "out"),
14647                                t, lang_printable_name (meth, 0));
14648           free (t);
14649         }
14650       else
14651         parse_error_context (wfl_operator,
14652                              "`return' with value from constructor `%s'",
14653                              lang_printable_name (meth, 0));
14654       return error_mark_node;
14655     }
14656
14657   /* If we have a return_exp, build a modify expression and expand
14658      it. Note: at that point, the assignment is declared valid, but we
14659      may want to carry some more hacks */
14660   if (return_exp)
14661     {
14662       tree exp = java_complete_tree (return_exp);
14663       tree modify, patched;
14664
14665       if ((patched = patch_string (exp)))
14666         exp = patched;
14667
14668       modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
14669       EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
14670       modify = java_complete_tree (modify);
14671
14672       if (modify != error_mark_node)
14673         {
14674           TREE_SIDE_EFFECTS (modify) = 1;
14675           TREE_OPERAND (node, 0) = modify;
14676         }
14677       else
14678         return error_mark_node;
14679     }
14680   TREE_TYPE (node) = void_type_node;
14681   TREE_SIDE_EFFECTS (node) = 1;
14682   return node;
14683 }
14684
14685 /* 14.8 The if Statement */
14686
14687 static tree
14688 build_if_else_statement (int location, tree expression, tree if_body,
14689                          tree else_body)
14690 {
14691   tree node;
14692   if (!else_body)
14693     else_body = build_java_empty_stmt ();
14694   node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
14695   EXPR_WFL_LINECOL (node) = location;
14696   node = build_debugable_stmt (location, node);
14697   return node;
14698 }
14699
14700 static tree
14701 patch_if_else_statement (tree node)
14702 {
14703   tree expression = TREE_OPERAND (node, 0);
14704   int can_complete_normally
14705     = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
14706        | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
14707
14708   TREE_TYPE (node) = error_mark_node;
14709   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14710
14711   /* The type of expression must be boolean */
14712   if (TREE_TYPE (expression) != boolean_type_node
14713       && TREE_TYPE (expression) != promoted_boolean_type_node)
14714     {
14715       parse_error_context
14716         (wfl_operator,
14717          "Incompatible type for `if'. Can't convert `%s' to `boolean'",
14718          lang_printable_name (TREE_TYPE (expression), 0));
14719       return error_mark_node;
14720     }
14721
14722   TREE_TYPE (node) = void_type_node;
14723   TREE_SIDE_EFFECTS (node) = 1;
14724   CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14725   return node;
14726 }
14727
14728 /* 14.6 Labeled Statements */
14729
14730 /* Action taken when a labeled statement is parsed. a new
14731    LABELED_BLOCK_EXPR is created. No statement is attached to the
14732    label, yet.  LABEL can be NULL_TREE for artificially-generated blocks. */
14733
14734 static tree
14735 build_labeled_block (int location, tree label)
14736 {
14737   tree label_name ;
14738   tree label_decl, node;
14739   if (label == NULL_TREE || label == continue_identifier_node)
14740     label_name = label;
14741   else
14742     {
14743       label_name = merge_qualified_name (label_id, label);
14744       /* Issue an error if we try to reuse a label that was previously
14745          declared */
14746       if (IDENTIFIER_LOCAL_VALUE (label_name))
14747         {
14748           EXPR_WFL_LINECOL (wfl_operator) = location;
14749           parse_error_context (wfl_operator,
14750             "Declaration of `%s' shadows a previous label declaration",
14751                                IDENTIFIER_POINTER (label));
14752           EXPR_WFL_LINECOL (wfl_operator) =
14753             EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
14754           parse_error_context (wfl_operator,
14755             "This is the location of the previous declaration of label `%s'",
14756                                IDENTIFIER_POINTER (label));
14757           java_error_count--;
14758         }
14759     }
14760
14761   label_decl = create_label_decl (label_name);
14762   node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
14763   EXPR_WFL_LINECOL (node) = location;
14764   TREE_SIDE_EFFECTS (node) = 1;
14765   return node;
14766 }
14767
14768 /* A labeled statement LBE is attached a statement.  */
14769
14770 static tree
14771 finish_labeled_statement (tree lbe, /* Labeled block expr */
14772                           tree statement)
14773 {
14774   /* In anyways, tie the loop to its statement */
14775   LABELED_BLOCK_BODY (lbe) = statement;
14776   pop_labeled_block ();
14777   POP_LABELED_BLOCK ();
14778   return lbe;
14779 }
14780
14781 /* 14.10, 14.11, 14.12 Loop Statements */
14782
14783 /* Create an empty LOOP_EXPR and make it the last in the nested loop
14784    list. */
14785
14786 static tree
14787 build_new_loop (tree loop_body)
14788 {
14789   tree loop =  build (LOOP_EXPR, NULL_TREE, loop_body);
14790   TREE_SIDE_EFFECTS (loop) = 1;
14791   PUSH_LOOP (loop);
14792   return loop;
14793 }
14794
14795 /* Create a loop body according to the following structure:
14796      COMPOUND_EXPR
14797        COMPOUND_EXPR            (loop main body)
14798          EXIT_EXPR              (this order is for while/for loops.
14799          LABELED_BLOCK_EXPR      the order is reversed for do loops)
14800            LABEL_DECL           (a continue occurring here branches at the
14801            BODY                  end of this labeled block)
14802        INCREMENT                (if any)
14803
14804   REVERSED, if nonzero, tells that the loop condition expr comes
14805   after the body, like in the do-while loop.
14806
14807   To obtain a loop, the loop body structure described above is
14808   encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
14809
14810    LABELED_BLOCK_EXPR
14811      LABEL_DECL                   (use this label to exit the loop)
14812      LOOP_EXPR
14813        <structure described above> */
14814
14815 static tree
14816 build_loop_body (int location, tree condition, int reversed)
14817 {
14818   tree first, second, body;
14819
14820   condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
14821   EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
14822   condition = build_debugable_stmt (location, condition);
14823   TREE_SIDE_EFFECTS (condition) = 1;
14824
14825   body = build_labeled_block (0, continue_identifier_node);
14826   first = (reversed ? body : condition);
14827   second = (reversed ? condition : body);
14828   return
14829     build (COMPOUND_EXPR, NULL_TREE,
14830            build (COMPOUND_EXPR, NULL_TREE, first, second),
14831                   build_java_empty_stmt ());
14832 }
14833
14834 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
14835    their order) on the current loop. Unlink the current loop from the
14836    loop list.  */
14837
14838 static tree
14839 finish_loop_body (int location, tree condition, tree body, int reversed)
14840 {
14841   tree to_return = ctxp->current_loop;
14842   tree loop_body = LOOP_EXPR_BODY (to_return);
14843   if (condition)
14844     {
14845       tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
14846       /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
14847          The real EXIT_EXPR is one operand further. */
14848       EXPR_WFL_LINECOL (cnode) = location;
14849       /* This one is for accurate error reports */
14850       EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
14851       TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
14852     }
14853   LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
14854   POP_LOOP ();
14855   return to_return;
14856 }
14857
14858 /* Tailored version of finish_loop_body for FOR loops, when FOR
14859    loops feature the condition part */
14860
14861 static tree
14862 finish_for_loop (int location, tree condition, tree update, tree body)
14863 {
14864   /* Put the condition and the loop body in place */
14865   tree loop = finish_loop_body (location, condition, body, 0);
14866   /* LOOP is the current loop which has been now popped of the loop
14867      stack.  Mark the update block as reachable and install it.  We do
14868      this because the (current interpretation of the) JLS requires
14869      that the update expression be considered reachable even if the
14870      for loop's body doesn't complete normally.  */
14871   if (update != NULL_TREE && !IS_EMPTY_STMT (update))
14872     {
14873       tree up2 = update;
14874       if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
14875         up2 = EXPR_WFL_NODE (up2);
14876       /* It is possible for the update expression to be an
14877          EXPR_WFL_NODE wrapping nothing.  */
14878       if (up2 != NULL_TREE && !IS_EMPTY_STMT (up2))
14879         {
14880           /* Try to detect constraint violations.  These would be
14881              programming errors somewhere.  */
14882           if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
14883               || TREE_CODE (up2) == LOOP_EXPR)
14884             abort ();
14885           SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
14886         }
14887     }
14888   LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
14889   return loop;
14890 }
14891
14892 /* Try to find the loop a block might be related to. This comprises
14893    the case where the LOOP_EXPR is found as the second operand of a
14894    COMPOUND_EXPR, because the loop happens to have an initialization
14895    part, then expressed as the first operand of the COMPOUND_EXPR. If
14896    the search finds something, 1 is returned. Otherwise, 0 is
14897    returned. The search is assumed to start from a
14898    LABELED_BLOCK_EXPR's block.  */
14899
14900 static tree
14901 search_loop (tree statement)
14902 {
14903   if (TREE_CODE (statement) == LOOP_EXPR)
14904     return statement;
14905
14906   if (TREE_CODE (statement) == BLOCK)
14907     statement = BLOCK_SUBBLOCKS (statement);
14908   else
14909     return NULL_TREE;
14910
14911   if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
14912     while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
14913       statement = TREE_OPERAND (statement, 1);
14914
14915   return (TREE_CODE (statement) == LOOP_EXPR
14916           && FOR_LOOP_P (statement) ? statement : NULL_TREE);
14917 }
14918
14919 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
14920    returned otherwise.  */
14921
14922 static int
14923 labeled_block_contains_loop_p (tree block, tree loop)
14924 {
14925   if (!block)
14926     return 0;
14927
14928   if (LABELED_BLOCK_BODY (block) == loop)
14929     return 1;
14930
14931   if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
14932     return 1;
14933
14934   return 0;
14935 }
14936
14937 /* If the loop isn't surrounded by a labeled statement, create one and
14938    insert LOOP as its body.  */
14939
14940 static tree
14941 patch_loop_statement (tree loop)
14942 {
14943   tree loop_label;
14944
14945   TREE_TYPE (loop) = void_type_node;
14946   if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
14947     return loop;
14948
14949   loop_label = build_labeled_block (0, NULL_TREE);
14950   /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
14951      that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
14952   LABELED_BLOCK_BODY (loop_label) = loop;
14953   PUSH_LABELED_BLOCK (loop_label);
14954   return loop_label;
14955 }
14956
14957 /* 14.13, 14.14: break and continue Statements */
14958
14959 /* Build a break or a continue statement. a null NAME indicates an
14960    unlabeled break/continue statement.  */
14961
14962 static tree
14963 build_bc_statement (int location, int is_break, tree name)
14964 {
14965   tree break_continue, label_block_expr = NULL_TREE;
14966
14967   if (name)
14968     {
14969       if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
14970             (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
14971         /* Null means that we don't have a target for this named
14972            break/continue. In this case, we make the target to be the
14973            label name, so that the error can be reported accurately in
14974            patch_bc_statement. */
14975         label_block_expr = EXPR_WFL_NODE (name);
14976     }
14977   /* Unlabeled break/continue will be handled during the
14978      break/continue patch operation */
14979   break_continue
14980     = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
14981
14982   IS_BREAK_STMT_P (break_continue) = is_break;
14983   TREE_SIDE_EFFECTS (break_continue) = 1;
14984   EXPR_WFL_LINECOL (break_continue) = location;
14985   break_continue = build_debugable_stmt (location, break_continue);
14986   return break_continue;
14987 }
14988
14989 /* Verification of a break/continue statement. */
14990
14991 static tree
14992 patch_bc_statement (tree node)
14993 {
14994   tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
14995   tree labeled_block = ctxp->current_labeled_block;
14996   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14997
14998   /* Having an identifier here means that the target is unknown. */
14999   if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
15000     {
15001       parse_error_context (wfl_operator, "No label definition found for `%s'",
15002                            IDENTIFIER_POINTER (bc_label));
15003       return error_mark_node;
15004     }
15005   if (! IS_BREAK_STMT_P (node))
15006     {
15007       /* It's a continue statement. */
15008       for (;; labeled_block = TREE_CHAIN (labeled_block))
15009         {
15010           if (labeled_block == NULL_TREE)
15011             {
15012               if (bc_label == NULL_TREE)
15013                 parse_error_context (wfl_operator,
15014                                      "`continue' must be in loop");
15015               else
15016                 parse_error_context
15017                   (wfl_operator, "continue label `%s' does not name a loop",
15018                    IDENTIFIER_POINTER (bc_label));
15019               return error_mark_node;
15020             }
15021           if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
15022                == continue_identifier_node)
15023               && (bc_label == NULL_TREE
15024                   || TREE_CHAIN (labeled_block) == bc_label))
15025             {
15026               bc_label = labeled_block;
15027               break;
15028             }
15029         }
15030     }
15031   else if (!bc_label)
15032     {
15033       for (;; labeled_block = TREE_CHAIN (labeled_block))
15034         {
15035           if (labeled_block == NULL_TREE)
15036             {
15037               parse_error_context (wfl_operator,
15038                                      "`break' must be in loop or switch");
15039               return error_mark_node;
15040             }
15041           target_stmt = LABELED_BLOCK_BODY (labeled_block);
15042           if (TREE_CODE (target_stmt) == SWITCH_EXPR
15043               || search_loop (target_stmt))
15044             {
15045               bc_label = labeled_block;
15046               break;
15047             }
15048         }
15049     }
15050
15051   EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
15052   CAN_COMPLETE_NORMALLY (bc_label) = 1;
15053
15054   /* Our break/continue don't return values. */
15055   TREE_TYPE (node) = void_type_node;
15056   /* Encapsulate the break within a compound statement so that it's
15057      expanded all the times by expand_expr (and not clobbered
15058      sometimes, like after a if statement) */
15059   node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
15060   TREE_SIDE_EFFECTS (node) = 1;
15061   return node;
15062 }
15063
15064 /* Process the exit expression belonging to a loop. Its type must be
15065    boolean.  */
15066
15067 static tree
15068 patch_exit_expr (tree node)
15069 {
15070   tree expression = TREE_OPERAND (node, 0);
15071   TREE_TYPE (node) = error_mark_node;
15072   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15073
15074   /* The type of expression must be boolean */
15075   if (TREE_TYPE (expression) != boolean_type_node)
15076     {
15077       parse_error_context
15078         (wfl_operator,
15079     "Incompatible type for loop conditional. Can't convert `%s' to `boolean'",
15080          lang_printable_name (TREE_TYPE (expression), 0));
15081       return error_mark_node;
15082     }
15083   /* Now we know things are allright, invert the condition, fold and
15084      return */
15085   TREE_OPERAND (node, 0) =
15086     fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
15087
15088   if (! integer_zerop (TREE_OPERAND (node, 0))
15089       && ctxp->current_loop != NULL_TREE
15090       && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
15091     CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
15092   if (! integer_onep (TREE_OPERAND (node, 0)))
15093     CAN_COMPLETE_NORMALLY (node) = 1;
15094
15095
15096   TREE_TYPE (node) = void_type_node;
15097   return node;
15098 }
15099
15100 /* 14.9 Switch statement */
15101
15102 static tree
15103 patch_switch_statement (tree node)
15104 {
15105   tree se = TREE_OPERAND (node, 0), se_type;
15106   tree save, iter;
15107
15108   /* Complete the switch expression */
15109   se = TREE_OPERAND (node, 0) = java_complete_tree (se);
15110   se_type = TREE_TYPE (se);
15111   /* The type of the switch expression must be char, byte, short or
15112      int */
15113   if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
15114     {
15115       EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15116       parse_error_context (wfl_operator,
15117           "Incompatible type for `switch'. Can't convert `%s' to `int'",
15118                            lang_printable_name (se_type, 0));
15119       /* This is what java_complete_tree will check */
15120       TREE_OPERAND (node, 0) = error_mark_node;
15121       return error_mark_node;
15122     }
15123
15124   /* Save and restore the outer case label list.  */
15125   save = case_label_list;
15126   case_label_list = NULL_TREE;
15127
15128   TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
15129
15130   /* See if we've found a duplicate label.  We can't leave this until
15131      code generation, because in `--syntax-only' and `-C' modes we
15132      don't do ordinary code generation.  */
15133   for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
15134     {
15135       HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
15136       tree subiter;
15137       for (subiter = TREE_CHAIN (iter);
15138            subiter != NULL_TREE;
15139            subiter = TREE_CHAIN (subiter))
15140         {
15141           HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
15142           if (val == subval)
15143             {
15144               EXPR_WFL_LINECOL (wfl_operator)
15145                 = EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
15146               /* The case_label_list is in reverse order, so print the
15147                  outer label first.  */
15148               parse_error_context (wfl_operator, "duplicate case label: `"
15149                                    HOST_WIDE_INT_PRINT_DEC "'", subval);
15150               EXPR_WFL_LINECOL (wfl_operator)
15151                 = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
15152               parse_error_context (wfl_operator, "original label is here");
15153
15154               break;
15155             }
15156         }
15157     }
15158
15159   case_label_list = save;
15160
15161   /* Ready to return */
15162   if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
15163     {
15164       TREE_TYPE (node) = error_mark_node;
15165       return error_mark_node;
15166     }
15167   TREE_TYPE (node) = void_type_node;
15168   TREE_SIDE_EFFECTS (node) = 1;
15169   CAN_COMPLETE_NORMALLY (node)
15170     = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15171       || ! SWITCH_HAS_DEFAULT (node);
15172   return node;
15173 }
15174
15175 /* Assertions.  */
15176
15177 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15178    might be NULL_TREE.  */
15179 static tree
15180 build_assertion (int location, tree condition, tree value)
15181 {
15182   tree node;
15183   tree klass = GET_CPC ();
15184
15185   if (! enable_assertions (klass))
15186     {
15187       condition = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15188                          boolean_false_node, condition);
15189       if (value == NULL_TREE)
15190         value = build_java_empty_stmt ();
15191       return build_if_else_statement (location, condition,
15192                                       value, NULL_TREE);
15193     }
15194
15195   if (! CLASS_USES_ASSERTIONS (klass))
15196     {
15197       tree field, classdollar, id, call;
15198       tree class_type = TREE_TYPE (klass);
15199
15200       field = add_field (class_type,
15201                          get_identifier ("$assertionsDisabled"),
15202                          boolean_type_node,
15203                          ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
15204       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
15205       FIELD_SYNTHETIC (field) = 1;
15206
15207       classdollar = build_incomplete_class_ref (location, class_type);
15208
15209       /* Call CLASS.desiredAssertionStatus().  */
15210       id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
15211       call = build (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
15212       call = make_qualified_primary (classdollar, call, location);
15213       TREE_SIDE_EFFECTS (call) = 1;
15214
15215       /* Invert to obtain !CLASS.desiredAssertionStatus().  This may
15216          seem odd, but we do it to generate code identical to that of
15217          the JDK.  */
15218       call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
15219       TREE_SIDE_EFFECTS (call) = 1;
15220       DECL_INITIAL (field) = call;
15221
15222       /* Record the initializer in the initializer statement list.  */
15223       call = build (MODIFY_EXPR, NULL_TREE, field, call);
15224       TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
15225       SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
15226       MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
15227
15228       CLASS_USES_ASSERTIONS (klass) = 1;
15229     }
15230
15231   if (value != NULL_TREE)
15232     value = tree_cons (NULL_TREE, value, NULL_TREE);
15233
15234   node = build_wfl_node (get_identifier ("java"));
15235   node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
15236                               location);
15237   node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
15238                               location);
15239
15240   node = build (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
15241   TREE_SIDE_EFFECTS (node) = 1;
15242   /* It is too early to use BUILD_THROW.  */
15243   node = build1 (THROW_EXPR, NULL_TREE, node);
15244   TREE_SIDE_EFFECTS (node) = 1;
15245
15246   /* We invert the condition; if we just put NODE as the `else' part
15247      then we generate weird-looking bytecode.  */
15248   condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
15249   /* Check $assertionsDisabled.  */
15250   condition
15251     = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15252              build1 (TRUTH_NOT_EXPR, NULL_TREE,
15253                      build_wfl_node (get_identifier ("$assertionsDisabled"))),
15254              condition);
15255   node = build_if_else_statement (location, condition, node, NULL_TREE);
15256   return node;
15257 }
15258
15259 /* 14.18 The try/catch statements */
15260
15261 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15262    catches TYPE and executes CATCH_STMTS.  */
15263
15264 static tree
15265 encapsulate_with_try_catch (int location, tree type_or_name, tree try_stmts,
15266                             tree catch_stmts)
15267 {
15268   tree try_block, catch_clause_param, catch_block, catch;
15269
15270   /* First build a try block */
15271   try_block = build_expr_block (try_stmts, NULL_TREE);
15272
15273   /* Build a catch block: we need a catch clause parameter */
15274   if (TREE_CODE (type_or_name) == EXPR_WITH_FILE_LOCATION)
15275     {
15276       tree catch_type = obtain_incomplete_type (type_or_name);
15277       jdep *dep;
15278       catch_clause_param = build_decl (VAR_DECL, wpv_id, catch_type);
15279       register_incomplete_type (JDEP_VARIABLE, type_or_name,
15280                                 catch_clause_param, catch_type);
15281       dep = CLASSD_LAST (ctxp->classd_list);
15282       JDEP_GET_PATCH (dep) = &TREE_TYPE (catch_clause_param);
15283     }
15284   else
15285     catch_clause_param = build_decl (VAR_DECL, wpv_id,
15286                                      build_pointer_type (type_or_name));
15287
15288   /* And a block */
15289   catch_block = build_expr_block (NULL_TREE, catch_clause_param);
15290
15291   /* Initialize the variable and store in the block */
15292   catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param,
15293                  build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
15294   add_stmt_to_block (catch_block, NULL_TREE, catch);
15295
15296   /* Add the catch statements */
15297   add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
15298
15299   /* Now we can build a JAVA_CATCH_EXPR */
15300   catch_block = build1 (JAVA_CATCH_EXPR, NULL_TREE, catch_block);
15301
15302   return build_try_statement (location, try_block, catch_block);
15303 }
15304
15305 static tree
15306 build_try_statement (int location, tree try_block, tree catches)
15307 {
15308   tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
15309   EXPR_WFL_LINECOL (node) = location;
15310   return node;
15311 }
15312
15313 static tree
15314 build_try_finally_statement (int location, tree try_block, tree finally)
15315 {
15316   tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
15317   EXPR_WFL_LINECOL (node) = location;
15318   return node;
15319 }
15320
15321 static tree
15322 patch_try_statement (tree node)
15323 {
15324   int error_found = 0;
15325   tree try = TREE_OPERAND (node, 0);
15326   /* Exception handlers are considered in left to right order */
15327   tree catch = nreverse (TREE_OPERAND (node, 1));
15328   tree current, caught_type_list = NULL_TREE;
15329
15330   /* Check catch clauses, if any. Every time we find an error, we try
15331      to process the next catch clause. We process the catch clause before
15332      the try block so that when processing the try block we can check thrown
15333      exceptions againts the caught type list. */
15334   for (current = catch; current; current = TREE_CHAIN (current))
15335     {
15336       tree carg_decl, carg_type;
15337       tree sub_current, catch_block, catch_clause;
15338       int unreachable;
15339
15340       /* At this point, the structure of the catch clause is
15341            JAVA_CATCH_EXPR              (catch node)
15342              BLOCK              (with the decl of the parameter)
15343                COMPOUND_EXPR
15344                  MODIFY_EXPR   (assignment of the catch parameter)
15345                  BLOCK          (catch clause block)
15346        */
15347       catch_clause = TREE_OPERAND (current, 0);
15348       carg_decl = BLOCK_EXPR_DECLS (catch_clause);
15349       carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
15350
15351       /* Catch clauses can't have more than one parameter declared,
15352          but it's already enforced by the grammar. Make sure that the
15353          only parameter of the clause statement in of class Throwable
15354          or a subclass of Throwable, but that was done earlier. The
15355          catch clause parameter type has also been resolved. */
15356
15357       /* Just make sure that the catch clause parameter type inherits
15358          from java.lang.Throwable */
15359       if (!inherits_from_p (carg_type, throwable_type_node))
15360         {
15361           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15362           parse_error_context (wfl_operator,
15363                                "Can't catch class `%s'. Catch clause parameter type must be a subclass of class `java.lang.Throwable'",
15364                                lang_printable_name (carg_type, 0));
15365           error_found = 1;
15366           continue;
15367         }
15368
15369       /* Partial check for unreachable catch statement: The catch
15370          clause is reachable iff is no earlier catch block A in
15371          the try statement such that the type of the catch
15372          clause's parameter is the same as or a subclass of the
15373          type of A's parameter */
15374       unreachable = 0;
15375       for (sub_current = catch;
15376            sub_current != current; sub_current = TREE_CHAIN (sub_current))
15377         {
15378           tree sub_catch_clause, decl;
15379           sub_catch_clause = TREE_OPERAND (sub_current, 0);
15380           decl = BLOCK_EXPR_DECLS (sub_catch_clause);
15381
15382           if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
15383             {
15384               EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15385               parse_error_context
15386                 (wfl_operator,
15387                  "`catch' not reached because of the catch clause at line %d",
15388                  EXPR_WFL_LINENO (sub_current));
15389               unreachable = error_found = 1;
15390               break;
15391             }
15392         }
15393       /* Complete the catch clause block */
15394       catch_block = java_complete_tree (TREE_OPERAND (current, 0));
15395       if (catch_block == error_mark_node)
15396         {
15397           error_found = 1;
15398           continue;
15399         }
15400       if (CAN_COMPLETE_NORMALLY (catch_block))
15401         CAN_COMPLETE_NORMALLY (node) = 1;
15402       TREE_OPERAND (current, 0) = catch_block;
15403
15404       if (unreachable)
15405         continue;
15406
15407       /* Things to do here: the exception must be thrown */
15408
15409       /* Link this type to the caught type list */
15410       caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
15411     }
15412
15413   PUSH_EXCEPTIONS (caught_type_list);
15414   if ((try = java_complete_tree (try)) == error_mark_node)
15415     error_found = 1;
15416   if (CAN_COMPLETE_NORMALLY (try))
15417     CAN_COMPLETE_NORMALLY (node) = 1;
15418   POP_EXCEPTIONS ();
15419
15420   /* Verification ends here */
15421   if (error_found)
15422     return error_mark_node;
15423
15424   TREE_OPERAND (node, 0) = try;
15425   TREE_OPERAND (node, 1) = catch;
15426   TREE_TYPE (node) = void_type_node;
15427   return node;
15428 }
15429
15430 /* 14.17 The synchronized Statement */
15431
15432 static tree
15433 patch_synchronized_statement (tree node, tree wfl_op1)
15434 {
15435   tree expr = java_complete_tree (TREE_OPERAND (node, 0));
15436   tree block = TREE_OPERAND (node, 1);
15437
15438   tree tmp, enter, exit, expr_decl, assignment;
15439
15440   if (expr == error_mark_node)
15441     {
15442       block = java_complete_tree (block);
15443       return expr;
15444     }
15445
15446   /* We might be trying to synchronize on a STRING_CST */
15447   if ((tmp = patch_string (expr)))
15448     expr = tmp;
15449
15450   /* The TYPE of expr must be a reference type */
15451   if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
15452     {
15453       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15454       parse_error_context (wfl_operator, "Incompatible type for `synchronized'. Can't convert `%s' to `java.lang.Object'",
15455                            lang_printable_name (TREE_TYPE (expr), 0));
15456       return error_mark_node;
15457     }
15458
15459   if (flag_emit_xref)
15460     {
15461       TREE_OPERAND (node, 0) = expr;
15462       TREE_OPERAND (node, 1) = java_complete_tree (block);
15463       CAN_COMPLETE_NORMALLY (node) = 1;
15464       return node;
15465     }
15466
15467   /* Generate a try-finally for the synchronized statement, except
15468      that the handler that catches all throw exception calls
15469      _Jv_MonitorExit and then rethrow the exception.
15470      The synchronized statement is then implemented as:
15471      TRY
15472        {
15473          _Jv_MonitorEnter (expression)
15474          synchronized_block
15475          _Jv_MonitorExit (expression)
15476        }
15477      CATCH_ALL
15478        {
15479          e = _Jv_exception_info ();
15480          _Jv_MonitorExit (expression)
15481          Throw (e);
15482        } */
15483
15484   expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
15485   BUILD_MONITOR_ENTER (enter, expr_decl);
15486   BUILD_MONITOR_EXIT (exit, expr_decl);
15487   CAN_COMPLETE_NORMALLY (enter) = 1;
15488   CAN_COMPLETE_NORMALLY (exit) = 1;
15489   assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
15490   TREE_SIDE_EFFECTS (assignment) = 1;
15491   node = build (COMPOUND_EXPR, NULL_TREE,
15492                 build (COMPOUND_EXPR, NULL_TREE, assignment, enter),
15493                 build (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
15494   node = build_expr_block (node, expr_decl);
15495
15496   return java_complete_tree (node);
15497 }
15498
15499 /* 14.16 The throw Statement */
15500
15501 static tree
15502 patch_throw_statement (tree node, tree wfl_op1)
15503 {
15504   tree expr = TREE_OPERAND (node, 0);
15505   tree type = TREE_TYPE (expr);
15506   int unchecked_ok = 0, tryblock_throws_ok = 0;
15507
15508   /* Thrown expression must be assignable to java.lang.Throwable */
15509   if (!try_reference_assignconv (throwable_type_node, expr))
15510     {
15511       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15512       parse_error_context (wfl_operator,
15513     "Can't throw `%s'; it must be a subclass of class `java.lang.Throwable'",
15514                            lang_printable_name (type, 0));
15515       /* If the thrown expression was a reference, we further the
15516          compile-time check. */
15517       if (!JREFERENCE_TYPE_P (type))
15518         return error_mark_node;
15519     }
15520
15521   /* At least one of the following must be true */
15522
15523   /* The type of the throw expression is a not checked exception,
15524      i.e. is a unchecked expression. */
15525   unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
15526
15527   SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15528   /* An instance can't throw a checked exception unless that exception
15529      is explicitly declared in the `throws' clause of each
15530      constructor. This doesn't apply to anonymous classes, since they
15531      don't have declared constructors. */
15532   if (!unchecked_ok
15533       && DECL_INSTINIT_P (current_function_decl)
15534       && !ANONYMOUS_CLASS_P (current_class))
15535     {
15536       tree current;
15537       for (current = TYPE_METHODS (current_class); current;
15538            current = TREE_CHAIN (current))
15539         if (DECL_CONSTRUCTOR_P (current)
15540             && !check_thrown_exceptions_do (TREE_TYPE (expr)))
15541           {
15542             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)",
15543                                  lang_printable_name (TREE_TYPE (expr), 0));
15544             return error_mark_node;
15545           }
15546     }
15547
15548   /* Throw is contained in a try statement and at least one catch
15549      clause can receive the thrown expression or the current method is
15550      declared to throw such an exception. Or, the throw statement is
15551      contained in a method or constructor declaration and the type of
15552      the Expression is assignable to at least one type listed in the
15553      throws clause the declaration. */
15554   if (!unchecked_ok)
15555     tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
15556   if (!(unchecked_ok || tryblock_throws_ok))
15557     {
15558       /* If there is a surrounding try block that has no matching
15559          clatch clause, report it first. A surrounding try block exits
15560          only if there is something after the list of checked
15561          exception thrown by the current function (if any). */
15562       if (IN_TRY_BLOCK_P ())
15563         parse_error_context (wfl_operator, "Checked exception `%s' can't be caught by any of the catch clause(s) of the surrounding `try' block",
15564                              lang_printable_name (type, 0));
15565       /* If we have no surrounding try statement and the method doesn't have
15566          any throws, report it now. FIXME */
15567
15568       /* We report that the exception can't be throw from a try block
15569          in all circumstances but when the `throw' is inside a static
15570          block. */
15571       else if (!EXCEPTIONS_P (currently_caught_type_list)
15572                && !tryblock_throws_ok)
15573         {
15574           if (DECL_CLINIT_P (current_function_decl))
15575             parse_error_context (wfl_operator,
15576                    "Checked exception `%s' can't be thrown in initializer",
15577                                  lang_printable_name (type, 0));
15578           else
15579             parse_error_context (wfl_operator,
15580                    "Checked exception `%s' isn't thrown from a `try' block",
15581                                  lang_printable_name (type, 0));
15582         }
15583       /* Otherwise, the current method doesn't have the appropriate
15584          throws declaration */
15585       else
15586         parse_error_context (wfl_operator, "Checked exception `%s' doesn't match any of current method's `throws' declaration(s)",
15587                              lang_printable_name (type, 0));
15588       return error_mark_node;
15589     }
15590
15591   if (! flag_emit_class_files && ! flag_emit_xref)
15592     BUILD_THROW (node, expr);
15593
15594   /* If doing xrefs, keep the location where the `throw' was seen. */
15595   if (flag_emit_xref)
15596     EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
15597   return node;
15598 }
15599
15600 /* Check that exception said to be thrown by method DECL can be
15601    effectively caught from where DECL is invoked.  THIS_EXPR is the
15602    expression that computes `this' for the method call.  */
15603 static void
15604 check_thrown_exceptions (int location, tree decl, tree this_expr)
15605 {
15606   tree throws;
15607   int is_array_call = 0;
15608
15609   /* Skip check within generated methods, such as access$<n>.  */
15610   if (OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
15611     return;
15612
15613   if (this_expr != NULL_TREE
15614       && TREE_CODE (TREE_TYPE (this_expr)) == POINTER_TYPE
15615       && TYPE_ARRAY_P (TREE_TYPE (TREE_TYPE (this_expr))))
15616     is_array_call = 1;
15617
15618   /* For all the unchecked exceptions thrown by DECL.  */
15619   for (throws = DECL_FUNCTION_THROWS (decl); throws;
15620        throws = TREE_CHAIN (throws))
15621     if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
15622       {
15623         /* Suppress errors about cloning arrays.  */
15624         if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
15625           continue;
15626
15627         EXPR_WFL_LINECOL (wfl_operator) = location;
15628         if (DECL_FINIT_P (current_function_decl))
15629           parse_error_context
15630             (wfl_operator, "Exception `%s' can't be thrown in initializer",
15631              lang_printable_name (TREE_VALUE (throws), 0));
15632         else
15633           {
15634             parse_error_context
15635               (wfl_operator, "Exception `%s' must be caught, or it must be declared in the `throws' clause of `%s'",
15636                lang_printable_name (TREE_VALUE (throws), 0),
15637                (DECL_INIT_P (current_function_decl) ?
15638                 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
15639                 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
15640           }
15641       }
15642 }
15643
15644 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
15645    try-catch blocks, OR is listed in the `throws' clause of the
15646    current method.  */
15647
15648 static int
15649 check_thrown_exceptions_do (tree exception)
15650 {
15651   tree list = currently_caught_type_list;
15652   resolve_and_layout (exception, NULL_TREE);
15653   /* First, all the nested try-catch-finally at that stage. The
15654      last element contains `throws' clause exceptions, if any. */
15655   if (IS_UNCHECKED_EXCEPTION_P (exception))
15656     return 1;
15657   while (list)
15658     {
15659       tree caught;
15660       for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
15661         if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
15662           return 1;
15663       list = TREE_CHAIN (list);
15664     }
15665   return 0;
15666 }
15667
15668 static void
15669 purge_unchecked_exceptions (tree mdecl)
15670 {
15671   tree throws = DECL_FUNCTION_THROWS (mdecl);
15672   tree new = NULL_TREE;
15673
15674   while (throws)
15675     {
15676       tree next = TREE_CHAIN (throws);
15677       if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
15678         {
15679           TREE_CHAIN (throws) = new;
15680           new = throws;
15681         }
15682       throws = next;
15683     }
15684   /* List is inverted here, but it doesn't matter */
15685   DECL_FUNCTION_THROWS (mdecl) = new;
15686 }
15687
15688 /* This function goes over all of CLASS_TYPE ctors and checks whether
15689    each of them features at least one unchecked exception in its
15690    `throws' clause. If it's the case, it returns `true', `false'
15691    otherwise.  */
15692
15693 static bool
15694 ctors_unchecked_throws_clause_p (tree class_type)
15695 {
15696   tree current;
15697
15698   for (current = TYPE_METHODS (class_type); current;
15699        current = TREE_CHAIN (current))
15700     {
15701       bool ctu = false; /* Ctor Throws Unchecked */
15702       if (DECL_CONSTRUCTOR_P (current))
15703         {
15704           tree throws;
15705           for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
15706                throws = TREE_CHAIN (throws))
15707             if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
15708               ctu = true;
15709         }
15710       /* We return false as we found one ctor that is unfit. */
15711       if (!ctu && DECL_CONSTRUCTOR_P (current))
15712         return false;
15713     }
15714   /* All ctors feature at least one unchecked exception in their
15715      `throws' clause. */
15716   return true;
15717 }
15718
15719 /* 15.24 Conditional Operator ?: */
15720
15721 static tree
15722 patch_conditional_expr (tree node, tree wfl_cond, tree wfl_op1)
15723 {
15724   tree cond = TREE_OPERAND (node, 0);
15725   tree op1 = TREE_OPERAND (node, 1);
15726   tree op2 = TREE_OPERAND (node, 2);
15727   tree resulting_type = NULL_TREE;
15728   tree t1, t2, patched;
15729   int error_found = 0;
15730
15731   /* Operands of ?: might be StringBuffers crafted as a result of a
15732      string concatenation. Obtain a descent operand here.  */
15733   if ((patched = patch_string (op1)))
15734     TREE_OPERAND (node, 1) = op1 = patched;
15735   if ((patched = patch_string (op2)))
15736     TREE_OPERAND (node, 2) = op2 = patched;
15737
15738   t1 = TREE_TYPE (op1);
15739   t2 = TREE_TYPE (op2);
15740
15741   /* The first expression must be a boolean */
15742   if (TREE_TYPE (cond) != boolean_type_node)
15743     {
15744       SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
15745       parse_error_context (wfl_operator,
15746                "Incompatible type for `?:'. Can't convert `%s' to `boolean'",
15747                            lang_printable_name (TREE_TYPE (cond), 0));
15748       error_found = 1;
15749     }
15750
15751   /* Second and third can be numeric, boolean (i.e. primitive),
15752      references or null. Anything else results in an error */
15753   if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
15754         || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
15755             && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
15756         || (t1 == boolean_type_node && t2 == boolean_type_node)))
15757     error_found = 1;
15758
15759   /* Determine the type of the conditional expression. Same types are
15760      easy to deal with */
15761   else if (t1 == t2)
15762     resulting_type = t1;
15763
15764   /* There are different rules for numeric types */
15765   else if (JNUMERIC_TYPE_P (t1))
15766     {
15767       /* if byte/short found, the resulting type is short */
15768       if ((t1 == byte_type_node && t2 == short_type_node)
15769           || (t1 == short_type_node && t2 == byte_type_node))
15770         resulting_type = short_type_node;
15771
15772       /* If t1 is a constant int and t2 is of type byte, short or char
15773          and t1's value fits in t2, then the resulting type is t2 */
15774       else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
15775           && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
15776         resulting_type = t2;
15777
15778       /* If t2 is a constant int and t1 is of type byte, short or char
15779          and t2's value fits in t1, then the resulting type is t1 */
15780       else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
15781           && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
15782         resulting_type = t1;
15783
15784       /* Otherwise, binary numeric promotion is applied and the
15785          resulting type is the promoted type of operand 1 and 2 */
15786       else
15787         resulting_type = binary_numeric_promotion (t1, t2,
15788                                                    &TREE_OPERAND (node, 1),
15789                                                    &TREE_OPERAND (node, 2));
15790     }
15791
15792   /* Cases of a reference and a null type */
15793   else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
15794     resulting_type = t1;
15795
15796   else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
15797     resulting_type = t2;
15798
15799   /* Last case: different reference types. If a type can be converted
15800      into the other one by assignment conversion, the latter
15801      determines the type of the expression */
15802   else if ((resulting_type = try_reference_assignconv (t1, op2)))
15803     resulting_type = promote_type (t1);
15804
15805   else if ((resulting_type = try_reference_assignconv (t2, op1)))
15806     resulting_type = promote_type (t2);
15807
15808   /* If we don't have any resulting type, we're in trouble */
15809   if (!resulting_type)
15810     {
15811       char *t = xstrdup (lang_printable_name (t1, 0));
15812       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15813       parse_error_context (wfl_operator,
15814                  "Incompatible type for `?:'. Can't convert `%s' to `%s'",
15815                            t, lang_printable_name (t2, 0));
15816       free (t);
15817       error_found = 1;
15818     }
15819
15820   if (error_found)
15821     {
15822       TREE_TYPE (node) = error_mark_node;
15823       return error_mark_node;
15824     }
15825
15826   TREE_TYPE (node) = resulting_type;
15827   TREE_SET_CODE (node, COND_EXPR);
15828   CAN_COMPLETE_NORMALLY (node) = 1;
15829   return node;
15830 }
15831
15832 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
15833
15834 static tree
15835 maybe_build_class_init_for_field (tree decl, tree expr)
15836 {
15837   tree clas = DECL_CONTEXT (decl);
15838   if (flag_emit_class_files || flag_emit_xref)
15839     return expr;
15840
15841   if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
15842       && FIELD_FINAL (decl))
15843     {
15844       tree init = DECL_INITIAL (decl);
15845       if (init != NULL_TREE)
15846         init = fold_constant_for_init (init, decl);
15847       if (init != NULL_TREE && CONSTANT_VALUE_P (init))
15848         return expr;
15849     }
15850
15851   return build_class_init (clas, expr);
15852 }
15853
15854 /* Try to constant fold NODE.
15855    If NODE is not a constant expression, return NULL_EXPR.
15856    CONTEXT is a static final VAR_DECL whose initializer we are folding. */
15857
15858 static tree
15859 fold_constant_for_init (tree node, tree context)
15860 {
15861   tree op0, op1, val;
15862   enum tree_code code = TREE_CODE (node);
15863
15864   switch (code)
15865     {
15866     case INTEGER_CST:
15867       if (node == null_pointer_node)
15868         return NULL_TREE;
15869     case STRING_CST:
15870     case REAL_CST:
15871       return node;
15872
15873     case PLUS_EXPR:
15874     case MINUS_EXPR:
15875     case MULT_EXPR:
15876     case TRUNC_MOD_EXPR:
15877     case RDIV_EXPR:
15878     case LSHIFT_EXPR:
15879     case RSHIFT_EXPR:
15880     case URSHIFT_EXPR:
15881     case BIT_AND_EXPR:
15882     case BIT_XOR_EXPR:
15883     case BIT_IOR_EXPR:
15884     case TRUTH_ANDIF_EXPR:
15885     case TRUTH_ORIF_EXPR:
15886     case EQ_EXPR:
15887     case NE_EXPR:
15888     case GT_EXPR:
15889     case GE_EXPR:
15890     case LT_EXPR:
15891     case LE_EXPR:
15892       op0 = TREE_OPERAND (node, 0);
15893       op1 = TREE_OPERAND (node, 1);
15894       val = fold_constant_for_init (op0, context);
15895       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15896         return NULL_TREE;
15897       TREE_OPERAND (node, 0) = val;
15898       val = fold_constant_for_init (op1, context);
15899       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15900         return NULL_TREE;
15901       TREE_OPERAND (node, 1) = val;
15902       return patch_binop (node, op0, op1);
15903
15904     case UNARY_PLUS_EXPR:
15905     case NEGATE_EXPR:
15906     case TRUTH_NOT_EXPR:
15907     case BIT_NOT_EXPR:
15908     case CONVERT_EXPR:
15909       op0 = TREE_OPERAND (node, 0);
15910       val = fold_constant_for_init (op0, context);
15911       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15912         return NULL_TREE;
15913       TREE_OPERAND (node, 0) = val;
15914       val = patch_unaryop (node, op0);
15915       if (! TREE_CONSTANT (val))
15916         return NULL_TREE;
15917       return val;
15918
15919       break;
15920
15921     case COND_EXPR:
15922       val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
15923       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15924         return NULL_TREE;
15925       TREE_OPERAND (node, 0) = val;
15926       val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
15927       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15928         return NULL_TREE;
15929       TREE_OPERAND (node, 1) = val;
15930       val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
15931       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15932         return NULL_TREE;
15933       TREE_OPERAND (node, 2) = val;
15934       return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
15935         : TREE_OPERAND (node, 2);
15936
15937     case VAR_DECL:
15938     case FIELD_DECL:
15939       if (! FIELD_FINAL (node)
15940           || DECL_INITIAL (node) == NULL_TREE)
15941         return NULL_TREE;
15942       val = DECL_INITIAL (node);
15943       /* Guard against infinite recursion. */
15944       DECL_INITIAL (node) = NULL_TREE;
15945       val = fold_constant_for_init (val, node);
15946       if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
15947         val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
15948       DECL_INITIAL (node) = val;
15949       return val;
15950
15951     case EXPR_WITH_FILE_LOCATION:
15952       /* Compare java_complete_tree and resolve_expression_name. */
15953       if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
15954           || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
15955         {
15956           tree name = EXPR_WFL_NODE (node);
15957           tree decl;
15958           if (PRIMARY_P (node))
15959             return NULL_TREE;
15960           else if (! QUALIFIED_P (name))
15961             {
15962               decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
15963               if (decl == NULL_TREE
15964                   || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
15965                 return NULL_TREE;
15966               return fold_constant_for_init (decl, decl);
15967             }
15968           else
15969             {
15970               /* Install the proper context for the field resolution.
15971                  The prior context is restored once the name is
15972                  properly qualified. */
15973               tree saved_current_class = current_class;
15974               /* Wait until the USE_COMPONENT_REF re-write.  FIXME. */
15975               current_class = DECL_CONTEXT (context);
15976               qualify_ambiguous_name (node);
15977               current_class = saved_current_class;
15978               if (resolve_field_access (node, &decl, NULL)
15979                   && decl != NULL_TREE)
15980                 return fold_constant_for_init (decl, decl);
15981               return NULL_TREE;
15982             }
15983         }
15984       else
15985         {
15986           op0 = TREE_OPERAND (node, 0);
15987           val = fold_constant_for_init (op0, context);
15988           if (val == NULL_TREE || ! TREE_CONSTANT (val))
15989             return NULL_TREE;
15990           TREE_OPERAND (node, 0) = val;
15991           return val;
15992         }
15993
15994 #ifdef USE_COMPONENT_REF
15995     case IDENTIFIER:
15996     case COMPONENT_REF:
15997       ?;
15998 #endif
15999
16000     default:
16001       return NULL_TREE;
16002     }
16003 }
16004
16005 #ifdef USE_COMPONENT_REF
16006 /* Context is 'T' for TypeName, 'P' for PackageName,
16007    'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16008
16009 tree
16010 resolve_simple_name (tree name, int context)
16011 {
16012 }
16013
16014 tree
16015 resolve_qualified_name (tree name, int context)
16016 {
16017 }
16018 #endif
16019
16020 void
16021 init_src_parse (void)
16022 {
16023   /* Sanity check; we've been bit by this before.  */
16024   if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
16025     abort ();
16026 }
16027
16028 \f
16029
16030 /* This section deals with the functions that are called when tables
16031    recording class initialization information are traversed.  */
16032
16033 /* Attach to PTR (a block) the declaration found in ENTRY. */
16034
16035 static int
16036 attach_init_test_initialization_flags (void **entry, void *ptr)
16037 {
16038   tree block = (tree)ptr;
16039   struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
16040
16041   if (block != error_mark_node)
16042     {
16043       TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
16044       BLOCK_EXPR_DECLS (block) = ite->value;
16045     }
16046   return true;
16047 }
16048
16049 /* This function is called for each class that is known definitely
16050    initialized when a given static method was called. This function
16051    augments a compound expression (INFO) storing all assignment to
16052    initialized static class flags if a flag already existed, otherwise
16053    a new one is created.  */
16054
16055 static int
16056 emit_test_initialization (void **entry_p, void *info)
16057 {
16058   tree l = (tree) info;
16059   tree decl, init;
16060   tree key = (tree) *entry_p;
16061   tree *ite;
16062   htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
16063
16064   /* If we haven't found a flag and we're dealing with self registered
16065      with current_function_decl, then don't do anything. Self is
16066      always added as definitely initialized but this information is
16067      valid only if used outside the current function. */
16068   if (current_function_decl == TREE_PURPOSE (l)
16069       && java_treetreehash_find (cf_ht, key) == NULL)
16070     return true;
16071
16072   ite = java_treetreehash_new (cf_ht, key);
16073
16074   /* If we don't have a variable, create one and install it. */
16075   if (*ite == NULL)
16076     {
16077       tree block;
16078
16079       decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
16080       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
16081       LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
16082       DECL_CONTEXT (decl) = current_function_decl;
16083       DECL_INITIAL (decl) = boolean_true_node;
16084       /* Don't emit any symbolic debugging info for this decl.  */
16085       DECL_IGNORED_P (decl) = 1;
16086
16087       /* The trick is to find the right context for it. */
16088       block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
16089       TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
16090       BLOCK_EXPR_DECLS (block) = decl;
16091       *ite = decl;
16092     }
16093   else
16094     decl = *ite;
16095
16096   /* Now simply augment the compound that holds all the assignments
16097      pertaining to this method invocation. */
16098   init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
16099   TREE_SIDE_EFFECTS (init) = 1;
16100   TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
16101   TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
16102
16103   return true;
16104 }
16105
16106 #include "gt-java-parse.h"
16107 #include "gtype-java.h"