OSDN Git Service

* tree.h (TYPE_BINFO_OFFSET, TYPE_BINFO_VTABLE,
[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 (int, 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 ($1.location, $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 ($1.location, $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     {
2769       tree s;
2770       BUILD_FILENAME_IDENTIFIER_NODE (s, input_filename);
2771       EXPR_WFL_FILENAME_NODE (wfl_operator) = s;
2772     }
2773   current_function_decl = ctxp->function_decl;
2774   ctxp->saved_data = 0;
2775   if (ctxp->saved_data_ctx)
2776     java_pop_parser_context (0);
2777 }
2778
2779 /* Suspend vital data for the current class/function being parsed so
2780    that an other class can be parsed. Used to let local/anonymous
2781    classes be parsed.  */
2782
2783 static void
2784 java_parser_context_suspend (void)
2785 {
2786   /* This makes debugging through java_debug_context easier */
2787   static const char *const name = "<inner buffer context>";
2788
2789   /* Duplicate the previous context, use it to save the globals we're
2790      interested in */
2791   create_new_parser_context (1);
2792   ctxp->function_decl = current_function_decl;
2793   ctxp->class_type = current_class;
2794
2795   /* Then create a new context which inherits all data from the
2796      previous one. This will be the new current context  */
2797   create_new_parser_context (1);
2798
2799   /* Help debugging */
2800   ctxp->next->filename = name;
2801 }
2802
2803 /* Resume vital data for the current class/function being parsed so
2804    that an other class can be parsed. Used to let local/anonymous
2805    classes be parsed.  The trick is the data storing file position
2806    informations must be restored to their current value, so parsing
2807    can resume as if no context was ever saved. */
2808
2809 static void
2810 java_parser_context_resume (void)
2811 {
2812   struct parser_ctxt *old = ctxp;             /* This one is to be discarded */
2813   struct parser_ctxt *saver = old->next;      /* This one contain saved info */
2814   struct parser_ctxt *restored = saver->next; /* This one is the old current */
2815
2816   /* We need to inherit the list of classes to complete/generate */
2817   restored->classd_list = old->classd_list;
2818   restored->class_list = old->class_list;
2819
2820   /* Restore the current class and function from the saver */
2821   current_class = saver->class_type;
2822   current_function_decl = saver->function_decl;
2823
2824   /* Retrieve the restored context */
2825   ctxp = restored;
2826
2827   /* Re-installed the data for the parsing to carry on */
2828   memcpy (&ctxp->marker_begining, &old->marker_begining,
2829           (size_t)(&ctxp->marker_end - &ctxp->marker_begining));
2830 }
2831
2832 /* Add a new anchor node to which all statement(s) initializing static
2833    and non static initialized upon declaration field(s) will be
2834    linked.  */
2835
2836 static void
2837 java_parser_context_push_initialized_field (void)
2838 {
2839   tree node;
2840
2841   node = build_tree_list (NULL_TREE, NULL_TREE);
2842   TREE_CHAIN (node) = CPC_STATIC_INITIALIZER_LIST (ctxp);
2843   CPC_STATIC_INITIALIZER_LIST (ctxp) = node;
2844
2845   node = build_tree_list (NULL_TREE, NULL_TREE);
2846   TREE_CHAIN (node) = CPC_INITIALIZER_LIST (ctxp);
2847   CPC_INITIALIZER_LIST (ctxp) = node;
2848
2849   node = build_tree_list (NULL_TREE, NULL_TREE);
2850   TREE_CHAIN (node) = CPC_INSTANCE_INITIALIZER_LIST (ctxp);
2851   CPC_INSTANCE_INITIALIZER_LIST (ctxp) = node;
2852 }
2853
2854 /* Pop the lists of initialized field. If this lists aren't empty,
2855    remember them so we can use it to create and populate the finit$
2856    or <clinit> functions. */
2857
2858 static void
2859 java_parser_context_pop_initialized_field (void)
2860 {
2861   tree stmts;
2862   tree class_type = TREE_TYPE (GET_CPC ());
2863
2864   if (CPC_INITIALIZER_LIST (ctxp))
2865     {
2866       stmts = CPC_INITIALIZER_STMT (ctxp);
2867       CPC_INITIALIZER_LIST (ctxp) = TREE_CHAIN (CPC_INITIALIZER_LIST (ctxp));
2868       if (stmts && !java_error_count)
2869         TYPE_FINIT_STMT_LIST (class_type) = reorder_static_initialized (stmts);
2870     }
2871
2872   if (CPC_STATIC_INITIALIZER_LIST (ctxp))
2873     {
2874       stmts = CPC_STATIC_INITIALIZER_STMT (ctxp);
2875       CPC_STATIC_INITIALIZER_LIST (ctxp) =
2876         TREE_CHAIN (CPC_STATIC_INITIALIZER_LIST (ctxp));
2877       /* Keep initialization in order to enforce 8.5 */
2878       if (stmts && !java_error_count)
2879         TYPE_CLINIT_STMT_LIST (class_type) = nreverse (stmts);
2880     }
2881
2882   /* JDK 1.1 instance initializers */
2883   if (CPC_INSTANCE_INITIALIZER_LIST (ctxp))
2884     {
2885       stmts = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
2886       CPC_INSTANCE_INITIALIZER_LIST (ctxp) =
2887         TREE_CHAIN (CPC_INSTANCE_INITIALIZER_LIST (ctxp));
2888       if (stmts && !java_error_count)
2889         TYPE_II_STMT_LIST (class_type) = nreverse (stmts);
2890     }
2891 }
2892
2893 static tree
2894 reorder_static_initialized (tree list)
2895 {
2896   /* We have to keep things in order. The alias initializer have to
2897      come first, then the initialized regular field, in reverse to
2898      keep them in lexical order. */
2899   tree marker, previous = NULL_TREE;
2900   for (marker = list; marker; previous = marker, marker = TREE_CHAIN (marker))
2901     if (TREE_CODE (marker) == TREE_LIST
2902         && !TREE_VALUE (marker) && !TREE_PURPOSE (marker))
2903       break;
2904
2905   /* No static initialized, the list is fine as is */
2906   if (!previous)
2907     list = TREE_CHAIN (marker);
2908
2909   /* No marker? reverse the whole list */
2910   else if (!marker)
2911     list = nreverse (list);
2912
2913   /* Otherwise, reverse what's after the marker and the new reordered
2914      sublist will replace the marker. */
2915   else
2916     {
2917       TREE_CHAIN (previous) = NULL_TREE;
2918       list = nreverse (list);
2919       list = chainon (TREE_CHAIN (marker), list);
2920     }
2921   return list;
2922 }
2923
2924 /* Helper functions to dump the parser context stack.  */
2925
2926 #define TAB_CONTEXT(C) \
2927   {int i; for (i = 0; i < (C); i++) fputc (' ', stderr);}
2928
2929 static void
2930 java_debug_context_do (int tab)
2931 {
2932   struct parser_ctxt *copy = ctxp;
2933   while (copy)
2934     {
2935       TAB_CONTEXT (tab);
2936       fprintf (stderr, "ctxt: 0x%0lX\n", (unsigned long)copy);
2937       TAB_CONTEXT (tab);
2938       fprintf (stderr, "filename: %s\n", copy->filename);
2939       TAB_CONTEXT (tab);
2940       fprintf (stderr, "lineno: %d\n", copy->lineno);
2941       TAB_CONTEXT (tab);
2942       fprintf (stderr, "package: %s\n",
2943                (copy->package ?
2944                 IDENTIFIER_POINTER (copy->package) : "<none>"));
2945       TAB_CONTEXT (tab);
2946       fprintf (stderr, "context for saving: %d\n", copy->saved_data_ctx);
2947       TAB_CONTEXT (tab);
2948       fprintf (stderr, "saved data: %d\n", copy->saved_data);
2949       copy = copy->next;
2950       tab += 2;
2951     }
2952 }
2953
2954 /* Dump the stacked up parser contexts. Intended to be called from a
2955    debugger.  */
2956
2957 void
2958 java_debug_context (void)
2959 {
2960   java_debug_context_do (0);
2961 }
2962
2963 \f
2964
2965 /* Flag for the error report routine to issue the error the first time
2966    it's called (overriding the default behavior which is to drop the
2967    first invocation and honor the second one, taking advantage of a
2968    richer context.  */
2969 static int force_error = 0;
2970
2971 /* Reporting an constructor invocation error.  */
2972 static void
2973 parse_ctor_invocation_error (void)
2974 {
2975   if (DECL_CONSTRUCTOR_P (current_function_decl))
2976     yyerror ("Constructor invocation must be first thing in a constructor");
2977   else
2978     yyerror ("Only constructors can invoke constructors");
2979 }
2980
2981 /* Reporting JDK1.1 features not implemented.  */
2982
2983 static tree
2984 parse_jdk1_1_error (const char *msg)
2985 {
2986   sorry (": `%s' JDK1.1(TM) feature", msg);
2987   java_error_count++;
2988   return build_java_empty_stmt ();
2989 }
2990
2991 static int do_warning = 0;
2992
2993 void
2994 yyerror (const char *msg)
2995 {
2996   static java_lc elc;
2997   static int  prev_lineno;
2998   static const char *prev_msg;
2999
3000   int save_lineno;
3001   char *remainder, *code_from_source;
3002
3003   if (!force_error && prev_lineno == input_line)
3004     return;
3005
3006   /* Save current error location but report latter, when the context is
3007      richer.  */
3008   if (ctxp->java_error_flag == 0)
3009     {
3010       ctxp->java_error_flag = 1;
3011       elc = ctxp->elc;
3012       /* Do something to use the previous line if we're reaching the
3013          end of the file... */
3014 #ifdef VERBOSE_SKELETON
3015       printf ("* Error detected (%s)\n", (msg ? msg : "(null)"));
3016 #endif
3017       return;
3018     }
3019
3020   /* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
3021   if (!force_error && msg == prev_msg && prev_lineno == elc.line)
3022     return;
3023
3024   ctxp->java_error_flag = 0;
3025   if (do_warning)
3026     java_warning_count++;
3027   else
3028     java_error_count++;
3029
3030   if (elc.col == 0 && msg && msg[1] == ';')
3031     {
3032       elc.col  = ctxp->p_line->char_col-1;
3033       elc.line = ctxp->p_line->lineno;
3034     }
3035
3036   save_lineno = input_line;
3037   prev_lineno = input_line = elc.line;
3038   prev_msg = msg;
3039
3040   code_from_source = java_get_line_col (ctxp->filename, elc.line, elc.col);
3041   obstack_grow0 (&temporary_obstack,
3042                  code_from_source, strlen (code_from_source));
3043   remainder = obstack_finish (&temporary_obstack);
3044   if (do_warning)
3045     warning ("%s.\n%s", msg, remainder);
3046   else
3047     error ("%s.\n%s", msg, remainder);
3048
3049   /* This allow us to cheaply avoid an extra 'Invalid expression
3050      statement' error report when errors have been already reported on
3051      the same line. This occurs when we report an error but don't have
3052      a synchronization point other than ';', which
3053      expression_statement is the only one to take care of.  */
3054   ctxp->prevent_ese = input_line = save_lineno;
3055 }
3056
3057 static void
3058 issue_warning_error_from_context (tree cl, const char *msg, va_list ap)
3059 {
3060   const char *saved, *saved_input_filename;
3061   char buffer [4096];
3062   vsprintf (buffer, msg, ap);
3063   force_error = 1;
3064
3065   ctxp->elc.line = EXPR_WFL_LINENO (cl);
3066   ctxp->elc.col  = (EXPR_WFL_COLNO (cl) == 0xfff ? -1 :
3067                     (EXPR_WFL_COLNO (cl) == 0xffe ? -2 : EXPR_WFL_COLNO (cl)));
3068
3069   /* We have a CL, that's a good reason for using it if it contains data */
3070   saved = ctxp->filename;
3071   if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
3072     ctxp->filename = EXPR_WFL_FILENAME (cl);
3073   saved_input_filename = input_filename;
3074   input_filename = ctxp->filename;
3075   java_error (NULL);
3076   java_error (buffer);
3077   ctxp->filename = saved;
3078   input_filename = saved_input_filename;
3079   force_error = 0;
3080 }
3081
3082 /* Issue an error message at a current source line CL */
3083
3084 void
3085 parse_error_context (tree cl, const char *msg, ...)
3086 {
3087   va_list ap;
3088   va_start (ap, msg);
3089   issue_warning_error_from_context (cl, msg, ap);
3090   va_end (ap);
3091 }
3092
3093 /* Issue a warning at a current source line CL */
3094
3095 static void
3096 parse_warning_context (tree cl, const char *msg, ...)
3097 {
3098   va_list ap;
3099   va_start (ap, msg);
3100
3101   force_error = do_warning = 1;
3102   issue_warning_error_from_context (cl, msg, ap);
3103   do_warning = force_error = 0;
3104   va_end (ap);
3105 }
3106
3107 static tree
3108 find_expr_with_wfl (tree node)
3109 {
3110   while (node)
3111     {
3112       char code;
3113       tree to_return;
3114
3115       switch (TREE_CODE (node))
3116         {
3117         case BLOCK:
3118           node = BLOCK_EXPR_BODY (node);
3119           continue;
3120
3121         case COMPOUND_EXPR:
3122           to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
3123           if (to_return)
3124             return to_return;
3125           node = TREE_OPERAND (node, 1);
3126           continue;
3127
3128         case LOOP_EXPR:
3129           node = TREE_OPERAND (node, 0);
3130           continue;
3131
3132         case LABELED_BLOCK_EXPR:
3133           node = TREE_OPERAND (node, 1);
3134           continue;
3135
3136         default:
3137           code = TREE_CODE_CLASS (TREE_CODE (node));
3138           if (((code == '1') || (code == '2') || (code == 'e'))
3139               && EXPR_WFL_LINECOL (node))
3140             return node;
3141           return NULL_TREE;
3142         }
3143     }
3144   return NULL_TREE;
3145 }
3146
3147 /* Issue a missing return statement error. Uses METHOD to figure the
3148    last line of the method the error occurs in.  */
3149
3150 static void
3151 missing_return_error (tree method)
3152 {
3153   EXPR_WFL_SET_LINECOL (wfl_operator, DECL_FUNCTION_LAST_LINE (method), -2);
3154   parse_error_context (wfl_operator, "Missing return statement");
3155 }
3156
3157 /* Issue an unreachable statement error. From NODE, find the next
3158    statement to report appropriately.  */
3159 static void
3160 unreachable_stmt_error (tree node)
3161 {
3162   /* Browse node to find the next expression node that has a WFL. Use
3163      the location to report the error */
3164   if (TREE_CODE (node) == COMPOUND_EXPR)
3165     node = find_expr_with_wfl (TREE_OPERAND (node, 1));
3166   else
3167     node = find_expr_with_wfl (node);
3168
3169   if (node)
3170     {
3171       EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
3172       parse_error_context (wfl_operator, "Unreachable statement");
3173     }
3174   else
3175     abort ();
3176 }
3177
3178 static int
3179 not_accessible_field_error (tree wfl, tree decl)
3180 {
3181   parse_error_context 
3182     (wfl, "Can't access %s field `%s.%s' from `%s'",
3183      accessibility_string (get_access_flags_from_decl (decl)),
3184      GET_TYPE_NAME (DECL_CONTEXT (decl)),
3185      IDENTIFIER_POINTER (DECL_NAME (decl)),
3186      IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
3187   return 1;
3188 }
3189
3190 int
3191 java_report_errors (void)
3192 {
3193   if (java_error_count)
3194     fprintf (stderr, "%d error%s",
3195              java_error_count, (java_error_count == 1 ? "" : "s"));
3196   if (java_warning_count)
3197     fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
3198              java_warning_count, (java_warning_count == 1 ? "" : "s"));
3199   if (java_error_count || java_warning_count)
3200     putc ('\n', stderr);
3201   return java_error_count;
3202 }
3203
3204 static char *
3205 java_accstring_lookup (int flags)
3206 {
3207   static char buffer [80];
3208 #define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
3209
3210   /* Access modifier looked-up first for easier report on forbidden
3211      access. */
3212   if (flags & ACC_PUBLIC) COPY_RETURN ("public");
3213   if (flags & ACC_PRIVATE) COPY_RETURN ("private");
3214   if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
3215   if (flags & ACC_STATIC) COPY_RETURN ("static");
3216   if (flags & ACC_FINAL) COPY_RETURN ("final");
3217   if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
3218   if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
3219   if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
3220   if (flags & ACC_NATIVE) COPY_RETURN ("native");
3221   if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
3222   if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
3223
3224   buffer [0] = '\0';
3225   return buffer;
3226 #undef COPY_RETURN
3227 }
3228
3229 /* Returns a string denoting the accessibility of a class or a member as
3230    indicated by FLAGS.  We need a separate function from
3231    java_accstring_lookup, as the latter can return spurious "static", etc.
3232    if package-private access is defined (in which case none of the
3233    relevant access control bits in FLAGS is set).  */
3234
3235 static const char *
3236 accessibility_string (int flags)
3237 {
3238   if (flags & ACC_PRIVATE) return "private";
3239   if (flags & ACC_PROTECTED) return "protected";
3240   if (flags & ACC_PUBLIC) return "public";
3241
3242   return "package-private";
3243 }
3244
3245 /* Issuing error messages upon redefinition of classes, interfaces or
3246    variables. */
3247
3248 static void
3249 classitf_redefinition_error (const char *context, tree id, tree decl, tree cl)
3250 {
3251   parse_error_context (cl, "%s `%s' already defined in %s:%d",
3252                        context, IDENTIFIER_POINTER (id),
3253                        DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3254   /* Here we should point out where its redefined. It's a unicode. FIXME */
3255 }
3256
3257 static void
3258 variable_redefinition_error (tree context, tree name, tree type, int line)
3259 {
3260   const char *type_name;
3261
3262   /* Figure a proper name for type. We might haven't resolved it */
3263   if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
3264     type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
3265   else
3266     type_name = lang_printable_name (type, 0);
3267
3268   parse_error_context (context,
3269                        "Variable `%s' is already defined in this method and was declared `%s %s' at line %d",
3270                        IDENTIFIER_POINTER (name),
3271                        type_name, IDENTIFIER_POINTER (name), line);
3272 }
3273
3274 /* If ANAME is terminated with `[]', it indicates an array. This
3275    function returns the number of `[]' found and if this number is
3276    greater than zero, it extracts the array type name and places it in
3277    the node pointed to by TRIMMED unless TRIMMED is null.  */
3278
3279 static int
3280 build_type_name_from_array_name (tree aname, tree *trimmed)
3281 {
3282   const char *name = IDENTIFIER_POINTER (aname);
3283   int len = IDENTIFIER_LENGTH (aname);
3284   int array_dims;
3285
3286   STRING_STRIP_BRACKETS (name, len, array_dims);
3287
3288   if (array_dims && trimmed)
3289     *trimmed = get_identifier_with_length (name, len);
3290
3291   return array_dims;
3292 }
3293
3294 static tree
3295 build_array_from_name (tree type, tree type_wfl, tree name, tree *ret_name)
3296 {
3297   int more_dims = 0;
3298
3299   /* Eventually get more dims */
3300   more_dims = build_type_name_from_array_name (name, &name);
3301
3302   /* If we have, then craft a new type for this variable */
3303   if (more_dims)
3304     {
3305       tree save = type;
3306
3307       /* If we have a pointer, use its type */
3308       if (TREE_CODE (type) == POINTER_TYPE)
3309         type = TREE_TYPE (type);
3310
3311       /* Building the first dimension of a primitive type uses this
3312          function */
3313       if (JPRIMITIVE_TYPE_P (type))
3314         {
3315           type = build_java_array_type (type, -1);
3316           more_dims--;
3317         }
3318       /* Otherwise, if we have a WFL for this type, use it (the type
3319          is already an array on an unresolved type, and we just keep
3320          on adding dimensions) */
3321       else if (type_wfl)
3322         {
3323           type = type_wfl;
3324           more_dims += build_type_name_from_array_name (TYPE_NAME (save),
3325                                                         NULL);
3326         }
3327
3328       /* Add all the dimensions */
3329       while (more_dims--)
3330         type = build_unresolved_array_type (type);
3331
3332       /* The type may have been incomplete in the first place */
3333       if (type_wfl)
3334         type = obtain_incomplete_type (type);
3335     }
3336
3337   if (ret_name)
3338     *ret_name = name;
3339   return type;
3340 }
3341
3342 /* Build something that the type identifier resolver will identify as
3343    being an array to an unresolved type. TYPE_WFL is a WFL on a
3344    identifier. */
3345
3346 static tree
3347 build_unresolved_array_type (tree type_or_wfl)
3348 {
3349   const char *ptr;
3350   tree wfl;
3351
3352   /* TYPE_OR_WFL might be an array on a resolved type. In this case,
3353      just create a array type */
3354   if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
3355     return build_java_array_type (type_or_wfl, -1);
3356
3357   obstack_grow (&temporary_obstack,
3358                  IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
3359                  IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
3360   obstack_grow0 (&temporary_obstack, "[]", 2);
3361   ptr = obstack_finish (&temporary_obstack);
3362   wfl = build_expr_wfl (get_identifier (ptr),
3363                         EXPR_WFL_FILENAME (type_or_wfl),
3364                         EXPR_WFL_LINENO (type_or_wfl),
3365                         EXPR_WFL_COLNO (type_or_wfl));
3366   /* Re-install the existing qualifications so that the type can be
3367      resolved properly. */
3368   EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl);
3369   return wfl;
3370 }
3371
3372 static void
3373 parser_add_interface (tree class_decl, tree interface_decl, tree wfl)
3374 {
3375   if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
3376     parse_error_context (wfl, "Interface `%s' repeated",
3377                          IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
3378 }
3379
3380 /* Bulk of common class/interface checks. Return 1 if an error was
3381    encountered. TAG is 0 for a class, 1 for an interface.  */
3382
3383 static int
3384 check_class_interface_creation (int is_interface, int flags, tree raw_name,
3385                                 tree qualified_name, tree decl, tree cl)
3386 {
3387   tree node;
3388   int sca = 0;                  /* Static class allowed */
3389   int icaf = 0;                 /* Inner class allowed flags */
3390   int uaaf = CLASS_MODIFIERS;   /* Usually allowed access flags */
3391
3392   if (!quiet_flag)
3393     fprintf (stderr, " %s%s %s",
3394              (CPC_INNER_P () ? "inner" : ""),
3395              (is_interface ? "interface" : "class"),
3396              IDENTIFIER_POINTER (qualified_name));
3397
3398   /* Scope of an interface/class type name:
3399        - Can't be imported by a single type import
3400        - Can't already exists in the package */
3401   if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
3402       && (node = find_name_in_single_imports (raw_name))
3403       && !CPC_INNER_P ())
3404     {
3405       parse_error_context
3406         (cl, "%s name `%s' clashes with imported type `%s'",
3407          (is_interface ? "Interface" : "Class"),
3408          IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
3409       return 1;
3410     }
3411   if (decl && CLASS_COMPLETE_P (decl))
3412     {
3413       classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
3414                                    qualified_name, decl, cl);
3415       return 1;
3416     }
3417
3418   if (check_inner_class_redefinition (raw_name, cl))
3419     return 1;
3420
3421   /* If public, file name should match class/interface name, except
3422      when dealing with an inner class */
3423   if (!CPC_INNER_P () && (flags & ACC_PUBLIC ))
3424     {
3425       const char *f;
3426
3427       for (f = &input_filename [strlen (input_filename)];
3428            f != input_filename && ! IS_DIR_SEPARATOR (f[0]);
3429            f--)
3430         ;
3431       if (IS_DIR_SEPARATOR (f[0]))
3432         f++;
3433       if (strncmp (IDENTIFIER_POINTER (raw_name),
3434                    f , IDENTIFIER_LENGTH (raw_name)) ||
3435           f [IDENTIFIER_LENGTH (raw_name)] != '.')
3436         parse_error_context
3437           (cl, "Public %s `%s' must be defined in a file called `%s.java'",
3438                              (is_interface ? "interface" : "class"),
3439                              IDENTIFIER_POINTER (qualified_name),
3440                              IDENTIFIER_POINTER (raw_name));
3441     }
3442
3443   /* Static classes can be declared only in top level classes. Note:
3444      once static, a inner class is a top level class. */
3445   if (flags & ACC_STATIC)
3446     {
3447       /* Catch the specific error of declaring an class inner class
3448          with no toplevel enclosing class. Prevent check_modifiers from
3449          complaining a second time */
3450       if (CPC_INNER_P () && !TOPLEVEL_CLASS_DECL_P (GET_CPC()))
3451         {
3452           parse_error_context (cl, "Inner class `%s' can't be static. Static classes can only occur in interfaces and top-level classes",
3453                                IDENTIFIER_POINTER (qualified_name));
3454           sca = ACC_STATIC;
3455         }
3456       /* Else, in the context of a top-level class declaration, let
3457          `check_modifiers' do its job, otherwise, give it a go */
3458       else
3459         sca = (GET_CPC_LIST () ? ACC_STATIC : 0);
3460     }
3461
3462   /* Inner classes can be declared private or protected
3463      within their enclosing classes. */
3464   if (CPC_INNER_P ())
3465     {
3466       /* A class which is local to a block can't be public, private,
3467          protected or static. But it is created final, so allow this
3468          one. */
3469       if (current_function_decl)
3470         icaf = sca = uaaf = ACC_FINAL;
3471       else
3472         {
3473           check_modifiers_consistency (flags);
3474           icaf = ACC_PROTECTED;
3475           if (! CLASS_INTERFACE (GET_CPC ()))
3476             icaf |= ACC_PRIVATE;
3477         }
3478     }
3479
3480   if (is_interface)
3481     {
3482       if (CPC_INNER_P ())
3483         uaaf = INTERFACE_INNER_MODIFIERS;
3484       else
3485         uaaf = INTERFACE_MODIFIERS;
3486
3487       check_modifiers ("Illegal modifier `%s' for interface declaration",
3488                        flags, uaaf);
3489     }
3490   else
3491     check_modifiers ((current_function_decl ?
3492                       "Illegal modifier `%s' for local class declaration" :
3493                       "Illegal modifier `%s' for class declaration"),
3494                      flags, uaaf|sca|icaf);
3495   return 0;
3496 }
3497
3498 /* Construct a nested class name.  If the final component starts with
3499    a digit, return true.  Otherwise return false.  */
3500 static int
3501 make_nested_class_name (tree cpc_list)
3502 {
3503   tree name;
3504
3505   if (!cpc_list)
3506     return 0;
3507
3508   make_nested_class_name (TREE_CHAIN (cpc_list));
3509
3510   /* Pick the qualified name when dealing with the first upmost
3511      enclosing class */
3512   name = (TREE_CHAIN (cpc_list)
3513           ? TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list)));
3514   obstack_grow (&temporary_obstack,
3515                 IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name));
3516   obstack_1grow (&temporary_obstack, '$');
3517
3518   return ISDIGIT (IDENTIFIER_POINTER (name)[0]);
3519 }
3520
3521 /* Can't redefine a class already defined in an earlier scope. */
3522
3523 static int
3524 check_inner_class_redefinition (tree raw_name, tree cl)
3525 {
3526   tree scope_list;
3527
3528   for (scope_list = GET_CPC_LIST (); scope_list;
3529        scope_list = GET_NEXT_ENCLOSING_CPC (scope_list))
3530     if (raw_name == GET_CPC_UN_NODE (scope_list))
3531       {
3532         parse_error_context
3533           (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",
3534            IDENTIFIER_POINTER (raw_name));
3535         return 1;
3536       }
3537   return 0;
3538 }
3539
3540 /* Tries to find a decl for CLASS_TYPE within ENCLOSING. If we fail,
3541    we remember ENCLOSING and SUPER.  */
3542
3543 static tree
3544 resolve_inner_class (htab_t circularity_hash, tree cl, tree *enclosing,
3545                      tree *super, tree class_type)
3546 {
3547   tree local_enclosing = *enclosing;
3548   tree local_super = NULL_TREE;
3549
3550   while (local_enclosing)
3551     {
3552       tree intermediate, decl;
3553
3554       *htab_find_slot (circularity_hash, local_enclosing, INSERT) =
3555         local_enclosing;
3556
3557       if ((decl = find_as_inner_class (local_enclosing, class_type, cl)))
3558         return decl;
3559
3560       intermediate = local_enclosing;
3561       /* Explore enclosing contexts. */
3562       while (INNER_CLASS_DECL_P (intermediate))
3563         {
3564           intermediate = DECL_CONTEXT (intermediate);
3565           if ((decl = find_as_inner_class (intermediate, class_type, cl)))
3566             return decl;
3567         }
3568
3569       /* Now go to the upper classes, bail out if necessary.  We will
3570          analyze the returned SUPER and act accordingly (see
3571          do_resolve_class).  */
3572       if (JPRIMITIVE_TYPE_P (TREE_TYPE (local_enclosing))
3573           || TREE_TYPE (local_enclosing) == void_type_node)
3574         {
3575           parse_error_context (cl, "Qualifier must be a reference");
3576           local_enclosing = NULL_TREE;
3577           break;
3578         }
3579       local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing));
3580       if (!local_super || local_super == object_type_node)
3581         break;
3582
3583       if (TREE_CODE (local_super) == POINTER_TYPE)
3584         local_super = do_resolve_class (NULL, local_super, NULL, NULL);
3585       else
3586         local_super = TYPE_NAME (local_super);
3587
3588       /* We may not have checked for circular inheritance yet, so do so
3589          here to prevent an infinite loop. */
3590       if (htab_find (circularity_hash, local_super) != NULL)
3591         {
3592           if (!cl)
3593             cl = lookup_cl (local_enclosing);
3594
3595           parse_error_context
3596             (cl, "Cyclic inheritance involving %s",
3597              IDENTIFIER_POINTER (DECL_NAME (local_enclosing)));
3598           local_enclosing = NULL_TREE;
3599         }
3600       else
3601         local_enclosing = local_super;
3602     }
3603
3604   /* We failed. Return LOCAL_SUPER and LOCAL_ENCLOSING. */
3605   *super = local_super;
3606   *enclosing = local_enclosing;
3607
3608   return NULL_TREE;
3609 }
3610
3611 /* Within ENCLOSING, find a decl for NAME and return it. NAME can be
3612    qualified. */
3613
3614 static tree
3615 find_as_inner_class (tree enclosing, tree name, tree cl)
3616 {
3617   tree qual, to_return;
3618   if (!enclosing)
3619     return NULL_TREE;
3620
3621   name = TYPE_NAME (name);
3622
3623   /* First search: within the scope of `enclosing', search for name */
3624   if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3625     qual = EXPR_WFL_QUALIFICATION (cl);
3626   else if (cl)
3627     qual = build_tree_list (cl, NULL_TREE);
3628   else
3629     qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3630
3631   if ((to_return = find_as_inner_class_do (qual, enclosing)))
3632     return to_return;
3633
3634   /* We're dealing with a qualified name. Try to resolve thing until
3635      we get something that is an enclosing class. */
3636   if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
3637     {
3638       tree acc = NULL_TREE, decl = NULL_TREE, ptr;
3639
3640       for (qual = EXPR_WFL_QUALIFICATION (cl); qual && !decl;
3641            qual = TREE_CHAIN (qual))
3642         {
3643           acc = merge_qualified_name (acc,
3644                                       EXPR_WFL_NODE (TREE_PURPOSE (qual)));
3645           BUILD_PTR_FROM_NAME (ptr, acc);
3646           decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl);
3647         }
3648
3649       /* A NULL qual and a decl means that the search ended
3650          successfully?!? We have to do something then. FIXME */
3651
3652       if (decl)
3653         enclosing = decl;
3654       else
3655         qual = EXPR_WFL_QUALIFICATION (cl);
3656     }
3657   /* Otherwise, create a qual for the other part of the resolution. */
3658   else
3659     qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
3660
3661   return find_as_inner_class_do (qual, enclosing);
3662 }
3663
3664 /* We go inside the list of sub classes and try to find a way
3665    through. */
3666
3667 static tree
3668 find_as_inner_class_do (tree qual, tree enclosing)
3669 {
3670   if (!qual)
3671     return NULL_TREE;
3672
3673   for (; qual && enclosing; qual = TREE_CHAIN (qual))
3674     {
3675       tree name_to_match = EXPR_WFL_NODE (TREE_PURPOSE (qual));
3676       tree next_enclosing = NULL_TREE;
3677       tree inner_list;
3678
3679       for (inner_list = DECL_INNER_CLASS_LIST (enclosing);
3680            inner_list; inner_list = TREE_CHAIN (inner_list))
3681         {
3682           if (TREE_VALUE (inner_list) == name_to_match)
3683             {
3684               next_enclosing = TREE_PURPOSE (inner_list);
3685               break;
3686             }
3687         }
3688       enclosing = next_enclosing;
3689     }
3690
3691   return (!qual && enclosing ? enclosing : NULL_TREE);
3692 }
3693
3694 static void
3695 link_nested_class_to_enclosing (void)
3696 {
3697   if (GET_ENCLOSING_CPC ())
3698     {
3699       tree enclosing = GET_ENCLOSING_CPC_CONTEXT ();
3700       DECL_INNER_CLASS_LIST (enclosing) =
3701         tree_cons (GET_CPC (), GET_CPC_UN (),
3702                    DECL_INNER_CLASS_LIST (enclosing));
3703     }
3704 }
3705
3706 static tree
3707 maybe_make_nested_class_name (tree name)
3708 {
3709   tree id = NULL_TREE;
3710
3711   if (CPC_INNER_P ())
3712     {
3713       /* If we're in a function, we must append a number to create the
3714          nested class name.  However, we don't do this if the class we
3715          are constructing is anonymous, because in that case we'll
3716          already have a number as the class name.  */
3717       if (! make_nested_class_name (GET_CPC_LIST ())
3718           && current_function_decl != NULL_TREE
3719           && ! ISDIGIT (IDENTIFIER_POINTER (name)[0]))
3720         {
3721           char buf[10];
3722           sprintf (buf, "%d", anonymous_class_counter);
3723           ++anonymous_class_counter;
3724           obstack_grow (&temporary_obstack, buf, strlen (buf));
3725           obstack_1grow (&temporary_obstack, '$');
3726         }
3727       obstack_grow0 (&temporary_obstack,
3728                      IDENTIFIER_POINTER (name),
3729                      IDENTIFIER_LENGTH (name));
3730       id = get_identifier (obstack_finish (&temporary_obstack));
3731       if (ctxp->package)
3732         QUALIFIED_P (id) = 1;
3733     }
3734   return id;
3735 }
3736
3737 /* If DECL is NULL, create and push a new DECL, record the current
3738    line CL and do other maintenance things.  */
3739
3740 static tree
3741 maybe_create_class_interface_decl (tree decl, tree raw_name,
3742                                    tree qualified_name, tree cl)
3743 {
3744   if (!decl)
3745     decl = push_class (make_class (), qualified_name);
3746
3747   /* Take care of the file and line business */
3748   DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
3749   /* If we're emitting xrefs, store the line/col number information */
3750   if (flag_emit_xref)
3751     DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
3752   else
3753     DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
3754   CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
3755   CLASS_PARSED_P (TREE_TYPE (decl)) = 1;
3756   CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
3757     IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
3758
3759   PUSH_CPC (decl, raw_name);
3760   DECL_CONTEXT (decl) = GET_ENCLOSING_CPC_CONTEXT ();
3761
3762   /* Link the declaration to the already seen ones */
3763   TREE_CHAIN (decl) = ctxp->class_list;
3764   ctxp->class_list = decl;
3765
3766   /* Create a new nodes in the global lists */
3767   gclass_list = tree_cons (NULL_TREE, decl, gclass_list);
3768   all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
3769
3770   /* Install a new dependency list element */
3771   create_jdep_list (ctxp);
3772
3773   SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
3774                           IDENTIFIER_POINTER (qualified_name)));
3775   return decl;
3776 }
3777
3778 static void
3779 add_superinterfaces (tree decl, tree interface_list)
3780 {
3781   tree node;
3782   /* Superinterface(s): if present and defined, parser_check_super_interface ()
3783      takes care of ensuring that:
3784        - This is an accessible interface type,
3785        - Circularity detection.
3786    parser_add_interface is then called. If present but not defined,
3787    the check operation is delayed until the super interface gets
3788    defined.  */
3789   for (node = interface_list; node; node = TREE_CHAIN (node))
3790     {
3791       tree current = TREE_PURPOSE (node);
3792       tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
3793       if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
3794         {
3795           if (!parser_check_super_interface (idecl, decl, current))
3796             parser_add_interface (decl, idecl, current);
3797         }
3798       else
3799         register_incomplete_type (JDEP_INTERFACE,
3800                                   current, decl, NULL_TREE);
3801     }
3802 }
3803
3804 /* Create an interface in pass1 and return its decl. Return the
3805    interface's decl in pass 2.  */
3806
3807 static tree
3808 create_interface (int flags, tree id, tree super)
3809 {
3810   tree raw_name = EXPR_WFL_NODE (id);
3811   tree q_name = parser_qualified_classname (raw_name);
3812   tree decl = IDENTIFIER_CLASS_VALUE (q_name);
3813
3814   /* Certain syntax errors are making SUPER be like ID. Avoid this
3815      case. */
3816   if (ctxp->class_err && id == super)
3817     super = NULL;
3818
3819   EXPR_WFL_NODE (id) = q_name;  /* Keep source location, even if refined. */
3820
3821   /* Basic checks: scope, redefinition, modifiers */
3822   if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
3823     {
3824       PUSH_ERROR ();
3825       return NULL_TREE;
3826     }
3827
3828   /* Suspend the current parsing context if we're parsing an inner
3829      interface */
3830   if (CPC_INNER_P ())
3831     {
3832       java_parser_context_suspend ();
3833       /* Interface members are public. */
3834       if (CLASS_INTERFACE (GET_CPC ()))
3835         flags |= ACC_PUBLIC;
3836     }
3837
3838   /* Push a new context for (static) initialized upon declaration fields */
3839   java_parser_context_push_initialized_field ();
3840
3841   /* Interface modifiers check
3842        - public/abstract allowed (already done at that point)
3843        - abstract is obsolete (comes first, it's a warning, or should be)
3844        - Can't use twice the same (checked in the modifier rule) */
3845   if ((flags & ACC_ABSTRACT) && flag_redundant)
3846     parse_warning_context
3847       (MODIFIER_WFL (ABSTRACT_TK),
3848        "Redundant use of `abstract' modifier. Interface `%s' is implicitly abstract", IDENTIFIER_POINTER (raw_name));
3849
3850   /* Create a new decl if DECL is NULL, otherwise fix it */
3851   decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id);
3852
3853   /* Interfaces are always abstract. */
3854   flags |= ACC_ABSTRACT;
3855
3856   /* Inner interfaces are always static.  */
3857   if (INNER_CLASS_DECL_P (decl))
3858     flags |= ACC_STATIC;
3859
3860   /* Set super info and mark the class a complete */
3861   set_super_info (ACC_INTERFACE | flags, TREE_TYPE (decl),
3862                   object_type_node, ctxp->interface_number);
3863   ctxp->interface_number = 0;
3864   CLASS_COMPLETE_P (decl) = 1;
3865   add_superinterfaces (decl, super);
3866
3867   /* Eventually sets the @deprecated tag flag */
3868   CHECK_DEPRECATED (decl);
3869
3870   return decl;
3871 }
3872
3873 /* Patch anonymous class CLASS, by either extending or implementing
3874    DEP.  */
3875
3876 static void
3877 patch_anonymous_class (tree type_decl, tree class_decl, tree wfl)
3878 {
3879   tree class = TREE_TYPE (class_decl);
3880   tree type =  TREE_TYPE (type_decl);
3881   tree binfo = TYPE_BINFO (class);
3882
3883   /* If it's an interface, implement it */
3884   if (CLASS_INTERFACE (type_decl))
3885     {
3886       tree s_binfo;
3887       int length;
3888
3889       if (parser_check_super_interface (type_decl, class_decl, wfl))
3890         return;
3891
3892       s_binfo = TREE_VEC_ELT (BINFO_BASE_BINFOS (TYPE_BINFO (class)), 0);
3893       length = TREE_VEC_LENGTH (BINFO_BASE_BINFOS (TYPE_BINFO (class)))+1;
3894       BINFO_BASE_BINFOS (TYPE_BINFO (class)) = make_tree_vec (length);
3895       TREE_VEC_ELT (BINFO_BASE_BINFOS (TYPE_BINFO (class)), 0) = s_binfo;
3896       /* And add the interface */
3897       parser_add_interface (class_decl, type_decl, wfl);
3898     }
3899   /* Otherwise, it's a type we want to extend */
3900   else
3901     {
3902       if (parser_check_super (type_decl, class_decl, wfl))
3903         return;
3904       BINFO_TYPE (TREE_VEC_ELT (BINFO_BASE_BINFOS (binfo), 0)) = type;
3905     }
3906 }
3907
3908 static tree
3909 create_anonymous_class (int location, tree type_name)
3910 {
3911   char buffer [80];
3912   tree super = NULL_TREE, itf = NULL_TREE;
3913   tree id, type_decl, class;
3914
3915   /* The unqualified name of the anonymous class. It's just a number. */
3916   sprintf (buffer, "%d", anonymous_class_counter++);
3917   id = build_wfl_node (get_identifier (buffer));
3918   EXPR_WFL_LINECOL (id) = location;
3919
3920   /* We know about the type to extend/implement. We go ahead */
3921   if ((type_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (type_name))))
3922     {
3923       /* Create a class which either implements on extends the designated
3924          class. The class bears an inaccessible name. */
3925       if (CLASS_INTERFACE (type_decl))
3926         {
3927           /* It's OK to modify it here. It's been already used and
3928              shouldn't be reused */
3929           ctxp->interface_number = 1;
3930           /* Interfaces should presented as a list of WFLs */
3931           itf = build_tree_list (type_name, NULL_TREE);
3932         }
3933       else
3934         super = type_name;
3935     }
3936
3937   class = create_class (ACC_FINAL, id, super, itf);
3938
3939   /* We didn't know anything about the stuff. We register a dependence. */
3940   if (!type_decl)
3941     register_incomplete_type (JDEP_ANONYMOUS, type_name, class, NULL_TREE);
3942
3943   ANONYMOUS_CLASS_P (TREE_TYPE (class)) = 1;
3944   return class;
3945 }
3946
3947 /* Create a class in pass1 and return its decl. Return class
3948    interface's decl in pass 2.  */
3949
3950 static tree
3951 create_class (int flags, tree id, tree super, tree interfaces)
3952 {
3953   tree raw_name = EXPR_WFL_NODE (id);
3954   tree class_id, decl;
3955   tree super_decl_type;
3956
3957   /* Certain syntax errors are making SUPER be like ID. Avoid this
3958      case. */
3959   if (ctxp->class_err && id == super)
3960     super = NULL;
3961
3962   class_id = parser_qualified_classname (raw_name);
3963   decl = IDENTIFIER_CLASS_VALUE (class_id);
3964   EXPR_WFL_NODE (id) = class_id;
3965
3966   /* Basic check: scope, redefinition, modifiers */
3967   if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
3968     {
3969       PUSH_ERROR ();
3970       return NULL_TREE;
3971     }
3972
3973   /* Suspend the current parsing context if we're parsing an inner
3974      class or an anonymous class. */
3975   if (CPC_INNER_P ())
3976     {
3977       java_parser_context_suspend ();
3978       /* Interface members are public. */
3979       if (CLASS_INTERFACE (GET_CPC ()))
3980         flags |= ACC_PUBLIC;
3981     }
3982
3983   /* Push a new context for (static) initialized upon declaration fields */
3984   java_parser_context_push_initialized_field ();
3985
3986   /* Class modifier check:
3987        - Allowed modifier (already done at that point)
3988        - abstract AND final forbidden
3989        - Public classes defined in the correct file */
3990   if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
3991     parse_error_context
3992       (id, "Class `%s' can't be declared both abstract and final",
3993        IDENTIFIER_POINTER (raw_name));
3994
3995   /* Create a new decl if DECL is NULL, otherwise fix it */
3996   decl = maybe_create_class_interface_decl (decl, raw_name, class_id, id);
3997
3998   /* If SUPER exists, use it, otherwise use Object */
3999   if (super)
4000     {
4001       /* java.lang.Object can't extend anything.  */
4002       if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
4003         {
4004           parse_error_context (id, "`java.lang.Object' can't extend anything");
4005           return NULL_TREE;
4006         }
4007
4008       super_decl_type =
4009         register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
4010     }
4011   else if (TREE_TYPE (decl) != object_type_node)
4012     super_decl_type = object_type_node;
4013   /* We're defining java.lang.Object */
4014   else
4015     super_decl_type = NULL_TREE;
4016
4017   /* A class nested in an interface is implicitly static. */
4018   if (INNER_CLASS_DECL_P (decl)
4019       && CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (DECL_CONTEXT (decl)))))
4020     {
4021       flags |= ACC_STATIC;
4022     }
4023
4024   /* Set super info and mark the class as complete. */
4025   set_super_info (flags, TREE_TYPE (decl), super_decl_type,
4026                   ctxp->interface_number);
4027   ctxp->interface_number = 0;
4028   CLASS_COMPLETE_P (decl) = 1;
4029   add_superinterfaces (decl, interfaces);
4030
4031   /* TYPE_VFIELD' is a compiler-generated field used to point to
4032      virtual function tables.  In gcj, every class has a common base
4033      virtual function table in java.lang.object.  */
4034   TYPE_VFIELD (TREE_TYPE (decl)) = TYPE_VFIELD (object_type_node);
4035
4036   /* Add the private this$<n> field, Replicate final locals still in
4037      scope as private final fields mangled like val$<local_name>.
4038      This doesn't not occur for top level (static) inner classes. */
4039   if (PURE_INNER_CLASS_DECL_P (decl))
4040     add_inner_class_fields (decl, current_function_decl);
4041
4042   /* If doing xref, store the location at which the inherited class
4043      (if any) was seen. */
4044   if (flag_emit_xref && super)
4045     DECL_INHERITED_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (super);
4046
4047   /* Eventually sets the @deprecated tag flag */
4048   CHECK_DEPRECATED (decl);
4049
4050   /* Reset the anonymous class counter when declaring non inner classes */
4051   if (!INNER_CLASS_DECL_P (decl))
4052     anonymous_class_counter = 1;
4053
4054   return decl;
4055 }
4056
4057 /* End a class declaration: register the statements used to create
4058    finit$ and <clinit>, pop the current class and resume the prior
4059    parser context if necessary.  */
4060
4061 static void
4062 end_class_declaration (int resume)
4063 {
4064   /* If an error occurred, context weren't pushed and won't need to be
4065      popped by a resume. */
4066   int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node;
4067
4068   if (GET_CPC () != error_mark_node)
4069     dump_java_tree (TDI_class, GET_CPC ());
4070
4071   java_parser_context_pop_initialized_field ();
4072   POP_CPC ();
4073   if (resume && no_error_occurred)
4074     java_parser_context_resume ();
4075
4076   /* We're ending a class declaration, this is a good time to reset
4077      the interface cout. Note that might have been already done in
4078      create_interface, but if at that time an inner class was being
4079      dealt with, the interface count was reset in a context created
4080      for the sake of handling inner classes declaration. */
4081   ctxp->interface_number = 0;
4082 }
4083
4084 static void
4085 add_inner_class_fields (tree class_decl, tree fct_decl)
4086 {
4087   tree block, marker, f;
4088
4089   f = add_field (TREE_TYPE (class_decl),
4090                  build_current_thisn (TREE_TYPE (class_decl)),
4091                  build_pointer_type (TREE_TYPE (DECL_CONTEXT (class_decl))),
4092                  ACC_PRIVATE);
4093   FIELD_THISN (f) = 1;
4094
4095   if (!fct_decl)
4096     return;
4097
4098   for (block = GET_CURRENT_BLOCK (fct_decl);
4099        block && TREE_CODE (block) == BLOCK; block = BLOCK_SUPERCONTEXT (block))
4100     {
4101       tree decl;
4102       for (decl = BLOCK_EXPR_DECLS (block); decl; decl = TREE_CHAIN (decl))
4103         {
4104           tree name, pname;
4105           tree wfl, init, list;
4106
4107           /* Avoid non final arguments. */
4108           if (!LOCAL_FINAL_P (decl))
4109             continue;
4110
4111           MANGLE_OUTER_LOCAL_VARIABLE_NAME (name, DECL_NAME (decl));
4112           MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID (pname, DECL_NAME (decl));
4113           wfl = build_wfl_node (name);
4114           init = build_wfl_node (pname);
4115           /* Build an initialization for the field: it will be
4116              initialized by a parameter added to finit$, bearing a
4117              mangled name of the field itself (param$<n>.) The
4118              parameter is provided to finit$ by the constructor
4119              invoking it (hence the constructor will also feature a
4120              hidden parameter, set to the value of the outer context
4121              local at the time the inner class is created.)
4122
4123              Note: we take into account all possible locals that can
4124              be accessed by the inner class. It's actually not trivial
4125              to minimize these aliases down to the ones really
4126              used. One way to do that would be to expand all regular
4127              methods first, then finit$ to get a picture of what's
4128              used.  It works with the exception that we would have to
4129              go back on all constructor invoked in regular methods to
4130              have their invocation reworked (to include the right amount
4131              of alias initializer parameters.)
4132
4133              The only real way around, I think, is a first pass to
4134              identify locals really used in the inner class. We leave
4135              the flag FIELD_LOCAL_ALIAS_USED around for that future
4136              use.
4137
4138              On the other hand, it only affect local inner classes,
4139              whose constructors (and finit$ call) will be featuring
4140              unnecessary arguments. It's easy for a developer to keep
4141              this number of parameter down by using the `final'
4142              keyword only when necessary. For the time being, we can
4143              issue a warning on unnecessary finals. FIXME */
4144           init = build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (wfl),
4145                                    wfl, init);
4146
4147           /* Register the field. The TREE_LIST holding the part
4148              initialized/initializer will be marked ARG_FINAL_P so
4149              that the created field can be marked
4150              FIELD_LOCAL_ALIAS. */
4151           list = build_tree_list (wfl, init);
4152           ARG_FINAL_P (list) = 1;
4153           register_fields (ACC_PRIVATE | ACC_FINAL, TREE_TYPE (decl), list);
4154         }
4155     }
4156
4157   if (!CPC_INITIALIZER_STMT (ctxp))
4158     return;
4159
4160   /* If we ever registered an alias field, insert and marker to
4161      remember where the list ends. The second part of the list (the one
4162      featuring initialized fields) so it can be later reversed to
4163      enforce 8.5. The marker will be removed during that operation. */
4164   marker = build_tree_list (NULL_TREE, NULL_TREE);
4165   TREE_CHAIN (marker) = CPC_INITIALIZER_STMT (ctxp);
4166   SET_CPC_INITIALIZER_STMT (ctxp, marker);
4167 }
4168
4169 /* Can't use lookup_field () since we don't want to load the class and
4170    can't set the CLASS_LOADED_P flag */
4171
4172 static tree
4173 find_field (tree class, tree name)
4174 {
4175   tree decl;
4176   for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
4177     {
4178       if (DECL_NAME (decl) == name)
4179         return decl;
4180     }
4181   return NULL_TREE;
4182 }
4183
4184 /* Wrap around lookup_field that doesn't potentially upset the value
4185    of CLASS */
4186
4187 static tree
4188 lookup_field_wrapper (tree class, tree name)
4189 {
4190   tree type = class;
4191   tree decl = NULL_TREE;
4192   java_parser_context_save_global ();
4193
4194   /* Last chance: if we're within the context of an inner class, we
4195      might be trying to access a local variable defined in an outer
4196      context. We try to look for it now. */
4197   if (INNER_CLASS_TYPE_P (class) && TREE_CODE (name) == IDENTIFIER_NODE)
4198     {
4199       tree new_name;
4200       MANGLE_OUTER_LOCAL_VARIABLE_NAME (new_name, name);
4201       decl = lookup_field (&type, new_name);
4202       if (decl && decl != error_mark_node)
4203         FIELD_LOCAL_ALIAS_USED (decl) = 1;
4204     }
4205   if (!decl || decl == error_mark_node)
4206     {
4207       type = class;
4208       decl = lookup_field (&type, name);
4209     }
4210
4211   /* If the field still hasn't been found, try the next enclosing context. */
4212   if (!decl && INNER_CLASS_TYPE_P (class))
4213     {
4214       tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class)));
4215       decl = lookup_field_wrapper (outer_type, name);
4216     }
4217
4218   java_parser_context_restore_global ();
4219   return decl == error_mark_node ? NULL : decl;
4220 }
4221
4222 /* Find duplicate field within the same class declarations and report
4223    the error. Returns 1 if a duplicated field was found, 0
4224    otherwise.  */
4225
4226 static int
4227 duplicate_declaration_error_p (tree new_field_name, tree new_type, tree cl)
4228 {
4229   /* This might be modified to work with method decl as well */
4230   tree decl = find_field (TREE_TYPE (GET_CPC ()), new_field_name);
4231   if (decl)
4232     {
4233       char *t1 = xstrdup (purify_type_name
4234                          ((TREE_CODE (new_type) == POINTER_TYPE
4235                            && TREE_TYPE (new_type) == NULL_TREE) ?
4236                           IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
4237                           lang_printable_name (new_type, 1)));
4238       /* The type may not have been completed by the time we report
4239          the error */
4240       char *t2 = xstrdup (purify_type_name
4241                          ((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
4242                            && TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
4243                           IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
4244                           lang_printable_name (TREE_TYPE (decl), 1)));
4245       parse_error_context
4246         (cl , "Duplicate variable declaration: `%s %s' was `%s %s' (%s:%d)",
4247          t1, IDENTIFIER_POINTER (new_field_name),
4248          t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
4249          DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4250       free (t1);
4251       free (t2);
4252       return 1;
4253     }
4254   return 0;
4255 }
4256
4257 /* Field registration routine. If TYPE doesn't exist, field
4258    declarations are linked to the undefined TYPE dependency list, to
4259    be later resolved in java_complete_class () */
4260
4261 static void
4262 register_fields (int flags, tree type, tree variable_list)
4263 {
4264   tree current, saved_type;
4265   tree class_type = NULL_TREE;
4266   int saved_lineno = input_line;
4267   int must_chain = 0;
4268   tree wfl = NULL_TREE;
4269
4270   if (GET_CPC ())
4271     class_type = TREE_TYPE (GET_CPC ());
4272
4273   if (!class_type || class_type == error_mark_node)
4274     return;
4275
4276   /* If we're adding fields to interfaces, those fields are public,
4277      static, final */
4278   if (CLASS_INTERFACE (TYPE_NAME (class_type)))
4279     {
4280       OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
4281                                  flags, ACC_PUBLIC, "interface field(s)");
4282       OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
4283                                  flags, ACC_STATIC, "interface field(s)");
4284       OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
4285                                  flags, ACC_FINAL, "interface field(s)");
4286       check_modifiers ("Illegal interface member modifier `%s'", flags,
4287                        INTERFACE_FIELD_MODIFIERS);
4288       flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
4289     }
4290
4291   /* Obtain a suitable type for resolution, if necessary */
4292   SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
4293
4294   /* If TYPE is fully resolved and we don't have a reference, make one */
4295   PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4296
4297   for (current = variable_list, saved_type = type; current;
4298        current = TREE_CHAIN (current), type = saved_type)
4299     {
4300       tree real_type;
4301       tree field_decl;
4302       tree cl = TREE_PURPOSE (current);
4303       tree init = TREE_VALUE (current);
4304       tree current_name = EXPR_WFL_NODE (cl);
4305
4306       /* Can't declare non-final static fields in inner classes */
4307       if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (class_type)
4308           && !(flags & ACC_FINAL))
4309         parse_error_context
4310           (cl, "Field `%s' can't be static in inner class `%s' unless it is final",
4311            IDENTIFIER_POINTER (EXPR_WFL_NODE (cl)),
4312            lang_printable_name (class_type, 0));
4313
4314       /* Process NAME, as it may specify extra dimension(s) for it */
4315       type = build_array_from_name (type, wfl, current_name, &current_name);
4316
4317       /* Type adjustment. We may have just readjusted TYPE because
4318          the variable specified more dimensions. Make sure we have
4319          a reference if we can and don't have one already. Also
4320          change the name if we have an init. */
4321       if (type != saved_type)
4322         {
4323           PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4324           if (init)
4325             EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
4326         }
4327
4328       real_type = GET_REAL_TYPE (type);
4329       /* Check for redeclarations */
4330       if (duplicate_declaration_error_p (current_name, real_type, cl))
4331         continue;
4332
4333       /* Set input_line to the line the field was found and create a
4334          declaration for it. Eventually sets the @deprecated tag flag. */
4335       if (flag_emit_xref)
4336         input_line = EXPR_WFL_LINECOL (cl);
4337       else
4338         input_line = EXPR_WFL_LINENO (cl);
4339       field_decl = add_field (class_type, current_name, real_type, flags);
4340       CHECK_DEPRECATED_NO_RESET (field_decl);
4341
4342       /* If the field denotes a final instance variable, then we
4343          allocate a LANG_DECL_SPECIFIC part to keep track of its
4344          initialization. We also mark whether the field was
4345          initialized upon its declaration. We don't do that if the
4346          created field is an alias to a final local. */
4347       if (!ARG_FINAL_P (current) && (flags & ACC_FINAL))
4348         {
4349           MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl);
4350           DECL_FIELD_FINAL_WFL (field_decl) = cl;
4351         }
4352
4353       /* If the couple initializer/initialized is marked ARG_FINAL_P,
4354          we mark the created field FIELD_LOCAL_ALIAS, so that we can
4355          hide parameters to this inner class finit$ and
4356          constructors. It also means that the field isn't final per
4357          say. */
4358       if (ARG_FINAL_P (current))
4359         {
4360           FIELD_LOCAL_ALIAS (field_decl) = 1;
4361           FIELD_FINAL (field_decl) = 0;
4362         }
4363
4364       /* Check if we must chain. */
4365       if (must_chain)
4366         register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
4367
4368       /* If we have an initialization value tied to the field */
4369       if (init)
4370         {
4371           /* The field is declared static */
4372           if (flags & ACC_STATIC)
4373             {
4374               /* We include the field and its initialization part into
4375                  a list used to generate <clinit>. After <clinit> is
4376                  walked, field initializations will be processed and
4377                  fields initialized with known constants will be taken
4378                  out of <clinit> and have their DECL_INITIAL set
4379                  appropriately. */
4380               TREE_CHAIN (init) = CPC_STATIC_INITIALIZER_STMT (ctxp);
4381               SET_CPC_STATIC_INITIALIZER_STMT (ctxp, init);
4382               if (TREE_OPERAND (init, 1)
4383                   && TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
4384                 TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
4385             }
4386           /* A non-static field declared with an immediate initialization is
4387              to be initialized in <init>, if any.  This field is remembered
4388              to be processed at the time of the generation of <init>. */
4389           else
4390             {
4391               TREE_CHAIN (init) = CPC_INITIALIZER_STMT (ctxp);
4392               SET_CPC_INITIALIZER_STMT (ctxp, init);
4393             }
4394           MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
4395           DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
4396         }
4397     }
4398
4399   CLEAR_DEPRECATED;
4400   input_line = saved_lineno;
4401 }
4402
4403 /* Generate finit$, using the list of initialized fields to populate
4404    its body. finit$'s parameter(s) list is adjusted to include the
4405    one(s) used to initialized the field(s) caching outer context
4406    local(s).  */
4407
4408 static tree
4409 generate_finit (tree class_type)
4410 {
4411   int count = 0;
4412   tree list = TYPE_FINIT_STMT_LIST (class_type);
4413   tree mdecl, current, parms;
4414
4415   parms = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
4416                                                   class_type, NULL_TREE,
4417                                                   &count);
4418   CRAFTED_PARAM_LIST_FIXUP (parms);
4419   mdecl = create_artificial_method (class_type, ACC_PRIVATE, void_type_node,
4420                                     finit_identifier_node, parms);
4421   fix_method_argument_names (parms, mdecl);
4422   layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4423                        mdecl, NULL_TREE);
4424   DECL_FUNCTION_NAP (mdecl) = count;
4425   start_artificial_method_body (mdecl);
4426
4427   for (current = list; current; current = TREE_CHAIN (current))
4428     java_method_add_stmt (mdecl,
4429                           build_debugable_stmt (EXPR_WFL_LINECOL (current),
4430                                                 current));
4431   end_artificial_method_body (mdecl);
4432   return mdecl;
4433 }
4434
4435 /* Generate a function to run the instance initialization code. The
4436    private method is called `instinit$'. Unless we're dealing with an
4437    anonymous class, we determine whether all ctors of CLASS_TYPE
4438    declare a checked exception in their `throws' clause in order to
4439    see whether it's necessary to encapsulate the instance initializer
4440    statements in a try/catch/rethrow sequence.  */
4441
4442 static tree
4443 generate_instinit (tree class_type)
4444 {
4445   tree current;
4446   tree compound = NULL_TREE;
4447   tree parms = tree_cons (this_identifier_node,
4448                           build_pointer_type (class_type), end_params_node);
4449   tree mdecl = create_artificial_method (class_type, ACC_PRIVATE,
4450                                          void_type_node,
4451                                          instinit_identifier_node, parms);
4452
4453   layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
4454                        mdecl, NULL_TREE);
4455
4456   /* Gather all the statements in a compound */
4457   for (current = TYPE_II_STMT_LIST (class_type);
4458        current; current = TREE_CHAIN (current))
4459     compound = add_stmt_to_compound (compound, NULL_TREE, current);
4460
4461   /* We need to encapsulate COMPOUND by a try/catch statement to
4462      rethrow exceptions that might occur in the instance initializer.
4463      We do that only if all ctors of CLASS_TYPE are set to catch a
4464      checked exception. This doesn't apply to anonymous classes (since
4465      they don't have declared ctors.) */
4466   if (!ANONYMOUS_CLASS_P (class_type) &&
4467       ctors_unchecked_throws_clause_p (class_type))
4468     {
4469       compound = encapsulate_with_try_catch (0, exception_type_node, compound,
4470                                              build1 (THROW_EXPR, NULL_TREE,
4471                                                      build_wfl_node (wpv_id)));
4472       DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE,
4473                                                       exception_type_node);
4474     }
4475
4476   start_artificial_method_body (mdecl);
4477   java_method_add_stmt (mdecl, compound);
4478   end_artificial_method_body (mdecl);
4479
4480   return mdecl;
4481 }
4482
4483 /* FIXME */
4484 static tree
4485 build_instinit_invocation (tree class_type)
4486 {
4487   tree to_return = NULL_TREE;
4488
4489   if (TYPE_II_STMT_LIST (class_type))
4490     {
4491       tree parm = build_tree_list (NULL_TREE,
4492                                    build_wfl_node (this_identifier_node));
4493       to_return =
4494         build_method_invocation (build_wfl_node (instinit_identifier_node),
4495                                  parm);
4496     }
4497   return to_return;
4498 }
4499
4500 /* Shared across method_declarator and method_header to remember the
4501    patch stage that was reached during the declaration of the method.
4502    A method DECL is built differently is there is no patch
4503    (JDEP_NO_PATCH) or a patch (JDEP_METHOD or JDEP_METHOD_RETURN)
4504    pending on the currently defined method.  */
4505
4506 static int patch_stage;
4507
4508 /* Check the method declaration and add the method to its current
4509    class.  If the argument list is known to contain incomplete types,
4510    the method is partially added and the registration will be resume
4511    once the method arguments resolved. If TYPE is NULL, we're dealing
4512    with a constructor.  */
4513
4514 static tree
4515 method_header (int flags, tree type, tree mdecl, tree throws)
4516 {
4517   tree type_wfl = NULL_TREE;
4518   tree meth_name = NULL_TREE;
4519   tree current, orig_arg, this_class = NULL;
4520   tree id, meth;
4521   int saved_lineno;
4522   int constructor_ok = 0, must_chain;
4523   int count;
4524
4525   if (mdecl == error_mark_node)
4526     return error_mark_node;
4527   meth = TREE_VALUE (mdecl);
4528   id = TREE_PURPOSE (mdecl);
4529
4530   check_modifiers_consistency (flags);
4531
4532   if (GET_CPC ())
4533     this_class = TREE_TYPE (GET_CPC ());
4534
4535   if (!this_class || this_class == error_mark_node)
4536     return NULL_TREE;
4537
4538   /* There are some forbidden modifiers for an abstract method and its
4539      class must be abstract as well.  */
4540   if (type && (flags & ACC_ABSTRACT))
4541     {
4542       ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
4543       ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
4544       ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
4545       ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
4546       ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized");
4547       ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp");
4548       if (!CLASS_ABSTRACT (TYPE_NAME (this_class))
4549           && !CLASS_INTERFACE (TYPE_NAME (this_class)))
4550         parse_error_context
4551           (id, "Class `%s' must be declared abstract to define abstract method `%s'",
4552            IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())),
4553            IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4554     }
4555
4556   /* A native method can't be strictfp.  */
4557   if ((flags & ACC_NATIVE) && (flags & ACC_STRICT))
4558     parse_error_context (id, "native method `%s' can't be strictfp",
4559                          IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4560   /* No such thing as a transient or volatile method.  */
4561   if ((flags & ACC_TRANSIENT))
4562     parse_error_context (id, "method `%s' can't be transient",
4563                          IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4564   if ((flags & ACC_VOLATILE))
4565     parse_error_context (id, "method `%s' can't be volatile",
4566                          IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4567
4568   /* Things to be checked when declaring a constructor */
4569   if (!type)
4570     {
4571       int ec = java_error_count;
4572       /* 8.6: Constructor declarations: we might be trying to define a
4573          method without specifying a return type. */
4574       if (EXPR_WFL_NODE (id) != GET_CPC_UN ())
4575         parse_error_context
4576           (id, "Invalid method declaration, return type required");
4577       /* 8.6.3: Constructor modifiers */
4578       else
4579         {
4580           JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
4581           JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
4582           JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
4583           JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
4584           JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
4585           JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp");
4586         }
4587       /* If we found error here, we don't consider it's OK to tread
4588          the method definition as a constructor, for the rest of this
4589          function */
4590       if (ec == java_error_count)
4591         constructor_ok = 1;
4592     }
4593
4594   /* Method declared within the scope of an interface are implicitly
4595      abstract and public. Conflicts with other erroneously provided
4596      modifiers are checked right after. */
4597
4598   if (CLASS_INTERFACE (TYPE_NAME (this_class)))
4599     {
4600       /* If FLAGS isn't set because of a modifier, turn the
4601          corresponding modifier WFL to NULL so we issue a warning on
4602          the obsolete use of the modifier */
4603       if (!(flags & ACC_PUBLIC))
4604         MODIFIER_WFL (PUBLIC_TK) = NULL;
4605       if (!(flags & ACC_ABSTRACT))
4606         MODIFIER_WFL (ABSTRACT_TK) = NULL;
4607       flags |= ACC_PUBLIC;
4608       flags |= ACC_ABSTRACT;
4609     }
4610
4611   /* Inner class can't declare static methods */
4612   if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (this_class))
4613     {
4614       parse_error_context
4615         (id, "Method `%s' can't be static in inner class `%s'. Only members of interfaces and top-level classes can be static",
4616          IDENTIFIER_POINTER (EXPR_WFL_NODE (id)),
4617          lang_printable_name (this_class, 0));
4618     }
4619
4620   /* Modifiers context reset moved up, so abstract method declaration
4621      modifiers can be later checked.  */
4622
4623   /* Set constructor returned type to void and method name to <init>,
4624      unless we found an error identifier the constructor (in which
4625      case we retain the original name) */
4626   if (!type)
4627     {
4628       type = void_type_node;
4629       if (constructor_ok)
4630         meth_name = init_identifier_node;
4631     }
4632   else
4633     meth_name = EXPR_WFL_NODE (id);
4634
4635   /* Do the returned type resolution and registration if necessary */
4636   SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4637
4638   if (meth_name)
4639     type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
4640   EXPR_WFL_NODE (id) = meth_name;
4641   PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
4642
4643   if (must_chain)
4644     {
4645       patch_stage = JDEP_METHOD_RETURN;
4646       register_incomplete_type (patch_stage, type_wfl, id, type);
4647       TREE_TYPE (meth) = GET_REAL_TYPE (type);
4648     }
4649   else
4650     TREE_TYPE (meth) = type;
4651
4652   saved_lineno = input_line;
4653   /* When defining an abstract or interface method, the curly
4654      bracket at level 1 doesn't exist because there is no function
4655      body */
4656   input_line = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
4657             EXPR_WFL_LINENO (id));
4658
4659   /* Remember the original argument list */
4660   orig_arg = TYPE_ARG_TYPES (meth);
4661
4662   if (patch_stage)              /* includes ret type and/or all args */
4663     {
4664       jdep *jdep;
4665       meth = add_method_1 (this_class, flags, meth_name, meth);
4666       /* Patch for the return type */
4667       if (patch_stage == JDEP_METHOD_RETURN)
4668         {
4669           jdep = CLASSD_LAST (ctxp->classd_list);
4670           JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
4671         }
4672       /* This is the stop JDEP. METH allows the function's signature
4673          to be computed. */
4674       register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
4675     }
4676   else
4677     meth = add_method (this_class, flags, meth_name,
4678                        build_java_signature (meth));
4679
4680   /* Remember final parameters */
4681   MARK_FINAL_PARMS (meth, orig_arg);
4682
4683   /* Fix the method argument list so we have the argument name
4684      information */
4685   fix_method_argument_names (orig_arg, meth);
4686
4687   /* Register the parameter number and re-install the current line
4688      number */
4689   DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
4690   input_line = saved_lineno;
4691
4692   /* Register exception specified by the `throws' keyword for
4693      resolution and set the method decl appropriate field to the list.
4694      Note: the grammar ensures that what we get here are class
4695      types. */
4696   if (throws)
4697     {
4698       throws = nreverse (throws);
4699       for (current = throws; current; current = TREE_CHAIN (current))
4700         {
4701           register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
4702                                     NULL_TREE, NULL_TREE);
4703           JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
4704             &TREE_VALUE (current);
4705         }
4706       DECL_FUNCTION_THROWS (meth) = throws;
4707     }
4708
4709   if (TREE_TYPE (GET_CPC ()) != object_type_node)
4710     DECL_FUNCTION_WFL (meth) = id;
4711
4712   /* Set the flag if we correctly processed a constructor */
4713   if (constructor_ok)
4714     {
4715       DECL_CONSTRUCTOR_P (meth) = 1;
4716       /* Compute and store the number of artificial parameters declared
4717          for this constructor */
4718       for (count = 0, current = TYPE_FIELDS (this_class); current;
4719            current = TREE_CHAIN (current))
4720         if (FIELD_LOCAL_ALIAS (current))
4721           count++;
4722       DECL_FUNCTION_NAP (meth) = count;
4723     }
4724
4725   /* Eventually set the @deprecated tag flag */
4726   CHECK_DEPRECATED (meth);
4727
4728   /* If doing xref, store column and line number information instead
4729      of the line number only. */
4730   if (flag_emit_xref)
4731     DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
4732
4733   return meth;
4734 }
4735
4736 static void
4737 fix_method_argument_names (tree orig_arg, tree meth)
4738 {
4739   tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
4740   if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
4741     {
4742       TREE_PURPOSE (arg) = this_identifier_node;
4743       arg = TREE_CHAIN (arg);
4744     }
4745   while (orig_arg != end_params_node)
4746     {
4747       TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
4748       orig_arg = TREE_CHAIN (orig_arg);
4749       arg = TREE_CHAIN (arg);
4750     }
4751 }
4752
4753 /* Complete the method declaration with METHOD_BODY.  */
4754
4755 static void
4756 finish_method_declaration (tree method_body)
4757 {
4758   int flags;
4759
4760   if (!current_function_decl)
4761     return;
4762
4763   flags = get_access_flags_from_decl (current_function_decl);
4764
4765   /* 8.4.5 Method Body */
4766   if ((flags & ACC_ABSTRACT || flags & ACC_NATIVE) && method_body)
4767     {
4768       tree name = DECL_NAME (current_function_decl);
4769       parse_error_context (DECL_FUNCTION_WFL (current_function_decl),
4770                            "%s method `%s' can't have a body defined",
4771                            (METHOD_NATIVE (current_function_decl) ?
4772                             "Native" : "Abstract"),
4773                            IDENTIFIER_POINTER (name));
4774       method_body = NULL_TREE;
4775     }
4776   else if (!(flags & ACC_ABSTRACT) && !(flags & ACC_NATIVE) && !method_body)
4777     {
4778       tree name = DECL_NAME (current_function_decl);
4779       parse_error_context
4780         (DECL_FUNCTION_WFL (current_function_decl),
4781          "Non native and non abstract method `%s' must have a body defined",
4782          IDENTIFIER_POINTER (name));
4783       method_body = NULL_TREE;
4784     }
4785
4786   if (flag_emit_class_files && method_body
4787       && TREE_CODE (method_body) == NOP_EXPR
4788       && TREE_TYPE (current_function_decl)
4789       && TREE_TYPE (TREE_TYPE (current_function_decl)) == void_type_node)
4790     method_body = build1 (RETURN_EXPR, void_type_node, NULL);
4791
4792   BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
4793   maybe_absorb_scoping_blocks ();
4794   /* Exit function's body */
4795   exit_block ();
4796   /* Merge last line of the function with first line, directly in the
4797      function decl. It will be used to emit correct debug info. */
4798   if (!flag_emit_xref)
4799     DECL_FUNCTION_LAST_LINE (current_function_decl) = ctxp->last_ccb_indent1;
4800
4801   /* Since function's argument's list are shared, reset the
4802      ARG_FINAL_P parameter that might have been set on some of this
4803      function parameters. */
4804   UNMARK_FINAL_PARMS (current_function_decl);
4805
4806   /* So we don't have an irrelevant function declaration context for
4807      the next static block we'll see. */
4808   current_function_decl = NULL_TREE;
4809 }
4810
4811 /* Build a an error message for constructor circularity errors.  */
4812
4813 static char *
4814 constructor_circularity_msg (tree from, tree to)
4815 {
4816   static char string [4096];
4817   char *t = xstrdup (lang_printable_name (from, 0));
4818   sprintf (string, "`%s' invokes `%s'", t, lang_printable_name (to, 0));
4819   free (t);
4820   return string;
4821 }
4822
4823 /* Verify a circular call to METH. Return 1 if an error is found, 0
4824    otherwise.  */
4825
4826 static GTY(()) tree vcc_list;
4827 static int
4828 verify_constructor_circularity (tree meth, tree current)
4829 {
4830   tree c;
4831
4832   for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4833     {
4834       if (TREE_VALUE (c) == meth)
4835         {
4836           char *t;
4837           if (vcc_list)
4838             {
4839               tree liste;
4840               vcc_list = nreverse (vcc_list);
4841               for (liste = vcc_list; liste; liste = TREE_CHAIN (liste))
4842                 {
4843                   parse_error_context
4844                     (TREE_PURPOSE (TREE_PURPOSE (liste)), "%s",
4845                      constructor_circularity_msg
4846                       (TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
4847                   java_error_count--;
4848                 }
4849             }
4850           t = xstrdup (lang_printable_name (meth, 0));
4851           parse_error_context (TREE_PURPOSE (c),
4852                                "%s: recursive invocation of constructor `%s'",
4853                                constructor_circularity_msg (current, meth), t);
4854           free (t);
4855           vcc_list = NULL_TREE;
4856           return 1;
4857         }
4858     }
4859   for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
4860     {
4861       vcc_list = tree_cons (c, current, vcc_list);
4862       if (verify_constructor_circularity (meth, TREE_VALUE (c)))
4863         return 1;
4864       vcc_list = TREE_CHAIN (vcc_list);
4865     }
4866   return 0;
4867 }
4868
4869 /* Check modifiers that can be declared but exclusively */
4870
4871 static void
4872 check_modifiers_consistency (int flags)
4873 {
4874   int acc_count = 0;
4875   tree cl = NULL_TREE;
4876
4877   THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, PUBLIC_TK, acc_count, cl);
4878   THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, PRIVATE_TK, acc_count, cl);
4879   THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, PROTECTED_TK, acc_count, cl);
4880   if (acc_count > 1)
4881     parse_error_context
4882       (cl, "Inconsistent member declaration.  At most one of `public', `private', or `protected' may be specified");
4883
4884   acc_count = 0;
4885   cl = NULL_TREE;
4886   THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK, acc_count, cl);
4887   THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK, acc_count, cl);
4888   if (acc_count > 1)
4889     parse_error_context (cl,
4890                          "Inconsistent member declaration.  At most one of `final' or `volatile' may be specified");
4891 }
4892
4893 /* Check the methode header METH for abstract specifics features */
4894
4895 static void
4896 check_abstract_method_header (tree meth)
4897 {
4898   int flags = get_access_flags_from_decl (meth);
4899
4900   OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (ABSTRACT_TK), flags,
4901                               ACC_ABSTRACT, "abstract method",
4902                               IDENTIFIER_POINTER (DECL_NAME (meth)));
4903   OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (PUBLIC_TK), flags,
4904                               ACC_PUBLIC, "abstract method",
4905                               IDENTIFIER_POINTER (DECL_NAME (meth)));
4906
4907   check_modifiers ("Illegal modifier `%s' for interface method",
4908                   flags, INTERFACE_METHOD_MODIFIERS);
4909 }
4910
4911 /* Create a FUNCTION_TYPE node and start augmenting it with the
4912    declared function arguments. Arguments type that can't be resolved
4913    are left as they are, but the returned node is marked as containing
4914    incomplete types.  */
4915
4916 static tree
4917 method_declarator (tree id, tree list)
4918 {
4919   tree arg_types = NULL_TREE, current, node;
4920   tree meth = make_node (FUNCTION_TYPE);
4921   jdep *jdep;
4922
4923   patch_stage = JDEP_NO_PATCH;
4924
4925   if (GET_CPC () == error_mark_node)
4926     return error_mark_node;
4927
4928   /* If we're dealing with an inner class constructor, we hide the
4929      this$<n> decl in the name field of its parameter declaration.  We
4930      also might have to hide the outer context local alias
4931      initializers. Not done when the class is a toplevel class. */
4932   if (PURE_INNER_CLASS_DECL_P (GET_CPC ())
4933       && EXPR_WFL_NODE (id) == GET_CPC_UN ())
4934     {
4935       tree aliases_list, type, thisn;
4936       /* First the aliases, linked to the regular parameters */
4937       aliases_list =
4938         build_alias_initializer_parameter_list (AIPL_FUNCTION_DECLARATION,
4939                                                 TREE_TYPE (GET_CPC ()),
4940                                                 NULL_TREE, NULL);
4941       list = chainon (nreverse (aliases_list), list);
4942
4943       /* Then this$<n> */
4944       type = TREE_TYPE (DECL_CONTEXT (GET_CPC ()));
4945       thisn = build_current_thisn (TREE_TYPE (GET_CPC ()));
4946       list = tree_cons (build_wfl_node (thisn), build_pointer_type (type),
4947                         list);
4948     }
4949
4950   for (current = list; current; current = TREE_CHAIN (current))
4951     {
4952       int must_chain = 0;
4953       tree wfl_name = TREE_PURPOSE (current);
4954       tree type = TREE_VALUE (current);
4955       tree name = EXPR_WFL_NODE (wfl_name);
4956       tree already, arg_node;
4957       tree type_wfl = NULL_TREE;
4958       tree real_type;
4959
4960       /* Obtain a suitable type for resolution, if necessary */
4961       SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
4962
4963       /* Process NAME, as it may specify extra dimension(s) for it */
4964       type = build_array_from_name (type, type_wfl, name, &name);
4965       EXPR_WFL_NODE (wfl_name) = name;
4966
4967       real_type = GET_REAL_TYPE (type);
4968       if (TREE_CODE (real_type) == RECORD_TYPE)
4969         {
4970           real_type = promote_type (real_type);
4971           if (TREE_CODE (type) == TREE_LIST)
4972             TREE_PURPOSE (type) = real_type;
4973         }
4974
4975       /* Check redefinition */
4976       for (already = arg_types; already; already = TREE_CHAIN (already))
4977         if (TREE_PURPOSE (already) == name)
4978           {
4979             parse_error_context
4980               (wfl_name, "Variable `%s' is used more than once in the argument list of method `%s'",
4981                IDENTIFIER_POINTER (name),
4982                IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
4983             break;
4984           }
4985
4986       /* If we've an incomplete argument type, we know there is a location
4987          to patch when the type get resolved, later.  */
4988       jdep = NULL;
4989       if (must_chain)
4990         {
4991           patch_stage = JDEP_METHOD;
4992           type = register_incomplete_type (patch_stage,
4993                                            type_wfl, wfl_name, type);
4994           jdep = CLASSD_LAST (ctxp->classd_list);
4995           JDEP_MISC (jdep) = id;
4996         }
4997
4998       /* The argument node: a name and a (possibly) incomplete type.  */
4999       arg_node = build_tree_list (name, real_type);
5000       /* Remember arguments declared final. */
5001       ARG_FINAL_P (arg_node) = ARG_FINAL_P (current);
5002
5003       if (jdep)
5004         JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
5005       TREE_CHAIN (arg_node) = arg_types;
5006       arg_types = arg_node;
5007     }
5008   TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
5009   node = build_tree_list (id, meth);
5010   return node;
5011 }
5012
5013 static int
5014 unresolved_type_p (tree wfl, tree *returned)
5015 {
5016   if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
5017     {
5018       if (returned)
5019         {
5020           tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
5021           if (decl && current_class && (decl == TYPE_NAME (current_class)))
5022             *returned = TREE_TYPE (decl);
5023           else if (GET_CPC_UN () == EXPR_WFL_NODE (wfl))
5024             *returned = TREE_TYPE (GET_CPC ());
5025           else
5026             *returned = NULL_TREE;
5027         }
5028       return 1;
5029     }
5030   if (returned)
5031     *returned = wfl;
5032   return 0;
5033 }
5034
5035 /* From NAME, build a qualified identifier node using the
5036    qualification from the current package definition. */
5037
5038 static tree
5039 parser_qualified_classname (tree name)
5040 {
5041   tree nested_class_name;
5042
5043   if ((nested_class_name = maybe_make_nested_class_name (name)))
5044     return nested_class_name;
5045
5046   if (ctxp->package)
5047     return merge_qualified_name (ctxp->package, name);
5048   else
5049     return name;
5050 }
5051
5052 /* Called once the type a interface extends is resolved. Returns 0 if
5053    everything is OK.  */
5054
5055 static int
5056 parser_check_super_interface (tree super_decl, tree this_decl, tree this_wfl)
5057 {
5058   tree super_type = TREE_TYPE (super_decl);
5059
5060   /* Has to be an interface */
5061   if (!CLASS_INTERFACE (super_decl))
5062     {
5063       parse_error_context
5064         (this_wfl, "%s `%s' can't implement/extend %s `%s'",
5065          (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
5066           "Interface" : "Class"),
5067          IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5068          (TYPE_ARRAY_P (super_type) ? "array" : "class"),
5069          IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5070       return 1;
5071     }
5072
5073   /* Check top-level interface access. Inner classes are subject to member
5074      access rules (6.6.1). */
5075   if (! INNER_CLASS_P (super_type)
5076       && check_pkg_class_access (DECL_NAME (super_decl),
5077                                  NULL_TREE, true, this_decl))
5078     return 1;
5079
5080   SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
5081                           IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5082                           IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5083   return 0;
5084 }
5085
5086 /* Makes sure that SUPER_DECL is suitable to extend THIS_DECL. Returns
5087    0 if everything is OK.  */
5088
5089 static int
5090 parser_check_super (tree super_decl, tree this_decl, tree wfl)
5091 {
5092   tree super_type = TREE_TYPE (super_decl);
5093
5094   /* SUPER should be a CLASS (neither an array nor an interface) */
5095   if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
5096     {
5097       parse_error_context
5098         (wfl, "Class `%s' can't subclass %s `%s'",
5099          IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5100          (CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
5101          IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5102       return 1;
5103     }
5104
5105   if (CLASS_FINAL (TYPE_NAME (super_type)))
5106     {
5107       parse_error_context (wfl, "Can't subclass final classes: %s",
5108                            IDENTIFIER_POINTER (DECL_NAME (super_decl)));
5109       return 1;
5110     }
5111
5112   /* Check top-level class scope. Inner classes are subject to member access
5113      rules (6.6.1). */
5114   if (! INNER_CLASS_P (super_type)
5115       && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true, NULL_TREE)))
5116     return 1;
5117
5118   SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
5119                           IDENTIFIER_POINTER (DECL_NAME (this_decl)),
5120                           IDENTIFIER_POINTER (DECL_NAME (super_decl))));
5121   return 0;
5122 }
5123
5124 /* Create a new dependency list and link it (in a LIFO manner) to the
5125    CTXP list of type dependency list.  */
5126
5127 static void
5128 create_jdep_list (struct parser_ctxt *ctxp)
5129 {
5130   jdeplist *new = xmalloc (sizeof (jdeplist));
5131   new->first = new->last = NULL;
5132   new->next = ctxp->classd_list;
5133   ctxp->classd_list = new;
5134 }
5135
5136 static jdeplist *
5137 reverse_jdep_list (struct parser_ctxt *ctxp)
5138 {
5139   jdeplist *prev = NULL, *current, *next;
5140   for (current = ctxp->classd_list; current; current = next)
5141     {
5142       next = current->next;
5143       current->next = prev;
5144       prev = current;
5145     }
5146   return prev;
5147 }
5148
5149 /* Create a fake pointer based on the ID stored in
5150    TYPE_NAME. TYPE_NAME can be a WFL or a incomplete type asking to be
5151    registered again. */
5152
5153 static tree
5154 obtain_incomplete_type (tree type_name)
5155 {
5156   tree ptr = NULL_TREE, name;
5157
5158   if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
5159     name = EXPR_WFL_NODE (type_name);
5160   else if (INCOMPLETE_TYPE_P (type_name))
5161     name = TYPE_NAME (type_name);
5162   else
5163     abort ();
5164
5165   /* Workaround from build_pointer_type for incomplete types.  */
5166   BUILD_PTR_FROM_NAME (ptr, name);
5167   TYPE_MODE (ptr) = ptr_mode;
5168   layout_type (ptr);
5169
5170   return ptr;
5171 }
5172
5173 /* Register a incomplete type whose name is WFL. Reuse PTR if PTR is
5174    non NULL instead of computing a new fake type based on WFL. The new
5175    dependency is inserted in the current type dependency list, in FIFO
5176    manner.  */
5177
5178 static tree
5179 register_incomplete_type (int kind, tree wfl, tree decl, tree ptr)
5180 {
5181   jdep *new = xmalloc (sizeof (jdep));
5182
5183   if (!ptr && kind != JDEP_METHOD_END) /* JDEP_METHOD_END is a mere marker */
5184     ptr = obtain_incomplete_type (wfl);
5185
5186   JDEP_KIND (new) = kind;
5187   JDEP_DECL (new) = decl;
5188   JDEP_TO_RESOLVE (new) = ptr;
5189   JDEP_WFL (new) = wfl;
5190   JDEP_CHAIN (new) = NULL;
5191   JDEP_MISC (new) = NULL_TREE;
5192   /* For some dependencies, set the enclosing class of the current
5193      class to be the enclosing context */
5194   if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS || kind == JDEP_SUPER)
5195       && GET_ENCLOSING_CPC ())
5196     JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ());
5197   else
5198     JDEP_ENCLOSING (new) = GET_CPC ();
5199   JDEP_GET_PATCH (new) = (tree *)NULL;
5200
5201   JDEP_INSERT (ctxp->classd_list, new);
5202
5203   return ptr;
5204 }
5205
5206 /* This checks for circular references with innerclasses. We start
5207    from SOURCE and should never reach TARGET. Extended/implemented
5208    types in SOURCE have their enclosing context checked not to reach
5209    TARGET. When the last enclosing context of SOURCE is reached, its
5210    extended/implemented types are also checked not to reach TARGET.
5211    In case of error, WFL of the offending type is returned; NULL_TREE
5212    otherwise.  */
5213
5214 static tree
5215 check_inner_circular_reference (tree source, tree target)
5216 {
5217   tree basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (source));
5218   tree ctx, cl;
5219   int i;
5220
5221   if (!basetype_vec)
5222     return NULL_TREE;
5223
5224   for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
5225     {
5226       tree su;
5227
5228       /* We can end up with a NULL_TREE or an incomplete type here if
5229          we encountered previous type resolution errors. It's safe to
5230          simply ignore these cases.  */
5231       if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE)
5232         continue;
5233       su = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
5234       if (INCOMPLETE_TYPE_P (su))
5235         continue;
5236
5237       if (inherits_from_p (su, target))
5238         return lookup_cl (TYPE_NAME (su));
5239
5240       for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx))
5241         {
5242           /* An enclosing context shouldn't be TARGET */
5243           if (ctx == TYPE_NAME (target))
5244             return lookup_cl (TYPE_NAME (su));
5245
5246           /* When we reach the enclosing last context, start a check
5247              on it, with the same target */
5248           if (! DECL_CONTEXT (ctx) &&
5249               (cl = check_inner_circular_reference (TREE_TYPE (ctx), target)))
5250             return cl;
5251         }
5252     }
5253   return NULL_TREE;
5254 }
5255
5256 /* Explore TYPE's `extends' clause member(s) and return the WFL of the
5257    offending type if a circularity is detected. NULL_TREE is returned
5258    otherwise. TYPE can be an interface or a class.   */
5259
5260 static tree
5261 check_circular_reference (tree type)
5262 {
5263   tree basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (type));
5264   int i;
5265
5266   if (!basetype_vec)
5267     return NULL_TREE;
5268
5269   if (! CLASS_INTERFACE (TYPE_NAME (type)))
5270     {
5271       if (inherits_from_p (CLASSTYPE_SUPER (type), type))
5272         return lookup_cl (TYPE_NAME (type));
5273       return NULL_TREE;
5274     }
5275
5276   for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++)
5277     {
5278       tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
5279       if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node
5280           && interface_of_p (type, BINFO_TYPE (vec_elt)))
5281         return lookup_cl (TYPE_NAME (BINFO_TYPE (vec_elt)));
5282     }
5283   return NULL_TREE;
5284 }
5285
5286 void
5287 java_check_circular_reference (void)
5288 {
5289   tree current;
5290   for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5291     {
5292       tree type = TREE_TYPE (current);
5293       tree cl;
5294
5295       cl = check_circular_reference (type);
5296       if (! cl)
5297         cl = check_inner_circular_reference (type, type);
5298       if (cl)
5299         parse_error_context (cl, "Cyclic class inheritance%s",
5300                              (cyclic_inheritance_report ?
5301                               cyclic_inheritance_report : ""));
5302     }
5303 }
5304
5305 /* Augment the parameter list PARM with parameters crafted to
5306    initialize outer context locals aliases. Through ARTIFICIAL, a
5307    count is kept of the number of crafted parameters. MODE governs
5308    what eventually gets created: something suitable for a function
5309    creation or a function invocation, either the constructor or
5310    finit$.  */
5311
5312 static tree
5313 build_alias_initializer_parameter_list (int mode, tree class_type, tree parm,
5314                                         int *artificial)
5315 {
5316   tree field;
5317   tree additional_parms = NULL_TREE;
5318
5319   for (field = TYPE_FIELDS (class_type); field; field = TREE_CHAIN (field))
5320     if (FIELD_LOCAL_ALIAS (field))
5321       {
5322         const char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
5323         tree purpose = NULL_TREE, value = NULL_TREE, name = NULL_TREE;
5324         tree mangled_id;
5325
5326         switch (mode)
5327           {
5328           case AIPL_FUNCTION_DECLARATION:
5329             MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5330                                                          &buffer [4]);
5331             purpose = build_wfl_node (mangled_id);
5332             if (TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE)
5333               value = build_wfl_node (TYPE_NAME (TREE_TYPE (field)));
5334             else
5335               value = TREE_TYPE (field);
5336             break;
5337
5338           case AIPL_FUNCTION_CREATION:
5339             MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (purpose,
5340                                                          &buffer [4]);
5341             value = TREE_TYPE (field);
5342             break;
5343
5344           case AIPL_FUNCTION_FINIT_INVOCATION:
5345             MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
5346                                                          &buffer [4]);
5347             /* Now, this is wrong. purpose should always be the NAME
5348                of something and value its matching value (decl, type,
5349                etc...) FIXME -- but there is a lot to fix. */
5350
5351             /* When invoked for this kind of operation, we already
5352                know whether a field is used or not. */
5353             purpose = TREE_TYPE (field);
5354             value = build_wfl_node (mangled_id);
5355             break;
5356
5357           case AIPL_FUNCTION_CTOR_INVOCATION:
5358             /* There are two case: the constructor invocation happens
5359                outside the local inner, in which case, locales from the outer
5360                context are directly used.
5361
5362                Otherwise, we fold to using the alias directly. */
5363             if (class_type == current_class)
5364               value = field;
5365             else
5366               {
5367                 name = get_identifier (&buffer[4]);
5368                 value = IDENTIFIER_LOCAL_VALUE (name);
5369               }
5370             break;
5371           }
5372         additional_parms = tree_cons (purpose, value, additional_parms);
5373         if (artificial)
5374           *artificial +=1;
5375       }
5376   if (additional_parms)
5377     {
5378       if (ANONYMOUS_CLASS_P (class_type)
5379           && mode == AIPL_FUNCTION_CTOR_INVOCATION)
5380         additional_parms = nreverse (additional_parms);
5381       parm = chainon (additional_parms, parm);
5382     }
5383
5384    return parm;
5385 }
5386
5387 /* Craft a constructor for CLASS_DECL -- what we should do when none
5388    where found. ARGS is non NULL when a special signature must be
5389    enforced. This is the case for anonymous classes.  */
5390
5391 static tree
5392 craft_constructor (tree class_decl, tree args)
5393 {
5394   tree class_type = TREE_TYPE (class_decl);
5395   tree parm = NULL_TREE;
5396   int flags = (get_access_flags_from_decl (class_decl) & ACC_PUBLIC ?
5397                ACC_PUBLIC : 0);
5398   int i = 0, artificial = 0;
5399   tree decl, ctor_name;
5400   char buffer [80];
5401
5402   /* The constructor name is <init> unless we're dealing with an
5403      anonymous class, in which case the name will be fixed after having
5404      be expanded. */
5405   if (ANONYMOUS_CLASS_P (class_type))
5406     ctor_name = DECL_NAME (class_decl);
5407   else
5408     ctor_name = init_identifier_node;
5409
5410   /* If we're dealing with an inner class constructor, we hide the
5411      this$<n> decl in the name field of its parameter declaration. */
5412   if (PURE_INNER_CLASS_TYPE_P (class_type))
5413     {
5414       tree type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_type)));
5415       parm = tree_cons (build_current_thisn (class_type),
5416                         build_pointer_type (type), parm);
5417
5418       /* Some more arguments to be hidden here. The values of the local
5419          variables of the outer context that the inner class needs to see. */
5420       parm = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
5421                                                      class_type, parm,
5422                                                      &artificial);
5423     }
5424
5425   /* Then if there are any args to be enforced, enforce them now */
5426   for (; args && args != end_params_node; args = TREE_CHAIN (args))
5427     {
5428       sprintf (buffer, "parm%d", i++);
5429       parm = tree_cons (get_identifier (buffer), TREE_VALUE (args), parm);
5430     }
5431
5432   CRAFTED_PARAM_LIST_FIXUP (parm);
5433   decl = create_artificial_method (class_type, flags, void_type_node,
5434                                    ctor_name, parm);
5435   fix_method_argument_names (parm, decl);
5436   /* Now, mark the artificial parameters. */
5437   DECL_FUNCTION_NAP (decl) = artificial;
5438   DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1;
5439   DECL_INLINE (decl) = 1;
5440   return decl;
5441 }
5442
5443
5444 /* Fix the constructors. This will be called right after circular
5445    references have been checked. It is necessary to fix constructors
5446    early even if no code generation will take place for that class:
5447    some generated constructor might be required by the class whose
5448    compilation triggered this one to be simply loaded.  */
5449
5450 void
5451 java_fix_constructors (void)
5452 {
5453   tree current;
5454
5455   for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
5456     {
5457       tree class_type = TREE_TYPE (current);
5458       int saw_ctor = 0;
5459       tree decl;
5460
5461       if (CLASS_INTERFACE (TYPE_NAME (class_type)))
5462         continue;
5463
5464       output_class = current_class = class_type;
5465       for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
5466         {
5467           if (DECL_CONSTRUCTOR_P (decl))
5468             {
5469               fix_constructors (decl);
5470               saw_ctor = 1;
5471             }
5472         }
5473
5474       /* Anonymous class constructor can't be generated that early. */
5475       if (!saw_ctor && !ANONYMOUS_CLASS_P (class_type))
5476         craft_constructor (current, NULL_TREE);
5477     }
5478 }
5479
5480 /* safe_layout_class just makes sure that we can load a class without
5481    disrupting the current_class, input_file, input_line, etc, information
5482    about the class processed currently.  */
5483
5484 void
5485 safe_layout_class (tree class)
5486 {
5487   tree save_current_class = current_class;
5488   location_t save_location = input_location;
5489
5490   layout_class (class);
5491
5492   current_class = save_current_class;
5493   input_location = save_location;
5494 }
5495
5496 static tree
5497 jdep_resolve_class (jdep *dep)
5498 {
5499   tree decl;
5500
5501   if (JDEP_RESOLVED_P (dep))
5502     decl = JDEP_RESOLVED_DECL (dep);
5503   else
5504     {
5505       decl = resolve_class (JDEP_ENCLOSING (dep), JDEP_TO_RESOLVE (dep),
5506                             JDEP_DECL (dep), JDEP_WFL (dep));
5507       JDEP_RESOLVED (dep, decl);
5508       /* If there is no WFL, that's ok.  We generate this warning
5509          elsewhere.  */
5510       if (decl && JDEP_WFL (dep) != NULL_TREE)
5511         check_deprecation (JDEP_WFL (dep), decl);
5512     }
5513
5514   if (!decl)
5515     complete_class_report_errors (dep);
5516   else if (INNER_CLASS_DECL_P (decl))
5517     {
5518       tree inner = TREE_TYPE (decl);
5519       if (! CLASS_LOADED_P (inner))
5520         {
5521           safe_layout_class (inner);
5522           if (TYPE_SIZE (inner) == error_mark_node)
5523             TYPE_SIZE (inner) = NULL_TREE;
5524         }
5525       check_inner_class_access (decl, JDEP_ENCLOSING (dep), JDEP_WFL (dep));
5526     }
5527   return decl;
5528 }
5529
5530 /* Complete unsatisfied class declaration and their dependencies */
5531
5532 void
5533 java_complete_class (void)
5534 {
5535   tree cclass;
5536   jdeplist *cclassd;
5537   int error_found;
5538   tree type;
5539
5540   /* Process imports */
5541   process_imports ();
5542
5543   /* Reverse things so we have the right order */
5544   ctxp->class_list = nreverse (ctxp->class_list);
5545   ctxp->classd_list = reverse_jdep_list (ctxp);
5546
5547   for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
5548        cclass && cclassd;
5549        cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
5550     {
5551       jdep *dep;
5552
5553       /* We keep the compilation unit imports in the class so that
5554          they can be used later to resolve type dependencies that
5555          aren't necessary to solve now. */
5556       TYPE_IMPORT_LIST (TREE_TYPE (cclass)) = ctxp->import_list;
5557       TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (cclass)) = ctxp->import_demand_list;
5558
5559       for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
5560         {
5561           tree decl;
5562           if (!(decl = jdep_resolve_class (dep)))
5563             continue;
5564
5565           /* Now it's time to patch */
5566           switch (JDEP_KIND (dep))
5567             {
5568             case JDEP_SUPER:
5569               /* Simply patch super */
5570               if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
5571                 continue;
5572               BINFO_TYPE (TREE_VEC_ELT (BINFO_BASE_BINFOS (TYPE_BINFO
5573                 (TREE_TYPE (JDEP_DECL (dep)))), 0)) = TREE_TYPE (decl);
5574               break;
5575
5576             case JDEP_FIELD:
5577               {
5578                 /* We do part of the job done in add_field */
5579                 tree field_decl = JDEP_DECL (dep);
5580                 tree field_type = TREE_TYPE (decl);
5581                 if (TREE_CODE (field_type) == RECORD_TYPE)
5582                   field_type = promote_type (field_type);
5583                 TREE_TYPE (field_decl) = field_type;
5584                 DECL_ALIGN (field_decl) = 0;
5585                 DECL_USER_ALIGN (field_decl) = 0;
5586                 layout_decl (field_decl, 0);
5587                 SOURCE_FRONTEND_DEBUG
5588                   (("Completed field/var decl `%s' with `%s'",
5589                     IDENTIFIER_POINTER (DECL_NAME (field_decl)),
5590                     IDENTIFIER_POINTER (DECL_NAME (decl))));
5591                 break;
5592               }
5593             case JDEP_METHOD:   /* We start patching a method */
5594             case JDEP_METHOD_RETURN:
5595               error_found = 0;
5596               while (1)
5597                 {
5598                   if (decl)
5599                     {
5600                       type = TREE_TYPE(decl);
5601                       if (TREE_CODE (type) == RECORD_TYPE)
5602                         type = promote_type (type);
5603                       JDEP_APPLY_PATCH (dep, type);
5604                       SOURCE_FRONTEND_DEBUG
5605                         (((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
5606                            "Completing fct `%s' with ret type `%s'":
5607                            "Completing arg `%s' with type `%s'"),
5608                           IDENTIFIER_POINTER (EXPR_WFL_NODE
5609                                               (JDEP_DECL_WFL (dep))),
5610                           IDENTIFIER_POINTER (DECL_NAME (decl))));
5611                     }
5612                   else
5613                     error_found = 1;
5614                   dep = JDEP_CHAIN (dep);
5615                   if (JDEP_KIND (dep) == JDEP_METHOD_END)
5616                     break;
5617                   else
5618                     decl = jdep_resolve_class (dep);
5619                 }
5620               if (!error_found)
5621                 {
5622                   tree mdecl = JDEP_DECL (dep), signature;
5623                   /* Recompute and reset the signature, check first that
5624                      all types are now defined. If they're not,
5625                      don't build the signature. */
5626                   if (check_method_types_complete (mdecl))
5627                     {
5628                       signature = build_java_signature (TREE_TYPE (mdecl));
5629                       set_java_signature (TREE_TYPE (mdecl), signature);
5630                     }
5631                 }
5632               else
5633                 continue;
5634               break;
5635
5636             case JDEP_INTERFACE:
5637               if (parser_check_super_interface (decl, JDEP_DECL (dep),
5638                                                 JDEP_WFL (dep)))
5639                 continue;
5640               parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
5641               break;
5642
5643             case JDEP_PARM:
5644             case JDEP_VARIABLE:
5645               type = TREE_TYPE(decl);
5646               if (TREE_CODE (type) == RECORD_TYPE)
5647                 type = promote_type (type);
5648               JDEP_APPLY_PATCH (dep, type);
5649               break;
5650
5651             case JDEP_TYPE:
5652               JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5653               SOURCE_FRONTEND_DEBUG
5654                 (("Completing a random type dependency on a '%s' node",
5655                   tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
5656               break;
5657
5658             case JDEP_EXCEPTION:
5659               JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
5660               SOURCE_FRONTEND_DEBUG
5661                 (("Completing `%s' `throws' argument node",
5662                   IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
5663               break;
5664
5665             case JDEP_ANONYMOUS:
5666               patch_anonymous_class (decl, JDEP_DECL (dep), JDEP_WFL (dep));
5667               break;
5668
5669             default:
5670               abort ();
5671             }
5672         }
5673     }
5674   return;
5675 }
5676
5677 /* Resolve class CLASS_TYPE. Handle the case of trying to resolve an
5678    array.  */
5679
5680 static tree
5681 resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5682 {
5683   tree tname = TYPE_NAME (class_type);
5684   tree resolved_type = TREE_TYPE (class_type);
5685   int array_dims = 0;
5686   tree resolved_type_decl;
5687
5688   if (resolved_type != NULL_TREE)
5689     {
5690       tree resolved_type_decl = TYPE_NAME (resolved_type);
5691       if (resolved_type_decl == NULL_TREE
5692           || TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
5693         {
5694           resolved_type_decl = build_decl (TYPE_DECL,
5695                                            TYPE_NAME (class_type),
5696                                            resolved_type);
5697         }
5698       return resolved_type_decl;
5699     }
5700
5701   /* 1- Check to see if we have an array. If true, find what we really
5702      want to resolve  */
5703   if ((array_dims = build_type_name_from_array_name (tname,
5704                                                      &TYPE_NAME (class_type))))
5705     WFL_STRIP_BRACKET (cl, cl);
5706
5707   /* 2- Resolve the bare type */
5708   if (!(resolved_type_decl = do_resolve_class (enclosing, class_type,
5709                                                decl, cl)))
5710     return NULL_TREE;
5711   resolved_type = TREE_TYPE (resolved_type_decl);
5712
5713   /* 3- If we have an array, reconstruct the array down to its nesting */
5714   if (array_dims)
5715     {
5716       for (; array_dims; array_dims--)
5717         resolved_type = build_java_array_type (resolved_type, -1);
5718       resolved_type_decl = TYPE_NAME (resolved_type);
5719     }
5720   TREE_TYPE (class_type) = resolved_type;
5721   return resolved_type_decl;
5722 }
5723
5724 /* Effectively perform the resolution of class CLASS_TYPE.  DECL or CL
5725    are used to report error messages; CL must either be NULL_TREE or a
5726    WFL wrapping a class.  Do not try to replace TYPE_NAME (class_type)
5727    by a variable, since it is changed by find_in_imports{_on_demand}
5728    and (but it doesn't really matter) qualify_and_find.  */
5729
5730 tree
5731 do_resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
5732 {
5733   tree new_class_decl = NULL_TREE, super = NULL_TREE;
5734   tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
5735   tree decl_result;
5736   htab_t circularity_hash;
5737
5738   if (QUALIFIED_P (TYPE_NAME (class_type)))
5739     {
5740       /* If the type name is of the form `Q . Id', then Q is either a
5741          package name or a class name.  First we try to find Q as a
5742          class and then treat Id as a member type.  If we can't find Q
5743          as a class then we fall through.  */
5744       tree q, left, left_type, right;
5745       if (split_qualified_name (&left, &right, TYPE_NAME (class_type)) == 0)
5746         {
5747           BUILD_PTR_FROM_NAME (left_type, left);
5748           q = do_resolve_class (enclosing, left_type, decl, cl);
5749           if (q)
5750             {
5751               enclosing = q;
5752               saved_enclosing_type = TREE_TYPE (q);
5753               BUILD_PTR_FROM_NAME (class_type, right);
5754             }
5755         }
5756     }
5757
5758   if (enclosing)
5759     {
5760       /* This hash table is used to register the classes we're going
5761          through when searching the current class as an inner class, in
5762          order to detect circular references. Remember to free it before
5763          returning the section 0- of this function. */
5764       circularity_hash = htab_create (20, htab_hash_pointer, htab_eq_pointer,
5765                                       NULL);
5766
5767       /* 0- Search in the current class as an inner class.
5768          Maybe some code here should be added to load the class or
5769          something, at least if the class isn't an inner class and ended
5770          being loaded from class file. FIXME. */
5771       while (enclosing)
5772         {
5773           new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing,
5774                                                 &super, class_type);
5775           if (new_class_decl)
5776             break;
5777
5778           /* If we haven't found anything because SUPER reached Object and
5779              ENCLOSING happens to be an innerclass, try the enclosing context. */
5780           if ((!super || super == object_type_node) &&
5781               enclosing && INNER_CLASS_DECL_P (enclosing))
5782             enclosing = DECL_CONTEXT (enclosing);
5783           else
5784             enclosing = NULL_TREE;
5785         }
5786
5787       htab_delete (circularity_hash);
5788
5789       if (new_class_decl)
5790         return new_class_decl;
5791     }
5792
5793   /* 1- Check for the type in single imports. This will change
5794      TYPE_NAME() if something relevant is found */
5795   find_in_imports (saved_enclosing_type, class_type);
5796
5797   /* 2- And check for the type in the current compilation unit */
5798   if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5799     {
5800       if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)))
5801         load_class (TYPE_NAME (class_type), 0);
5802       return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5803     }
5804
5805   /* 3- Search according to the current package definition */
5806   if (!QUALIFIED_P (TYPE_NAME (class_type)))
5807     {
5808       if ((new_class_decl = qualify_and_find (class_type, ctxp->package,
5809                                              TYPE_NAME (class_type))))
5810         return new_class_decl;
5811     }
5812
5813   /* 4- Check the import on demands. Don't allow bar.baz to be
5814      imported from foo.* */
5815   if (!QUALIFIED_P (TYPE_NAME (class_type)))
5816     if (find_in_imports_on_demand (saved_enclosing_type, class_type))
5817       return NULL_TREE;
5818
5819   /* If found in find_in_imports_on_demand, the type has already been
5820      loaded. */
5821   if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
5822     return new_class_decl;
5823
5824   /* 5- Try with a name qualified with the package name we've seen so far */
5825   if (!QUALIFIED_P (TYPE_NAME (class_type)))
5826     {
5827       tree package;
5828
5829       /* If there is a current package (ctxp->package), it's the first
5830          element of package_list and we can skip it. */
5831       for (package = (ctxp->package ?
5832                       TREE_CHAIN (package_list) : package_list);
5833            package; package = TREE_CHAIN (package))
5834         if ((new_class_decl = qualify_and_find (class_type,
5835                                                TREE_PURPOSE (package),
5836                                                TYPE_NAME (class_type))))
5837           return new_class_decl;
5838     }
5839
5840   /* 5- Check another compilation unit that bears the name of type */
5841   load_class (TYPE_NAME (class_type), 0);
5842
5843   if (!cl)
5844     cl = lookup_cl (decl);
5845
5846   /* If we don't have a value for CL, then we're being called recursively.
5847      We can't check package access just yet, but it will be taken care of
5848      by the caller. */
5849   if (cl)
5850     {
5851       if (check_pkg_class_access (TYPE_NAME (class_type), cl, true, NULL_TREE))
5852         return NULL_TREE;
5853     }
5854
5855   /* 6- Last call for a resolution */
5856   decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
5857
5858   /* The final lookup might have registered a.b.c into a.b$c If we
5859      failed at the first lookup, progressively change the name if
5860      applicable and use the matching DECL instead. */
5861   if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
5862     {
5863       char *separator;
5864       tree name = TYPE_NAME (class_type);
5865       char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1);
5866
5867       strcpy (namebuffer, IDENTIFIER_POINTER (name));
5868
5869       do {
5870
5871        /* Reach the last '.', and if applicable, replace it by a `$' and
5872           see if this exists as a type. */
5873        if ((separator = strrchr (namebuffer, '.')))
5874          {
5875            *separator = '$';
5876            name = get_identifier (namebuffer);
5877            decl_result = IDENTIFIER_CLASS_VALUE (name);
5878          }
5879       } while (!decl_result && separator);
5880     }
5881   return decl_result;
5882 }
5883
5884 static tree
5885 qualify_and_find (tree class_type, tree package, tree name)
5886 {
5887   tree new_qualified = merge_qualified_name (package, name);
5888   tree new_class_decl;
5889
5890   if (!IDENTIFIER_CLASS_VALUE (new_qualified))
5891     load_class (new_qualified, 0);
5892   if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_qualified)))
5893     {
5894       if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)))
5895         load_class (TREE_TYPE (new_class_decl), 0);
5896       TYPE_NAME (class_type) = new_qualified;
5897       return IDENTIFIER_CLASS_VALUE (new_qualified);
5898     }
5899   return NULL_TREE;
5900 }
5901
5902 /* Resolve NAME and lay it out (if not done and if not the current
5903    parsed class). Return a decl node. This function is meant to be
5904    called when type resolution is necessary during the walk pass.  */
5905
5906 static tree
5907 resolve_and_layout (tree something, tree cl)
5908 {
5909   tree decl, decl_type;
5910
5911   /* Don't do that on the current class */
5912   if (something == current_class)
5913     return TYPE_NAME (current_class);
5914
5915   /* Don't do anything for void and other primitive types */
5916   if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5917     return NULL_TREE;
5918
5919   /* Pointer types can be reall pointer types or fake pointers. When
5920      finding a real pointer, recheck for primitive types */
5921   if (TREE_CODE (something) == POINTER_TYPE)
5922     {
5923       if (TREE_TYPE (something))
5924         {
5925           something = TREE_TYPE (something);
5926           if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
5927             return NULL_TREE;
5928         }
5929       else
5930         something = TYPE_NAME (something);
5931     }
5932
5933   /* Don't do anything for arrays of primitive types */
5934   if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
5935       && JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
5936     return NULL_TREE;
5937
5938   /* Something might be a WFL */
5939   if (TREE_CODE (something) == EXPR_WITH_FILE_LOCATION)
5940     something = EXPR_WFL_NODE (something);
5941
5942   /* Otherwise, if something is not and IDENTIFIER_NODE, it can be a a
5943      TYPE_DECL or a real TYPE */
5944   else if (TREE_CODE (something) != IDENTIFIER_NODE)
5945     something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
5946             DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
5947
5948   if (!(decl = resolve_no_layout (something, cl)))
5949     return NULL_TREE;
5950
5951   /* Resolve and layout if necessary */
5952   decl_type = TREE_TYPE (decl);
5953   layout_class_methods (decl_type);
5954   /* Check methods */
5955   if (CLASS_FROM_SOURCE_P (decl_type))
5956     java_check_methods (decl);
5957   /* Layout the type if necessary */
5958   if (decl_type != current_class && !CLASS_LOADED_P (decl_type))
5959     safe_layout_class (decl_type);
5960
5961   return decl;
5962 }
5963
5964 /* Resolve a class, returns its decl but doesn't perform any
5965    layout. The current parsing context is saved and restored */
5966
5967 static tree
5968 resolve_no_layout (tree name, tree cl)
5969 {
5970   tree ptr, decl;
5971   BUILD_PTR_FROM_NAME (ptr, name);
5972   java_parser_context_save_global ();
5973   decl = resolve_class (TYPE_NAME (current_class), ptr, NULL_TREE, cl);
5974   java_parser_context_restore_global ();
5975
5976   return decl;
5977 }
5978
5979 /* Called when reporting errors. Skip the '[]'s in a complex array
5980    type description that failed to be resolved. purify_type_name can't
5981    use an identifier tree.  */
5982
5983 static const char *
5984 purify_type_name (const char *name)
5985 {
5986   int len = strlen (name);
5987   int bracket_found;
5988
5989   STRING_STRIP_BRACKETS (name, len, bracket_found);
5990   if (bracket_found)
5991     {
5992       char *stripped_name = xmemdup (name, len, len+1);
5993       stripped_name [len] = '\0';
5994       return stripped_name;
5995     }
5996   return name;
5997 }
5998
5999 /* The type CURRENT refers to can't be found. We print error messages.  */
6000
6001 static void
6002 complete_class_report_errors (jdep *dep)
6003 {
6004   const char *name;
6005
6006   if (!JDEP_WFL (dep))
6007     return;
6008
6009   name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
6010   switch (JDEP_KIND (dep))
6011     {
6012     case JDEP_SUPER:
6013       parse_error_context
6014         (JDEP_WFL (dep), "Superclass `%s' of class `%s' not found",
6015          purify_type_name (name),
6016          IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6017       break;
6018     case JDEP_FIELD:
6019       parse_error_context
6020         (JDEP_WFL (dep), "Type `%s' not found in declaration of field `%s'",
6021          purify_type_name (name),
6022          IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6023       break;
6024     case JDEP_METHOD:           /* Covers arguments */
6025       parse_error_context
6026         (JDEP_WFL (dep), "Type `%s' not found in the declaration of the argument `%s' of method `%s'",
6027          purify_type_name (name),
6028          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
6029          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
6030       break;
6031     case JDEP_METHOD_RETURN:    /* Covers return type */
6032       parse_error_context
6033         (JDEP_WFL (dep), "Type `%s' not found in the declaration of the return type of method `%s'",
6034          purify_type_name (name),
6035          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
6036       break;
6037     case JDEP_INTERFACE:
6038       parse_error_context
6039         (JDEP_WFL (dep), "Superinterface `%s' of %s `%s' not found",
6040          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
6041          (CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
6042          IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6043       break;
6044     case JDEP_VARIABLE:
6045       parse_error_context
6046         (JDEP_WFL (dep), "Type `%s' not found in the declaration of the local variable `%s'",
6047          purify_type_name (IDENTIFIER_POINTER
6048                            (EXPR_WFL_NODE (JDEP_WFL (dep)))),
6049          IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
6050       break;
6051     case JDEP_EXCEPTION:        /* As specified by `throws' */
6052       parse_error_context
6053           (JDEP_WFL (dep), "Class `%s' not found in `throws'",
6054          IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
6055       break;
6056     default:
6057       /* Fix for -Wall. Just break doing nothing. The error will be
6058          caught later */
6059       break;
6060     }
6061 }
6062
6063 /* Return a static string containing the DECL prototype string. If
6064    DECL is a constructor, use the class name instead of the form
6065    <init> */
6066
6067 static const char *
6068 get_printable_method_name (tree decl)
6069 {
6070   const char *to_return;
6071   tree name = NULL_TREE;
6072
6073   if (DECL_CONSTRUCTOR_P (decl))
6074     {
6075       name = DECL_NAME (decl);
6076       DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
6077     }
6078
6079   to_return = lang_printable_name (decl, 0);
6080   if (DECL_CONSTRUCTOR_P (decl))
6081     DECL_NAME (decl) = name;
6082
6083   return to_return;
6084 }
6085
6086 /* Track method being redefined inside the same class. As a side
6087    effect, set DECL_NAME to an IDENTIFIER (prior entering this
6088    function it's a FWL, so we can track errors more accurately.)  */
6089
6090 static int
6091 check_method_redefinition (tree class, tree method)
6092 {
6093   tree redef, sig;
6094
6095   /* There's no need to verify <clinit> and finit$ and instinit$ */
6096   if (DECL_CLINIT_P (method)
6097       || DECL_FINIT_P (method) || DECL_INSTINIT_P (method))
6098     return 0;
6099
6100   sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
6101   for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
6102     {
6103       if (redef == method)
6104         break;
6105       if (DECL_NAME (redef) == DECL_NAME (method)
6106           && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))
6107           && !DECL_ARTIFICIAL (method))
6108         {
6109           parse_error_context
6110             (DECL_FUNCTION_WFL (method), "Duplicate %s declaration `%s'",
6111              (DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
6112              get_printable_method_name (redef));
6113           return 1;
6114         }
6115     }
6116   return 0;
6117 }
6118
6119 /* Return 1 if check went ok, 0 otherwise.  */
6120 static int
6121 check_abstract_method_definitions (int do_interface, tree class_decl,
6122                                    tree type)
6123 {
6124   tree class = TREE_TYPE (class_decl);
6125   tree method, end_type;
6126   int ok = 1;
6127
6128   end_type = (do_interface ? object_type_node : type);
6129   for (method = TYPE_METHODS (type); method; method = TREE_CHAIN (method))
6130     {
6131       tree other_super, other_method, method_sig, method_name;
6132       int found = 0;
6133       int end_type_reached = 0;
6134
6135       if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
6136         continue;
6137
6138       /* Now verify that somewhere in between TYPE and CLASS,
6139          abstract method METHOD gets a non abstract definition
6140          that is inherited by CLASS.  */
6141
6142       method_sig = build_java_signature (TREE_TYPE (method));
6143       method_name = DECL_NAME (method);
6144       if (TREE_CODE (method_name) == EXPR_WITH_FILE_LOCATION)
6145         method_name = EXPR_WFL_NODE (method_name);
6146
6147       other_super = class;
6148       do {
6149         if (other_super == end_type)
6150           end_type_reached = 1;
6151
6152         /* Method search */
6153         for (other_method = TYPE_METHODS (other_super); other_method;
6154             other_method = TREE_CHAIN (other_method))
6155           {
6156             tree s = build_java_signature (TREE_TYPE (other_method));
6157             tree other_name = DECL_NAME (other_method);
6158
6159             if (TREE_CODE (other_name) == EXPR_WITH_FILE_LOCATION)
6160               other_name = EXPR_WFL_NODE (other_name);
6161             if (!DECL_CLINIT_P (other_method)
6162                 && !DECL_CONSTRUCTOR_P (other_method)
6163                 && method_name == other_name
6164                 && method_sig == s
6165                 && !METHOD_ABSTRACT (other_method))
6166              {
6167                found = 1;
6168                break;
6169              }
6170           }
6171         other_super = CLASSTYPE_SUPER (other_super);
6172       } while (!end_type_reached);
6173
6174       /* Report that abstract METHOD didn't find an implementation
6175          that CLASS can use. */
6176       if (!found)
6177         {
6178           char *t = xstrdup (lang_printable_name
6179                             (TREE_TYPE (TREE_TYPE (method)), 0));
6180           tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
6181
6182           parse_error_context
6183             (lookup_cl (class_decl),
6184              "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",
6185              IDENTIFIER_POINTER (DECL_NAME (class_decl)),
6186              t, lang_printable_name (method, 0),
6187              (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))) ?
6188               "interface" : "class"),
6189              IDENTIFIER_POINTER (ccn),
6190              (CLASS_INTERFACE (class_decl) ? "interface" : "class"),
6191              IDENTIFIER_POINTER (DECL_NAME (class_decl)));
6192           ok = 0;
6193           free (t);
6194         }
6195     }
6196
6197   if (ok && do_interface)
6198     {
6199       /* Check for implemented interfaces. */
6200       int i;
6201       tree vector = BINFO_BASE_BINFOS (TYPE_BINFO (type));
6202       for (i = 1; ok && vector && i < TREE_VEC_LENGTH (vector); i++)
6203         {
6204           tree super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
6205           ok = check_abstract_method_definitions (1, class_decl, super);
6206         }
6207     }
6208
6209   return ok;
6210 }
6211
6212 /* Check that CLASS_DECL somehow implements all inherited abstract
6213    methods.  */
6214
6215 static void
6216 java_check_abstract_method_definitions (tree class_decl)
6217 {
6218   tree class = TREE_TYPE (class_decl);
6219   tree super, vector;
6220   int i;
6221
6222   if (CLASS_ABSTRACT (class_decl))
6223     return;
6224
6225   /* Check for inherited types */
6226   super = class;
6227   do {
6228     super = CLASSTYPE_SUPER (super);
6229     check_abstract_method_definitions (0, class_decl, super);
6230   } while (super != object_type_node);
6231
6232   /* Check for implemented interfaces. */
6233   vector = BINFO_BASE_BINFOS (TYPE_BINFO (class));
6234   for (i = 1; i < TREE_VEC_LENGTH (vector); i++)
6235     {
6236       super = BINFO_TYPE (TREE_VEC_ELT (vector, i));
6237       check_abstract_method_definitions (1, class_decl, super);
6238     }
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       tree bases;
6497       int iface_len;
6498       int i;
6499
6500       if (! CLASS_LOADED_P (class_decl))
6501         {
6502           if (CLASS_FROM_SOURCE_P (class_decl))
6503             safe_layout_class (class_decl);
6504           else
6505             load_class (class_decl, 1);
6506         }
6507
6508       bases = BINFO_BASE_BINFOS (TYPE_BINFO (class_decl));
6509       iface_len = TREE_VEC_LENGTH (bases) - 1;
6510       for (i = iface_len; i > 0; --i)
6511         {
6512           tree interface = BINFO_TYPE (TREE_VEC_ELT (bases, i));
6513           tree iface_method;
6514
6515           for (iface_method = TYPE_METHODS (interface);
6516                iface_method != NULL_TREE;
6517                iface_method = TREE_CHAIN (iface_method))
6518             {
6519               tree sig, method;
6520
6521               /* First look for a concrete method implemented or
6522                  inherited by this class.  No need to search
6523                  interfaces here, since we're already looking through
6524                  all of them.  */
6525               sig = build_java_argument_signature (TREE_TYPE (iface_method));
6526               method
6527                 = lookup_argument_method_generic (check_class_decl,
6528                                                   DECL_NAME (iface_method),
6529                                                   sig, SEARCH_VISIBLE);
6530               /* If we don't find an implementation, that is ok.  Any
6531                  potential errors from that are diagnosed elsewhere.
6532                  Also, multiple inheritance with conflicting throws
6533                  clauses is fine in the absence of a concrete
6534                  implementation.  */
6535               if (method != NULL_TREE && !METHOD_ABSTRACT (method)
6536                   && !METHOD_INVISIBLE (iface_method))
6537                 {
6538                   tree method_wfl = DECL_FUNCTION_WFL (method);
6539                   check_throws_clauses (method, method_wfl, iface_method);
6540                 }
6541             }
6542
6543           /* Now check superinterfaces.  */
6544           check_interface_throws_clauses (check_class_decl, interface);
6545         }
6546     }
6547 }
6548
6549 /* Check throws clauses of a method against the clauses of all the
6550    methods it overrides.  We do this by searching up the class
6551    hierarchy, examining all matching accessible methods.  */
6552 static void
6553 check_concrete_throws_clauses (tree class, tree self_method,
6554                                tree name, tree signature)
6555 {
6556   tree method = lookup_argument_method_generic (class, name, signature,
6557                                                 SEARCH_SUPER | SEARCH_VISIBLE);
6558   while (method != NULL_TREE)
6559     {
6560       if (! METHOD_INVISIBLE (method) && hack_is_accessible_p (method, class))
6561         check_throws_clauses (self_method, DECL_FUNCTION_WFL (self_method),
6562                               method);
6563
6564       method = lookup_argument_method_generic (DECL_CONTEXT (method),
6565                                                name, signature,
6566                                                SEARCH_SUPER | SEARCH_VISIBLE);
6567     }
6568 }
6569
6570 /* Generate an error if the `throws' clause of METHOD (if any) is
6571    incompatible with the `throws' clause of FOUND (if any).  */
6572 static void
6573 check_throws_clauses (tree method, tree method_wfl, tree found)
6574 {
6575   tree mthrows;
6576
6577   /* Can't check these things with class loaded from bytecode. FIXME */
6578   if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
6579     return;
6580
6581   for (mthrows = DECL_FUNCTION_THROWS (method);
6582        mthrows; mthrows = TREE_CHAIN (mthrows))
6583     {
6584       tree fthrows;
6585
6586       /* We don't verify unchecked expressions */
6587       if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
6588         continue;
6589       /* Checked expression must be compatible */
6590       for (fthrows = DECL_FUNCTION_THROWS (found);
6591            fthrows; fthrows = TREE_CHAIN (fthrows))
6592         {
6593           if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
6594             break;
6595         }
6596       if (!fthrows)
6597         {
6598           parse_error_context
6599             (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'",
6600              IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
6601              lang_printable_name (found, 0),
6602              IDENTIFIER_POINTER
6603              (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6604         }
6605     }
6606 }
6607
6608 /* Check abstract method of interface INTERFACE */
6609 static void
6610 java_check_abstract_methods (tree interface_decl)
6611 {
6612   int i, n;
6613   tree method, basetype_vec, found;
6614   tree interface = TREE_TYPE (interface_decl);
6615
6616   for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
6617     {
6618       /* 2- Check for double definition inside the defining interface */
6619       if (check_method_redefinition (interface, method))
6620         continue;
6621
6622       /* 3- Overriding is OK as far as we preserve the return type.  */
6623       found = lookup_java_interface_method2 (interface, method);
6624       if (found)
6625         {
6626           char *t;
6627           t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
6628           parse_error_context
6629             (DECL_FUNCTION_WFL (found),
6630              "Method `%s' was defined with return type `%s' in class `%s'",
6631              lang_printable_name (found, 0), t,
6632              IDENTIFIER_POINTER
6633                (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6634           free (t);
6635           continue;
6636         }
6637     }
6638
6639   /* 4- Inherited methods can't differ by their returned types */
6640   if (!(basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (interface))))
6641     return;
6642   n = TREE_VEC_LENGTH (basetype_vec);
6643   for (i = 0; i < n; i++)
6644     {
6645       tree sub_interface_method, sub_interface;
6646       tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
6647       if (!vec_elt)
6648         continue;
6649       sub_interface = BINFO_TYPE (vec_elt);
6650       for (sub_interface_method = TYPE_METHODS (sub_interface);
6651            sub_interface_method;
6652            sub_interface_method = TREE_CHAIN (sub_interface_method))
6653         {
6654           found = lookup_java_interface_method2 (interface,
6655                                                  sub_interface_method);
6656           if (found && (found != sub_interface_method))
6657             {
6658               parse_error_context
6659                 (lookup_cl (sub_interface_method),
6660                  "Interface `%s' inherits method `%s' from interface `%s'. This method is redefined with a different return type in interface `%s'",
6661                  IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
6662                  lang_printable_name (found, 0),
6663                  IDENTIFIER_POINTER
6664                    (DECL_NAME (TYPE_NAME
6665                                (DECL_CONTEXT (sub_interface_method)))),
6666                  IDENTIFIER_POINTER
6667                    (DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
6668             }
6669         }
6670     }
6671 }
6672
6673 /* Lookup methods in interfaces using their name and partial
6674    signature. Return a matching method only if their types differ.  */
6675
6676 static tree
6677 lookup_java_interface_method2 (tree class, tree method_decl)
6678 {
6679   int i, n;
6680   tree basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (class));
6681   tree to_return;
6682
6683   if (!basetype_vec)
6684     return NULL_TREE;
6685
6686   n = TREE_VEC_LENGTH (basetype_vec);
6687   for (i = 0; i < n; i++)
6688     {
6689       tree vec_elt = TREE_VEC_ELT (basetype_vec, i), to_return;
6690       if ((BINFO_TYPE (vec_elt) != object_type_node)
6691           && (to_return =
6692               lookup_java_method2 (BINFO_TYPE (vec_elt), method_decl, 1)))
6693         return to_return;
6694     }
6695   for (i = 0; i < n; i++)
6696     {
6697       to_return = lookup_java_interface_method2
6698         (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)), method_decl);
6699       if (to_return)
6700         return to_return;
6701     }
6702
6703   return NULL_TREE;
6704 }
6705
6706 /* Lookup method using their name and partial signature. Return a
6707    matching method only if their types differ.  */
6708
6709 static tree
6710 lookup_java_method2 (tree clas, tree method_decl, int do_interface)
6711 {
6712   tree method, method_signature, method_name, method_type, name;
6713
6714   method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
6715   name = DECL_NAME (method_decl);
6716   method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6717                  EXPR_WFL_NODE (name) : name);
6718   method_type = TREE_TYPE (TREE_TYPE (method_decl));
6719
6720   while (clas != NULL_TREE)
6721     {
6722       for (method = TYPE_METHODS (clas);
6723            method != NULL_TREE;  method = TREE_CHAIN (method))
6724         {
6725           tree method_sig = build_java_argument_signature (TREE_TYPE (method));
6726           tree name = DECL_NAME (method);
6727           if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
6728                EXPR_WFL_NODE (name) : name) == method_name
6729               && method_sig == method_signature
6730               && TREE_TYPE (TREE_TYPE (method)) != method_type)
6731             return method;
6732         }
6733       clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
6734     }
6735   return NULL_TREE;
6736 }
6737
6738 /* Return the line that matches DECL line number, and try its best to
6739    position the column number. Used during error reports.  */
6740
6741 static GTY(()) tree cl_v;
6742 static tree
6743 lookup_cl (tree decl)
6744 {
6745   char *line, *found;
6746
6747   if (!decl)
6748     return NULL_TREE;
6749
6750   if (cl_v == NULL_TREE)
6751     {
6752       cl_v = build_expr_wfl (NULL_TREE, NULL, 0, 0);
6753     }
6754
6755   EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
6756   EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE (decl), -1);
6757
6758   line = java_get_line_col (EXPR_WFL_FILENAME (cl_v),
6759                             EXPR_WFL_LINENO (cl_v), EXPR_WFL_COLNO (cl_v));
6760
6761   found = strstr ((const char *)line,
6762                   (const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
6763   if (found)
6764     EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
6765
6766   return cl_v;
6767 }
6768
6769 /* Look for a simple name in the single-type import list */
6770
6771 static tree
6772 find_name_in_single_imports (tree name)
6773 {
6774   tree node;
6775
6776   for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
6777     if (TREE_VALUE (node) == name)
6778       return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
6779
6780   return NULL_TREE;
6781 }
6782
6783 /* Process all single-type import. */
6784
6785 static int
6786 process_imports (void)
6787 {
6788   tree import;
6789   int error_found;
6790
6791   for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
6792     {
6793       tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
6794       char *original_name;
6795
6796       original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
6797                                IDENTIFIER_LENGTH (to_be_found),
6798                                IDENTIFIER_LENGTH (to_be_found) + 1);
6799
6800       /* Don't load twice something already defined. */
6801       if (IDENTIFIER_CLASS_VALUE (to_be_found))
6802         continue;
6803
6804       while (1)
6805         {
6806           tree left;
6807
6808           QUALIFIED_P (to_be_found) = 1;
6809           load_class (to_be_found, 0);
6810           error_found =
6811             check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true, NULL_TREE);
6812
6813           /* We found it, we can bail out */
6814           if (IDENTIFIER_CLASS_VALUE (to_be_found))
6815             {
6816               check_deprecation (TREE_PURPOSE (import),
6817                                  IDENTIFIER_CLASS_VALUE (to_be_found));
6818               break;
6819             }
6820
6821           /* We haven't found it. Maybe we're trying to access an
6822              inner class.  The only way for us to know is to try again
6823              after having dropped a qualifier. If we can't break it further,
6824              we have an error. */
6825           if (split_qualified_name (&left, NULL, to_be_found))
6826             break;
6827
6828           to_be_found = left;
6829         }
6830       if (!IDENTIFIER_CLASS_VALUE (to_be_found))
6831         {
6832           parse_error_context (TREE_PURPOSE (import),
6833                                "Class or interface `%s' not found in import",
6834                                original_name);
6835           error_found = 1;
6836         }
6837
6838       free (original_name);
6839       if (error_found)
6840         return 1;
6841     }
6842   return 0;
6843 }
6844
6845 /* Possibly find and mark a class imported by a single-type import
6846    statement.  */
6847
6848 static void
6849 find_in_imports (tree enclosing_type, tree class_type)
6850 {
6851   tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) :
6852                  ctxp->import_list);
6853   while (import)
6854     {
6855       if (TREE_VALUE (import) == TYPE_NAME (class_type))
6856         {
6857           TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
6858           QUALIFIED_P (TYPE_NAME (class_type)) = 1;
6859           return;
6860         }
6861       import = TREE_CHAIN (import);
6862     }
6863 }
6864
6865 static int
6866 note_possible_classname (const char *name, int len)
6867 {
6868   tree node;
6869   if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
6870     len = len - 5;
6871   else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
6872     len = len - 6;
6873   else
6874     return 0;
6875   node = ident_subst (name, len, "", '/', '.', "");
6876   IS_A_CLASSFILE_NAME (node) = 1; /* Or soon to be */
6877   QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
6878   return 1;
6879 }
6880
6881 /* Read a import directory, gathering potential match for further type
6882    references. Indifferently reads a filesystem or a ZIP archive
6883    directory.  */
6884
6885 static void
6886 read_import_dir (tree wfl)
6887 {
6888   tree package_id = EXPR_WFL_NODE (wfl);
6889   const char *package_name = IDENTIFIER_POINTER (package_id);
6890   int package_length = IDENTIFIER_LENGTH (package_id);
6891   DIR *dirp = NULL;
6892   JCF *saved_jcf = current_jcf;
6893
6894   int found = 0;
6895   int k;
6896   void *entry;
6897   struct buffer filename[1];
6898
6899   if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
6900     return;
6901   IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
6902
6903   BUFFER_INIT (filename);
6904   buffer_grow (filename, package_length + 100);
6905
6906   for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
6907     {
6908       const char *entry_name = jcf_path_name (entry);
6909       int entry_length = strlen (entry_name);
6910       if (jcf_path_is_zipfile (entry))
6911         {
6912           ZipFile *zipf;
6913           buffer_grow (filename, entry_length);
6914           memcpy (filename->data, entry_name, entry_length - 1);
6915           filename->data[entry_length-1] = '\0';
6916           zipf = opendir_in_zip (filename->data, jcf_path_is_system (entry));
6917           if (zipf == NULL)
6918             error ("malformed .zip archive in CLASSPATH: %s", entry_name);
6919           else
6920             {
6921               ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
6922               BUFFER_RESET (filename);
6923               for (k = 0; k < package_length; k++)
6924                 {
6925                   char ch = package_name[k];
6926                   *filename->ptr++ = ch == '.' ? '/' : ch;
6927                 }
6928               *filename->ptr++ = '/';
6929
6930               for (k = 0; k < zipf->count;  k++, zipd = ZIPDIR_NEXT (zipd))
6931                 {
6932                   const char *current_entry = ZIPDIR_FILENAME (zipd);
6933                   int current_entry_len = zipd->filename_length;
6934
6935                   if (current_entry_len >= BUFFER_LENGTH (filename)
6936                       && strncmp (filename->data, current_entry,
6937                                   BUFFER_LENGTH (filename)) != 0)
6938                     continue;
6939                   found |= note_possible_classname (current_entry,
6940                                                     current_entry_len);
6941                 }
6942             }
6943         }
6944       else
6945         {
6946           BUFFER_RESET (filename);
6947           buffer_grow (filename, entry_length + package_length + 4);
6948           strcpy (filename->data, entry_name);
6949           filename->ptr = filename->data + entry_length;
6950           for (k = 0; k < package_length; k++)
6951             {
6952               char ch = package_name[k];
6953               *filename->ptr++ = ch == '.' ? '/' : ch;
6954             }
6955           *filename->ptr = '\0';
6956
6957           dirp = opendir (filename->data);
6958           if (dirp == NULL)
6959             continue;
6960           *filename->ptr++ = '/';
6961           for (;;)
6962             {
6963               int len;
6964               const char *d_name;
6965               struct dirent *direntp = readdir (dirp);
6966               if (!direntp)
6967                 break;
6968               d_name = direntp->d_name;
6969               len = strlen (direntp->d_name);
6970               buffer_grow (filename, len+1);
6971               strcpy (filename->ptr, d_name);
6972               found |= note_possible_classname (filename->data + entry_length,
6973                                                 package_length+len+1);
6974             }
6975           if (dirp)
6976             closedir (dirp);
6977         }
6978     }
6979
6980   free (filename->data);
6981
6982   /* Here we should have a unified way of retrieving an entry, to be
6983      indexed. */
6984   if (!found)
6985     {
6986       static int first = 1;
6987       if (first)
6988         {
6989           error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives", package_name);
6990           java_error_count++;
6991           first = 0;
6992         }
6993       else
6994         parse_error_context (wfl, "Package `%s' not found in import",
6995                              package_name);
6996       current_jcf = saved_jcf;
6997       return;
6998     }
6999   current_jcf = saved_jcf;
7000 }
7001
7002 /* Possibly find a type in the import on demands specified
7003    types. Returns 1 if an error occurred, 0 otherwise. Run through the
7004    entire list, to detected potential double definitions.  */
7005
7006 static int
7007 find_in_imports_on_demand (tree enclosing_type, tree class_type)
7008 {
7009   tree class_type_name = TYPE_NAME (class_type);
7010   tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) :
7011                   ctxp->import_demand_list);
7012   tree cl = NULL_TREE;
7013   int seen_once = -1;   /* -1 when not set, 1 if seen once, >1 otherwise. */
7014   int to_return = -1;   /* -1 when not set, 0 or 1 otherwise */
7015   tree node;
7016
7017   for (; import; import = TREE_CHAIN (import))
7018     {
7019       int saved_lineno = input_line;
7020       int access_check;
7021       const char *id_name;
7022       tree decl, type_name_copy;
7023
7024       obstack_grow (&temporary_obstack,
7025                     IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
7026                     IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
7027       obstack_1grow (&temporary_obstack, '.');
7028       obstack_grow0 (&temporary_obstack,
7029                      IDENTIFIER_POINTER (class_type_name),
7030                      IDENTIFIER_LENGTH (class_type_name));
7031       id_name = obstack_finish (&temporary_obstack);
7032
7033       if (! (node = maybe_get_identifier (id_name)))
7034         continue;
7035
7036       /* Setup input_line so that it refers to the line of the import (in
7037          case we parse a class file and encounter errors */
7038       input_line = EXPR_WFL_LINENO (TREE_PURPOSE (import));
7039
7040       type_name_copy = TYPE_NAME (class_type);
7041       TYPE_NAME (class_type) = node;
7042       QUALIFIED_P (node) = 1;
7043       decl = IDENTIFIER_CLASS_VALUE (node);
7044       access_check = -1;
7045       /* If there is no DECL set for the class or if the class isn't
7046          loaded and not seen in source yet, then load */
7047       if (!decl || ! CLASS_LOADED_P (TREE_TYPE (decl)))
7048         {
7049           load_class (node, 0);
7050           decl = IDENTIFIER_CLASS_VALUE (node);
7051         }
7052       if (decl && ! INNER_CLASS_P (TREE_TYPE (decl)))
7053         access_check = check_pkg_class_access (node, TREE_PURPOSE (import),
7054                                                false, NULL_TREE);
7055       else
7056         /* 6.6.1: Inner classes are subject to member access rules. */
7057         access_check = 0;
7058
7059       input_line = saved_lineno;
7060
7061       /* If the loaded class is not accessible or couldn't be loaded,
7062          we restore the original TYPE_NAME and process the next
7063          import. */
7064       if (access_check || !decl)
7065         {
7066           TYPE_NAME (class_type) = type_name_copy;
7067           continue;
7068         }
7069
7070       /* If the loaded class is accessible, we keep a tab on it to
7071          detect and report multiple inclusions. */
7072       if (IS_A_CLASSFILE_NAME (node))
7073         {
7074           if (seen_once < 0)
7075             {
7076               cl = TREE_PURPOSE (import);
7077               seen_once = 1;
7078             }
7079           else if (seen_once >= 0)
7080             {
7081               tree location = (cl ? cl : TREE_PURPOSE (import));
7082               tree package = (cl ? EXPR_WFL_NODE (cl) :
7083                               EXPR_WFL_NODE (TREE_PURPOSE (import)));
7084               seen_once++;
7085               parse_error_context
7086                 (location,
7087                  "Type `%s' also potentially defined in package `%s'",
7088                  IDENTIFIER_POINTER (TYPE_NAME (class_type)),
7089                  IDENTIFIER_POINTER (package));
7090             }
7091         }
7092       to_return = access_check;
7093     }
7094
7095   if (seen_once == 1)
7096     return to_return;
7097   else
7098     return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */
7099 }
7100
7101 /* Add package NAME to the list of packages encountered so far. To
7102    speed up class lookup in do_resolve_class, we make sure a
7103    particular package is added only once.  */
7104
7105 static void
7106 register_package (tree name)
7107 {
7108   static htab_t pht;
7109   void **e;
7110
7111   if (pht == NULL)
7112     pht = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
7113
7114   e = htab_find_slot (pht, name, INSERT);
7115   if (*e == NULL)
7116     {
7117       package_list = chainon (package_list, build_tree_list (name, NULL));
7118       *e = name;
7119     }
7120 }
7121
7122 static tree
7123 resolve_package (tree pkg, tree *next, tree *type_name)
7124 {
7125   tree current;
7126   tree decl = NULL_TREE;
7127   *type_name = NULL_TREE;
7128
7129   /* The trick is to determine when the package name stops and were
7130      the name of something contained in the package starts. Then we
7131      return a fully qualified name of what we want to get. */
7132
7133   *next = EXPR_WFL_QUALIFICATION (pkg);
7134
7135   /* Try to progressively construct a type name */
7136   if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION)
7137     for (current = EXPR_WFL_QUALIFICATION (pkg);
7138          current; current = TREE_CHAIN (current))
7139       {
7140         /* If we don't have what we're expecting, exit now. TYPE_NAME
7141            will be null and the error caught later. */
7142         if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION)
7143           break;
7144         *type_name =
7145           merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current)));
7146         if ((decl = resolve_no_layout (*type_name, NULL_TREE)))
7147           {
7148             /* resolve_package should be used in a loop, hence we
7149                point at this one to naturally process the next one at
7150                the next iteration. */
7151             *next = current;
7152             break;
7153           }
7154       }
7155   return decl;
7156 }
7157
7158
7159 /* Check accessibility of inner classes according to member access rules.
7160    DECL is the inner class, ENCLOSING_DECL is the class from which the
7161    access is being attempted. */
7162
7163 static void
7164 check_inner_class_access (tree decl, tree enclosing_decl, tree cl)
7165 {
7166   const char *access;
7167   tree enclosing_decl_type;
7168
7169   /* We don't issue an error message when CL is null. CL can be null
7170      as a result of processing a JDEP crafted by source_start_java_method
7171      for the purpose of patching its parm decl. But the error would
7172      have been already trapped when fixing the method's signature.
7173      DECL can also be NULL in case of earlier errors. */
7174   if (!decl || !cl)
7175     return;
7176
7177   enclosing_decl_type = TREE_TYPE (enclosing_decl);
7178
7179   if (CLASS_PRIVATE (decl))
7180     {
7181       /* Access is permitted only within the body of the top-level
7182          class in which DECL is declared. */
7183       tree top_level = decl;
7184       while (DECL_CONTEXT (top_level))
7185         top_level = DECL_CONTEXT (top_level);
7186       while (DECL_CONTEXT (enclosing_decl))
7187         enclosing_decl = DECL_CONTEXT (enclosing_decl);
7188       if (top_level == enclosing_decl)
7189         return;
7190       access = "private";
7191     }
7192   else if (CLASS_PROTECTED (decl))
7193     {
7194       tree decl_context;
7195       /* Access is permitted from within the same package... */
7196       if (in_same_package (decl, enclosing_decl))
7197         return;
7198
7199       /* ... or from within the body of a subtype of the context in which
7200          DECL is declared. */
7201       decl_context = DECL_CONTEXT (decl);
7202       while (enclosing_decl)
7203         {
7204           if (CLASS_INTERFACE (decl))
7205             {
7206               if (interface_of_p (TREE_TYPE (decl_context),
7207                                   enclosing_decl_type))
7208                 return;
7209             }
7210           else
7211             {
7212               /* Eww. The order of the arguments is different!! */
7213               if (inherits_from_p (enclosing_decl_type,
7214                                    TREE_TYPE (decl_context)))
7215                 return;
7216             }
7217           enclosing_decl = DECL_CONTEXT (enclosing_decl);
7218         }
7219       access = "protected";
7220     }
7221   else if (! CLASS_PUBLIC (decl))
7222     {
7223       /* Access is permitted only from within the same package as DECL. */
7224       if (in_same_package (decl, enclosing_decl))
7225         return;
7226       access = "non-public";
7227     }
7228   else
7229     /* Class is public. */
7230     return;
7231
7232   parse_error_context (cl, "Nested %s %s is %s; cannot be accessed from here",
7233                        (CLASS_INTERFACE (decl) ? "interface" : "class"),
7234                        lang_printable_name (decl, 0), access);
7235 }
7236
7237 /* Accessibility check for top-level classes. If CLASS_NAME is in a
7238    foreign package, it must be PUBLIC. Return 0 if no access
7239    violations were found, 1 otherwise. If VERBOSE is true and an error
7240    was found, it is reported and accounted for.  If CL is NULL then 
7241    look it up with THIS_DECL.  */
7242
7243 static int
7244 check_pkg_class_access (tree class_name, tree cl, bool verbose, tree this_decl)
7245 {
7246   tree type;
7247
7248   if (!IDENTIFIER_CLASS_VALUE (class_name))
7249     return 0;
7250
7251   if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
7252     return 0;
7253
7254   if (!CLASS_PUBLIC (TYPE_NAME (type)))
7255     {
7256       /* Access to a private class within the same package is
7257          allowed. */
7258       tree l, r;
7259       split_qualified_name (&l, &r, class_name);
7260       if (!QUALIFIED_P (class_name) && !ctxp->package)
7261         /* Both in the empty package. */
7262         return 0;
7263       if (l == ctxp->package)
7264         /* Both in the same package. */
7265         return 0;
7266
7267       if (verbose)
7268         parse_error_context
7269           (cl == NULL ? lookup_cl (this_decl): cl,
7270            "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed",
7271            (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
7272            IDENTIFIER_POINTER (class_name));
7273       return 1;
7274     }
7275   return 0;
7276 }
7277
7278 /* Local variable declaration. */
7279
7280 static void
7281 declare_local_variables (int modifier, tree type, tree vlist)
7282 {
7283   tree decl, current, saved_type;
7284   tree type_wfl = NULL_TREE;
7285   int must_chain = 0;
7286   int final_p = 0;
7287
7288   /* Push a new block if statements were seen between the last time we
7289      pushed a block and now. Keep a count of blocks to close */
7290   if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
7291     {
7292       tree b = enter_block ();
7293       BLOCK_IS_IMPLICIT (b) = 1;
7294     }
7295
7296   if (modifier)
7297     {
7298       size_t i;
7299       for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)
7300         if (1 << i & modifier)
7301           break;
7302       if (modifier == ACC_FINAL)
7303         final_p = 1;
7304       else
7305         {
7306           parse_error_context
7307             (ctxp->modifier_ctx [i],
7308              "Only `final' is allowed as a local variables modifier");
7309           return;
7310         }
7311     }
7312
7313   /* Obtain an incomplete type if TYPE is not complete. TYPE_WFL will
7314      hold the TYPE value if a new incomplete has to be created (as
7315      opposed to being found already existing and reused). */
7316   SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
7317
7318   /* If TYPE is fully resolved and we don't have a reference, make one */
7319   PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7320
7321   /* Go through all the declared variables */
7322   for (current = vlist, saved_type = type; current;
7323        current = TREE_CHAIN (current), type = saved_type)
7324     {
7325       tree other, real_type;
7326       tree wfl  = TREE_PURPOSE (current);
7327       tree name = EXPR_WFL_NODE (wfl);
7328       tree init = TREE_VALUE (current);
7329
7330       /* Process NAME, as it may specify extra dimension(s) for it */
7331       type = build_array_from_name (type, type_wfl, name, &name);
7332
7333       /* Variable redefinition check */
7334       if ((other = lookup_name_in_blocks (name)))
7335         {
7336           variable_redefinition_error (wfl, name, TREE_TYPE (other),
7337                                        DECL_SOURCE_LINE (other));
7338           continue;
7339         }
7340
7341       /* Type adjustment. We may have just readjusted TYPE because
7342          the variable specified more dimensions. Make sure we have
7343          a reference if we can and don't have one already. */
7344       PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
7345
7346       real_type = GET_REAL_TYPE (type);
7347       /* Never layout this decl. This will be done when its scope
7348          will be entered */
7349       decl = build_decl (VAR_DECL, name, real_type);
7350       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
7351       DECL_FINAL (decl) = final_p;
7352       BLOCK_CHAIN_DECL (decl);
7353
7354       /* If doing xreferencing, replace the line number with the WFL
7355          compound value */
7356       if (flag_emit_xref)
7357         DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
7358
7359       /* Don't try to use an INIT statement when an error was found */
7360       if (init && java_error_count)
7361         init = NULL_TREE;
7362
7363       /* Remember it if this is an initialized-upon-declaration final
7364          variable.  */
7365       if (init && final_p)
7366         {
7367           DECL_LOCAL_FINAL_IUD (decl) = 1;
7368         }
7369
7370       /* Add the initialization function to the current function's code */
7371       if (init)
7372         {
7373           /* Name might have been readjusted */
7374           EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
7375           MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
7376           java_method_add_stmt (current_function_decl,
7377                                 build_debugable_stmt (EXPR_WFL_LINECOL (init),
7378                                                       init));
7379         }
7380
7381       /* Setup dependency the type of the decl */
7382       if (must_chain)
7383         {
7384           jdep *dep;
7385           register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
7386           dep = CLASSD_LAST (ctxp->classd_list);
7387           JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
7388         }
7389     }
7390   SOURCE_FRONTEND_DEBUG (("Defined locals"));
7391 }
7392
7393 /* Called during parsing. Build decls from argument list.  */
7394
7395 static void
7396 source_start_java_method (tree fndecl)
7397 {
7398   tree tem;
7399   tree parm_decl;
7400   int i;
7401
7402   if (!fndecl)
7403     return;
7404
7405   current_function_decl = fndecl;
7406
7407   /* New scope for the function */
7408   enter_block ();
7409   for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
7410        tem != end_params_node; tem = TREE_CHAIN (tem), i++)
7411     {
7412       tree type = TREE_VALUE (tem);
7413       tree name = TREE_PURPOSE (tem);
7414
7415       /* If type is incomplete. Create an incomplete decl and ask for
7416          the decl to be patched later */
7417       if (INCOMPLETE_TYPE_P (type))
7418         {
7419           jdep *jdep;
7420           tree real_type = GET_REAL_TYPE (type);
7421           parm_decl = build_decl (PARM_DECL, name, real_type);
7422           type = obtain_incomplete_type (type);
7423           register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
7424           jdep = CLASSD_LAST (ctxp->classd_list);
7425           JDEP_MISC (jdep) = name;
7426           JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
7427         }
7428       else
7429         parm_decl = build_decl (PARM_DECL, name, type);
7430
7431       /* Remember if a local variable was declared final (via its
7432          TREE_LIST of type/name.) Set DECL_FINAL accordingly. */
7433       if (ARG_FINAL_P (tem))
7434         {
7435           MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl);
7436           DECL_FINAL (parm_decl) = 1;
7437         }
7438
7439       BLOCK_CHAIN_DECL (parm_decl);
7440     }
7441   tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
7442   BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
7443     nreverse (tem);
7444   DECL_ARG_SLOT_COUNT (current_function_decl) = i;
7445   DECL_MAX_LOCALS (current_function_decl) = i;
7446 }
7447
7448 /* Called during parsing. Creates an artificial method declaration.  */
7449
7450 static tree
7451 create_artificial_method (tree class, int flags, tree type,
7452                           tree name, tree args)
7453 {
7454   tree mdecl;
7455
7456   java_parser_context_save_global ();
7457   input_line = 0;
7458   mdecl = make_node (FUNCTION_TYPE);
7459   TREE_TYPE (mdecl) = type;
7460   TYPE_ARG_TYPES (mdecl) = args;
7461   mdecl = add_method (class, flags, name, build_java_signature (mdecl));
7462   java_parser_context_restore_global ();
7463   DECL_ARTIFICIAL (mdecl) = 1;
7464   return mdecl;
7465 }
7466
7467 /* Starts the body if an artificial method.  */
7468
7469 static void
7470 start_artificial_method_body (tree mdecl)
7471 {
7472   DECL_SOURCE_LINE (mdecl) = 1;
7473   DECL_FUNCTION_LAST_LINE (mdecl) = 1;
7474   source_start_java_method (mdecl);
7475   enter_block ();
7476 }
7477
7478 static void
7479 end_artificial_method_body (tree mdecl)
7480 {
7481   /* exit_block modifies DECL_FUNCTION_BODY (current_function_decl).
7482      It has to be evaluated first. (if mdecl is current_function_decl,
7483      we have an undefined behavior if no temporary variable is used.) */
7484   tree b = exit_block ();
7485   BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = b;
7486   exit_block ();
7487 }
7488
7489 /* Dump a tree of some kind.  This is a convenience wrapper for the
7490    dump_* functions in tree-dump.c.  */
7491 static void
7492 dump_java_tree (enum tree_dump_index phase, tree t)
7493 {
7494   FILE *stream;
7495   int flags;
7496
7497   stream = dump_begin (phase, &flags);
7498   flags |= TDF_SLIM;
7499   if (stream)
7500     {
7501       dump_node (t, flags, stream);
7502       dump_end (phase, stream);
7503     }
7504 }
7505
7506 /* Terminate a function and expand its body.  */
7507
7508 static void
7509 source_end_java_method (void)
7510 {
7511   tree fndecl = current_function_decl;
7512
7513   if (!fndecl)
7514     return;
7515
7516   java_parser_context_save_global ();
7517   input_line = ctxp->last_ccb_indent1;
7518
7519   /* Turn function bodies with only a NOP expr null, so they don't get
7520      generated at all and we won't get warnings when using the -W
7521      -Wall flags. */
7522   if (IS_EMPTY_STMT (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))))
7523     BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
7524
7525   if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))
7526       && ! flag_emit_class_files
7527       && ! flag_emit_xref)
7528     finish_method (fndecl);
7529
7530   current_function_decl = NULL_TREE;
7531   java_parser_context_restore_global ();
7532   current_function_decl = NULL_TREE;
7533 }
7534
7535 /* Record EXPR in the current function block. Complements compound
7536    expression second operand if necessary.  */
7537
7538 tree
7539 java_method_add_stmt (tree fndecl, tree expr)
7540 {
7541   if (!GET_CURRENT_BLOCK (fndecl))
7542     return NULL_TREE;
7543   return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
7544 }
7545
7546 static tree
7547 add_stmt_to_block (tree b, tree type, tree stmt)
7548 {
7549   tree body = BLOCK_EXPR_BODY (b), c;
7550
7551   if (java_error_count)
7552     return body;
7553
7554   if ((c = add_stmt_to_compound (body, type, stmt)) == body)
7555     return body;
7556
7557   BLOCK_EXPR_BODY (b) = c;
7558   TREE_SIDE_EFFECTS (c) = 1;
7559   return c;
7560 }
7561
7562 /* Lays out the methods for the classes seen so far.  */
7563
7564 void
7565 java_layout_seen_class_methods (void)
7566 {
7567   tree previous_list = all_class_list;
7568   tree end = NULL_TREE;
7569   tree current;
7570
7571   while (1)
7572     {
7573       for (current = previous_list;
7574            current != end; current = TREE_CHAIN (current))
7575         {
7576           tree cls = TREE_TYPE (TREE_VALUE (current));
7577
7578           if (! CLASS_LOADED_P (cls))
7579             load_class (cls, 0);
7580
7581           layout_class_methods (cls);
7582         }
7583
7584       /* Note that new classes might have been added while laying out
7585          methods, changing the value of all_class_list.  */
7586
7587       if (previous_list != all_class_list)
7588         {
7589           end = previous_list;
7590           previous_list = all_class_list;
7591         }
7592       else
7593         break;
7594     }
7595 }
7596
7597 static GTY(()) tree stop_reordering;
7598 void
7599 java_reorder_fields (void)
7600 {
7601   tree current;
7602
7603   for (current = gclass_list; current; current = TREE_CHAIN (current))
7604     {
7605       output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7606
7607       if (current_class == stop_reordering)
7608         break;
7609
7610       /* Reverse the fields, but leave the dummy field in front.
7611          Fields are already ordered for Object and Class */
7612       if (TYPE_FIELDS (current_class) && current_class != object_type_node
7613           && current_class != class_type_node)
7614       {
7615         /* If the dummy field is there, reverse the right fields and
7616            just layout the type for proper fields offset */
7617         if (!DECL_NAME (TYPE_FIELDS (current_class)))
7618           {
7619             tree fields = TYPE_FIELDS (current_class);
7620             TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
7621             TYPE_SIZE (current_class) = NULL_TREE;
7622           }
7623         /* We don't have a dummy field, we need to layout the class,
7624            after having reversed the fields */
7625         else
7626           {
7627             TYPE_FIELDS (current_class) =
7628               nreverse (TYPE_FIELDS (current_class));
7629             TYPE_SIZE (current_class) = NULL_TREE;
7630           }
7631       }
7632     }
7633   /* There are cases were gclass_list will be empty. */
7634   if (gclass_list)
7635     stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list));
7636 }
7637
7638 /* Layout the methods of all classes loaded in one way or another.
7639    Check methods of source parsed classes. Then reorder the
7640    fields and layout the classes or the type of all source parsed
7641    classes */
7642
7643 void
7644 java_layout_classes (void)
7645 {
7646   tree current;
7647   int save_error_count = java_error_count;
7648
7649   /* Layout the methods of all classes seen so far */
7650   java_layout_seen_class_methods ();
7651   java_parse_abort_on_error ();
7652   all_class_list = NULL_TREE;
7653
7654   /* Then check the methods of all parsed classes */
7655   for (current = gclass_list; current; current = TREE_CHAIN (current))
7656     if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
7657       java_check_methods (TREE_VALUE (current));
7658   java_parse_abort_on_error ();
7659
7660   for (current = gclass_list; current; current = TREE_CHAIN (current))
7661     {
7662       output_class = current_class = TREE_TYPE (TREE_VALUE (current));
7663       layout_class (current_class);
7664
7665       /* Error reported by the caller */
7666       if (java_error_count)
7667         return;
7668     }
7669
7670   /* We might have reloaded classes durign the process of laying out
7671      classes for code generation. We must layout the methods of those
7672      late additions, as constructor checks might use them */
7673   java_layout_seen_class_methods ();
7674   java_parse_abort_on_error ();
7675 }
7676
7677 /* Expand methods in the current set of classes remembered for
7678    generation.  */
7679
7680 static void
7681 java_complete_expand_classes (void)
7682 {
7683   tree current;
7684
7685   do_not_fold = flag_emit_xref;
7686
7687   for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
7688     if (!INNER_CLASS_DECL_P (current))
7689       java_complete_expand_class (current);
7690 }
7691
7692 /* Expand the methods found in OUTER, starting first by OUTER's inner
7693    classes, if any.  */
7694
7695 static void
7696 java_complete_expand_class (tree outer)
7697 {
7698   tree inner_list;
7699
7700   /* We need to go after all inner classes and start expanding them,
7701      starting with most nested ones. We have to do that because nested
7702      classes might add functions to outer classes */
7703
7704   for (inner_list = DECL_INNER_CLASS_LIST (outer);
7705        inner_list; inner_list = TREE_CHAIN (inner_list))
7706     java_complete_expand_class (TREE_PURPOSE (inner_list));
7707
7708   java_complete_expand_methods (outer);
7709 }
7710
7711 /* Expand methods registered in CLASS_DECL. The general idea is that
7712    we expand regular methods first. This allows us get an estimate on
7713    how outer context local alias fields are really used so we can add
7714    to the constructor just enough code to initialize them properly (it
7715    also lets us generate finit$ correctly.) Then we expand the
7716    constructors and then <clinit>.  */
7717
7718 static void
7719 java_complete_expand_methods (tree class_decl)
7720 {
7721   tree clinit, decl, first_decl;
7722
7723   output_class = current_class = TREE_TYPE (class_decl);
7724
7725   /* Pre-expand <clinit> to figure whether we really need it or
7726      not. If we do need it, we pre-expand the static fields so they're
7727      ready to be used somewhere else. <clinit> will be fully expanded
7728      after we processed the constructors. */
7729   first_decl = TYPE_METHODS (current_class);
7730   clinit = maybe_generate_pre_expand_clinit (current_class);
7731
7732   /* Then generate finit$ (if we need to) because constructors will
7733    try to use it.*/
7734   if (TYPE_FINIT_STMT_LIST (current_class))
7735     java_complete_expand_method (generate_finit (current_class));
7736
7737   /* Then generate instinit$ (if we need to) because constructors will
7738      try to use it. */
7739   if (TYPE_II_STMT_LIST (current_class))
7740     java_complete_expand_method (generate_instinit (current_class));
7741
7742   /* Now do the constructors */
7743   for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl))
7744     {
7745       int no_body;
7746
7747       if (!DECL_CONSTRUCTOR_P (decl))
7748         continue;
7749
7750       no_body = !DECL_FUNCTION_BODY (decl);
7751       /* Don't generate debug info on line zero when expanding a
7752          generated constructor. */
7753       if (no_body)
7754         restore_line_number_status (1);
7755
7756       java_complete_expand_method (decl);
7757
7758       if (no_body)
7759         restore_line_number_status (0);
7760     }
7761
7762   /* First, do the ordinary methods. */
7763   for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
7764     {
7765       /* Ctors aren't part of this batch. */
7766       if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
7767         continue;
7768
7769       /* Skip abstract or native methods -- but do handle native
7770          methods when generating JNI stubs.  */
7771       if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl)))
7772         {
7773           DECL_FUNCTION_BODY (decl) = NULL_TREE;
7774           continue;
7775         }
7776
7777       if (METHOD_NATIVE (decl))
7778         {
7779           tree body;
7780           current_function_decl = decl;
7781           body = build_jni_stub (decl);
7782           BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
7783         }
7784
7785       java_complete_expand_method (decl);
7786     }
7787
7788   /* If there is indeed a <clinit>, fully expand it now */
7789   if (clinit)
7790     {
7791       /* Prevent the use of `this' inside <clinit> */
7792       ctxp->explicit_constructor_p = 1;
7793       java_complete_expand_method (clinit);
7794       ctxp->explicit_constructor_p = 0;
7795     }
7796
7797   /* We might have generated a class$ that we now want to expand */
7798   if (TYPE_DOT_CLASS (current_class))
7799     java_complete_expand_method (TYPE_DOT_CLASS (current_class));
7800
7801   /* Now verify constructor circularity (stop after the first one we
7802      prove wrong.) */
7803   if (!CLASS_INTERFACE (class_decl))
7804     for (decl = TYPE_METHODS (current_class); decl; decl = TREE_CHAIN (decl))
7805       if (DECL_CONSTRUCTOR_P (decl)
7806           && verify_constructor_circularity (decl, decl))
7807         break;
7808 }
7809
7810 /* Attempt to create <clinit>. Pre-expand static fields so they can be
7811    safely used in some other methods/constructors.  */
7812
7813 static tree
7814 maybe_generate_pre_expand_clinit (tree class_type)
7815 {
7816   tree current, mdecl;
7817
7818   if (!TYPE_CLINIT_STMT_LIST (class_type))
7819     return NULL_TREE;
7820
7821   /* Go through all static fields and pre expand them */
7822   for (current = TYPE_FIELDS (class_type); current;
7823        current = TREE_CHAIN (current))
7824     if (FIELD_STATIC (current))
7825       build_field_ref (NULL_TREE, class_type, DECL_NAME (current));
7826
7827   /* Then build the <clinit> method */
7828   mdecl = create_artificial_method (class_type, ACC_STATIC, void_type_node,
7829                                     clinit_identifier_node, end_params_node);
7830   layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
7831                        mdecl, NULL_TREE);
7832   start_artificial_method_body (mdecl);
7833
7834   /* We process the list of assignment we produced as the result of
7835      the declaration of initialized static field and add them as
7836      statement to the <clinit> method. */
7837   for (current = TYPE_CLINIT_STMT_LIST (class_type); current;
7838        current = TREE_CHAIN (current))
7839     {
7840       tree stmt = current;
7841       /* We build the assignment expression that will initialize the
7842          field to its value. There are strict rules on static
7843          initializers (8.5). FIXME */
7844       if (TREE_CODE (stmt) != BLOCK && !IS_EMPTY_STMT (stmt))
7845         stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt);
7846       java_method_add_stmt (mdecl, stmt);
7847     }
7848
7849   end_artificial_method_body (mdecl);
7850
7851   /* Now we want to place <clinit> as the last method (because we need
7852      it at least for interface so that it doesn't interfere with the
7853      dispatch table based lookup. */
7854   if (TREE_CHAIN (TYPE_METHODS (class_type)))
7855     {
7856       current = TREE_CHAIN (TYPE_METHODS (class_type));
7857       TYPE_METHODS (class_type) = current;
7858
7859       while (TREE_CHAIN (current))
7860         current = TREE_CHAIN (current);
7861
7862       TREE_CHAIN (current) = mdecl;
7863       TREE_CHAIN (mdecl) = NULL_TREE;
7864     }
7865
7866   return mdecl;
7867 }
7868
7869 /* Analyzes a method body and look for something that isn't a
7870    MODIFY_EXPR with a constant value.  */
7871
7872 static int
7873 analyze_clinit_body (tree this_class, tree bbody)
7874 {
7875   while (bbody)
7876     switch (TREE_CODE (bbody))
7877       {
7878       case BLOCK:
7879         bbody = BLOCK_EXPR_BODY (bbody);
7880         break;
7881
7882       case EXPR_WITH_FILE_LOCATION:
7883         bbody = EXPR_WFL_NODE (bbody);
7884         break;
7885
7886       case COMPOUND_EXPR:
7887         if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0)))
7888           return 1;
7889         bbody = TREE_OPERAND (bbody, 1);
7890         break;
7891
7892       case MODIFY_EXPR:
7893         /* If we're generating to class file and we're dealing with an
7894            array initialization, we return 1 to keep <clinit> */
7895         if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT
7896             && flag_emit_class_files)
7897           return 1;
7898
7899         /* There are a few cases where we're required to keep
7900            <clinit>:
7901            - If this is an assignment whose operand is not constant,
7902            - If this is an assignment to a non-initialized field,
7903            - If this field is not a member of the current class.
7904         */
7905         return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1))
7906                 || ! DECL_INITIAL (TREE_OPERAND (bbody, 0))
7907                 || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class);
7908
7909       default:
7910         return 1;
7911       }
7912   return 0;
7913 }
7914
7915
7916 /* See whether we could get rid of <clinit>. Criteria are: all static
7917    final fields have constant initial values and the body of <clinit>
7918    is empty. Return 1 if <clinit> was discarded, 0 otherwise. */
7919
7920 static int
7921 maybe_yank_clinit (tree mdecl)
7922 {
7923   tree type, current;
7924   tree fbody, bbody;
7925
7926   if (!DECL_CLINIT_P (mdecl))
7927     return 0;
7928
7929   /* If the body isn't empty, then we keep <clinit>. Note that if
7930      we're emitting classfiles, this isn't enough not to rule it
7931      out. */
7932   fbody = DECL_FUNCTION_BODY (mdecl);
7933   bbody = BLOCK_EXPR_BODY (fbody);
7934   if (bbody && bbody != error_mark_node)
7935     bbody = BLOCK_EXPR_BODY (bbody);
7936   else
7937     return 0;
7938   if (bbody && ! flag_emit_class_files && !IS_EMPTY_STMT (bbody))
7939     return 0;
7940
7941   type = DECL_CONTEXT (mdecl);
7942   current = TYPE_FIELDS (type);
7943
7944   for (current = (current ? TREE_CHAIN (current) : current);
7945        current; current = TREE_CHAIN (current))
7946     {
7947       tree f_init;
7948
7949       /* We're not interested in non-static fields.  */
7950       if (!FIELD_STATIC (current))
7951         continue;
7952
7953       /* Nor in fields without initializers. */
7954       f_init = DECL_INITIAL (current);
7955       if (f_init == NULL_TREE)
7956         continue;
7957
7958       /* Anything that isn't String or a basic type is ruled out -- or
7959          if we know how to deal with it (when doing things natively) we
7960          should generated an empty <clinit> so that SUID are computed
7961          correctly. */
7962       if (! JSTRING_TYPE_P (TREE_TYPE (current))
7963           && ! JNUMERIC_TYPE_P (TREE_TYPE (current)))
7964         return 0;
7965
7966       if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init))
7967         return 0;
7968     }
7969
7970   /* Now we analyze the method body and look for something that
7971      isn't a MODIFY_EXPR */
7972   if (!IS_EMPTY_STMT (bbody) && analyze_clinit_body (type, bbody))
7973     return 0;
7974
7975   /* Get rid of <clinit> in the class' list of methods */
7976   if (TYPE_METHODS (type) == mdecl)
7977     TYPE_METHODS (type) = TREE_CHAIN (mdecl);
7978   else
7979     for (current = TYPE_METHODS (type); current;
7980          current = TREE_CHAIN (current))
7981       if (TREE_CHAIN (current) == mdecl)
7982         {
7983           TREE_CHAIN (current) = TREE_CHAIN (mdecl);
7984           break;
7985         }
7986
7987   return 1;
7988 }
7989
7990 /* Install the argument from MDECL. Suitable to completion and
7991    expansion of mdecl's body.  */
7992
7993 void
7994 start_complete_expand_method (tree mdecl)
7995 {
7996   tree tem;
7997
7998   pushlevel (1);                /* Prepare for a parameter push */
7999   tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
8000   DECL_ARGUMENTS (mdecl) = tem;
8001
8002   for (; tem; tem = TREE_CHAIN (tem))
8003     {
8004       /* TREE_CHAIN (tem) will change after pushdecl. */
8005       tree next = TREE_CHAIN (tem);
8006       tree type = TREE_TYPE (tem);
8007       if (targetm.calls.promote_prototypes (type)
8008           && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
8009           && INTEGRAL_TYPE_P (type))
8010         type = integer_type_node;
8011       DECL_ARG_TYPE (tem) = type;
8012       layout_decl (tem, 0);
8013       pushdecl (tem);
8014       /* Re-install the next so that the list is kept and the loop
8015          advances. */
8016       TREE_CHAIN (tem) = next;
8017     }
8018   pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8019   input_line = DECL_SOURCE_LINE (mdecl);
8020   build_result_decl (mdecl);
8021 }
8022
8023
8024 /* Complete and expand a method.  */
8025
8026 static void
8027 java_complete_expand_method (tree mdecl)
8028 {
8029   tree fbody, block_body, exception_copy;
8030
8031   current_function_decl = mdecl;
8032   /* Fix constructors before expanding them */
8033   if (DECL_CONSTRUCTOR_P (mdecl))
8034     fix_constructors (mdecl);
8035
8036   /* Expand functions that have a body */
8037   if (!DECL_FUNCTION_BODY (mdecl))
8038     return;
8039
8040   fbody = DECL_FUNCTION_BODY (mdecl);
8041   block_body = BLOCK_EXPR_BODY (fbody);
8042   exception_copy = NULL_TREE;
8043
8044   current_function_decl = mdecl;
8045
8046   if (! quiet_flag)
8047     fprintf (stderr, " [%s.",
8048              lang_printable_name (DECL_CONTEXT (mdecl), 0));
8049   announce_function (mdecl);
8050   if (! quiet_flag)
8051     fprintf (stderr, "]");
8052
8053   /* Prepare the function for tree completion */
8054   start_complete_expand_method (mdecl);
8055
8056   /* Install the current this */
8057   current_this = (!METHOD_STATIC (mdecl) ?
8058                   BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
8059
8060   /* Purge the `throws' list of unchecked exceptions (we save a copy
8061      of the list and re-install it later.) */
8062   exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl));
8063   purge_unchecked_exceptions (mdecl);
8064
8065   /* Install exceptions thrown with `throws' */
8066   PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
8067
8068   if (block_body != NULL_TREE)
8069     {
8070       block_body = java_complete_tree (block_body);
8071
8072       /* Before we check initialization, attached all class initialization
8073          variable to the block_body */
8074       htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (mdecl),
8075                      attach_init_test_initialization_flags, block_body);
8076
8077       if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
8078         {
8079           check_for_initialization (block_body, mdecl);
8080
8081           /* Go through all the flags marking the initialization of
8082              static variables and see whether they're definitively
8083              assigned, in which case the type is remembered as
8084              definitively initialized in MDECL. */
8085           if (STATIC_CLASS_INIT_OPT_P ())
8086             {
8087               /* Always register the context as properly initialized in
8088                  MDECL. This used with caution helps removing extra
8089                  initialization of self. */
8090               if (METHOD_STATIC (mdecl))
8091                 {
8092                   *(htab_find_slot
8093                     (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl),
8094                      DECL_CONTEXT (mdecl), INSERT)) = DECL_CONTEXT (mdecl);
8095                 }
8096             }
8097         }
8098       ctxp->explicit_constructor_p = 0;
8099     }
8100
8101   BLOCK_EXPR_BODY (fbody) = block_body;
8102
8103   /* If we saw a return but couldn't evaluate it properly, we'll have
8104      an error_mark_node here. */
8105   if (block_body != error_mark_node
8106       && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
8107       && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE
8108       && !flag_emit_xref)
8109     missing_return_error (current_function_decl);
8110
8111   /* See if we can get rid of <clinit> if MDECL happens to be <clinit> */
8112   maybe_yank_clinit (mdecl);
8113
8114   /* Pop the current level, with special measures if we found errors. */
8115   if (java_error_count)
8116     pushdecl_force_head (DECL_ARGUMENTS (mdecl));
8117   poplevel (1, 0, 1);
8118
8119   /* Pop the exceptions and sanity check */
8120   POP_EXCEPTIONS();
8121   if (currently_caught_type_list)
8122     abort ();
8123
8124   /* Restore the copy of the list of exceptions if emitting xrefs. */
8125   DECL_FUNCTION_THROWS (mdecl) = exception_copy;
8126 }
8127
8128 /* For with each class for which there's code to generate. */
8129
8130 static void
8131 java_expand_method_bodies (tree class)
8132 {
8133   tree decl;
8134   for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl))
8135     {
8136       tree block;
8137
8138       if (! DECL_FUNCTION_BODY (decl))
8139         continue;
8140
8141       current_function_decl = decl;
8142
8143       block = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
8144
8145       /* Save the function body for gimplify and inlining.  */
8146       DECL_SAVED_TREE (decl) = block;
8147
8148       /* It's time to assign the variable flagging static class
8149          initialization based on which classes invoked static methods
8150          are definitely initializing. This should be flagged. */
8151       if (STATIC_CLASS_INIT_OPT_P ())
8152         {
8153           tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl);
8154           for (; list != NULL_TREE;  list = TREE_CHAIN (list))
8155             {
8156               /* Executed for each statement calling a static function.
8157                  LIST is a TREE_LIST whose PURPOSE is the called function
8158                  and VALUE is a compound whose second operand can be patched
8159                  with static class initialization flag assignments.  */
8160
8161               tree called_method = TREE_PURPOSE (list);
8162               tree compound = TREE_VALUE (list);
8163               tree assignment_compound_list
8164                 = build_tree_list (called_method, NULL);
8165
8166               /* For each class definitely initialized in
8167                  CALLED_METHOD, fill ASSIGNMENT_COMPOUND with
8168                  assignment to the class initialization flag. */
8169               htab_traverse (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method),
8170                              emit_test_initialization,
8171                              assignment_compound_list);
8172
8173               if (TREE_VALUE (assignment_compound_list))
8174                 TREE_OPERAND (compound, 1)
8175                   = TREE_VALUE (assignment_compound_list);
8176             }
8177         }
8178
8179       /* Expand the function body.  */
8180       source_end_java_method ();
8181     }
8182 }
8183
8184 \f
8185
8186 /* This section of the code deals with accessing enclosing context
8187    fields either directly by using the relevant access to this$<n> or
8188    by invoking an access method crafted for that purpose.  */
8189
8190 /* Build the necessary access from an inner class to an outer
8191    class. This routine could be optimized to cache previous result
8192    (decl, current_class and returned access).  When an access method
8193    needs to be generated, it always takes the form of a read. It might
8194    be later turned into a write by calling outer_field_access_fix.  */
8195
8196 static tree
8197 build_outer_field_access (tree id, tree decl)
8198 {
8199   tree access = NULL_TREE;
8200   tree ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
8201   tree decl_ctx = DECL_CONTEXT (decl);
8202
8203   /* If the immediate enclosing context of the current class is the
8204      field decl's class or inherits from it; build the access as
8205      `this$<n>.<field>'. Note that we will break the `private' barrier
8206      if we're not emitting bytecodes. */
8207   if ((ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
8208       && (!FIELD_PRIVATE (decl) || !flag_emit_class_files ))
8209     {
8210       tree thisn = build_current_thisn (current_class);
8211       access = make_qualified_primary (build_wfl_node (thisn),
8212                                        id, EXPR_WFL_LINECOL (id));
8213     }
8214   /* Otherwise, generate access methods to outer this and access the
8215      field (either using an access method or by direct access.) */
8216   else
8217     {
8218       int lc = EXPR_WFL_LINECOL (id);
8219
8220       /* Now we chain the required number of calls to the access$0 to
8221          get a hold to the enclosing instance we need, and then we
8222          build the field access. */
8223       access = build_access_to_thisn (current_class, decl_ctx, lc);
8224
8225       /* If the field is private and we're generating bytecode, then
8226          we generate an access method */
8227       if (FIELD_PRIVATE (decl) && flag_emit_class_files )
8228         {
8229           tree name = build_outer_field_access_methods (decl);
8230           access = build_outer_field_access_expr (lc, decl_ctx,
8231                                                   name, access, NULL_TREE);
8232         }
8233       /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'.
8234          Once again we break the `private' access rule from a foreign
8235          class. */
8236       else
8237         access = make_qualified_primary (access, id, lc);
8238     }
8239   return resolve_expression_name (access, NULL);
8240 }
8241
8242 /* Return a nonzero value if NODE describes an outer field inner
8243    access.  */
8244
8245 static int
8246 outer_field_access_p (tree type, tree decl)
8247 {
8248   if (!INNER_CLASS_TYPE_P (type)
8249       || TREE_CODE (decl) != FIELD_DECL
8250       || DECL_CONTEXT (decl) == type)
8251     return 0;
8252
8253   /* If the inner class extends the declaration context of the field
8254      we're trying to access, then this isn't an outer field access */
8255   if (inherits_from_p (type, DECL_CONTEXT (decl)))
8256     return 0;
8257
8258   for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ;
8259        type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))))
8260     {
8261       if (type == DECL_CONTEXT (decl))
8262         return 1;
8263
8264       if (!DECL_CONTEXT (TYPE_NAME (type)))
8265         {
8266           /* Before we give up, see whether the field is inherited from
8267              the enclosing context we're considering. */
8268           if (inherits_from_p (type, DECL_CONTEXT (decl)))
8269             return 1;
8270           break;
8271         }
8272     }
8273
8274   return 0;
8275 }
8276
8277 /* Return a nonzero value if NODE represents an outer field inner
8278    access that was been already expanded. As a side effect, it returns
8279    the name of the field being accessed and the argument passed to the
8280    access function, suitable for a regeneration of the access method
8281    call if necessary. */
8282
8283 static int
8284 outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
8285                                tree *arg)
8286 {
8287   int identified = 0;
8288
8289   if (TREE_CODE (node) != CALL_EXPR)
8290     return 0;
8291
8292   /* Well, gcj generates slightly different tree nodes when compiling
8293      to native or bytecodes. It's the case for function calls. */
8294
8295   if (flag_emit_class_files
8296       && TREE_CODE (node) == CALL_EXPR
8297       && OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
8298     identified = 1;
8299   else if (!flag_emit_class_files)
8300     {
8301       node = TREE_OPERAND (node, 0);
8302
8303       if (node && TREE_OPERAND (node, 0)
8304           && TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)
8305         {
8306           node = TREE_OPERAND (node, 0);
8307           if (TREE_OPERAND (node, 0)
8308               && TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
8309               && (OUTER_FIELD_ACCESS_IDENTIFIER_P
8310                   (DECL_NAME (TREE_OPERAND (node, 0)))))
8311             identified = 1;
8312         }
8313     }
8314
8315   if (identified && name && arg_type && arg)
8316     {
8317       tree argument = TREE_OPERAND (node, 1);
8318       *name = DECL_NAME (TREE_OPERAND (node, 0));
8319       *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
8320       *arg = TREE_VALUE (argument);
8321     }
8322   return identified;
8323 }
8324
8325 /* Detect in NODE an outer field read access from an inner class and
8326    transform it into a write with RHS as an argument. This function is
8327    called from the java_complete_lhs when an assignment to a LHS can
8328    be identified. */
8329
8330 static tree
8331 outer_field_access_fix (tree wfl, tree node, tree rhs)
8332 {
8333   tree name, arg_type, arg;
8334
8335   if (outer_field_expanded_access_p (node, &name, &arg_type, &arg))
8336     {
8337       node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl),
8338                                             arg_type, name, arg, rhs);
8339       return java_complete_tree (node);
8340     }
8341   return NULL_TREE;
8342 }
8343
8344 /* Construct the expression that calls an access method:
8345      <type>.access$<n>(<arg1> [, <arg2>]);
8346
8347    ARG2 can be NULL and will be omitted in that case. It will denote a
8348    read access.  */
8349
8350 static tree
8351 build_outer_field_access_expr (int lc, tree type, tree access_method_name,
8352                                tree arg1, tree arg2)
8353 {
8354   tree args, cn, access;
8355
8356   args = arg1 ? arg1 :
8357     build_wfl_node (build_current_thisn (current_class));
8358   args = build_tree_list (NULL_TREE, args);
8359
8360   if (arg2)
8361     args = tree_cons (NULL_TREE, arg2, args);
8362
8363   access = build_method_invocation (build_wfl_node (access_method_name), args);
8364   cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
8365   return make_qualified_primary (cn, access, lc);
8366 }
8367
8368 static tree
8369 build_new_access_id (void)
8370 {
8371   static int access_n_counter = 1;
8372   char buffer [128];
8373
8374   sprintf (buffer, "access$%d", access_n_counter++);
8375   return get_identifier (buffer);
8376 }
8377
8378 /* Create the static access functions for the outer field DECL. We define a
8379    read:
8380      TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
8381        return inst$.field;
8382      }
8383    and a write access:
8384      TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$,
8385                                      TREE_TYPE (<field>) value$) {
8386        return inst$.field = value$;
8387      }
8388    We should have a usage flags on the DECL so we can lazily turn the ones
8389    we're using for code generation. FIXME.
8390 */
8391
8392 static tree
8393 build_outer_field_access_methods (tree decl)
8394 {
8395   tree id, args, stmt, mdecl;
8396
8397   if (FIELD_INNER_ACCESS_P (decl))
8398     return FIELD_INNER_ACCESS (decl);
8399
8400   MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
8401
8402   /* Create the identifier and a function named after it. */
8403   id = build_new_access_id ();
8404
8405   /* The identifier is marked as bearing the name of a generated write
8406      access function for outer field accessed from inner classes. */
8407   OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8408
8409   /* Create the read access */
8410   args = build_tree_list (inst_id, build_pointer_type (DECL_CONTEXT (decl)));
8411   TREE_CHAIN (args) = end_params_node;
8412   stmt = make_qualified_primary (build_wfl_node (inst_id),
8413                                  build_wfl_node (DECL_NAME (decl)), 0);
8414   stmt = build_return (0, stmt);
8415   mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8416                                            TREE_TYPE (decl), id, args, stmt);
8417   DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8418
8419   /* Create the write access method. No write access for final variable */
8420   if (!FIELD_FINAL (decl))
8421     {
8422       args = build_tree_list (inst_id,
8423                               build_pointer_type (DECL_CONTEXT (decl)));
8424       TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
8425       TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
8426       stmt = make_qualified_primary (build_wfl_node (inst_id),
8427                                      build_wfl_node (DECL_NAME (decl)), 0);
8428       stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
8429                                                 build_wfl_node (wpv_id)));
8430       mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
8431                                                TREE_TYPE (decl), id,
8432                                                args, stmt);
8433     }
8434   DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
8435
8436   /* Return the access name */
8437   return FIELD_INNER_ACCESS (decl) = id;
8438 }
8439
8440 /* Build an field access method NAME.  */
8441
8442 static tree
8443 build_outer_field_access_method (tree class, tree type, tree name,
8444                                  tree args, tree body)
8445 {
8446   tree saved_current_function_decl, mdecl;
8447
8448   /* Create the method */
8449   mdecl = create_artificial_method (class, ACC_STATIC, type, name, args);
8450   fix_method_argument_names (args, mdecl);
8451   layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8452
8453   /* Attach the method body. */
8454   saved_current_function_decl = current_function_decl;
8455   start_artificial_method_body (mdecl);
8456   java_method_add_stmt (mdecl, body);
8457   end_artificial_method_body (mdecl);
8458   current_function_decl = saved_current_function_decl;
8459
8460   return mdecl;
8461 }
8462
8463 \f
8464 /* This section deals with building access function necessary for
8465    certain kinds of method invocation from inner classes.  */
8466
8467 static tree
8468 build_outer_method_access_method (tree decl)
8469 {
8470   tree saved_current_function_decl, mdecl;
8471   tree args = NULL_TREE, call_args = NULL_TREE;
8472   tree carg, id, body, class;
8473   char buffer [80];
8474   int parm_id_count = 0;
8475
8476   /* Test this abort with an access to a private field */
8477   if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "access$"))
8478     abort ();
8479
8480   /* Check the cache first */
8481   if (DECL_FUNCTION_INNER_ACCESS (decl))
8482     return DECL_FUNCTION_INNER_ACCESS (decl);
8483
8484   class = DECL_CONTEXT (decl);
8485
8486   /* Obtain an access identifier and mark it */
8487   id = build_new_access_id ();
8488   OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
8489
8490   carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
8491   /* Create the arguments, as much as the original */
8492   for (; carg && carg != end_params_node;
8493        carg = TREE_CHAIN (carg))
8494     {
8495       sprintf (buffer, "write_parm_value$%d", parm_id_count++);
8496       args = chainon (args, build_tree_list (get_identifier (buffer),
8497                                              TREE_VALUE (carg)));
8498     }
8499   args = chainon (args, end_params_node);
8500
8501   /* Create the method */
8502   mdecl = create_artificial_method (class, ACC_STATIC,
8503                                     TREE_TYPE (TREE_TYPE (decl)), id, args);
8504   layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8505   /* There is a potential bug here. We should be able to use
8506      fix_method_argument_names, but then arg names get mixed up and
8507      eventually a constructor will have its this$0 altered and the
8508      outer context won't be assignment properly. The testcase is
8509      stub.java FIXME */
8510   TYPE_ARG_TYPES (TREE_TYPE (mdecl)) = args;
8511
8512   /* Attach the method body. */
8513   saved_current_function_decl = current_function_decl;
8514   start_artificial_method_body (mdecl);
8515
8516   /* The actual method invocation uses the same args. When invoking a
8517      static methods that way, we don't want to skip the first
8518      argument. */
8519   carg = args;
8520   if (!METHOD_STATIC (decl))
8521     carg = TREE_CHAIN (carg);
8522   for (; carg && carg != end_params_node; carg = TREE_CHAIN (carg))
8523     call_args = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (carg)),
8524                            call_args);
8525
8526   body = build_method_invocation (build_wfl_node (DECL_NAME (decl)),
8527                                   call_args);
8528   if (!METHOD_STATIC (decl))
8529     body = make_qualified_primary (build_wfl_node (TREE_PURPOSE (args)),
8530                                    body, 0);
8531   if (TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
8532     body = build_return (0, body);
8533   java_method_add_stmt (mdecl,body);
8534   end_artificial_method_body (mdecl);
8535   current_function_decl = saved_current_function_decl;
8536
8537   /* Back tag the access function so it know what it accesses */
8538   DECL_FUNCTION_ACCESS_DECL (decl) = mdecl;
8539
8540   /* Tag the current method so it knows it has an access generated */
8541   return DECL_FUNCTION_INNER_ACCESS (decl) = mdecl;
8542 }
8543
8544 \f
8545 /* This section of the code deals with building expressions to access
8546    the enclosing instance of an inner class. The enclosing instance is
8547    kept in a generated field called this$<n>, with <n> being the
8548    inner class nesting level (starting from 0.)  */
8549
8550 /* Build an access to a given this$<n>, always chaining access call to
8551    others. Access methods to this$<n> are build on the fly if
8552    necessary. This CAN'T be used to solely access this$<n-1> from
8553    this$<n> (which alway yield to special cases and optimization, see
8554    for example build_outer_field_access).  */
8555
8556 static tree
8557 build_access_to_thisn (tree from, tree to, int lc)
8558 {
8559   tree access = NULL_TREE;
8560
8561   while (from != to && PURE_INNER_CLASS_TYPE_P (from))
8562     {
8563       if (!access)
8564         {
8565           access = build_current_thisn (from);
8566           access = build_wfl_node (access);
8567         }
8568       else
8569         {
8570           tree access0_wfl, cn;
8571
8572           maybe_build_thisn_access_method (from);
8573           access0_wfl = build_wfl_node (access0_identifier_node);
8574           cn = build_wfl_node (DECL_NAME (TYPE_NAME (from)));
8575           EXPR_WFL_LINECOL (access0_wfl) = lc;
8576           access = build_tree_list (NULL_TREE, access);
8577           access = build_method_invocation (access0_wfl, access);
8578           access = make_qualified_primary (cn, access, lc);
8579         }
8580
8581       /* If FROM isn't an inner class, that's fine, we've done enough.
8582          What we're looking for can be accessed from there.  */
8583       from = DECL_CONTEXT (TYPE_NAME (from));
8584       if (!from)
8585         break;
8586       from = TREE_TYPE (from);
8587     }
8588   return access;
8589 }
8590
8591 /* Build an access function to the this$<n> local to TYPE. NULL_TREE
8592    is returned if nothing needs to be generated. Otherwise, the method
8593    generated and a method decl is returned.
8594
8595    NOTE: These generated methods should be declared in a class file
8596    attribute so that they can't be referred to directly.  */
8597
8598 static tree
8599 maybe_build_thisn_access_method (tree type)
8600 {
8601   tree mdecl, args, stmt, rtype;
8602   tree saved_current_function_decl;
8603
8604   /* If TYPE is a top-level class, no access method is required.
8605      If there already is such an access method, bail out. */
8606   if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type))
8607     return NULL_TREE;
8608
8609   /* We generate the method. The method looks like:
8610      static <outer_of_type> access$0 (<type> inst$) { return inst$.this$<n>; }
8611   */
8612   args = build_tree_list (inst_id, build_pointer_type (type));
8613   TREE_CHAIN (args) = end_params_node;
8614   rtype = build_pointer_type (TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))));
8615   mdecl = create_artificial_method (type, ACC_STATIC, rtype,
8616                                     access0_identifier_node, args);
8617   fix_method_argument_names (args, mdecl);
8618   layout_class_method (type, NULL_TREE, mdecl, NULL_TREE);
8619   stmt = build_current_thisn (type);
8620   stmt = make_qualified_primary (build_wfl_node (inst_id),
8621                                  build_wfl_node (stmt), 0);
8622   stmt = build_return (0, stmt);
8623
8624   saved_current_function_decl = current_function_decl;
8625   start_artificial_method_body (mdecl);
8626   java_method_add_stmt (mdecl, stmt);
8627   end_artificial_method_body (mdecl);
8628   current_function_decl = saved_current_function_decl;
8629
8630   CLASS_ACCESS0_GENERATED_P (type) = 1;
8631
8632   return mdecl;
8633 }
8634
8635 /* Craft an correctly numbered `this$<n>'string. this$0 is used for
8636    the first level of innerclassing. this$1 for the next one, etc...
8637    This function can be invoked with TYPE to NULL, available and then
8638    has to count the parser context.  */
8639
8640 static GTY(()) tree saved_thisn;
8641 static GTY(()) tree saved_type;
8642
8643 static tree
8644 build_current_thisn (tree type)
8645 {
8646   static int saved_i = -1;
8647   static int saved_type_i = 0;
8648   tree decl;
8649   char buffer [24];
8650   int i = 0;
8651
8652   if (type)
8653     {
8654       if (type == saved_type)
8655         i = saved_type_i;
8656       else
8657         {
8658           for (i = -1, decl = DECL_CONTEXT (TYPE_NAME (type));
8659                decl; decl = DECL_CONTEXT (decl), i++)
8660             ;
8661
8662           saved_type = type;
8663           saved_type_i = i;
8664         }
8665     }
8666   else
8667     i = list_length (GET_CPC_LIST ())-2;
8668
8669   if (i == saved_i)
8670     return saved_thisn;
8671
8672   sprintf (buffer, "this$%d", i);
8673   saved_i = i;
8674   saved_thisn = get_identifier (buffer);
8675   return saved_thisn;
8676 }
8677
8678 /* Return the assignment to the hidden enclosing context `this$<n>'
8679    by the second incoming parameter to the innerclass constructor. The
8680    form used is `this.this$<n> = this$<n>;'.  */
8681
8682 static tree
8683 build_thisn_assign (void)
8684 {
8685   if (current_class && PURE_INNER_CLASS_TYPE_P (current_class))
8686     {
8687       tree thisn = build_current_thisn (current_class);
8688       tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
8689                                          build_wfl_node (thisn), 0);
8690       tree rhs = build_wfl_node (thisn);
8691       EXPR_WFL_SET_LINECOL (lhs, input_line, 0);
8692       return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
8693     }
8694   return NULL_TREE;
8695 }
8696
8697 \f
8698 /* Building the synthetic `class$' used to implement the `.class' 1.1
8699    extension for non primitive types. This method looks like:
8700
8701     static Class class$(String type) throws NoClassDefFoundError
8702     {
8703       try {return (java.lang.Class.forName (String));}
8704       catch (ClassNotFoundException e) {
8705         throw new NoClassDefFoundError(e.getMessage());}
8706     } */
8707
8708 static GTY(()) tree get_message_wfl;
8709 static GTY(()) tree type_parm_wfl;
8710
8711 static tree
8712 build_dot_class_method (tree class)
8713 {
8714 #define BWF(S) build_wfl_node (get_identifier ((S)))
8715 #define MQN(X,Y) make_qualified_name ((X), (Y), 0)
8716   tree args, tmp, saved_current_function_decl, mdecl, qual_name;
8717   tree stmt, throw_stmt;
8718
8719   if (!get_message_wfl)
8720     {
8721       get_message_wfl = build_wfl_node (get_identifier ("getMessage"));
8722       type_parm_wfl = build_wfl_node (get_identifier ("type$"));
8723     }
8724
8725   /* Build the arguments */
8726   args = build_tree_list (get_identifier ("type$"),
8727                           build_pointer_type (string_type_node));
8728   TREE_CHAIN (args) = end_params_node;
8729
8730   /* Build the qualified name java.lang.Class.forName */
8731   tmp = MQN (MQN (MQN (BWF ("java"),
8732                        BWF ("lang")), BWF ("Class")), BWF ("forName"));
8733
8734   /* Create the "class$" function */
8735   mdecl = create_artificial_method (class, ACC_STATIC,
8736                                     build_pointer_type (class_type_node),
8737                                     classdollar_identifier_node, args);
8738   qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8739                    BWF ("NoClassDefFoundError"));
8740   DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, qual_name);
8741   register_incomplete_type (JDEP_EXCEPTION, qual_name, NULL_TREE, NULL_TREE);
8742   JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
8743     &TREE_VALUE (DECL_FUNCTION_THROWS (mdecl));
8744
8745   /* We start by building the try block. We need to build:
8746        return (java.lang.Class.forName (type)); */
8747   stmt = build_method_invocation (tmp,
8748                                   build_tree_list (NULL_TREE, type_parm_wfl));
8749   stmt = build_return (0, stmt);
8750
8751   /* Now onto the catch block. We start by building the expression
8752      throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
8753   throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
8754                                     get_message_wfl, 0);
8755   throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
8756
8757   /* Build new NoClassDefFoundError (_.getMessage) */
8758   throw_stmt = build_new_invocation
8759     (build_wfl_node (get_identifier ("NoClassDefFoundError")),
8760      build_tree_list (build_pointer_type (string_type_node), throw_stmt));
8761
8762   /* Build the throw, (it's too early to use BUILD_THROW) */
8763   throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt);
8764
8765   /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */
8766   qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
8767                    BWF ("ClassNotFoundException"));
8768   stmt = encapsulate_with_try_catch (0, qual_name, stmt, throw_stmt);
8769
8770   fix_method_argument_names (args, mdecl);
8771   layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
8772   saved_current_function_decl = current_function_decl;
8773   start_artificial_method_body (mdecl);
8774   java_method_add_stmt (mdecl, stmt);
8775   end_artificial_method_body (mdecl);
8776   current_function_decl = saved_current_function_decl;
8777   TYPE_DOT_CLASS (class) = mdecl;
8778
8779   return mdecl;
8780 }
8781
8782 static tree
8783 build_dot_class_method_invocation (tree this_class, tree type)
8784 {
8785   tree dot_class_method = TYPE_DOT_CLASS (this_class);
8786   tree sig_id, s, t;
8787
8788   if (TYPE_ARRAY_P (type))
8789     sig_id = build_java_signature (type);
8790   else
8791     sig_id = DECL_NAME (TYPE_NAME (type));
8792
8793   /* Ensure that the proper name separator is used */
8794   sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id),
8795                                IDENTIFIER_LENGTH (sig_id));
8796
8797   s = build_string (IDENTIFIER_LENGTH (sig_id),
8798                     IDENTIFIER_POINTER (sig_id));
8799   t = build_method_invocation (build_wfl_node (DECL_NAME (dot_class_method)),
8800                                build_tree_list (NULL_TREE, s));
8801   if (DECL_CONTEXT (dot_class_method) != this_class)
8802     {
8803       tree class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (dot_class_method)));
8804       t = make_qualified_primary (build_wfl_node (class_name), t, 0);
8805     }
8806   return t;
8807 }
8808
8809 /* This section of the code deals with constructor.  */
8810
8811 /* Craft a body for default constructor. Patch existing constructor
8812    bodies with call to super() and field initialization statements if
8813    necessary.  */
8814
8815 static void
8816 fix_constructors (tree mdecl)
8817 {
8818   tree iii;                     /* Instance Initializer Invocation */
8819   tree body = DECL_FUNCTION_BODY (mdecl);
8820   tree thisn_assign, compound = NULL_TREE;
8821   tree class_type = DECL_CONTEXT (mdecl);
8822
8823   if (DECL_FIXED_CONSTRUCTOR_P (mdecl))
8824     return;
8825   DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
8826
8827   if (!body)
8828     {
8829       /* It is an error for the compiler to generate a default
8830          constructor if the superclass doesn't have a constructor that
8831          takes no argument, or the same args for an anonymous class */
8832       if (verify_constructor_super (mdecl))
8833         {
8834           tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (class_type));
8835           tree save = DECL_NAME (mdecl);
8836           const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
8837           DECL_NAME (mdecl) = DECL_NAME (sclass_decl);
8838           parse_error_context
8839             (lookup_cl (TYPE_NAME (class_type)),
8840              "No constructor matching `%s' found in class `%s'",
8841              lang_printable_name (mdecl, 0), n);
8842           DECL_NAME (mdecl) = save;
8843         }
8844
8845       /* The constructor body must be crafted by hand. It's the
8846          constructor we defined when we realize we didn't have the
8847          CLASSNAME() constructor */
8848       start_artificial_method_body (mdecl);
8849
8850       /* Insert an assignment to the this$<n> hidden field, if
8851          necessary */
8852       if ((thisn_assign = build_thisn_assign ()))
8853         java_method_add_stmt (mdecl, thisn_assign);
8854
8855       /* We don't generate a super constructor invocation if we're
8856          compiling java.lang.Object. build_super_invocation takes care
8857          of that. */
8858       java_method_add_stmt (mdecl, build_super_invocation (mdecl));
8859
8860       /* FIXME */
8861       if ((iii = build_instinit_invocation (class_type)))
8862         java_method_add_stmt (mdecl, iii);
8863
8864       end_artificial_method_body (mdecl);
8865     }
8866   /* Search for an explicit constructor invocation */
8867   else
8868     {
8869       int found = 0;
8870       int invokes_this = 0;
8871       tree found_call = NULL_TREE;
8872       tree main_block = BLOCK_EXPR_BODY (body);
8873
8874       while (body)
8875         switch (TREE_CODE (body))
8876           {
8877           case CALL_EXPR:
8878             found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
8879             if (CALL_THIS_CONSTRUCTOR_P (body))
8880               invokes_this = 1;
8881             body = NULL_TREE;
8882             break;
8883           case COMPOUND_EXPR:
8884           case EXPR_WITH_FILE_LOCATION:
8885             found_call = body;
8886             body = TREE_OPERAND (body, 0);
8887             break;
8888           case BLOCK:
8889             found_call = body;
8890             body = BLOCK_EXPR_BODY (body);
8891             break;
8892           default:
8893             found = 0;
8894             body = NULL_TREE;
8895           }
8896
8897       /* Generate the assignment to this$<n>, if necessary */
8898       if ((thisn_assign = build_thisn_assign ()))
8899         compound = add_stmt_to_compound (compound, NULL_TREE, thisn_assign);
8900
8901       /* The constructor is missing an invocation of super() */
8902       if (!found)
8903         compound = add_stmt_to_compound (compound, NULL_TREE,
8904                                          build_super_invocation (mdecl));
8905       /* Explicit super() invocation should take place before the
8906          instance initializer blocks. */
8907       else
8908         {
8909           compound = add_stmt_to_compound (compound, NULL_TREE,
8910                                            TREE_OPERAND (found_call, 0));
8911           TREE_OPERAND (found_call, 0) = build_java_empty_stmt ();
8912         }
8913
8914       DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
8915
8916       /* Insert the instance initializer block right after. */
8917       if (!invokes_this && (iii = build_instinit_invocation (class_type)))
8918         compound = add_stmt_to_compound (compound, NULL_TREE, iii);
8919
8920       /* Fix the constructor main block if we're adding extra stmts */
8921       if (compound)
8922         {
8923           compound = add_stmt_to_compound (compound, NULL_TREE,
8924                                            BLOCK_EXPR_BODY (main_block));
8925           BLOCK_EXPR_BODY (main_block) = compound;
8926         }
8927     }
8928 }
8929
8930 /* Browse constructors in the super class, searching for a constructor
8931    that doesn't take any argument. Return 0 if one is found, 1
8932    otherwise.  If the current class is an anonymous inner class, look
8933    for something that has the same signature. */
8934
8935 static int
8936 verify_constructor_super (tree mdecl)
8937 {
8938   tree class = CLASSTYPE_SUPER (current_class);
8939   int super_inner = PURE_INNER_CLASS_TYPE_P (class);
8940   tree sdecl;
8941
8942   if (!class)
8943     return 0;
8944
8945   if (ANONYMOUS_CLASS_P (current_class))
8946     {
8947       tree mdecl_arg_type;
8948       SKIP_THIS_AND_ARTIFICIAL_PARMS (mdecl_arg_type, mdecl);
8949       for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
8950         if (DECL_CONSTRUCTOR_P (sdecl))
8951           {
8952             tree m_arg_type;
8953             tree arg_type = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
8954             if (super_inner)
8955               arg_type = TREE_CHAIN (arg_type);
8956             for (m_arg_type = mdecl_arg_type;
8957                  (arg_type != end_params_node
8958                   && m_arg_type != end_params_node);
8959                  arg_type = TREE_CHAIN (arg_type),
8960                    m_arg_type = TREE_CHAIN (m_arg_type))
8961               if (!valid_method_invocation_conversion_p
8962                      (TREE_VALUE (arg_type),
8963                       TREE_VALUE (m_arg_type)))
8964                 break;
8965
8966             if (arg_type == end_params_node && m_arg_type == end_params_node)
8967               return 0;
8968           }
8969     }
8970   else
8971     {
8972       for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
8973         {
8974           tree arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
8975           if (super_inner)
8976             arg = TREE_CHAIN (arg);
8977           if (DECL_CONSTRUCTOR_P (sdecl) && arg == end_params_node)
8978             return 0;
8979         }
8980     }
8981   return 1;
8982 }
8983
8984 /* Generate code for all context remembered for code generation.  */
8985
8986 static GTY(()) tree reversed_class_list;
8987 void
8988 java_expand_classes (void)
8989 {
8990   int save_error_count = 0;
8991   static struct parser_ctxt *cur_ctxp = NULL;
8992
8993   java_parse_abort_on_error ();
8994   if (!(ctxp = ctxp_for_generation))
8995     return;
8996   java_layout_classes ();
8997   java_parse_abort_on_error ();
8998
8999   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9000     {
9001       tree current;
9002       for (current = cur_ctxp->class_list; 
9003            current; 
9004            current = TREE_CHAIN (current))
9005         gen_indirect_dispatch_tables (TREE_TYPE (current));
9006     }
9007   
9008   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9009     {
9010       ctxp = cur_ctxp;
9011       input_filename = ctxp->filename;
9012       lang_init_source (2);            /* Error msgs have method prototypes */
9013       java_complete_expand_classes (); /* Complete and expand classes */
9014       java_parse_abort_on_error ();
9015     }
9016   input_filename = main_input_filename;
9017
9018   /* Find anonymous classes and expand their constructor. This extra pass is
9019      necessary because the constructor itself is only generated when the
9020      method in which it is defined is expanded. */
9021   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9022     {
9023       tree current;
9024       ctxp = cur_ctxp;
9025       for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9026         {
9027           output_class = current_class = TREE_TYPE (current);
9028           if (ANONYMOUS_CLASS_P (current_class))
9029             {
9030               tree d;
9031               for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9032                 {
9033                   if (DECL_CONSTRUCTOR_P (d))
9034                     {
9035                       restore_line_number_status (1);
9036                       java_complete_expand_method (d);
9037                       restore_line_number_status (0);
9038                       break;    /* There is only one constructor. */
9039                     }
9040                 }
9041             }
9042         }
9043     }
9044
9045   /* Expanding the constructors of anonymous classes generates access
9046      methods.  Scan all the methods looking for null DECL_RESULTs --
9047      this will be the case if a method hasn't been expanded.  */
9048   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9049     {
9050       tree current;
9051       ctxp = cur_ctxp;
9052       for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9053         {
9054           tree d;
9055           output_class = current_class = TREE_TYPE (current);
9056           for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9057             {
9058               if (DECL_RESULT (d) == NULL_TREE)
9059                 {
9060                   restore_line_number_status (1);
9061                   java_complete_expand_method (d);
9062                   restore_line_number_status (0);
9063                 }
9064             }
9065         }
9066     }
9067
9068   /* ???  Instead of all this we could iterate around the list of
9069      classes until there were no more un-expanded methods.  It would
9070      take a little longer -- one pass over the whole list of methods
9071      -- but it would be simpler.  Like this:  */
9072 #if 0
9073     {
9074       int something_changed;
9075     
9076       do
9077         {
9078           something_changed = 0;
9079           for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9080             {
9081               tree current;
9082               ctxp = cur_ctxp;
9083               for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9084                 {
9085                   tree d;
9086                   output_class = current_class = TREE_TYPE (current);
9087                   for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
9088                     {
9089                       if (DECL_RESULT (d) == NULL_TREE)
9090                         {
9091                           something_changed = 1;
9092                           restore_line_number_status (1);
9093                           java_complete_expand_method (d);
9094                           restore_line_number_status (0);
9095                         }
9096                     }
9097                 }
9098             }
9099         }
9100       while (something_changed);
9101     }
9102 #endif
9103
9104   /* If we've found error at that stage, don't try to generate
9105      anything, unless we're emitting xrefs or checking the syntax only
9106      (but not using -fsyntax-only for the purpose of generating
9107      bytecode. */
9108   if (java_error_count && !flag_emit_xref
9109       && (!flag_syntax_only && !flag_emit_class_files))
9110     return;
9111
9112   /* Now things are stable, go for generation of the class data. */
9113
9114   /* We pessimistically marked all methods and fields external until
9115      we knew what set of classes we were planning to compile.  Now mark
9116      those that will be generated locally as not external.  */
9117   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9118     {
9119       tree current;
9120       ctxp = cur_ctxp;
9121       for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9122         java_mark_class_local (TREE_TYPE (current));
9123     }
9124
9125   /* Compile the classes.  */
9126   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9127     {
9128       tree current;
9129       reversed_class_list = NULL;
9130
9131       ctxp = cur_ctxp;
9132
9133       /* We write out the classes in reverse order.  This ensures that
9134          inner classes are written before their containing classes,
9135          which is important for parallel builds.  Otherwise, the
9136          class file for the outer class may be found, but the class
9137          file for the inner class may not be present.  In that
9138          situation, the compiler cannot fall back to the original
9139          source, having already read the outer class, so we must
9140          prevent that situation.  */
9141       for (current = ctxp->class_list;
9142            current;
9143            current = TREE_CHAIN (current))
9144         reversed_class_list
9145           = tree_cons (NULL_TREE, current, reversed_class_list);
9146
9147       for (current = reversed_class_list;
9148            current;
9149            current = TREE_CHAIN (current))
9150         {
9151           output_class = current_class = TREE_TYPE (TREE_VALUE (current));
9152           if (flag_emit_class_files)
9153             write_classfile (current_class);
9154           if (flag_emit_xref)
9155             expand_xref (current_class);
9156           else if (! flag_syntax_only)
9157             java_expand_method_bodies (current_class);
9158         }
9159     }
9160 }
9161
9162 void
9163 java_finish_classes (void)
9164 {
9165   static struct parser_ctxt *cur_ctxp = NULL;
9166   for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
9167     {
9168       tree current;
9169       ctxp = cur_ctxp;
9170       for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
9171         {
9172           output_class = current_class = TREE_TYPE (current);
9173           finish_class ();
9174         }
9175     }
9176 }
9177
9178 /* Wrap non WFL PRIMARY around a WFL and set EXPR_WFL_QUALIFICATION to
9179    a tree list node containing RIGHT. Fore coming RIGHTs will be
9180    chained to this hook. LOCATION contains the location of the
9181    separating `.' operator.  */
9182
9183 static tree
9184 make_qualified_primary (tree primary, tree right, int location)
9185 {
9186   tree wfl;
9187
9188   if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
9189     wfl = build_wfl_wrap (primary, location);
9190   else
9191     {
9192       wfl = primary;
9193       /* If wfl wasn't qualified, we build a first anchor */
9194       if (!EXPR_WFL_QUALIFICATION (wfl))
9195         EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (wfl, NULL_TREE);
9196     }
9197
9198   /* And chain them */
9199   EXPR_WFL_LINECOL (right) = location;
9200   chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
9201   PRIMARY_P (wfl) =  1;
9202   return wfl;
9203 }
9204
9205 /* Simple merge of two name separated by a `.' */
9206
9207 static tree
9208 merge_qualified_name (tree left, tree right)
9209 {
9210   tree node;
9211   if (!left && !right)
9212     return NULL_TREE;
9213
9214   if (!left)
9215     return right;
9216
9217   if (!right)
9218     return left;
9219
9220   obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
9221                 IDENTIFIER_LENGTH (left));
9222   obstack_1grow (&temporary_obstack, '.');
9223   obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
9224                  IDENTIFIER_LENGTH (right));
9225   node =  get_identifier (obstack_base (&temporary_obstack));
9226   obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
9227   QUALIFIED_P (node) = 1;
9228   return node;
9229 }
9230
9231 /* Merge the two parts of a qualified name into LEFT.  Set the
9232    location information of the resulting node to LOCATION, usually
9233    inherited from the location information of the `.' operator. */
9234
9235 static tree
9236 make_qualified_name (tree left, tree right, int location)
9237 {
9238 #ifdef USE_COMPONENT_REF
9239   tree node = build (COMPONENT_REF, NULL_TREE, left, right, NULL_TREE);
9240   EXPR_WFL_LINECOL (node) = location;
9241   return node;
9242 #else
9243   tree left_id = EXPR_WFL_NODE (left);
9244   tree right_id = EXPR_WFL_NODE (right);
9245   tree wfl, merge;
9246
9247   merge = merge_qualified_name (left_id, right_id);
9248
9249   /* Left wasn't qualified and is now qualified */
9250   if (!QUALIFIED_P (left_id))
9251     {
9252       tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
9253       EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
9254       EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
9255     }
9256
9257   wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
9258   EXPR_WFL_LINECOL (wfl) = location;
9259   chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
9260
9261   EXPR_WFL_NODE (left) = merge;
9262   return left;
9263 #endif
9264 }
9265
9266 /* Extract the last identifier component of the qualified in WFL. The
9267    last identifier is removed from the linked list */
9268
9269 static tree
9270 cut_identifier_in_qualified (tree wfl)
9271 {
9272   tree q;
9273   tree previous = NULL_TREE;
9274   for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
9275     if (!TREE_CHAIN (q))
9276       {
9277         if (!previous)
9278           /* Operating on a non qualified qualified WFL.  */
9279           abort ();
9280
9281         TREE_CHAIN (previous) = NULL_TREE;
9282         return TREE_PURPOSE (q);
9283       }
9284 }
9285
9286 /* Resolve the expression name NAME. Return its decl.  */
9287
9288 static tree
9289 resolve_expression_name (tree id, tree *orig)
9290 {
9291   tree name = EXPR_WFL_NODE (id);
9292   tree decl;
9293
9294   /* 6.5.5.1: Simple expression names */
9295   if (!PRIMARY_P (id) && !QUALIFIED_P (name))
9296     {
9297       /* 15.13.1: NAME can appear within the scope of a local variable
9298          declaration */
9299       if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
9300         return decl;
9301
9302       /* 15.13.1: NAME can appear within a class declaration */
9303       else
9304         {
9305           decl = lookup_field_wrapper (current_class, name);
9306           if (decl)
9307             {
9308               tree access = NULL_TREE;
9309               int fs = FIELD_STATIC (decl);
9310
9311               /* If we're accessing an outer scope local alias, make
9312                  sure we change the name of the field we're going to
9313                  build access to. */
9314               if (FIELD_LOCAL_ALIAS_USED (decl))
9315                 name = DECL_NAME (decl);
9316
9317               check_deprecation (id, decl);
9318
9319               /* Instance variable (8.3.1.1) can't appear within
9320                  static method, static initializer or initializer for
9321                  a static variable. */
9322               if (!fs && METHOD_STATIC (current_function_decl))
9323                 {
9324                   static_ref_err (id, name, current_class);
9325                   return error_mark_node;
9326                 }
9327               /* Instance variables can't appear as an argument of
9328                  an explicit constructor invocation */
9329               if (!fs && ctxp->explicit_constructor_p
9330                   && !enclosing_context_p (DECL_CONTEXT (decl), current_class))
9331                 {
9332                   parse_error_context
9333                     (id, "Can't reference `%s' before the superclass constructor has been called", IDENTIFIER_POINTER (name));
9334                   return error_mark_node;
9335                 }
9336
9337               /* If we're processing an inner class and we're trying
9338                  to access a field belonging to an outer class, build
9339                  the access to the field */
9340               if (!fs && outer_field_access_p (current_class, decl))
9341                 {
9342                   if (CLASS_STATIC (TYPE_NAME (current_class)))
9343                     {
9344                       static_ref_err (id, DECL_NAME (decl), current_class);
9345                       return error_mark_node;
9346                     }
9347                   access = build_outer_field_access (id, decl);
9348                   if (orig)
9349                     *orig = access;
9350                   return access;
9351                 }
9352
9353               /* Otherwise build what it takes to access the field */
9354               access = build_field_ref ((fs ? NULL_TREE : current_this),
9355                                         DECL_CONTEXT (decl), name);
9356               if (fs)
9357                 access = maybe_build_class_init_for_field (decl, access);
9358               /* We may be asked to save the real field access node */
9359               if (orig)
9360                 *orig = access;
9361               /* Last check: can we access the field? */
9362               if (not_accessible_p (current_class, decl, NULL_TREE, 0))
9363                 {
9364                   not_accessible_field_error (id, decl);
9365                   return error_mark_node;
9366                 }
9367               /* And we return what we got */
9368               return access;
9369             }
9370           /* Fall down to error report on undefined variable */
9371         }
9372     }
9373   /* 6.5.5.2 Qualified Expression Names */
9374   else
9375     {
9376       if (orig)
9377         *orig = NULL_TREE;
9378       qualify_ambiguous_name (id);
9379       /* 15.10.1 Field Access Using a Primary and/or Expression Name */
9380       /* 15.10.2: Accessing Superclass Members using super */
9381       return resolve_field_access (id, orig, NULL);
9382     }
9383
9384   /* We've got an error here */
9385   if (INNER_CLASS_TYPE_P (current_class))
9386     parse_error_context (id,
9387                          "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final",
9388                          IDENTIFIER_POINTER (name),
9389                          IDENTIFIER_POINTER (DECL_NAME
9390                                              (TYPE_NAME (current_class))));
9391   else
9392     parse_error_context (id, "Undefined variable `%s'",
9393                          IDENTIFIER_POINTER (name));
9394
9395   return error_mark_node;
9396 }
9397
9398 static void
9399 static_ref_err (tree wfl, tree field_id, tree class_type)
9400 {
9401   parse_error_context
9402     (wfl,
9403      "Can't make a static reference to nonstatic variable `%s' in class `%s'",
9404      IDENTIFIER_POINTER (field_id),
9405      IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
9406 }
9407
9408 /* 15.10.1 Field Access Using a Primary and/or Expression Name.
9409    We return something suitable to generate the field access. We also
9410    return the field decl in FIELD_DECL and its type in FIELD_TYPE.  If
9411    recipient's address can be null. */
9412
9413 static tree
9414 resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
9415 {
9416   int is_static = 0;
9417   tree field_ref;
9418   tree decl = NULL_TREE, where_found, type_found;
9419
9420   if (resolve_qualified_expression_name (qual_wfl, &decl,
9421                                          &where_found, &type_found))
9422     return error_mark_node;
9423
9424   /* Resolve the LENGTH field of an array here */
9425   if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node
9426       && type_found && TYPE_ARRAY_P (type_found)
9427       && ! flag_emit_class_files && ! flag_emit_xref)
9428     {
9429       tree length = build_java_array_length_access (where_found);
9430       field_ref = length;
9431
9432       /* In case we're dealing with a static array, we need to
9433          initialize its class before the array length can be fetched.
9434          It's also a good time to create a DECL_RTL for the field if
9435          none already exists, otherwise if the field was declared in a
9436          class found in an external file and hasn't been (and won't
9437          be) accessed for its value, none will be created. */
9438       if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
9439         {
9440           build_static_field_ref (where_found);
9441           field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9442         }
9443     }
9444   /* We might have been trying to resolve field.method(). In which
9445      case, the resolution is over and decl is the answer */
9446   else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
9447     field_ref = decl;
9448   else if (JDECL_P (decl))
9449     {
9450       if (!type_found)
9451         type_found = DECL_CONTEXT (decl);
9452       is_static = FIELD_STATIC (decl);
9453       field_ref = build_field_ref ((is_static && !flag_emit_xref?
9454                                     NULL_TREE : where_found),
9455                                    type_found, DECL_NAME (decl));
9456       if (field_ref == error_mark_node)
9457         return error_mark_node;
9458       if (is_static)
9459         field_ref = maybe_build_class_init_for_field (decl, field_ref);
9460
9461       /* If we're looking at a static field, we may need to generate a
9462          class initialization for it.  This can happen when the access
9463          looks like `field.ref', where `field' is a static field in an
9464          interface we implement.  */
9465       if (!flag_emit_class_files
9466           && !flag_emit_xref
9467           && TREE_CODE (where_found) == VAR_DECL
9468           && FIELD_STATIC (where_found))
9469         {
9470           build_static_field_ref (where_found);
9471           field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
9472         }
9473     }
9474   else
9475     field_ref = decl;
9476
9477   if (field_decl)
9478     *field_decl = decl;
9479   if (field_type)
9480     *field_type = (QUAL_DECL_TYPE (decl) ?
9481                    QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
9482   return field_ref;
9483 }
9484
9485 /* If NODE is an access to f static field, strip out the class
9486    initialization part and return the field decl, otherwise, return
9487    NODE. */
9488
9489 static tree
9490 strip_out_static_field_access_decl (tree node)
9491 {
9492   if (TREE_CODE (node) == COMPOUND_EXPR)
9493     {
9494       tree op1 = TREE_OPERAND (node, 1);
9495       if (TREE_CODE (op1) == COMPOUND_EXPR)
9496          {
9497            tree call = TREE_OPERAND (op1, 0);
9498            if (TREE_CODE (call) == CALL_EXPR
9499                && TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
9500                && TREE_OPERAND (TREE_OPERAND (call, 0), 0)
9501                == soft_initclass_node)
9502              return TREE_OPERAND (op1, 1);
9503          }
9504       else if (JDECL_P (op1))
9505         return op1;
9506     }
9507   return node;
9508 }
9509
9510 /* 6.5.5.2: Qualified Expression Names */
9511
9512 static int
9513 resolve_qualified_expression_name (tree wfl, tree *found_decl,
9514                                    tree *where_found, tree *type_found)
9515 {
9516   int from_type = 0;            /* Field search initiated from a type */
9517   int from_super = 0, from_cast = 0, from_qualified_this = 0;
9518   int previous_call_static = 0;
9519   int is_static;
9520   tree decl = NULL_TREE, type = NULL_TREE, q;
9521   /* For certain for of inner class instantiation */
9522   tree saved_current, saved_this;
9523 #define RESTORE_THIS_AND_CURRENT_CLASS                          \
9524   { current_class = saved_current; current_this = saved_this;}
9525
9526   *type_found = *where_found = NULL_TREE;
9527
9528   for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
9529     {
9530       tree qual_wfl = QUAL_WFL (q);
9531       tree ret_decl;            /* for EH checking */
9532       int location;             /* for EH checking */
9533
9534       /* 15.10.1 Field Access Using a Primary */
9535       switch (TREE_CODE (qual_wfl))
9536         {
9537         case CALL_EXPR:
9538         case NEW_CLASS_EXPR:
9539           /* If the access to the function call is a non static field,
9540              build the code to access it. */
9541           if (JDECL_P (decl) && !FIELD_STATIC (decl))
9542             {
9543               decl = maybe_access_field (decl, *where_found,
9544                                          DECL_CONTEXT (decl));
9545               if (decl == error_mark_node)
9546                 return 1;
9547             }
9548
9549           /* And code for the function call */
9550           if (complete_function_arguments (qual_wfl))
9551             return 1;
9552
9553           /* We might have to setup a new current class and a new this
9554              for the search of an inner class, relative to the type of
9555              a expression resolved as `decl'. The current values are
9556              saved and restored shortly after */
9557           saved_current = current_class;
9558           saved_this = current_this;
9559           if (decl
9560               && (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9561                   || from_qualified_this))
9562             {
9563               /* If we still have `from_qualified_this', we have the form
9564                  <T>.this.f() and we need to build <T>.this */
9565               if (from_qualified_this)
9566                 {
9567                   decl = build_access_to_thisn (current_class, type, 0);
9568                   decl = java_complete_tree (decl);
9569                   type = TREE_TYPE (TREE_TYPE (decl));
9570                 }
9571               current_class = type;
9572               current_this = decl;
9573               from_qualified_this = 0;
9574             }
9575
9576           if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
9577             CALL_USING_SUPER (qual_wfl) = 1;
9578           location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
9579                       EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
9580           *where_found = patch_method_invocation (qual_wfl, decl, type,
9581                                                   from_super,
9582                                                   &is_static, &ret_decl);
9583           from_super = 0;
9584           if (*where_found == error_mark_node)
9585             {
9586               RESTORE_THIS_AND_CURRENT_CLASS;
9587               return 1;
9588             }
9589           *type_found = type = QUAL_DECL_TYPE (*where_found);
9590
9591           *where_found = force_evaluation_order (*where_found);
9592
9593           /* If we're creating an inner class instance, check for that
9594              an enclosing instance is in scope */
9595           if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
9596               && INNER_ENCLOSING_SCOPE_CHECK (type))
9597             {
9598               parse_error_context
9599                 (qual_wfl, "No enclosing instance for inner class `%s' is in scope%s",
9600                  lang_printable_name (type, 0),
9601                  (!current_this ? "" :
9602                   "; an explicit one must be provided when creating this inner class"));
9603               RESTORE_THIS_AND_CURRENT_CLASS;
9604               return 1;
9605             }
9606
9607           /* In case we had to change then to resolve a inner class
9608              instantiation using a primary qualified by a `new' */
9609           RESTORE_THIS_AND_CURRENT_CLASS;
9610
9611           if (location)
9612             {
9613               tree arguments = NULL_TREE;
9614               if (TREE_CODE (qual_wfl) == CALL_EXPR
9615                   && TREE_OPERAND (qual_wfl, 1) != NULL_TREE)
9616                 arguments = TREE_VALUE (TREE_OPERAND (qual_wfl, 1));
9617               check_thrown_exceptions (location, ret_decl, arguments);
9618             }
9619
9620           /* If the previous call was static and this one is too,
9621              build a compound expression to hold the two (because in
9622              that case, previous function calls aren't transported as
9623              forcoming function's argument. */
9624           if (previous_call_static && is_static)
9625             {
9626               decl = build (COMPOUND_EXPR, TREE_TYPE (*where_found),
9627                             decl, *where_found);
9628               TREE_SIDE_EFFECTS (decl) = 1;
9629             }
9630           else
9631             {
9632               previous_call_static = is_static;
9633               decl = *where_found;
9634             }
9635           from_type = 0;
9636           continue;
9637
9638         case NEW_ARRAY_EXPR:
9639         case NEW_ANONYMOUS_ARRAY_EXPR:
9640           *where_found = decl = java_complete_tree (qual_wfl);
9641           if (decl == error_mark_node)
9642             return 1;
9643           *type_found = type = QUAL_DECL_TYPE (decl);
9644           continue;
9645
9646         case CONVERT_EXPR:
9647           *where_found = decl = java_complete_tree (qual_wfl);
9648           if (decl == error_mark_node)
9649             return 1;
9650           *type_found = type = QUAL_DECL_TYPE (decl);
9651           from_cast = 1;
9652           continue;
9653
9654         case CONDITIONAL_EXPR:
9655         case STRING_CST:
9656         case MODIFY_EXPR:
9657           *where_found = decl = java_complete_tree (qual_wfl);
9658           if (decl == error_mark_node)
9659             return 1;
9660           *type_found = type = QUAL_DECL_TYPE (decl);
9661           continue;
9662
9663         case ARRAY_REF:
9664           /* If the access to the function call is a non static field,
9665              build the code to access it. */
9666           if (JDECL_P (decl) && !FIELD_STATIC (decl))
9667             {
9668               decl = maybe_access_field (decl, *where_found, type);
9669               if (decl == error_mark_node)
9670                 return 1;
9671             }
9672           /* And code for the array reference expression */
9673           decl = java_complete_tree (qual_wfl);
9674           if (decl == error_mark_node)
9675             return 1;
9676           type = QUAL_DECL_TYPE (decl);
9677           continue;
9678
9679         case PLUS_EXPR:
9680           if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9681             return 1;
9682           if ((type = patch_string (decl)))
9683             decl = type;
9684           *where_found = QUAL_RESOLUTION (q) = decl;
9685           *type_found = type = TREE_TYPE (decl);
9686           break;
9687
9688         case CLASS_LITERAL:
9689           if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
9690             return 1;
9691           *where_found = QUAL_RESOLUTION (q) = decl;
9692           *type_found = type = TREE_TYPE (decl);
9693           break;
9694
9695         default:
9696           /* Fix for -Wall Just go to the next statement. Don't
9697              continue */
9698           break;
9699         }
9700
9701       /* If we fall here, we weren't processing a (static) function call. */
9702       previous_call_static = 0;
9703
9704       /* It can be the keyword THIS */
9705       if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9706           && EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
9707         {
9708           if (!current_this)
9709             {
9710               parse_error_context
9711                 (wfl, "Keyword `this' used outside allowed context");
9712               return 1;
9713             }
9714           if (ctxp->explicit_constructor_p
9715               && type == current_class)
9716             {
9717               parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
9718               return 1;
9719             }
9720           /* We have to generate code for intermediate access */
9721           if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type)
9722             {
9723               *where_found = decl = current_this;
9724               *type_found = type = QUAL_DECL_TYPE (decl);
9725             }
9726           /* We're trying to access the this from somewhere else. Make sure
9727              it's allowed before doing so. */
9728           else
9729             {
9730               if (!enclosing_context_p (type, current_class))
9731                 {
9732                   char *p  = xstrdup (lang_printable_name (type, 0));
9733                   parse_error_context (qual_wfl, "Can't use variable `%s.this': type `%s' isn't an outer type of type `%s'",
9734                                        p, p,
9735                                        lang_printable_name (current_class, 0));
9736                   free (p);
9737                   return 1;
9738                 }
9739               from_qualified_this = 1;
9740               /* If there's nothing else after that, we need to
9741                  produce something now, otherwise, the section of the
9742                  code that needs to produce <T>.this will generate
9743                  what is necessary. */
9744               if (!TREE_CHAIN (q))
9745                 {
9746                   decl = build_access_to_thisn (current_class, type, 0);
9747                   *where_found = decl = java_complete_tree (decl);
9748                   *type_found = type = TREE_TYPE (decl);
9749                 }
9750             }
9751
9752           from_type = 0;
9753           continue;
9754         }
9755
9756       /* 15.10.2 Accessing Superclass Members using SUPER */
9757       if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
9758           && EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
9759         {
9760           tree node;
9761           /* Check on the restricted use of SUPER */
9762           if (METHOD_STATIC (current_function_decl)
9763               || current_class == object_type_node)
9764             {
9765               parse_error_context
9766                 (wfl, "Keyword `super' used outside allowed context");
9767               return 1;
9768             }
9769           /* Otherwise, treat SUPER as (SUPER_CLASS)THIS */
9770           node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
9771                              CLASSTYPE_SUPER (current_class),
9772                              build_this (EXPR_WFL_LINECOL (qual_wfl)));
9773           *where_found = decl = java_complete_tree (node);
9774           if (decl == error_mark_node)
9775             return 1;
9776           *type_found = type = QUAL_DECL_TYPE (decl);
9777           from_super = from_type = 1;
9778           continue;
9779         }
9780
9781       /* 15.13.1: Can't search for field name in packages, so we
9782          assume a variable/class name was meant. */
9783       if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
9784         {
9785           tree name;
9786           if ((decl = resolve_package (wfl, &q, &name)))
9787             {
9788               tree list;
9789               *where_found = decl;
9790
9791               check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
9792
9793               /* We want to be absolutely sure that the class is laid
9794                  out. We're going to search something inside it. */
9795               *type_found = type = TREE_TYPE (decl);
9796               layout_class (type);
9797               from_type = 1;
9798
9799               /* Fix them all the way down, if any are left. */
9800               if (q)
9801                 {
9802                   list = TREE_CHAIN (q);
9803                   while (list)
9804                     {
9805                       RESOLVE_PACKAGE_NAME_P (QUAL_WFL (list)) = 0;
9806                       list = TREE_CHAIN (list);
9807                     }
9808                 }
9809             }
9810           else
9811             {
9812               if (from_super || from_cast)
9813                 parse_error_context
9814                   ((from_cast ? qual_wfl : wfl),
9815                    "No variable `%s' defined in class `%s'",
9816                    IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9817                    lang_printable_name (type, 0));
9818               else
9819                 parse_error_context
9820                   (qual_wfl, "Undefined variable or class name: `%s'",
9821                    IDENTIFIER_POINTER (name));
9822               return 1;
9823             }
9824         }
9825
9826       /* We have a type name. It's been already resolved when the
9827          expression was qualified. */
9828       else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q))
9829         {
9830           decl = QUAL_RESOLUTION (q);
9831
9832           /* Sneak preview. If next we see a `new', we're facing a
9833              qualification which resulted in a type being selected
9834              instead of a field.  Report the error.  */
9835           if(TREE_CHAIN (q)
9836              && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR)
9837             {
9838               parse_error_context (qual_wfl, "Undefined variable `%s'",
9839                                    IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
9840               return 1;
9841             }
9842
9843           check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
9844           
9845           check_deprecation (qual_wfl, decl);
9846
9847           type = TREE_TYPE (decl);
9848           from_type = 1;
9849         }
9850       /* We resolve an expression name */
9851       else
9852         {
9853           tree field_decl = NULL_TREE;
9854
9855           /* If there exists an early resolution, use it. That occurs
9856              only once and we know that there are more things to
9857              come. Don't do that when processing something after SUPER
9858              (we need more thing to be put in place below */
9859           if (!from_super && QUAL_RESOLUTION (q))
9860             {
9861               decl = QUAL_RESOLUTION (q);
9862               if (!type)
9863                 {
9864                   if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
9865                     {
9866                       if (current_this)
9867                         *where_found = current_this;
9868                       else
9869                         {
9870                           static_ref_err (qual_wfl, DECL_NAME (decl),
9871                                           current_class);
9872                           return 1;
9873                         }
9874                       if (outer_field_access_p (current_class, decl))
9875                         decl = build_outer_field_access (qual_wfl, decl);
9876                     }
9877                   else
9878                     {
9879                       *where_found = TREE_TYPE (decl);
9880                       if (TREE_CODE (*where_found) == POINTER_TYPE)
9881                         *where_found = TREE_TYPE (*where_found);
9882                     }
9883                 }
9884             }
9885
9886           /* Report and error if we're using a numerical literal as a
9887              qualifier. It can only be an INTEGER_CST. */
9888           else if (TREE_CODE (qual_wfl) == INTEGER_CST)
9889             {
9890               parse_error_context
9891                 (wfl, "Can't use type `%s' as a qualifier",
9892                  lang_printable_name (TREE_TYPE (qual_wfl), 0));
9893               return 1;
9894             }
9895
9896           /* We have to search for a field, knowing the type of its
9897              container. The flag FROM_TYPE indicates that we resolved
9898              the last member of the expression as a type name, which
9899              means that for the resolution of this field, we'll look
9900              for other errors than if it was resolved as a member of
9901              an other field. */
9902           else
9903             {
9904               int is_static;
9905               tree field_decl_type; /* For layout */
9906
9907               if (!from_type && !JREFERENCE_TYPE_P (type))
9908                 {
9909                   parse_error_context
9910                     (qual_wfl, "Attempt to reference field `%s' in `%s %s'",
9911                      IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9912                      lang_printable_name (type, 0),
9913                      IDENTIFIER_POINTER (DECL_NAME (decl)));
9914                   return 1;
9915                 }
9916
9917               field_decl = lookup_field_wrapper (type,
9918                                                  EXPR_WFL_NODE (qual_wfl));
9919
9920               /* Maybe what we're trying to access to is an inner
9921                  class, only if decl is a TYPE_DECL. */
9922               if (!field_decl && TREE_CODE (decl) == TYPE_DECL)
9923                 {
9924                   tree ptr, inner_decl;
9925
9926                   BUILD_PTR_FROM_NAME (ptr, EXPR_WFL_NODE (qual_wfl));
9927                   inner_decl = resolve_class (decl, ptr, NULL_TREE, qual_wfl);
9928                   if (inner_decl)
9929                     {
9930                       check_inner_class_access (inner_decl, decl, qual_wfl);
9931                       type = TREE_TYPE (inner_decl);
9932                       decl = inner_decl;
9933                       from_type = 1;
9934                       continue;
9935                     }
9936                 }
9937
9938               if (field_decl == NULL_TREE)
9939                 {
9940                   parse_error_context
9941                     (qual_wfl, "No variable `%s' defined in type `%s'",
9942                      IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
9943                      GET_TYPE_NAME (type));
9944                   return 1;
9945                 }
9946               if (field_decl == error_mark_node)
9947                 return 1;
9948
9949               /* Layout the type of field_decl, since we may need
9950                  it. Don't do primitive types or loaded classes. The
9951                  situation of non primitive arrays may not handled
9952                  properly here. FIXME */
9953               if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
9954                 field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
9955               else
9956                 field_decl_type = TREE_TYPE (field_decl);
9957               if (!JPRIMITIVE_TYPE_P (field_decl_type)
9958                   && !CLASS_LOADED_P (field_decl_type)
9959                   && !TYPE_ARRAY_P (field_decl_type))
9960                 resolve_and_layout (field_decl_type, NULL_TREE);
9961
9962               /* Check on accessibility here */
9963               if (not_accessible_p (current_class, field_decl,
9964                                     DECL_CONTEXT (field_decl), from_super))
9965                 return not_accessible_field_error (qual_wfl,field_decl);    
9966               check_deprecation (qual_wfl, field_decl);
9967
9968               /* There are things to check when fields are accessed
9969                  from type. There are no restrictions on a static
9970                  declaration of the field when it is accessed from an
9971                  interface */
9972               is_static = FIELD_STATIC (field_decl);
9973               if (!from_super && from_type
9974                   && !TYPE_INTERFACE_P (type)
9975                   && !is_static
9976                   && (current_function_decl
9977                       && METHOD_STATIC (current_function_decl)))
9978                 {
9979                   static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
9980                   return 1;
9981                 }
9982               from_cast = from_super = 0;
9983
9984               /* It's an access from a type but it isn't static, we
9985                  make it relative to `this'. */
9986               if (!is_static && from_type)
9987                 decl = current_this;
9988
9989               /* If we need to generate something to get a proper
9990                  handle on what this field is accessed from, do it
9991                  now. */
9992               if (!is_static)
9993                 {
9994                   decl = maybe_access_field (decl, *where_found, *type_found);
9995                   if (decl == error_mark_node)
9996                     return 1;
9997                 }
9998
9999               /* We want to keep the location were found it, and the type
10000                  we found. */
10001               *where_found = decl;
10002               *type_found = type;
10003
10004               /* Generate the correct expression for field access from
10005                  qualified this */
10006               if (from_qualified_this)
10007                 {
10008                   field_decl = build_outer_field_access (qual_wfl, field_decl);
10009                   from_qualified_this = 0;
10010                 }
10011
10012               /* This is the decl found and eventually the next one to
10013                  search from */
10014               decl = field_decl;
10015             }
10016           from_type = 0;
10017           type = QUAL_DECL_TYPE (decl);
10018
10019           /* Sneak preview. If decl is qualified by a `new', report
10020              the error here to be accurate on the peculiar construct */
10021           if (TREE_CHAIN (q)
10022               && TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR
10023               && !JREFERENCE_TYPE_P (type))
10024             {
10025               parse_error_context (qual_wfl, "Attempt to reference field `new' in a `%s'",
10026                                    lang_printable_name (type, 0));
10027               return 1;
10028             }
10029         }
10030       /* `q' might have changed due to a after package resolution
10031          re-qualification */
10032       if (!q)
10033         break;
10034     }
10035   *found_decl = decl;
10036   return 0;
10037 }
10038
10039 /* 6.6 Qualified name and access control. Returns 1 if MEMBER (a decl)
10040    can't be accessed from REFERENCE (a record type). If MEMBER
10041    features a protected access, we then use WHERE which, if non null,
10042    holds the type of MEMBER's access that is checked against
10043    6.6.2.1. This function should be used when decl is a field or a
10044    method.  */
10045
10046 static int
10047 not_accessible_p (tree reference, tree member, tree where, int from_super)
10048 {
10049   int access_flag = get_access_flags_from_decl (member);
10050
10051   /* Inner classes are processed by check_inner_class_access */
10052   if (INNER_CLASS_TYPE_P (reference))
10053     return 0;
10054
10055   /* Access always granted for members declared public */
10056   if (access_flag & ACC_PUBLIC)
10057     return 0;
10058
10059   /* Check access on protected members */
10060   if (access_flag & ACC_PROTECTED)
10061     {
10062       /* Access granted if it occurs from within the package
10063          containing the class in which the protected member is
10064          declared */
10065       if (class_in_current_package (DECL_CONTEXT (member)))
10066         return 0;
10067
10068       /* If accessed with the form `super.member', then access is granted */
10069       if (from_super)
10070         return 0;
10071
10072       /* If where is active, access was made through a
10073          qualifier. Access is granted if the type of the qualifier is
10074          or is a sublass of the type the access made from (6.6.2.1.)  */
10075       if (where && !inherits_from_p (reference, where))
10076         return 1;
10077
10078       /* Otherwise, access is granted if occurring from the class where
10079          member is declared or a subclass of it. Find the right
10080          context to perform the check */
10081       if (PURE_INNER_CLASS_TYPE_P (reference))
10082         {
10083           while (INNER_CLASS_TYPE_P (reference))
10084             {
10085               if (inherits_from_p (reference, DECL_CONTEXT (member)))
10086                 return 0;
10087               reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
10088             }
10089         }
10090       if (inherits_from_p (reference, DECL_CONTEXT (member)))
10091         return 0;
10092       return 1;
10093     }
10094
10095   /* Check access on private members. Access is granted only if it
10096      occurs from within the class in which it is declared -- that does
10097      it for innerclasses too. */
10098   if (access_flag & ACC_PRIVATE)
10099     {
10100       if (reference == DECL_CONTEXT (member))
10101         return 0;
10102       if (enclosing_context_p (reference, DECL_CONTEXT (member)))
10103         return 0;
10104       return 1;
10105     }
10106
10107   /* Default access is permitted only when occurring from within the
10108      package in which the context (MEMBER) is declared.  */
10109   return !class_in_current_package (DECL_CONTEXT (member));
10110 }
10111
10112 /* Test deprecated decl access.  */
10113 static void
10114 check_deprecation (tree wfl, tree decl)
10115 {
10116   const char *file;
10117   tree elt;
10118
10119   if (! flag_deprecated)
10120     return;
10121
10122   /* We want to look at the element type of arrays here, so we strip
10123      all surrounding array types.  */
10124   if (TYPE_ARRAY_P (TREE_TYPE (decl)))
10125     {
10126       elt = TREE_TYPE (decl);
10127       while (TYPE_ARRAY_P (elt))
10128         elt = TYPE_ARRAY_ELEMENT (elt);
10129       /* We'll end up with a pointer type, so we use TREE_TYPE to go
10130          to the record.  */
10131       decl = TYPE_NAME (TREE_TYPE (elt));
10132     }
10133   file = DECL_SOURCE_FILE (decl);
10134
10135   /* Complain if the field is deprecated and the file it was defined
10136      in isn't compiled at the same time the file which contains its
10137      use is */
10138   if (DECL_DEPRECATED (decl)
10139       && !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
10140     {
10141       const char *the;
10142       switch (TREE_CODE (decl))
10143         {
10144         case FUNCTION_DECL:
10145           the = "method";
10146           break;
10147         case FIELD_DECL:
10148         case VAR_DECL:
10149           the = "field";
10150           break;
10151         case TYPE_DECL:
10152           parse_warning_context (wfl, "The class `%s' has been deprecated",
10153                                  IDENTIFIER_POINTER (DECL_NAME (decl)));
10154           return;
10155         default:
10156           abort ();
10157         }
10158       /* Don't issue a message if the context as been deprecated as a
10159          whole. */
10160       if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl))))
10161         parse_warning_context
10162           (wfl, "The %s `%s' in class `%s' has been deprecated",
10163            the, lang_printable_name (decl, 0),
10164            IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
10165     }
10166 }
10167
10168 /* Returns 1 if class was declared in the current package, 0 otherwise */
10169
10170 static GTY(()) tree cicp_cache;
10171 static int
10172 class_in_current_package (tree class)
10173 {
10174   int qualified_flag;
10175   tree left;
10176
10177   if (cicp_cache == class)
10178     return 1;
10179
10180   qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
10181
10182   /* If the current package is empty and the name of CLASS is
10183      qualified, class isn't in the current package.  If there is a
10184      current package and the name of the CLASS is not qualified, class
10185      isn't in the current package */
10186   if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
10187     return 0;
10188
10189   /* If there is not package and the name of CLASS isn't qualified,
10190      they belong to the same unnamed package */
10191   if (!ctxp->package && !qualified_flag)
10192     return 1;
10193
10194   /* Compare the left part of the name of CLASS with the package name */
10195   split_qualified_name (&left, NULL, DECL_NAME (TYPE_NAME (class)));
10196   if (ctxp->package == left)
10197     {
10198       cicp_cache = class;
10199       return 1;
10200     }
10201   return 0;
10202 }
10203
10204 /* This function may generate code to access DECL from WHERE. This is
10205    done only if certain conditions meet.  */
10206
10207 static tree
10208 maybe_access_field (tree decl, tree where, tree type)
10209 {
10210   if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
10211       && !FIELD_STATIC (decl))
10212     decl = build_field_ref (where ? where : current_this,
10213                             (type ? type : DECL_CONTEXT (decl)),
10214                             DECL_NAME (decl));
10215   return decl;
10216 }
10217
10218 /* Build a method invocation, by patching PATCH. If non NULL
10219    and according to the situation, PRIMARY and WHERE may be
10220    used. IS_STATIC is set to 1 if the invoked function is static. */
10221
10222 static tree
10223 patch_method_invocation (tree patch, tree primary, tree where, int from_super,
10224                          int *is_static, tree *ret_decl)
10225 {
10226   tree wfl = TREE_OPERAND (patch, 0);
10227   tree args = TREE_OPERAND (patch, 1);
10228   tree name = EXPR_WFL_NODE (wfl);
10229   tree list;
10230   int is_static_flag = 0;
10231   int is_super_init = 0;
10232   tree this_arg = NULL_TREE;
10233   int is_array_clone_call = 0;
10234
10235   /* Should be overridden if everything goes well. Otherwise, if
10236      something fails, it should keep this value. It stop the
10237      evaluation of a bogus assignment. See java_complete_tree,
10238      MODIFY_EXPR: for the reasons why we sometimes want to keep on
10239      evaluating an assignment */
10240   TREE_TYPE (patch) = error_mark_node;
10241
10242   /* Since lookup functions are messing with line numbers, save the
10243      context now.  */
10244   java_parser_context_save_global ();
10245
10246   /* 15.11.1: Compile-Time Step 1: Determine Class or Interface to Search */
10247
10248   /* Resolution of qualified name, excluding constructors */
10249   if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
10250     {
10251       tree identifier, identifier_wfl, type, resolved;
10252       /* Extract the last IDENTIFIER of the qualified
10253          expression. This is a wfl and we will use it's location
10254          data during error report. */
10255       identifier_wfl = cut_identifier_in_qualified (wfl);
10256       identifier = EXPR_WFL_NODE (identifier_wfl);
10257
10258       /* Given the context, IDENTIFIER is syntactically qualified
10259          as a MethodName. We need to qualify what's before */
10260       qualify_ambiguous_name (wfl);
10261       resolved = resolve_field_access (wfl, NULL, NULL);
10262
10263       if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved)
10264          && FIELD_FINAL (resolved)
10265          && !inherits_from_p (DECL_CONTEXT (resolved), current_class)
10266          && !flag_emit_class_files && !flag_emit_xref)
10267        resolved = build_class_init (DECL_CONTEXT (resolved), resolved);
10268
10269       if (resolved == error_mark_node)
10270         PATCH_METHOD_RETURN_ERROR ();
10271
10272       type = GET_SKIP_TYPE (resolved);
10273       resolve_and_layout (type, NULL_TREE);
10274
10275       if (JPRIMITIVE_TYPE_P (type))
10276         {
10277           parse_error_context
10278             (identifier_wfl,
10279              "Can't invoke a method on primitive type `%s'",
10280              IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10281           PATCH_METHOD_RETURN_ERROR ();
10282         }
10283
10284       list = lookup_method_invoke (0, identifier_wfl, type, identifier, args);
10285       args = nreverse (args);
10286
10287       /* We're resolving a call from a type */
10288       if (TREE_CODE (resolved) == TYPE_DECL)
10289         {
10290           if (CLASS_INTERFACE (resolved))
10291             {
10292               parse_error_context
10293                 (identifier_wfl,
10294                 "Can't make static reference to method `%s' in interface `%s'",
10295                  IDENTIFIER_POINTER (identifier),
10296                  IDENTIFIER_POINTER (name));
10297               PATCH_METHOD_RETURN_ERROR ();
10298             }
10299           if (list && !METHOD_STATIC (list))
10300             {
10301               char *fct_name = xstrdup (lang_printable_name (list, 0));
10302               parse_error_context
10303                 (identifier_wfl,
10304                  "Can't make static reference to method `%s %s' in class `%s'",
10305                  lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
10306                  fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
10307               free (fct_name);
10308               PATCH_METHOD_RETURN_ERROR ();
10309             }
10310         }
10311       else
10312         this_arg = primary = resolved;
10313
10314       if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
10315         is_array_clone_call = 1;
10316
10317       /* IDENTIFIER_WFL will be used to report any problem further */
10318       wfl = identifier_wfl;
10319     }
10320   /* Resolution of simple names, names generated after a primary: or
10321      constructors */
10322   else
10323     {
10324       tree class_to_search = NULL_TREE;
10325       int lc;                   /* Looking for Constructor */
10326
10327       /* We search constructor in their target class */
10328       if (CALL_CONSTRUCTOR_P (patch))
10329         {
10330           if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10331             class_to_search = EXPR_WFL_NODE (wfl);
10332           else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10333                    this_identifier_node)
10334             class_to_search = NULL_TREE;
10335           else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
10336                    super_identifier_node)
10337             {
10338               is_super_init = 1;
10339               if (CLASSTYPE_SUPER (current_class))
10340                 class_to_search =
10341                   DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
10342               else
10343                 {
10344                   parse_error_context (wfl, "Can't invoke super constructor on java.lang.Object");
10345                   PATCH_METHOD_RETURN_ERROR ();
10346                 }
10347             }
10348
10349           /* Class to search is NULL if we're searching the current one */
10350           if (class_to_search)
10351             {
10352               class_to_search = resolve_and_layout (class_to_search, wfl);
10353
10354               if (!class_to_search)
10355                 {
10356                   parse_error_context
10357                     (wfl, "Class `%s' not found in type declaration",
10358                      IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10359                   PATCH_METHOD_RETURN_ERROR ();
10360                 }
10361
10362               /* Can't instantiate an abstract class, but we can
10363                  invoke it's constructor. It's use within the `new'
10364                  context is denied here. */
10365               if (CLASS_ABSTRACT (class_to_search)
10366                   && TREE_CODE (patch) == NEW_CLASS_EXPR)
10367                 {
10368                   parse_error_context
10369                     (wfl, "Class `%s' is an abstract class. It can't be instantiated",
10370                      IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
10371                   PATCH_METHOD_RETURN_ERROR ();
10372                 }
10373
10374               class_to_search = TREE_TYPE (class_to_search);
10375             }
10376           else
10377             class_to_search = current_class;
10378           lc = 1;
10379         }
10380       /* This is a regular search in the local class, unless an
10381          alternate class is specified. */
10382       else
10383         {
10384           if (where != NULL_TREE)
10385             class_to_search = where;
10386           else if (QUALIFIED_P (name))
10387             class_to_search = current_class;
10388           else
10389             {
10390               class_to_search = current_class;
10391
10392               for (;;)
10393                 {
10394                   if (has_method (class_to_search, name))
10395                     break;
10396                   if (! INNER_CLASS_TYPE_P (class_to_search))
10397                     {
10398                       parse_error_context (wfl,
10399                                            "No method named `%s' in scope",
10400                                            IDENTIFIER_POINTER (name));
10401                       PATCH_METHOD_RETURN_ERROR ();
10402                     }
10403                   class_to_search
10404                     = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
10405                 }
10406             }
10407           lc = 0;
10408         }
10409
10410       /* NAME is a simple identifier or comes from a primary. Search
10411          in the class whose declaration contain the method being
10412          invoked. */
10413       resolve_and_layout (class_to_search, NULL_TREE);
10414
10415       list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
10416       /* Don't continue if no method were found, as the next statement
10417          can't be executed then. */
10418       if (!list)
10419         PATCH_METHOD_RETURN_ERROR ();
10420
10421       if (TYPE_ARRAY_P (class_to_search)
10422           && DECL_NAME (list) == get_identifier ("clone"))
10423         is_array_clone_call = 1;
10424
10425       /* Check for static reference if non static methods */
10426       if (check_for_static_method_reference (wfl, patch, list,
10427                                              class_to_search, primary))
10428         PATCH_METHOD_RETURN_ERROR ();
10429
10430       /* Check for inner classes creation from illegal contexts */
10431       if (lc && (INNER_CLASS_TYPE_P (class_to_search)
10432                  && !CLASS_STATIC (TYPE_NAME (class_to_search)))
10433           && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)
10434           && !DECL_INIT_P (current_function_decl))
10435         {
10436           parse_error_context
10437             (wfl, "No enclosing instance for inner class `%s' is in scope%s",
10438              lang_printable_name (class_to_search, 0),
10439              (!current_this ? "" :
10440               "; an explicit one must be provided when creating this inner class"));
10441           PATCH_METHOD_RETURN_ERROR ();
10442         }
10443
10444       /* Non static methods are called with the current object extra
10445          argument. If patch a `new TYPE()', the argument is the value
10446          returned by the object allocator. If method is resolved as a
10447          primary, use the primary otherwise use the current THIS. */
10448       args = nreverse (args);
10449       if (TREE_CODE (patch) != NEW_CLASS_EXPR)
10450         {
10451           this_arg = primary ? primary : current_this;
10452
10453           /* If we're using an access method, things are different.
10454              There are two family of cases:
10455
10456              1) We're not generating bytecodes:
10457
10458              - LIST is non static. It's invocation is transformed from
10459                x(a1,...,an) into this$<n>.x(a1,....an).
10460              - LIST is static. It's invocation is transformed from
10461                x(a1,...,an) into TYPE_OF(this$<n>).x(a1,....an)
10462
10463              2) We're generating bytecodes:
10464
10465              - LIST is non static. It's invocation is transformed from
10466                x(a1,....,an) into access$<n>(this$<n>,a1,...,an).
10467              - LIST is static. It's invocation is transformed from
10468                x(a1,....,an) into TYPE_OF(this$<n>).x(a1,....an).
10469
10470              Of course, this$<n> can be arbitrarily complex, ranging from
10471              this$0 (the immediate outer context) to
10472              access$0(access$0(...(this$0))).
10473
10474              maybe_use_access_method returns a nonzero value if the
10475              this_arg has to be moved into the (then generated) stub
10476              argument list. In the meantime, the selected function
10477              might have be replaced by a generated stub. */
10478           if (!primary &&
10479               maybe_use_access_method (is_super_init, &list, &this_arg))
10480             {
10481               args = tree_cons (NULL_TREE, this_arg, args);
10482               this_arg = NULL_TREE; /* So it doesn't get chained twice */
10483             }
10484         }
10485     }
10486
10487   /* Merge point of all resolution schemes. If we have nothing, this
10488      is an error, already signaled */
10489   if (!list)
10490     PATCH_METHOD_RETURN_ERROR ();
10491
10492   /* Check accessibility, position the is_static flag, build and
10493      return the call */
10494   if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
10495                         (primary ? TREE_TYPE (TREE_TYPE (primary)) :
10496                          NULL_TREE), from_super)
10497       /* Calls to clone() on array types are permitted as a special-case. */
10498       && !is_array_clone_call)
10499     {
10500       const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list));
10501       const char *const access =
10502         accessibility_string (get_access_flags_from_decl (list));
10503       const char *const klass =
10504         IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list))));
10505       const char *const refklass =
10506         IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
10507       const char *const what = (DECL_CONSTRUCTOR_P (list)
10508                                 ? "constructor" : "method");
10509       /* FIXME: WFL yields the wrong message here but I don't know
10510          what else to use.  */
10511       parse_error_context (wfl,
10512                            "Can't access %s %s `%s.%s' from `%s'",
10513                            access, what, klass, fct_name, refklass);
10514       PATCH_METHOD_RETURN_ERROR ();
10515     }
10516
10517   /* Deprecation check: check whether the method being invoked or the
10518      instance-being-created's type are deprecated.  */
10519   if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10520     check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list)));
10521   check_deprecation (wfl, list);
10522
10523   /* If invoking a innerclass constructor, there are hidden parameters
10524      to pass */
10525   if (TREE_CODE (patch) == NEW_CLASS_EXPR
10526       && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10527     {
10528       /* And make sure we add the accessed local variables to be saved
10529          in field aliases. */
10530       args = build_alias_initializer_parameter_list
10531         (AIPL_FUNCTION_CTOR_INVOCATION, DECL_CONTEXT (list), args, NULL);
10532
10533       /* Secretly pass the current_this/primary as a second argument */
10534       if (primary || current_this)
10535         {
10536           tree extra_arg;
10537           tree this_type = (current_this ?
10538                             TREE_TYPE (TREE_TYPE (current_this)) : NULL_TREE);
10539           /* Method's (list) enclosing context */
10540           tree mec = DECL_CONTEXT (TYPE_NAME (DECL_CONTEXT (list)));
10541           /* If we have a primary, use it. */
10542           if (primary)
10543             extra_arg = primary;
10544           /* The current `this' is an inner class but isn't a direct
10545              enclosing context for the inner class we're trying to
10546              create. Build an access to the proper enclosing context
10547              and use it. */
10548           else if (current_this && PURE_INNER_CLASS_TYPE_P (this_type)
10549                    && this_type != TREE_TYPE (mec))
10550             {
10551
10552               extra_arg = build_access_to_thisn (current_class,
10553                                                  TREE_TYPE (mec), 0);
10554               extra_arg = java_complete_tree (extra_arg);
10555             }
10556           /* Otherwise, just use the current `this' as an enclosing
10557              context. */
10558           else
10559             extra_arg = current_this;
10560           args = tree_cons (NULL_TREE, extra_arg, args);
10561         }
10562       else
10563         args = tree_cons (NULL_TREE, integer_zero_node, args);
10564     }
10565
10566   /* This handles the situation where a constructor invocation needs
10567      to have an enclosing context passed as a second parameter (the
10568      constructor is one of an inner class). */
10569   if ((is_super_init ||
10570        (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node))
10571       && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
10572     {
10573       tree dest = TYPE_NAME (DECL_CONTEXT (list));
10574       tree extra_arg =
10575         build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0);
10576       extra_arg = java_complete_tree (extra_arg);
10577       args = tree_cons (NULL_TREE, extra_arg, args);
10578     }
10579
10580   is_static_flag = METHOD_STATIC (list);
10581   if (! is_static_flag && this_arg != NULL_TREE)
10582     args = tree_cons (NULL_TREE, this_arg, args);
10583
10584   /* In the context of an explicit constructor invocation, we can't
10585      invoke any method relying on `this'. Exceptions are: we're
10586      invoking a static function, primary exists and is not the current
10587      this, we're creating a new object. */
10588   if (ctxp->explicit_constructor_p
10589       && !is_static_flag
10590       && (!primary || primary == current_this)
10591       && (TREE_CODE (patch) != NEW_CLASS_EXPR))
10592     {
10593       parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called");
10594       PATCH_METHOD_RETURN_ERROR ();
10595     }
10596   java_parser_context_restore_global ();
10597   if (is_static)
10598     *is_static = is_static_flag;
10599   /* Sometimes, we want the decl of the selected method. Such as for
10600      EH checking */
10601   if (ret_decl)
10602     *ret_decl = list;
10603   patch = patch_invoke (patch, list, args);
10604
10605   /* Now is a good time to insert the call to finit$ */
10606   if (is_super_init && CLASS_HAS_FINIT_P (current_class))
10607     {
10608       tree finit_parms, finit_call;
10609
10610       /* Prepare to pass hidden parameters to finit$, if any. */
10611       finit_parms = build_alias_initializer_parameter_list
10612         (AIPL_FUNCTION_FINIT_INVOCATION, current_class, NULL_TREE, NULL);
10613
10614       finit_call =
10615         build_method_invocation (build_wfl_node (finit_identifier_node),
10616                                  finit_parms);
10617
10618       /* Generate the code used to initialize fields declared with an
10619          initialization statement and build a compound statement along
10620          with the super constructor invocation. */
10621       CAN_COMPLETE_NORMALLY (patch) = 1;
10622       patch = build (COMPOUND_EXPR, void_type_node, patch,
10623                      java_complete_tree (finit_call));
10624     }
10625   return patch;
10626 }
10627
10628 /* Check that we're not trying to do a static reference to a method in
10629    non static method. Return 1 if it's the case, 0 otherwise. */
10630
10631 static int
10632 check_for_static_method_reference (tree wfl, tree node, tree method,
10633                                    tree where, tree primary)
10634 {
10635   if (METHOD_STATIC (current_function_decl)
10636       && !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
10637     {
10638       char *fct_name = xstrdup (lang_printable_name (method, 0));
10639       parse_error_context
10640         (wfl, "Can't make static reference to method `%s %s' in class `%s'",
10641          lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
10642          IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
10643       free (fct_name);
10644       return 1;
10645     }
10646   return 0;
10647 }
10648
10649 /* Fix the invocation of *MDECL if necessary in the case of a
10650    invocation from an inner class. *THIS_ARG might be modified
10651    appropriately and an alternative access to *MDECL might be
10652    returned.  */
10653
10654 static int
10655 maybe_use_access_method (int is_super_init, tree *mdecl, tree *this_arg)
10656 {
10657   tree ctx;
10658   tree md = *mdecl, ta = *this_arg;
10659   int to_return = 0;
10660   int non_static_context = !METHOD_STATIC (md);
10661
10662   if (is_super_init
10663       || DECL_CONTEXT (md) == current_class
10664       || !PURE_INNER_CLASS_TYPE_P (current_class)
10665       || DECL_FINIT_P (md)
10666       || DECL_INSTINIT_P (md))
10667     return 0;
10668
10669   /* If we're calling a method found in an enclosing class, generate
10670      what it takes to retrieve the right this. Don't do that if we're
10671      invoking a static method. Note that if MD's type is unrelated to
10672      CURRENT_CLASS, then the current this can be used. */
10673
10674   if (non_static_context && DECL_CONTEXT (md) != object_type_node)
10675     {
10676       ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
10677       if (inherits_from_p (ctx, DECL_CONTEXT (md)))
10678         {
10679           ta = build_current_thisn (current_class);
10680           ta = build_wfl_node (ta);
10681         }
10682       else
10683         {
10684           tree type = ctx;
10685           while (type)
10686             {
10687               maybe_build_thisn_access_method (type);
10688               if (inherits_from_p (type, DECL_CONTEXT (md)))
10689                 {
10690                   ta = build_access_to_thisn (ctx, type, 0);
10691                   break;
10692                 }
10693               type = (DECL_CONTEXT (TYPE_NAME (type)) ?
10694                       TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))) : NULL_TREE);
10695             }
10696         }
10697       ta = java_complete_tree (ta);
10698     }
10699
10700   /* We might have to use an access method to get to MD. We can
10701      break the method access rule as far as we're not generating
10702      bytecode */
10703   if (METHOD_PRIVATE (md) && flag_emit_class_files)
10704     {
10705       md = build_outer_method_access_method (md);
10706       to_return = 1;
10707     }
10708
10709   *mdecl = md;
10710   *this_arg = ta;
10711
10712   /* Returning a nonzero value indicates we were doing a non static
10713      method invocation that is now a static invocation. It will have
10714      callee displace `this' to insert it in the regular argument
10715      list. */
10716   return (non_static_context && to_return);
10717 }
10718
10719 /* Patch an invoke expression METHOD and ARGS, based on its invocation
10720    mode.  */
10721
10722 static tree
10723 patch_invoke (tree patch, tree method, tree args)
10724 {
10725   tree dtable, func;
10726   tree original_call, t, ta;
10727   tree check = NULL_TREE;
10728
10729   /* Last step for args: convert build-in types. If we're dealing with
10730      a new TYPE() type call, the first argument to the constructor
10731      isn't found in the incoming argument list, but delivered by
10732      `new' */
10733   t = TYPE_ARG_TYPES (TREE_TYPE (method));
10734   if (TREE_CODE (patch) == NEW_CLASS_EXPR)
10735     t = TREE_CHAIN (t);
10736   for (ta = args; t != end_params_node && ta;
10737        t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
10738     if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
10739         TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
10740       TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
10741
10742   /* Resolve unresolved returned type issues */
10743   t = TREE_TYPE (TREE_TYPE (method));
10744   if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
10745     resolve_and_layout (TREE_TYPE (t), NULL);
10746
10747   if (flag_emit_class_files || flag_emit_xref)
10748     func = method;
10749   else
10750     {
10751       switch (invocation_mode (method, CALL_USING_SUPER (patch)))
10752         {
10753         case INVOKE_VIRTUAL:
10754           dtable = invoke_build_dtable (0, args);
10755           func = build_invokevirtual (dtable, method);
10756           break;
10757
10758         case INVOKE_NONVIRTUAL:
10759           /* If the object for the method call is null, we throw an
10760              exception.  We don't do this if the object is the current
10761              method's `this'.  In other cases we just rely on an
10762              optimization pass to eliminate redundant checks.  */
10763           if (TREE_VALUE (args) != current_this)
10764             {
10765               /* We use a save_expr here to make sure we only evaluate
10766                  the new `self' expression once.  */
10767               tree save_arg = save_expr (TREE_VALUE (args));
10768               TREE_VALUE (args) = save_arg;
10769               check = java_check_reference (save_arg, 1);
10770             }
10771           /* Fall through.  */
10772
10773         case INVOKE_SUPER:
10774         case INVOKE_STATIC:
10775           {
10776             tree signature = build_java_signature (TREE_TYPE (method));
10777             func = build_known_method_ref (method, TREE_TYPE (method),
10778                                            DECL_CONTEXT (method),
10779                                            signature, args);
10780           }
10781           break;
10782
10783         case INVOKE_INTERFACE:
10784           dtable = invoke_build_dtable (1, args);
10785           func = build_invokeinterface (dtable, method);
10786           break;
10787
10788         default:
10789           abort ();
10790         }
10791
10792       /* Ensure self_type is initialized, (invokestatic). FIXME */
10793       func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
10794     }
10795
10796   TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
10797   TREE_OPERAND (patch, 0) = func;
10798   TREE_OPERAND (patch, 1) = args;
10799   patch = check_for_builtin (method, patch);
10800   original_call = patch;
10801
10802   /* We're processing a `new TYPE ()' form. New is called and its
10803      returned value is the first argument to the constructor. We build
10804      a COMPOUND_EXPR and use saved expression so that the overall NEW
10805      expression value is a pointer to a newly created and initialized
10806      class. */
10807   if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
10808     {
10809       tree class = DECL_CONTEXT (method);
10810       tree c1, saved_new, size, new;
10811       tree alloc_node;
10812
10813       if (flag_emit_class_files || flag_emit_xref)
10814         {
10815           TREE_TYPE (patch) = build_pointer_type (class);
10816           return patch;
10817         }
10818       if (!TYPE_SIZE (class))
10819         safe_layout_class (class);
10820       size = size_in_bytes (class);
10821       alloc_node =
10822         (class_has_finalize_method (class) ? alloc_object_node
10823                                            : alloc_no_finalizer_node);
10824       new = build (CALL_EXPR, promote_type (class),
10825                      build_address_of (alloc_node),
10826                      build_tree_list (NULL_TREE, build_class_ref (class)),
10827                      NULL_TREE);
10828       saved_new = save_expr (new);
10829       c1 = build_tree_list (NULL_TREE, saved_new);
10830       TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
10831       TREE_OPERAND (original_call, 1) = c1;
10832       TREE_SET_CODE (original_call, CALL_EXPR);
10833       patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
10834     }
10835
10836   /* If CHECK is set, then we are building a check to see if the object
10837      is NULL.  */
10838   if (check != NULL_TREE)
10839     {
10840       /* We have to call force_evaluation_order now because creating a
10841          COMPOUND_EXPR wraps the arg list in a way that makes it
10842          unrecognizable by force_evaluation_order later.  Yuk.  */
10843       patch = build (COMPOUND_EXPR, TREE_TYPE (patch), check, 
10844                      force_evaluation_order (patch));
10845       TREE_SIDE_EFFECTS (patch) = 1;
10846     }
10847
10848   /* In order to be able to modify PATCH later, we SAVE_EXPR it and
10849      put it as the first expression of a COMPOUND_EXPR. The second
10850      expression being an empty statement to be later patched if
10851      necessary. We remember a TREE_LIST (the PURPOSE is the method,
10852      the VALUE is the compound) in a hashtable and return a
10853      COMPOUND_EXPR built so that the result of the evaluation of the
10854      original PATCH node is returned. */
10855   if (STATIC_CLASS_INIT_OPT_P ()
10856       && current_function_decl && METHOD_STATIC (method))
10857     {
10858       tree list;
10859       tree fndecl = current_function_decl;
10860       /* We have to call force_evaluation_order now because creating a
10861          COMPOUND_EXPR wraps the arg list in a way that makes it
10862          unrecognizable by force_evaluation_order later.  Yuk.  */
10863       tree save = force_evaluation_order (patch);
10864       tree type = TREE_TYPE (patch);
10865
10866       patch = build (COMPOUND_EXPR, type, save, build_java_empty_stmt ());
10867       list = tree_cons (method, patch,
10868                         DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl));
10869
10870       DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list;
10871
10872       patch = build (COMPOUND_EXPR, type, patch, save);
10873     }
10874
10875   return patch;
10876 }
10877
10878 static int
10879 invocation_mode (tree method, int super)
10880 {
10881   int access = get_access_flags_from_decl (method);
10882
10883   if (super)
10884     return INVOKE_SUPER;
10885
10886   if (access & ACC_STATIC)
10887     return INVOKE_STATIC;
10888
10889   /* We have to look for a constructor before we handle nonvirtual
10890      calls; otherwise the constructor will look nonvirtual.  */
10891   if (DECL_CONSTRUCTOR_P (method))
10892     return INVOKE_STATIC;
10893
10894   if (access & ACC_FINAL || access & ACC_PRIVATE)
10895     return INVOKE_NONVIRTUAL;
10896
10897   if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
10898     return INVOKE_NONVIRTUAL;
10899
10900   if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
10901     return INVOKE_INTERFACE;
10902
10903   return INVOKE_VIRTUAL;
10904 }
10905
10906 /* Retrieve a refined list of matching methods. It covers the step
10907    15.11.2 (Compile-Time Step 2) */
10908
10909 static tree
10910 lookup_method_invoke (int lc, tree cl, tree class, tree name, tree arg_list)
10911 {
10912   tree atl = end_params_node;           /* Arg Type List */
10913   tree method, signature, list, node;
10914   const char *candidates;               /* Used for error report */
10915   char *dup;
10916
10917   /* Fix the arguments */
10918   for (node = arg_list; node; node = TREE_CHAIN (node))
10919     {
10920       tree current_arg = TREE_TYPE (TREE_VALUE (node));
10921       /* Non primitive type may have to be resolved */
10922       if (!JPRIMITIVE_TYPE_P (current_arg))
10923         resolve_and_layout (current_arg, NULL_TREE);
10924       /* And promoted */
10925       if (TREE_CODE (current_arg) == RECORD_TYPE)
10926         current_arg = promote_type (current_arg);
10927       atl = tree_cons (NULL_TREE, current_arg, atl);
10928     }
10929
10930   /* Presto. If we're dealing with an anonymous class and a
10931      constructor call, generate the right constructor now, since we
10932      know the arguments' types. */
10933
10934   if (lc && ANONYMOUS_CLASS_P (class))
10935     {
10936       tree saved_current_class;
10937       tree mdecl = craft_constructor (TYPE_NAME (class), atl);
10938       saved_current_class = current_class;
10939       current_class = class;
10940       fix_constructors (mdecl);
10941       current_class = saved_current_class;
10942     }
10943
10944   /* Find all candidates and then refine the list, searching for the
10945      most specific method. */
10946   list = find_applicable_accessible_methods_list (lc, class, name, atl);
10947   list = find_most_specific_methods_list (list);
10948   if (list && !TREE_CHAIN (list))
10949     return TREE_VALUE (list);
10950
10951   /* Issue an error. List candidates if any. Candidates are listed
10952      only if accessible (non accessible methods may end-up here for
10953      the sake of a better error report). */
10954   candidates = NULL;
10955   if (list)
10956     {
10957       tree current;
10958       obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
10959       for (current = list; current; current = TREE_CHAIN (current))
10960         {
10961           tree cm = TREE_VALUE (current);
10962           char string [4096];
10963           if (!cm || not_accessible_p (class, cm, NULL_TREE, 0))
10964             continue;
10965           sprintf
10966             (string, "  `%s' in `%s'%s",
10967              get_printable_method_name (cm),
10968              IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
10969              (TREE_CHAIN (current) ? "\n" : ""));
10970           obstack_grow (&temporary_obstack, string, strlen (string));
10971         }
10972       obstack_1grow (&temporary_obstack, '\0');
10973       candidates = obstack_finish (&temporary_obstack);
10974     }
10975   /* Issue the error message */
10976   method = make_node (FUNCTION_TYPE);
10977   TYPE_ARG_TYPES (method) = atl;
10978   signature = build_java_argument_signature (method);
10979   dup = xstrdup (lang_printable_name (class, 0));
10980   parse_error_context (cl, "Can't find %s `%s(%s)' in type `%s'%s",
10981                        (lc ? "constructor" : "method"),
10982                        (lc ? dup : IDENTIFIER_POINTER (name)),
10983                        IDENTIFIER_POINTER (signature), dup,
10984                        (candidates ? candidates : ""));
10985   free (dup);
10986   return NULL_TREE;
10987 }
10988
10989 /* 15.11.2.1: Find Methods that are Applicable and Accessible. LC is 1
10990    when we're looking for a constructor. */
10991
10992 static tree
10993 find_applicable_accessible_methods_list (int lc, tree class, tree name,
10994                                          tree arglist)
10995 {
10996   static htab_t searched_classes;
10997   static int search_not_done = 0;
10998   tree list = NULL_TREE, all_list = NULL_TREE;
10999
11000   /* Check the hash table to determine if this class has been searched
11001      already. */
11002   if (searched_classes)
11003     {
11004       if (htab_find (searched_classes, class) != NULL)
11005         return NULL;
11006     }
11007   else
11008     {
11009       searched_classes = htab_create (10, htab_hash_pointer,
11010                                       htab_eq_pointer, NULL);
11011     }
11012
11013   search_not_done++;
11014   *htab_find_slot (searched_classes, class, INSERT) = class;
11015
11016   if (!CLASS_LOADED_P (class))
11017     {
11018       load_class (class, 1);
11019       safe_layout_class (class);
11020     }
11021
11022   /* Search interfaces */
11023   if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL
11024       && CLASS_INTERFACE (TYPE_NAME (class)))
11025     {
11026       int i, n;
11027       tree basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (class));
11028       search_applicable_methods_list (lc, TYPE_METHODS (class),
11029                                       name, arglist, &list, &all_list);
11030       n = TREE_VEC_LENGTH (basetype_vec);
11031       for (i = 1; i < n; i++)
11032         {
11033           tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11034           tree rlist;
11035
11036           rlist = find_applicable_accessible_methods_list (lc,  t, name,
11037                                                            arglist);
11038           list = chainon (rlist, list);
11039         }
11040     }
11041   /* Search classes */
11042   else
11043     {
11044       search_applicable_methods_list (lc, TYPE_METHODS (class),
11045                                       name, arglist, &list, &all_list);
11046
11047       /* When looking finit$, class$ or instinit$, we turn LC to 1 so
11048          that we only search in class. Note that we should have found
11049          something at this point. */
11050       if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name))
11051         {
11052           lc = 1;
11053           if (!list)
11054             abort ();
11055         }
11056
11057       /* We must search all interfaces of this class */
11058       if (!lc)
11059       {
11060         tree basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (class));
11061         int n = TREE_VEC_LENGTH (basetype_vec), i;
11062         for (i = 1; i < n; i++)
11063           {
11064             tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
11065             if (t != object_type_node)
11066               {
11067                 tree rlist
11068                   = find_applicable_accessible_methods_list (lc, t,
11069                                                              name, arglist);
11070                 list = chainon (rlist, list);
11071               }
11072           }
11073       }
11074
11075       /* Search superclass */
11076       if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
11077         {
11078           tree rlist;
11079           class = CLASSTYPE_SUPER (class);
11080           rlist = find_applicable_accessible_methods_list (lc, class,
11081                                                            name, arglist);
11082           list = chainon (rlist, list);
11083         }
11084     }
11085
11086   search_not_done--;
11087
11088   /* We're done. Reset the searched classes list and finally search
11089      java.lang.Object if it wasn't searched already. */
11090   if (!search_not_done)
11091     {
11092       if (!lc
11093           && TYPE_METHODS (object_type_node)
11094           && htab_find (searched_classes, object_type_node) == NULL)
11095         {
11096           search_applicable_methods_list (lc,
11097                                           TYPE_METHODS (object_type_node),
11098                                           name, arglist, &list, &all_list);
11099         }
11100       htab_delete (searched_classes);
11101       searched_classes = NULL;
11102     }
11103
11104   /* Either return the list obtained or all selected (but
11105      inaccessible) methods for better error report. */
11106   return (!list ? all_list : list);
11107 }
11108
11109 /* Effectively search for the appropriate method in method */
11110
11111 static void
11112 search_applicable_methods_list (int lc, tree method, tree name, tree arglist,
11113                                 tree *list, tree *all_list)
11114 {
11115   for (; method; method = TREE_CHAIN (method))
11116     {
11117       /* When dealing with constructor, stop here, otherwise search
11118          other classes */
11119       if (lc && !DECL_CONSTRUCTOR_P (method))
11120         continue;
11121       else if (!lc && (DECL_CONSTRUCTOR_P (method)
11122                        || (DECL_NAME (method) != name)))
11123         continue;
11124
11125       if (argument_types_convertible (method, arglist))
11126         {
11127           /* Retain accessible methods only */
11128           if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
11129                                  method, NULL_TREE, 0))
11130             *list = tree_cons (NULL_TREE, method, *list);
11131           else
11132             /* Also retain all selected method here */
11133             *all_list = tree_cons (NULL_TREE, method, *list);
11134         }
11135     }
11136 }
11137
11138 /* 15.11.2.2 Choose the Most Specific Method */
11139
11140 static tree
11141 find_most_specific_methods_list (tree list)
11142 {
11143   int max = 0;
11144   int abstract, candidates;
11145   tree current, new_list = NULL_TREE;
11146   for (current = list; current; current = TREE_CHAIN (current))
11147     {
11148       tree method;
11149       DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
11150
11151       for (method = list; method; method = TREE_CHAIN (method))
11152         {
11153           tree method_v, current_v;
11154           /* Don't test a method against itself */
11155           if (method == current)
11156             continue;
11157
11158           method_v = TREE_VALUE (method);
11159           current_v = TREE_VALUE (current);
11160
11161           /* Compare arguments and location where methods where declared */
11162           if (argument_types_convertible (method_v, current_v))
11163             {
11164               if (valid_method_invocation_conversion_p
11165                   (DECL_CONTEXT (method_v), DECL_CONTEXT (current_v))
11166                   || (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v))
11167                       && enclosing_context_p (DECL_CONTEXT (method_v),
11168                                               DECL_CONTEXT (current_v))))
11169                 {
11170                   int v = (DECL_SPECIFIC_COUNT (current_v) +=
11171                     (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v)) ? 2 : 1));
11172                   max = (v > max ? v : max);
11173                 }
11174             }
11175         }
11176     }
11177
11178   /* Review the list and select the maximally specific methods */
11179   for (current = list, abstract = -1, candidates = -1;
11180        current; current = TREE_CHAIN (current))
11181     if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11182       {
11183         new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11184         abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0);
11185         candidates++;
11186       }
11187
11188   /* If we have several and they're all abstract, just pick the
11189      closest one. */
11190   if (candidates > 0 && candidates == abstract)
11191     {
11192       /* FIXME: merge the throws clauses.  There is no convenient way
11193          to do this in gcj right now, since ideally we'd like to
11194          introduce a new METHOD_DECL here, but that is really not
11195          possible.  */
11196       new_list = nreverse (new_list);
11197       TREE_CHAIN (new_list) = NULL_TREE;
11198       return new_list;
11199     }
11200
11201   /* We have several (we couldn't find a most specific), all but one
11202      are abstract, we pick the only non abstract one. */
11203   if (candidates > 0 && (candidates == abstract+1))
11204     {
11205       for (current = new_list; current; current = TREE_CHAIN (current))
11206         if (!METHOD_ABSTRACT (TREE_VALUE (current)))
11207           {
11208             TREE_CHAIN (current) = NULL_TREE;
11209             new_list = current;
11210           }
11211     }
11212
11213   /* If we can't find one, lower expectations and try to gather multiple
11214      maximally specific methods */
11215   while (!new_list && max)
11216     {
11217       while (--max > 0)
11218         {
11219           if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
11220             new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
11221         }
11222     }
11223
11224   return new_list;
11225 }
11226
11227 /* Make sure that the type of each M2_OR_ARGLIST arguments can be
11228    converted by method invocation conversion (5.3) to the type of the
11229    corresponding parameter of M1. Implementation expects M2_OR_ARGLIST
11230    to change less often than M1. */
11231
11232 static GTY(()) tree m2_arg_value;
11233 static GTY(()) tree m2_arg_cache;
11234
11235 static int
11236 argument_types_convertible (tree m1, tree m2_or_arglist)
11237 {
11238   tree m1_arg, m2_arg;
11239
11240   SKIP_THIS_AND_ARTIFICIAL_PARMS (m1_arg, m1)
11241
11242   if (m2_arg_value == m2_or_arglist)
11243     m2_arg = m2_arg_cache;
11244   else
11245     {
11246       /* M2_OR_ARGLIST can be a function DECL or a raw list of
11247          argument types */
11248       if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
11249         {
11250           m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
11251           if (!METHOD_STATIC (m2_or_arglist))
11252             m2_arg = TREE_CHAIN (m2_arg);
11253         }
11254       else
11255         m2_arg = m2_or_arglist;
11256
11257       m2_arg_value = m2_or_arglist;
11258       m2_arg_cache = m2_arg;
11259     }
11260
11261   while (m1_arg != end_params_node && m2_arg != end_params_node)
11262     {
11263       resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
11264       if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
11265                                                  TREE_VALUE (m2_arg)))
11266         break;
11267       m1_arg = TREE_CHAIN (m1_arg);
11268       m2_arg = TREE_CHAIN (m2_arg);
11269     }
11270   return m1_arg == end_params_node && m2_arg == end_params_node;
11271 }
11272
11273 /* Qualification routines */
11274
11275 /* Given a name x.y.z, look up x locally.  If it's found, save the
11276    decl.  If it's not found, mark the name as RESOLVE_PACKAGE_NAME_P,
11277    so that we later try and load the appropriate classes.  */
11278 static void
11279 qualify_ambiguous_name (tree id)
11280 {
11281   tree name, decl;
11282
11283   /* We inspect the first item of the qualification list.  As a sanity
11284      check, make sure that it is an identfier node.  */
11285   tree qual = EXPR_WFL_QUALIFICATION (id);
11286   tree qual_wfl = QUAL_WFL (qual);
11287
11288   if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
11289     return;
11290
11291   name = EXPR_WFL_NODE (qual_wfl);
11292
11293   /* If we don't have an identifier, or we have a 'this' or 'super',
11294      then field access processing is all we need : there is nothing
11295      for us to do.  */
11296   if (!name || TREE_CODE (name) != IDENTIFIER_NODE ||
11297       name == this_identifier_node ||
11298       name == super_identifier_node)
11299     return;
11300
11301   /* If name appears within the scope of a local variable declaration
11302      or parameter declaration, or is a field within an enclosing
11303      class, then it is an expression name.  Save the decl and let
11304      resolve_field_access do it's work.  */
11305   if ((decl = IDENTIFIER_LOCAL_VALUE (name)) ||
11306       (decl = lookup_field_wrapper (current_class, name)))
11307     {
11308       QUAL_RESOLUTION (qual) = decl;
11309       return;
11310     }
11311
11312   /* If name is a known class name (either declared or imported), mark
11313      us as a type name.  */
11314   if ((decl = resolve_and_layout (name, NULL_TREE)))
11315     {
11316       RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
11317       QUAL_RESOLUTION (qual) = decl;
11318     }
11319
11320   /* Check here that NAME isn't declared by more than one
11321      type-import-on-demand declaration of the compilation unit
11322      containing NAME. FIXME */
11323
11324   /* We couldn't find a declaration for the name.  Assume for now that
11325      we have a qualified class name that needs to be loaded from an
11326      external class file.  */
11327   else
11328     RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
11329
11330   /* Propagate the qualification across other components of the
11331      qualified name */
11332   for (qual = TREE_CHAIN (qual); qual;
11333        qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
11334     {
11335       if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11336         RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
11337     }
11338
11339   /* Store the global qualification for the ambiguous part of ID back
11340      into ID fields */
11341   if (RESOLVE_TYPE_NAME_P (qual_wfl))
11342     RESOLVE_TYPE_NAME_P (id) = 1;
11343   else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
11344     RESOLVE_PACKAGE_NAME_P (id) = 1;
11345 }
11346
11347 /* Patch tree nodes in a function body. When a BLOCK is found, push
11348    local variable decls if present.
11349    Same as java_complete_lhs, but does resolve static finals to values. */
11350
11351 static tree
11352 java_complete_tree (tree node)
11353 {
11354   node = java_complete_lhs (node);
11355   if (JDECL_P (node) && CLASS_FINAL_VARIABLE_P (node)
11356       && DECL_INITIAL (node) != NULL_TREE
11357       && !flag_emit_xref)
11358     {
11359       tree value = fold_constant_for_init (node, node);
11360       if (value != NULL_TREE)
11361         return value;
11362     }
11363   return node;
11364 }
11365
11366 static tree
11367 java_stabilize_reference (tree node)
11368 {
11369   if (TREE_CODE (node) == COMPOUND_EXPR)
11370     {
11371       tree op0 = TREE_OPERAND (node, 0);
11372       tree op1 = TREE_OPERAND (node, 1);
11373       TREE_OPERAND (node, 0) = save_expr (op0);
11374       TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
11375       return node;
11376     }
11377   return stabilize_reference (node);
11378 }
11379
11380 /* Patch tree nodes in a function body. When a BLOCK is found, push
11381    local variable decls if present.
11382    Same as java_complete_tree, but does not resolve static finals to values. */
11383
11384 static tree
11385 java_complete_lhs (tree node)
11386 {
11387   tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
11388   int flag;
11389
11390   /* CONVERT_EXPR always has its type set, even though it needs to be
11391      worked out. */
11392   if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
11393     return node;
11394
11395   /* The switch block implements cases processing container nodes
11396      first.  Contained nodes are always written back. Leaves come
11397      next and return a value. */
11398   switch (TREE_CODE (node))
11399     {
11400     case BLOCK:
11401
11402       /* 1- Block section.
11403          Set the local values on decl names so we can identify them
11404          faster when they're referenced. At that stage, identifiers
11405          are legal so we don't check for declaration errors. */
11406       for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11407         {
11408           DECL_CONTEXT (cn) = current_function_decl;
11409           IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
11410         }
11411       if (BLOCK_EXPR_BODY (node) == NULL_TREE)
11412           CAN_COMPLETE_NORMALLY (node) = 1;
11413       else
11414         {
11415           tree stmt = BLOCK_EXPR_BODY (node);
11416           tree *ptr;
11417           int error_seen = 0;
11418           if (TREE_CODE (stmt) == COMPOUND_EXPR)
11419             {
11420               /* Re-order from (((A; B); C); ...; Z) to
11421                  (A; (B; (C ; (...; Z)))).
11422                  This makes it easier to scan the statements left-to-right
11423                  without using recursion (which might overflow the stack
11424                  if the block has many statements. */
11425               for (;;)
11426                 {
11427                   tree left = TREE_OPERAND (stmt, 0);
11428                   if (TREE_CODE (left) != COMPOUND_EXPR)
11429                     break;
11430                   TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
11431                   TREE_OPERAND (left, 1) = stmt;
11432                   stmt = left;
11433                 }
11434               BLOCK_EXPR_BODY (node) = stmt;
11435             }
11436
11437           /* Now do the actual complete, without deep recursion for
11438              long blocks. */
11439           ptr = &BLOCK_EXPR_BODY (node);
11440           while (TREE_CODE (*ptr) == COMPOUND_EXPR
11441                  && !IS_EMPTY_STMT (TREE_OPERAND (*ptr, 1)))
11442             {
11443               tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
11444               tree *next = &TREE_OPERAND (*ptr, 1);
11445               TREE_OPERAND (*ptr, 0) = cur;
11446               if (IS_EMPTY_STMT (cur))
11447                 {
11448                   /* Optimization;  makes it easier to detect empty bodies.
11449                      Most useful for <clinit> with all-constant initializer. */
11450                   *ptr = *next;
11451                   continue;
11452                 }
11453               if (TREE_CODE (cur) == ERROR_MARK)
11454                 error_seen++;
11455               else if (! CAN_COMPLETE_NORMALLY (cur))
11456                 {
11457                   wfl_op2 = *next;
11458                   for (;;)
11459                     {
11460                       if (TREE_CODE (wfl_op2) == BLOCK)
11461                         wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
11462                       else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
11463                         wfl_op2 = TREE_OPERAND (wfl_op2, 0);
11464                       else
11465                         break;
11466                     }
11467                   if (TREE_CODE (wfl_op2) != CASE_EXPR
11468                       && TREE_CODE (wfl_op2) != DEFAULT_EXPR)
11469                     unreachable_stmt_error (*ptr);
11470                 }
11471               if (TREE_TYPE (*ptr) == NULL_TREE)
11472                 TREE_TYPE (*ptr) = void_type_node;
11473               ptr = next;
11474             }
11475           *ptr = java_complete_tree (*ptr);
11476
11477           if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
11478             return error_mark_node;
11479           CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
11480         }
11481       /* Turn local bindings to null */
11482       for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
11483         IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
11484
11485       TREE_TYPE (node) = void_type_node;
11486       break;
11487
11488       /* 2- They are expressions but ultimately deal with statements */
11489
11490     case THROW_EXPR:
11491       wfl_op1 = TREE_OPERAND (node, 0);
11492       COMPLETE_CHECK_OP_0 (node);
11493       /* 14.19 A throw statement cannot complete normally. */
11494       CAN_COMPLETE_NORMALLY (node) = 0;
11495       return patch_throw_statement (node, wfl_op1);
11496
11497     case SYNCHRONIZED_EXPR:
11498       wfl_op1 = TREE_OPERAND (node, 0);
11499       return patch_synchronized_statement (node, wfl_op1);
11500
11501     case TRY_EXPR:
11502       return patch_try_statement (node);
11503
11504     case TRY_FINALLY_EXPR:
11505       COMPLETE_CHECK_OP_0 (node);
11506       COMPLETE_CHECK_OP_1 (node);
11507       if (IS_EMPTY_STMT (TREE_OPERAND (node, 0)))
11508         /* Reduce try/finally nodes with an empty try block.  */
11509         return TREE_OPERAND (node, 1);
11510       if (IS_EMPTY_STMT (TREE_OPERAND (node, 1)))
11511         /* Likewise for an empty finally block.  */
11512         return TREE_OPERAND (node, 0);
11513       CAN_COMPLETE_NORMALLY (node)
11514         = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11515            && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11516       TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
11517       return node;
11518
11519     case LABELED_BLOCK_EXPR:
11520       PUSH_LABELED_BLOCK (node);
11521       if (LABELED_BLOCK_BODY (node))
11522         COMPLETE_CHECK_OP_1 (node);
11523       TREE_TYPE (node) = void_type_node;
11524       POP_LABELED_BLOCK ();
11525
11526       if (IS_EMPTY_STMT (LABELED_BLOCK_BODY (node)))
11527         {
11528           LABELED_BLOCK_BODY (node) = NULL_TREE;
11529           CAN_COMPLETE_NORMALLY (node) = 1;
11530         }
11531       else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
11532         CAN_COMPLETE_NORMALLY (node) = 1;
11533       return node;
11534
11535     case EXIT_BLOCK_EXPR:
11536       /* We don't complete operand 1, because it's the return value of
11537          the EXIT_BLOCK_EXPR which doesn't exist it Java */
11538       return patch_bc_statement (node);
11539
11540     case CASE_EXPR:
11541       cn = java_complete_tree (TREE_OPERAND (node, 0));
11542       if (cn == error_mark_node)
11543         return cn;
11544
11545       /* First, the case expression must be constant. Values of final
11546          fields are accepted. */
11547       cn = fold (cn);
11548       if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
11549           && JDECL_P (TREE_OPERAND (cn, 1))
11550           && FIELD_FINAL (TREE_OPERAND (cn, 1))
11551           && DECL_INITIAL (TREE_OPERAND (cn, 1)))
11552         {
11553           cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
11554                                        TREE_OPERAND (cn, 1));
11555         }
11556       /* Accept final locals too. */
11557       else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn) 
11558                && DECL_INITIAL (cn))
11559         cn = fold_constant_for_init (DECL_INITIAL (cn), cn);
11560
11561       if (!TREE_CONSTANT (cn) && !flag_emit_xref)
11562         {
11563           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11564           parse_error_context (node, "Constant expression required");
11565           return error_mark_node;
11566         }
11567
11568       nn = ctxp->current_loop;
11569
11570       /* It must be assignable to the type of the switch expression. */
11571       if (!try_builtin_assignconv (NULL_TREE,
11572                                    TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
11573         {
11574           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11575           parse_error_context
11576             (wfl_operator,
11577              "Incompatible type for case. Can't convert `%s' to `int'",
11578              lang_printable_name (TREE_TYPE (cn), 0));
11579           return error_mark_node;
11580         }
11581
11582       cn = fold (convert (int_type_node, cn));
11583       TREE_CONSTANT_OVERFLOW (cn) = 0;
11584       CAN_COMPLETE_NORMALLY (cn) = 1;
11585
11586       /* Save the label on a list so that we can later check for
11587          duplicates.  */
11588       case_label_list = tree_cons (node, cn, case_label_list);
11589
11590       /* Multiple instance of a case label bearing the same value is
11591          checked later. The case expression is all right so far. */
11592       if (TREE_CODE (cn) == VAR_DECL)
11593         cn = DECL_INITIAL (cn);
11594       TREE_OPERAND (node, 0) = cn;
11595       TREE_TYPE (node) = void_type_node;
11596       CAN_COMPLETE_NORMALLY (node) = 1;
11597       TREE_SIDE_EFFECTS (node) = 1;
11598       break;
11599
11600     case DEFAULT_EXPR:
11601       nn = ctxp->current_loop;
11602       /* Only one default label is allowed per switch statement */
11603       if (SWITCH_HAS_DEFAULT (nn))
11604         {
11605           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
11606           parse_error_context (wfl_operator,
11607                                "Duplicate case label: `default'");
11608           return error_mark_node;
11609         }
11610       else
11611         SWITCH_HAS_DEFAULT (nn) = 1;
11612       TREE_TYPE (node) = void_type_node;
11613       TREE_SIDE_EFFECTS (node) = 1;
11614       CAN_COMPLETE_NORMALLY (node) = 1;
11615       break;
11616
11617     case SWITCH_EXPR:
11618     case LOOP_EXPR:
11619       PUSH_LOOP (node);
11620       /* Check whether the loop was enclosed in a labeled
11621          statement. If not, create one, insert the loop in it and
11622          return the node */
11623       nn = patch_loop_statement (node);
11624
11625       /* Anyways, walk the body of the loop */
11626       if (TREE_CODE (node) == LOOP_EXPR)
11627         TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11628       /* Switch statement: walk the switch expression and the cases */
11629       else
11630         node = patch_switch_statement (node);
11631
11632       if (node == error_mark_node || TREE_OPERAND (node, 0) == error_mark_node)
11633         nn = error_mark_node;
11634       else
11635         {
11636           TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
11637           /* If we returned something different, that's because we
11638              inserted a label. Pop the label too. */
11639           if (nn != node)
11640             {
11641               if (CAN_COMPLETE_NORMALLY (node))
11642                 CAN_COMPLETE_NORMALLY (nn) = 1;
11643               POP_LABELED_BLOCK ();
11644             }
11645         }
11646       POP_LOOP ();
11647       return nn;
11648
11649     case EXIT_EXPR:
11650       TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11651       return patch_exit_expr (node);
11652
11653     case COND_EXPR:
11654       /* Condition */
11655       TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
11656       if (TREE_OPERAND (node, 0) == error_mark_node)
11657         return error_mark_node;
11658       /* then-else branches */
11659       TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11660       if (TREE_OPERAND (node, 1) == error_mark_node)
11661         return error_mark_node;
11662       TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
11663       if (TREE_OPERAND (node, 2) == error_mark_node)
11664         return error_mark_node;
11665       return patch_if_else_statement (node);
11666       break;
11667
11668     case CONDITIONAL_EXPR:
11669       /* Condition */
11670       wfl_op1 = TREE_OPERAND (node, 0);
11671       COMPLETE_CHECK_OP_0 (node);
11672       wfl_op2 = TREE_OPERAND (node, 1);
11673       COMPLETE_CHECK_OP_1 (node);
11674       wfl_op3 = TREE_OPERAND (node, 2);
11675       COMPLETE_CHECK_OP_2 (node);
11676       return patch_conditional_expr (node, wfl_op1, wfl_op2);
11677
11678       /* 3- Expression section */
11679     case COMPOUND_EXPR:
11680       wfl_op2 = TREE_OPERAND (node, 1);
11681       TREE_OPERAND (node, 0) = nn =
11682         java_complete_tree (TREE_OPERAND (node, 0));
11683       if (IS_EMPTY_STMT (wfl_op2))
11684         CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
11685       else
11686         {
11687           if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
11688             {
11689               /* An unreachable condition in a do-while statement
11690                  is *not* (technically) an unreachable statement. */
11691               nn = wfl_op2;
11692               if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
11693                 nn = EXPR_WFL_NODE (nn);
11694               /* NN can be NULL_TREE exactly when UPDATE is, in
11695                  finish_for_loop.  */
11696               if (nn != NULL_TREE && TREE_CODE (nn) != EXIT_EXPR)
11697                 {
11698                   SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
11699                   if (SUPPRESS_UNREACHABLE_ERROR (nn))
11700                     {
11701                       /* Perhaps this warning should have an
11702                          associated flag.  The code being compiled is
11703                          pedantically correct, but useless.  */
11704                       parse_warning_context (wfl_operator,
11705                                              "Unreachable statement");
11706                     }
11707                   else
11708                     parse_error_context (wfl_operator,
11709                                          "Unreachable statement");
11710                 }
11711             }
11712           TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
11713           if (TREE_OPERAND (node, 1) == error_mark_node)
11714             return error_mark_node;
11715           /* Even though we might allow the case where the first
11716              operand doesn't return normally, we still should compute
11717              CAN_COMPLETE_NORMALLY correctly.  */
11718           CAN_COMPLETE_NORMALLY (node)
11719             = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
11720                && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
11721         }
11722       TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
11723       break;
11724
11725     case RETURN_EXPR:
11726       /* CAN_COMPLETE_NORMALLY (node) = 0; */
11727       return patch_return (node);
11728
11729     case EXPR_WITH_FILE_LOCATION:
11730       if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
11731           || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
11732         {
11733           tree wfl = node;
11734           node = resolve_expression_name (node, NULL);
11735           if (node == error_mark_node)
11736             return node;
11737           /* Keep line number information somewhere were it doesn't
11738              disrupt the completion process. */
11739           if (flag_emit_xref && TREE_CODE (node) != CALL_EXPR)
11740             {
11741               EXPR_WFL_NODE (wfl) = TREE_OPERAND (node, 1);
11742               TREE_OPERAND (node, 1) = wfl;
11743             }
11744           CAN_COMPLETE_NORMALLY (node) = 1;
11745         }
11746       else
11747         {
11748           tree body;
11749           int save_lineno = input_line;
11750           input_line = EXPR_WFL_LINENO (node);
11751           body = java_complete_tree (EXPR_WFL_NODE (node));
11752           input_line = save_lineno;
11753           EXPR_WFL_NODE (node) = body;
11754           TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
11755           CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
11756           if (IS_EMPTY_STMT (body) || TREE_CONSTANT (body))
11757             {
11758               /* Makes it easier to constant fold, detect empty bodies. */
11759               return body;
11760             }
11761           if (body == error_mark_node)
11762             {
11763               /* Its important for the evaluation of assignment that
11764                  this mark on the TREE_TYPE is propagated. */
11765               TREE_TYPE (node) = error_mark_node;
11766               return error_mark_node;
11767             }
11768           else
11769             TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
11770
11771         }
11772       break;
11773
11774     case NEW_ARRAY_EXPR:
11775       /* Patch all the dimensions */
11776       flag = 0;
11777       for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
11778         {
11779           int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
11780           tree dim = convert (int_type_node,
11781                               java_complete_tree (TREE_VALUE (cn)));
11782           if (dim == error_mark_node)
11783             {
11784               flag = 1;
11785               continue;
11786             }
11787           else
11788             {
11789               TREE_VALUE (cn) = dim;
11790               /* Setup the location of the current dimension, for
11791                  later error report. */
11792               TREE_PURPOSE (cn) =
11793                 build_expr_wfl (NULL_TREE, input_filename, 0, 0);
11794               EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
11795             }
11796         }
11797       /* They complete the array creation expression, if no errors
11798          were found. */
11799       CAN_COMPLETE_NORMALLY (node) = 1;
11800       return (flag ? error_mark_node
11801               : force_evaluation_order (patch_newarray (node)));
11802
11803     case NEW_ANONYMOUS_ARRAY_EXPR:
11804       /* Create the array type if necessary. */
11805       if (ANONYMOUS_ARRAY_DIMS_SIG (node))
11806         {
11807           tree type = ANONYMOUS_ARRAY_BASE_TYPE (node);
11808           if (!(type = resolve_type_during_patch (type)))
11809             return error_mark_node;
11810           type = build_array_from_name (type, NULL_TREE,
11811                                         ANONYMOUS_ARRAY_DIMS_SIG (node), NULL);
11812           ANONYMOUS_ARRAY_BASE_TYPE (node) = build_pointer_type (type);
11813         }
11814       node = patch_new_array_init (ANONYMOUS_ARRAY_BASE_TYPE (node),
11815                                    ANONYMOUS_ARRAY_INITIALIZER (node));
11816       if (node == error_mark_node)
11817         return error_mark_node;
11818       CAN_COMPLETE_NORMALLY (node) = 1;
11819       return node;
11820
11821     case NEW_CLASS_EXPR:
11822     case CALL_EXPR:
11823       /* Complete function's argument(s) first */
11824       if (complete_function_arguments (node))
11825         return error_mark_node;
11826       else
11827         {
11828           tree decl, wfl = TREE_OPERAND (node, 0);
11829           int in_this = CALL_THIS_CONSTRUCTOR_P (node);
11830           int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
11831                            super_identifier_node);
11832           tree arguments;
11833           int location = EXPR_WFL_LINECOL (node);
11834
11835           node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
11836                                           from_super, 0, &decl);
11837           if (node == error_mark_node)
11838             return error_mark_node;
11839
11840           if (TREE_CODE (node) == CALL_EXPR
11841               && TREE_OPERAND (node, 1) != NULL_TREE)
11842             arguments = TREE_VALUE (TREE_OPERAND (node, 1));
11843           else
11844             arguments = NULL_TREE;
11845           check_thrown_exceptions (location, decl, arguments);
11846           /* If we call this(...), register signature and positions */
11847           if (in_this)
11848             DECL_CONSTRUCTOR_CALLS (current_function_decl) =
11849               tree_cons (wfl, decl,
11850                          DECL_CONSTRUCTOR_CALLS (current_function_decl));
11851           CAN_COMPLETE_NORMALLY (node) = 1;
11852           return force_evaluation_order (node);
11853         }
11854
11855     case MODIFY_EXPR:
11856       /* Save potential wfls */
11857       wfl_op1 = TREE_OPERAND (node, 0);
11858       TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
11859
11860       if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
11861           && TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
11862           && DECL_INITIAL (nn) != NULL_TREE)
11863         {
11864           tree value;
11865
11866           value = fold_constant_for_init (nn, nn);
11867
11868           /* When we have a primitype type, or a string and we're not
11869              emitting a class file, we actually don't want to generate
11870              anything for the assignment. */
11871           if (value != NULL_TREE && 
11872               (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) || 
11873                (TREE_TYPE (value) == string_ptr_type_node &&
11874                 ! flag_emit_class_files)))
11875             {
11876               /* Prepare node for patch_assignment */
11877               TREE_OPERAND (node, 1) = value;
11878               /* Call patch assignment to verify the assignment */
11879               if (patch_assignment (node, wfl_op1) == error_mark_node)
11880                 return error_mark_node;
11881               /* Set DECL_INITIAL properly (a conversion might have
11882                  been decided by patch_assignment) and return the
11883                  empty statement. */
11884               else
11885                 {
11886                   tree patched = patch_string (TREE_OPERAND (node, 1));
11887                   if (patched)
11888                     DECL_INITIAL (nn) = patched;
11889                   else
11890                     DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
11891                   DECL_FIELD_FINAL_IUD (nn) = 1;
11892                   return build_java_empty_stmt ();
11893                 }
11894             }
11895           if (! flag_emit_class_files)
11896             DECL_INITIAL (nn) = NULL_TREE;
11897         }
11898       wfl_op2 = TREE_OPERAND (node, 1);
11899
11900       if (TREE_OPERAND (node, 0) == error_mark_node)
11901         return error_mark_node;
11902
11903       flag = COMPOUND_ASSIGN_P (wfl_op2);
11904       if (flag)
11905         {
11906           /* This might break when accessing outer field from inner
11907              class. TESTME, FIXME */
11908           tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
11909
11910           /* Hand stabilize the lhs on both places */
11911           TREE_OPERAND (node, 0) = lvalue;
11912           TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
11913             (flag_emit_class_files ? lvalue : save_expr (lvalue));
11914
11915           /* 15.25.2.a: Left hand is not an array access. FIXME */
11916           /* Now complete the RHS. We write it back later on. */
11917           nn = java_complete_tree (TREE_OPERAND (node, 1));
11918
11919           if ((cn = patch_string (nn)))
11920             nn = cn;
11921
11922           /* The last part of the rewrite for E1 op= E2 is to have
11923              E1 = (T)(E1 op E2), with T being the type of E1. */
11924           nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
11925                                                TREE_TYPE (lvalue), nn));
11926
11927           /* If the assignment is compound and has reference type,
11928              then ensure the LHS has type String and nothing else.  */
11929           if (JREFERENCE_TYPE_P (TREE_TYPE (lvalue))
11930               && ! JSTRING_TYPE_P (TREE_TYPE (lvalue)))
11931             parse_error_context (wfl_op2,
11932                                  "Incompatible type for `+='. Can't convert `%s' to `java.lang.String'",
11933                                  lang_printable_name (TREE_TYPE (lvalue), 0));
11934
11935           /* 15.25.2.b: Left hand is an array access. FIXME */
11936         }
11937
11938       /* If we're about to patch a NEW_ARRAY_INIT, we call a special
11939          function to complete this RHS. Note that a NEW_ARRAY_INIT
11940          might have been already fully expanded if created as a result
11941          of processing an anonymous array initializer. We avoid doing
11942          the operation twice by testing whether the node already bears
11943          a type. */
11944       else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT && !TREE_TYPE (wfl_op2))
11945         nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
11946                                    TREE_OPERAND (node, 1));
11947       /* Otherwise we simply complete the RHS */
11948       else
11949         nn = java_complete_tree (TREE_OPERAND (node, 1));
11950
11951       if (nn == error_mark_node)
11952         return error_mark_node;
11953
11954       /* Write back the RHS as we evaluated it. */
11955       TREE_OPERAND (node, 1) = nn;
11956
11957       /* In case we're handling = with a String as a RHS, we need to
11958          produce a String out of the RHS (it might still be a
11959          STRING_CST or a StringBuffer at this stage */
11960       if ((nn = patch_string (TREE_OPERAND (node, 1))))
11961         TREE_OPERAND (node, 1) = nn;
11962
11963       if ((nn = outer_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
11964                                         TREE_OPERAND (node, 1))))
11965         {
11966           /* We return error_mark_node if outer_field_access_fix
11967              detects we write into a final. */
11968           if (nn == error_mark_node)
11969             return error_mark_node;
11970           node = nn;
11971         }
11972       else
11973         {
11974           node = patch_assignment (node, wfl_op1);
11975           if (node == error_mark_node)
11976             return error_mark_node;
11977           /* Reorganize the tree if necessary. */
11978           if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
11979                        || JSTRING_P (TREE_TYPE (node))))
11980             node = java_refold (node);
11981         }
11982
11983       /* Seek to set DECL_INITIAL to a proper value, since it might have
11984          undergone a conversion in patch_assignment. We do that only when
11985          it's necessary to have DECL_INITIAL properly set. */
11986       nn = TREE_OPERAND (node, 0);
11987       if (TREE_CODE (nn) == VAR_DECL
11988           && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn))
11989           && FIELD_STATIC (nn) && FIELD_FINAL (nn)
11990           && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn))
11991               || TREE_TYPE (nn) == string_ptr_type_node))
11992         DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
11993
11994       CAN_COMPLETE_NORMALLY (node) = 1;
11995       return node;
11996
11997     case MULT_EXPR:
11998     case PLUS_EXPR:
11999     case MINUS_EXPR:
12000     case LSHIFT_EXPR:
12001     case RSHIFT_EXPR:
12002     case URSHIFT_EXPR:
12003     case BIT_AND_EXPR:
12004     case BIT_XOR_EXPR:
12005     case BIT_IOR_EXPR:
12006     case TRUNC_MOD_EXPR:
12007     case TRUNC_DIV_EXPR:
12008     case RDIV_EXPR:
12009     case TRUTH_ANDIF_EXPR:
12010     case TRUTH_ORIF_EXPR:
12011     case EQ_EXPR:
12012     case NE_EXPR:
12013     case GT_EXPR:
12014     case GE_EXPR:
12015     case LT_EXPR:
12016     case LE_EXPR:
12017       /* Operands 0 and 1 are WFL in certain cases only. patch_binop
12018          knows how to handle those cases. */
12019       wfl_op1 = TREE_OPERAND (node, 0);
12020       wfl_op2 = TREE_OPERAND (node, 1);
12021
12022       CAN_COMPLETE_NORMALLY (node) = 1;
12023       /* Don't complete string nodes if dealing with the PLUS operand. */
12024       if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
12025         {
12026           nn = java_complete_tree (wfl_op1);
12027           if (nn == error_mark_node)
12028             return error_mark_node;
12029
12030           TREE_OPERAND (node, 0) = nn;
12031         }
12032       if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
12033         {
12034           nn = java_complete_tree (wfl_op2);
12035           if (nn == error_mark_node)
12036             return error_mark_node;
12037
12038           TREE_OPERAND (node, 1) = nn;
12039         }
12040       return patch_binop (node, wfl_op1, wfl_op2);
12041
12042     case INSTANCEOF_EXPR:
12043       wfl_op1 = TREE_OPERAND (node, 0);
12044       COMPLETE_CHECK_OP_0 (node);
12045       if (flag_emit_xref)
12046         {
12047           TREE_TYPE (node) = boolean_type_node;
12048           return node;
12049         }
12050       return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
12051
12052     case UNARY_PLUS_EXPR:
12053     case NEGATE_EXPR:
12054     case TRUTH_NOT_EXPR:
12055     case BIT_NOT_EXPR:
12056     case PREDECREMENT_EXPR:
12057     case PREINCREMENT_EXPR:
12058     case POSTDECREMENT_EXPR:
12059     case POSTINCREMENT_EXPR:
12060     case CONVERT_EXPR:
12061       /* There are cases were wfl_op1 is a WFL. patch_unaryop knows
12062          how to handle those cases. */
12063       wfl_op1 = TREE_OPERAND (node, 0);
12064       CAN_COMPLETE_NORMALLY (node) = 1;
12065       TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12066       if (TREE_OPERAND (node, 0) == error_mark_node)
12067         return error_mark_node;
12068       node = patch_unaryop (node, wfl_op1);
12069       CAN_COMPLETE_NORMALLY (node) = 1;
12070       break;
12071
12072     case ARRAY_REF:
12073       /* There are cases were wfl_op1 is a WFL. patch_array_ref knows
12074          how to handle those cases. */
12075       wfl_op1 = TREE_OPERAND (node, 0);
12076       TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
12077       if (TREE_OPERAND (node, 0) == error_mark_node)
12078         return error_mark_node;
12079       if (!flag_emit_class_files && !flag_emit_xref)
12080         TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
12081       /* The same applies to wfl_op2 */
12082       wfl_op2 = TREE_OPERAND (node, 1);
12083       TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
12084       if (TREE_OPERAND (node, 1) == error_mark_node)
12085         return error_mark_node;
12086       if (!flag_emit_class_files && !flag_emit_xref)
12087         TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
12088       return patch_array_ref (node);
12089
12090     case RECORD_TYPE:
12091       return node;;
12092
12093     case COMPONENT_REF:
12094       /* The first step in the re-write of qualified name handling.  FIXME.
12095          So far, this is only to support PRIMTYPE.class -> PRIMCLASS.TYPE. */
12096       TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
12097       if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
12098         {
12099           tree name = TREE_OPERAND (node, 1);
12100           tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
12101           if (field == NULL_TREE)
12102             {
12103               error ("missing static field `%s'", IDENTIFIER_POINTER (name));
12104               return error_mark_node;
12105             }
12106           if (! FIELD_STATIC (field))
12107             {
12108               error ("not a static field `%s'", IDENTIFIER_POINTER (name));
12109               return error_mark_node;
12110             }
12111           return field;
12112         }
12113       else
12114         abort ();
12115       break;
12116
12117     case THIS_EXPR:
12118       /* Can't use THIS in a static environment */
12119       if (!current_this)
12120         {
12121           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12122           parse_error_context (wfl_operator,
12123                                "Keyword `this' used outside allowed context");
12124           TREE_TYPE (node) = error_mark_node;
12125           return error_mark_node;
12126         }
12127       if (ctxp->explicit_constructor_p)
12128         {
12129           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12130           parse_error_context
12131             (wfl_operator, "Can't reference `this' or `super' before the superclass constructor has been called");
12132           TREE_TYPE (node) = error_mark_node;
12133           return error_mark_node;
12134         }
12135       return current_this;
12136
12137     case CLASS_LITERAL:
12138       CAN_COMPLETE_NORMALLY (node) = 1;
12139       node = patch_incomplete_class_ref (node);
12140       if (node == error_mark_node)
12141         return error_mark_node;
12142       break;
12143
12144     default:
12145       CAN_COMPLETE_NORMALLY (node) = 1;
12146       /* Ok: may be we have a STRING_CST or a crafted `StringBuffer'
12147          and it's time to turn it into the appropriate String object */
12148       if ((nn = patch_string (node)))
12149         node = nn;
12150       else
12151         internal_error ("No case for %s", tree_code_name [TREE_CODE (node)]);
12152     }
12153   return node;
12154 }
12155
12156 /* Complete function call's argument. Return a nonzero value is an
12157    error was found.  */
12158
12159 static int
12160 complete_function_arguments (tree node)
12161 {
12162   int flag = 0;
12163   tree cn;
12164
12165   ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12166   for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
12167     {
12168       tree wfl = TREE_VALUE (cn), parm, temp;
12169       parm = java_complete_tree (wfl);
12170
12171       if (parm == error_mark_node)
12172         {
12173           flag = 1;
12174           continue;
12175         }
12176       /* If we have a string literal that we haven't transformed yet or a
12177          crafted string buffer, as a result of the use of the String
12178          `+' operator. Build `parm.toString()' and expand it. */
12179       if ((temp = patch_string (parm)))
12180         parm = temp;
12181
12182       TREE_VALUE (cn) = parm;
12183     }
12184   ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
12185   return flag;
12186 }
12187
12188 /* Sometimes (for loops and variable initialized during their
12189    declaration), we want to wrap a statement around a WFL and turn it
12190    debugable.  */
12191
12192 static tree
12193 build_debugable_stmt (int location, tree stmt)
12194 {
12195   if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
12196     {
12197       stmt = build_expr_wfl (stmt, input_filename, 0, 0);
12198       EXPR_WFL_LINECOL (stmt) = location;
12199     }
12200   JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
12201   return stmt;
12202 }
12203
12204 static tree
12205 build_expr_block (tree body, tree decls)
12206 {
12207   tree node = make_node (BLOCK);
12208   BLOCK_EXPR_DECLS (node) = decls;
12209   BLOCK_EXPR_BODY (node) = body;
12210   if (body)
12211     TREE_TYPE (node) = TREE_TYPE (body);
12212   TREE_SIDE_EFFECTS (node) = 1;
12213   return node;
12214 }
12215
12216 /* Create a new function block and link it appropriately to current
12217    function block chain */
12218
12219 static tree
12220 enter_block (void)
12221 {
12222   tree b = build_expr_block (NULL_TREE, NULL_TREE);
12223
12224   /* Link block B supercontext to the previous block. The current
12225      function DECL is used as supercontext when enter_a_block is called
12226      for the first time for a given function. The current function body
12227      (DECL_FUNCTION_BODY) is set to be block B.  */
12228
12229   tree fndecl = current_function_decl;
12230
12231   if (!fndecl) {
12232     BLOCK_SUPERCONTEXT (b) = current_static_block;
12233     current_static_block = b;
12234   }
12235
12236   else if (!DECL_FUNCTION_BODY (fndecl))
12237     {
12238       BLOCK_SUPERCONTEXT (b) = fndecl;
12239       DECL_FUNCTION_BODY (fndecl) = b;
12240     }
12241   else
12242     {
12243       BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
12244       DECL_FUNCTION_BODY (fndecl) = b;
12245     }
12246   return b;
12247 }
12248
12249 /* Exit a block by changing the current function body
12250    (DECL_FUNCTION_BODY) to the current block super context, only if
12251    the block being exited isn't the method's top level one.  */
12252
12253 static tree
12254 exit_block (void)
12255 {
12256   tree b;
12257   if (current_function_decl)
12258     {
12259       b = DECL_FUNCTION_BODY (current_function_decl);
12260       if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
12261         DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
12262     }
12263   else
12264     {
12265       b = current_static_block;
12266
12267       if (BLOCK_SUPERCONTEXT (b))
12268         current_static_block = BLOCK_SUPERCONTEXT (b);
12269     }
12270   return b;
12271 }
12272
12273 /* Lookup for NAME in the nested function's blocks, all the way up to
12274    the current toplevel one. It complies with Java's local variable
12275    scoping rules.  */
12276
12277 static tree
12278 lookup_name_in_blocks (tree name)
12279 {
12280   tree b = GET_CURRENT_BLOCK (current_function_decl);
12281
12282   while (b != current_function_decl)
12283     {
12284       tree current;
12285
12286       /* Paranoid sanity check. To be removed */
12287       if (TREE_CODE (b) != BLOCK)
12288         abort ();
12289
12290       for (current = BLOCK_EXPR_DECLS (b); current;
12291            current = TREE_CHAIN (current))
12292         if (DECL_NAME (current) == name)
12293           return current;
12294       b = BLOCK_SUPERCONTEXT (b);
12295     }
12296   return NULL_TREE;
12297 }
12298
12299 static void
12300 maybe_absorb_scoping_blocks (void)
12301 {
12302   while (BLOCK_IS_IMPLICIT (GET_CURRENT_BLOCK (current_function_decl)))
12303     {
12304       tree b = exit_block ();
12305       java_method_add_stmt (current_function_decl, b);
12306       SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", input_line));
12307     }
12308 }
12309
12310 \f
12311 /* This section of the source is reserved to build_* functions that
12312    are building incomplete tree nodes and the patch_* functions that
12313    are completing them.  */
12314
12315 /* Wrap a non WFL node around a WFL.  */
12316
12317 static tree
12318 build_wfl_wrap (tree node, int location)
12319 {
12320   tree wfl, node_to_insert = node;
12321
12322   /* We want to process THIS . xxx symbolically, to keep it consistent
12323      with the way we're processing SUPER. A THIS from a primary as a
12324      different form than a SUPER. Turn THIS into something symbolic */
12325   if (TREE_CODE (node) == THIS_EXPR)
12326     node_to_insert = wfl = build_wfl_node (this_identifier_node);
12327   else
12328     wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
12329
12330   EXPR_WFL_LINECOL (wfl) = location;
12331   EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
12332   return wfl;
12333 }
12334
12335 /* Build a super() constructor invocation. Returns an empty statement if
12336    we're currently dealing with the class java.lang.Object. */
12337
12338 static tree
12339 build_super_invocation (tree mdecl)
12340 {
12341   if (DECL_CONTEXT (mdecl) == object_type_node)
12342     return build_java_empty_stmt ();
12343   else
12344     {
12345       tree super_wfl = build_wfl_node (super_identifier_node);
12346       tree a = NULL_TREE, t;
12347       /* If we're dealing with an anonymous class, pass the arguments
12348          of the crafted constructor along. */
12349       if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
12350         {
12351           SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
12352           for (; t != end_params_node; t = TREE_CHAIN (t))
12353             a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
12354         }
12355       return build_method_invocation (super_wfl, a);
12356     }
12357 }
12358
12359 /* Build a SUPER/THIS qualified method invocation.  */
12360
12361 static tree
12362 build_this_super_qualified_invocation (int use_this, tree name, tree args,
12363                                        int lloc, int rloc)
12364 {
12365   tree invok;
12366   tree wfl =
12367     build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
12368   EXPR_WFL_LINECOL (wfl) = lloc;
12369   invok = build_method_invocation (name, args);
12370   return make_qualified_primary (wfl, invok, rloc);
12371 }
12372
12373 /* Build an incomplete CALL_EXPR node. */
12374
12375 static tree
12376 build_method_invocation (tree name, tree args)
12377 {
12378   tree call = build (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
12379   TREE_SIDE_EFFECTS (call) = 1;
12380   EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12381   return call;
12382 }
12383
12384 /* Build an incomplete new xxx(...) node. */
12385
12386 static tree
12387 build_new_invocation (tree name, tree args)
12388 {
12389   tree call = build (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
12390   TREE_SIDE_EFFECTS (call) = 1;
12391   EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
12392   return call;
12393 }
12394
12395 /* Build an incomplete assignment expression. */
12396
12397 static tree
12398 build_assignment (int op, int op_location, tree lhs, tree rhs)
12399 {
12400   tree assignment;
12401   /* Build the corresponding binop if we deal with a Compound
12402      Assignment operator. Mark the binop sub-tree as part of a
12403      Compound Assignment expression */
12404   if (op != ASSIGN_TK)
12405     {
12406       rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
12407       COMPOUND_ASSIGN_P (rhs) = 1;
12408     }
12409   assignment = build (MODIFY_EXPR, NULL_TREE, lhs, rhs);
12410   TREE_SIDE_EFFECTS (assignment) = 1;
12411   EXPR_WFL_LINECOL (assignment) = op_location;
12412   return assignment;
12413 }
12414
12415 /* Print an INTEGER_CST node as decimal in a static buffer, and return
12416    the buffer.  This is used only for string conversion.  */
12417 static char *
12418 string_convert_int_cst (tree node)
12419 {
12420   /* Long.MIN_VALUE is -9223372036854775808, 20 characters.  */
12421   static char buffer[21];
12422
12423   unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
12424   unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
12425   char *p = buffer + sizeof (buffer);
12426   int neg = 0;
12427
12428   unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
12429                                   << (HOST_BITS_PER_WIDE_INT - 1));
12430
12431   *--p = '\0';
12432
12433   /* If negative, note the fact and negate the value.  */
12434   if ((hi & hibit))
12435     {
12436       lo = ~lo;
12437       hi = ~hi;
12438       if (++lo == 0)
12439         ++hi;
12440       neg = 1;
12441     }
12442
12443   /* Divide by 10 until there are no bits left.  */
12444   do
12445     {
12446       unsigned HOST_WIDE_INT acc = 0;
12447       unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
12448       unsigned int i;
12449
12450       /* Use long division to compute the result and the remainder.  */
12451       for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
12452         {
12453           /* Shift a bit into accumulator.  */
12454           acc <<= 1;
12455           if ((hi & hibit))
12456             acc |= 1;
12457
12458           /* Shift the value.  */
12459           hi <<= 1;
12460           if ((lo & hibit))
12461             hi |= 1;
12462           lo <<= 1;
12463
12464           /* Shift the correct bit into the result.  */
12465           outhi <<= 1;
12466           if ((outlo & hibit))
12467             outhi |= 1;
12468           outlo <<= 1;
12469           if (acc >= 10)
12470             {
12471               acc -= 10;
12472               outlo |= 1;
12473             }
12474         }
12475
12476       /* '0' == 060 in Java, but might not be here (think EBCDIC).  */
12477       *--p = '\060' + acc;
12478
12479       hi = outhi;
12480       lo = outlo;
12481     }
12482   while (hi || lo);
12483
12484   if (neg)
12485     *--p = '\055'; /* '-' == 055 in Java, but might not be here.  */
12486
12487   return p;
12488 }
12489
12490 /* Print an INTEGER_CST node in a static buffer, and return the
12491    buffer.  This is used only for error handling.  */
12492 char *
12493 print_int_node (tree node)
12494 {
12495   static char buffer [80];
12496   if (TREE_CONSTANT_OVERFLOW (node))
12497     sprintf (buffer, "<overflow>");
12498
12499   if (TREE_INT_CST_HIGH (node) == 0)
12500     sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
12501              TREE_INT_CST_LOW (node));
12502   else if (TREE_INT_CST_HIGH (node) == -1
12503            && TREE_INT_CST_LOW (node) != 0)
12504     sprintf (buffer, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
12505              -TREE_INT_CST_LOW (node));
12506   else
12507     sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
12508              TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
12509
12510   return buffer;
12511 }
12512
12513 \f
12514 /* Return 1 if an assignment to a FINAL is attempted in a non suitable
12515    context.  */
12516
12517 /* 15.25 Assignment operators. */
12518
12519 static tree
12520 patch_assignment (tree node, tree wfl_op1)
12521 {
12522   tree rhs = TREE_OPERAND (node, 1);
12523   tree lvalue = TREE_OPERAND (node, 0), llvalue;
12524   tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
12525   int error_found = 0;
12526   int lvalue_from_array = 0;
12527   int is_return = 0;
12528
12529   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
12530
12531   /* Lhs can be a named variable */
12532   if (JDECL_P (lvalue))
12533     {
12534       lhs_type = TREE_TYPE (lvalue);
12535     }
12536   /* Or Lhs can be an array access. */
12537   else if (TREE_CODE (lvalue) == ARRAY_REF)
12538     {
12539       lhs_type = TREE_TYPE (lvalue);
12540       lvalue_from_array = 1;
12541     }
12542   /* Or a field access */
12543   else if (TREE_CODE (lvalue) == COMPONENT_REF)
12544     lhs_type = TREE_TYPE (lvalue);
12545   /* Or a function return slot */
12546   else if (TREE_CODE (lvalue) == RESULT_DECL)
12547     {
12548       /* If the return type is an integral type, then we create the
12549          RESULT_DECL with a promoted type, but we need to do these
12550          checks against the unpromoted type to ensure type safety.  So
12551          here we look at the real type, not the type of the decl we
12552          are modifying.  */
12553       lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
12554       is_return = 1;
12555     }
12556   /* Otherwise, we might want to try to write into an optimized static
12557      final, this is an of a different nature, reported further on. */
12558   else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
12559            && resolve_expression_name (wfl_op1, &llvalue))
12560     {
12561       lhs_type = TREE_TYPE (lvalue);
12562     }
12563   else
12564     {
12565       parse_error_context (wfl_op1, "Invalid left hand side of assignment");
12566       error_found = 1;
12567     }
12568
12569   rhs_type = TREE_TYPE (rhs);
12570
12571   /* 5.1 Try the assignment conversion for builtin type. */
12572   new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
12573
12574   /* 5.2 If it failed, try a reference conversion */
12575   if (!new_rhs)
12576     new_rhs = try_reference_assignconv (lhs_type, rhs);
12577
12578   /* 15.25.2 If we have a compound assignment, convert RHS into the
12579      type of the LHS */
12580   else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12581     new_rhs = convert (lhs_type, rhs);
12582
12583   /* Explicit cast required. This is an error */
12584   if (!new_rhs)
12585     {
12586       char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
12587       char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
12588       tree wfl;
12589       char operation [32];      /* Max size known */
12590
12591       /* If the assignment is part of a declaration, we use the WFL of
12592          the declared variable to point out the error and call it a
12593          declaration problem. If the assignment is a genuine =
12594          operator, we call is a operator `=' problem, otherwise we
12595          call it an assignment problem. In both of these last cases,
12596          we use the WFL of the operator to indicate the error. */
12597
12598       if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
12599         {
12600           wfl = wfl_op1;
12601           strcpy (operation, "declaration");
12602         }
12603       else
12604         {
12605           wfl = wfl_operator;
12606           if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
12607             strcpy (operation, "assignment");
12608           else if (is_return)
12609             strcpy (operation, "`return'");
12610           else
12611             strcpy (operation, "`='");
12612         }
12613
12614       if (!valid_cast_to_p (rhs_type, lhs_type))
12615         parse_error_context
12616           (wfl, "Incompatible type for %s. Can't convert `%s' to `%s'",
12617            operation, t1, t2);
12618       else
12619         parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert `%s' to `%s'",
12620                              operation, t1, t2);
12621       free (t1); free (t2);
12622       error_found = 1;
12623     }
12624
12625   if (error_found)
12626     return error_mark_node;
12627
12628   /* If we're processing a `return' statement, promote the actual type
12629      to the promoted type.  */
12630   if (is_return)
12631     new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
12632
12633   /* 10.10: Array Store Exception runtime check */
12634   if (!flag_emit_class_files
12635       && !flag_emit_xref
12636       && lvalue_from_array
12637       && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
12638     {
12639       tree array, store_check, base, index_expr;
12640
12641       /* Save RHS so that it doesn't get re-evaluated by the store check. */
12642       new_rhs = save_expr (new_rhs);
12643
12644       /* Get the INDIRECT_REF. */
12645       array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
12646       /* Get the array pointer expr. */
12647       array = TREE_OPERAND (array, 0);
12648       store_check = build_java_arraystore_check (array, new_rhs);
12649
12650       index_expr = TREE_OPERAND (lvalue, 1);
12651
12652       if (TREE_CODE (index_expr) == COMPOUND_EXPR)
12653         {
12654           /* A COMPOUND_EXPR here is a bounds check. The bounds check must
12655              happen before the store check, so prepare to insert the store
12656              check within the second operand of the existing COMPOUND_EXPR. */
12657           base = index_expr;
12658         }
12659       else
12660         base = lvalue;
12661
12662       index_expr = TREE_OPERAND (base, 1);
12663       TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr),
12664                                       store_check, index_expr);
12665     }
12666
12667   /* Final locals can be used as case values in switch
12668      statement. Prepare them for this eventuality. */
12669   if (TREE_CODE (lvalue) == VAR_DECL
12670       && DECL_FINAL (lvalue)
12671       && TREE_CONSTANT (new_rhs)
12672       && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
12673       && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
12674       )
12675     {
12676       TREE_CONSTANT (lvalue) = 1;
12677       TREE_INVARIANT (lvalue) = 1;
12678       DECL_INITIAL (lvalue) = new_rhs;
12679     }
12680
12681   /* Copy the rhs if it's a reference.  */
12682   if (! flag_check_references && ! flag_emit_class_files && optimize > 0)
12683     {
12684       switch (TREE_CODE (new_rhs))
12685         {
12686         case ARRAY_REF:
12687         case INDIRECT_REF:
12688         case COMPONENT_REF:
12689           /* Transform a = foo.bar 
12690              into a = ({int tmp; tmp = foo.bar;}).
12691              We need to ensure that if a read from memory fails
12692              because of a NullPointerException, a destination variable
12693              will remain unchanged.  An explicit temporary does what
12694              we need.  
12695
12696              If flag_check_references is set, this is unnecessary
12697              because we'll check each reference before doing any
12698              reads.  If optimize is not set the result will never be
12699              written to a stack slot that contains the LHS.  */
12700           {
12701             tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"), 
12702                                    TREE_TYPE (new_rhs));
12703             tree block = make_node (BLOCK);
12704             tree assignment 
12705               = build (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
12706             DECL_CONTEXT (tmp) = current_function_decl;
12707             TREE_TYPE (block) = TREE_TYPE (new_rhs);
12708             BLOCK_VARS (block) = tmp;
12709             BLOCK_EXPR_BODY (block) = assignment;
12710             TREE_SIDE_EFFECTS (block) = 1;
12711             new_rhs = block;
12712           }
12713           break;
12714         default:
12715           break;
12716         }
12717     }
12718
12719   TREE_OPERAND (node, 0) = lvalue;
12720   TREE_OPERAND (node, 1) = new_rhs;
12721   TREE_TYPE (node) = lhs_type;
12722   return node;
12723 }
12724
12725 /* Check that type SOURCE can be cast into type DEST. If the cast
12726    can't occur at all, return NULL; otherwise, return a possibly
12727    modified rhs.  */
12728
12729 static tree
12730 try_reference_assignconv (tree lhs_type, tree rhs)
12731 {
12732   tree new_rhs = NULL_TREE;
12733   tree rhs_type = TREE_TYPE (rhs);
12734
12735   if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
12736     {
12737       /* `null' may be assigned to any reference type */
12738       if (rhs == null_pointer_node)
12739         new_rhs = null_pointer_node;
12740       /* Try the reference assignment conversion */
12741       else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
12742         new_rhs = rhs;
12743       /* This is a magic assignment that we process differently */
12744       else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
12745         new_rhs = rhs;
12746     }
12747   return new_rhs;
12748 }
12749
12750 /* Check that RHS can be converted into LHS_TYPE by the assignment
12751    conversion (5.2), for the cases of RHS being a builtin type. Return
12752    NULL_TREE if the conversion fails or if because RHS isn't of a
12753    builtin type. Return a converted RHS if the conversion is possible.  */
12754
12755 static tree
12756 try_builtin_assignconv (tree wfl_op1, tree lhs_type, tree rhs)
12757 {
12758   tree new_rhs = NULL_TREE;
12759   tree rhs_type = TREE_TYPE (rhs);
12760
12761   /* Handle boolean specially.  */
12762   if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12763       || TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12764     {
12765       if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
12766           && TREE_CODE (lhs_type) == BOOLEAN_TYPE)
12767         new_rhs = rhs;
12768     }
12769
12770   /* 5.1.1 Try Identity Conversion,
12771      5.1.2 Try Widening Primitive Conversion */
12772   else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
12773     new_rhs = convert (lhs_type, rhs);
12774
12775   /* Try a narrowing primitive conversion (5.1.3):
12776        - expression is a constant expression of type byte, short, char,
12777          or int, AND
12778        - variable is byte, short or char AND
12779        - The value of the expression is representable in the type of the
12780          variable */
12781   else if ((rhs_type == byte_type_node || rhs_type == short_type_node
12782             || rhs_type == char_type_node || rhs_type == int_type_node)
12783             && TREE_CONSTANT (rhs)
12784            && (lhs_type == byte_type_node || lhs_type == char_type_node
12785                || lhs_type == short_type_node))
12786     {
12787       if (int_fits_type_p (rhs, lhs_type))
12788         new_rhs = convert (lhs_type, rhs);
12789       else if (wfl_op1)         /* Might be called with a NULL */
12790         parse_warning_context
12791           (wfl_op1, "Constant expression `%s' too wide for narrowing primitive conversion to `%s'",
12792            print_int_node (rhs), lang_printable_name (lhs_type, 0));
12793       /* Reported a warning that will turn into an error further
12794          down, so we don't return */
12795     }
12796
12797   return new_rhs;
12798 }
12799
12800 /* Return 1 if RHS_TYPE can be converted to LHS_TYPE by identity
12801    conversion (5.1.1) or widening primitive conversion (5.1.2).  Return
12802    0 is the conversion test fails.  This implements parts the method
12803    invocation conversion (5.3).  */
12804
12805 static int
12806 valid_builtin_assignconv_identity_widening_p (tree lhs_type, tree rhs_type)
12807 {
12808   /* 5.1.1: This is the identity conversion part. */
12809   if (lhs_type == rhs_type)
12810     return 1;
12811
12812   /* Reject non primitive types and boolean conversions.  */
12813   if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
12814     return 0;
12815
12816   /* 5.1.2: widening primitive conversion. byte, even if it's smaller
12817      than a char can't be converted into a char. Short can't too, but
12818      the < test below takes care of that */
12819   if (lhs_type == char_type_node && rhs_type == byte_type_node)
12820     return 0;
12821
12822   /* Accept all promoted type here. Note, we can't use <= in the test
12823      below, because we still need to bounce out assignments of short
12824      to char and the likes */
12825   if (lhs_type == int_type_node
12826       && (rhs_type == promoted_byte_type_node
12827           || rhs_type == promoted_short_type_node
12828           || rhs_type == promoted_char_type_node
12829           || rhs_type == promoted_boolean_type_node))
12830     return 1;
12831
12832   /* From here, an integral is widened if its precision is smaller
12833      than the precision of the LHS or if the LHS is a floating point
12834      type, or the RHS is a float and the RHS a double. */
12835   if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
12836        && (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
12837       || (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
12838       || (rhs_type == float_type_node && lhs_type == double_type_node))
12839     return 1;
12840
12841   return 0;
12842 }
12843
12844 /* Check that something of SOURCE type can be assigned or cast to
12845    something of DEST type at runtime. Return 1 if the operation is
12846    valid, 0 otherwise. If CAST is set to 1, we're treating the case
12847    were SOURCE is cast into DEST, which borrows a lot of the
12848    assignment check. */
12849
12850 static int
12851 valid_ref_assignconv_cast_p (tree source, tree dest, int cast)
12852 {
12853   /* SOURCE or DEST might be null if not from a declared entity. */
12854   if (!source || !dest)
12855     return 0;
12856   if (JNULLP_TYPE_P (source))
12857     return 1;
12858   if (TREE_CODE (source) == POINTER_TYPE)
12859     source = TREE_TYPE (source);
12860   if (TREE_CODE (dest) == POINTER_TYPE)
12861     dest = TREE_TYPE (dest);
12862
12863   /* If source and dest are being compiled from bytecode, they may need to
12864      be loaded. */
12865   if (CLASS_P (source) && !CLASS_LOADED_P (source))
12866     {
12867       load_class (source, 1);
12868       safe_layout_class (source);
12869     }
12870   if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
12871     {
12872       load_class (dest, 1);
12873       safe_layout_class (dest);
12874     }
12875
12876   /* Case where SOURCE is a class type */
12877   if (TYPE_CLASS_P (source))
12878     {
12879       if (TYPE_CLASS_P (dest))
12880         return  (source == dest
12881                  || inherits_from_p (source, dest)
12882                  || (cast && inherits_from_p (dest, source)));
12883       if (TYPE_INTERFACE_P (dest))
12884         {
12885           /* If doing a cast and SOURCE is final, the operation is
12886              always correct a compile time (because even if SOURCE
12887              does not implement DEST, a subclass of SOURCE might). */
12888           if (cast && !CLASS_FINAL (TYPE_NAME (source)))
12889             return 1;
12890           /* Otherwise, SOURCE must implement DEST */
12891           return interface_of_p (dest, source);
12892         }
12893       /* DEST is an array, cast permitted if SOURCE is of Object type */
12894       return (cast && source == object_type_node ? 1 : 0);
12895     }
12896   if (TYPE_INTERFACE_P (source))
12897     {
12898       if (TYPE_CLASS_P (dest))
12899         {
12900           /* If not casting, DEST must be the Object type */
12901           if (!cast)
12902             return dest == object_type_node;
12903           /* We're doing a cast. The cast is always valid is class
12904              DEST is not final, otherwise, DEST must implement SOURCE */
12905           else if (!CLASS_FINAL (TYPE_NAME (dest)))
12906             return 1;
12907           else
12908             return interface_of_p (source, dest);
12909         }
12910       if (TYPE_INTERFACE_P (dest))
12911         {
12912           /* If doing a cast, then if SOURCE and DEST contain method
12913              with the same signature but different return type, then
12914              this is a (compile time) error */
12915           if (cast)
12916             {
12917               tree method_source, method_dest;
12918               tree source_type;
12919               tree source_sig;
12920               tree source_name;
12921               for (method_source = TYPE_METHODS (source); method_source;
12922                    method_source = TREE_CHAIN (method_source))
12923                 {
12924                   source_sig =
12925                     build_java_argument_signature (TREE_TYPE (method_source));
12926                   source_type = TREE_TYPE (TREE_TYPE (method_source));
12927                   source_name = DECL_NAME (method_source);
12928                   for (method_dest = TYPE_METHODS (dest);
12929                        method_dest; method_dest = TREE_CHAIN (method_dest))
12930                     if (source_sig ==
12931                         build_java_argument_signature (TREE_TYPE (method_dest))
12932                         && source_name == DECL_NAME (method_dest)
12933                         && source_type != TREE_TYPE (TREE_TYPE (method_dest)))
12934                       return 0;
12935                 }
12936               return 1;
12937             }
12938           else
12939             return source == dest || interface_of_p (dest, source);
12940         }
12941       else
12942         {
12943           /* Array */
12944           return (cast
12945                   && (DECL_NAME (TYPE_NAME (source))
12946                       == java_lang_cloneable_identifier_node
12947                       || (DECL_NAME (TYPE_NAME (source))
12948                           == java_io_serializable_identifier_node)));
12949         }
12950     }
12951   if (TYPE_ARRAY_P (source))
12952     {
12953       if (TYPE_CLASS_P (dest))
12954         return dest == object_type_node;
12955       /* Can't cast an array to an interface unless the interface is
12956          java.lang.Cloneable or java.io.Serializable.  */
12957       if (TYPE_INTERFACE_P (dest))
12958         return (DECL_NAME (TYPE_NAME (dest))
12959                 == java_lang_cloneable_identifier_node
12960                 || (DECL_NAME (TYPE_NAME (dest))
12961                     == java_io_serializable_identifier_node));
12962       else                      /* Arrays */
12963         {
12964           tree source_element_type = TYPE_ARRAY_ELEMENT (source);
12965           tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
12966
12967           /* In case of severe errors, they turn out null */
12968           if (!dest_element_type || !source_element_type)
12969             return 0;
12970           if (source_element_type == dest_element_type)
12971             return 1;
12972           return valid_ref_assignconv_cast_p (source_element_type,
12973                                               dest_element_type, cast);
12974         }
12975       return 0;
12976     }
12977   return 0;
12978 }
12979
12980 static int
12981 valid_cast_to_p (tree source, tree dest)
12982 {
12983   if (TREE_CODE (source) == POINTER_TYPE)
12984     source = TREE_TYPE (source);
12985   if (TREE_CODE (dest) == POINTER_TYPE)
12986     dest = TREE_TYPE (dest);
12987
12988   if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
12989     return valid_ref_assignconv_cast_p (source, dest, 1);
12990
12991   else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
12992     return 1;
12993
12994   else if (TREE_CODE (source) == BOOLEAN_TYPE
12995            && TREE_CODE (dest) == BOOLEAN_TYPE)
12996     return 1;
12997
12998   return 0;
12999 }
13000
13001 static tree
13002 do_unary_numeric_promotion (tree arg)
13003 {
13004   tree type = TREE_TYPE (arg);
13005   if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
13006       || TREE_CODE (type) == CHAR_TYPE)
13007     arg = convert (int_type_node, arg);
13008   return arg;
13009 }
13010
13011 /* Return a nonzero value if SOURCE can be converted into DEST using
13012    the method invocation conversion rule (5.3).  */
13013 static int
13014 valid_method_invocation_conversion_p (tree dest, tree source)
13015 {
13016   return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
13017            && valid_builtin_assignconv_identity_widening_p (dest, source))
13018           || ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
13019               && (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
13020               && valid_ref_assignconv_cast_p (source, dest, 0)));
13021 }
13022
13023 /* Build an incomplete binop expression. */
13024
13025 static tree
13026 build_binop (enum tree_code op, int op_location, tree op1, tree op2)
13027 {
13028   tree binop = build (op, NULL_TREE, op1, op2);
13029   TREE_SIDE_EFFECTS (binop) = 1;
13030   /* Store the location of the operator, for better error report. The
13031      string of the operator will be rebuild based on the OP value. */
13032   EXPR_WFL_LINECOL (binop) = op_location;
13033   return binop;
13034 }
13035
13036 /* Build the string of the operator retained by NODE. If NODE is part
13037    of a compound expression, add an '=' at the end of the string. This
13038    function is called when an error needs to be reported on an
13039    operator. The string is returned as a pointer to a static character
13040    buffer. */
13041
13042 static char *
13043 operator_string (tree node)
13044 {
13045 #define BUILD_OPERATOR_STRING(S)                                        \
13046   {                                                                     \
13047     sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
13048     return buffer;                                                      \
13049   }
13050
13051   static char buffer [10];
13052   switch (TREE_CODE (node))
13053     {
13054     case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
13055     case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
13056     case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
13057     case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13058     case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
13059     case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
13060     case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
13061     case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
13062     case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
13063     case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
13064     case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
13065     case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
13066     case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
13067     case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
13068     case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
13069     case GT_EXPR: BUILD_OPERATOR_STRING (">");
13070     case GE_EXPR: BUILD_OPERATOR_STRING (">=");
13071     case LT_EXPR: BUILD_OPERATOR_STRING ("<");
13072     case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
13073     case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
13074     case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
13075     case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
13076     case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
13077     case PREINCREMENT_EXPR:     /* Fall through */
13078     case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
13079     case PREDECREMENT_EXPR:     /* Fall through */
13080     case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
13081     default:
13082       internal_error ("unregistered operator %s",
13083                       tree_code_name [TREE_CODE (node)]);
13084     }
13085   return NULL;
13086 #undef BUILD_OPERATOR_STRING
13087 }
13088
13089 /* Return 1 if VAR_ACCESS1 is equivalent to VAR_ACCESS2.  */
13090
13091 static int
13092 java_decl_equiv (tree var_acc1, tree var_acc2)
13093 {
13094   if (JDECL_P (var_acc1))
13095     return (var_acc1 == var_acc2);
13096
13097   return (TREE_CODE (var_acc1) == COMPONENT_REF
13098           && TREE_CODE (var_acc2) == COMPONENT_REF
13099           && TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
13100              == TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
13101           && TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
13102 }
13103
13104 /* Return a nonzero value if CODE is one of the operators that can be
13105    used in conjunction with the `=' operator in a compound assignment.  */
13106
13107 static int
13108 binop_compound_p (enum tree_code code)
13109 {
13110   int i;
13111   for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
13112     if (binop_lookup [i] == code)
13113       break;
13114
13115   return i < BINOP_COMPOUND_CANDIDATES;
13116 }
13117
13118 /* Reorganize after a fold to get SAVE_EXPR to generate what we want.  */
13119
13120 static tree
13121 java_refold (tree t)
13122 {
13123   tree c, b, ns, decl;
13124
13125   if (TREE_CODE (t) != MODIFY_EXPR)
13126     return t;
13127
13128   c = TREE_OPERAND (t, 1);
13129   if (! (c && TREE_CODE (c) == COMPOUND_EXPR
13130          && TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
13131          && binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
13132     return t;
13133
13134   /* Now the left branch of the binary operator. */
13135   b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
13136   if (! (b && TREE_CODE (b) == NOP_EXPR
13137          && TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
13138     return t;
13139
13140   ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
13141   if (! (ns && TREE_CODE (ns) == NOP_EXPR
13142          && TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
13143     return t;
13144
13145   decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
13146   if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
13147       /* It's got to be the an equivalent decl */
13148       && java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
13149     {
13150       /* Shorten the NOP_EXPR/SAVE_EXPR path. */
13151       TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
13152       /* Substitute the COMPOUND_EXPR by the BINOP_EXPR */
13153       TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
13154       /* Change the right part of the BINOP_EXPR */
13155       TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
13156     }
13157
13158   return t;
13159 }
13160
13161 /* Binary operators (15.16 up to 15.18). We return error_mark_node on
13162    errors but we modify NODE so that it contains the type computed
13163    according to the expression, when it's fixed. Otherwise, we write
13164    error_mark_node as the type. It allows us to further the analysis
13165    of remaining nodes and detects more errors in certain cases.  */
13166
13167 static tree
13168 patch_binop (tree node, tree wfl_op1, tree wfl_op2)
13169 {
13170   tree op1 = TREE_OPERAND (node, 0);
13171   tree op2 = TREE_OPERAND (node, 1);
13172   tree op1_type = TREE_TYPE (op1);
13173   tree op2_type = TREE_TYPE (op2);
13174   tree prom_type = NULL_TREE, cn;
13175   enum tree_code code = TREE_CODE (node);
13176
13177   /* If 1, tell the routine that we have to return error_mark_node
13178      after checking for the initialization of the RHS */
13179   int error_found = 0;
13180
13181   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13182
13183   /* If either op<n>_type are NULL, this might be early signs of an
13184      error situation, unless it's too early to tell (in case we're
13185      handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
13186      correctly so the error can be later on reported accurately. */
13187   if (! (code == PLUS_EXPR || code == NE_EXPR
13188          || code == EQ_EXPR || code == INSTANCEOF_EXPR))
13189     {
13190       tree n;
13191       if (! op1_type)
13192         {
13193           n = java_complete_tree (op1);
13194           op1_type = TREE_TYPE (n);
13195         }
13196       if (! op2_type)
13197         {
13198           n = java_complete_tree (op2);
13199           op2_type = TREE_TYPE (n);
13200         }
13201     }
13202
13203   switch (code)
13204     {
13205     /* 15.16 Multiplicative operators */
13206     case MULT_EXPR:             /* 15.16.1 Multiplication Operator * */
13207     case RDIV_EXPR:             /* 15.16.2 Division Operator / */
13208     case TRUNC_DIV_EXPR:        /* 15.16.2 Integral type Division Operator / */
13209     case TRUNC_MOD_EXPR:        /* 15.16.3 Remainder operator % */
13210       if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13211         {
13212           if (!JNUMERIC_TYPE_P (op1_type))
13213             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13214           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13215             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13216           TREE_TYPE (node) = error_mark_node;
13217           error_found = 1;
13218           break;
13219         }
13220       prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13221
13222       /* Detect integral division by zero */
13223       if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
13224           && TREE_CODE (prom_type) == INTEGER_TYPE
13225           && (op2 == integer_zero_node || op2 == long_zero_node ||
13226               (TREE_CODE (op2) == INTEGER_CST &&
13227                ! TREE_INT_CST_LOW (op2)  && ! TREE_INT_CST_HIGH (op2))))
13228         {
13229           parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown");
13230           TREE_CONSTANT (node) = 0;
13231           TREE_INVARIANT (node) = 0;
13232         }
13233
13234       /* Change the division operator if necessary */
13235       if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
13236         TREE_SET_CODE (node, TRUNC_DIV_EXPR);
13237
13238       /* Before divisions as is disappear, try to simplify and bail if
13239          applicable, otherwise we won't perform even simple
13240          simplifications like (1-1)/3. We can't do that with floating
13241          point number, folds can't handle them at this stage. */
13242       if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
13243           && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
13244         {
13245           TREE_TYPE (node) = prom_type;
13246           node = fold (node);
13247           if (TREE_CODE (node) != code)
13248             return node;
13249         }
13250
13251       if (TREE_CODE (prom_type) == INTEGER_TYPE
13252           && flag_use_divide_subroutine
13253           && ! flag_emit_class_files
13254           && (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
13255         return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
13256
13257       /* This one is more complicated. FLOATs are processed by a
13258          function call to soft_fmod. Duplicate the value of the
13259          COMPOUND_ASSIGN_P flag. */
13260       if (code == TRUNC_MOD_EXPR)
13261         {
13262           tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
13263           COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
13264           TREE_SIDE_EFFECTS (mod)
13265             = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13266           return mod;
13267         }
13268       break;
13269
13270     /* 15.17 Additive Operators */
13271     case PLUS_EXPR:             /* 15.17.1 String Concatenation Operator + */
13272
13273       /* Operation is valid if either one argument is a string
13274          constant, a String object or a StringBuffer crafted for the
13275          purpose of the a previous usage of the String concatenation
13276          operator */
13277
13278       if (TREE_CODE (op1) == STRING_CST
13279           || TREE_CODE (op2) == STRING_CST
13280           || JSTRING_TYPE_P (op1_type)
13281           || JSTRING_TYPE_P (op2_type)
13282           || IS_CRAFTED_STRING_BUFFER_P (op1)
13283           || IS_CRAFTED_STRING_BUFFER_P (op2))
13284         return build_string_concatenation (op1, op2);
13285
13286     case MINUS_EXPR:            /* 15.17.2 Additive Operators (+ and -) for
13287                                    Numeric Types */
13288       if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
13289         {
13290           if (!JNUMERIC_TYPE_P (op1_type))
13291             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13292           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13293             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13294           TREE_TYPE (node) = error_mark_node;
13295           error_found = 1;
13296           break;
13297         }
13298       prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13299       break;
13300
13301     /* 15.18 Shift Operators */
13302     case LSHIFT_EXPR:
13303     case RSHIFT_EXPR:
13304     case URSHIFT_EXPR:
13305       if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
13306         {
13307           if (!JINTEGRAL_TYPE_P (op1_type))
13308             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13309           else
13310             {
13311               if (JNUMERIC_TYPE_P (op2_type))
13312                 parse_error_context (wfl_operator,
13313                                      "Incompatible type for `%s'. Explicit cast needed to convert shift distance from `%s' to integral",
13314                                      operator_string (node),
13315                                      lang_printable_name (op2_type, 0));
13316               else
13317                 parse_error_context (wfl_operator,
13318                                      "Incompatible type for `%s'. Can't convert shift distance from `%s' to integral",
13319                                      operator_string (node),
13320                                      lang_printable_name (op2_type, 0));
13321             }
13322           TREE_TYPE (node) = error_mark_node;
13323           error_found = 1;
13324           break;
13325         }
13326
13327       /* Unary numeric promotion (5.6.1) is performed on each operand
13328          separately */
13329       op1 = do_unary_numeric_promotion (op1);
13330       op2 = do_unary_numeric_promotion (op2);
13331
13332       /* If the right hand side is of type `long', first cast it to
13333          `int'.  */
13334       if (TREE_TYPE (op2) == long_type_node)
13335         op2 = build1 (CONVERT_EXPR, int_type_node, op2);
13336
13337       /* The type of the shift expression is the type of the promoted
13338          type of the left-hand operand */
13339       prom_type = TREE_TYPE (op1);
13340
13341       /* Shift int only up to 0x1f and long up to 0x3f */
13342       if (prom_type == int_type_node)
13343         op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13344                            build_int_2 (0x1f, 0)));
13345       else
13346         op2 = fold (build (BIT_AND_EXPR, int_type_node, op2,
13347                            build_int_2 (0x3f, 0)));
13348
13349       /* The >>> operator is a >> operating on unsigned quantities */
13350       if (code == URSHIFT_EXPR && ! flag_emit_class_files)
13351         {
13352           tree to_return;
13353           tree utype = java_unsigned_type (prom_type);
13354           op1 = convert (utype, op1);
13355           TREE_SET_CODE (node, RSHIFT_EXPR);
13356           TREE_OPERAND (node, 0) = op1;
13357           TREE_OPERAND (node, 1) = op2;
13358           TREE_TYPE (node) = utype;
13359           to_return = convert (prom_type, node);
13360           /* Copy the original value of the COMPOUND_ASSIGN_P flag */
13361           COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
13362           TREE_SIDE_EFFECTS (to_return)
13363             = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13364           return to_return;
13365         }
13366       break;
13367
13368       /* 15.19.1 Type Comparison Operator instanceof */
13369     case INSTANCEOF_EXPR:
13370
13371       TREE_TYPE (node) = boolean_type_node;
13372
13373       /* OP1_TYPE might be NULL when OP1 is a string constant.  */
13374       if ((cn = patch_string (op1)))
13375         {
13376           op1 = cn;
13377           op1_type = TREE_TYPE (op1);
13378         }
13379       if (op1_type == NULL_TREE)
13380         abort ();
13381
13382       if (!(op2_type = resolve_type_during_patch (op2)))
13383         return error_mark_node;
13384
13385       /* The first operand must be a reference type or the null type */
13386       if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
13387         error_found = 1;        /* Error reported further below */
13388
13389       /* The second operand must be a reference type */
13390       if (!JREFERENCE_TYPE_P (op2_type))
13391         {
13392           SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
13393           parse_error_context
13394             (wfl_operator, "Invalid argument `%s' for `instanceof'",
13395              lang_printable_name (op2_type, 0));
13396           error_found = 1;
13397         }
13398
13399       if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
13400         {
13401           /* If the first operand is null, the result is always false */
13402           if (op1 == null_pointer_node)
13403             return boolean_false_node;
13404           else if (flag_emit_class_files)
13405             {
13406               TREE_OPERAND (node, 1) = op2_type;
13407               TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
13408               return node;
13409             }
13410           /* Otherwise we have to invoke instance of to figure it out */
13411           else
13412             return build_instanceof (op1, op2_type);
13413         }
13414       /* There is no way the expression operand can be an instance of
13415          the type operand. This is a compile time error. */
13416       else
13417         {
13418           char *t1 = xstrdup (lang_printable_name (op1_type, 0));
13419           SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
13420           parse_error_context
13421             (wfl_operator, "Impossible for `%s' to be instance of `%s'",
13422              t1, lang_printable_name (op2_type, 0));
13423           free (t1);
13424           error_found = 1;
13425         }
13426
13427       break;
13428
13429       /* 15.21 Bitwise and Logical Operators */
13430     case BIT_AND_EXPR:
13431     case BIT_XOR_EXPR:
13432     case BIT_IOR_EXPR:
13433       if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
13434         /* Binary numeric promotion is performed on both operand and the
13435            expression retain that type */
13436         prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13437
13438       else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
13439                && TREE_CODE (op1_type) == BOOLEAN_TYPE)
13440         /* The type of the bitwise operator expression is BOOLEAN */
13441         prom_type = boolean_type_node;
13442       else
13443         {
13444           if (!JINTEGRAL_TYPE_P (op1_type))
13445             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
13446           if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
13447             ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
13448           TREE_TYPE (node) = error_mark_node;
13449           error_found = 1;
13450           /* Insert a break here if adding thing before the switch's
13451              break for this case */
13452         }
13453       break;
13454
13455       /* 15.22 Conditional-And Operator */
13456     case TRUTH_ANDIF_EXPR:
13457       /* 15.23 Conditional-Or Operator */
13458     case TRUTH_ORIF_EXPR:
13459       /* Operands must be of BOOLEAN type */
13460       if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
13461           TREE_CODE (op2_type) != BOOLEAN_TYPE)
13462         {
13463           if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
13464             ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
13465           if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
13466             ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
13467           TREE_TYPE (node) = boolean_type_node;
13468           error_found = 1;
13469           break;
13470         }
13471       else if (integer_zerop (op1))
13472         {
13473           return code == TRUTH_ANDIF_EXPR ? op1 : op2;
13474         }
13475       else if (integer_onep (op1))
13476         {
13477           return code == TRUTH_ANDIF_EXPR ? op2 : op1;
13478         }
13479       /* The type of the conditional operators is BOOLEAN */
13480       prom_type = boolean_type_node;
13481       break;
13482
13483       /* 15.19.1 Numerical Comparison Operators <, <=, >, >= */
13484     case LT_EXPR:
13485     case GT_EXPR:
13486     case LE_EXPR:
13487     case GE_EXPR:
13488       /* The type of each of the operands must be a primitive numeric
13489          type */
13490       if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
13491         {
13492           if (!JNUMERIC_TYPE_P (op1_type))
13493             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
13494           if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
13495             ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
13496           TREE_TYPE (node) = boolean_type_node;
13497           error_found = 1;
13498           break;
13499         }
13500       /* Binary numeric promotion is performed on the operands */
13501       binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13502       /* The type of the relation expression is always BOOLEAN */
13503       prom_type = boolean_type_node;
13504       break;
13505
13506       /* 15.20 Equality Operator */
13507     case EQ_EXPR:
13508     case NE_EXPR:
13509       /* It's time for us to patch the strings. */
13510       if ((cn = patch_string (op1)))
13511        {
13512          op1 = cn;
13513          op1_type = TREE_TYPE (op1);
13514        }
13515       if ((cn = patch_string (op2)))
13516        {
13517          op2 = cn;
13518          op2_type = TREE_TYPE (op2);
13519        }
13520
13521       /* 15.20.1 Numerical Equality Operators == and != */
13522       /* Binary numeric promotion is performed on the operands */
13523       if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
13524         binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
13525
13526       /* 15.20.2 Boolean Equality Operators == and != */
13527       else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
13528           TREE_CODE (op2_type) == BOOLEAN_TYPE)
13529         ;                       /* Nothing to do here */
13530
13531       /* 15.20.3 Reference Equality Operators == and != */
13532       /* Types have to be either references or the null type. If
13533          they're references, it must be possible to convert either
13534          type to the other by casting conversion. */
13535       else if (op1 == null_pointer_node || op2 == null_pointer_node
13536                || (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
13537                    && (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
13538                        || valid_ref_assignconv_cast_p (op2_type,
13539                                                        op1_type, 1))))
13540         ;                       /* Nothing to do here */
13541
13542       /* Else we have an error figure what can't be converted into
13543          what and report the error */
13544       else
13545         {
13546           char *t1;
13547           t1 = xstrdup (lang_printable_name (op1_type, 0));
13548           parse_error_context
13549             (wfl_operator,
13550              "Incompatible type for `%s'. Can't convert `%s' to `%s'",
13551              operator_string (node), t1,
13552              lang_printable_name (op2_type, 0));
13553           free (t1);
13554           TREE_TYPE (node) = boolean_type_node;
13555           error_found = 1;
13556           break;
13557         }
13558       prom_type = boolean_type_node;
13559       break;
13560     default:
13561       abort ();
13562     }
13563
13564   if (error_found)
13565     return error_mark_node;
13566
13567   TREE_OPERAND (node, 0) = op1;
13568   TREE_OPERAND (node, 1) = op2;
13569   TREE_TYPE (node) = prom_type;
13570   TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13571
13572   if (flag_emit_xref)
13573     return node;
13574
13575   /* fold does not respect side-effect order as required for Java but not C.
13576    * Also, it sometimes create SAVE_EXPRs which are bad when emitting
13577    * bytecode.
13578    */
13579   if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
13580       : ! TREE_SIDE_EFFECTS (node))
13581     node = fold (node);
13582   return node;
13583 }
13584
13585 /* Concatenate the STRING_CST CSTE and STRING. When AFTER is a non
13586    zero value, the value of CSTE comes after the valude of STRING */
13587
13588 static tree
13589 do_merge_string_cste (tree cste, const char *string, int string_len, int after)
13590 {
13591   const char *old = TREE_STRING_POINTER (cste);
13592   int old_len = TREE_STRING_LENGTH (cste);
13593   int len = old_len + string_len;
13594   char *new = alloca (len+1);
13595
13596   if (after)
13597     {
13598       memcpy (new, string, string_len);
13599       memcpy (&new [string_len], old, old_len);
13600     }
13601   else
13602     {
13603       memcpy (new, old, old_len);
13604       memcpy (&new [old_len], string, string_len);
13605     }
13606   new [len] = '\0';
13607   return build_string (len, new);
13608 }
13609
13610 /* Tries to merge OP1 (a STRING_CST) and OP2 (if suitable). Return a
13611    new STRING_CST on success, NULL_TREE on failure.  */
13612
13613 static tree
13614 merge_string_cste (tree op1, tree op2, int after)
13615 {
13616   /* Handle two string constants right away.  */
13617   if (TREE_CODE (op2) == STRING_CST)
13618     return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
13619                                  TREE_STRING_LENGTH (op2), after);
13620
13621   /* Reasonable integer constant can be treated right away.  */
13622   if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
13623     {
13624       static const char *const boolean_true = "true";
13625       static const char *const boolean_false = "false";
13626       static const char *const null_pointer = "null";
13627       char ch[4];
13628       const char *string;
13629
13630       if (op2 == boolean_true_node)
13631         string = boolean_true;
13632       else if (op2 == boolean_false_node)
13633         string = boolean_false;
13634       else if (op2 == null_pointer_node
13635                || (integer_zerop (op2)
13636                    && TREE_CODE (TREE_TYPE (op2)) == POINTER_TYPE))
13637         /* FIXME: null is not a compile-time constant, so it is only safe to
13638            merge if the overall expression is non-constant. However, this
13639            code always merges without checking the overall expression.  */
13640         string = null_pointer;
13641       else if (TREE_TYPE (op2) == char_type_node)
13642         {
13643           /* Convert the character into UTF-8.  */
13644           unsigned int c = (unsigned int) TREE_INT_CST_LOW (op2);
13645           unsigned char *p = (unsigned char *) ch;
13646           if (0x01 <= c && c <= 0x7f)
13647             *p++ = (unsigned char) c;
13648           else if (c < 0x7ff)
13649             {
13650               *p++ = (unsigned char) (c >> 6 | 0xc0);
13651               *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13652             }
13653           else
13654             {
13655               *p++ = (unsigned char) (c >> 12 | 0xe0);
13656               *p++ = (unsigned char) (((c >> 6) & 0x3f) | 0x80);
13657               *p++ = (unsigned char) ((c & 0x3f) | 0x80);
13658             }
13659           *p = '\0';
13660
13661           string = ch;
13662         }
13663       else
13664         string = string_convert_int_cst (op2);
13665
13666       return do_merge_string_cste (op1, string, strlen (string), after);
13667     }
13668   return NULL_TREE;
13669 }
13670
13671 /* Tries to statically concatenate OP1 and OP2 if possible. Either one
13672    has to be a STRING_CST and the other part must be a STRING_CST or a
13673    INTEGRAL constant. Return a new STRING_CST if the operation
13674    succeed, NULL_TREE otherwise.
13675
13676    If the case we want to optimize for space, we might want to return
13677    NULL_TREE for each invocation of this routine. FIXME */
13678
13679 static tree
13680 string_constant_concatenation (tree op1, tree op2)
13681 {
13682   if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
13683     {
13684       tree string, rest;
13685       int invert;
13686
13687       string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
13688       rest   = (string == op1 ? op2 : op1);
13689       invert = (string == op1 ? 0 : 1 );
13690
13691       /* Walk REST, only if it looks reasonable */
13692       if (TREE_CODE (rest) != STRING_CST
13693           && !IS_CRAFTED_STRING_BUFFER_P (rest)
13694           && !JSTRING_TYPE_P (TREE_TYPE (rest))
13695           && TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
13696         {
13697           rest = java_complete_tree (rest);
13698           if (rest == error_mark_node)
13699             return error_mark_node;
13700           rest = fold (rest);
13701         }
13702       return merge_string_cste (string, rest, invert);
13703     }
13704   return NULL_TREE;
13705 }
13706
13707 /* Implement the `+' operator. Does static optimization if possible,
13708    otherwise create (if necessary) and append elements to a
13709    StringBuffer. The StringBuffer will be carried around until it is
13710    used for a function call or an assignment. Then toString() will be
13711    called on it to turn it into a String object. */
13712
13713 static tree
13714 build_string_concatenation (tree op1, tree op2)
13715 {
13716   tree result;
13717   int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
13718
13719   if (flag_emit_xref)
13720     return build (PLUS_EXPR, string_type_node, op1, op2);
13721
13722   /* Try to do some static optimization */
13723   if ((result = string_constant_concatenation (op1, op2)))
13724     return result;
13725
13726   /* Discard empty strings on either side of the expression */
13727   if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
13728     {
13729       op1 = op2;
13730       op2 = NULL_TREE;
13731     }
13732   else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
13733     op2 = NULL_TREE;
13734
13735   /* If operands are string constant, turn then into object references */
13736   if (TREE_CODE (op1) == STRING_CST)
13737     op1 = patch_string_cst (op1);
13738   if (op2 && TREE_CODE (op2) == STRING_CST)
13739     op2 = patch_string_cst (op2);
13740
13741   /* If either one of the constant is null and the other non null
13742      operand is a String constant, return it. */
13743   if ((TREE_CODE (op1) == STRING_CST) && !op2)
13744     return op1;
13745
13746   /* If OP1 isn't already a StringBuffer, create and
13747      initialize a new one */
13748   if (!IS_CRAFTED_STRING_BUFFER_P (op1))
13749     {
13750       /* Two solutions here:
13751          1) OP1 is a constant string reference, we call new StringBuffer(OP1)
13752          2) OP1 is something else, we call new StringBuffer().append(OP1).  */
13753       if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
13754         op1 = BUILD_STRING_BUFFER (op1);
13755       else
13756         {
13757           tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
13758           op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
13759         }
13760     }
13761
13762   if (op2)
13763     {
13764       /* OP1 is no longer the last node holding a crafted StringBuffer */
13765       IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
13766       /* Create a node for `{new...,xxx}.append (op2)' */
13767       if (op2)
13768         op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
13769     }
13770
13771   /* Mark the last node holding a crafted StringBuffer */
13772   IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
13773
13774   TREE_SIDE_EFFECTS (op1) = side_effects;
13775   return op1;
13776 }
13777
13778 /* Patch the string node NODE. NODE can be a STRING_CST of a crafted
13779    StringBuffer. If no string were found to be patched, return
13780    NULL. */
13781
13782 static tree
13783 patch_string (tree node)
13784 {
13785   if (node == error_mark_node)
13786     return error_mark_node;
13787   if (TREE_CODE (node) == STRING_CST)
13788     return patch_string_cst (node);
13789   else if (IS_CRAFTED_STRING_BUFFER_P (node))
13790     {
13791       int saved = ctxp->explicit_constructor_p;
13792       tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
13793       tree ret;
13794       /* Temporary disable forbid the use of `this'. */
13795       ctxp->explicit_constructor_p = 0;
13796       ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
13797       /* String concatenation arguments must be evaluated in order too. */
13798       ret = force_evaluation_order (ret);
13799       /* Restore it at its previous value */
13800       ctxp->explicit_constructor_p = saved;
13801       return ret;
13802     }
13803   return NULL_TREE;
13804 }
13805
13806 /* Build the internal representation of a string constant.  */
13807
13808 static tree
13809 patch_string_cst (tree node)
13810 {
13811   int location;
13812   if (! flag_emit_class_files)
13813     {
13814       node = get_identifier (TREE_STRING_POINTER (node));
13815       location = alloc_name_constant (CONSTANT_String, node);
13816       node = build_ref_from_constant_pool (location);
13817     }
13818   TREE_CONSTANT (node) = 1;
13819   TREE_INVARIANT (node) = 1;
13820
13821   /* ??? Guessing that the class file code can't handle casts.  */
13822   if (! flag_emit_class_files)
13823     node = convert (string_ptr_type_node, node);
13824   else
13825     TREE_TYPE (node) = string_ptr_type_node;
13826
13827   return node;
13828 }
13829
13830 /* Build an incomplete unary operator expression. */
13831
13832 static tree
13833 build_unaryop (int op_token, int op_location, tree op1)
13834 {
13835   enum tree_code op;
13836   tree unaryop;
13837   switch (op_token)
13838     {
13839     case PLUS_TK: op = UNARY_PLUS_EXPR; break;
13840     case MINUS_TK: op = NEGATE_EXPR; break;
13841     case NEG_TK: op = TRUTH_NOT_EXPR; break;
13842     case NOT_TK: op = BIT_NOT_EXPR; break;
13843     default: abort ();
13844     }
13845
13846   unaryop = build1 (op, NULL_TREE, op1);
13847   TREE_SIDE_EFFECTS (unaryop) = 1;
13848   /* Store the location of the operator, for better error report. The
13849      string of the operator will be rebuild based on the OP value. */
13850   EXPR_WFL_LINECOL (unaryop) = op_location;
13851   return unaryop;
13852 }
13853
13854 /* Special case for the ++/-- operators, since they require an extra
13855    argument to build, which is set to NULL and patched
13856    later. IS_POST_P is 1 if the operator, 0 otherwise.  */
13857
13858 static tree
13859 build_incdec (int op_token, int op_location, tree op1, int is_post_p)
13860 {
13861   static const enum tree_code lookup [2][2] =
13862     {
13863       { PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
13864       { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
13865     };
13866   tree node = build (lookup [is_post_p][(op_token - DECR_TK)],
13867                      NULL_TREE, op1, NULL_TREE);
13868   TREE_SIDE_EFFECTS (node) = 1;
13869   /* Store the location of the operator, for better error report. The
13870      string of the operator will be rebuild based on the OP value. */
13871   EXPR_WFL_LINECOL (node) = op_location;
13872   return node;
13873 }
13874
13875 /* Build an incomplete cast operator, based on the use of the
13876    CONVERT_EXPR. Note that TREE_TYPE of the constructed node is
13877    set. java_complete_tree is trained to walk a CONVERT_EXPR even
13878    though its type is already set.  */
13879
13880 static tree
13881 build_cast (int location, tree type, tree exp)
13882 {
13883   tree node = build1 (CONVERT_EXPR, type, exp);
13884   EXPR_WFL_LINECOL (node) = location;
13885   return node;
13886 }
13887
13888 /* Build an incomplete class reference operator.  */
13889 static tree
13890 build_incomplete_class_ref (int location, tree class_name)
13891 {
13892   tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
13893   tree class_decl = GET_CPC ();
13894   tree this_class = TREE_TYPE (class_decl);
13895
13896   /* Generate the synthetic static method `class$'.  (Previously we
13897      deferred this, causing different method tables to be emitted
13898      for native code and bytecode.)  */
13899   if (!TYPE_DOT_CLASS (this_class)
13900       && !JPRIMITIVE_TYPE_P (class_name)
13901       && !(TREE_CODE (class_name) == VOID_TYPE))
13902     {
13903       tree cpc_list = GET_CPC_LIST();
13904       tree cpc = cpc_list;
13905       tree target_class;
13906
13907       /* For inner classes, add a 'class$' method to their outermost
13908          context, creating it if necessary.  */
13909       
13910       while (GET_NEXT_ENCLOSING_CPC(cpc))
13911         cpc = GET_NEXT_ENCLOSING_CPC(cpc);
13912       class_decl = TREE_VALUE (cpc);
13913
13914       target_class = TREE_TYPE (class_decl);
13915
13916       if (CLASS_INTERFACE (TYPE_NAME (target_class)))
13917         {
13918           /* For interfaces, adding a static 'class$' method directly 
13919              is illegal.  So create an inner class to contain the new
13920              method.  Empirically this matches the behavior of javac.  */
13921           tree t, inner;
13922           /* We want the generated inner class inside the outermost class. */
13923           GET_CPC_LIST() = cpc;
13924           t = build_wfl_node (DECL_NAME (TYPE_NAME (object_type_node)));
13925           inner = create_anonymous_class (0, t);
13926           target_class = TREE_TYPE (inner);
13927           end_class_declaration (1);
13928           GET_CPC_LIST() = cpc_list;
13929         }
13930
13931       if (TYPE_DOT_CLASS (target_class) == NULL_TREE)
13932         build_dot_class_method (target_class);
13933
13934       if (this_class != target_class)
13935         TYPE_DOT_CLASS (this_class) = TYPE_DOT_CLASS (target_class);
13936     }
13937
13938   EXPR_WFL_LINECOL (node) = location;
13939   return node;
13940 }
13941
13942 /* Complete an incomplete class reference operator.  */
13943 static tree
13944 patch_incomplete_class_ref (tree node)
13945 {
13946   tree type = TREE_OPERAND (node, 0);
13947   tree ref_type;
13948
13949   if (!(ref_type = resolve_type_during_patch (type)))
13950     return error_mark_node;
13951
13952   /* If we're not emitting class files and we know ref_type is a
13953      compiled class, build a direct reference.  */
13954   if ((! flag_emit_class_files && is_compiled_class (ref_type))
13955       || JPRIMITIVE_TYPE_P (ref_type)
13956       || TREE_CODE (ref_type) == VOID_TYPE)
13957     {
13958       tree dot = build_class_ref (ref_type);
13959       /* A class referenced by `foo.class' is initialized.  */
13960       if (!flag_emit_class_files)
13961        dot = build_class_init (ref_type, dot);
13962       return java_complete_tree (dot);
13963     }
13964
13965   /* If we're emitting class files and we have to deal with non
13966      primitive types, we invoke the synthetic static method `class$'.  */
13967   ref_type = build_dot_class_method_invocation (current_class, ref_type);
13968   return java_complete_tree (ref_type);
13969 }
13970
13971 /* 15.14 Unary operators. We return error_mark_node in case of error,
13972    but preserve the type of NODE if the type is fixed.  */
13973
13974 static tree
13975 patch_unaryop (tree node, tree wfl_op)
13976 {
13977   tree op = TREE_OPERAND (node, 0);
13978   tree op_type = TREE_TYPE (op);
13979   tree prom_type = NULL_TREE, value, decl;
13980   int outer_field_flag = 0;
13981   int code = TREE_CODE (node);
13982   int error_found = 0;
13983
13984   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
13985
13986   switch (code)
13987     {
13988       /* 15.13.2 Postfix Increment Operator ++ */
13989     case POSTINCREMENT_EXPR:
13990       /* 15.13.3 Postfix Increment Operator -- */
13991     case POSTDECREMENT_EXPR:
13992       /* 15.14.1 Prefix Increment Operator ++ */
13993     case PREINCREMENT_EXPR:
13994       /* 15.14.2 Prefix Decrement Operator -- */
13995     case PREDECREMENT_EXPR:
13996       op = decl = strip_out_static_field_access_decl (op);
13997       outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
13998       /* We might be trying to change an outer field accessed using
13999          access method. */
14000       if (outer_field_flag)
14001         {
14002           /* Retrieve the decl of the field we're trying to access. We
14003              do that by first retrieving the function we would call to
14004              access the field. It has been already verified that this
14005              field isn't final */
14006           if (flag_emit_class_files)
14007             decl = TREE_OPERAND (op, 0);
14008           else
14009             decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
14010           decl = DECL_FUNCTION_ACCESS_DECL (decl);
14011         }
14012       /* We really should have a JAVA_ARRAY_EXPR to avoid this */
14013       else if (!JDECL_P (decl)
14014           && TREE_CODE (decl) != COMPONENT_REF
14015           && !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
14016           && TREE_CODE (decl) != INDIRECT_REF
14017           && !(TREE_CODE (decl) == COMPOUND_EXPR
14018                && TREE_OPERAND (decl, 1)
14019                && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
14020         {
14021           TREE_TYPE (node) = error_mark_node;
14022           error_found = 1;
14023         }
14024
14025       /* From now on, we know that op if a variable and that it has a
14026          valid wfl. We use wfl_op to locate errors related to the
14027          ++/-- operand. */
14028       if (!JNUMERIC_TYPE_P (op_type))
14029         {
14030           parse_error_context
14031             (wfl_op, "Invalid argument type `%s' to `%s'",
14032              lang_printable_name (op_type, 0), operator_string (node));
14033           TREE_TYPE (node) = error_mark_node;
14034           error_found = 1;
14035         }
14036       else
14037         {
14038           /* Before the addition, binary numeric promotion is performed on
14039              both operands, if really necessary */
14040           if (JINTEGRAL_TYPE_P (op_type))
14041             {
14042               value = build_int_2 (1, 0);
14043               TREE_TYPE (value) = TREE_TYPE (node) = op_type;
14044             }
14045           else
14046             {
14047               value = build_int_2 (1, 0);
14048               TREE_TYPE (node) =
14049                 binary_numeric_promotion (op_type,
14050                                           TREE_TYPE (value), &op, &value);
14051             }
14052
14053           /* We remember we might be accessing an outer field */
14054           if (outer_field_flag)
14055             {
14056               /* We re-generate an access to the field */
14057               value = build (PLUS_EXPR, TREE_TYPE (op),
14058                              build_outer_field_access (wfl_op, decl), value);
14059
14060               /* And we patch the original access$() into a write
14061                  with plus_op as a rhs */
14062               return outer_field_access_fix (node, op, value);
14063             }
14064
14065           /* And write back into the node. */
14066           TREE_OPERAND (node, 0) = op;
14067           TREE_OPERAND (node, 1) = value;
14068           /* Convert the overall back into its original type, if
14069              necessary, and return */
14070           if (JINTEGRAL_TYPE_P (op_type))
14071             return fold (node);
14072           else
14073             return fold (convert (op_type, node));
14074         }
14075       break;
14076
14077       /* 15.14.3 Unary Plus Operator + */
14078     case UNARY_PLUS_EXPR:
14079       /* 15.14.4 Unary Minus Operator - */
14080     case NEGATE_EXPR:
14081       if (!JNUMERIC_TYPE_P (op_type))
14082         {
14083           ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
14084           TREE_TYPE (node) = error_mark_node;
14085           error_found = 1;
14086         }
14087       /* Unary numeric promotion is performed on operand */
14088       else
14089         {
14090           op = do_unary_numeric_promotion (op);
14091           prom_type = TREE_TYPE (op);
14092           if (code == UNARY_PLUS_EXPR)
14093             return fold (op);
14094         }
14095       break;
14096
14097       /* 15.14.5 Bitwise Complement Operator ~ */
14098     case BIT_NOT_EXPR:
14099       if (!JINTEGRAL_TYPE_P (op_type))
14100         {
14101           ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
14102           TREE_TYPE (node) = error_mark_node;
14103           error_found = 1;
14104         }
14105       else
14106         {
14107           op = do_unary_numeric_promotion (op);
14108           prom_type = TREE_TYPE (op);
14109         }
14110       break;
14111
14112       /* 15.14.6 Logical Complement Operator ! */
14113     case TRUTH_NOT_EXPR:
14114       if (TREE_CODE (op_type) != BOOLEAN_TYPE)
14115         {
14116           ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
14117           /* But the type is known. We will report an error if further
14118              attempt of a assignment is made with this rhs */
14119           TREE_TYPE (node) = boolean_type_node;
14120           error_found = 1;
14121         }
14122       else
14123         prom_type = boolean_type_node;
14124       break;
14125
14126       /* 15.15 Cast Expression */
14127     case CONVERT_EXPR:
14128       value = patch_cast (node, wfl_operator);
14129       if (value == error_mark_node)
14130         {
14131           /* If this cast is part of an assignment, we tell the code
14132              that deals with it not to complain about a mismatch,
14133              because things have been cast, anyways */
14134           TREE_TYPE (node) = error_mark_node;
14135           error_found = 1;
14136         }
14137       else
14138         {
14139           value = fold (value);
14140           TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
14141           return value;
14142         }
14143       break;
14144     }
14145
14146   if (error_found)
14147     return error_mark_node;
14148
14149   /* There are cases where node has been replaced by something else
14150      and we don't end up returning here: UNARY_PLUS_EXPR,
14151      CONVERT_EXPR, {POST,PRE}{INCR,DECR}EMENT_EXPR. */
14152   TREE_OPERAND (node, 0) = fold (op);
14153   TREE_TYPE (node) = prom_type;
14154   TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
14155   return fold (node);
14156 }
14157
14158 /* Generic type resolution that sometimes takes place during node
14159    patching. Returned the resolved type or generate an error
14160    message. Return the resolved type or NULL_TREE.  */
14161
14162 static tree
14163 resolve_type_during_patch (tree type)
14164 {
14165   if (unresolved_type_p (type, NULL))
14166     {
14167       tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
14168       if (!type_decl)
14169         {
14170           parse_error_context (type,
14171                                "Class `%s' not found in type declaration",
14172                                IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
14173           return NULL_TREE;
14174         }
14175
14176       check_deprecation (type, type_decl);
14177
14178       return TREE_TYPE (type_decl);
14179     }
14180   return type;
14181 }
14182
14183 /* 5.5 Casting Conversion. error_mark_node is returned if an error is
14184    found. Otherwise NODE or something meant to replace it is returned.  */
14185
14186 static tree
14187 patch_cast (tree node, tree wfl_op)
14188 {
14189   tree op = TREE_OPERAND (node, 0);
14190   tree cast_type = TREE_TYPE (node);
14191   tree patched, op_type;
14192   char *t1;
14193
14194   /* Some string patching might be necessary at this stage */
14195   if ((patched = patch_string (op)))
14196     TREE_OPERAND (node, 0) = op = patched;
14197   op_type = TREE_TYPE (op);
14198
14199   /* First resolve OP_TYPE if unresolved */
14200   if (!(cast_type = resolve_type_during_patch (cast_type)))
14201     return error_mark_node;
14202
14203   /* Check on cast that are proven correct at compile time */
14204   if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
14205     {
14206       /* Same type */
14207       if (cast_type == op_type)
14208         return node;
14209
14210       /* A narrowing conversion from a floating-point number to an
14211          integral type requires special handling (5.1.3).  */
14212       if (JFLOAT_TYPE_P (op_type) && JINTEGRAL_TYPE_P (cast_type))
14213         if (cast_type != long_type_node)
14214           op = convert (integer_type_node, op);
14215
14216       /* Try widening/narrowing conversion.  Potentially, things need
14217          to be worked out in gcc so we implement the extreme cases
14218          correctly.  fold_convert() needs to be fixed.  */
14219       return convert (cast_type, op);
14220     }
14221
14222   /* It's also valid to cast a boolean into a boolean */
14223   if (op_type == boolean_type_node && cast_type == boolean_type_node)
14224     return node;
14225
14226   /* null can be casted to references */
14227   if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
14228     return build_null_of_type (cast_type);
14229
14230   /* The remaining legal casts involve conversion between reference
14231      types. Check for their compile time correctness. */
14232   if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
14233       && valid_ref_assignconv_cast_p (op_type, cast_type, 1))
14234     {
14235       TREE_TYPE (node) = promote_type (cast_type);
14236       /* Now, the case can be determined correct at compile time if
14237          OP_TYPE can be converted into CAST_TYPE by assignment
14238          conversion (5.2) */
14239
14240       if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
14241         {
14242           TREE_SET_CODE (node, NOP_EXPR);
14243           return node;
14244         }
14245
14246       if (flag_emit_class_files)
14247         {
14248           TREE_SET_CODE (node, CONVERT_EXPR);
14249           return node;
14250         }
14251
14252       /* The cast requires a run-time check */
14253       return build (CALL_EXPR, promote_type (cast_type),
14254                     build_address_of (soft_checkcast_node),
14255                     tree_cons (NULL_TREE, build_class_ref (cast_type),
14256                                build_tree_list (NULL_TREE, op)),
14257                     NULL_TREE);
14258     }
14259
14260   /* Any other casts are proven incorrect at compile time */
14261   t1 = xstrdup (lang_printable_name (op_type, 0));
14262   parse_error_context (wfl_op, "Invalid cast from `%s' to `%s'",
14263                        t1, lang_printable_name (cast_type, 0));
14264   free (t1);
14265   return error_mark_node;
14266 }
14267
14268 /* Build a null constant and give it the type TYPE.  */
14269
14270 static tree
14271 build_null_of_type (tree type)
14272 {
14273   tree node = build_int_2 (0, 0);
14274   TREE_TYPE (node) = promote_type (type);
14275   return node;
14276 }
14277
14278 /* Build an ARRAY_REF incomplete tree node. Note that operand 1 isn't
14279    a list of indices. */
14280 static tree
14281 build_array_ref (int location, tree array, tree index)
14282 {
14283   tree node = build (ARRAY_REF, NULL_TREE, array, index, NULL_TREE, NULL_TREE);
14284   EXPR_WFL_LINECOL (node) = location;
14285   return node;
14286 }
14287
14288 /* 15.12 Array Access Expression */
14289
14290 static tree
14291 patch_array_ref (tree node)
14292 {
14293   tree array = TREE_OPERAND (node, 0);
14294   tree array_type  = TREE_TYPE (array);
14295   tree index = TREE_OPERAND (node, 1);
14296   tree index_type = TREE_TYPE (index);
14297   int error_found = 0;
14298
14299   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14300
14301   if (TREE_CODE (array_type) == POINTER_TYPE)
14302     array_type = TREE_TYPE (array_type);
14303
14304   /* The array reference must be an array */
14305   if (!TYPE_ARRAY_P (array_type))
14306     {
14307       parse_error_context
14308         (wfl_operator,
14309          "`[]' can only be applied to arrays. It can't be applied to `%s'",
14310          lang_printable_name (array_type, 0));
14311       TREE_TYPE (node) = error_mark_node;
14312       error_found = 1;
14313     }
14314
14315   /* The array index undergoes unary numeric promotion. The promoted
14316      type must be int */
14317   index = do_unary_numeric_promotion (index);
14318   if (TREE_TYPE (index) != int_type_node)
14319     {
14320       if (valid_cast_to_p (index_type, int_type_node))
14321         parse_error_context (wfl_operator,
14322    "Incompatible type for `[]'. Explicit cast needed to convert `%s' to `int'",
14323                              lang_printable_name (index_type, 0));
14324       else
14325         parse_error_context (wfl_operator,
14326           "Incompatible type for `[]'. Can't convert `%s' to `int'",
14327                              lang_printable_name (index_type, 0));
14328       TREE_TYPE (node) = error_mark_node;
14329       error_found = 1;
14330     }
14331
14332   if (error_found)
14333     return error_mark_node;
14334
14335   array_type = TYPE_ARRAY_ELEMENT (array_type);
14336
14337   if (flag_emit_class_files || flag_emit_xref)
14338     {
14339       TREE_OPERAND (node, 0) = array;
14340       TREE_OPERAND (node, 1) = index;
14341     }
14342   else
14343     node = build_java_arrayaccess (array, array_type, index);
14344   TREE_TYPE (node) = array_type;
14345   return node;
14346 }
14347
14348 /* 15.9 Array Creation Expressions */
14349
14350 static tree
14351 build_newarray_node (tree type, tree dims, int extra_dims)
14352 {
14353   tree node =
14354     build (NEW_ARRAY_EXPR, NULL_TREE, type, nreverse (dims),
14355            build_int_2 (extra_dims, 0));
14356   return node;
14357 }
14358
14359 static tree
14360 patch_newarray (tree node)
14361 {
14362   tree type = TREE_OPERAND (node, 0);
14363   tree dims = TREE_OPERAND (node, 1);
14364   tree cdim, array_type;
14365   int error_found = 0;
14366   int ndims = 0;
14367   int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
14368
14369   /* Dimension types are verified. It's better for the types to be
14370      verified in order. */
14371   for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
14372     {
14373       int dim_error = 0;
14374       tree dim = TREE_VALUE (cdim);
14375
14376       /* Dim might have been saved during its evaluation */
14377       dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
14378
14379       /* The type of each specified dimension must be an integral type. */
14380       if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
14381         dim_error = 1;
14382
14383       /* Each expression undergoes an unary numeric promotion (5.6.1) and the
14384          promoted type must be int. */
14385       else
14386         {
14387           dim = do_unary_numeric_promotion (dim);
14388           if (TREE_TYPE (dim) != int_type_node)
14389             dim_error = 1;
14390         }
14391
14392       /* Report errors on types here */
14393       if (dim_error)
14394         {
14395           parse_error_context
14396             (TREE_PURPOSE (cdim),
14397              "Incompatible type for dimension in array creation expression. %s convert `%s' to `int'",
14398              (valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
14399               "Explicit cast needed to" : "Can't"),
14400              lang_printable_name (TREE_TYPE (dim), 0));
14401           error_found = 1;
14402         }
14403
14404       TREE_PURPOSE (cdim) = NULL_TREE;
14405     }
14406
14407   /* Resolve array base type if unresolved */
14408   if (!(type = resolve_type_during_patch (type)))
14409     error_found = 1;
14410
14411   if (error_found)
14412     {
14413       /* We don't want further evaluation of this bogus array creation
14414          operation */
14415       TREE_TYPE (node) = error_mark_node;
14416       return error_mark_node;
14417     }
14418
14419   /* Set array_type to the actual (promoted) array type of the result. */
14420   if (TREE_CODE (type) == RECORD_TYPE)
14421     type = build_pointer_type (type);
14422   while (--xdims >= 0)
14423     {
14424       type = promote_type (build_java_array_type (type, -1));
14425     }
14426   dims = nreverse (dims);
14427   array_type = type;
14428   for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
14429     {
14430       type = array_type;
14431       array_type
14432         = build_java_array_type (type,
14433                                  TREE_CODE (cdim) == INTEGER_CST
14434                                  ? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
14435                                  : -1);
14436       array_type = promote_type (array_type);
14437     }
14438   dims = nreverse (dims);
14439
14440   /* The node is transformed into a function call. Things are done
14441      differently according to the number of dimensions. If the number
14442      of dimension is equal to 1, then the nature of the base type
14443      (primitive or not) matters. */
14444   if (ndims == 1)
14445     return build_new_array (type, TREE_VALUE (dims));
14446
14447   /* Can't reuse what's already written in expr.c because it uses the
14448      JVM stack representation. Provide a build_multianewarray. FIXME */
14449   return build (CALL_EXPR, array_type,
14450                 build_address_of (soft_multianewarray_node),
14451                 tree_cons (NULL_TREE, build_class_ref (TREE_TYPE (array_type)),
14452                            tree_cons (NULL_TREE,
14453                                       build_int_2 (ndims, 0), dims )),
14454                 NULL_TREE);
14455 }
14456
14457 /* 10.6 Array initializer.  */
14458
14459 /* Build a wfl for array element that don't have one, so we can
14460    pin-point errors.  */
14461
14462 static tree
14463 maybe_build_array_element_wfl (tree node)
14464 {
14465   if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
14466     return build_expr_wfl (NULL_TREE, ctxp->filename,
14467                            ctxp->elc.line, ctxp->elc.prev_col);
14468   else
14469     return NULL_TREE;
14470 }
14471
14472 /* Build a NEW_ARRAY_INIT that features a CONSTRUCTOR node. This makes
14473    identification of initialized arrays easier to detect during walk
14474    and expansion.  */
14475
14476 static tree
14477 build_new_array_init (int location, tree values)
14478 {
14479   tree constructor = build_constructor (NULL_TREE, values);
14480   tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
14481   EXPR_WFL_LINECOL (to_return) = location;
14482   return to_return;
14483 }
14484
14485 /* Expand a NEW_ARRAY_INIT node. Return error_mark_node if an error
14486    occurred.  Otherwise return NODE after having set its type
14487    appropriately.  */
14488
14489 static tree
14490 patch_new_array_init (tree type, tree node)
14491 {
14492   int error_seen = 0;
14493   tree current, element_type;
14494   HOST_WIDE_INT length;
14495   int all_constant = 1;
14496   tree init = TREE_OPERAND (node, 0);
14497
14498   if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
14499     {
14500       parse_error_context (node,
14501                            "Invalid array initializer for non-array type `%s'",
14502                            lang_printable_name (type, 1));
14503       return error_mark_node;
14504     }
14505   type = TREE_TYPE (type);
14506   element_type = TYPE_ARRAY_ELEMENT (type);
14507
14508   CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
14509
14510   for (length = 0, current = CONSTRUCTOR_ELTS (init);
14511        current;  length++, current = TREE_CHAIN (current))
14512     {
14513       tree elt = TREE_VALUE (current);
14514       if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
14515         {
14516           error_seen |= array_constructor_check_entry (element_type, current);
14517           elt = TREE_VALUE (current);
14518           /* When compiling to native code, STRING_CST is converted to
14519              INDIRECT_REF, but still with a TREE_CONSTANT flag. */
14520           if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
14521             all_constant = 0;
14522         }
14523       else
14524         {
14525           TREE_VALUE (current) = patch_new_array_init (element_type, elt);
14526           TREE_PURPOSE (current) = NULL_TREE;
14527           all_constant = 0;
14528         }
14529       if (elt && TREE_CODE (elt) == TREE_LIST
14530           && TREE_VALUE (elt) == error_mark_node)
14531         error_seen = 1;
14532     }
14533
14534   if (error_seen)
14535     return error_mark_node;
14536
14537   /* Create a new type. We can't reuse the one we have here by
14538      patching its dimension because it originally is of dimension -1
14539      hence reused by gcc. This would prevent triangular arrays. */
14540   type = build_java_array_type (element_type, length);
14541   TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
14542   TREE_TYPE (node) = promote_type (type);
14543   TREE_CONSTANT (init) = all_constant;
14544   TREE_INVARIANT (init) = all_constant;
14545   TREE_CONSTANT (node) = all_constant;
14546   TREE_INVARIANT (node) = all_constant;
14547   return node;
14548 }
14549
14550 /* Verify that one entry of the initializer element list can be
14551    assigned to the array base type. Report 1 if an error occurred, 0
14552    otherwise.  */
14553
14554 static int
14555 array_constructor_check_entry (tree type, tree entry)
14556 {
14557   char *array_type_string = NULL;       /* For error reports */
14558   tree value, type_value, new_value, wfl_value, patched;
14559   int error_seen = 0;
14560
14561   new_value = NULL_TREE;
14562   wfl_value = TREE_VALUE (entry);
14563
14564   value = java_complete_tree (TREE_VALUE (entry));
14565   /* patch_string return error_mark_node if arg is error_mark_node */
14566   if ((patched = patch_string (value)))
14567     value = patched;
14568   if (value == error_mark_node)
14569     return 1;
14570
14571   type_value = TREE_TYPE (value);
14572
14573   /* At anytime, try_builtin_assignconv can report a warning on
14574      constant overflow during narrowing. */
14575   SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
14576   new_value = try_builtin_assignconv (wfl_operator, type, value);
14577   if (!new_value && (new_value = try_reference_assignconv (type, value)))
14578     type_value = promote_type (type);
14579
14580   /* Check and report errors */
14581   if (!new_value)
14582     {
14583       const char *const msg = (!valid_cast_to_p (type_value, type) ?
14584                    "Can't" : "Explicit cast needed to");
14585       if (!array_type_string)
14586         array_type_string = xstrdup (lang_printable_name (type, 1));
14587       parse_error_context
14588         (wfl_operator, "Incompatible type for array. %s convert `%s' to `%s'",
14589          msg, lang_printable_name (type_value, 1), array_type_string);
14590       error_seen = 1;
14591     }
14592
14593   if (new_value)
14594     TREE_VALUE (entry) = new_value;
14595
14596   if (array_type_string)
14597     free (array_type_string);
14598
14599   TREE_PURPOSE (entry) = NULL_TREE;
14600   return error_seen;
14601 }
14602
14603 static tree
14604 build_this (int location)
14605 {
14606   tree node = build_wfl_node (this_identifier_node);
14607   TREE_SET_CODE (node, THIS_EXPR);
14608   EXPR_WFL_LINECOL (node) = location;
14609   return node;
14610 }
14611
14612 /* 14.15 The return statement. It builds a modify expression that
14613    assigns the returned value to the RESULT_DECL that hold the value
14614    to be returned. */
14615
14616 static tree
14617 build_return (int location, tree op)
14618 {
14619   tree node = build1 (RETURN_EXPR, NULL_TREE, op);
14620   EXPR_WFL_LINECOL (node) = location;
14621   node = build_debugable_stmt (location, node);
14622   return node;
14623 }
14624
14625 static tree
14626 patch_return (tree node)
14627 {
14628   tree return_exp = TREE_OPERAND (node, 0);
14629   tree meth = current_function_decl;
14630   tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
14631   int error_found = 0;
14632
14633   TREE_TYPE (node) = error_mark_node;
14634   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14635
14636   /* It's invalid to have a return value within a function that is
14637      declared with the keyword void or that is a constructor */
14638   if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
14639     error_found = 1;
14640
14641   /* It's invalid to use a return statement in a static block */
14642   if (DECL_CLINIT_P (current_function_decl))
14643     error_found = 1;
14644
14645   /* It's invalid to have a no return value within a function that
14646      isn't declared with the keyword `void' */
14647   if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
14648     error_found = 2;
14649
14650   if (DECL_INSTINIT_P (current_function_decl))
14651     error_found = 1;
14652
14653   if (error_found)
14654     {
14655       if (DECL_INSTINIT_P (current_function_decl))
14656         parse_error_context (wfl_operator,
14657                              "`return' inside instance initializer");
14658
14659       else if (DECL_CLINIT_P (current_function_decl))
14660         parse_error_context (wfl_operator,
14661                              "`return' inside static initializer");
14662
14663       else if (!DECL_CONSTRUCTOR_P (meth))
14664         {
14665           char *t = xstrdup (lang_printable_name (mtype, 0));
14666           parse_error_context (wfl_operator,
14667                                "`return' with%s value from `%s %s'",
14668                                (error_found == 1 ? "" : "out"),
14669                                t, lang_printable_name (meth, 0));
14670           free (t);
14671         }
14672       else
14673         parse_error_context (wfl_operator,
14674                              "`return' with value from constructor `%s'",
14675                              lang_printable_name (meth, 0));
14676       return error_mark_node;
14677     }
14678
14679   /* If we have a return_exp, build a modify expression and expand
14680      it. Note: at that point, the assignment is declared valid, but we
14681      may want to carry some more hacks */
14682   if (return_exp)
14683     {
14684       tree exp = java_complete_tree (return_exp);
14685       tree modify, patched;
14686
14687       if ((patched = patch_string (exp)))
14688         exp = patched;
14689
14690       modify = build (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
14691       EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
14692       modify = java_complete_tree (modify);
14693
14694       if (modify != error_mark_node)
14695         {
14696           TREE_SIDE_EFFECTS (modify) = 1;
14697           TREE_OPERAND (node, 0) = modify;
14698         }
14699       else
14700         return error_mark_node;
14701     }
14702   TREE_TYPE (node) = void_type_node;
14703   TREE_SIDE_EFFECTS (node) = 1;
14704   return node;
14705 }
14706
14707 /* 14.8 The if Statement */
14708
14709 static tree
14710 build_if_else_statement (int location, tree expression, tree if_body,
14711                          tree else_body)
14712 {
14713   tree node;
14714   if (!else_body)
14715     else_body = build_java_empty_stmt ();
14716   node = build (COND_EXPR, NULL_TREE, expression, if_body, else_body);
14717   EXPR_WFL_LINECOL (node) = location;
14718   node = build_debugable_stmt (location, node);
14719   return node;
14720 }
14721
14722 static tree
14723 patch_if_else_statement (tree node)
14724 {
14725   tree expression = TREE_OPERAND (node, 0);
14726   int can_complete_normally
14727     = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
14728        | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
14729
14730   TREE_TYPE (node) = error_mark_node;
14731   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
14732
14733   /* The type of expression must be boolean */
14734   if (TREE_TYPE (expression) != boolean_type_node
14735       && TREE_TYPE (expression) != promoted_boolean_type_node)
14736     {
14737       parse_error_context
14738         (wfl_operator,
14739          "Incompatible type for `if'. Can't convert `%s' to `boolean'",
14740          lang_printable_name (TREE_TYPE (expression), 0));
14741       return error_mark_node;
14742     }
14743
14744   TREE_TYPE (node) = void_type_node;
14745   TREE_SIDE_EFFECTS (node) = 1;
14746   CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
14747   return node;
14748 }
14749
14750 /* 14.6 Labeled Statements */
14751
14752 /* Action taken when a labeled statement is parsed. a new
14753    LABELED_BLOCK_EXPR is created. No statement is attached to the
14754    label, yet.  LABEL can be NULL_TREE for artificially-generated blocks. */
14755
14756 static tree
14757 build_labeled_block (int location, tree label)
14758 {
14759   tree label_name ;
14760   tree label_decl, node;
14761   if (label == NULL_TREE || label == continue_identifier_node)
14762     label_name = label;
14763   else
14764     {
14765       label_name = merge_qualified_name (label_id, label);
14766       /* Issue an error if we try to reuse a label that was previously
14767          declared */
14768       if (IDENTIFIER_LOCAL_VALUE (label_name))
14769         {
14770           EXPR_WFL_LINECOL (wfl_operator) = location;
14771           parse_error_context (wfl_operator,
14772             "Declaration of `%s' shadows a previous label declaration",
14773                                IDENTIFIER_POINTER (label));
14774           EXPR_WFL_LINECOL (wfl_operator) =
14775             EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
14776           parse_error_context (wfl_operator,
14777             "This is the location of the previous declaration of label `%s'",
14778                                IDENTIFIER_POINTER (label));
14779           java_error_count--;
14780         }
14781     }
14782
14783   label_decl = create_label_decl (label_name);
14784   node = build (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
14785   EXPR_WFL_LINECOL (node) = location;
14786   TREE_SIDE_EFFECTS (node) = 1;
14787   return node;
14788 }
14789
14790 /* A labeled statement LBE is attached a statement.  */
14791
14792 static tree
14793 finish_labeled_statement (tree lbe, /* Labeled block expr */
14794                           tree statement)
14795 {
14796   /* In anyways, tie the loop to its statement */
14797   LABELED_BLOCK_BODY (lbe) = statement;
14798   pop_labeled_block ();
14799   POP_LABELED_BLOCK ();
14800   return lbe;
14801 }
14802
14803 /* 14.10, 14.11, 14.12 Loop Statements */
14804
14805 /* Create an empty LOOP_EXPR and make it the last in the nested loop
14806    list. */
14807
14808 static tree
14809 build_new_loop (tree loop_body)
14810 {
14811   tree loop =  build (LOOP_EXPR, NULL_TREE, loop_body);
14812   TREE_SIDE_EFFECTS (loop) = 1;
14813   PUSH_LOOP (loop);
14814   return loop;
14815 }
14816
14817 /* Create a loop body according to the following structure:
14818      COMPOUND_EXPR
14819        COMPOUND_EXPR            (loop main body)
14820          EXIT_EXPR              (this order is for while/for loops.
14821          LABELED_BLOCK_EXPR      the order is reversed for do loops)
14822            LABEL_DECL           (a continue occurring here branches at the
14823            BODY                  end of this labeled block)
14824        INCREMENT                (if any)
14825
14826   REVERSED, if nonzero, tells that the loop condition expr comes
14827   after the body, like in the do-while loop.
14828
14829   To obtain a loop, the loop body structure described above is
14830   encapsulated within a LOOP_EXPR surrounded by a LABELED_BLOCK_EXPR:
14831
14832    LABELED_BLOCK_EXPR
14833      LABEL_DECL                   (use this label to exit the loop)
14834      LOOP_EXPR
14835        <structure described above> */
14836
14837 static tree
14838 build_loop_body (int location, tree condition, int reversed)
14839 {
14840   tree first, second, body;
14841
14842   condition = build (EXIT_EXPR, NULL_TREE, condition); /* Force walk */
14843   EXPR_WFL_LINECOL (condition) = location; /* For accurate error report */
14844   condition = build_debugable_stmt (location, condition);
14845   TREE_SIDE_EFFECTS (condition) = 1;
14846
14847   body = build_labeled_block (0, continue_identifier_node);
14848   first = (reversed ? body : condition);
14849   second = (reversed ? condition : body);
14850   return
14851     build (COMPOUND_EXPR, NULL_TREE,
14852            build (COMPOUND_EXPR, NULL_TREE, first, second),
14853                   build_java_empty_stmt ());
14854 }
14855
14856 /* Install CONDITION (if any) and loop BODY (using REVERSED to tell
14857    their order) on the current loop. Unlink the current loop from the
14858    loop list.  */
14859
14860 static tree
14861 finish_loop_body (int location, tree condition, tree body, int reversed)
14862 {
14863   tree to_return = ctxp->current_loop;
14864   tree loop_body = LOOP_EXPR_BODY (to_return);
14865   if (condition)
14866     {
14867       tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
14868       /* We wrapped the EXIT_EXPR around a WFL so we can debug it.
14869          The real EXIT_EXPR is one operand further. */
14870       EXPR_WFL_LINECOL (cnode) = location;
14871       /* This one is for accurate error reports */
14872       EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
14873       TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
14874     }
14875   LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
14876   POP_LOOP ();
14877   return to_return;
14878 }
14879
14880 /* Tailored version of finish_loop_body for FOR loops, when FOR
14881    loops feature the condition part */
14882
14883 static tree
14884 finish_for_loop (int location, tree condition, tree update, tree body)
14885 {
14886   /* Put the condition and the loop body in place */
14887   tree loop = finish_loop_body (location, condition, body, 0);
14888   /* LOOP is the current loop which has been now popped of the loop
14889      stack.  Mark the update block as reachable and install it.  We do
14890      this because the (current interpretation of the) JLS requires
14891      that the update expression be considered reachable even if the
14892      for loop's body doesn't complete normally.  */
14893   if (update != NULL_TREE && !IS_EMPTY_STMT (update))
14894     {
14895       tree up2 = update;
14896       if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
14897         up2 = EXPR_WFL_NODE (up2);
14898       /* It is possible for the update expression to be an
14899          EXPR_WFL_NODE wrapping nothing.  */
14900       if (up2 != NULL_TREE && !IS_EMPTY_STMT (up2))
14901         {
14902           /* Try to detect constraint violations.  These would be
14903              programming errors somewhere.  */
14904           if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
14905               || TREE_CODE (up2) == LOOP_EXPR)
14906             abort ();
14907           SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
14908         }
14909     }
14910   LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
14911   return loop;
14912 }
14913
14914 /* Try to find the loop a block might be related to. This comprises
14915    the case where the LOOP_EXPR is found as the second operand of a
14916    COMPOUND_EXPR, because the loop happens to have an initialization
14917    part, then expressed as the first operand of the COMPOUND_EXPR. If
14918    the search finds something, 1 is returned. Otherwise, 0 is
14919    returned. The search is assumed to start from a
14920    LABELED_BLOCK_EXPR's block.  */
14921
14922 static tree
14923 search_loop (tree statement)
14924 {
14925   if (TREE_CODE (statement) == LOOP_EXPR)
14926     return statement;
14927
14928   if (TREE_CODE (statement) == BLOCK)
14929     statement = BLOCK_SUBBLOCKS (statement);
14930   else
14931     return NULL_TREE;
14932
14933   if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
14934     while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
14935       statement = TREE_OPERAND (statement, 1);
14936
14937   return (TREE_CODE (statement) == LOOP_EXPR
14938           && FOR_LOOP_P (statement) ? statement : NULL_TREE);
14939 }
14940
14941 /* Return 1 if LOOP can be found in the labeled block BLOCK. 0 is
14942    returned otherwise.  */
14943
14944 static int
14945 labeled_block_contains_loop_p (tree block, tree loop)
14946 {
14947   if (!block)
14948     return 0;
14949
14950   if (LABELED_BLOCK_BODY (block) == loop)
14951     return 1;
14952
14953   if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
14954     return 1;
14955
14956   return 0;
14957 }
14958
14959 /* If the loop isn't surrounded by a labeled statement, create one and
14960    insert LOOP as its body.  */
14961
14962 static tree
14963 patch_loop_statement (tree loop)
14964 {
14965   tree loop_label;
14966
14967   TREE_TYPE (loop) = void_type_node;
14968   if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
14969     return loop;
14970
14971   loop_label = build_labeled_block (0, NULL_TREE);
14972   /* LOOP is an EXPR node, so it should have a valid EXPR_WFL_LINECOL
14973      that LOOP_LABEL could enquire about, for a better accuracy. FIXME */
14974   LABELED_BLOCK_BODY (loop_label) = loop;
14975   PUSH_LABELED_BLOCK (loop_label);
14976   return loop_label;
14977 }
14978
14979 /* 14.13, 14.14: break and continue Statements */
14980
14981 /* Build a break or a continue statement. a null NAME indicates an
14982    unlabeled break/continue statement.  */
14983
14984 static tree
14985 build_bc_statement (int location, int is_break, tree name)
14986 {
14987   tree break_continue, label_block_expr = NULL_TREE;
14988
14989   if (name)
14990     {
14991       if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
14992             (merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
14993         /* Null means that we don't have a target for this named
14994            break/continue. In this case, we make the target to be the
14995            label name, so that the error can be reported accurately in
14996            patch_bc_statement. */
14997         label_block_expr = EXPR_WFL_NODE (name);
14998     }
14999   /* Unlabeled break/continue will be handled during the
15000      break/continue patch operation */
15001   break_continue
15002     = build (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr, NULL_TREE);
15003
15004   IS_BREAK_STMT_P (break_continue) = is_break;
15005   TREE_SIDE_EFFECTS (break_continue) = 1;
15006   EXPR_WFL_LINECOL (break_continue) = location;
15007   break_continue = build_debugable_stmt (location, break_continue);
15008   return break_continue;
15009 }
15010
15011 /* Verification of a break/continue statement. */
15012
15013 static tree
15014 patch_bc_statement (tree node)
15015 {
15016   tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
15017   tree labeled_block = ctxp->current_labeled_block;
15018   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15019
15020   /* Having an identifier here means that the target is unknown. */
15021   if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
15022     {
15023       parse_error_context (wfl_operator, "No label definition found for `%s'",
15024                            IDENTIFIER_POINTER (bc_label));
15025       return error_mark_node;
15026     }
15027   if (! IS_BREAK_STMT_P (node))
15028     {
15029       /* It's a continue statement. */
15030       for (;; labeled_block = TREE_CHAIN (labeled_block))
15031         {
15032           if (labeled_block == NULL_TREE)
15033             {
15034               if (bc_label == NULL_TREE)
15035                 parse_error_context (wfl_operator,
15036                                      "`continue' must be in loop");
15037               else
15038                 parse_error_context
15039                   (wfl_operator, "continue label `%s' does not name a loop",
15040                    IDENTIFIER_POINTER (bc_label));
15041               return error_mark_node;
15042             }
15043           if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
15044                == continue_identifier_node)
15045               && (bc_label == NULL_TREE
15046                   || TREE_CHAIN (labeled_block) == bc_label))
15047             {
15048               bc_label = labeled_block;
15049               break;
15050             }
15051         }
15052     }
15053   else if (!bc_label)
15054     {
15055       for (;; labeled_block = TREE_CHAIN (labeled_block))
15056         {
15057           if (labeled_block == NULL_TREE)
15058             {
15059               parse_error_context (wfl_operator,
15060                                      "`break' must be in loop or switch");
15061               return error_mark_node;
15062             }
15063           target_stmt = LABELED_BLOCK_BODY (labeled_block);
15064           if (TREE_CODE (target_stmt) == SWITCH_EXPR
15065               || search_loop (target_stmt))
15066             {
15067               bc_label = labeled_block;
15068               break;
15069             }
15070         }
15071     }
15072
15073   EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
15074   CAN_COMPLETE_NORMALLY (bc_label) = 1;
15075
15076   /* Our break/continue don't return values. */
15077   TREE_TYPE (node) = void_type_node;
15078   /* Encapsulate the break within a compound statement so that it's
15079      expanded all the times by expand_expr (and not clobbered
15080      sometimes, like after a if statement) */
15081   node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
15082   TREE_SIDE_EFFECTS (node) = 1;
15083   return node;
15084 }
15085
15086 /* Process the exit expression belonging to a loop. Its type must be
15087    boolean.  */
15088
15089 static tree
15090 patch_exit_expr (tree node)
15091 {
15092   tree expression = TREE_OPERAND (node, 0);
15093   TREE_TYPE (node) = error_mark_node;
15094   EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15095
15096   /* The type of expression must be boolean */
15097   if (TREE_TYPE (expression) != boolean_type_node)
15098     {
15099       parse_error_context
15100         (wfl_operator,
15101     "Incompatible type for loop conditional. Can't convert `%s' to `boolean'",
15102          lang_printable_name (TREE_TYPE (expression), 0));
15103       return error_mark_node;
15104     }
15105   /* Now we know things are allright, invert the condition, fold and
15106      return */
15107   TREE_OPERAND (node, 0) =
15108     fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
15109
15110   if (! integer_zerop (TREE_OPERAND (node, 0))
15111       && ctxp->current_loop != NULL_TREE
15112       && TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
15113     CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
15114   if (! integer_onep (TREE_OPERAND (node, 0)))
15115     CAN_COMPLETE_NORMALLY (node) = 1;
15116
15117
15118   TREE_TYPE (node) = void_type_node;
15119   return node;
15120 }
15121
15122 /* 14.9 Switch statement */
15123
15124 static tree
15125 patch_switch_statement (tree node)
15126 {
15127   tree se = TREE_OPERAND (node, 0), se_type;
15128   tree save, iter;
15129
15130   /* Complete the switch expression */
15131   se = TREE_OPERAND (node, 0) = java_complete_tree (se);
15132   se_type = TREE_TYPE (se);
15133   /* The type of the switch expression must be char, byte, short or
15134      int */
15135   if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
15136     {
15137       EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
15138       parse_error_context (wfl_operator,
15139           "Incompatible type for `switch'. Can't convert `%s' to `int'",
15140                            lang_printable_name (se_type, 0));
15141       /* This is what java_complete_tree will check */
15142       TREE_OPERAND (node, 0) = error_mark_node;
15143       return error_mark_node;
15144     }
15145
15146   /* Save and restore the outer case label list.  */
15147   save = case_label_list;
15148   case_label_list = NULL_TREE;
15149
15150   TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
15151
15152   /* See if we've found a duplicate label.  We can't leave this until
15153      code generation, because in `--syntax-only' and `-C' modes we
15154      don't do ordinary code generation.  */
15155   for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
15156     {
15157       HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
15158       tree subiter;
15159       for (subiter = TREE_CHAIN (iter);
15160            subiter != NULL_TREE;
15161            subiter = TREE_CHAIN (subiter))
15162         {
15163           HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
15164           if (val == subval)
15165             {
15166               EXPR_WFL_LINECOL (wfl_operator)
15167                 = EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
15168               /* The case_label_list is in reverse order, so print the
15169                  outer label first.  */
15170               parse_error_context (wfl_operator, "duplicate case label: `"
15171                                    HOST_WIDE_INT_PRINT_DEC "'", subval);
15172               EXPR_WFL_LINECOL (wfl_operator)
15173                 = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
15174               parse_error_context (wfl_operator, "original label is here");
15175
15176               break;
15177             }
15178         }
15179     }
15180
15181   case_label_list = save;
15182
15183   /* Ready to return */
15184   if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
15185     {
15186       TREE_TYPE (node) = error_mark_node;
15187       return error_mark_node;
15188     }
15189   TREE_TYPE (node) = void_type_node;
15190   TREE_SIDE_EFFECTS (node) = 1;
15191   CAN_COMPLETE_NORMALLY (node)
15192     = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
15193       || ! SWITCH_HAS_DEFAULT (node);
15194   return node;
15195 }
15196
15197 /* Assertions.  */
15198
15199 /* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
15200    might be NULL_TREE.  */
15201 static tree
15202 build_assertion (int location, tree condition, tree value)
15203 {
15204   tree node;
15205   tree klass = GET_CPC ();
15206
15207   if (! enable_assertions (klass))
15208     {
15209       condition = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15210                          boolean_false_node, condition);
15211       if (value == NULL_TREE)
15212         value = build_java_empty_stmt ();
15213       return build_if_else_statement (location, condition,
15214                                       value, NULL_TREE);
15215     }
15216
15217   if (! CLASS_USES_ASSERTIONS (klass))
15218     {
15219       tree field, classdollar, id, call;
15220       tree class_type = TREE_TYPE (klass);
15221
15222       field = add_field (class_type,
15223                          get_identifier ("$assertionsDisabled"),
15224                          boolean_type_node,
15225                          ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
15226       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
15227       FIELD_SYNTHETIC (field) = 1;
15228
15229       classdollar = build_incomplete_class_ref (location, class_type);
15230
15231       /* Call CLASS.desiredAssertionStatus().  */
15232       id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
15233       call = build (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
15234       call = make_qualified_primary (classdollar, call, location);
15235       TREE_SIDE_EFFECTS (call) = 1;
15236
15237       /* Invert to obtain !CLASS.desiredAssertionStatus().  This may
15238          seem odd, but we do it to generate code identical to that of
15239          the JDK.  */
15240       call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
15241       TREE_SIDE_EFFECTS (call) = 1;
15242       DECL_INITIAL (field) = call;
15243
15244       /* Record the initializer in the initializer statement list.  */
15245       call = build (MODIFY_EXPR, NULL_TREE, field, call);
15246       TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
15247       SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
15248       MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
15249
15250       CLASS_USES_ASSERTIONS (klass) = 1;
15251     }
15252
15253   if (value != NULL_TREE)
15254     value = tree_cons (NULL_TREE, value, NULL_TREE);
15255
15256   node = build_wfl_node (get_identifier ("java"));
15257   node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
15258                               location);
15259   node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
15260                               location);
15261
15262   node = build (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
15263   TREE_SIDE_EFFECTS (node) = 1;
15264   /* It is too early to use BUILD_THROW.  */
15265   node = build1 (THROW_EXPR, NULL_TREE, node);
15266   TREE_SIDE_EFFECTS (node) = 1;
15267
15268   /* We invert the condition; if we just put NODE as the `else' part
15269      then we generate weird-looking bytecode.  */
15270   condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
15271   /* Check $assertionsDisabled.  */
15272   condition
15273     = build (TRUTH_ANDIF_EXPR, NULL_TREE,
15274              build1 (TRUTH_NOT_EXPR, NULL_TREE,
15275                      build_wfl_node (get_identifier ("$assertionsDisabled"))),
15276              condition);
15277   node = build_if_else_statement (location, condition, node, NULL_TREE);
15278   return node;
15279 }
15280
15281 /* 14.18 The try/catch statements */
15282
15283 /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause
15284    catches TYPE and executes CATCH_STMTS.  */
15285
15286 static tree
15287 encapsulate_with_try_catch (int location, tree type_or_name, tree try_stmts,
15288                             tree catch_stmts)
15289 {
15290   tree try_block, catch_clause_param, catch_block, catch;
15291
15292   /* First build a try block */
15293   try_block = build_expr_block (try_stmts, NULL_TREE);
15294
15295   /* Build a catch block: we need a catch clause parameter */
15296   if (TREE_CODE (type_or_name) == EXPR_WITH_FILE_LOCATION)
15297     {
15298       tree catch_type = obtain_incomplete_type (type_or_name);
15299       jdep *dep;
15300       catch_clause_param = build_decl (VAR_DECL, wpv_id, catch_type);
15301       register_incomplete_type (JDEP_VARIABLE, type_or_name,
15302                                 catch_clause_param, catch_type);
15303       dep = CLASSD_LAST (ctxp->classd_list);
15304       JDEP_GET_PATCH (dep) = &TREE_TYPE (catch_clause_param);
15305     }
15306   else
15307     catch_clause_param = build_decl (VAR_DECL, wpv_id,
15308                                      build_pointer_type (type_or_name));
15309
15310   /* And a block */
15311   catch_block = build_expr_block (NULL_TREE, catch_clause_param);
15312
15313   /* Initialize the variable and store in the block */
15314   catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param,
15315                  build (JAVA_EXC_OBJ_EXPR, ptr_type_node));
15316   add_stmt_to_block (catch_block, NULL_TREE, catch);
15317
15318   /* Add the catch statements */
15319   add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
15320
15321   /* Now we can build a JAVA_CATCH_EXPR */
15322   catch_block = build1 (JAVA_CATCH_EXPR, NULL_TREE, catch_block);
15323
15324   return build_try_statement (location, try_block, catch_block);
15325 }
15326
15327 static tree
15328 build_try_statement (int location, tree try_block, tree catches)
15329 {
15330   tree node = build (TRY_EXPR, NULL_TREE, try_block, catches);
15331   EXPR_WFL_LINECOL (node) = location;
15332   return node;
15333 }
15334
15335 static tree
15336 build_try_finally_statement (int location, tree try_block, tree finally)
15337 {
15338   tree node = build (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
15339   EXPR_WFL_LINECOL (node) = location;
15340   return node;
15341 }
15342
15343 static tree
15344 patch_try_statement (tree node)
15345 {
15346   int error_found = 0;
15347   tree try = TREE_OPERAND (node, 0);
15348   /* Exception handlers are considered in left to right order */
15349   tree catch = nreverse (TREE_OPERAND (node, 1));
15350   tree current, caught_type_list = NULL_TREE;
15351
15352   /* Check catch clauses, if any. Every time we find an error, we try
15353      to process the next catch clause. We process the catch clause before
15354      the try block so that when processing the try block we can check thrown
15355      exceptions againts the caught type list. */
15356   for (current = catch; current; current = TREE_CHAIN (current))
15357     {
15358       tree carg_decl, carg_type;
15359       tree sub_current, catch_block, catch_clause;
15360       int unreachable;
15361
15362       /* At this point, the structure of the catch clause is
15363            JAVA_CATCH_EXPR              (catch node)
15364              BLOCK              (with the decl of the parameter)
15365                COMPOUND_EXPR
15366                  MODIFY_EXPR   (assignment of the catch parameter)
15367                  BLOCK          (catch clause block)
15368        */
15369       catch_clause = TREE_OPERAND (current, 0);
15370       carg_decl = BLOCK_EXPR_DECLS (catch_clause);
15371       carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
15372
15373       /* Catch clauses can't have more than one parameter declared,
15374          but it's already enforced by the grammar. Make sure that the
15375          only parameter of the clause statement in of class Throwable
15376          or a subclass of Throwable, but that was done earlier. The
15377          catch clause parameter type has also been resolved. */
15378
15379       /* Just make sure that the catch clause parameter type inherits
15380          from java.lang.Throwable */
15381       if (!inherits_from_p (carg_type, throwable_type_node))
15382         {
15383           EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15384           parse_error_context (wfl_operator,
15385                                "Can't catch class `%s'. Catch clause parameter type must be a subclass of class `java.lang.Throwable'",
15386                                lang_printable_name (carg_type, 0));
15387           error_found = 1;
15388           continue;
15389         }
15390
15391       /* Partial check for unreachable catch statement: The catch
15392          clause is reachable iff is no earlier catch block A in
15393          the try statement such that the type of the catch
15394          clause's parameter is the same as or a subclass of the
15395          type of A's parameter */
15396       unreachable = 0;
15397       for (sub_current = catch;
15398            sub_current != current; sub_current = TREE_CHAIN (sub_current))
15399         {
15400           tree sub_catch_clause, decl;
15401           sub_catch_clause = TREE_OPERAND (sub_current, 0);
15402           decl = BLOCK_EXPR_DECLS (sub_catch_clause);
15403
15404           if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
15405             {
15406               EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
15407               parse_error_context
15408                 (wfl_operator,
15409                  "`catch' not reached because of the catch clause at line %d",
15410                  EXPR_WFL_LINENO (sub_current));
15411               unreachable = error_found = 1;
15412               break;
15413             }
15414         }
15415       /* Complete the catch clause block */
15416       catch_block = java_complete_tree (TREE_OPERAND (current, 0));
15417       if (catch_block == error_mark_node)
15418         {
15419           error_found = 1;
15420           continue;
15421         }
15422       if (CAN_COMPLETE_NORMALLY (catch_block))
15423         CAN_COMPLETE_NORMALLY (node) = 1;
15424       TREE_OPERAND (current, 0) = catch_block;
15425
15426       if (unreachable)
15427         continue;
15428
15429       /* Things to do here: the exception must be thrown */
15430
15431       /* Link this type to the caught type list */
15432       caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
15433     }
15434
15435   PUSH_EXCEPTIONS (caught_type_list);
15436   if ((try = java_complete_tree (try)) == error_mark_node)
15437     error_found = 1;
15438   if (CAN_COMPLETE_NORMALLY (try))
15439     CAN_COMPLETE_NORMALLY (node) = 1;
15440   POP_EXCEPTIONS ();
15441
15442   /* Verification ends here */
15443   if (error_found)
15444     return error_mark_node;
15445
15446   TREE_OPERAND (node, 0) = try;
15447   TREE_OPERAND (node, 1) = catch;
15448   TREE_TYPE (node) = void_type_node;
15449   return node;
15450 }
15451
15452 /* 14.17 The synchronized Statement */
15453
15454 static tree
15455 patch_synchronized_statement (tree node, tree wfl_op1)
15456 {
15457   tree expr = java_complete_tree (TREE_OPERAND (node, 0));
15458   tree block = TREE_OPERAND (node, 1);
15459
15460   tree tmp, enter, exit, expr_decl, assignment;
15461
15462   if (expr == error_mark_node)
15463     {
15464       block = java_complete_tree (block);
15465       return expr;
15466     }
15467
15468   /* We might be trying to synchronize on a STRING_CST */
15469   if ((tmp = patch_string (expr)))
15470     expr = tmp;
15471
15472   /* The TYPE of expr must be a reference type */
15473   if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
15474     {
15475       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15476       parse_error_context (wfl_operator, "Incompatible type for `synchronized'. Can't convert `%s' to `java.lang.Object'",
15477                            lang_printable_name (TREE_TYPE (expr), 0));
15478       return error_mark_node;
15479     }
15480
15481   if (flag_emit_xref)
15482     {
15483       TREE_OPERAND (node, 0) = expr;
15484       TREE_OPERAND (node, 1) = java_complete_tree (block);
15485       CAN_COMPLETE_NORMALLY (node) = 1;
15486       return node;
15487     }
15488
15489   /* Generate a try-finally for the synchronized statement, except
15490      that the handler that catches all throw exception calls
15491      _Jv_MonitorExit and then rethrow the exception.
15492      The synchronized statement is then implemented as:
15493      TRY
15494        {
15495          _Jv_MonitorEnter (expression)
15496          synchronized_block
15497          _Jv_MonitorExit (expression)
15498        }
15499      CATCH_ALL
15500        {
15501          e = _Jv_exception_info ();
15502          _Jv_MonitorExit (expression)
15503          Throw (e);
15504        } */
15505
15506   expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
15507   BUILD_MONITOR_ENTER (enter, expr_decl);
15508   BUILD_MONITOR_EXIT (exit, expr_decl);
15509   CAN_COMPLETE_NORMALLY (enter) = 1;
15510   CAN_COMPLETE_NORMALLY (exit) = 1;
15511   assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
15512   TREE_SIDE_EFFECTS (assignment) = 1;
15513   node = build (COMPOUND_EXPR, NULL_TREE,
15514                 build (COMPOUND_EXPR, NULL_TREE, assignment, enter),
15515                 build (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
15516   node = build_expr_block (node, expr_decl);
15517
15518   return java_complete_tree (node);
15519 }
15520
15521 /* 14.16 The throw Statement */
15522
15523 static tree
15524 patch_throw_statement (tree node, tree wfl_op1)
15525 {
15526   tree expr = TREE_OPERAND (node, 0);
15527   tree type = TREE_TYPE (expr);
15528   int unchecked_ok = 0, tryblock_throws_ok = 0;
15529
15530   /* Thrown expression must be assignable to java.lang.Throwable */
15531   if (!try_reference_assignconv (throwable_type_node, expr))
15532     {
15533       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15534       parse_error_context (wfl_operator,
15535     "Can't throw `%s'; it must be a subclass of class `java.lang.Throwable'",
15536                            lang_printable_name (type, 0));
15537       /* If the thrown expression was a reference, we further the
15538          compile-time check. */
15539       if (!JREFERENCE_TYPE_P (type))
15540         return error_mark_node;
15541     }
15542
15543   /* At least one of the following must be true */
15544
15545   /* The type of the throw expression is a not checked exception,
15546      i.e. is a unchecked expression. */
15547   unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
15548
15549   SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15550   /* An instance can't throw a checked exception unless that exception
15551      is explicitly declared in the `throws' clause of each
15552      constructor. This doesn't apply to anonymous classes, since they
15553      don't have declared constructors. */
15554   if (!unchecked_ok
15555       && DECL_INSTINIT_P (current_function_decl)
15556       && !ANONYMOUS_CLASS_P (current_class))
15557     {
15558       tree current;
15559       for (current = TYPE_METHODS (current_class); current;
15560            current = TREE_CHAIN (current))
15561         if (DECL_CONSTRUCTOR_P (current)
15562             && !check_thrown_exceptions_do (TREE_TYPE (expr)))
15563           {
15564             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)",
15565                                  lang_printable_name (TREE_TYPE (expr), 0));
15566             return error_mark_node;
15567           }
15568     }
15569
15570   /* Throw is contained in a try statement and at least one catch
15571      clause can receive the thrown expression or the current method is
15572      declared to throw such an exception. Or, the throw statement is
15573      contained in a method or constructor declaration and the type of
15574      the Expression is assignable to at least one type listed in the
15575      throws clause the declaration. */
15576   if (!unchecked_ok)
15577     tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
15578   if (!(unchecked_ok || tryblock_throws_ok))
15579     {
15580       /* If there is a surrounding try block that has no matching
15581          clatch clause, report it first. A surrounding try block exits
15582          only if there is something after the list of checked
15583          exception thrown by the current function (if any). */
15584       if (IN_TRY_BLOCK_P ())
15585         parse_error_context (wfl_operator, "Checked exception `%s' can't be caught by any of the catch clause(s) of the surrounding `try' block",
15586                              lang_printable_name (type, 0));
15587       /* If we have no surrounding try statement and the method doesn't have
15588          any throws, report it now. FIXME */
15589
15590       /* We report that the exception can't be throw from a try block
15591          in all circumstances but when the `throw' is inside a static
15592          block. */
15593       else if (!EXCEPTIONS_P (currently_caught_type_list)
15594                && !tryblock_throws_ok)
15595         {
15596           if (DECL_CLINIT_P (current_function_decl))
15597             parse_error_context (wfl_operator,
15598                    "Checked exception `%s' can't be thrown in initializer",
15599                                  lang_printable_name (type, 0));
15600           else
15601             parse_error_context (wfl_operator,
15602                    "Checked exception `%s' isn't thrown from a `try' block",
15603                                  lang_printable_name (type, 0));
15604         }
15605       /* Otherwise, the current method doesn't have the appropriate
15606          throws declaration */
15607       else
15608         parse_error_context (wfl_operator, "Checked exception `%s' doesn't match any of current method's `throws' declaration(s)",
15609                              lang_printable_name (type, 0));
15610       return error_mark_node;
15611     }
15612
15613   if (! flag_emit_class_files && ! flag_emit_xref)
15614     BUILD_THROW (node, expr);
15615
15616   /* If doing xrefs, keep the location where the `throw' was seen. */
15617   if (flag_emit_xref)
15618     EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
15619   return node;
15620 }
15621
15622 /* Check that exception said to be thrown by method DECL can be
15623    effectively caught from where DECL is invoked.  THIS_EXPR is the
15624    expression that computes `this' for the method call.  */
15625 static void
15626 check_thrown_exceptions (int location, tree decl, tree this_expr)
15627 {
15628   tree throws;
15629   int is_array_call = 0;
15630
15631   /* Skip check within generated methods, such as access$<n>.  */
15632   if (OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
15633     return;
15634
15635   if (this_expr != NULL_TREE
15636       && TREE_CODE (TREE_TYPE (this_expr)) == POINTER_TYPE
15637       && TYPE_ARRAY_P (TREE_TYPE (TREE_TYPE (this_expr))))
15638     is_array_call = 1;
15639
15640   /* For all the unchecked exceptions thrown by DECL.  */
15641   for (throws = DECL_FUNCTION_THROWS (decl); throws;
15642        throws = TREE_CHAIN (throws))
15643     if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
15644       {
15645         /* Suppress errors about cloning arrays.  */
15646         if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
15647           continue;
15648
15649         EXPR_WFL_LINECOL (wfl_operator) = location;
15650         if (DECL_FINIT_P (current_function_decl))
15651           parse_error_context
15652             (wfl_operator, "Exception `%s' can't be thrown in initializer",
15653              lang_printable_name (TREE_VALUE (throws), 0));
15654         else
15655           {
15656             parse_error_context
15657               (wfl_operator, "Exception `%s' must be caught, or it must be declared in the `throws' clause of `%s'",
15658                lang_printable_name (TREE_VALUE (throws), 0),
15659                (DECL_INIT_P (current_function_decl) ?
15660                 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
15661                 IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
15662           }
15663       }
15664 }
15665
15666 /* Return 1 if checked EXCEPTION is caught at the current nesting level of
15667    try-catch blocks, OR is listed in the `throws' clause of the
15668    current method.  */
15669
15670 static int
15671 check_thrown_exceptions_do (tree exception)
15672 {
15673   tree list = currently_caught_type_list;
15674   resolve_and_layout (exception, NULL_TREE);
15675   /* First, all the nested try-catch-finally at that stage. The
15676      last element contains `throws' clause exceptions, if any. */
15677   if (IS_UNCHECKED_EXCEPTION_P (exception))
15678     return 1;
15679   while (list)
15680     {
15681       tree caught;
15682       for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
15683         if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
15684           return 1;
15685       list = TREE_CHAIN (list);
15686     }
15687   return 0;
15688 }
15689
15690 static void
15691 purge_unchecked_exceptions (tree mdecl)
15692 {
15693   tree throws = DECL_FUNCTION_THROWS (mdecl);
15694   tree new = NULL_TREE;
15695
15696   while (throws)
15697     {
15698       tree next = TREE_CHAIN (throws);
15699       if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
15700         {
15701           TREE_CHAIN (throws) = new;
15702           new = throws;
15703         }
15704       throws = next;
15705     }
15706   /* List is inverted here, but it doesn't matter */
15707   DECL_FUNCTION_THROWS (mdecl) = new;
15708 }
15709
15710 /* This function goes over all of CLASS_TYPE ctors and checks whether
15711    each of them features at least one unchecked exception in its
15712    `throws' clause. If it's the case, it returns `true', `false'
15713    otherwise.  */
15714
15715 static bool
15716 ctors_unchecked_throws_clause_p (tree class_type)
15717 {
15718   tree current;
15719
15720   for (current = TYPE_METHODS (class_type); current;
15721        current = TREE_CHAIN (current))
15722     {
15723       bool ctu = false; /* Ctor Throws Unchecked */
15724       if (DECL_CONSTRUCTOR_P (current))
15725         {
15726           tree throws;
15727           for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
15728                throws = TREE_CHAIN (throws))
15729             if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
15730               ctu = true;
15731         }
15732       /* We return false as we found one ctor that is unfit. */
15733       if (!ctu && DECL_CONSTRUCTOR_P (current))
15734         return false;
15735     }
15736   /* All ctors feature at least one unchecked exception in their
15737      `throws' clause. */
15738   return true;
15739 }
15740
15741 /* 15.24 Conditional Operator ?: */
15742
15743 static tree
15744 patch_conditional_expr (tree node, tree wfl_cond, tree wfl_op1)
15745 {
15746   tree cond = TREE_OPERAND (node, 0);
15747   tree op1 = TREE_OPERAND (node, 1);
15748   tree op2 = TREE_OPERAND (node, 2);
15749   tree resulting_type = NULL_TREE;
15750   tree t1, t2, patched;
15751   int error_found = 0;
15752
15753   /* Operands of ?: might be StringBuffers crafted as a result of a
15754      string concatenation. Obtain a descent operand here.  */
15755   if ((patched = patch_string (op1)))
15756     TREE_OPERAND (node, 1) = op1 = patched;
15757   if ((patched = patch_string (op2)))
15758     TREE_OPERAND (node, 2) = op2 = patched;
15759
15760   t1 = TREE_TYPE (op1);
15761   t2 = TREE_TYPE (op2);
15762
15763   /* The first expression must be a boolean */
15764   if (TREE_TYPE (cond) != boolean_type_node)
15765     {
15766       SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
15767       parse_error_context (wfl_operator,
15768                "Incompatible type for `?:'. Can't convert `%s' to `boolean'",
15769                            lang_printable_name (TREE_TYPE (cond), 0));
15770       error_found = 1;
15771     }
15772
15773   /* Second and third can be numeric, boolean (i.e. primitive),
15774      references or null. Anything else results in an error */
15775   if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
15776         || ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
15777             && (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
15778         || (t1 == boolean_type_node && t2 == boolean_type_node)))
15779     error_found = 1;
15780
15781   /* Determine the type of the conditional expression. Same types are
15782      easy to deal with */
15783   else if (t1 == t2)
15784     resulting_type = t1;
15785
15786   /* There are different rules for numeric types */
15787   else if (JNUMERIC_TYPE_P (t1))
15788     {
15789       /* if byte/short found, the resulting type is short */
15790       if ((t1 == byte_type_node && t2 == short_type_node)
15791           || (t1 == short_type_node && t2 == byte_type_node))
15792         resulting_type = short_type_node;
15793
15794       /* If t1 is a constant int and t2 is of type byte, short or char
15795          and t1's value fits in t2, then the resulting type is t2 */
15796       else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
15797           && JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
15798         resulting_type = t2;
15799
15800       /* If t2 is a constant int and t1 is of type byte, short or char
15801          and t2's value fits in t1, then the resulting type is t1 */
15802       else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
15803           && JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
15804         resulting_type = t1;
15805
15806       /* Otherwise, binary numeric promotion is applied and the
15807          resulting type is the promoted type of operand 1 and 2 */
15808       else
15809         resulting_type = binary_numeric_promotion (t1, t2,
15810                                                    &TREE_OPERAND (node, 1),
15811                                                    &TREE_OPERAND (node, 2));
15812     }
15813
15814   /* Cases of a reference and a null type */
15815   else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
15816     resulting_type = t1;
15817
15818   else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
15819     resulting_type = t2;
15820
15821   /* Last case: different reference types. If a type can be converted
15822      into the other one by assignment conversion, the latter
15823      determines the type of the expression */
15824   else if ((resulting_type = try_reference_assignconv (t1, op2)))
15825     resulting_type = promote_type (t1);
15826
15827   else if ((resulting_type = try_reference_assignconv (t2, op1)))
15828     resulting_type = promote_type (t2);
15829
15830   /* If we don't have any resulting type, we're in trouble */
15831   if (!resulting_type)
15832     {
15833       char *t = xstrdup (lang_printable_name (t1, 0));
15834       SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
15835       parse_error_context (wfl_operator,
15836                  "Incompatible type for `?:'. Can't convert `%s' to `%s'",
15837                            t, lang_printable_name (t2, 0));
15838       free (t);
15839       error_found = 1;
15840     }
15841
15842   if (error_found)
15843     {
15844       TREE_TYPE (node) = error_mark_node;
15845       return error_mark_node;
15846     }
15847
15848   TREE_TYPE (node) = resulting_type;
15849   TREE_SET_CODE (node, COND_EXPR);
15850   CAN_COMPLETE_NORMALLY (node) = 1;
15851   return node;
15852 }
15853
15854 /* Wrap EXPR with code to initialize DECL's class, if appropriate. */
15855
15856 static tree
15857 maybe_build_class_init_for_field (tree decl, tree expr)
15858 {
15859   tree clas = DECL_CONTEXT (decl);
15860   if (flag_emit_class_files || flag_emit_xref)
15861     return expr;
15862
15863   if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
15864       && FIELD_FINAL (decl))
15865     {
15866       tree init = DECL_INITIAL (decl);
15867       if (init != NULL_TREE)
15868         init = fold_constant_for_init (init, decl);
15869       if (init != NULL_TREE && CONSTANT_VALUE_P (init))
15870         return expr;
15871     }
15872
15873   return build_class_init (clas, expr);
15874 }
15875
15876 /* Try to constant fold NODE.
15877    If NODE is not a constant expression, return NULL_EXPR.
15878    CONTEXT is a static final VAR_DECL whose initializer we are folding. */
15879
15880 static tree
15881 fold_constant_for_init (tree node, tree context)
15882 {
15883   tree op0, op1, val;
15884   enum tree_code code = TREE_CODE (node);
15885
15886   switch (code)
15887     {
15888     case INTEGER_CST:
15889       if (node == null_pointer_node)
15890         return NULL_TREE;
15891     case STRING_CST:
15892     case REAL_CST:
15893       return node;
15894
15895     case PLUS_EXPR:
15896     case MINUS_EXPR:
15897     case MULT_EXPR:
15898     case TRUNC_MOD_EXPR:
15899     case RDIV_EXPR:
15900     case LSHIFT_EXPR:
15901     case RSHIFT_EXPR:
15902     case URSHIFT_EXPR:
15903     case BIT_AND_EXPR:
15904     case BIT_XOR_EXPR:
15905     case BIT_IOR_EXPR:
15906     case TRUTH_ANDIF_EXPR:
15907     case TRUTH_ORIF_EXPR:
15908     case EQ_EXPR:
15909     case NE_EXPR:
15910     case GT_EXPR:
15911     case GE_EXPR:
15912     case LT_EXPR:
15913     case LE_EXPR:
15914       op0 = TREE_OPERAND (node, 0);
15915       op1 = TREE_OPERAND (node, 1);
15916       val = fold_constant_for_init (op0, context);
15917       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15918         return NULL_TREE;
15919       TREE_OPERAND (node, 0) = val;
15920       val = fold_constant_for_init (op1, context);
15921       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15922         return NULL_TREE;
15923       TREE_OPERAND (node, 1) = val;
15924       return patch_binop (node, op0, op1);
15925
15926     case UNARY_PLUS_EXPR:
15927     case NEGATE_EXPR:
15928     case TRUTH_NOT_EXPR:
15929     case BIT_NOT_EXPR:
15930     case CONVERT_EXPR:
15931       op0 = TREE_OPERAND (node, 0);
15932       val = fold_constant_for_init (op0, context);
15933       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15934         return NULL_TREE;
15935       TREE_OPERAND (node, 0) = val;
15936       val = patch_unaryop (node, op0);
15937       if (! TREE_CONSTANT (val))
15938         return NULL_TREE;
15939       return val;
15940
15941       break;
15942
15943     case COND_EXPR:
15944       val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
15945       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15946         return NULL_TREE;
15947       TREE_OPERAND (node, 0) = val;
15948       val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
15949       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15950         return NULL_TREE;
15951       TREE_OPERAND (node, 1) = val;
15952       val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
15953       if (val == NULL_TREE || ! TREE_CONSTANT (val))
15954         return NULL_TREE;
15955       TREE_OPERAND (node, 2) = val;
15956       return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
15957         : TREE_OPERAND (node, 2);
15958
15959     case VAR_DECL:
15960     case FIELD_DECL:
15961       if (! FIELD_FINAL (node)
15962           || DECL_INITIAL (node) == NULL_TREE)
15963         return NULL_TREE;
15964       val = DECL_INITIAL (node);
15965       /* Guard against infinite recursion. */
15966       DECL_INITIAL (node) = NULL_TREE;
15967       val = fold_constant_for_init (val, node);
15968       if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
15969         val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
15970       DECL_INITIAL (node) = val;
15971       return val;
15972
15973     case EXPR_WITH_FILE_LOCATION:
15974       /* Compare java_complete_tree and resolve_expression_name. */
15975       if (!EXPR_WFL_NODE (node) /* Or a PRIMARY flag ? */
15976           || TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
15977         {
15978           tree name = EXPR_WFL_NODE (node);
15979           tree decl;
15980           if (PRIMARY_P (node))
15981             return NULL_TREE;
15982           else if (! QUALIFIED_P (name))
15983             {
15984               decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
15985               if (decl == NULL_TREE
15986                   || (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
15987                 return NULL_TREE;
15988               return fold_constant_for_init (decl, decl);
15989             }
15990           else
15991             {
15992               /* Install the proper context for the field resolution.
15993                  The prior context is restored once the name is
15994                  properly qualified. */
15995               tree saved_current_class = current_class;
15996               /* Wait until the USE_COMPONENT_REF re-write.  FIXME. */
15997               current_class = DECL_CONTEXT (context);
15998               qualify_ambiguous_name (node);
15999               current_class = saved_current_class;
16000               if (resolve_field_access (node, &decl, NULL)
16001                   && decl != NULL_TREE)
16002                 return fold_constant_for_init (decl, decl);
16003               return NULL_TREE;
16004             }
16005         }
16006       else
16007         {
16008           op0 = TREE_OPERAND (node, 0);
16009           val = fold_constant_for_init (op0, context);
16010           if (val == NULL_TREE || ! TREE_CONSTANT (val))
16011             return NULL_TREE;
16012           TREE_OPERAND (node, 0) = val;
16013           return val;
16014         }
16015
16016 #ifdef USE_COMPONENT_REF
16017     case IDENTIFIER:
16018     case COMPONENT_REF:
16019       ?;
16020 #endif
16021
16022     default:
16023       return NULL_TREE;
16024     }
16025 }
16026
16027 #ifdef USE_COMPONENT_REF
16028 /* Context is 'T' for TypeName, 'P' for PackageName,
16029    'M' for MethodName, 'E' for ExpressionName, and 'A' for AmbiguousName. */
16030
16031 tree
16032 resolve_simple_name (tree name, int context)
16033 {
16034 }
16035
16036 tree
16037 resolve_qualified_name (tree name, int context)
16038 {
16039 }
16040 #endif
16041
16042 void
16043 init_src_parse (void)
16044 {
16045   /* Sanity check; we've been bit by this before.  */
16046   if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
16047     abort ();
16048 }
16049
16050 \f
16051
16052 /* This section deals with the functions that are called when tables
16053    recording class initialization information are traversed.  */
16054
16055 /* Attach to PTR (a block) the declaration found in ENTRY. */
16056
16057 static int
16058 attach_init_test_initialization_flags (void **entry, void *ptr)
16059 {
16060   tree block = (tree)ptr;
16061   struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
16062
16063   if (block != error_mark_node)
16064     {
16065       TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
16066       BLOCK_EXPR_DECLS (block) = ite->value;
16067     }
16068   return true;
16069 }
16070
16071 /* This function is called for each class that is known definitely
16072    initialized when a given static method was called. This function
16073    augments a compound expression (INFO) storing all assignment to
16074    initialized static class flags if a flag already existed, otherwise
16075    a new one is created.  */
16076
16077 static int
16078 emit_test_initialization (void **entry_p, void *info)
16079 {
16080   tree l = (tree) info;
16081   tree decl, init;
16082   tree key = (tree) *entry_p;
16083   tree *ite;
16084   htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
16085
16086   /* If we haven't found a flag and we're dealing with self registered
16087      with current_function_decl, then don't do anything. Self is
16088      always added as definitely initialized but this information is
16089      valid only if used outside the current function. */
16090   if (current_function_decl == TREE_PURPOSE (l)
16091       && java_treetreehash_find (cf_ht, key) == NULL)
16092     return true;
16093
16094   ite = java_treetreehash_new (cf_ht, key);
16095
16096   /* If we don't have a variable, create one and install it. */
16097   if (*ite == NULL)
16098     {
16099       tree block;
16100
16101       decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
16102       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
16103       LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
16104       DECL_CONTEXT (decl) = current_function_decl;
16105       DECL_INITIAL (decl) = boolean_true_node;
16106       /* Don't emit any symbolic debugging info for this decl.  */
16107       DECL_IGNORED_P (decl) = 1;
16108
16109       /* The trick is to find the right context for it. */
16110       block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
16111       TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
16112       BLOCK_EXPR_DECLS (block) = decl;
16113       *ite = decl;
16114     }
16115   else
16116     decl = *ite;
16117
16118   /* Now simply augment the compound that holds all the assignments
16119      pertaining to this method invocation. */
16120   init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
16121   TREE_SIDE_EFFECTS (init) = 1;
16122   TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
16123   TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
16124
16125   return true;
16126 }
16127
16128 #include "gt-java-parse.h"
16129 #include "gtype-java.h"