#define YYBISON 1
#define yyparse java_parse
#define yylex java_lex
#define yyerror java_error
#define yylval java_lval
#define yychar java_char
#define yydebug java_debug
#define yynerrs java_nerrs
# define PLUS_TK 257
# define MINUS_TK 258
# define MULT_TK 259
# define DIV_TK 260
# define REM_TK 261
# define LS_TK 262
# define SRS_TK 263
# define ZRS_TK 264
# define AND_TK 265
# define XOR_TK 266
# define OR_TK 267
# define BOOL_AND_TK 268
# define BOOL_OR_TK 269
# define EQ_TK 270
# define NEQ_TK 271
# define GT_TK 272
# define GTE_TK 273
# define LT_TK 274
# define LTE_TK 275
# define PLUS_ASSIGN_TK 276
# define MINUS_ASSIGN_TK 277
# define MULT_ASSIGN_TK 278
# define DIV_ASSIGN_TK 279
# define REM_ASSIGN_TK 280
# define LS_ASSIGN_TK 281
# define SRS_ASSIGN_TK 282
# define ZRS_ASSIGN_TK 283
# define AND_ASSIGN_TK 284
# define XOR_ASSIGN_TK 285
# define OR_ASSIGN_TK 286
# define PUBLIC_TK 287
# define PRIVATE_TK 288
# define PROTECTED_TK 289
# define STATIC_TK 290
# define FINAL_TK 291
# define SYNCHRONIZED_TK 292
# define VOLATILE_TK 293
# define TRANSIENT_TK 294
# define NATIVE_TK 295
# define PAD_TK 296
# define ABSTRACT_TK 297
# define STRICT_TK 298
# define MODIFIER_TK 299
# define DECR_TK 300
# define INCR_TK 301
# define DEFAULT_TK 302
# define IF_TK 303
# define THROW_TK 304
# define BOOLEAN_TK 305
# define DO_TK 306
# define IMPLEMENTS_TK 307
# define THROWS_TK 308
# define BREAK_TK 309
# define IMPORT_TK 310
# define ELSE_TK 311
# define INSTANCEOF_TK 312
# define RETURN_TK 313
# define VOID_TK 314
# define CATCH_TK 315
# define INTERFACE_TK 316
# define CASE_TK 317
# define EXTENDS_TK 318
# define FINALLY_TK 319
# define SUPER_TK 320
# define WHILE_TK 321
# define CLASS_TK 322
# define SWITCH_TK 323
# define CONST_TK 324
# define TRY_TK 325
# define FOR_TK 326
# define NEW_TK 327
# define CONTINUE_TK 328
# define GOTO_TK 329
# define PACKAGE_TK 330
# define THIS_TK 331
# define ASSERT_TK 332
# define BYTE_TK 333
# define SHORT_TK 334
# define INT_TK 335
# define LONG_TK 336
# define CHAR_TK 337
# define INTEGRAL_TK 338
# define FLOAT_TK 339
# define DOUBLE_TK 340
# define FP_TK 341
# define ID_TK 342
# define REL_QM_TK 343
# define REL_CL_TK 344
# define NOT_TK 345
# define NEG_TK 346
# define ASSIGN_ANY_TK 347
# define ASSIGN_TK 348
# define OP_TK 349
# define CP_TK 350
# define OCB_TK 351
# define CCB_TK 352
# define OSB_TK 353
# define CSB_TK 354
# define SC_TK 355
# define C_TK 356
# define DOT_TK 357
# define STRING_LIT_TK 358
# define CHAR_LIT_TK 359
# define INT_LIT_TK 360
# define FP_LIT_TK 361
# define TRUE_TK 362
# define FALSE_TK 363
# define BOOL_LIT_TK 364
# define NULL_TK 365
#line 49 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include <dirent.h>
#include "tree.h"
#include "rtl.h"
#include "real.h"
#include "obstack.h"
#include "toplev.h"
#include "pretty-print.h"
#include "diagnostic.h"
#include "flags.h"
#include "java-tree.h"
#include "jcf.h"
#include "lex.h"
#include "parse.h"
#include "zipfile.h"
#include "convert.h"
#include "buffer.h"
#include "xref.h"
#include "function.h"
#include "except.h"
#include "ggc.h"
#include "debug.h"
#include "tree-inline.h"
#include "cgraph.h"
#include "target.h"
static char *java_accstring_lookup (int);
static const char *accessibility_string (int);
static void classitf_redefinition_error (const char *,tree, tree, tree);
static void variable_redefinition_error (tree, tree, tree, int);
static tree create_class (int, tree, tree, tree);
static tree create_interface (int, tree, tree);
static void end_class_declaration (int);
static tree find_field (tree, tree);
static tree lookup_field_wrapper (tree, tree);
static int duplicate_declaration_error_p (tree, tree, tree);
static void register_fields (int, tree, tree);
static tree parser_qualified_classname (tree);
static int parser_check_super (tree, tree, tree);
static int parser_check_super_interface (tree, tree, tree);
static void check_modifiers_consistency (int);
static tree lookup_cl (tree);
static tree lookup_java_method2 (tree, tree, int);
static tree method_header (int, tree, tree, tree);
static void fix_method_argument_names (tree ,tree);
static tree method_declarator (tree, tree);
static void parse_warning_context (tree cl, const char *msgid, ...);
#ifdef USE_MAPPED_LOCATION
static void issue_warning_error_from_context
(source_location, const char *msgid, va_list *);
#else
static void issue_warning_error_from_context
(tree, const char *msgid, va_list *);
#endif
static void parse_ctor_invocation_error (void);
static tree parse_jdk1_1_error (const char *);
static void complete_class_report_errors (jdep *);
static int process_imports (void);
static void read_import_dir (tree);
static int find_in_imports_on_demand (tree, tree);
static void find_in_imports (tree, tree);
static void check_inner_class_access (tree, tree, tree);
static int check_pkg_class_access (tree, tree, bool, tree);
static void register_package (tree);
static tree resolve_package (tree, tree *, tree *);
static tree resolve_class (tree, tree, tree, tree);
static void declare_local_variables (int, tree, tree);
static void dump_java_tree (enum tree_dump_index, tree);
static void source_start_java_method (tree);
static void source_end_java_method (void);
static tree find_name_in_single_imports (tree);
static void check_abstract_method_header (tree);
static tree lookup_java_interface_method2 (tree, tree);
static tree resolve_expression_name (tree, tree *);
static tree maybe_create_class_interface_decl (tree, tree, tree, tree);
static int check_class_interface_creation (int, int, tree, tree, tree, tree);
static tree patch_method_invocation (tree, tree, tree, int, int *, tree *);
static tree resolve_and_layout (tree, tree);
static tree qualify_and_find (tree, tree, tree);
static tree resolve_no_layout (tree, tree);
static int invocation_mode (tree, int);
static tree find_applicable_accessible_methods_list (int, tree, tree, tree);
static void search_applicable_methods_list (int, tree, tree, tree, tree *, tree *);
static tree find_most_specific_methods_list (tree);
static int argument_types_convertible (tree, tree);
static tree patch_invoke (tree, tree, tree);
static int maybe_use_access_method (int, tree *, tree *);
static tree lookup_method_invoke (int, tree, tree, tree, tree);
static tree register_incomplete_type (int, tree, tree, tree);
static tree check_inner_circular_reference (tree, tree);
static tree check_circular_reference (tree);
static tree obtain_incomplete_type (tree);
static tree java_complete_lhs (tree);
static tree java_complete_tree (tree);
static tree maybe_generate_pre_expand_clinit (tree);
static int analyze_clinit_body (tree, tree);
static int maybe_yank_clinit (tree);
static void start_complete_expand_method (tree);
static void java_complete_expand_method (tree);
static void java_expand_method_bodies (tree);
static int unresolved_type_p (tree, tree *);
static void create_jdep_list (struct parser_ctxt *);
static tree build_expr_block (tree, tree);
static tree enter_block (void);
static tree exit_block (void);
static tree lookup_name_in_blocks (tree);
static void maybe_absorb_scoping_blocks (void);
static tree build_method_invocation (tree, tree);
static tree build_new_invocation (tree, tree);
static tree build_assignment (int, int, tree, tree);
static tree build_binop (enum tree_code, int, tree, tree);
static tree patch_assignment (tree, tree);
static tree patch_binop (tree, tree, tree);
static tree build_unaryop (int, int, tree);
static tree build_incdec (int, int, tree, int);
static tree patch_unaryop (tree, tree);
static tree build_cast (int, tree, tree);
static tree build_null_of_type (tree);
static tree patch_cast (tree, tree);
static int valid_ref_assignconv_cast_p (tree, tree, int);
static int valid_builtin_assignconv_identity_widening_p (tree, tree);
static int valid_cast_to_p (tree, tree);
static int valid_method_invocation_conversion_p (tree, tree);
static tree try_builtin_assignconv (tree, tree, tree);
static tree try_reference_assignconv (tree, tree);
static tree build_unresolved_array_type (tree);
static int build_type_name_from_array_name (tree, tree *);
static tree build_array_from_name (tree, tree, tree, tree *);
static tree build_array_ref (int, tree, tree);
static tree patch_array_ref (tree);
#ifdef USE_MAPPED_LOCATION
static tree make_qualified_name (tree, tree, source_location);
#else
static tree make_qualified_name (tree, tree, int);
#endif
static tree merge_qualified_name (tree, tree);
static tree make_qualified_primary (tree, tree, int);
static int resolve_qualified_expression_name (tree, tree *, tree *, tree *);
static void qualify_ambiguous_name (tree);
static tree resolve_field_access (tree, tree *, tree *);
static tree build_newarray_node (tree, tree, int);
static tree patch_newarray (tree);
static tree resolve_type_during_patch (tree);
static tree build_this (int);
static tree build_wfl_wrap (tree, int);
static tree build_return (int, tree);
static tree patch_return (tree);
static tree maybe_access_field (tree, tree, tree);
static int complete_function_arguments (tree);
static int check_for_static_method_reference (tree, tree, tree, tree, tree);
static int not_accessible_p (tree, tree, tree, int);
static void check_deprecation (tree, tree);
static int class_in_current_package (tree);
static tree build_if_else_statement (int, tree, tree, tree);
static tree patch_if_else_statement (tree);
static tree add_stmt_to_block (tree, tree, tree);
static tree patch_exit_expr (tree);
static tree build_labeled_block (int, tree);
static tree finish_labeled_statement (tree, tree);
static tree build_bc_statement (int, int, tree);
static tree patch_bc_statement (tree);
static tree patch_loop_statement (tree);
static tree build_new_loop (tree);
static tree build_loop_body (int, tree, int);
static tree finish_loop_body (int, tree, tree, int);
static tree build_debugable_stmt (int, tree);
static tree finish_for_loop (int, tree, tree, tree);
static tree patch_switch_statement (tree);
static tree string_constant_concatenation (tree, tree);
static tree build_string_concatenation (tree, tree);
static tree patch_string_cst (tree);
static tree patch_string (tree);
static tree encapsulate_with_try_catch (int, tree, tree, tree);
#ifdef USE_MAPPED_LOCATION
static tree build_assertion (source_location, tree, tree);
#else
static tree build_assertion (int, tree, tree);
#endif
static tree build_try_statement (int, tree, tree);
static tree build_try_finally_statement (int, tree, tree);
static tree patch_try_statement (tree);
static tree patch_synchronized_statement (tree, tree);
static tree patch_throw_statement (tree, tree);
#ifdef USE_MAPPED_LOCATION
static void check_thrown_exceptions (source_location, tree, tree);
#else
static void check_thrown_exceptions (int, tree, tree);
#endif
static int check_thrown_exceptions_do (tree);
static void purge_unchecked_exceptions (tree);
static bool ctors_unchecked_throws_clause_p (tree);
static void check_concrete_throws_clauses (tree, tree, tree, tree);
static void check_throws_clauses (tree, tree, tree);
static void finish_method_declaration (tree);
static tree build_super_invocation (tree);
static int verify_constructor_circularity (tree, tree);
static char *constructor_circularity_msg (tree, tree);
static tree build_this_super_qualified_invocation (int, tree, tree, int, int);
static const char *get_printable_method_name (tree);
static tree patch_conditional_expr (tree, tree, tree);
static tree generate_finit (tree);
static tree generate_instinit (tree);
static tree build_instinit_invocation (tree);
static void fix_constructors (tree);
static tree build_alias_initializer_parameter_list (int, tree, tree, int *);
static tree craft_constructor (tree, tree);
static int verify_constructor_super (tree);
static tree create_artificial_method (tree, int, tree, tree, tree);
static void start_artificial_method_body (tree);
static void end_artificial_method_body (tree);
static int check_method_redefinition (tree, tree);
static int check_method_types_complete (tree);
static bool hack_is_accessible_p (tree, tree);
static void java_check_regular_methods (tree);
static void check_interface_throws_clauses (tree, tree);
static void java_check_abstract_methods (tree);
static void unreachable_stmt_error (tree);
static int not_accessible_field_error (tree, tree);
static tree find_expr_with_wfl (tree);
static void missing_return_error (tree);
static tree build_new_array_init (int, tree);
static tree patch_new_array_init (tree, tree);
static tree maybe_build_array_element_wfl (tree);
static int array_constructor_check_entry (tree, tree);
static const char *purify_type_name (const char *);
static tree fold_constant_for_init (tree, tree);
static jdeplist *reverse_jdep_list (struct parser_ctxt *);
static void static_ref_err (tree, tree, tree);
static void parser_add_interface (tree, tree, tree);
static void add_superinterfaces (tree, tree);
static tree jdep_resolve_class (jdep *);
static int note_possible_classname (const char *, int);
static void java_complete_expand_classes (void);
static void java_complete_expand_class (tree);
static void java_complete_expand_methods (tree);
static tree cut_identifier_in_qualified (tree);
static tree java_stabilize_reference (tree);
static tree do_unary_numeric_promotion (tree);
static char * operator_string (tree);
static tree do_merge_string_cste (tree, const char *, int, int);
static tree merge_string_cste (tree, tree, int);
static tree java_refold (tree);
static int java_decl_equiv (tree, tree);
static int binop_compound_p (enum tree_code);
static tree search_loop (tree);
static int labeled_block_contains_loop_p (tree, tree);
static int check_abstract_method_definitions (int, tree, tree);
static void java_check_abstract_method_definitions (tree);
static void java_debug_context_do (int);
static void java_parser_context_push_initialized_field (void);
static void java_parser_context_pop_initialized_field (void);
static tree reorder_static_initialized (tree);
static void java_parser_context_suspend (void);
static void java_parser_context_resume (void);
static int pop_current_osb (struct parser_ctxt *);
static tree maybe_make_nested_class_name (tree);
static int make_nested_class_name (tree);
static void link_nested_class_to_enclosing (void);
static tree resolve_inner_class (htab_t, tree, tree *, tree *, tree);
static tree find_as_inner_class (tree, tree, tree);
static tree find_as_inner_class_do (tree, tree);
static int check_inner_class_redefinition (tree, tree);
static tree build_thisn_assign (void);
static tree build_current_thisn (tree);
static tree build_access_to_thisn (tree, tree, int);
static tree maybe_build_thisn_access_method (tree);
static tree build_outer_field_access (tree, tree);
static tree build_outer_field_access_methods (tree);
static tree build_outer_field_access_expr (int, tree, tree,
tree, tree);
static tree build_outer_method_access_method (tree);
static tree build_new_access_id (void);
static tree build_outer_field_access_method (tree, tree, tree,
tree, tree);
static int outer_field_access_p (tree, tree);
static int outer_field_expanded_access_p (tree, tree *,
tree *, tree *);
static tree outer_field_access_fix (tree, tree, tree);
static tree build_incomplete_class_ref (int, tree);
static tree patch_incomplete_class_ref (tree);
static tree create_anonymous_class (tree);
static void patch_anonymous_class (tree, tree, tree);
static void add_inner_class_fields (tree, tree);
static tree build_dot_class_method (tree);
static tree build_dot_class_method_invocation (tree, tree);
static void create_new_parser_context (int);
static tree maybe_build_class_init_for_field (tree, tree);
static int emit_test_initialization (void **, void *);
static char *string_convert_int_cst (tree);
int java_error_count;
int java_warning_count;
int do_not_fold;
const char *cyclic_inheritance_report;
struct parser_ctxt *ctxp;
struct parser_ctxt *ctxp_for_generation = NULL;
static const enum tree_code binop_lookup[19] =
{
PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR,
LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR,
BIT_AND_EXPR, BIT_XOR_EXPR, BIT_IOR_EXPR,
TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR,
EQ_EXPR, NE_EXPR, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR,
};
#define BINOP_LOOKUP(VALUE) \
binop_lookup [((VALUE) - PLUS_TK) % ARRAY_SIZE (binop_lookup)]
#define BINOP_COMPOUND_CANDIDATES 11
static GTY(()) tree label_id;
static GTY(()) tree wfl_string_buffer;
static GTY(()) tree wfl_append;
static GTY(()) tree wfl_to_string;
static GTY(()) tree java_lang_id;
static GTY(()) tree inst_id;
static GTY(()) tree current_static_block;
static GTY(()) tree wpv_id;
static GTY(()) tree package_list;
static GTY(()) tree current_this;
static GTY(()) tree currently_caught_type_list;
static GTY(()) tree case_label_list;
static int anonymous_class_counter = 1;
static GTY(()) tree src_parse_roots[1];
#define gclass_list src_parse_roots[0]
#define check_modifiers(__message, __value, __mask) do { \
if ((__value) & ~(__mask)) \
{ \
size_t i, remainder = (__value) & ~(__mask); \
for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++) \
if ((1 << i) & remainder) \
parse_error_context (ctxp->modifier_ctx [i], (__message), \
java_accstring_lookup (1 << i)); \
} \
} while (0)
#line 457 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
#ifndef YYSTYPE
typedef union {
tree node;
int sub_token;
struct {
int token;
#ifdef USE_MAPPED_LOCATION
source_location location;
#else
int location;
#endif
} operator;
int value;
} yystype;
# define YYSTYPE yystype
# define YYSTYPE_IS_TRIVIAL 1
#endif
#line 471 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
#ifdef USE_MAPPED_LOCATION
#define SET_EXPR_LOCATION_FROM_TOKEN(EXPR, TOKEN) \
SET_EXPR_LOCATION(EXPR, (TOKEN).location)
#else
#define SET_EXPR_LOCATION_FROM_TOKEN(EXPR, TOKEN) \
(EXPR_WFL_LINECOL (EXPR) = (TOKEN).location)
#endif
#include "lex.c"
#ifndef YYDEBUG
# define YYDEBUG 1
#endif
#define YYFINAL 791
#define YYFLAG -32768
#define YYNTBASE 112
#define YYTRANSLATE(x) ((unsigned)(x) <= 365 ? yytranslate[x] : 276)
static const char yytranslate[] =
{
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 3, 4, 5,
6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
106, 107, 108, 109, 110, 111
};
#if YYDEBUG
static const short yyprhs[] =
{
0, 0, 2, 4, 6, 8, 10, 12, 14, 16,
18, 20, 22, 24, 26, 28, 30, 32, 34, 37,
40, 42, 44, 46, 50, 52, 53, 55, 57, 59,
62, 65, 68, 72, 74, 77, 79, 82, 86, 89,
93, 95, 97, 101, 104, 108, 114, 119, 125, 127,
129, 131, 133, 135, 138, 139, 147, 148, 155, 159,
162, 166, 171, 172, 175, 179, 182, 183, 186, 189,
191, 195, 199, 202, 206, 208, 211, 213, 215, 217,
219, 221, 223, 225, 227, 229, 233, 238, 240, 244,
248, 250, 254, 258, 263, 265, 269, 272, 276, 280,
282, 284, 285, 289, 292, 296, 300, 305, 310, 313,
317, 320, 324, 327, 331, 336, 340, 344, 348, 350,
354, 358, 361, 365, 368, 372, 374, 375, 378, 381,
383, 387, 391, 393, 395, 398, 400, 401, 405, 408,
412, 416, 421, 424, 428, 432, 437, 439, 444, 450,
458, 465, 467, 469, 470, 475, 476, 482, 483, 489,
490, 497, 501, 506, 509, 513, 516, 520, 523, 527,
529, 532, 534, 536, 538, 540, 542, 545, 548, 551,
555, 559, 564, 566, 570, 574, 577, 581, 583, 585,
587, 590, 592, 594, 596, 599, 602, 606, 608, 610,
612, 614, 616, 618, 620, 622, 624, 626, 628, 630,
632, 634, 636, 638, 640, 642, 644, 646, 648, 650,
652, 654, 657, 660, 663, 666, 669, 672, 675, 678,
682, 687, 692, 698, 703, 709, 716, 724, 731, 733,
735, 737, 739, 741, 743, 745, 751, 754, 758, 763,
771, 779, 780, 784, 789, 792, 796, 802, 805, 809,
813, 818, 820, 823, 826, 828, 831, 835, 838, 841,
845, 848, 853, 856, 859, 863, 868, 871, 873, 881,
889, 896, 900, 906, 911, 919, 926, 929, 932, 936,
939, 940, 942, 944, 947, 948, 950, 952, 956, 960,
963, 967, 970, 974, 977, 981, 984, 988, 991, 995,
998, 1002, 1006, 1009, 1013, 1019, 1023, 1026, 1030, 1036,
1042, 1045, 1050, 1054, 1056, 1060, 1064, 1069, 1072, 1074,
1077, 1080, 1085, 1088, 1092, 1097, 1100, 1103, 1105, 1107,
1109, 1111, 1113, 1117, 1119, 1121, 1123, 1125, 1127, 1131,
1135, 1139, 1143, 1147, 1151, 1155, 1159, 1163, 1169, 1174,
1176, 1181, 1187, 1193, 1200, 1204, 1208, 1213, 1219, 1222,
1226, 1227, 1235, 1236, 1243, 1247, 1251, 1253, 1257, 1261,
1265, 1269, 1274, 1279, 1283, 1287, 1292, 1297, 1301, 1305,
1307, 1310, 1314, 1318, 1321, 1324, 1328, 1332, 1336, 1340,
1343, 1347, 1352, 1358, 1365, 1371, 1378, 1383, 1388, 1393,
1398, 1403, 1407, 1412, 1416, 1421, 1425, 1430, 1432, 1434,
1436, 1438, 1441, 1444, 1446, 1448, 1451, 1453, 1456, 1458,
1461, 1464, 1467, 1470, 1473, 1476, 1478, 1481, 1484, 1486,
1489, 1492, 1498, 1503, 1508, 1514, 1519, 1522, 1528, 1533,
1539, 1541, 1545, 1549, 1553, 1557, 1561, 1565, 1567, 1571,
1575, 1579, 1583, 1585, 1589, 1593, 1597, 1601, 1605, 1609,
1611, 1615, 1619, 1623, 1627, 1631, 1635, 1639, 1643, 1647,
1651, 1653, 1657, 1661, 1665, 1669, 1671, 1675, 1679, 1681,
1685, 1689, 1691, 1695, 1699, 1701, 1705, 1709, 1711, 1715,
1719, 1721, 1727, 1732, 1736, 1742, 1744, 1746, 1750, 1754,
1756, 1758, 1760, 1762, 1764, 1766
};
static const short yyrhs[] =
{
125, 0, 106, 0, 107, 0, 110, 0, 105, 0,
104, 0, 111, 0, 115, 0, 116, 0, 84, 0,
87, 0, 51, 0, 117, 0, 120, 0, 121, 0,
117, 0, 117, 0, 115, 246, 0, 121, 246, 0,
122, 0, 123, 0, 124, 0, 121, 103, 124, 0,
88, 0, 0, 128, 0, 126, 0, 127, 0, 128,
126, 0, 128, 127, 0, 126, 127, 0, 128, 126,
127, 0, 129, 0, 126, 129, 0, 132, 0, 127,
132, 0, 76, 121, 101, 0, 76, 1, 0, 76,
121, 1, 0, 130, 0, 131, 0, 56, 121, 101,
0, 56, 1, 0, 56, 121, 1, 0, 56, 121,
103, 5, 101, 0, 56, 121, 103, 1, 0, 56,
121, 103, 5, 1, 0, 134, 0, 169, 0, 192,
0, 1, 0, 45, 0, 133, 45, 0, 0, 133,
68, 124, 137, 138, 135, 140, 0, 0, 68, 124,
137, 138, 136, 140, 0, 133, 68, 1, 0, 68,
1, 0, 68, 124, 1, 0, 133, 68, 124, 1,
0, 0, 64, 118, 0, 64, 118, 1, 0, 64,
1, 0, 0, 53, 139, 0, 53, 1, 0, 119,
0, 139, 102, 119, 0, 139, 102, 1, 0, 97,
98, 0, 97, 141, 98, 0, 142, 0, 141, 142,
0, 143, 0, 159, 0, 161, 0, 182, 0, 144,
0, 149, 0, 134, 0, 169, 0, 192, 0, 114,
145, 101, 0, 133, 114, 145, 101, 0, 146, 0,
145, 102, 146, 0, 145, 102, 1, 0, 147, 0,
147, 94, 148, 0, 147, 94, 1, 0, 147, 94,
148, 1, 0, 124, 0, 147, 99, 100, 0, 124,
1, 0, 147, 99, 1, 0, 147, 100, 1, 0,
274, 0, 180, 0, 0, 151, 150, 158, 0, 151,
1, 0, 114, 152, 156, 0, 60, 152, 156, 0,
133, 114, 152, 156, 0, 133, 60, 152, 156, 0,
114, 1, 0, 133, 114, 1, 0, 60, 1, 0,
133, 60, 1, 0, 133, 1, 0, 124, 95, 96,
0, 124, 95, 153, 96, 0, 152, 99, 100, 0,
124, 95, 1, 0, 152, 99, 1, 0, 154, 0,
153, 102, 154, 0, 153, 102, 1, 0, 114, 147,
0, 155, 114, 147, 0, 114, 1, 0, 155, 114,
1, 0, 133, 0, 0, 54, 157, 0, 54, 1,
0, 118, 0, 157, 102, 118, 0, 157, 102, 1,
0, 182, 0, 101, 0, 160, 182, 0, 133, 0,
0, 163, 162, 165, 0, 164, 156, 0, 133, 164,
156, 0, 122, 95, 96, 0, 122, 95, 153, 96,
0, 183, 166, 0, 183, 167, 166, 0, 183, 185,
166, 0, 183, 167, 185, 166, 0, 184, 0, 168,
95, 96, 101, 0, 168, 95, 241, 96, 101, 0,
121, 103, 66, 95, 241, 96, 101, 0, 121, 103,
66, 95, 96, 101, 0, 77, 0, 66, 0, 0,
62, 124, 170, 175, 0, 0, 133, 62, 124, 171,
175, 0, 0, 62, 124, 174, 172, 175, 0, 0,
133, 62, 124, 174, 173, 175, 0, 62, 124, 1,
0, 133, 62, 124, 1, 0, 64, 119, 0, 174,
102, 119, 0, 64, 1, 0, 174, 102, 1, 0,
97, 98, 0, 97, 176, 98, 0, 177, 0, 176,
177, 0, 178, 0, 179, 0, 134, 0, 169, 0,
144, 0, 151, 101, 0, 151, 1, 0, 97, 98,
0, 97, 102, 98, 0, 97, 181, 98, 0, 97,
181, 102, 98, 0, 148, 0, 181, 102, 148, 0,
181, 102, 1, 0, 183, 184, 0, 183, 185, 184,
0, 97, 0, 98, 0, 186, 0, 185, 186, 0,
187, 0, 189, 0, 134, 0, 188, 101, 0, 114,
145, 0, 155, 114, 145, 0, 191, 0, 194, 0,
198, 0, 199, 0, 210, 0, 214, 0, 191, 0,
195, 0, 200, 0, 211, 0, 215, 0, 182, 0,
192, 0, 196, 0, 201, 0, 213, 0, 221, 0,
222, 0, 223, 0, 226, 0, 224, 0, 228, 0,
225, 0, 101, 0, 124, 90, 0, 193, 189, 0,
124, 1, 0, 193, 190, 0, 197, 101, 0, 1,
101, 0, 1, 97, 0, 1, 98, 0, 168, 95,
1, 0, 168, 95, 96, 1, 0, 168, 95, 241,
1, 0, 168, 95, 241, 96, 1, 0, 121, 103,
66, 1, 0, 121, 103, 66, 95, 1, 0, 121,
103, 66, 95, 241, 1, 0, 121, 103, 66, 95,
241, 96, 1, 0, 121, 103, 66, 95, 96, 1,
0, 271, 0, 255, 0, 256, 0, 251, 0, 252,
0, 248, 0, 236, 0, 49, 95, 274, 96, 189,
0, 49, 1, 0, 49, 95, 1, 0, 49, 95,
274, 1, 0, 49, 95, 274, 96, 190, 57, 189,
0, 49, 95, 274, 96, 190, 57, 190, 0, 0,
203, 202, 204, 0, 69, 95, 274, 96, 0, 69,
1, 0, 69, 95, 1, 0, 69, 95, 274, 96,
1, 0, 97, 98, 0, 97, 207, 98, 0, 97,
205, 98, 0, 97, 205, 207, 98, 0, 206, 0,
205, 206, 0, 207, 185, 0, 208, 0, 207, 208,
0, 63, 275, 90, 0, 48, 90, 0, 63, 1,
0, 63, 275, 1, 0, 48, 1, 0, 67, 95,
274, 96, 0, 209, 189, 0, 67, 1, 0, 67,
95, 1, 0, 67, 95, 274, 1, 0, 209, 190,
0, 52, 0, 212, 189, 67, 95, 274, 96, 101,
0, 217, 101, 274, 101, 219, 96, 189, 0, 217,
101, 101, 219, 96, 189, 0, 217, 101, 1, 0,
217, 101, 274, 101, 1, 0, 217, 101, 101, 1,
0, 217, 101, 274, 101, 219, 96, 190, 0, 217,
101, 101, 219, 96, 190, 0, 72, 95, 0, 72,
1, 0, 72, 95, 1, 0, 216, 218, 0, 0,
220, 0, 188, 0, 220, 1, 0, 0, 220, 0,
197, 0, 220, 102, 197, 0, 220, 102, 1, 0,
55, 101, 0, 55, 124, 101, 0, 55, 1, 0,
55, 124, 1, 0, 74, 101, 0, 74, 124, 101,
0, 74, 1, 0, 74, 124, 1, 0, 59, 101,
0, 59, 274, 101, 0, 59, 1, 0, 59, 274,
1, 0, 50, 274, 101, 0, 50, 1, 0, 50,
274, 1, 0, 78, 274, 90, 274, 101, 0, 78,
274, 101, 0, 78, 1, 0, 78, 274, 1, 0,
227, 95, 274, 96, 182, 0, 227, 95, 274, 96,
1, 0, 227, 1, 0, 227, 95, 1, 96, 0,
227, 95, 1, 0, 133, 0, 71, 182, 229, 0,
71, 182, 232, 0, 71, 182, 229, 232, 0, 71,
1, 0, 230, 0, 229, 230, 0, 231, 182, 0,
61, 95, 154, 96, 0, 61, 1, 0, 61, 95,
1, 0, 61, 95, 1, 96, 0, 65, 182, 0,
65, 1, 0, 234, 0, 242, 0, 243, 0, 113,
0, 77, 0, 95, 274, 96, 0, 236, 0, 247,
0, 248, 0, 249, 0, 235, 0, 121, 103, 77,
0, 95, 274, 1, 0, 121, 103, 1, 0, 115,
103, 1, 0, 60, 103, 1, 0, 121, 103, 68,
0, 120, 103, 68, 0, 115, 103, 68, 0, 60,
103, 68, 0, 73, 118, 95, 241, 96, 0, 73,
118, 95, 96, 0, 237, 0, 240, 124, 95, 96,
0, 240, 124, 95, 96, 140, 0, 240, 124, 95,
241, 96, 0, 240, 124, 95, 241, 96, 140, 0,
73, 1, 101, 0, 73, 118, 1, 0, 73, 118,
95, 1, 0, 73, 118, 95, 241, 1, 0, 240,
1, 0, 240, 124, 1, 0, 0, 73, 118, 95,
241, 96, 238, 140, 0, 0, 73, 118, 95, 96,
239, 140, 0, 121, 103, 73, 0, 233, 103, 73,
0, 274, 0, 241, 102, 274, 0, 241, 102, 1,
0, 73, 115, 244, 0, 73, 117, 244, 0, 73,
115, 244, 246, 0, 73, 117, 244, 246, 0, 73,
1, 100, 0, 73, 1, 99, 0, 73, 117, 246,
180, 0, 73, 115, 246, 180, 0, 73, 1, 100,
0, 73, 1, 99, 0, 245, 0, 244, 245, 0,
99, 274, 100, 0, 99, 274, 1, 0, 99, 1,
0, 99, 100, 0, 246, 99, 100, 0, 246, 99,
1, 0, 233, 103, 124, 0, 66, 103, 124, 0,
66, 1, 0, 121, 95, 96, 0, 121, 95, 241,
96, 0, 233, 103, 124, 95, 96, 0, 233, 103,
124, 95, 241, 96, 0, 66, 103, 124, 95, 96,
0, 66, 103, 124, 95, 241, 96, 0, 66, 103,
1, 96, 0, 66, 103, 1, 103, 0, 121, 99,
274, 100, 0, 234, 99, 274, 100, 0, 243, 99,
274, 100, 0, 121, 99, 1, 0, 121, 99, 274,
1, 0, 234, 99, 1, 0, 234, 99, 274, 1,
0, 243, 99, 1, 0, 243, 99, 274, 1, 0,
233, 0, 121, 0, 251, 0, 252, 0, 250, 47,
0, 250, 46, 0, 255, 0, 256, 0, 3, 254,
0, 257, 0, 3, 1, 0, 253, 0, 4, 253,
0, 4, 1, 0, 47, 254, 0, 47, 1, 0,
46, 254, 0, 46, 1, 0, 250, 0, 91, 254,
0, 92, 254, 0, 258, 0, 91, 1, 0, 92,
1, 0, 95, 115, 246, 96, 254, 0, 95, 115,
96, 254, 0, 95, 274, 96, 257, 0, 95, 121,
246, 96, 257, 0, 95, 115, 99, 1, 0, 95,
1, 0, 95, 115, 246, 96, 1, 0, 95, 115,
96, 1, 0, 95, 121, 246, 96, 1, 0, 254,
0, 259, 5, 254, 0, 259, 6, 254, 0, 259,
7, 254, 0, 259, 5, 1, 0, 259, 6, 1,
0, 259, 7, 1, 0, 259, 0, 260, 3, 259,
0, 260, 4, 259, 0, 260, 3, 1, 0, 260,
4, 1, 0, 260, 0, 261, 8, 260, 0, 261,
9, 260, 0, 261, 10, 260, 0, 261, 8, 1,
0, 261, 9, 1, 0, 261, 10, 1, 0, 261,
0, 262, 20, 261, 0, 262, 18, 261, 0, 262,
21, 261, 0, 262, 19, 261, 0, 262, 58, 116,
0, 262, 20, 1, 0, 262, 18, 1, 0, 262,
21, 1, 0, 262, 19, 1, 0, 262, 58, 1,
0, 262, 0, 263, 16, 262, 0, 263, 17, 262,
0, 263, 16, 1, 0, 263, 17, 1, 0, 263,
0, 264, 11, 263, 0, 264, 11, 1, 0, 264,
0, 265, 12, 264, 0, 265, 12, 1, 0, 265,
0, 266, 13, 265, 0, 266, 13, 1, 0, 266,
0, 267, 14, 266, 0, 267, 14, 1, 0, 267,
0, 268, 15, 267, 0, 268, 15, 1, 0, 268,
0, 268, 89, 274, 90, 269, 0, 268, 89, 90,
1, 0, 268, 89, 1, 0, 268, 89, 274, 90,
1, 0, 269, 0, 271, 0, 272, 273, 270, 0,
272, 273, 1, 0, 121, 0, 247, 0, 249, 0,
93, 0, 94, 0, 270, 0, 274, 0
};
#endif
#if YYDEBUG
static const short yyrline[] =
{
0, 630, 635, 637, 638, 639, 640, 641, 645, 647,
650, 652, 653, 656, 658, 661, 665, 669, 673, 682,
693, 695, 698, 702, 707, 712, 714, 715, 716, 717,
718, 719, 720, 723, 728, 734, 736, 739, 745, 747,
751, 753, 756, 783, 785, 789, 808, 810, 814, 817,
819, 820, 830, 835, 850, 850, 855, 855, 859, 861,
863, 868, 872, 874, 876, 878, 882, 884, 886, 893,
899, 904, 908, 916, 925, 927, 930, 932, 933, 934,
944, 946, 947, 949, 951, 955, 958, 968, 971, 973,
977, 980, 987, 993, 1001, 1003, 1005, 1007, 1012, 1016,
1018, 1022, 1022, 1034, 1038, 1041, 1043, 1045, 1047, 1052,
1057, 1062, 1067, 1074, 1080, 1082, 1091, 1093, 1097, 1102,
1107, 1111, 1116, 1121, 1126, 1133, 1143, 1145, 1147, 1151,
1154, 1156, 1160, 1162, 1166, 1175, 1191, 1191, 1201, 1204,
1208, 1214, 1218, 1227, 1229, 1231, 1235, 1240, 1247, 1255,
1257, 1261, 1268, 1278, 1278, 1283, 1283, 1287, 1287, 1291,
1291, 1295, 1297, 1301, 1307, 1312, 1314, 1318, 1321, 1325,
1327, 1330, 1332, 1333, 1335, 1339, 1343, 1349, 1354, 1357,
1359, 1361, 1365, 1371, 1375, 1380, 1383, 1387, 1392, 1405,
1407, 1410, 1412, 1414, 1421, 1425, 1428, 1432, 1434, 1435,
1436, 1437, 1438, 1442, 1444, 1445, 1446, 1447, 1451, 1453,
1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463,
1466, 1488, 1499, 1502, 1506, 1513, 1527, 1532, 1537, 1542,
1544, 1549, 1551, 1556, 1558, 1560, 1562, 1564, 1568, 1570,
1571, 1572, 1573, 1574, 1575, 1578, 1584, 1586, 1588, 1592,
1597, 1602, 1602, 1618, 1625, 1627, 1629, 1636, 1639, 1641,
1643, 1647, 1649, 1652, 1656, 1658, 1661, 1668, 1674, 1676,
1678, 1682, 1690, 1693, 1695, 1697, 1701, 1706, 1715, 1720,
1727, 1734, 1736, 1738, 1742, 1745, 1754, 1761, 1763, 1767,
1780, 1782, 1788, 1794, 1798, 1800, 1804, 1807, 1809, 1813,
1816, 1818, 1820, 1824, 1827, 1829, 1831, 1835, 1838, 1840,
1842, 1846, 1852, 1854, 1858, 1863, 1867, 1869, 1873, 1880,
1882, 1884, 1886, 1890, 1902, 1905, 1907, 1912, 1916, 1918,
1925, 1934, 1960, 1962, 1967, 1971, 1974, 1979, 1981, 1982,
1985, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1999, 2004,
2006, 2008, 2010, 2014, 2017, 2019, 2021, 2028, 2031, 2033,
2037, 2043, 2044, 2050, 2051, 2053, 2055, 2057, 2059, 2066,
2075, 2075, 2109, 2109, 2126, 2129, 2133, 2139, 2144, 2148,
2151, 2153, 2155, 2157, 2159, 2163, 2177, 2186, 2188, 2192,
2195, 2199, 2210, 2212, 2220, 2247, 2249, 2253, 2258, 2264,
2268, 2271, 2273, 2284, 2295, 2300, 2309, 2311, 2315, 2318,
2320, 2322, 2327, 2332, 2337, 2342, 2347, 2354, 2356, 2357,
2358, 2361, 2366, 2371, 2373, 2374, 2376, 2377, 2381, 2388,
2390, 2394, 2397, 2401, 2404, 2408, 2410, 2412, 2414, 2415,
2417, 2421, 2430, 2432, 2434, 2448, 2450, 2455, 2457, 2459,
2463, 2465, 2470, 2475, 2480, 2482, 2484, 2488, 2490, 2495,
2500, 2502, 2506, 2508, 2513, 2518, 2523, 2525, 2527, 2531,
2533, 2538, 2543, 2548, 2553, 2555, 2557, 2559, 2561, 2563,
2567, 2569, 2574, 2579, 2581, 2585, 2587, 2592, 2596, 2598,
2603, 2607, 2609, 2614, 2618, 2620, 2625, 2629, 2631, 2636,
2640, 2642, 2647, 2653, 2655, 2659, 2661, 2664, 2667, 2674,
2676, 2677, 2680, 2682, 2685, 2689
};
#endif
#if (YYDEBUG) || defined YYERROR_VERBOSE
static const char *const yytname[] =
{
"$", "error", "$undefined.", "PLUS_TK", "MINUS_TK", "MULT_TK", "DIV_TK",
"REM_TK", "LS_TK", "SRS_TK", "ZRS_TK", "AND_TK", "XOR_TK", "OR_TK",
"BOOL_AND_TK", "BOOL_OR_TK", "EQ_TK", "NEQ_TK", "GT_TK", "GTE_TK",
"LT_TK", "LTE_TK", "PLUS_ASSIGN_TK", "MINUS_ASSIGN_TK",
"MULT_ASSIGN_TK", "DIV_ASSIGN_TK", "REM_ASSIGN_TK", "LS_ASSIGN_TK",
"SRS_ASSIGN_TK", "ZRS_ASSIGN_TK", "AND_ASSIGN_TK", "XOR_ASSIGN_TK",
"OR_ASSIGN_TK", "PUBLIC_TK", "PRIVATE_TK", "PROTECTED_TK", "STATIC_TK",
"FINAL_TK", "SYNCHRONIZED_TK", "VOLATILE_TK", "TRANSIENT_TK",
"NATIVE_TK", "PAD_TK", "ABSTRACT_TK", "STRICT_TK", "MODIFIER_TK",
"DECR_TK", "INCR_TK", "DEFAULT_TK", "IF_TK", "THROW_TK", "BOOLEAN_TK",
"DO_TK", "IMPLEMENTS_TK", "THROWS_TK", "BREAK_TK", "IMPORT_TK",
"ELSE_TK", "INSTANCEOF_TK", "RETURN_TK", "VOID_TK", "CATCH_TK",
"INTERFACE_TK", "CASE_TK", "EXTENDS_TK", "FINALLY_TK", "SUPER_TK",
"WHILE_TK", "CLASS_TK", "SWITCH_TK", "CONST_TK", "TRY_TK", "FOR_TK",
"NEW_TK", "CONTINUE_TK", "GOTO_TK", "PACKAGE_TK", "THIS_TK",
"ASSERT_TK", "BYTE_TK", "SHORT_TK", "INT_TK", "LONG_TK", "CHAR_TK",
"INTEGRAL_TK", "FLOAT_TK", "DOUBLE_TK", "FP_TK", "ID_TK", "REL_QM_TK",
"REL_CL_TK", "NOT_TK", "NEG_TK", "ASSIGN_ANY_TK", "ASSIGN_TK", "OP_TK",
"CP_TK", "OCB_TK", "CCB_TK", "OSB_TK", "CSB_TK", "SC_TK", "C_TK",
"DOT_TK", "STRING_LIT_TK", "CHAR_LIT_TK", "INT_LIT_TK", "FP_LIT_TK",
"TRUE_TK", "FALSE_TK", "BOOL_LIT_TK", "NULL_TK", "goal", "literal",
"type", "primitive_type", "reference_type", "class_or_interface_type",
"class_type", "interface_type", "array_type", "name", "simple_name",
"qualified_name", "identifier", "compilation_unit",
"import_declarations", "type_declarations", "package_declaration",
"import_declaration", "single_type_import_declaration",
"type_import_on_demand_declaration", "type_declaration", "modifiers",
"class_declaration", "@1", "@2", "super", "interfaces",
"interface_type_list", "class_body", "class_body_declarations",
"class_body_declaration", "class_member_declaration",
"field_declaration", "variable_declarators", "variable_declarator",
"variable_declarator_id", "variable_initializer", "method_declaration",
"@3", "method_header", "method_declarator", "formal_parameter_list",
"formal_parameter", "final", "throws", "class_type_list", "method_body",
"static_initializer", "static", "constructor_declaration", "@4",
"constructor_header", "constructor_declarator", "constructor_body",
"constructor_block_end", "explicit_constructor_invocation",
"this_or_super", "interface_declaration", "@5", "@6", "@7", "@8",
"extends_interfaces", "interface_body", "interface_member_declarations",
"interface_member_declaration", "constant_declaration",
"abstract_method_declaration", "array_initializer",
"variable_initializers", "block", "block_begin", "block_end",
"block_statements", "block_statement",
"local_variable_declaration_statement", "local_variable_declaration",
"statement", "statement_nsi", "statement_without_trailing_substatement",
"empty_statement", "label_decl", "labeled_statement",
"labeled_statement_nsi", "expression_statement", "statement_expression",
"if_then_statement", "if_then_else_statement",
"if_then_else_statement_nsi", "switch_statement", "@9",
"switch_expression", "switch_block", "switch_block_statement_groups",
"switch_block_statement_group", "switch_labels", "switch_label",
"while_expression", "while_statement", "while_statement_nsi",
"do_statement_begin", "do_statement", "for_statement",
"for_statement_nsi", "for_header", "for_begin", "for_init",
"for_update", "statement_expression_list", "break_statement",
"continue_statement", "return_statement", "throw_statement",
"assert_statement", "synchronized_statement", "synchronized",
"try_statement", "catches", "catch_clause", "catch_clause_parameter",
"finally", "primary", "primary_no_new_array", "type_literals",
"class_instance_creation_expression", "anonymous_class_creation", "@10",
"@11", "something_dot_new", "argument_list",
"array_creation_uninitialized", "array_creation_initialized",
"dim_exprs", "dim_expr", "dims", "field_access", "method_invocation",
"array_access", "postfix_expression", "post_increment_expression",
"post_decrement_expression", "trap_overflow_corner_case",
"unary_expression", "pre_increment_expression",
"pre_decrement_expression", "unary_expression_not_plus_minus",
"cast_expression", "multiplicative_expression", "additive_expression",
"shift_expression", "relational_expression", "equality_expression",
"and_expression", "exclusive_or_expression", "inclusive_or_expression",
"conditional_and_expression", "conditional_or_expression",
"conditional_expression", "assignment_expression", "assignment",
"left_hand_side", "assignment_operator", "expression",
"constant_expression", 0
};
#endif
static const short yyr1[] =
{
0, 112, 113, 113, 113, 113, 113, 113, 114, 114,
115, 115, 115, 116, 116, 117, 118, 119, 120, 120,
121, 121, 122, 123, 124, 125, 125, 125, 125, 125,
125, 125, 125, 126, 126, 127, 127, 128, 128, 128,
129, 129, 130, 130, 130, 131, 131, 131, 132, 132,
132, 132, 133, 133, 135, 134, 136, 134, 134, 134,
134, 134, 137, 137, 137, 137, 138, 138, 138, 139,
139, 139, 140, 140, 141, 141, 142, 142, 142, 142,
143, 143, 143, 143, 143, 144, 144, 145, 145, 145,
146, 146, 146, 146, 147, 147, 147, 147, 147, 148,
148, 150, 149, 149, 151, 151, 151, 151, 151, 151,
151, 151, 151, 152, 152, 152, 152, 152, 153, 153,
153, 154, 154, 154, 154, 155, 156, 156, 156, 157,
157, 157, 158, 158, 159, 160, 162, 161, 163, 163,
164, 164, 165, 165, 165, 165, 166, 167, 167, 167,
167, 168, 168, 170, 169, 171, 169, 172, 169, 173,
169, 169, 169, 174, 174, 174, 174, 175, 175, 176,
176, 177, 177, 177, 177, 178, 179, 179, 180, 180,
180, 180, 181, 181, 181, 182, 182, 183, 184, 185,
185, 186, 186, 186, 187, 188, 188, 189, 189, 189,
189, 189, 189, 190, 190, 190, 190, 190, 191, 191,
191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
192, 193, 194, 194, 195, 196, 196, 196, 196, 196,
196, 196, 196, 196, 196, 196, 196, 196, 197, 197,
197, 197, 197, 197, 197, 198, 198, 198, 198, 199,
200, 202, 201, 203, 203, 203, 203, 204, 204, 204,
204, 205, 205, 206, 207, 207, 208, 208, 208, 208,
208, 209, 210, 210, 210, 210, 211, 212, 213, 214,
214, 214, 214, 214, 215, 215, 216, 216, 216, 217,
218, 218, 218, 218, 219, 219, 220, 220, 220, 221,
221, 221, 221, 222, 222, 222, 222, 223, 223, 223,
223, 224, 224, 224, 225, 225, 225, 225, 226, 226,
226, 226, 226, 227, 228, 228, 228, 228, 229, 229,
230, 231, 231, 231, 231, 232, 232, 233, 233, 233,
234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
234, 234, 234, 235, 235, 235, 235, 236, 236, 236,
236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
238, 237, 239, 237, 240, 240, 241, 241, 241, 242,
242, 242, 242, 242, 242, 243, 243, 243, 243, 244,
244, 245, 245, 245, 246, 246, 246, 247, 247, 247,
248, 248, 248, 248, 248, 248, 248, 248, 249, 249,
249, 249, 249, 249, 249, 249, 249, 250, 250, 250,
250, 251, 252, 253, 253, 253, 253, 253, 254, 254,
254, 255, 255, 256, 256, 257, 257, 257, 257, 257,
257, 258, 258, 258, 258, 258, 258, 258, 258, 258,
259, 259, 259, 259, 259, 259, 259, 260, 260, 260,
260, 260, 261, 261, 261, 261, 261, 261, 261, 262,
262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
263, 263, 263, 263, 263, 264, 264, 264, 265, 265,
265, 266, 266, 266, 267, 267, 267, 268, 268, 268,
269, 269, 269, 269, 269, 270, 270, 271, 271, 272,
272, 272, 273, 273, 274, 275
};
static const short yyr2[] =
{
0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
1, 1, 1, 3, 1, 0, 1, 1, 1, 2,
2, 2, 3, 1, 2, 1, 2, 3, 2, 3,
1, 1, 3, 2, 3, 5, 4, 5, 1, 1,
1, 1, 1, 2, 0, 7, 0, 6, 3, 2,
3, 4, 0, 2, 3, 2, 0, 2, 2, 1,
3, 3, 2, 3, 1, 2, 1, 1, 1, 1,
1, 1, 1, 1, 1, 3, 4, 1, 3, 3,
1, 3, 3, 4, 1, 3, 2, 3, 3, 1,
1, 0, 3, 2, 3, 3, 4, 4, 2, 3,
2, 3, 2, 3, 4, 3, 3, 3, 1, 3,
3, 2, 3, 2, 3, 1, 0, 2, 2, 1,
3, 3, 1, 1, 2, 1, 0, 3, 2, 3,
3, 4, 2, 3, 3, 4, 1, 4, 5, 7,
6, 1, 1, 0, 4, 0, 5, 0, 5, 0,
6, 3, 4, 2, 3, 2, 3, 2, 3, 1,
2, 1, 1, 1, 1, 1, 2, 2, 2, 3,
3, 4, 1, 3, 3, 2, 3, 1, 1, 1,
2, 1, 1, 1, 2, 2, 3, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 3,
4, 4, 5, 4, 5, 6, 7, 6, 1, 1,
1, 1, 1, 1, 1, 5, 2, 3, 4, 7,
7, 0, 3, 4, 2, 3, 5, 2, 3, 3,
4, 1, 2, 2, 1, 2, 3, 2, 2, 3,
2, 4, 2, 2, 3, 4, 2, 1, 7, 7,
6, 3, 5, 4, 7, 6, 2, 2, 3, 2,
0, 1, 1, 2, 0, 1, 1, 3, 3, 2,
3, 2, 3, 2, 3, 2, 3, 2, 3, 2,
3, 3, 2, 3, 5, 3, 2, 3, 5, 5,
2, 4, 3, 1, 3, 3, 4, 2, 1, 2,
2, 4, 2, 3, 4, 2, 2, 1, 1, 1,
1, 1, 3, 1, 1, 1, 1, 1, 3, 3,
3, 3, 3, 3, 3, 3, 3, 5, 4, 1,
4, 5, 5, 6, 3, 3, 4, 5, 2, 3,
0, 7, 0, 6, 3, 3, 1, 3, 3, 3,
3, 4, 4, 3, 3, 4, 4, 3, 3, 1,
2, 3, 3, 2, 2, 3, 3, 3, 3, 2,
3, 4, 5, 6, 5, 6, 4, 4, 4, 4,
4, 3, 4, 3, 4, 3, 4, 1, 1, 1,
1, 2, 2, 1, 1, 2, 1, 2, 1, 2,
2, 2, 2, 2, 2, 1, 2, 2, 1, 2,
2, 5, 4, 4, 5, 4, 2, 5, 4, 5,
1, 3, 3, 3, 3, 3, 3, 1, 3, 3,
3, 3, 1, 3, 3, 3, 3, 3, 3, 1,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1, 3, 3, 3, 3, 1, 3, 3, 1, 3,
3, 1, 3, 3, 1, 3, 3, 1, 3, 3,
1, 5, 4, 3, 5, 1, 1, 3, 3, 1,
1, 1, 1, 1, 1, 1
};
static const short yydefact[] =
{
0, 51, 52, 0, 0, 0, 0, 220, 1, 0,
0, 0, 33, 40, 41, 35, 0, 48, 49, 50,
43, 24, 0, 20, 21, 22, 0, 59, 0, 38,
0, 0, 34, 36, 0, 0, 53, 0, 0, 44,
42, 0, 161, 0, 0, 157, 60, 0, 66, 39,
37, 0, 0, 0, 58, 0, 46, 0, 23, 165,
17, 163, 15, 0, 154, 0, 0, 65, 16, 0,
0, 56, 162, 0, 159, 61, 66, 47, 45, 12,
0, 10, 11, 167, 0, 8, 9, 13, 14, 15,
0, 173, 175, 0, 174, 0, 169, 171, 172, 166,
164, 158, 64, 68, 69, 67, 0, 156, 0, 54,
110, 0, 126, 108, 0, 0, 87, 90, 126, 0,
18, 19, 112, 0, 0, 177, 176, 168, 170, 0,
0, 57, 160, 0, 0, 0, 0, 105, 96, 85,
0, 0, 0, 0, 104, 394, 0, 111, 126, 109,
0, 126, 71, 70, 187, 72, 20, 0, 82, 0,
74, 76, 80, 81, 0, 77, 0, 78, 136, 126,
83, 79, 0, 84, 55, 116, 113, 0, 125, 0,
118, 0, 128, 129, 127, 117, 115, 89, 0, 88,
92, 0, 0, 0, 0, 0, 0, 0, 341, 0,
0, 0, 0, 6, 5, 2, 3, 4, 7, 340,
0, 0, 418, 0, 100, 417, 337, 347, 343, 359,
0, 338, 339, 344, 345, 346, 435, 419, 420, 428,
450, 423, 424, 426, 438, 457, 462, 469, 480, 485,
488, 491, 494, 497, 500, 505, 514, 506, 0, 99,
97, 95, 98, 396, 395, 107, 86, 106, 0, 126,
73, 75, 103, 0, 134, 0, 138, 0, 0, 0,
277, 0, 0, 0, 0, 0, 0, 0, 0, 341,
0, 0, 188, 0, 8, 14, 418, 0, 125, 193,
0, 0, 208, 185, 0, 189, 191, 0, 192, 197,
209, 0, 198, 210, 0, 199, 200, 211, 251, 0,
201, 0, 212, 202, 290, 0, 213, 214, 215, 217,
219, 216, 0, 218, 244, 243, 0, 241, 242, 239,
240, 238, 123, 121, 114, 0, 0, 0, 427, 418,
344, 346, 425, 430, 429, 434, 433, 432, 431, 0,
399, 0, 0, 0, 16, 0, 439, 436, 440, 437,
446, 0, 418, 0, 178, 0, 182, 0, 0, 0,
0, 0, 0, 93, 0, 0, 368, 0, 0, 422,
421, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 512, 513, 0, 140, 0, 139, 133, 102,
132, 137, 0, 227, 228, 226, 246, 0, 312, 0,
301, 299, 0, 309, 307, 0, 273, 0, 254, 0,
327, 0, 287, 0, 305, 303, 0, 316, 0, 0,
195, 0, 223, 221, 0, 0, 186, 190, 194, 418,
323, 222, 225, 0, 272, 0, 418, 292, 296, 289,
0, 0, 320, 0, 120, 119, 124, 122, 131, 130,
352, 356, 0, 398, 384, 383, 364, 0, 379, 389,
0, 380, 0, 365, 0, 0, 0, 18, 19, 349,
342, 179, 180, 0, 351, 355, 354, 400, 0, 376,
411, 0, 350, 353, 374, 348, 375, 397, 413, 0,
369, 0, 415, 0, 454, 451, 455, 452, 456, 453,
460, 458, 461, 459, 466, 463, 467, 464, 468, 465,
476, 471, 478, 473, 475, 470, 477, 472, 479, 0,
474, 483, 481, 484, 482, 487, 486, 490, 489, 493,
492, 496, 495, 499, 498, 503, 0, 0, 508, 507,
141, 418, 142, 0, 0, 146, 0, 247, 0, 313,
311, 302, 300, 310, 308, 274, 0, 255, 0, 0,
0, 324, 328, 0, 325, 288, 306, 304, 317, 0,
315, 342, 0, 196, 229, 0, 0, 0, 252, 0,
293, 0, 281, 0, 0, 322, 0, 406, 407, 0,
393, 0, 390, 381, 386, 382, 385, 366, 358, 0,
448, 442, 445, 0, 0, 443, 184, 181, 183, 401,
0, 412, 408, 0, 414, 409, 360, 0, 416, 410,
502, 0, 0, 143, 0, 0, 144, 248, 0, 275,
271, 0, 332, 0, 336, 335, 329, 326, 330, 0,
233, 0, 230, 231, 0, 0, 0, 257, 0, 261,
0, 264, 0, 298, 297, 283, 0, 295, 0, 321,
0, 404, 0, 392, 391, 0, 367, 357, 447, 441,
449, 444, 378, 377, 402, 0, 361, 362, 504, 501,
0, 145, 0, 0, 0, 245, 0, 197, 0, 204,
205, 0, 206, 207, 0, 256, 333, 0, 314, 234,
0, 0, 232, 270, 267, 268, 515, 0, 259, 262,
0, 258, 0, 265, 0, 0, 282, 0, 319, 318,
405, 373, 0, 403, 363, 0, 147, 0, 0, 0,
224, 276, 0, 334, 331, 237, 235, 0, 269, 266,
260, 0, 280, 0, 371, 0, 0, 148, 0, 249,
0, 0, 236, 278, 279, 150, 0, 0, 0, 0,
149, 0, 0, 0, 0, 285, 0, 250, 284, 0,
0, 0
};
static const short yydefgoto[] =
{
789, 209, 283, 210, 86, 87, 69, 61, 211, 212,
23, 24, 25, 8, 9, 10, 11, 12, 13, 14,
15, 450, 289, 133, 106, 48, 71, 105, 131, 159,
160, 161, 92, 115, 116, 117, 213, 163, 263, 93,
112, 179, 180, 290, 137, 184, 409, 165, 166, 167,
265, 168, 169, 411, 562, 563, 291, 18, 44, 73,
66, 108, 45, 64, 95, 96, 97, 98, 214, 367,
292, 172, 565, 732, 295, 296, 297, 298, 706, 299,
300, 301, 302, 709, 303, 304, 305, 306, 710, 307,
453, 308, 598, 668, 669, 670, 671, 309, 310, 712,
311, 312, 313, 713, 314, 315, 459, 676, 677, 316,
317, 318, 319, 320, 321, 322, 323, 581, 582, 583,
584, 215, 216, 217, 218, 219, 742, 685, 220, 498,
221, 222, 478, 479, 121, 223, 224, 225, 226, 227,
228, 229, 230, 231, 232, 233, 234, 235, 236, 237,
238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
248, 404, 499, 727
};
static const short yypact[] =
{
686,-32768,-32768, 470, -20, 473, 484,-32768,-32768, 369,
449, 668,-32768,-32768,-32768,-32768, 458,-32768,-32768,-32768,
-32768,-32768, 18,-32768,-32768,-32768, 357,-32768, 259,-32768,
54, 590,-32768,-32768, 716, 617,-32768, -20, 491,-32768,
-32768, 271,-32768, 506, -8, 3,-32768, 523, 177,-32768,
-32768, -20, 689, 375,-32768, 260,-32768, 29,-32768,-32768,
-32768,-32768, 138, 1342,-32768, 536, -8,-32768,-32768, 264,
541,-32768,-32768, -8, 3,-32768, 177,-32768,-32768,-32768,
546,-32768,-32768,-32768, 548, 174,-32768,-32768,-32768, 528,
988,-32768,-32768, 133,-32768, 1392,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768, 220, 230,-32768, -8,-32768,
-32768, 349, -15,-32768, 317, -43,-32768, 772, -15, 335,
240, 240,-32768, 605, 608,-32768,-32768,-32768,-32768, 621,
1050,-32768,-32768, 230, 886, 631, 46,-32768,-32768,-32768,
632, 2057, 51, 455,-32768,-32768, 77,-32768, -15,-32768,
398, -15,-32768,-32768,-32768,-32768, 373, 888,-32768, 1253,
-32768,-32768,-32768,-32768, 70,-32768, 392,-32768,-32768, 485,
-32768,-32768, 1777,-32768,-32768,-32768,-32768, 662, 507, 340,
-32768, 760,-32768,-32768, 502,-32768,-32768,-32768, 482,-32768,
-32768, 2765, 1189, 2817, 2883, 477, 26, 483,-32768, 2935,
3001, 3053, 5238,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
612, 516, 1101, 60,-32768, 527, 544,-32768,-32768,-32768,
676,-32768, 593, 499,-32768, 566, 466,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768, 954, 667, 1019, 1022, 777,
629, 737, 743, 761, 33,-32768,-32768,-32768, 610,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 906, 485,
-32768,-32768,-32768, 694,-32768, 392,-32768, 793, 258, 3119,
-32768, 85, 2109, 30, 270, 309, 251, 318, 162, 738,
3171, 5540,-32768, -20, 612, 516, 966, 554, 446,-32768,
760, 765,-32768,-32768, 1777,-32768,-32768, 695,-32768,-32768,
-32768, 1846,-32768,-32768, 749,-32768,-32768,-32768,-32768, 1846,
-32768, 1846,-32768,-32768, 5592, 762,-32768,-32768,-32768,-32768,
-32768,-32768, 337,-32768, 850, 931, 466, 784, 854,-32768,
-32768,-32768,-32768, 806,-32768, 758, 677, 682,-32768, 726,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 40,
-32768, 701, 982, 678, 678, 402,-32768,-32768,-32768,-32768,
-32768, 705, 1101, 17,-32768, 785,-32768, 755, 48, 802,
5304, 2175, 751,-32768, 437, 3237,-32768, 427, 3289,-32768,
-32768, 3355, 3407, 3473, 3525, 3591, 3643, 3709, 3761, 3827,
3879, 3945, 3997, 835, 4063, 4115, 4181, 4233, 4299, 4351,
4417, 2227,-32768,-32768, 4469,-32768, 419,-32768,-32768,-32768,
-32768,-32768, 1777,-32768,-32768,-32768,-32768, 4535,-32768, 134,
-32768,-32768, 143,-32768,-32768, 191,-32768, 4587,-32768, 4653,
-32768, 823,-32768, 5059,-32768,-32768, 208,-32768, 137, 247,
773, 588,-32768,-32768, -20, 2293,-32768,-32768,-32768, 1138,
507,-32768,-32768, 795,-32768, 831, 1014,-32768,-32768,-32768,
63, 2345,-32768, 4705,-32768,-32768,-32768, 806,-32768,-32768,
-32768,-32768, 198, 808, 809, 811,-32768, 2411, 678,-32768,
626, 678, 626,-32768, 2463, 4771, 102, 194, 311,-32768,
1076,-32768,-32768, 1991,-32768,-32768,-32768,-32768, 431,-32768,
-32768, 106,-32768,-32768,-32768,-32768,-32768, 825,-32768, 186,
-32768, 5356,-32768, 241,-32768,-32768,-32768,-32768,-32768,-32768,
-32768, 954,-32768, 954,-32768, 667,-32768, 667,-32768, 667,
-32768, 1019,-32768, 1019,-32768, 1019,-32768, 1019,-32768, 174,
-32768,-32768, 1022,-32768, 1022,-32768, 777,-32768, 629,-32768,
737,-32768, 743,-32768, 761,-32768, 934, 848,-32768,-32768,
-32768, 1036,-32768, 1777, 849,-32768, 1777,-32768, 278,-32768,
-32768,-32768,-32768,-32768,-32768,-32768, 302,-32768, 851, 451,
252, 823,-32768, 392,-32768,-32768,-32768,-32768,-32768, 5540,
-32768,-32768, 474, 773,-32768, 953, 64, 603,-32768, 860,
-32768, 5152,-32768, 5084, 862, 869, 871,-32768,-32768, 5422,
-32768, 244,-32768, 240,-32768, 240,-32768,-32768, 874, 78,
-32768,-32768,-32768, 4823, 5195,-32768,-32768,-32768,-32768,-32768,
4889,-32768,-32768, 5474,-32768,-32768, 230, 586,-32768,-32768,
-32768, 4941, 739,-32768, 1777, 2529,-32768,-32768, 1913,-32768,
-32768, 265,-32768, 781,-32768,-32768,-32768,-32768,-32768, 867,
-32768, 2581,-32768,-32768, 978, 261, 5007,-32768, 775,-32768,
1554,-32768, 5540,-32768,-32768,-32768, 884, 889, 5127,-32768,
269,-32768, 598,-32768,-32768, 230,-32768, 890,-32768,-32768,
-32768,-32768,-32768,-32768,-32768, 671,-32768, 230,-32768,-32768,
478,-32768, 213, 97, 480,-32768, 929, 938, 1913,-32768,
-32768, 1913,-32768,-32768, 898,-32768, 904, 907,-32768,-32768,
1004, 108,-32768,-32768,-32768,-32768,-32768, 330,-32768,-32768,
1629,-32768, 1698,-32768, 910, 1846,-32768, 912,-32768,-32768,
-32768,-32768, 230,-32768,-32768, 2647,-32768, 225, 4535, 1846,
-32768,-32768, 2699,-32768,-32768,-32768,-32768, 1008,-32768,-32768,
-32768, 913,-32768, 1846,-32768, 228, 111,-32768, 400,-32768,
5084, 914,-32768,-32768,-32768,-32768, 239, 1913, 927, 5127,
-32768, 967, 1913, 935, 1913,-32768, 1913,-32768,-32768, 1032,
1052,-32768
};
static const short yypgoto[] =
{
-32768,-32768, -39, -58, 660, 23, -112, 359, -57, -3,
-77,-32768, 144,-32768, 1044, 688,-32768, 266,-32768,-32768,
59, 11, 467,-32768,-32768, 1002, 986,-32768, -132,-32768,
905,-32768, -55, -111, 930, -160, -186,-32768,-32768, 124,
-27, 815, -325, -130, -1,-32768,-32768,-32768,-32768,-32768,
-32768,-32768, 917,-32768, -281,-32768, 666, 304,-32768,-32768,
-32768,-32768, 1026, 655,-32768, 972,-32768,-32768, 257,-32768,
-123, 820, -158, -163, -292,-32768, 776, 150, 235, -409,
212, -246,-32768,-32768,-32768, -306,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768, 421, 426, -620, -218,-32768,-32768,
-32768,-32768,-32768,-32768,-32768, -179,-32768, -595, 783,-32768,
-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 524,-32768,
534,-32768,-32768,-32768, 36,-32768,-32768,-32768,-32768, -430,
-32768,-32768, 750, 73, -73, 1177, 132, 1197, 234, 314,
444, 919, -165, 540, 687, -465,-32768, 556, 733, 646,
530, 720, 728, 725, 727, 732,-32768, 487, 729, 757,
-32768,-32768, 885,-32768
};
#define YYLAST 5703
static const short yytable[] =
{
22, 174, 447, 30, 181, 85, 88, 171, 458, 294,
465, 16, 120, 150, 293, 596, 366, 333, 489, 39,
16, 16, 16, 183, 84, 625, 342, 350, 346, 348,
77, 350, 85, 88, 357, 359, 171, 85, 88, 135,
62, 470, 16, 264, 62, 16, 16, 185, 400, 494,
733, 124, 250, 156, 619, 49, 84, 118, 139, 140,
89, 373, 62, 16, 600, 663, 60, 62, 21, 33,
68, 262, 85, 88, 90, 162, 85, 88, 253, 686,
156, 637, 156, 737, 136, 355, 420, 89, 60, 63,
33, 84, 89, 60, 33, 177, 148, 151, 663, 85,
88, 85, 88, 622, 162, 65, 90, 631, 471, 756,
733, 33, 756, 490, 284, 285, 495, 144, 124, 40,
84, 41, 401, 85, 88, -152, 62, 89, 181, 351,
78, 89, 62, 351, 125, 569, 446, 120, 588, 353,
410, 157, 336, 361, 571, 178, 186, 255, 26, 28,
257, 251, 60, 431, 89, 50, 89, 51, 68, 691,
664, -91, -91, 434, -291, 601, 630, -101, 266, 286,
157, -101, 440, 21, 687, 778, 467, 254, 89, 682,
630, 53, 55, 288, 783, 58, 421, 634, 339, 339,
339, 339, 573, 747, 62, 58, 339, 339, 362, 630,
85, 88, 145, 695, 757, 181, 632, 776, 324, 586,
630, 120, 19, 630, 662, 703, 515, 517, 519, 177,
354, 19, 19, 19, 111, 469, 722, 589, 114, 755,
70, 721, 85, 88, 126, 570, 284, 285, 590, 707,
772, 51, 638, 19, 572, 683, 19, 19, 489, 566,
21, 444, 430, 654, 164, 89, 284, 285, 407, 416,
46, 75, 723, 435, 19, 102, 715, 111, 114, 178,
738, 426, 56, 119, 447, 32, 57, 85, 88, 647,
480, 482, 643, 164, 188, 646, 635, 89, 487, 488,
623, 286, 574, 146, 607, 674, 177, 458, 449, 707,
32, 608, 707, 649, 325, 288, 449, 628, 449, 587,
428, 456, -62, -62, 746, 766, 287, -63, 138, 432,
621, 188, 129, 47, 47, 178, 767, 130, 717, 775,
324, 758, 89, 593, 62, 539, 88, 324, 462, 146,
780, 639, 173, 591, 684, 324, 178, 324, 154, 154,
324, 724, 447, 417, 284, 285, -62, -62, 42, 21,
68, -63, -253, 701, 377, 427, 154, 94, 707, -27,
1, 173, 458, 707, 648, 707, 72, 707, 339, 339,
339, 339, 339, 339, 339, 339, 339, 339, 339, 339,
89, 339, 339, 339, 339, 339, 339, 339, 650, 94,
644, 647, 708, 483, 429, 613, 326, 624, 615, 561,
146, -94, 134, 433, 2, 422, -94, -94, -94, -94,
759, 43, 436, 288, 100, 3, 325, 188, 510, 104,
711, 4, 463, 325, 170, 145, 334, 5, 287, 43,
447, 325, 335, 325, 134, 287, 325, -323, 324, -28,
1, 451, 652, 287, -153, 287, 252, 655, 689, 454,
658, 455, 708, 170, 458, 708, 120, 17, 258, 714,
7, 20, -155, 458, 27, 660, 17, 17, 17, 660,
188, 416, 339, 138, 352, 29, 327, 339, 153, 154,
711, 36, 54, 711, 2, 473, 777, 484, 17, 256,
140, 17, 17, 36, 696, 284, 285, 59, 284, 285,
506, 4, 379, 380, 38, 560, 58, 5, 507, 17,
37, 335, 511, 181, 67, 21, 38, 629, 326, 714,
91, 708, 714, 630, 79, 326, 708, 99, 708, 135,
708, -323, 103, 326, 325, 326, 653, 110, 326, 113,
7, 612, 36, 741, 612, 442, 287, 739, 21, 711,
286, 21, 91, 286, 711, 744, 711, 81, 711, 661,
82, 21, 21, 745, 288, 748, -94, 288, -94, 21,
349, -94, -94, -94, -94, 58, 284, 285, 188, 502,
-31, 1, -510, -510, 21, 85, 88, 158, 714, 324,
-22, -22, 324, 714, 337, 714, 147, 714, 327, 149,
764, 21, 284, 285, 177, 327, 328, -30, 1, 369,
339, 339, 152, 327, 21, 327, 158, 119, 327, 21,
374, 51, 182, 187, 21, 2, 21, 324, 339, 324,
396, 286, -22, 375, 443, 449, 326, -22, -22, -22,
89, 665, 4, -22, 592, 288, 503, -22, 5, -511,
-511, 504, 2, 332, 178, 505, 666, 286, -26, 1,
384, 385, 284, 285, 284, 285, 21, 376, 466, 4,
324, 288, 697, 468, 324, 5, -25, 1, 630, -32,
1, 7, 378, 21, 740, 325, 21, 31, 325, 35,
630, 667, 472, 402, 403, 449, 324, 287, 449, 21,
287, 119, 329, 2, 324, 368, -29, 1, 7, 21,
21, 101, 52, 202, 3, 146, 327, 286, 107, 286,
4, 2, 449, 325, 2, 325, 5, 614, 328, 616,
502, 288, 3, 288, 324, 328, 449, 324, 4, 397,
21, 4, 502, 328, 5, 328, 398, 5, 328, 464,
449, 2, 6, 132, 21, 21, 324, 743, 324, 7,
21, 324, 3, 630, 449, 399, 325, 477, 4, 449,
325, 449, 716, 449, 5, 324, 58, 7, 287, 21,
7, 154, 287, 394, 395, 408, 448, 326, 705, 324,
326, 485, 325, 2, 486, 700, 324, 503, 368, 79,
325, 79, 504, 324, 287, 324, 505, 7, 324, 503,
324, 370, 324, 665, 504, 371, 2, 21, 505, 372,
-419, -419, 79, -151, 329, 326, 538, 326, 666, 21,
325, 329, 81, 325, 81, 82, 21, 82, 21, 329,
452, 329, 287, 492, 329, 287, 328, 493, 451, 330,
445, 454, 325, 461, 325, 81, 141, 325, 82, 21,
496, 142, 143, 728, 287, 140, 287, 327, 326, 287,
327, 325, 326, 491, 579, 762, 79, 175, 580, 122,
413, 414, 597, 287, 415, 325, -343, -343, 599, 769,
-420, -420, 325, 609, 326, 142, 143, 287, -388, 325,
-387, 325, 326, 774, 325, 327, 325, 327, 325, 81,
633, 287, 82, 21, 542, 544, 287, 705, 287, 331,
287, 2, 762, 36, 769, 640, 774, 79, 641, 79,
521, 523, 326, 750, 645, 326, 751, 651, 123, -343,
37, 2, 329, -343, 662, 672, 38, 79, 327, 381,
382, 383, 327, 678, 326, 679, 326, 680, 718, 326,
81, -372, 81, 82, 21, 82, 21, -345, -345, 722,
735, 330, 176, 326, 327, -135, 749, -370, 330, 122,
81, 601, 327, 82, 21, -203, 330, 326, 330, 752,
753, 330, 405, 754, 326, 755, 761, 328, 763, 772,
328, 326, 781, 326, 773, 779, 326, 785, 326, 787,
326, 788, 327, 782, 784, 327, 249, 386, 387, 388,
-345, 786, 790, 36, -345, 531, 533, 535, 537, 79,
389, 390, 391, 392, 327, 328, 327, 328, 123, 327,
37, 331, 791, 540, -15, 34, 38, 76, 331, -509,
-509, 370, 109, 327, 261, 371, 331, 128, 331, 441,
189, 331, 81, 406, 259, 82, 21, 327, 564, 74,
393, 474, 475, 476, 327, 412, 363, 249, 328, 729,
457, 327, 328, 327, 730, 2, 327, 460, 327, 330,
327, 79, -15, 329, 481, 656, 329, -509, -509, 370,
80, 344, 4, 371, 328, 657, 546, 372, 5, 525,
527, 529, 328, 550, -15, 548, 552, 79, 699, -509,
-509, 370, 554, 559, 81, 371, 195, 82, 21, 642,
0, 329, 196, 329, 0, 0, 0, 154, 155, 197,
0, 7, 328, 198, 419, 328, 0, 425, 0, 0,
81, 0, 0, 82, 21, 438, 439, 199, 200, 331,
0, 201, 0, 0, 328, 0, 328, 0, 0, 328,
203, 204, 205, 206, 329, 0, 207, 208, 329, 0,
343, 0, 191, 328, -509, -509, 370, 0, 0, 0,
371, 0, 0, 0, 372, 0, 0, 328, 0, 0,
329, 0, 0, 0, 328, 0, 0, 0, 329, 0,
0, 328, 0, 328, 0, 0, 328, 0, 328, 0,
328, -509, -509, 370, 0, 193, 194, 371, 0, 0,
79, 441, 0, 0, 0, 0, 0, 0, 329, 195,
330, 329, 0, 330, 0, 196, 501, 0, 0, 0,
509, 0, 197, 513, 0, 0, 198, 0, 0, 0,
329, 0, 329, 81, 0, 329, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 557, 0, 330, 329,
330, 0, 0, 203, 204, 205, 206, 0, 2, 207,
208, 0, 568, 329, 79, 0, 0, 0, 0, 0,
329, 0, 576, 80, 578, 4, 0, 329, 0, 329,
331, 5, 329, 331, 329, 0, 329, 0, 0, 0,
0, 330, 0, 0, 0, 330, 0, 81, 0, 0,
82, 21, 0, 0, 0, 0, 604, 0, 606, 0,
154, 260, 0, 0, 7, 0, 0, 330, 331, 0,
331, 0, 611, 0, 0, 330, 0, 0, 340, 340,
340, 340, 0, 0, 0, 0, 340, 340, 249, 0,
0, 0, 0, 0, 0, 0, 0, 2, 341, 341,
341, 341, 0, 79, 0, 330, 341, 341, 330, 0,
0, 331, 80, 0, 4, 331, 0, 0, 0, 0,
5, 0, 0, 0, 0, 0, 0, 330, 0, 330,
0, 0, 330, 0, 0, 0, 81, 331, 0, 82,
21, 0, 0, 0, 0, 331, 330, 2, 0, 0,
83, 0, 0, 79, 0, 0, 0, 0, 0, 0,
330, 0, 80, 0, 4, 0, 0, 330, 0, 0,
5, 0, 0, 0, 330, 331, 330, 0, 331, 330,
0, 330, 0, 330, 659, 0, 81, 0, 0, 82,
21, 0, 0, 0, 0, 0, 0, 331, 0, 331,
127, 0, 331, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 331, 0, 0, 0,
0, 0, 0, 0, 0, 693, 0, 0, 0, 0,
331, 0, 0, 0, 0, 0, 0, 331, 0, 0,
0, 0, 0, 0, 331, 0, 331, 0, 0, 331,
0, 331, 0, 331, 0, 0, 0, 0, 0, 0,
0, 726, 0, 0, 0, 267, 0, 734, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
0, 340, 340, 340, 340, 340, 340, 340, 341, 341,
341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
0, 341, 341, 341, 341, 341, 341, 341, 0, 2,
193, 194, 665, 268, 269, 79, 270, 0, 0, 271,
0, 0, 0, 272, 195, 0, 0, 666, 0, 0,
273, 274, 5, 275, 0, 276, 277, 197, 278, 0,
267, 279, 280, 768, 0, 0, 0, 771, 81, 0,
0, 82, 21, 0, 0, 0, 0, 0, 0, 281,
0, 154, 731, 0, 0, 7, 0, 0, 203, 204,
205, 206, 340, 0, 207, 208, 0, 340, 0, 0,
0, 0, 0, 0, 2, 193, 194, 665, 268, 269,
79, 270, 341, 0, 271, 0, 0, 341, 272, 195,
0, 0, 666, 0, 0, 273, 274, 5, 275, 267,
276, 277, 197, 278, 0, 0, 279, 280, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
0, 0, 0, 0, 281, 0, 154, 760, 0, 0,
7, 0, 0, 203, 204, 205, 206, 0, 0, 207,
208, 0, 0, 2, 193, 194, -263, 268, 269, 79,
270, 0, 0, 271, 0, 0, 0, 272, 195, 0,
0, -263, 0, 0, 273, 274, 5, 275, 0, 276,
277, 197, 278, 0, 0, 279, 280, 0, 267, 0,
0, 0, 81, 0, 0, 82, 21, 0, 0, 0,
0, 0, 0, 281, 0, 154, -263, 0, 0, 7,
340, 340, 203, 204, 205, 206, 0, 0, 207, 208,
0, 0, 0, 0, 0, 0, 0, 0, 340, 0,
341, 341, 2, 193, 194, 0, 268, 269, 79, 270,
0, 0, 271, 0, 0, 0, 272, 195, 341, 0,
0, 0, 0, 273, 274, 5, 275, 267, 276, 277,
197, 278, 0, 0, 279, 280, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 0, 0,
0, 0, 281, 0, 154, 282, 0, 0, 7, 0,
0, 203, 204, 205, 206, 0, 0, 207, 208, 0,
0, 2, 193, 194, 0, 268, 269, 79, 270, 0,
0, 271, 0, 0, 0, 272, 195, 0, 0, 0,
0, 0, 273, 274, 267, 275, 0, 276, 277, 197,
278, 0, 0, 279, 280, 0, 0, 0, 0, 0,
81, 0, 0, 82, 21, 0, 0, 0, 0, 0,
0, 281, 0, 154, 0, 0, 0, 7, 0, 0,
203, 204, 205, 206, 0, 0, 207, 208, 2, 193,
194, 0, 704, 269, 79, 270, 0, 0, 271, 0,
0, 0, 272, 195, 0, 0, 0, 0, 0, 273,
274, 0, 275, 0, 276, 277, 197, 278, 0, 0,
279, 280, 626, 0, 191, 192, 0, 81, 0, 0,
82, 21, 0, 0, 0, 0, 0, 0, 281, 0,
154, 0, 0, 0, 7, 0, 0, 203, 204, 205,
206, 0, 0, 207, 208, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 193, 194, 0,
0, 0, 79, 0, 0, 0, 0, 0, 0, 0,
0, 195, 0, 0, 0, 0, 0, 196, 190, 0,
191, 192, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 202, 627,
0, 0, 0, 0, 0, 203, 204, 205, 206, 0,
0, 207, 208, 193, 194, 0, 0, 0, 79, 0,
423, 0, 191, 192, 0, 0, 0, 195, 0, 0,
0, 0, 0, 196, 0, 0, 0, 0, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, 202, 193, 194, 0, 0, 0,
79, 203, 204, 205, 206, 0, 0, 207, 208, 195,
0, 0, 0, 0, 0, 196, 500, 0, 191, 192,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 0, 0, 0,
424, 0, 0, 203, 204, 205, 206, 0, 0, 207,
208, 193, 194, 0, 0, 0, 79, 0, 555, 0,
191, 192, 0, 0, 0, 195, 0, 0, 0, 0,
0, 196, 0, 0, 0, 0, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 193, 194, 145, 0, 0, 79, 203,
204, 205, 206, 0, 0, 207, 208, 195, 0, 0,
0, 0, 0, 196, 594, 0, 191, 192, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 556, 199, 200,
0, 0, 201, 0, 0, 0, 0, 0, 0, 0,
0, 203, 204, 205, 206, 0, 0, 207, 208, 193,
194, 0, 0, 0, 79, 0, 602, 0, 191, 192,
0, 0, 0, 195, 0, 0, 0, 0, 0, 196,
0, 0, 0, 0, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 595,
0, 193, 194, 0, 0, 0, 79, 203, 204, 205,
206, 0, 0, 207, 208, 195, 0, 0, 0, 0,
0, 196, 610, 0, 191, 192, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 0, 0, 0, 603, 0, 0, 203,
204, 205, 206, 0, 0, 207, 208, 193, 194, 0,
0, 0, 79, 0, 617, 0, 191, 192, 0, 0,
0, 195, 0, 0, 0, 0, 0, 196, 0, 0,
0, 0, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 193,
194, 145, 0, 0, 79, 203, 204, 205, 206, 0,
0, 207, 208, 195, 0, 0, 0, 0, 0, 196,
594, 0, 191, 192, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 618,
0, 0, 0, 0, 0, 0, 0, 203, 204, 205,
206, 0, 0, 207, 208, 193, 194, 0, 0, 0,
79, 0, 719, 0, 191, 192, 0, 0, 0, 195,
0, 0, 0, 0, 0, 196, 0, 0, 0, 0,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 702, 0, 193, 194, 0,
0, 0, 79, 203, 204, 205, 206, 0, 0, 207,
208, 195, 0, 0, 0, 0, 0, 196, 719, 0,
191, 192, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 720, 0, 0,
0, 0, 0, 0, 0, 203, 204, 205, 206, 0,
0, 207, 208, 193, 194, 0, 0, 0, 79, 0,
602, 0, 191, 192, 0, 0, 0, 195, 0, 0,
0, 0, 0, 196, 0, 0, 0, 0, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 765, 0, 193, 194, 0, 0, 0,
79, 203, 204, 205, 206, 0, 0, 207, 208, 195,
0, 0, 0, 0, 0, 196, 338, 0, 191, 192,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 0, 0, 0,
770, 0, 0, 203, 204, 205, 206, 0, 0, 207,
208, 193, 194, 0, 0, 0, 79, 0, 345, 0,
191, 192, 0, 0, 0, 195, 0, 0, 0, 0,
0, 196, 0, 0, 0, 0, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 193, 194, 0, 0, 0, 79, 203,
204, 205, 206, 0, 0, 207, 208, 195, 0, 0,
0, 0, 0, 196, 347, 0, 191, 192, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, 0, 0, 0, 0, 0, 0,
0, 203, 204, 205, 206, 0, 0, 207, 208, 193,
194, 0, 0, 0, 79, 0, 356, 0, 191, 192,
0, 0, 0, 195, 0, 0, 0, 0, 0, 196,
0, 0, 0, 0, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 0,
0, 193, 194, 0, 0, 0, 79, 203, 204, 205,
206, 0, 0, 207, 208, 195, 0, 0, 0, 0,
0, 196, 358, 0, 191, 192, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 0, 0, 0, 0, 0, 0, 203,
204, 205, 206, 0, 0, 207, 208, 193, 194, 0,
0, 0, 79, 0, 360, 0, 191, 192, 0, 0,
0, 195, 0, 0, 0, 0, 0, 196, 0, 0,
0, 0, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 193,
194, 0, 0, 0, 79, 203, 204, 205, 206, 0,
0, 207, 208, 195, 0, 0, 0, 0, 0, 196,
418, 0, 191, 192, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 0,
0, 0, 0, 0, 0, 0, 0, 203, 204, 205,
206, 0, 0, 207, 208, 193, 194, 0, 0, 0,
79, 0, 437, 0, 191, 192, 0, 0, 0, 195,
0, 0, 0, 0, 0, 196, 0, 0, 0, 0,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 193, 194, 0,
0, 0, 79, 203, 204, 205, 206, 0, 0, 207,
208, 195, 0, 0, 0, 0, 0, 196, 508, 0,
191, 192, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 0,
0, 0, 0, 0, 0, 203, 204, 205, 206, 0,
0, 207, 208, 193, 194, 0, 0, 0, 79, 0,
512, 0, 191, 192, 0, 0, 0, 195, 0, 0,
0, 0, 0, 196, 0, 0, 0, 0, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, 0, 193, 194, 0, 0, 0,
79, 203, 204, 205, 206, 0, 0, 207, 208, 195,
0, 0, 0, 0, 0, 196, 514, 0, 191, 192,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 0, 0, 0,
0, 0, 0, 203, 204, 205, 206, 0, 0, 207,
208, 193, 194, 0, 0, 0, 79, 0, 516, 0,
191, 192, 0, 0, 0, 195, 0, 0, 0, 0,
0, 196, 0, 0, 0, 0, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 193, 194, 0, 0, 0, 79, 203,
204, 205, 206, 0, 0, 207, 208, 195, 0, 0,
0, 0, 0, 196, 518, 0, 191, 192, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, 0, 0, 0, 0, 0, 0,
0, 203, 204, 205, 206, 0, 0, 207, 208, 193,
194, 0, 0, 0, 79, 0, 520, 0, 191, 192,
0, 0, 0, 195, 0, 0, 0, 0, 0, 196,
0, 0, 0, 0, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 0,
0, 193, 194, 0, 0, 0, 79, 203, 204, 205,
206, 0, 0, 207, 208, 195, 0, 0, 0, 0,
0, 196, 522, 0, 191, 192, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 0, 0, 0, 0, 0, 0, 203,
204, 205, 206, 0, 0, 207, 208, 193, 194, 0,
0, 0, 79, 0, 524, 0, 191, 192, 0, 0,
0, 195, 0, 0, 0, 0, 0, 196, 0, 0,
0, 0, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 193,
194, 0, 0, 0, 79, 203, 204, 205, 206, 0,
0, 207, 208, 195, 0, 0, 0, 0, 0, 196,
526, 0, 191, 192, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 0,
0, 0, 0, 0, 0, 0, 0, 203, 204, 205,
206, 0, 0, 207, 208, 193, 194, 0, 0, 0,
79, 0, 528, 0, 191, 192, 0, 0, 0, 195,
0, 0, 0, 0, 0, 196, 0, 0, 0, 0,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 193, 194, 0,
0, 0, 79, 203, 204, 205, 206, 0, 0, 207,
208, 195, 0, 0, 0, 0, 0, 196, 530, 0,
191, 192, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 0,
0, 0, 0, 0, 0, 203, 204, 205, 206, 0,
0, 207, 208, 193, 194, 0, 0, 0, 79, 0,
532, 0, 191, 192, 0, 0, 0, 195, 0, 0,
0, 0, 0, 196, 0, 0, 0, 0, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, 0, 193, 194, 0, 0, 0,
79, 203, 204, 205, 206, 0, 0, 207, 208, 195,
0, 0, 0, 0, 0, 196, 534, 0, 191, 192,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 0, 0, 0,
0, 0, 0, 203, 204, 205, 206, 0, 0, 207,
208, 193, 194, 0, 0, 0, 79, 0, 536, 0,
191, 192, 0, 0, 0, 195, 0, 0, 0, 0,
0, 196, 0, 0, 0, 0, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 193, 194, 0, 0, 0, 79, 203,
204, 205, 206, 0, 0, 207, 208, 195, 0, 0,
0, 0, 0, 196, 541, 0, 191, 192, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, 0, 0, 0, 0, 0, 0,
0, 203, 204, 205, 206, 0, 0, 207, 208, 193,
194, 0, 0, 0, 79, 0, 543, 0, 191, 192,
0, 0, 0, 195, 0, 0, 0, 0, 0, 196,
0, 0, 0, 0, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 0,
0, 193, 194, 0, 0, 0, 79, 203, 204, 205,
206, 0, 0, 207, 208, 195, 0, 0, 0, 0,
0, 196, 545, 0, 191, 192, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 0, 0, 0, 0, 0, 0, 203,
204, 205, 206, 0, 0, 207, 208, 193, 194, 0,
0, 0, 79, 0, 547, 0, 191, 192, 0, 0,
0, 195, 0, 0, 0, 0, 0, 196, 0, 0,
0, 0, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 193,
194, 0, 0, 0, 79, 203, 204, 205, 206, 0,
0, 207, 208, 195, 0, 0, 0, 0, 0, 196,
549, 0, 191, 192, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 0,
0, 0, 0, 0, 0, 0, 0, 203, 204, 205,
206, 0, 0, 207, 208, 193, 194, 0, 0, 0,
79, 0, 551, 0, 191, 192, 0, 0, 0, 195,
0, 0, 0, 0, 0, 196, 0, 0, 0, 0,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 193, 194, 0,
0, 0, 79, 203, 204, 205, 206, 0, 0, 207,
208, 195, 0, 0, 0, 0, 0, 196, 553, 0,
191, 192, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 0,
0, 0, 0, 0, 0, 203, 204, 205, 206, 0,
0, 207, 208, 193, 194, 0, 0, 0, 79, 0,
558, 0, 191, 192, 0, 0, 0, 195, 0, 0,
0, 0, 0, 196, 0, 0, 0, 0, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, 0, 193, 194, 0, 0, 0,
79, 203, 204, 205, 206, 0, 0, 207, 208, 195,
0, 0, 0, 0, 0, 196, 567, 0, 191, 192,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 0, 0, 0,
0, 0, 0, 203, 204, 205, 206, 0, 0, 207,
208, 193, 194, 0, 0, 0, 79, 0, 575, 0,
191, 192, 0, 0, 0, 195, 0, 0, 0, 0,
0, 196, 0, 0, 0, 0, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 193, 194, 0, 0, 0, 79, 203,
204, 205, 206, 0, 0, 207, 208, 195, 0, 0,
0, 0, 0, 196, 577, 0, 191, 192, 0, 0,
197, 0, 0, 0, 198, 0, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, 0, 0, 0, 0, 0, 0,
0, 203, 204, 205, 206, 0, 0, 207, 208, 193,
194, 0, 0, 0, 79, 0, 605, 0, 191, 192,
0, 0, 0, 195, 0, 0, 0, 0, 0, 196,
0, 0, 0, 0, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 0,
0, 193, 194, 0, 0, 0, 79, 203, 204, 205,
206, 0, 0, 207, 208, 195, 0, 0, 0, 0,
0, 196, 620, 0, 191, 192, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 0, 0, 199, 200, 0, 0,
201, 0, 0, 0, 0, 0, 0, 0, 0, 203,
204, 205, 206, 0, 0, 207, 208, 193, 194, 0,
0, 0, 79, 0, 688, 0, 191, 192, 0, 0,
0, 195, 0, 0, 0, 0, 0, 196, 0, 0,
0, 0, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 193,
194, 0, 0, 0, 79, 203, 204, 205, 206, 0,
0, 207, 208, 195, 0, 0, 0, 0, 0, 196,
692, 0, 191, 192, 0, 0, 197, 0, 0, 0,
198, 0, 0, 0, 0, 0, 0, 81, 0, 0,
82, 21, 0, 0, 199, 200, 0, 0, 201, 0,
0, 0, 0, 0, 0, 0, 0, 203, 204, 205,
206, 0, 0, 207, 208, 193, 194, 0, 0, 0,
79, 0, 698, 0, 191, 192, 0, 0, 0, 195,
0, 0, 0, 0, 0, 196, 0, 0, 0, 0,
0, 0, 197, 0, 0, 0, 198, 0, 0, 0,
0, 0, 0, 81, 0, 0, 82, 21, 0, 0,
199, 200, 0, 0, 201, 0, 0, 193, 194, 0,
0, 0, 79, 203, 204, 205, 206, 0, 0, 207,
208, 195, 0, 0, 0, 0, 0, 196, 725, 0,
191, 192, 0, 0, 197, 0, 0, 0, 198, 0,
0, 0, 0, 0, 0, 81, 0, 0, 82, 21,
0, 0, 199, 200, 0, 0, 201, 0, 0, 0,
0, 0, 0, 0, 0, 203, 204, 205, 206, 0,
0, 207, 208, 193, 194, 0, 0, 0, 79, 0,
585, 0, 0, 0, 0, 0, 0, 195, 0, 0,
0, 0, 0, 196, 0, 0, 0, 0, 0, 0,
197, 0, 0, 0, 198, 675, 0, 0, 0, 0,
0, 81, 0, 0, 82, 21, 0, 0, 199, 200,
0, 0, 201, 0, -286, -286, -286, 0, 0, 0,
-286, 203, 204, 205, 206, 0, 0, 207, 208, -286,
0, 0, 0, 0, 0, -286, 0, 0, 736, 0,
193, 194, -286, 0, 0, 79, -286, 0, 0, 0,
0, 0, 0, -286, 195, 0, -286, -286, 0, 0,
196, 0, 0, 673, -286, 0, 0, 197, 0, 0,
-286, 198, 0, -286, -286, -286, -286, 0, 81, -286,
-286, 82, 21, 193, 194, 0, 0, 0, 79, 281,
-294, 0, 0, 0, 0, 0, 0, 195, 203, 204,
205, 206, 0, 196, 207, 208, 690, 0, 193, 194,
197, 0, 0, 79, 198, 0, 0, 0, 0, 0,
0, 81, 195, 0, 82, 21, 0, 0, 196, 0,
0, 0, 281, -294, 0, 197, 0, 0, 0, 198,
0, 203, 204, 205, 206, 0, 81, 207, 208, 82,
21, 191, 192, 0, 0, 0, 79, 281, 0, 0,
0, 0, 0, 0, 0, 195, 203, 204, 205, 206,
0, 196, 207, 208, 0, 0, 0, 0, 197, 0,
0, 0, 198, 0, 0, 0, 0, 0, 0, 81,
0, 0, 82, 21, 193, 194, 199, 200, 0, 79,
201, 0, 0, 0, 0, 0, 0, 0, 195, 203,
204, 205, 206, 0, 196, 207, 208, 191, 192, 0,
0, 197, 0, 0, 0, 198, 0, 0, 0, 0,
0, 0, 81, 0, 0, 82, 21, 0, 0, 199,
200, 0, 0, 201, 0, 202, 364, 0, 0, 0,
365, 0, 203, 204, 205, 206, 0, 0, 207, 208,
193, 194, 0, 0, 0, 79, 0, 0, 0, 191,
192, 0, 0, 0, 195, 0, 0, 0, 0, 0,
196, 0, 0, 0, 0, 0, 0, 197, 0, 0,
0, 198, 0, 0, 0, 0, 0, 0, 81, 0,
0, 82, 21, 0, 0, 199, 200, 0, 0, 201,
497, 0, 193, 194, 0, 0, 0, 79, 203, 204,
205, 206, 0, 0, 207, 208, 195, 0, 0, 0,
0, 0, 196, 0, 0, 191, 192, 0, 0, 197,
0, 0, 0, 198, 0, 0, 0, 0, 0, 0,
81, 0, 0, 82, 21, 0, 0, 199, 200, 0,
0, 201, 636, 0, 0, 0, 0, 0, 0, 0,
203, 204, 205, 206, 0, 0, 207, 208, 193, 194,
0, 0, 0, 79, 0, 0, 0, 191, 192, 0,
0, 0, 195, 0, 0, 0, 0, 0, 196, 0,
0, 0, 0, 0, 0, 197, 0, 0, 0, 198,
0, 0, 0, 0, 0, 0, 81, 0, 0, 82,
21, 0, 0, 199, 200, 0, 0, 201, 681, 0,
193, 194, 0, 0, 0, 79, 203, 204, 205, 206,
0, 0, 207, 208, 195, 0, 0, 0, 0, 0,
196, 0, 0, 191, 192, 0, 0, 197, 0, 0,
0, 198, 0, 0, 0, 0, 0, 0, 81, 0,
0, 82, 21, 0, 0, 199, 200, 0, 0, 201,
694, 0, 0, 0, 0, 0, 0, 0, 203, 204,
205, 206, 0, 0, 207, 208, 193, 194, 0, 0,
0, 79, 0, 0, 0, 0, 0, 0, 0, 0,
195, 0, 0, 0, 0, 0, 196, 0, 0, 0,
0, 0, 0, 197, 0, 0, 0, 198, 0, 0,
0, 0, 0, 0, 81, 0, 0, 82, 21, 0,
0, 199, 200, 0, 0, 201, 0, 2, 193, 194,
0, 0, 0, 79, 203, 204, 205, 206, 0, 0,
207, 208, 195, 0, 0, 0, 0, 0, 196, 0,
0, 0, 0, 0, 0, 197, 0, 0, 0, 198,
0, 0, 0, 0, 0, 0, 81, 0, 0, 82,
21, 0, 0, 0, 0, 0, 0, 281, 0, 0,
0, 0, 0, 0, 0, 0, 203, 204, 205, 206,
0, 0, 207, 208
};
static const short yycheck[] =
{
3, 133, 294, 6, 134, 63, 63, 130, 314, 172,
335, 0, 85, 124, 172, 445, 202, 177, 1, 1,
9, 10, 11, 135, 63, 490, 191, 1, 193, 194,
1, 1, 90, 90, 199, 200, 159, 95, 95, 54,
43, 1, 31, 166, 47, 34, 35, 1, 15, 1,
670, 90, 1, 130, 484, 1, 95, 84, 101, 102,
63, 1, 65, 52, 1, 1, 43, 70, 88, 10,
47, 1, 130, 130, 63, 130, 134, 134, 1, 1,
157, 511, 159, 678, 99, 197, 1, 90, 65, 97,
31, 130, 95, 70, 35, 134, 123, 124, 1, 157,
157, 159, 159, 1, 159, 102, 95, 1, 68, 1,
730, 52, 1, 96, 172, 172, 68, 118, 157, 101,
159, 103, 89, 181, 181, 95, 129, 130, 258, 103,
101, 134, 135, 103, 1, 1, 294, 210, 1, 197,
263, 130, 181, 201, 1, 134, 100, 148, 4, 5,
151, 100, 129, 276, 157, 101, 159, 103, 135, 624,
96, 101, 102, 1, 101, 102, 102, 97, 169, 172,
159, 101, 283, 88, 96, 770, 336, 100, 181, 609,
102, 37, 38, 172, 779, 41, 101, 1, 191, 192,
193, 194, 1, 96, 197, 51, 199, 200, 201, 102,
258, 258, 100, 633, 96, 335, 100, 96, 172, 1,
102, 284, 0, 102, 1, 645, 381, 382, 383, 258,
197, 9, 10, 11, 80, 337, 1, 90, 84, 1,
53, 661, 290, 290, 101, 101, 294, 294, 101, 648,
1, 103, 1, 31, 101, 1, 34, 35, 1, 412,
88, 290, 1, 1, 130, 258, 314, 314, 259, 1,
1, 1, 1, 101, 52, 1, 1, 123, 124, 258,
1, 1, 1, 99, 566, 9, 5, 335, 335, 1,
353, 354, 563, 159, 140, 566, 100, 290, 361, 362,
96, 294, 101, 99, 96, 601, 335, 603, 301, 708,
34, 103, 711, 1, 172, 294, 309, 493, 311, 101,
1, 314, 53, 53, 101, 745, 172, 53, 1, 1,
485, 177, 102, 64, 64, 314, 101, 97, 653, 101,
294, 1, 335, 444, 337, 393, 393, 301, 1, 99,
101, 100, 130, 96, 100, 309, 335, 311, 97, 97,
314, 90, 644, 95, 412, 412, 97, 97, 1, 88,
337, 97, 97, 644, 220, 95, 97, 63, 777, 0,
1, 159, 678, 782, 96, 784, 1, 786, 381, 382,
383, 384, 385, 386, 387, 388, 389, 390, 391, 392,
393, 394, 395, 396, 397, 398, 399, 400, 96, 95,
563, 1, 648, 1, 95, 478, 172, 96, 481, 412,
99, 94, 95, 95, 45, 271, 99, 100, 101, 102,
90, 64, 278, 412, 65, 56, 294, 283, 1, 70,
648, 62, 95, 301, 130, 100, 96, 68, 294, 64,
732, 309, 102, 311, 95, 301, 314, 1, 412, 0,
1, 301, 1, 309, 97, 311, 1, 580, 623, 309,
583, 311, 708, 159, 770, 711, 539, 0, 95, 648,
101, 1, 97, 779, 1, 1, 9, 10, 11, 1,
336, 1, 485, 1, 1, 1, 172, 490, 129, 97,
708, 45, 1, 711, 45, 351, 96, 95, 31, 101,
102, 34, 35, 45, 636, 563, 563, 1, 566, 566,
73, 62, 46, 47, 68, 96, 372, 68, 374, 52,
62, 102, 95, 653, 1, 88, 68, 96, 294, 708,
63, 777, 711, 102, 51, 301, 782, 1, 784, 54,
786, 95, 1, 309, 412, 311, 95, 1, 314, 1,
101, 478, 45, 685, 481, 1, 412, 680, 88, 777,
563, 88, 95, 566, 782, 697, 784, 84, 786, 95,
87, 88, 88, 95, 563, 95, 94, 566, 96, 88,
103, 99, 100, 101, 102, 441, 644, 644, 444, 1,
0, 1, 93, 94, 88, 653, 653, 130, 777, 563,
46, 47, 566, 782, 102, 784, 1, 786, 294, 1,
742, 88, 670, 670, 653, 301, 172, 0, 1, 103,
623, 624, 1, 309, 88, 311, 159, 99, 314, 88,
103, 103, 1, 1, 88, 45, 88, 601, 641, 603,
11, 644, 88, 99, 90, 648, 412, 93, 94, 95,
653, 48, 62, 99, 66, 644, 68, 103, 68, 93,
94, 73, 45, 1, 653, 77, 63, 670, 0, 1,
3, 4, 730, 730, 732, 732, 88, 1, 1, 62,
644, 670, 96, 1, 648, 68, 0, 1, 102, 0,
1, 101, 99, 88, 96, 563, 88, 9, 566, 11,
102, 98, 1, 93, 94, 708, 670, 563, 711, 88,
566, 99, 172, 45, 678, 103, 0, 1, 101, 88,
88, 66, 34, 97, 56, 99, 412, 730, 73, 732,
62, 45, 735, 601, 45, 603, 68, 480, 294, 482,
1, 730, 56, 732, 708, 301, 749, 711, 62, 12,
88, 62, 1, 309, 68, 311, 13, 68, 314, 1,
763, 45, 76, 108, 88, 88, 730, 96, 732, 101,
88, 735, 56, 102, 777, 14, 644, 99, 62, 782,
648, 784, 1, 786, 68, 749, 642, 101, 644, 88,
101, 97, 648, 16, 17, 101, 101, 563, 648, 763,
566, 96, 670, 45, 99, 66, 770, 68, 103, 51,
678, 51, 73, 777, 670, 779, 77, 101, 782, 68,
784, 95, 786, 48, 73, 99, 45, 88, 77, 103,
46, 47, 51, 95, 294, 601, 1, 603, 63, 88,
708, 301, 84, 711, 84, 87, 88, 87, 88, 309,
101, 311, 708, 98, 314, 711, 412, 102, 708, 172,
95, 711, 730, 101, 732, 84, 94, 735, 87, 88,
68, 99, 100, 98, 730, 102, 732, 563, 644, 735,
566, 749, 648, 98, 61, 735, 51, 1, 65, 1,
97, 98, 97, 749, 101, 763, 46, 47, 67, 749,
46, 47, 770, 95, 670, 99, 100, 763, 99, 777,
99, 779, 678, 763, 782, 601, 784, 603, 786, 84,
95, 777, 87, 88, 394, 395, 782, 777, 784, 172,
786, 45, 782, 45, 784, 1, 786, 51, 90, 51,
384, 385, 708, 708, 95, 711, 711, 96, 60, 99,
62, 45, 412, 103, 1, 95, 68, 51, 644, 5,
6, 7, 648, 101, 730, 96, 732, 96, 101, 735,
84, 97, 84, 87, 88, 87, 88, 46, 47, 1,
96, 294, 96, 749, 670, 97, 57, 97, 301, 1,
84, 102, 678, 87, 88, 57, 309, 763, 311, 101,
96, 314, 96, 96, 770, 1, 96, 563, 96, 1,
566, 777, 777, 779, 101, 101, 782, 782, 784, 784,
786, 786, 708, 96, 57, 711, 141, 8, 9, 10,
99, 96, 0, 45, 103, 389, 390, 391, 392, 51,
18, 19, 20, 21, 730, 601, 732, 603, 60, 735,
62, 294, 0, 393, 88, 11, 68, 55, 301, 93,
94, 95, 76, 749, 159, 99, 309, 95, 311, 103,
140, 314, 84, 258, 157, 87, 88, 763, 412, 53,
58, 99, 100, 101, 770, 265, 201, 202, 644, 668,
314, 777, 648, 779, 668, 45, 782, 314, 784, 412,
786, 51, 88, 563, 354, 581, 566, 93, 94, 95,
60, 192, 62, 99, 670, 581, 396, 103, 68, 386,
387, 388, 678, 398, 88, 397, 399, 51, 641, 93,
94, 95, 400, 404, 84, 99, 60, 87, 88, 103,
-1, 601, 66, 603, -1, -1, -1, 97, 98, 73,
-1, 101, 708, 77, 269, 711, -1, 272, -1, -1,
84, -1, -1, 87, 88, 280, 281, 91, 92, 412,
-1, 95, -1, -1, 730, -1, 732, -1, -1, 735,
104, 105, 106, 107, 644, -1, 110, 111, 648, -1,
1, -1, 3, 749, 93, 94, 95, -1, -1, -1,
99, -1, -1, -1, 103, -1, -1, 763, -1, -1,
670, -1, -1, -1, 770, -1, -1, -1, 678, -1,
-1, 777, -1, 779, -1, -1, 782, -1, 784, -1,
786, 93, 94, 95, -1, 46, 47, 99, -1, -1,
51, 103, -1, -1, -1, -1, -1, -1, 708, 60,
563, 711, -1, 566, -1, 66, 371, -1, -1, -1,
375, -1, 73, 378, -1, -1, 77, -1, -1, -1,
730, -1, 732, 84, -1, 735, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, 401, -1, 601, 749,
603, -1, -1, 104, 105, 106, 107, -1, 45, 110,
111, -1, 417, 763, 51, -1, -1, -1, -1, -1,
770, -1, 427, 60, 429, 62, -1, 777, -1, 779,
563, 68, 782, 566, 784, -1, 786, -1, -1, -1,
-1, 644, -1, -1, -1, 648, -1, 84, -1, -1,
87, 88, -1, -1, -1, -1, 461, -1, 463, -1,
97, 98, -1, -1, 101, -1, -1, 670, 601, -1,
603, -1, 477, -1, -1, 678, -1, -1, 191, 192,
193, 194, -1, -1, -1, -1, 199, 200, 493, -1,
-1, -1, -1, -1, -1, -1, -1, 45, 191, 192,
193, 194, -1, 51, -1, 708, 199, 200, 711, -1,
-1, 644, 60, -1, 62, 648, -1, -1, -1, -1,
68, -1, -1, -1, -1, -1, -1, 730, -1, 732,
-1, -1, 735, -1, -1, -1, 84, 670, -1, 87,
88, -1, -1, -1, -1, 678, 749, 45, -1, -1,
98, -1, -1, 51, -1, -1, -1, -1, -1, -1,
763, -1, 60, -1, 62, -1, -1, 770, -1, -1,
68, -1, -1, -1, 777, 708, 779, -1, 711, 782,
-1, 784, -1, 786, 589, -1, 84, -1, -1, 87,
88, -1, -1, -1, -1, -1, -1, 730, -1, 732,
98, -1, 735, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 749, -1, -1, -1,
-1, -1, -1, -1, -1, 630, -1, -1, -1, -1,
763, -1, -1, -1, -1, -1, -1, 770, -1, -1,
-1, -1, -1, -1, 777, -1, 779, -1, -1, 782,
-1, 784, -1, 786, -1, -1, -1, -1, -1, -1,
-1, 666, -1, -1, -1, 1, -1, 672, 381, 382,
383, 384, 385, 386, 387, 388, 389, 390, 391, 392,
-1, 394, 395, 396, 397, 398, 399, 400, 381, 382,
383, 384, 385, 386, 387, 388, 389, 390, 391, 392,
-1, 394, 395, 396, 397, 398, 399, 400, -1, 45,
46, 47, 48, 49, 50, 51, 52, -1, -1, 55,
-1, -1, -1, 59, 60, -1, -1, 63, -1, -1,
66, 67, 68, 69, -1, 71, 72, 73, 74, -1,
1, 77, 78, 748, -1, -1, -1, 752, 84, -1,
-1, 87, 88, -1, -1, -1, -1, -1, -1, 95,
-1, 97, 98, -1, -1, 101, -1, -1, 104, 105,
106, 107, 485, -1, 110, 111, -1, 490, -1, -1,
-1, -1, -1, -1, 45, 46, 47, 48, 49, 50,
51, 52, 485, -1, 55, -1, -1, 490, 59, 60,
-1, -1, 63, -1, -1, 66, 67, 68, 69, 1,
71, 72, 73, 74, -1, -1, 77, 78, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
-1, -1, -1, -1, 95, -1, 97, 98, -1, -1,
101, -1, -1, 104, 105, 106, 107, -1, -1, 110,
111, -1, -1, 45, 46, 47, 48, 49, 50, 51,
52, -1, -1, 55, -1, -1, -1, 59, 60, -1,
-1, 63, -1, -1, 66, 67, 68, 69, -1, 71,
72, 73, 74, -1, -1, 77, 78, -1, 1, -1,
-1, -1, 84, -1, -1, 87, 88, -1, -1, -1,
-1, -1, -1, 95, -1, 97, 98, -1, -1, 101,
623, 624, 104, 105, 106, 107, -1, -1, 110, 111,
-1, -1, -1, -1, -1, -1, -1, -1, 641, -1,
623, 624, 45, 46, 47, -1, 49, 50, 51, 52,
-1, -1, 55, -1, -1, -1, 59, 60, 641, -1,
-1, -1, -1, 66, 67, 68, 69, 1, 71, 72,
73, 74, -1, -1, 77, 78, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, -1, -1,
-1, -1, 95, -1, 97, 98, -1, -1, 101, -1,
-1, 104, 105, 106, 107, -1, -1, 110, 111, -1,
-1, 45, 46, 47, -1, 49, 50, 51, 52, -1,
-1, 55, -1, -1, -1, 59, 60, -1, -1, -1,
-1, -1, 66, 67, 1, 69, -1, 71, 72, 73,
74, -1, -1, 77, 78, -1, -1, -1, -1, -1,
84, -1, -1, 87, 88, -1, -1, -1, -1, -1,
-1, 95, -1, 97, -1, -1, -1, 101, -1, -1,
104, 105, 106, 107, -1, -1, 110, 111, 45, 46,
47, -1, 49, 50, 51, 52, -1, -1, 55, -1,
-1, -1, 59, 60, -1, -1, -1, -1, -1, 66,
67, -1, 69, -1, 71, 72, 73, 74, -1, -1,
77, 78, 1, -1, 3, 4, -1, 84, -1, -1,
87, 88, -1, -1, -1, -1, -1, -1, 95, -1,
97, -1, -1, -1, 101, -1, -1, 104, 105, 106,
107, -1, -1, 110, 111, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 46, 47, -1,
-1, -1, 51, -1, -1, -1, -1, -1, -1, -1,
-1, 60, -1, -1, -1, -1, -1, 66, 1, -1,
3, 4, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, 97, 98,
-1, -1, -1, -1, -1, 104, 105, 106, 107, -1,
-1, 110, 111, 46, 47, -1, -1, -1, 51, -1,
1, -1, 3, 4, -1, -1, -1, 60, -1, -1,
-1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, 97, 46, 47, -1, -1, -1,
51, 104, 105, 106, 107, -1, -1, 110, 111, 60,
-1, -1, -1, -1, -1, 66, 1, -1, 3, 4,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, -1, -1, -1,
101, -1, -1, 104, 105, 106, 107, -1, -1, 110,
111, 46, 47, -1, -1, -1, 51, -1, 1, -1,
3, 4, -1, -1, -1, 60, -1, -1, -1, -1,
-1, 66, -1, -1, -1, -1, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, 46, 47, 100, -1, -1, 51, 104,
105, 106, 107, -1, -1, 110, 111, 60, -1, -1,
-1, -1, -1, 66, 1, -1, 3, 4, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, 90, 91, 92,
-1, -1, 95, -1, -1, -1, -1, -1, -1, -1,
-1, 104, 105, 106, 107, -1, -1, 110, 111, 46,
47, -1, -1, -1, 51, -1, 1, -1, 3, 4,
-1, -1, -1, 60, -1, -1, -1, -1, -1, 66,
-1, -1, -1, -1, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, 96,
-1, 46, 47, -1, -1, -1, 51, 104, 105, 106,
107, -1, -1, 110, 111, 60, -1, -1, -1, -1,
-1, 66, 1, -1, 3, 4, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, -1, -1, -1, 101, -1, -1, 104,
105, 106, 107, -1, -1, 110, 111, 46, 47, -1,
-1, -1, 51, -1, 1, -1, 3, 4, -1, -1,
-1, 60, -1, -1, -1, -1, -1, 66, -1, -1,
-1, -1, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, 46,
47, 100, -1, -1, 51, 104, 105, 106, 107, -1,
-1, 110, 111, 60, -1, -1, -1, -1, -1, 66,
1, -1, 3, 4, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, 96,
-1, -1, -1, -1, -1, -1, -1, 104, 105, 106,
107, -1, -1, 110, 111, 46, 47, -1, -1, -1,
51, -1, 1, -1, 3, 4, -1, -1, -1, 60,
-1, -1, -1, -1, -1, 66, -1, -1, -1, -1,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, 96, -1, 46, 47, -1,
-1, -1, 51, 104, 105, 106, 107, -1, -1, 110,
111, 60, -1, -1, -1, -1, -1, 66, 1, -1,
3, 4, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, 96, -1, -1,
-1, -1, -1, -1, -1, 104, 105, 106, 107, -1,
-1, 110, 111, 46, 47, -1, -1, -1, 51, -1,
1, -1, 3, 4, -1, -1, -1, 60, -1, -1,
-1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, 96, -1, 46, 47, -1, -1, -1,
51, 104, 105, 106, 107, -1, -1, 110, 111, 60,
-1, -1, -1, -1, -1, 66, 1, -1, 3, 4,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, -1, -1, -1,
101, -1, -1, 104, 105, 106, 107, -1, -1, 110,
111, 46, 47, -1, -1, -1, 51, -1, 1, -1,
3, 4, -1, -1, -1, 60, -1, -1, -1, -1,
-1, 66, -1, -1, -1, -1, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, 46, 47, -1, -1, -1, 51, 104,
105, 106, 107, -1, -1, 110, 111, 60, -1, -1,
-1, -1, -1, 66, 1, -1, 3, 4, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, -1, -1, -1, -1, -1, -1,
-1, 104, 105, 106, 107, -1, -1, 110, 111, 46,
47, -1, -1, -1, 51, -1, 1, -1, 3, 4,
-1, -1, -1, 60, -1, -1, -1, -1, -1, 66,
-1, -1, -1, -1, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, -1,
-1, 46, 47, -1, -1, -1, 51, 104, 105, 106,
107, -1, -1, 110, 111, 60, -1, -1, -1, -1,
-1, 66, 1, -1, 3, 4, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, -1, -1, -1, -1, -1, -1, 104,
105, 106, 107, -1, -1, 110, 111, 46, 47, -1,
-1, -1, 51, -1, 1, -1, 3, 4, -1, -1,
-1, 60, -1, -1, -1, -1, -1, 66, -1, -1,
-1, -1, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, 46,
47, -1, -1, -1, 51, 104, 105, 106, 107, -1,
-1, 110, 111, 60, -1, -1, -1, -1, -1, 66,
1, -1, 3, 4, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, -1,
-1, -1, -1, -1, -1, -1, -1, 104, 105, 106,
107, -1, -1, 110, 111, 46, 47, -1, -1, -1,
51, -1, 1, -1, 3, 4, -1, -1, -1, 60,
-1, -1, -1, -1, -1, 66, -1, -1, -1, -1,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, 46, 47, -1,
-1, -1, 51, 104, 105, 106, 107, -1, -1, 110,
111, 60, -1, -1, -1, -1, -1, 66, 1, -1,
3, 4, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, -1,
-1, -1, -1, -1, -1, 104, 105, 106, 107, -1,
-1, 110, 111, 46, 47, -1, -1, -1, 51, -1,
1, -1, 3, 4, -1, -1, -1, 60, -1, -1,
-1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, -1, 46, 47, -1, -1, -1,
51, 104, 105, 106, 107, -1, -1, 110, 111, 60,
-1, -1, -1, -1, -1, 66, 1, -1, 3, 4,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, -1, -1, -1,
-1, -1, -1, 104, 105, 106, 107, -1, -1, 110,
111, 46, 47, -1, -1, -1, 51, -1, 1, -1,
3, 4, -1, -1, -1, 60, -1, -1, -1, -1,
-1, 66, -1, -1, -1, -1, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, 46, 47, -1, -1, -1, 51, 104,
105, 106, 107, -1, -1, 110, 111, 60, -1, -1,
-1, -1, -1, 66, 1, -1, 3, 4, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, -1, -1, -1, -1, -1, -1,
-1, 104, 105, 106, 107, -1, -1, 110, 111, 46,
47, -1, -1, -1, 51, -1, 1, -1, 3, 4,
-1, -1, -1, 60, -1, -1, -1, -1, -1, 66,
-1, -1, -1, -1, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, -1,
-1, 46, 47, -1, -1, -1, 51, 104, 105, 106,
107, -1, -1, 110, 111, 60, -1, -1, -1, -1,
-1, 66, 1, -1, 3, 4, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, -1, -1, -1, -1, -1, -1, 104,
105, 106, 107, -1, -1, 110, 111, 46, 47, -1,
-1, -1, 51, -1, 1, -1, 3, 4, -1, -1,
-1, 60, -1, -1, -1, -1, -1, 66, -1, -1,
-1, -1, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, 46,
47, -1, -1, -1, 51, 104, 105, 106, 107, -1,
-1, 110, 111, 60, -1, -1, -1, -1, -1, 66,
1, -1, 3, 4, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, -1,
-1, -1, -1, -1, -1, -1, -1, 104, 105, 106,
107, -1, -1, 110, 111, 46, 47, -1, -1, -1,
51, -1, 1, -1, 3, 4, -1, -1, -1, 60,
-1, -1, -1, -1, -1, 66, -1, -1, -1, -1,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, 46, 47, -1,
-1, -1, 51, 104, 105, 106, 107, -1, -1, 110,
111, 60, -1, -1, -1, -1, -1, 66, 1, -1,
3, 4, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, -1,
-1, -1, -1, -1, -1, 104, 105, 106, 107, -1,
-1, 110, 111, 46, 47, -1, -1, -1, 51, -1,
1, -1, 3, 4, -1, -1, -1, 60, -1, -1,
-1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, -1, 46, 47, -1, -1, -1,
51, 104, 105, 106, 107, -1, -1, 110, 111, 60,
-1, -1, -1, -1, -1, 66, 1, -1, 3, 4,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, -1, -1, -1,
-1, -1, -1, 104, 105, 106, 107, -1, -1, 110,
111, 46, 47, -1, -1, -1, 51, -1, 1, -1,
3, 4, -1, -1, -1, 60, -1, -1, -1, -1,
-1, 66, -1, -1, -1, -1, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, 46, 47, -1, -1, -1, 51, 104,
105, 106, 107, -1, -1, 110, 111, 60, -1, -1,
-1, -1, -1, 66, 1, -1, 3, 4, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, -1, -1, -1, -1, -1, -1,
-1, 104, 105, 106, 107, -1, -1, 110, 111, 46,
47, -1, -1, -1, 51, -1, 1, -1, 3, 4,
-1, -1, -1, 60, -1, -1, -1, -1, -1, 66,
-1, -1, -1, -1, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, -1,
-1, 46, 47, -1, -1, -1, 51, 104, 105, 106,
107, -1, -1, 110, 111, 60, -1, -1, -1, -1,
-1, 66, 1, -1, 3, 4, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, -1, -1, -1, -1, -1, -1, 104,
105, 106, 107, -1, -1, 110, 111, 46, 47, -1,
-1, -1, 51, -1, 1, -1, 3, 4, -1, -1,
-1, 60, -1, -1, -1, -1, -1, 66, -1, -1,
-1, -1, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, 46,
47, -1, -1, -1, 51, 104, 105, 106, 107, -1,
-1, 110, 111, 60, -1, -1, -1, -1, -1, 66,
1, -1, 3, 4, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, -1,
-1, -1, -1, -1, -1, -1, -1, 104, 105, 106,
107, -1, -1, 110, 111, 46, 47, -1, -1, -1,
51, -1, 1, -1, 3, 4, -1, -1, -1, 60,
-1, -1, -1, -1, -1, 66, -1, -1, -1, -1,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, 46, 47, -1,
-1, -1, 51, 104, 105, 106, 107, -1, -1, 110,
111, 60, -1, -1, -1, -1, -1, 66, 1, -1,
3, 4, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, -1,
-1, -1, -1, -1, -1, 104, 105, 106, 107, -1,
-1, 110, 111, 46, 47, -1, -1, -1, 51, -1,
1, -1, 3, 4, -1, -1, -1, 60, -1, -1,
-1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, -1, 46, 47, -1, -1, -1,
51, 104, 105, 106, 107, -1, -1, 110, 111, 60,
-1, -1, -1, -1, -1, 66, 1, -1, 3, 4,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, -1, -1, -1,
-1, -1, -1, 104, 105, 106, 107, -1, -1, 110,
111, 46, 47, -1, -1, -1, 51, -1, 1, -1,
3, 4, -1, -1, -1, 60, -1, -1, -1, -1,
-1, 66, -1, -1, -1, -1, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, 46, 47, -1, -1, -1, 51, 104,
105, 106, 107, -1, -1, 110, 111, 60, -1, -1,
-1, -1, -1, 66, 1, -1, 3, 4, -1, -1,
73, -1, -1, -1, 77, -1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, -1, -1, -1, -1, -1, -1,
-1, 104, 105, 106, 107, -1, -1, 110, 111, 46,
47, -1, -1, -1, 51, -1, 1, -1, 3, 4,
-1, -1, -1, 60, -1, -1, -1, -1, -1, 66,
-1, -1, -1, -1, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, -1,
-1, 46, 47, -1, -1, -1, 51, 104, 105, 106,
107, -1, -1, 110, 111, 60, -1, -1, -1, -1,
-1, 66, 1, -1, 3, 4, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, -1, -1, 91, 92, -1, -1,
95, -1, -1, -1, -1, -1, -1, -1, -1, 104,
105, 106, 107, -1, -1, 110, 111, 46, 47, -1,
-1, -1, 51, -1, 1, -1, 3, 4, -1, -1,
-1, 60, -1, -1, -1, -1, -1, 66, -1, -1,
-1, -1, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, 46,
47, -1, -1, -1, 51, 104, 105, 106, 107, -1,
-1, 110, 111, 60, -1, -1, -1, -1, -1, 66,
1, -1, 3, 4, -1, -1, 73, -1, -1, -1,
77, -1, -1, -1, -1, -1, -1, 84, -1, -1,
87, 88, -1, -1, 91, 92, -1, -1, 95, -1,
-1, -1, -1, -1, -1, -1, -1, 104, 105, 106,
107, -1, -1, 110, 111, 46, 47, -1, -1, -1,
51, -1, 1, -1, 3, 4, -1, -1, -1, 60,
-1, -1, -1, -1, -1, 66, -1, -1, -1, -1,
-1, -1, 73, -1, -1, -1, 77, -1, -1, -1,
-1, -1, -1, 84, -1, -1, 87, 88, -1, -1,
91, 92, -1, -1, 95, -1, -1, 46, 47, -1,
-1, -1, 51, 104, 105, 106, 107, -1, -1, 110,
111, 60, -1, -1, -1, -1, -1, 66, 1, -1,
3, 4, -1, -1, 73, -1, -1, -1, 77, -1,
-1, -1, -1, -1, -1, 84, -1, -1, 87, 88,
-1, -1, 91, 92, -1, -1, 95, -1, -1, -1,
-1, -1, -1, -1, -1, 104, 105, 106, 107, -1,
-1, 110, 111, 46, 47, -1, -1, -1, 51, -1,
1, -1, -1, -1, -1, -1, -1, 60, -1, -1,
-1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
73, -1, -1, -1, 77, 1, -1, -1, -1, -1,
-1, 84, -1, -1, 87, 88, -1, -1, 91, 92,
-1, -1, 95, -1, 45, 46, 47, -1, -1, -1,
51, 104, 105, 106, 107, -1, -1, 110, 111, 60,
-1, -1, -1, -1, -1, 66, -1, -1, 1, -1,
46, 47, 73, -1, -1, 51, 77, -1, -1, -1,
-1, -1, -1, 84, 60, -1, 87, 88, -1, -1,
66, -1, -1, 1, 95, -1, -1, 73, -1, -1,
101, 77, -1, 104, 105, 106, 107, -1, 84, 110,
111, 87, 88, 46, 47, -1, -1, -1, 51, 95,
96, -1, -1, -1, -1, -1, -1, 60, 104, 105,
106, 107, -1, 66, 110, 111, 1, -1, 46, 47,
73, -1, -1, 51, 77, -1, -1, -1, -1, -1,
-1, 84, 60, -1, 87, 88, -1, -1, 66, -1,
-1, -1, 95, 96, -1, 73, -1, -1, -1, 77,
-1, 104, 105, 106, 107, -1, 84, 110, 111, 87,
88, 3, 4, -1, -1, -1, 51, 95, -1, -1,
-1, -1, -1, -1, -1, 60, 104, 105, 106, 107,
-1, 66, 110, 111, -1, -1, -1, -1, 73, -1,
-1, -1, 77, -1, -1, -1, -1, -1, -1, 84,
-1, -1, 87, 88, 46, 47, 91, 92, -1, 51,
95, -1, -1, -1, -1, -1, -1, -1, 60, 104,
105, 106, 107, -1, 66, 110, 111, 3, 4, -1,
-1, 73, -1, -1, -1, 77, -1, -1, -1, -1,
-1, -1, 84, -1, -1, 87, 88, -1, -1, 91,
92, -1, -1, 95, -1, 97, 98, -1, -1, -1,
102, -1, 104, 105, 106, 107, -1, -1, 110, 111,
46, 47, -1, -1, -1, 51, -1, -1, -1, 3,
4, -1, -1, -1, 60, -1, -1, -1, -1, -1,
66, -1, -1, -1, -1, -1, -1, 73, -1, -1,
-1, 77, -1, -1, -1, -1, -1, -1, 84, -1,
-1, 87, 88, -1, -1, 91, 92, -1, -1, 95,
96, -1, 46, 47, -1, -1, -1, 51, 104, 105,
106, 107, -1, -1, 110, 111, 60, -1, -1, -1,
-1, -1, 66, -1, -1, 3, 4, -1, -1, 73,
-1, -1, -1, 77, -1, -1, -1, -1, -1, -1,
84, -1, -1, 87, 88, -1, -1, 91, 92, -1,
-1, 95, 96, -1, -1, -1, -1, -1, -1, -1,
104, 105, 106, 107, -1, -1, 110, 111, 46, 47,
-1, -1, -1, 51, -1, -1, -1, 3, 4, -1,
-1, -1, 60, -1, -1, -1, -1, -1, 66, -1,
-1, -1, -1, -1, -1, 73, -1, -1, -1, 77,
-1, -1, -1, -1, -1, -1, 84, -1, -1, 87,
88, -1, -1, 91, 92, -1, -1, 95, 96, -1,
46, 47, -1, -1, -1, 51, 104, 105, 106, 107,
-1, -1, 110, 111, 60, -1, -1, -1, -1, -1,
66, -1, -1, 3, 4, -1, -1, 73, -1, -1,
-1, 77, -1, -1, -1, -1, -1, -1, 84, -1,
-1, 87, 88, -1, -1, 91, 92, -1, -1, 95,
96, -1, -1, -1, -1, -1, -1, -1, 104, 105,
106, 107, -1, -1, 110, 111, 46, 47, -1, -1,
-1, 51, -1, -1, -1, -1, -1, -1, -1, -1,
60, -1, -1, -1, -1, -1, 66, -1, -1, -1,
-1, -1, -1, 73, -1, -1, -1, 77, -1, -1,
-1, -1, -1, -1, 84, -1, -1, 87, 88, -1,
-1, 91, 92, -1, -1, 95, -1, 45, 46, 47,
-1, -1, -1, 51, 104, 105, 106, 107, -1, -1,
110, 111, 60, -1, -1, -1, -1, -1, 66, -1,
-1, -1, -1, -1, -1, 73, -1, -1, -1, 77,
-1, -1, -1, -1, -1, -1, 84, -1, -1, 87,
88, -1, -1, -1, -1, -1, -1, 95, -1, -1,
-1, -1, -1, -1, -1, -1, 104, 105, 106, 107,
-1, -1, 110, 111
};
#define YYPURE 1
#line 3 "/usr/share/bison/bison.simple"
#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
# if YYSTACK_USE_ALLOCA
# define YYSTACK_ALLOC alloca
# else
# ifndef YYSTACK_USE_ALLOCA
# if defined (alloca) || defined (_ALLOCA_H)
# define YYSTACK_ALLOC alloca
# else
# ifdef __GNUC__
# define YYSTACK_ALLOC __builtin_alloca
# endif
# endif
# endif
# endif
# ifdef YYSTACK_ALLOC
# define YYSTACK_FREE(Ptr) do { ; } while (0)
# else
# if defined (__STDC__) || defined (__cplusplus)
# include <stdlib.h>
# define YYSIZE_T size_t
# endif
# define YYSTACK_ALLOC malloc
# define YYSTACK_FREE free
# endif
#endif
#if (! defined (yyoverflow) \
&& (! defined (__cplusplus) \
|| (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
union yyalloc
{
short yyss;
YYSTYPE yyvs;
# if YYLSP_NEEDED
YYLTYPE yyls;
# endif
};
# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
# if YYLSP_NEEDED
# define YYSTACK_BYTES(N) \
((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
+ 2 * YYSTACK_GAP_MAX)
# else
# define YYSTACK_BYTES(N) \
((N) * (sizeof (short) + sizeof (YYSTYPE)) \
+ YYSTACK_GAP_MAX)
# endif
# ifndef YYCOPY
# if 1 < __GNUC__
# define YYCOPY(To, From, Count) \
__builtin_memcpy (To, From, (Count) * sizeof (*(From)))
# else
# define YYCOPY(To, From, Count) \
do \
{ \
register YYSIZE_T yyi; \
for (yyi = 0; yyi < (Count); yyi++) \
(To)[yyi] = (From)[yyi]; \
} \
while (0)
# endif
# endif
# define YYSTACK_RELOCATE(Stack) \
do \
{ \
YYSIZE_T yynewbytes; \
YYCOPY (&yyptr->Stack, Stack, yysize); \
Stack = &yyptr->Stack; \
yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \
yyptr += yynewbytes / sizeof (*yyptr); \
} \
while (0)
#endif
#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
# define YYSIZE_T __SIZE_TYPE__
#endif
#if ! defined (YYSIZE_T) && defined (size_t)
# define YYSIZE_T size_t
#endif
#if ! defined (YYSIZE_T)
# if defined (__STDC__) || defined (__cplusplus)
# include <stddef.h>
# define YYSIZE_T size_t
# endif
#endif
#if ! defined (YYSIZE_T)
# define YYSIZE_T unsigned int
#endif
#define yyerrok (yyerrstatus = 0)
#define yyclearin (yychar = YYEMPTY)
#define YYEMPTY -2
#define YYEOF 0
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
#define YYERROR goto yyerrlab1
#define YYFAIL goto yyerrlab
#define YYRECOVERING() (!!yyerrstatus)
#define YYBACKUP(Token, Value) \
do \
if (yychar == YYEMPTY && yylen == 1) \
{ \
yychar = (Token); \
yylval = (Value); \
yychar1 = YYTRANSLATE (yychar); \
YYPOPSTACK; \
goto yybackup; \
} \
else \
{ \
yyerror ("syntax error: cannot back up"); \
YYERROR; \
} \
while (0)
#define YYTERROR 1
#define YYERRCODE 256
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \
Current.last_line = Rhs[N].last_line; \
Current.last_column = Rhs[N].last_column;
#endif
#if YYPURE
# if YYLSP_NEEDED
# ifdef YYLEX_PARAM
# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
# else
# define YYLEX yylex (&yylval, &yylloc)
# endif
# else
# ifdef YYLEX_PARAM
# define YYLEX yylex (&yylval, YYLEX_PARAM)
# else
# define YYLEX yylex (&yylval)
# endif
# endif
#else
# define YYLEX yylex ()
#endif
#if YYDEBUG
# ifndef YYFPRINTF
# include <stdio.h>
# define YYFPRINTF fprintf
# endif
# define YYDPRINTF(Args) \
do { \
if (yydebug) \
YYFPRINTF Args; \
} while (0)
int yydebug;
#else
# define YYDPRINTF(Args)
#endif
#ifndef YYINITDEPTH
# define YYINITDEPTH 200
#endif
#if YYMAXDEPTH == 0
# undef YYMAXDEPTH
#endif
#ifndef YYMAXDEPTH
# define YYMAXDEPTH 10000
#endif
#ifdef YYERROR_VERBOSE
# ifndef yystrlen
# if defined (__GLIBC__) && defined (_STRING_H)
# define yystrlen strlen
# else
static YYSIZE_T
# if defined (__STDC__) || defined (__cplusplus)
yystrlen (const char *yystr)
# else
yystrlen (yystr)
const char *yystr;
# endif
{
register const char *yys = yystr;
while (*yys++ != '\0')
continue;
return yys - yystr - 1;
}
# endif
# endif
# ifndef yystpcpy
# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
# define yystpcpy stpcpy
# else
static char *
# if defined (__STDC__) || defined (__cplusplus)
yystpcpy (char *yydest, const char *yysrc)
# else
yystpcpy (yydest, yysrc)
char *yydest;
const char *yysrc;
# endif
{
register char *yyd = yydest;
register const char *yys = yysrc;
while ((*yyd++ = *yys++) != '\0')
continue;
return yyd - 1;
}
# endif
# endif
#endif
#line 315 "/usr/share/bison/bison.simple"
#ifdef YYPARSE_PARAM
# if defined (__STDC__) || defined (__cplusplus)
# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
# define YYPARSE_PARAM_DECL
# else
# define YYPARSE_PARAM_ARG YYPARSE_PARAM
# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
# endif
#else
# define YYPARSE_PARAM_ARG
# define YYPARSE_PARAM_DECL
#endif
#ifdef __GNUC__
# ifdef YYPARSE_PARAM
int yyparse (void *);
# else
int yyparse (void);
# endif
#endif
#define YY_DECL_NON_LSP_VARIABLES \
\
int yychar; \
\
\
YYSTYPE yylval; \
\
\
int yynerrs;
#if YYLSP_NEEDED
# define YY_DECL_VARIABLES \
YY_DECL_NON_LSP_VARIABLES \
\
\
YYLTYPE yylloc;
#else
# define YY_DECL_VARIABLES \
YY_DECL_NON_LSP_VARIABLES
#endif
#if !YYPURE
YY_DECL_VARIABLES
#endif
int
yyparse (YYPARSE_PARAM_ARG)
YYPARSE_PARAM_DECL
{
#if YYPURE
YY_DECL_VARIABLES
#endif
register int yystate;
register int yyn;
int yyresult;
int yyerrstatus;
int yychar1 = 0;
short yyssa[YYINITDEPTH];
short *yyss = yyssa;
register short *yyssp;
YYSTYPE yyvsa[YYINITDEPTH];
YYSTYPE *yyvs = yyvsa;
register YYSTYPE *yyvsp;
#if YYLSP_NEEDED
YYLTYPE yylsa[YYINITDEPTH];
YYLTYPE *yyls = yylsa;
YYLTYPE *yylsp;
#endif
#if YYLSP_NEEDED
# define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
#else
# define YYPOPSTACK (yyvsp--, yyssp--)
#endif
YYSIZE_T yystacksize = YYINITDEPTH;
YYSTYPE yyval;
#if YYLSP_NEEDED
YYLTYPE yyloc;
#endif
int yylen;
YYDPRINTF ((stderr, "Starting parse\n"));
yystate = 0;
yyerrstatus = 0;
yynerrs = 0;
yychar = YYEMPTY;
yyssp = yyss;
yyvsp = yyvs;
#if YYLSP_NEEDED
yylsp = yyls;
#endif
goto yysetstate;
yynewstate:
yyssp++;
yysetstate:
*yyssp = yystate;
if (yyssp >= yyss + yystacksize - 1)
{
YYSIZE_T yysize = yyssp - yyss + 1;
#ifdef yyoverflow
{
YYSTYPE *yyvs1 = yyvs;
short *yyss1 = yyss;
# if YYLSP_NEEDED
YYLTYPE *yyls1 = yyls;
yyoverflow ("parser stack overflow",
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),
&yyls1, yysize * sizeof (*yylsp),
&yystacksize);
yyls = yyls1;
# else
yyoverflow ("parser stack overflow",
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),
&yystacksize);
# endif
yyss = yyss1;
yyvs = yyvs1;
}
#else
# ifndef YYSTACK_RELOCATE
goto yyoverflowlab;
# else
if (yystacksize >= YYMAXDEPTH)
goto yyoverflowlab;
yystacksize *= 2;
if (yystacksize > YYMAXDEPTH)
yystacksize = YYMAXDEPTH;
{
short *yyss1 = yyss;
union yyalloc *yyptr =
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
if (! yyptr)
goto yyoverflowlab;
YYSTACK_RELOCATE (yyss);
YYSTACK_RELOCATE (yyvs);
# if YYLSP_NEEDED
YYSTACK_RELOCATE (yyls);
# endif
# undef YYSTACK_RELOCATE
if (yyss1 != yyssa)
YYSTACK_FREE (yyss1);
}
# endif
#endif
yyssp = yyss + yysize - 1;
yyvsp = yyvs + yysize - 1;
#if YYLSP_NEEDED
yylsp = yyls + yysize - 1;
#endif
YYDPRINTF ((stderr, "Stack size increased to %lu\n",
(unsigned long int) yystacksize));
if (yyssp >= yyss + yystacksize - 1)
YYABORT;
}
YYDPRINTF ((stderr, "Entering state %d\n", yystate));
goto yybackup;
yybackup:
yyn = yypact[yystate];
if (yyn == YYFLAG)
goto yydefault;
if (yychar == YYEMPTY)
{
YYDPRINTF ((stderr, "Reading a token: "));
yychar = YYLEX;
}
if (yychar <= 0)
{
yychar1 = 0;
yychar = YYEOF;
YYDPRINTF ((stderr, "Now at end of input.\n"));
}
else
{
yychar1 = YYTRANSLATE (yychar);
#if YYDEBUG
if (yydebug)
{
YYFPRINTF (stderr, "Next token is %d (%s",
yychar, yytname[yychar1]);
# ifdef YYPRINT
YYPRINT (stderr, yychar, yylval);
# endif
YYFPRINTF (stderr, ")\n");
}
#endif
}
yyn += yychar1;
if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
goto yydefault;
yyn = yytable[yyn];
if (yyn < 0)
{
if (yyn == YYFLAG)
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
}
else if (yyn == 0)
goto yyerrlab;
if (yyn == YYFINAL)
YYACCEPT;
YYDPRINTF ((stderr, "Shifting token %d (%s), ",
yychar, yytname[yychar1]));
if (yychar != YYEOF)
yychar = YYEMPTY;
*++yyvsp = yylval;
#if YYLSP_NEEDED
*++yylsp = yylloc;
#endif
if (yyerrstatus)
yyerrstatus--;
yystate = yyn;
goto yynewstate;
yydefault:
yyn = yydefact[yystate];
if (yyn == 0)
goto yyerrlab;
goto yyreduce;
yyreduce:
yylen = yyr2[yyn];
yyval = yyvsp[1-yylen];
#if YYLSP_NEEDED
yyloc = yylsp[1-yylen];
YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
#endif
#if YYDEBUG
if (yydebug)
{
int yyi;
YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
yyn, yyrline[yyn]);
for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
}
#endif
switch (yyn) {
case 1:
#line 631 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{;
break;}
case 18:
#line 675 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
int osb = pop_current_osb (ctxp);
tree t = build_java_array_type ((yyvsp[-1].node), -1);
while (--osb)
t = build_unresolved_array_type (t);
yyval.node = t;
;
break;}
case 19:
#line 683 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
int osb = pop_current_osb (ctxp);
tree t = yyvsp[-1].node;
while (osb--)
t = build_unresolved_array_type (t);
yyval.node = t;
;
break;}
case 23:
#line 704 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = make_qualified_name (yyvsp[-2].node, yyvsp[0].node, yyvsp[-1].operator.location); ;
break;}
case 25:
#line 713 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = NULL;;
break;}
case 33:
#line 725 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = NULL;
;
break;}
case 34:
#line 729 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = NULL;
;
break;}
case 37:
#line 741 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->package = EXPR_WFL_NODE (yyvsp[-1].node);
register_package (ctxp->package);
;
break;}
case 38:
#line 746 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing name"); RECOVER;;
break;}
case 39:
#line 748 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 42:
#line 758 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree name = EXPR_WFL_NODE (yyvsp[-1].node), last_name;
int i = IDENTIFIER_LENGTH (name)-1;
const char *last = &IDENTIFIER_POINTER (name)[i];
while (last != IDENTIFIER_POINTER (name))
{
if (last [0] == '.')
break;
last--;
}
last_name = get_identifier (++last);
if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (last_name))
{
tree err = find_name_in_single_imports (last_name);
if (err && err != name)
parse_error_context
(yyvsp[-1].node, "Ambiguous class: %qs and %qs",
IDENTIFIER_POINTER (name),
IDENTIFIER_POINTER (err));
else
REGISTER_IMPORT (yyvsp[-1].node, last_name);
}
else
REGISTER_IMPORT (yyvsp[-1].node, last_name);
;
break;}
case 43:
#line 784 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing name"); RECOVER;;
break;}
case 44:
#line 786 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 45:
#line 791 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree name = EXPR_WFL_NODE (yyvsp[-3].node);
tree it;
for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it))
if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name)
break;
if (! it)
{
read_import_dir (yyvsp[-3].node);
ctxp->import_demand_list =
chainon (ctxp->import_demand_list,
build_tree_list (yyvsp[-3].node, NULL_TREE));
}
;
break;}
case 46:
#line 809 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'*' expected"); RECOVER;;
break;}
case 47:
#line 811 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 48:
#line 816 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ end_class_declaration (0); ;
break;}
case 49:
#line 818 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ end_class_declaration (0); ;
break;}
case 51:
#line 821 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
YYERROR_NOW;
yyerror ("Class or interface declaration expected");
;
break;}
case 52:
#line 832 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.value = (1 << yyvsp[0].value);
;
break;}
case 53:
#line 836 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
int acc = (1 << yyvsp[0].value);
if (yyval.value & acc)
parse_error_context
(ctxp->modifier_ctx [yyvsp[0].value], "Modifier %qs declared twice",
java_accstring_lookup (acc));
else
{
yyval.value |= acc;
}
;
break;}
case 54:
#line 852 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ create_class (yyvsp[-4].value, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 55:
#line 854 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{;;
break;}
case 56:
#line 856 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ create_class (0, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 57:
#line 858 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{;;
break;}
case 58:
#line 860 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyerror ("Missing class name"); RECOVER; ;
break;}
case 59:
#line 862 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyerror ("Missing class name"); RECOVER; ;
break;}
case 60:
#line 864 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (!ctxp->class_err) yyerror ("'{' expected");
DRECOVER(class1);
;
break;}
case 61:
#line 869 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER; ;
break;}
case 62:
#line 873 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL; ;
break;}
case 63:
#line 875 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 64:
#line 877 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'{' expected"); ctxp->class_err=1;;
break;}
case 65:
#line 879 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing super class name"); ctxp->class_err=1;;
break;}
case 66:
#line 883 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 67:
#line 885 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 68:
#line 887 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->class_err=1;
yyerror ("Missing interface name");
;
break;}
case 69:
#line 895 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->interface_number = 1;
yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE);
;
break;}
case 70:
#line 900 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->interface_number++;
yyval.node = chainon (yyvsp[-2].node, build_tree_list (yyvsp[0].node, NULL_TREE));
;
break;}
case 71:
#line 905 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing interface name"); RECOVER;;
break;}
case 72:
#line 910 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (flag_emit_xref)
DECL_END_SOURCE_LINE (GET_CPC ()) = yyvsp[0].operator.location;
yyval.node = GET_CPC ();
;
break;}
case 73:
#line 917 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (flag_emit_xref)
DECL_END_SOURCE_LINE (GET_CPC ()) = yyvsp[0].operator.location;
yyval.node = GET_CPC ();
;
break;}
case 79:
#line 935 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (!IS_EMPTY_STMT (yyvsp[0].node))
{
TREE_CHAIN (yyvsp[0].node) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, yyvsp[0].node);
}
;
break;}
case 82:
#line 948 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ end_class_declaration (1); ;
break;}
case 83:
#line 950 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ end_class_declaration (1); ;
break;}
case 85:
#line 957 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ register_fields (0, yyvsp[-2].node, yyvsp[-1].node); ;
break;}
case 86:
#line 959 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
check_modifiers
("Illegal modifier %qs for field declaration",
yyvsp[-3].value, FIELD_MODIFIERS);
check_modifiers_consistency (yyvsp[-3].value);
register_fields (yyvsp[-3].value, yyvsp[-2].node, yyvsp[-1].node);
;
break;}
case 88:
#line 972 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = chainon (yyvsp[-2].node, yyvsp[0].node); ;
break;}
case 89:
#line 974 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 90:
#line 979 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ;
break;}
case 91:
#line 981 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (java_error_count)
yyvsp[0].node = NULL_TREE;
yyval.node = build_tree_list
(yyvsp[-2].node, build_assignment (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node));
;
break;}
case 92:
#line 988 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Missing variable initializer");
yyval.node = build_tree_list (yyvsp[-2].node, NULL_TREE);
RECOVER;
;
break;}
case 93:
#line 994 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("';' expected");
yyval.node = build_tree_list (yyvsp[-3].node, NULL_TREE);
RECOVER;
;
break;}
case 95:
#line 1004 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_unresolved_array_type (yyvsp[-2].node); ;
break;}
case 96:
#line 1006 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Invalid declaration"); DRECOVER(vdi);;
break;}
case 97:
#line 1008 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("']' expected");
DRECOVER(vdi);
;
break;}
case 98:
#line 1013 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Unbalanced ']'"); DRECOVER(vdi);;
break;}
case 101:
#line 1024 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
current_function_decl = yyvsp[0].node;
if (current_function_decl
&& TREE_CODE (current_function_decl) == FUNCTION_DECL)
source_start_java_method (current_function_decl);
else
current_function_decl = NULL_TREE;
;
break;}
case 102:
#line 1033 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ finish_method_declaration (yyvsp[0].node); ;
break;}
case 103:
#line 1035 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{YYNOT_TWICE yyerror ("'{' expected"); RECOVER;;
break;}
case 104:
#line 1040 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = method_header (0, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 105:
#line 1042 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = method_header (0, void_type_node, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 106:
#line 1044 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = method_header (yyvsp[-3].value, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 107:
#line 1046 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = method_header (yyvsp[-3].value, void_type_node, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 108:
#line 1048 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Invalid method declaration, method name required");
RECOVER;
;
break;}
case 109:
#line 1053 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Identifier expected");
RECOVER;
;
break;}
case 110:
#line 1058 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Identifier expected");
RECOVER;
;
break;}
case 111:
#line 1063 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Identifier expected");
RECOVER;
;
break;}
case 112:
#line 1068 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Invalid method declaration, return type required");
RECOVER;
;
break;}
case 113:
#line 1076 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->formal_parameter_number = 0;
yyval.node = method_declarator (yyvsp[-2].node, NULL_TREE);
;
break;}
case 114:
#line 1081 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = method_declarator (yyvsp[-3].node, yyvsp[-1].node); ;
break;}
case 115:
#line 1083 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
SET_EXPR_LOCATION_FROM_TOKEN (wfl_operator, yyvsp[-1].operator);
TREE_PURPOSE (yyvsp[-2].node) =
build_unresolved_array_type (TREE_PURPOSE (yyvsp[-2].node));
parse_warning_context
(wfl_operator,
"Discouraged form of returned type specification");
;
break;}
case 116:
#line 1092 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("')' expected"); DRECOVER(method_declarator);;
break;}
case 117:
#line 1094 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("']' expected"); RECOVER;;
break;}
case 118:
#line 1099 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->formal_parameter_number = 1;
;
break;}
case 119:
#line 1103 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->formal_parameter_number += 1;
yyval.node = chainon (yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 120:
#line 1108 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyerror ("Missing formal parameter term"); RECOVER; ;
break;}
case 121:
#line 1113 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_tree_list (yyvsp[0].node, yyvsp[-1].node);
;
break;}
case 122:
#line 1117 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_tree_list (yyvsp[0].node, yyvsp[-1].node);
ARG_FINAL_P (yyval.node) = 1;
;
break;}
case 123:
#line 1122 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Missing identifier"); RECOVER;
yyval.node = NULL_TREE;
;
break;}
case 124:
#line 1127 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Missing identifier"); RECOVER;
yyval.node = NULL_TREE;
;
break;}
case 125:
#line 1135 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
check_modifiers ("Illegal modifier %qs. Only %<final%> was expected here",
yyvsp[0].value, ACC_FINAL);
if (yyvsp[0].value != ACC_FINAL)
MODIFIER_WFL (FINAL_TK) = build_wfl_node (NULL_TREE);
;
break;}
case 126:
#line 1144 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 127:
#line 1146 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 128:
#line 1148 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing class type term"); RECOVER;;
break;}
case 129:
#line 1153 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_tree_list (yyvsp[0].node, yyvsp[0].node); ;
break;}
case 130:
#line 1155 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = tree_cons (yyvsp[0].node, yyvsp[0].node, yyvsp[-2].node); ;
break;}
case 131:
#line 1157 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing class type term"); RECOVER;;
break;}
case 133:
#line 1162 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 134:
#line 1168 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
TREE_CHAIN (yyvsp[0].node) = CPC_STATIC_INITIALIZER_STMT (ctxp);
SET_CPC_STATIC_INITIALIZER_STMT (ctxp, yyvsp[0].node);
current_static_block = NULL_TREE;
;
break;}
case 135:
#line 1177 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
check_modifiers ("Illegal modifier %qs for static initializer", yyvsp[0].value, ACC_STATIC);
if (yyvsp[0].value | ACC_STATIC &&
GET_CPC_LIST () && !TOPLEVEL_CLASS_DECL_P (GET_CPC ()))
parse_error_context
(MODIFIER_WFL (STATIC_TK),
"Can't define static initializer in class %qs. Static initializer can only be defined in top-level classes",
IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())));
SOURCE_FRONTEND_DEBUG (("Modifiers: %d", yyvsp[0].value));
;
break;}
case 136:
#line 1193 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
current_function_decl = yyvsp[0].node;
source_start_java_method (current_function_decl);
;
break;}
case 137:
#line 1198 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ finish_method_declaration (yyvsp[0].node); ;
break;}
case 138:
#line 1203 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = method_header (0, NULL_TREE, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 139:
#line 1205 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = method_header (yyvsp[-2].value, NULL_TREE, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 140:
#line 1210 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->formal_parameter_number = 0;
yyval.node = method_declarator (yyvsp[-2].node, NULL_TREE);
;
break;}
case 141:
#line 1215 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = method_declarator (yyvsp[-3].node, yyvsp[-1].node); ;
break;}
case 142:
#line 1223 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
BLOCK_EXPR_BODY (yyvsp[0].node) = build_java_empty_stmt ();
yyval.node = yyvsp[0].node;
;
break;}
case 143:
#line 1228 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 144:
#line 1230 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 145:
#line 1232 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 147:
#line 1242 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_method_invocation (yyvsp[-3].node, NULL_TREE);
yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-3].node), yyval.node);
yyval.node = java_method_add_stmt (current_function_decl, yyval.node);
;
break;}
case 148:
#line 1248 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_method_invocation (yyvsp[-4].node, yyvsp[-2].node);
yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-4].node), yyval.node);
yyval.node = java_method_add_stmt (current_function_decl, yyval.node);
;
break;}
case 149:
#line 1256 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = parse_jdk1_1_error ("explicit constructor invocation"); ;
break;}
case 150:
#line 1258 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = parse_jdk1_1_error ("explicit constructor invocation"); ;
break;}
case 151:
#line 1263 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree wfl = build_wfl_node (this_identifier_node);
SET_EXPR_LOCATION_FROM_TOKEN (wfl, yyvsp[0].operator);
yyval.node = wfl;
;
break;}
case 152:
#line 1269 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree wfl = build_wfl_node (super_identifier_node);
SET_EXPR_LOCATION_FROM_TOKEN (wfl, yyvsp[0].operator);
yyval.node = wfl;
;
break;}
case 153:
#line 1280 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ create_interface (0, yyvsp[0].node, NULL_TREE); ;
break;}
case 154:
#line 1282 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ ; ;
break;}
case 155:
#line 1284 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ create_interface (yyvsp[-2].value, yyvsp[0].node, NULL_TREE); ;
break;}
case 156:
#line 1286 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ ; ;
break;}
case 157:
#line 1288 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ create_interface (0, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 158:
#line 1290 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ ; ;
break;}
case 159:
#line 1292 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ create_interface (yyvsp[-3].value, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 160:
#line 1294 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ ; ;
break;}
case 161:
#line 1296 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyerror ("'{' expected"); RECOVER; ;
break;}
case 162:
#line 1298 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyerror ("'{' expected"); RECOVER; ;
break;}
case 163:
#line 1303 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->interface_number = 1;
yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE);
;
break;}
case 164:
#line 1308 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->interface_number++;
yyval.node = chainon (yyvsp[-2].node, build_tree_list (yyvsp[0].node, NULL_TREE));
;
break;}
case 165:
#line 1313 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Invalid interface type"); RECOVER;;
break;}
case 166:
#line 1315 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 167:
#line 1320 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 168:
#line 1322 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 173:
#line 1334 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ end_class_declaration (1); ;
break;}
case 174:
#line 1336 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ end_class_declaration (1); ;
break;}
case 176:
#line 1345 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
check_abstract_method_header (yyvsp[-1].node);
current_function_decl = NULL_TREE;
;
break;}
case 177:
#line 1350 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 178:
#line 1356 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_new_array_init (yyvsp[-1].operator.location, NULL_TREE); ;
break;}
case 179:
#line 1358 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_new_array_init (yyvsp[-2].operator.location, NULL_TREE); ;
break;}
case 180:
#line 1360 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_new_array_init (yyvsp[-2].operator.location, yyvsp[-1].node); ;
break;}
case 181:
#line 1362 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_new_array_init (yyvsp[-3].operator.location, yyvsp[-2].node); ;
break;}
case 182:
#line 1367 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = tree_cons (maybe_build_array_element_wfl (yyvsp[0].node),
yyvsp[0].node, NULL_TREE);
;
break;}
case 183:
#line 1372 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = tree_cons (maybe_build_array_element_wfl (yyvsp[0].node), yyvsp[0].node, yyvsp[-2].node);
;
break;}
case 184:
#line 1376 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 185:
#line 1382 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 186:
#line 1384 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 187:
#line 1389 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ enter_block (); ;
break;}
case 188:
#line 1394 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
maybe_absorb_scoping_blocks ();
if (current_function_decl && flag_emit_xref)
DECL_END_SOURCE_LINE (current_function_decl) = yyvsp[0].operator.location;
yyval.node = exit_block ();
if (!BLOCK_SUBBLOCKS (yyval.node))
BLOCK_SUBBLOCKS (yyval.node) = build_java_empty_stmt ();
;
break;}
case 192:
#line 1413 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ java_method_add_stmt (current_function_decl, yyvsp[0].node); ;
break;}
case 193:
#line 1415 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1;
end_class_declaration (1);
;
break;}
case 195:
#line 1427 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ declare_local_variables (0, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 196:
#line 1429 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ declare_local_variables (yyvsp[-2].value, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 202:
#line 1439 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = exit_block (); ;
break;}
case 207:
#line 1448 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = exit_block (); ;
break;}
case 220:
#line 1468 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (flag_extraneous_semicolon
&& ! current_static_block
&& (! current_function_decl ||
(GET_CPC () != TYPE_NAME
(DECL_CONTEXT (current_function_decl)))))
{
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (wfl_operator, input_location);
#else
EXPR_WFL_SET_LINECOL (wfl_operator, input_line, -1);
#endif
parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used");
}
yyval.node = build_java_empty_stmt ();
;
break;}
case 221:
#line 1490 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_labeled_block (EXPR_WFL_LINECOL (yyvsp[-1].node),
EXPR_WFL_NODE (yyvsp[-1].node));
pushlevel (2);
push_labeled_block (yyval.node);
PUSH_LABELED_BLOCK (yyval.node);
;
break;}
case 222:
#line 1501 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = finish_labeled_statement (yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 223:
#line 1503 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("':' expected"); RECOVER;;
break;}
case 224:
#line 1508 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = finish_labeled_statement (yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 225:
#line 1515 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
#ifdef USE_MAPPED_LOCATION
yyval.node = expr_add_location (yyvsp[-1].node, input_location, 1);
#else
yyval.node = build_expr_wfl (yyvsp[-1].node, input_filename, input_line, 0);
JAVA_MAYBE_GENERATE_DEBUG_INFO (yyval.node);
#endif
;
break;}
case 226:
#line 1528 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
YYNOT_TWICE yyerror ("Invalid expression statement");
DRECOVER (expr_stmt);
;
break;}
case 227:
#line 1533 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
YYNOT_TWICE yyerror ("Invalid expression statement");
DRECOVER (expr_stmt);
;
break;}
case 228:
#line 1538 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
YYNOT_TWICE yyerror ("Invalid expression statement");
DRECOVER (expr_stmt);
;
break;}
case 229:
#line 1543 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("')' expected"); RECOVER;;
break;}
case 230:
#line 1545 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
parse_ctor_invocation_error ();
RECOVER;
;
break;}
case 231:
#line 1550 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("')' expected"); RECOVER;;
break;}
case 232:
#line 1552 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
parse_ctor_invocation_error ();
RECOVER;
;
break;}
case 233:
#line 1557 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'(' expected"); RECOVER;;
break;}
case 234:
#line 1559 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("')' expected"); RECOVER;;
break;}
case 235:
#line 1561 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("')' expected"); RECOVER;;
break;}
case 236:
#line 1563 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 237:
#line 1565 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 245:
#line 1580 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_if_else_statement (yyvsp[-3].operator.location, yyvsp[-2].node,
yyvsp[0].node, NULL_TREE);
;
break;}
case 246:
#line 1585 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'(' expected"); RECOVER;;
break;}
case 247:
#line 1587 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 248:
#line 1589 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("')' expected"); RECOVER;;
break;}
case 249:
#line 1594 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_if_else_statement (yyvsp[-5].operator.location, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ;
break;}
case 250:
#line 1599 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_if_else_statement (yyvsp[-5].operator.location, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ;
break;}
case 251:
#line 1604 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
enter_block ();
;
break;}
case 252:
#line 1608 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
maybe_absorb_scoping_blocks ();
TREE_OPERAND (yyvsp[-2].node, 1) = exit_block ();
yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-2].node), yyvsp[-2].node);
;
break;}
case 253:
#line 1620 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build3 (SWITCH_EXPR, NULL_TREE, yyvsp[-1].node,
NULL_TREE, NULL_TREE);
SET_EXPR_LOCATION_FROM_TOKEN (yyval.node, yyvsp[-2].operator);
;
break;}
case 254:
#line 1626 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'(' expected"); RECOVER;;
break;}
case 255:
#line 1628 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term or ')'"); DRECOVER(switch_statement);;
break;}
case 256:
#line 1630 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'{' expected"); RECOVER;;
break;}
case 257:
#line 1638 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 258:
#line 1640 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 259:
#line 1642 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 260:
#line 1644 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = NULL_TREE; ;
break;}
case 266:
#line 1663 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree lab = build1 (CASE_EXPR, NULL_TREE, yyvsp[-1].node);
SET_EXPR_LOCATION_FROM_TOKEN (lab, yyvsp[-2].operator);
java_method_add_stmt (current_function_decl, lab);
;
break;}
case 267:
#line 1669 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree lab = make_node (DEFAULT_EXPR);
SET_EXPR_LOCATION_FROM_TOKEN (lab, yyvsp[-1].operator);
java_method_add_stmt (current_function_decl, lab);
;
break;}
case 268:
#line 1675 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing or invalid constant expression"); RECOVER;;
break;}
case 269:
#line 1677 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("':' expected"); RECOVER;;
break;}
case 270:
#line 1679 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("':' expected"); RECOVER;;
break;}
case 271:
#line 1684 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree body = build_loop_body (yyvsp[-2].operator.location, yyvsp[-1].node, 0);
yyval.node = build_new_loop (body);
;
break;}
case 272:
#line 1692 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = finish_loop_body (0, NULL_TREE, yyvsp[0].node, 0); ;
break;}
case 273:
#line 1694 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{YYERROR_NOW; yyerror ("'(' expected"); RECOVER;;
break;}
case 274:
#line 1696 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term and ')' expected"); RECOVER;;
break;}
case 275:
#line 1698 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("')' expected"); RECOVER;;
break;}
case 276:
#line 1703 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = finish_loop_body (0, NULL_TREE, yyvsp[0].node, 0); ;
break;}
case 277:
#line 1708 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree body = build_loop_body (0, NULL_TREE, 1);
yyval.node = build_new_loop (body);
;
break;}
case 278:
#line 1717 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = finish_loop_body (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[-5].node, 1); ;
break;}
case 279:
#line 1722 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (CONSTANT_CLASS_P (yyvsp[-4].node))
yyvsp[-4].node = build_wfl_node (yyvsp[-4].node);
yyval.node = finish_for_loop (EXPR_WFL_LINECOL (yyvsp[-4].node), yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 280:
#line 1728 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = finish_for_loop (0, NULL_TREE, yyvsp[-2].node, yyvsp[0].node);
LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY (yyval.node), 0) =
build_java_empty_stmt ();
;
break;}
case 281:
#line 1735 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Invalid control expression"); RECOVER;;
break;}
case 282:
#line 1737 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Invalid update expression"); RECOVER;;
break;}
case 283:
#line 1739 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Invalid update expression"); RECOVER;;
break;}
case 284:
#line 1744 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = finish_for_loop (EXPR_WFL_LINECOL (yyvsp[-4].node), yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node);;
break;}
case 285:
#line 1746 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = finish_for_loop (0, NULL_TREE, yyvsp[-2].node, yyvsp[0].node);
LOOP_EXPR_BODY_CONDITION_EXPR (LOOP_EXPR_BODY (yyval.node), 0) =
build_java_empty_stmt ();
;
break;}
case 286:
#line 1756 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
enter_block ();
;
break;}
case 287:
#line 1762 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'(' expected"); DRECOVER(for_1);;
break;}
case 288:
#line 1764 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Invalid init statement"); RECOVER;;
break;}
case 289:
#line 1769 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree body = build_loop_body (0, NULL_TREE, 0);
yyval.node = build_new_loop (body);
FOR_LOOP_P (yyval.node) = 1;
java_method_add_stmt (current_function_decl, yyval.node);
;
break;}
case 290:
#line 1781 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_java_empty_stmt (); ;
break;}
case 291:
#line 1783 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = java_method_add_stmt (current_function_decl, yyvsp[0].node);
;
break;}
case 292:
#line 1789 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = NULL_TREE;
;
break;}
case 293:
#line 1795 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); DRECOVER(for_init_1);;
break;}
case 294:
#line 1799 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = build_java_empty_stmt ();;
break;}
case 295:
#line 1801 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_debugable_stmt (BUILD_LOCATION (), yyvsp[0].node); ;
break;}
case 296:
#line 1806 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = add_stmt_to_compound (NULL_TREE, NULL_TREE, yyvsp[0].node); ;
break;}
case 297:
#line 1808 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = add_stmt_to_compound (yyvsp[-2].node, NULL_TREE, yyvsp[0].node); ;
break;}
case 298:
#line 1810 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 299:
#line 1815 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_bc_statement (yyvsp[-1].operator.location, 1, NULL_TREE); ;
break;}
case 300:
#line 1817 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_bc_statement (yyvsp[-2].operator.location, 1, yyvsp[-1].node); ;
break;}
case 301:
#line 1819 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 302:
#line 1821 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 303:
#line 1826 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_bc_statement (yyvsp[-1].operator.location, 0, NULL_TREE); ;
break;}
case 304:
#line 1828 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_bc_statement (yyvsp[-2].operator.location, 0, yyvsp[-1].node); ;
break;}
case 305:
#line 1830 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 306:
#line 1832 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 307:
#line 1837 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_return (yyvsp[-1].operator.location, NULL_TREE); ;
break;}
case 308:
#line 1839 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_return (yyvsp[-2].operator.location, yyvsp[-1].node); ;
break;}
case 309:
#line 1841 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 310:
#line 1843 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 311:
#line 1848 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build1 (THROW_EXPR, NULL_TREE, yyvsp[-1].node);
SET_EXPR_LOCATION_FROM_TOKEN (yyval.node, yyvsp[-2].operator);
;
break;}
case 312:
#line 1853 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 313:
#line 1855 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 314:
#line 1860 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_assertion (yyvsp[-4].operator.location, yyvsp[-3].node, yyvsp[-1].node);
;
break;}
case 315:
#line 1864 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_assertion (yyvsp[-2].operator.location, yyvsp[-1].node, NULL_TREE);
;
break;}
case 316:
#line 1868 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 317:
#line 1870 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("';' expected"); RECOVER;;
break;}
case 318:
#line 1875 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build2 (SYNCHRONIZED_EXPR, NULL_TREE, yyvsp[-2].node, yyvsp[0].node);
EXPR_WFL_LINECOL (yyval.node) =
EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK));
;
break;}
case 319:
#line 1881 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'{' expected"); RECOVER;;
break;}
case 320:
#line 1883 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'(' expected"); RECOVER;;
break;}
case 321:
#line 1885 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 322:
#line 1887 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 323:
#line 1892 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
check_modifiers (
"Illegal modifier %qs. Only %<synchronized%> was expected here",
yyvsp[0].value, ACC_SYNCHRONIZED);
if (yyvsp[0].value != ACC_SYNCHRONIZED)
MODIFIER_WFL (SYNCHRONIZED_TK) =
build_wfl_node (NULL_TREE);
;
break;}
case 324:
#line 1904 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_try_statement (yyvsp[-2].operator.location, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 325:
#line 1906 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_try_finally_statement (yyvsp[-2].operator.location, yyvsp[-1].node, yyvsp[0].node); ;
break;}
case 326:
#line 1908 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_try_finally_statement
(yyvsp[-3].operator.location, build_try_statement (yyvsp[-3].operator.location,
yyvsp[-2].node, yyvsp[-1].node), yyvsp[0].node);
;
break;}
case 327:
#line 1913 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'{' expected"); DRECOVER (try_statement);;
break;}
case 329:
#line 1919 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
TREE_CHAIN (yyvsp[0].node) = yyvsp[-1].node;
yyval.node = yyvsp[0].node;
;
break;}
case 330:
#line 1927 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
java_method_add_stmt (current_function_decl, yyvsp[0].node);
exit_block ();
yyval.node = yyvsp[-1].node;
;
break;}
case 331:
#line 1936 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree ccpb;
tree init;
if (yyvsp[-1].node)
{
ccpb = enter_block ();
init = build_assignment
(ASSIGN_TK, yyvsp[-2].operator.location, TREE_PURPOSE (yyvsp[-1].node),
build0 (JAVA_EXC_OBJ_EXPR, ptr_type_node));
declare_local_variables (0, TREE_VALUE (yyvsp[-1].node),
build_tree_list
(TREE_PURPOSE (yyvsp[-1].node), init));
yyval.node = build1 (JAVA_CATCH_EXPR, NULL_TREE, ccpb);
SET_EXPR_LOCATION_FROM_TOKEN (yyval.node, yyvsp[-3].operator);
}
else
{
yyval.node = error_mark_node;
}
;
break;}
case 332:
#line 1961 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'(' expected"); RECOVER; yyval.node = NULL_TREE;;
break;}
case 333:
#line 1963 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Missing term or ')' expected");
RECOVER; yyval.node = NULL_TREE;
;
break;}
case 334:
#line 1968 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER; yyval.node = NULL_TREE;;
break;}
case 335:
#line 1973 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[0].node; ;
break;}
case 336:
#line 1975 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'{' expected"); RECOVER; ;
break;}
case 341:
#line 1988 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_this (yyvsp[0].operator.location); ;
break;}
case 342:
#line 1990 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = yyvsp[-1].node;;
break;}
case 348:
#line 2000 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree wfl = build_wfl_node (this_identifier_node);
yyval.node = make_qualified_primary (yyvsp[-2].node, wfl, EXPR_WFL_LINECOL (yyvsp[-2].node));
;
break;}
case 349:
#line 2005 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("')' expected"); RECOVER;;
break;}
case 350:
#line 2007 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'class' or 'this' expected" ); RECOVER;;
break;}
case 351:
#line 2009 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'class' expected" ); RECOVER;;
break;}
case 352:
#line 2011 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'class' expected" ); RECOVER;;
break;}
case 353:
#line 2016 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ;
break;}
case 354:
#line 2018 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ;
break;}
case 355:
#line 2020 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ;
break;}
case 356:
#line 2022 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location,
void_type_node);
;
break;}
case 357:
#line 2030 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_new_invocation (yyvsp[-3].node, yyvsp[-1].node); ;
break;}
case 358:
#line 2032 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_new_invocation (yyvsp[-2].node, NULL_TREE); ;
break;}
case 360:
#line 2038 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree ctor = build_new_invocation (yyvsp[-2].node, NULL_TREE);
yyval.node = make_qualified_primary (yyvsp[-3].node, ctor,
EXPR_WFL_LINECOL (yyvsp[-3].node));
;
break;}
case 362:
#line 2045 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree ctor = build_new_invocation (yyvsp[-3].node, yyvsp[-1].node);
yyval.node = make_qualified_primary (yyvsp[-4].node, ctor,
EXPR_WFL_LINECOL (yyvsp[-4].node));
;
break;}
case 364:
#line 2052 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = NULL_TREE; yyerror ("'(' expected"); DRECOVER(new_1);;
break;}
case 365:
#line 2054 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = NULL_TREE; yyerror ("'(' expected"); RECOVER;;
break;}
case 366:
#line 2056 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = NULL_TREE; yyerror ("')' or term expected"); RECOVER;;
break;}
case 367:
#line 2058 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = NULL_TREE; yyerror ("')' expected"); RECOVER;;
break;}
case 368:
#line 2060 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = NULL_TREE;
YYERROR_NOW;
yyerror ("Identifier expected");
RECOVER;
;
break;}
case 369:
#line 2067 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = NULL_TREE; yyerror ("'(' expected"); RECOVER;;
break;}
case 370:
#line 2077 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ create_anonymous_class (yyvsp[-3].node); ;
break;}
case 371:
#line 2079 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (yyvsp[-5].node);
end_class_declaration (1);
yyval.node = build_new_invocation (id, yyvsp[-3].node);
;
break;}
case 372:
#line 2110 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ create_anonymous_class (yyvsp[-2].node); ;
break;}
case 373:
#line 2112 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree id = build_wfl_node (DECL_NAME (GET_CPC ()));
EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (yyvsp[-4].node);
end_class_declaration (1);
yyval.node = build_new_invocation (id, NULL_TREE);
;
break;}
case 374:
#line 2128 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[-2].node; ;
break;}
case 375:
#line 2130 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = yyvsp[-2].node; ;
break;}
case 376:
#line 2135 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, NULL_TREE);
ctxp->formal_parameter_number = 1;
;
break;}
case 377:
#line 2140 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
ctxp->formal_parameter_number += 1;
yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, yyvsp[-2].node);
;
break;}
case 378:
#line 2145 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 379:
#line 2150 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_newarray_node (yyvsp[-1].node, yyvsp[0].node, 0); ;
break;}
case 380:
#line 2152 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_newarray_node (yyvsp[-1].node, yyvsp[0].node, 0); ;
break;}
case 381:
#line 2154 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_newarray_node (yyvsp[-2].node, yyvsp[-1].node, pop_current_osb (ctxp));;
break;}
case 382:
#line 2156 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_newarray_node (yyvsp[-2].node, yyvsp[-1].node, pop_current_osb (ctxp));;
break;}
case 383:
#line 2158 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'[' expected"); DRECOVER ("]");;
break;}
case 384:
#line 2160 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("']' expected"); RECOVER;;
break;}
case 385:
#line 2167 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
char *sig;
int osb = pop_current_osb (ctxp);
while (osb--)
obstack_grow (&temporary_obstack, "[]", 2);
obstack_1grow (&temporary_obstack, '\0');
sig = obstack_finish (&temporary_obstack);
yyval.node = build3 (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
yyvsp[-2].node, get_identifier (sig), yyvsp[0].node);
;
break;}
case 386:
#line 2178 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
int osb = pop_current_osb (ctxp);
tree type = yyvsp[-2].node;
while (osb--)
type = build_java_array_type (type, -1);
yyval.node = build3 (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE,
build_pointer_type (type), NULL_TREE, yyvsp[0].node);
;
break;}
case 387:
#line 2187 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("'[' expected"); DRECOVER ("]");;
break;}
case 388:
#line 2189 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("']' expected"); RECOVER;;
break;}
case 389:
#line 2194 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_tree_list (NULL_TREE, yyvsp[0].node); ;
break;}
case 390:
#line 2196 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, yyval.node); ;
break;}
case 391:
#line 2201 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (JNUMERIC_TYPE_P (TREE_TYPE (yyvsp[-1].node)))
{
yyvsp[-1].node = build_wfl_node (yyvsp[-1].node);
TREE_TYPE (yyvsp[-1].node) = NULL_TREE;
}
EXPR_WFL_LINECOL (yyvsp[-1].node) = yyvsp[-2].operator.location;
yyval.node = yyvsp[-1].node;
;
break;}
case 392:
#line 2211 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("']' expected"); RECOVER;;
break;}
case 393:
#line 2213 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Missing term");
yyerror ("']' expected");
RECOVER;
;
break;}
case 394:
#line 2222 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
int allocate = 0;
if (!ctxp->osb_limit)
{
allocate = ctxp->osb_limit = 32;
ctxp->osb_depth = -1;
}
else if (ctxp->osb_depth+1 == ctxp->osb_limit)
allocate = ctxp->osb_limit << 1;
if (allocate)
{
allocate *= sizeof (int);
if (ctxp->osb_number)
ctxp->osb_number = xrealloc (ctxp->osb_number,
allocate);
else
ctxp->osb_number = xmalloc (allocate);
}
ctxp->osb_depth++;
CURRENT_OSB (ctxp) = 1;
;
break;}
case 395:
#line 2248 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ CURRENT_OSB (ctxp)++; ;
break;}
case 396:
#line 2250 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyerror ("']' expected"); RECOVER;;
break;}
case 397:
#line 2255 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = make_qualified_primary (yyvsp[-2].node, yyvsp[0].node, yyvsp[-1].operator.location); ;
break;}
case 398:
#line 2259 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree super_wfl = build_wfl_node (super_identifier_node);
SET_EXPR_LOCATION_FROM_TOKEN (super_wfl, yyvsp[-2].operator);
yyval.node = make_qualified_name (super_wfl, yyvsp[0].node, yyvsp[-1].operator.location);
;
break;}
case 399:
#line 2265 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Field expected"); DRECOVER (super_field_acces);;
break;}
case 400:
#line 2270 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_method_invocation (yyvsp[-2].node, NULL_TREE); ;
break;}
case 401:
#line 2272 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_method_invocation (yyvsp[-3].node, yyvsp[-1].node); ;
break;}
case 402:
#line 2274 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (TREE_CODE (yyvsp[-4].node) == THIS_EXPR)
yyval.node = build_this_super_qualified_invocation
(1, yyvsp[-2].node, NULL_TREE, 0, yyvsp[-3].operator.location);
else
{
tree invok = build_method_invocation (yyvsp[-2].node, NULL_TREE);
yyval.node = make_qualified_primary (yyvsp[-4].node, invok, yyvsp[-3].operator.location);
}
;
break;}
case 403:
#line 2285 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (TREE_CODE (yyvsp[-5].node) == THIS_EXPR)
yyval.node = build_this_super_qualified_invocation
(1, yyvsp[-3].node, yyvsp[-1].node, 0, yyvsp[-4].operator.location);
else
{
tree invok = build_method_invocation (yyvsp[-3].node, yyvsp[-1].node);
yyval.node = make_qualified_primary (yyvsp[-5].node, invok, yyvsp[-4].operator.location);
}
;
break;}
case 404:
#line 2296 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_this_super_qualified_invocation
(0, yyvsp[-2].node, NULL_TREE, yyvsp[-4].operator.location, yyvsp[-3].operator.location);
;
break;}
case 405:
#line 2301 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_this_super_qualified_invocation
(0, yyvsp[-3].node, yyvsp[-1].node, yyvsp[-5].operator.location, yyvsp[-4].operator.location);
;
break;}
case 406:
#line 2310 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyerror ("'(' expected"); DRECOVER (method_invocation); ;
break;}
case 407:
#line 2312 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyerror ("'(' expected"); DRECOVER (method_invocation); ;
break;}
case 408:
#line 2317 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ;
break;}
case 409:
#line 2319 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ;
break;}
case 410:
#line 2321 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ;
break;}
case 411:
#line 2323 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Missing term and ']' expected");
DRECOVER(array_access);
;
break;}
case 412:
#line 2328 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("']' expected");
DRECOVER(array_access);
;
break;}
case 413:
#line 2333 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Missing term and ']' expected");
DRECOVER(array_access);
;
break;}
case 414:
#line 2338 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("']' expected");
DRECOVER(array_access);
;
break;}
case 415:
#line 2343 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("Missing term and ']' expected");
DRECOVER(array_access);
;
break;}
case 416:
#line 2348 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyerror ("']' expected");
DRECOVER(array_access);
;
break;}
case 421:
#line 2363 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_incdec (yyvsp[0].operator.token, yyvsp[0].operator.location, yyvsp[-1].node, 1); ;
break;}
case 422:
#line 2368 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_incdec (yyvsp[0].operator.token, yyvsp[0].operator.location, yyvsp[-1].node, 1); ;
break;}
case 425:
#line 2375 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ;
break;}
case 427:
#line 2378 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;
break;}
case 428:
#line 2383 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
if (yyvsp[0].node)
error_if_numeric_overflow (yyvsp[0].node);
yyval.node = yyvsp[0].node;
;
break;}
case 429:
#line 2389 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ;
break;}
case 430:
#line 2391 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;
break;}
case 431:
#line 2396 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = build_incdec (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node, 0); ;
break;}
case 432:
#line 2398 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;
break;}
case 433:
#line 2403 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = build_incdec (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node, 0); ;
break;}
case 434:
#line 2405 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;
break;}
case 436:
#line 2411 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ;
break;}
case 437:
#line 2413 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ;
break;}
case 439:
#line 2416 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;
break;}
case 440:
#line 2418 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;
break;}
case 441:
#line 2423 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
tree type = yyvsp[-3].node;
int osb = pop_current_osb (ctxp);
while (osb--)
type = build_java_array_type (type, -1);
yyval.node = build_cast (yyvsp[-4].operator.location, type, yyvsp[0].node);
;
break;}
case 442:
#line 2431 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_cast (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node); ;
break;}
case 443:
#line 2433 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_cast (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node); ;
break;}
case 444:
#line 2435 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
const char *ptr;
int osb = pop_current_osb (ctxp);
obstack_grow (&temporary_obstack,
IDENTIFIER_POINTER (EXPR_WFL_NODE (yyvsp[-3].node)),
IDENTIFIER_LENGTH (EXPR_WFL_NODE (yyvsp[-3].node)));
while (osb--)
obstack_grow (&temporary_obstack, "[]", 2);
obstack_1grow (&temporary_obstack, '\0');
ptr = obstack_finish (&temporary_obstack);
EXPR_WFL_NODE (yyvsp[-3].node) = get_identifier (ptr);
yyval.node = build_cast (yyvsp[-4].operator.location, yyvsp[-3].node, yyvsp[0].node);
;
break;}
case 445:
#line 2449 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("']' expected, invalid type expression");;
break;}
case 446:
#line 2451 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
YYNOT_TWICE yyerror ("Invalid type expression"); RECOVER;
RECOVER;
;
break;}
case 447:
#line 2456 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 448:
#line 2458 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 449:
#line 2460 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 451:
#line 2466 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token),
yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 452:
#line 2471 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 453:
#line 2476 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 454:
#line 2481 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 455:
#line 2483 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 456:
#line 2485 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 458:
#line 2491 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 459:
#line 2496 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 460:
#line 2501 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 461:
#line 2503 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 463:
#line 2509 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 464:
#line 2514 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 465:
#line 2519 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 466:
#line 2524 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 467:
#line 2526 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 468:
#line 2528 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 470:
#line 2534 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 471:
#line 2539 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 472:
#line 2544 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 473:
#line 2549 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 474:
#line 2554 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_binop (INSTANCEOF_EXPR, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ;
break;}
case 475:
#line 2556 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 476:
#line 2558 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 477:
#line 2560 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 478:
#line 2562 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 479:
#line 2564 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Invalid reference type"); RECOVER;;
break;}
case 481:
#line 2570 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 482:
#line 2575 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 483:
#line 2580 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 484:
#line 2582 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 486:
#line 2588 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 487:
#line 2593 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 489:
#line 2599 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 490:
#line 2604 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 492:
#line 2610 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 493:
#line 2615 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 495:
#line 2621 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 496:
#line 2626 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 498:
#line 2632 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location,
yyvsp[-2].node, yyvsp[0].node);
;
break;}
case 499:
#line 2637 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); RECOVER;;
break;}
case 501:
#line 2643 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
yyval.node = build3 (CONDITIONAL_EXPR, NULL_TREE, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node);
SET_EXPR_LOCATION_FROM_TOKEN (yyval.node, yyvsp[-3].operator);
;
break;}
case 502:
#line 2648 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
YYERROR_NOW;
yyerror ("Missing term");
DRECOVER (1);
;
break;}
case 503:
#line 2654 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); DRECOVER (2);;
break;}
case 504:
#line 2656 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{yyerror ("Missing term"); DRECOVER (3);;
break;}
case 507:
#line 2666 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{ yyval.node = build_assignment (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ;
break;}
case 508:
#line 2668 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
{
YYNOT_TWICE yyerror ("Missing term");
DRECOVER (assign);
;
break;}
}
#line 705 "/usr/share/bison/bison.simple"
yyvsp -= yylen;
yyssp -= yylen;
#if YYLSP_NEEDED
yylsp -= yylen;
#endif
#if YYDEBUG
if (yydebug)
{
short *yyssp1 = yyss - 1;
YYFPRINTF (stderr, "state stack now");
while (yyssp1 != yyssp)
YYFPRINTF (stderr, " %d", *++yyssp1);
YYFPRINTF (stderr, "\n");
}
#endif
*++yyvsp = yyval;
#if YYLSP_NEEDED
*++yylsp = yyloc;
#endif
yyn = yyr1[yyn];
yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
yystate = yytable[yystate];
else
yystate = yydefgoto[yyn - YYNTBASE];
goto yynewstate;
yyerrlab:
if (!yyerrstatus)
{
++yynerrs;
#ifdef YYERROR_VERBOSE
yyn = yypact[yystate];
if (yyn > YYFLAG && yyn < YYLAST)
{
YYSIZE_T yysize = 0;
char *yymsg;
int yyx, yycount;
yycount = 0;
for (yyx = yyn < 0 ? -yyn : 0;
yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
if (yycheck[yyx + yyn] == yyx)
yysize += yystrlen (yytname[yyx]) + 15, yycount++;
yysize += yystrlen ("parse error, unexpected ") + 1;
yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
yymsg = (char *) YYSTACK_ALLOC (yysize);
if (yymsg != 0)
{
char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
if (yycount < 5)
{
yycount = 0;
for (yyx = yyn < 0 ? -yyn : 0;
yyx < (int) (sizeof (yytname) / sizeof (char *));
yyx++)
if (yycheck[yyx + yyn] == yyx)
{
const char *yyq = ! yycount ? ", expecting " : " or ";
yyp = yystpcpy (yyp, yyq);
yyp = yystpcpy (yyp, yytname[yyx]);
yycount++;
}
}
yyerror (yymsg);
YYSTACK_FREE (yymsg);
}
else
yyerror ("parse error; also virtual memory exhausted");
}
else
#endif
yyerror ("parse error");
}
goto yyerrlab1;
yyerrlab1:
if (yyerrstatus == 3)
{
if (yychar == YYEOF)
YYABORT;
YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
yychar, yytname[yychar1]));
yychar = YYEMPTY;
}
yyerrstatus = 3;
goto yyerrhandle;
yyerrdefault:
#if 0
yyn = yydefact[yystate];
if (yyn)
goto yydefault;
#endif
yyerrpop:
if (yyssp == yyss)
YYABORT;
yyvsp--;
yystate = *--yyssp;
#if YYLSP_NEEDED
yylsp--;
#endif
#if YYDEBUG
if (yydebug)
{
short *yyssp1 = yyss - 1;
YYFPRINTF (stderr, "Error: state stack now");
while (yyssp1 != yyssp)
YYFPRINTF (stderr, " %d", *++yyssp1);
YYFPRINTF (stderr, "\n");
}
#endif
yyerrhandle:
yyn = yypact[yystate];
if (yyn == YYFLAG)
goto yyerrdefault;
yyn += YYTERROR;
if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
goto yyerrdefault;
yyn = yytable[yyn];
if (yyn < 0)
{
if (yyn == YYFLAG)
goto yyerrpop;
yyn = -yyn;
goto yyreduce;
}
else if (yyn == 0)
goto yyerrpop;
if (yyn == YYFINAL)
YYACCEPT;
YYDPRINTF ((stderr, "Shifting error token, "));
*++yyvsp = yylval;
#if YYLSP_NEEDED
*++yylsp = yylloc;
#endif
yystate = yyn;
goto yynewstate;
yyacceptlab:
yyresult = 0;
goto yyreturn;
yyabortlab:
yyresult = 1;
goto yyreturn;
yyoverflowlab:
yyerror ("parser stack overflow");
yyresult = 2;
yyreturn:
#ifndef yyoverflow
if (yyss != yyssa)
YYSTACK_FREE (yyss);
#endif
return yyresult;
}
#line 2693 "/scratch/mitchell/gcc-releases/gcc-4.0.0/gcc-4.0.0/gcc/java/parse.y"
static int
pop_current_osb (struct parser_ctxt *ctxp)
{
int to_return;
if (ctxp->osb_depth < 0)
abort ();
to_return = CURRENT_OSB (ctxp);
ctxp->osb_depth--;
return to_return;
}
static void
create_new_parser_context (int copy_from_previous)
{
struct parser_ctxt *new;
new = ggc_alloc (sizeof (struct parser_ctxt));
if (copy_from_previous)
{
memcpy (new, ctxp, sizeof (struct parser_ctxt));
new->saved_data_ctx = 0;
}
else
memset (new, 0, sizeof (struct parser_ctxt));
new->next = ctxp;
ctxp = new;
}
void
java_push_parser_context (void)
{
create_new_parser_context (0);
}
void
java_pop_parser_context (int generate)
{
tree current;
struct parser_ctxt *next;
if (!ctxp)
return;
next = ctxp->next;
if (next)
{
input_location = ctxp->save_location;
current_class = ctxp->class_type;
}
if (ctxp->lexer && next && ctxp->lexer != next->lexer)
java_destroy_lexer (ctxp->lexer);
for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 0;
if (generate)
{
ctxp->next = ctxp_for_generation;
ctxp_for_generation = ctxp;
}
if ((ctxp = next))
for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 1;
}
void
java_parser_context_save_global (void)
{
if (!ctxp)
{
java_push_parser_context ();
ctxp->saved_data_ctx = 1;
}
else if (ctxp->saved_data)
{
create_new_parser_context (1);
ctxp->saved_data_ctx = 1;
}
ctxp->save_location = input_location;
ctxp->class_type = current_class;
ctxp->function_decl = current_function_decl;
ctxp->saved_data = 1;
}
void
java_parser_context_restore_global (void)
{
input_location = ctxp->save_location;
current_class = ctxp->class_type;
if (wfl_operator)
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (wfl_operator, ctxp->save_location);
#else
EXPR_WFL_FILENAME_NODE (wfl_operator) = get_identifier (input_filename);
#endif
current_function_decl = ctxp->function_decl;
ctxp->saved_data = 0;
if (ctxp->saved_data_ctx)
java_pop_parser_context (0);
}
static void
java_parser_context_suspend (void)
{
static const char *const name = "<inner buffer context>";
create_new_parser_context (1);
ctxp->function_decl = current_function_decl;
ctxp->class_type = current_class;
create_new_parser_context (1);
ctxp->next->filename = name;
}
static void
java_parser_context_resume (void)
{
struct parser_ctxt *old = ctxp;
struct parser_ctxt *saver = old->next;
struct parser_ctxt *restored = saver->next;
restored->classd_list = old->classd_list;
restored->class_list = old->class_list;
current_class = saver->class_type;
current_function_decl = saver->function_decl;
ctxp = restored;
memcpy (&ctxp->marker_begining, &old->marker_begining,
(size_t)(&ctxp->marker_end - &ctxp->marker_begining));
}
static void
java_parser_context_push_initialized_field (void)
{
tree node;
node = build_tree_list (NULL_TREE, NULL_TREE);
TREE_CHAIN (node) = CPC_STATIC_INITIALIZER_LIST (ctxp);
CPC_STATIC_INITIALIZER_LIST (ctxp) = node;
node = build_tree_list (NULL_TREE, NULL_TREE);
TREE_CHAIN (node) = CPC_INITIALIZER_LIST (ctxp);
CPC_INITIALIZER_LIST (ctxp) = node;
node = build_tree_list (NULL_TREE, NULL_TREE);
TREE_CHAIN (node) = CPC_INSTANCE_INITIALIZER_LIST (ctxp);
CPC_INSTANCE_INITIALIZER_LIST (ctxp) = node;
}
static void
java_parser_context_pop_initialized_field (void)
{
tree stmts;
tree class_type = TREE_TYPE (GET_CPC ());
if (CPC_INITIALIZER_LIST (ctxp))
{
stmts = CPC_INITIALIZER_STMT (ctxp);
CPC_INITIALIZER_LIST (ctxp) = TREE_CHAIN (CPC_INITIALIZER_LIST (ctxp));
if (stmts && !java_error_count)
TYPE_FINIT_STMT_LIST (class_type) = reorder_static_initialized (stmts);
}
if (CPC_STATIC_INITIALIZER_LIST (ctxp))
{
stmts = CPC_STATIC_INITIALIZER_STMT (ctxp);
CPC_STATIC_INITIALIZER_LIST (ctxp) =
TREE_CHAIN (CPC_STATIC_INITIALIZER_LIST (ctxp));
if (stmts && !java_error_count)
TYPE_CLINIT_STMT_LIST (class_type) = nreverse (stmts);
}
if (CPC_INSTANCE_INITIALIZER_LIST (ctxp))
{
stmts = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
CPC_INSTANCE_INITIALIZER_LIST (ctxp) =
TREE_CHAIN (CPC_INSTANCE_INITIALIZER_LIST (ctxp));
if (stmts && !java_error_count)
TYPE_II_STMT_LIST (class_type) = nreverse (stmts);
}
}
static tree
reorder_static_initialized (tree list)
{
tree marker, previous = NULL_TREE;
for (marker = list; marker; previous = marker, marker = TREE_CHAIN (marker))
if (TREE_CODE (marker) == TREE_LIST
&& !TREE_VALUE (marker) && !TREE_PURPOSE (marker))
break;
if (!previous)
list = TREE_CHAIN (marker);
else if (!marker)
list = nreverse (list);
else
{
TREE_CHAIN (previous) = NULL_TREE;
list = nreverse (list);
list = chainon (TREE_CHAIN (marker), list);
}
return list;
}
#define TAB_CONTEXT(C) \
{int i; for (i = 0; i < (C); i++) fputc (' ', stderr);}
static void
java_debug_context_do (int tab)
{
struct parser_ctxt *copy = ctxp;
while (copy)
{
TAB_CONTEXT (tab);
fprintf (stderr, "ctxt: 0x%0lX\n", (unsigned long)copy);
TAB_CONTEXT (tab);
fprintf (stderr, "filename: %s\n", copy->filename);
TAB_CONTEXT (tab);
fprintf (stderr, "package: %s\n",
(copy->package ?
IDENTIFIER_POINTER (copy->package) : "<none>"));
TAB_CONTEXT (tab);
fprintf (stderr, "context for saving: %d\n", copy->saved_data_ctx);
TAB_CONTEXT (tab);
fprintf (stderr, "saved data: %d\n", copy->saved_data);
copy = copy->next;
tab += 2;
}
}
void
java_debug_context (void)
{
java_debug_context_do (0);
}
static int force_error = 0;
static void
parse_ctor_invocation_error (void)
{
if (DECL_CONSTRUCTOR_P (current_function_decl))
yyerror ("Constructor invocation must be first thing in a constructor");
else
yyerror ("Only constructors can invoke constructors");
}
static tree
parse_jdk1_1_error (const char *msg)
{
sorry (": %qs JDK1.1(TM) feature", msg);
java_error_count++;
return build_java_empty_stmt ();
}
static int do_warning = 0;
void
yyerror (const char *msgid)
{
#ifdef USE_MAPPED_LOCATION
static source_location elc;
expanded_location xloc = expand_location (input_location);
int current_line = xloc.line;
#else
static java_lc elc;
int save_lineno;
int current_line = input_line;
#endif
static int prev_lineno;
static const char *prev_msg;
char *remainder, *code_from_source;
if (!force_error && prev_lineno == current_line)
return;
#ifndef USE_MAPPED_LOCATION
current_line = ctxp->lexer->token_start.line;
#endif
if (ctxp->java_error_flag == 0)
{
ctxp->java_error_flag = 1;
#ifdef USE_MAPPED_LOCATION
elc = input_location;
#else
elc = ctxp->lexer->token_start;
#endif
#ifdef VERBOSE_SKELETON
printf ("* Error detected (%s)\n", (msgid ? msgid : "(null)"));
#endif
return;
}
if (!force_error && msgid == prev_msg && prev_lineno == current_line)
return;
ctxp->java_error_flag = 0;
if (do_warning)
java_warning_count++;
else
java_error_count++;
#if 0
if (elc.col == 0 && msgid && msgid[1] == ';')
elc = ctxp->prev_line_end;
#endif
prev_msg = msgid;
#ifdef USE_MAPPED_LOCATION
prev_lineno = current_line;
code_from_source = java_get_line_col (xloc.file, current_line, xloc.column);
#else
save_lineno = input_line;
prev_lineno = input_line = current_line;
code_from_source = java_get_line_col (input_filename, current_line,
ctxp->lexer->token_start.col);
#endif
obstack_grow0 (&temporary_obstack,
code_from_source, strlen (code_from_source));
remainder = obstack_finish (&temporary_obstack);
if (do_warning)
warning ("%s.\n%s", msgid, remainder);
else
error ("%s.\n%s", msgid, remainder);
#ifndef USE_MAPPED_LOCATION
input_line = save_lineno;
#endif
ctxp->prevent_ese = input_line;
}
static void
issue_warning_error_from_context (
#ifdef USE_MAPPED_LOCATION
source_location cl,
#else
tree cl,
#endif
const char *msgid, va_list *ap)
{
#ifdef USE_MAPPED_LOCATION
source_location saved_location = input_location;
expanded_location xloc = expand_location (cl);
#else
java_lc save_lc = ctxp->lexer->token_start;
const char *saved = ctxp->filename, *saved_input_filename;
#endif
char buffer [4096];
text_info text;
text.err_no = errno;
text.args_ptr = ap;
text.format_spec = msgid;
pp_format_text (global_dc->printer, &text);
strncpy (buffer, pp_formatted_text (global_dc->printer), sizeof (buffer) - 1);
buffer[sizeof (buffer) - 1] = '\0';
pp_clear_output_area (global_dc->printer);
force_error = 1;
#ifdef USE_MAPPED_LOCATION
if (xloc.file != NULL)
{
ctxp->filename = xloc.file;
input_location = cl;
}
#else
ctxp->lexer->token_start.line = EXPR_WFL_LINENO (cl);
ctxp->lexer->token_start.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1
: EXPR_WFL_COLNO (cl) == 0xffe ? -2
: EXPR_WFL_COLNO (cl));
if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
ctxp->filename = EXPR_WFL_FILENAME (cl);
saved_input_filename = input_filename;
input_filename = ctxp->filename;
#endif
java_error (NULL);
java_error (buffer);
#ifdef USE_MAPPED_LOCATION
input_location = saved_location;
#else
ctxp->filename = saved;
input_filename = saved_input_filename;
ctxp->lexer->token_start = save_lc;
#endif
force_error = 0;
}
void
parse_error_context (tree cl, const char *msgid, ...)
{
va_list ap;
va_start (ap, msgid);
#ifdef USE_MAPPED_LOCATION
issue_warning_error_from_context (EXPR_LOCATION (cl), msgid, &ap);
#else
issue_warning_error_from_context (cl, msgid, &ap);
#endif
va_end (ap);
}
static void
parse_warning_context (tree cl, const char *msgid, ...)
{
va_list ap;
va_start (ap, msgid);
do_warning = 1;
#ifdef USE_MAPPED_LOCATION
issue_warning_error_from_context (EXPR_LOCATION (cl), msgid, &ap);
#else
issue_warning_error_from_context (cl, msgid, &ap);
#endif
do_warning = 0;
va_end (ap);
}
static tree
find_expr_with_wfl (tree node)
{
while (node)
{
enum tree_code_class code;
tree to_return;
switch (TREE_CODE (node))
{
case BLOCK:
node = BLOCK_EXPR_BODY (node);
continue;
case COMPOUND_EXPR:
to_return = find_expr_with_wfl (TREE_OPERAND (node, 0));
if (to_return)
return to_return;
node = TREE_OPERAND (node, 1);
continue;
case LOOP_EXPR:
node = TREE_OPERAND (node, 0);
continue;
case LABELED_BLOCK_EXPR:
node = LABELED_BLOCK_BODY (node);
continue;
default:
code = TREE_CODE_CLASS (TREE_CODE (node));
if (((code == tcc_unary) || (code == tcc_binary)
|| (code == tcc_expression))
&& EXPR_WFL_LINECOL (node))
return node;
return NULL_TREE;
}
}
return NULL_TREE;
}
static void
missing_return_error (tree method)
{
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (wfl_operator, DECL_FUNCTION_LAST_LINE (method));
#else
EXPR_WFL_SET_LINECOL (wfl_operator, DECL_FUNCTION_LAST_LINE (method), -2);
#endif
parse_error_context (wfl_operator, "Missing return statement");
}
static void
unreachable_stmt_error (tree node)
{
if (TREE_CODE (node) == COMPOUND_EXPR)
node = find_expr_with_wfl (TREE_OPERAND (node, 1));
else
node = find_expr_with_wfl (node);
if (node)
{
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (wfl_operator, EXPR_LOCATION (node));
#else
EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
#endif
parse_error_context (wfl_operator, "Unreachable statement");
}
else
abort ();
}
static int
not_accessible_field_error (tree wfl, tree decl)
{
parse_error_context
(wfl, "Can't access %s field %<%s.%s%> from %qs",
accessibility_string (get_access_flags_from_decl (decl)),
GET_TYPE_NAME (DECL_CONTEXT (decl)),
IDENTIFIER_POINTER (DECL_NAME (decl)),
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
return 1;
}
int
java_report_errors (void)
{
if (java_error_count)
fprintf (stderr, "%d error%s",
java_error_count, (java_error_count == 1 ? "" : "s"));
if (java_warning_count)
fprintf (stderr, "%s%d warning%s", (java_error_count ? ", " : ""),
java_warning_count, (java_warning_count == 1 ? "" : "s"));
if (java_error_count || java_warning_count)
putc ('\n', stderr);
return java_error_count;
}
static char *
java_accstring_lookup (int flags)
{
static char buffer [80];
#define COPY_RETURN(S) {strcpy (buffer, S); return buffer;}
if (flags & ACC_PUBLIC) COPY_RETURN ("public");
if (flags & ACC_PRIVATE) COPY_RETURN ("private");
if (flags & ACC_PROTECTED) COPY_RETURN ("protected");
if (flags & ACC_STATIC) COPY_RETURN ("static");
if (flags & ACC_FINAL) COPY_RETURN ("final");
if (flags & ACC_SYNCHRONIZED) COPY_RETURN ("synchronized");
if (flags & ACC_VOLATILE) COPY_RETURN ("volatile");
if (flags & ACC_TRANSIENT) COPY_RETURN ("transient");
if (flags & ACC_NATIVE) COPY_RETURN ("native");
if (flags & ACC_INTERFACE) COPY_RETURN ("interface");
if (flags & ACC_ABSTRACT) COPY_RETURN ("abstract");
buffer [0] = '\0';
return buffer;
#undef COPY_RETURN
}
static const char *
accessibility_string (int flags)
{
if (flags & ACC_PRIVATE) return "private";
if (flags & ACC_PROTECTED) return "protected";
if (flags & ACC_PUBLIC) return "public";
return "package-private";
}
static void
classitf_redefinition_error (const char *context, tree id, tree decl, tree cl)
{
parse_error_context (cl, "%s %qs already defined in %s:%d",
context, IDENTIFIER_POINTER (id),
DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
}
static void
variable_redefinition_error (tree context, tree name, tree type, int line)
{
const char *type_name;
if (TREE_CODE (type) == POINTER_TYPE && !TREE_TYPE (type))
type_name = IDENTIFIER_POINTER (TYPE_NAME (type));
else
type_name = lang_printable_name (type, 0);
parse_error_context (context,
"Variable %qs is already defined in this method and was declared %<%s %s%> at line %d",
IDENTIFIER_POINTER (name),
type_name, IDENTIFIER_POINTER (name), line);
}
static int
build_type_name_from_array_name (tree aname, tree *trimmed)
{
const char *name = IDENTIFIER_POINTER (aname);
int len = IDENTIFIER_LENGTH (aname);
int array_dims;
STRING_STRIP_BRACKETS (name, len, array_dims);
if (array_dims && trimmed)
*trimmed = get_identifier_with_length (name, len);
return array_dims;
}
static tree
build_array_from_name (tree type, tree type_wfl, tree name, tree *ret_name)
{
int more_dims = 0;
more_dims = build_type_name_from_array_name (name, &name);
if (more_dims)
{
tree save = type;
if (TREE_CODE (type) == POINTER_TYPE)
type = TREE_TYPE (type);
if (JPRIMITIVE_TYPE_P (type))
{
type = build_java_array_type (type, -1);
more_dims--;
}
else if (type_wfl)
{
type = type_wfl;
more_dims += build_type_name_from_array_name (TYPE_NAME (save),
NULL);
}
while (more_dims--)
type = build_unresolved_array_type (type);
if (type_wfl)
type = obtain_incomplete_type (type);
}
if (ret_name)
*ret_name = name;
return type;
}
static tree
build_unresolved_array_type (tree type_or_wfl)
{
const char *ptr;
tree wfl;
if (TREE_CODE (type_or_wfl) == RECORD_TYPE)
return build_java_array_type (type_or_wfl, -1);
obstack_grow (&temporary_obstack,
IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
obstack_grow0 (&temporary_obstack, "[]", 2);
ptr = obstack_finish (&temporary_obstack);
#ifdef USE_MAPPED_LOCATION
wfl = build_expr_wfl (get_identifier (ptr), EXPR_LOCATION (type_or_wfl));
#else
wfl = build_expr_wfl (get_identifier (ptr),
EXPR_WFL_FILENAME (type_or_wfl),
EXPR_WFL_LINENO (type_or_wfl),
EXPR_WFL_COLNO (type_or_wfl));
#endif
EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl);
return wfl;
}
static void
parser_add_interface (tree class_decl, tree interface_decl, tree wfl)
{
if (maybe_add_interface (TREE_TYPE (class_decl), TREE_TYPE (interface_decl)))
parse_error_context (wfl, "Interface %qs repeated",
IDENTIFIER_POINTER (DECL_NAME (interface_decl)));
}
static int
check_class_interface_creation (int is_interface, int flags, tree raw_name,
tree qualified_name, tree decl, tree cl)
{
tree node;
int sca = 0;
int icaf = 0;
int uaaf = CLASS_MODIFIERS;
if (!quiet_flag)
fprintf (stderr, " %s%s %s",
(CPC_INNER_P () ? "inner" : ""),
(is_interface ? "interface" : "class"),
IDENTIFIER_POINTER (qualified_name));
if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
&& (node = find_name_in_single_imports (raw_name))
&& !CPC_INNER_P ())
{
parse_error_context
(cl, "%s name %qs clashes with imported type %qs",
(is_interface ? "Interface" : "Class"),
IDENTIFIER_POINTER (raw_name), IDENTIFIER_POINTER (node));
return 1;
}
if (decl && CLASS_COMPLETE_P (decl))
{
classitf_redefinition_error ((is_interface ? "Interface" : "Class"),
qualified_name, decl, cl);
return 1;
}
if (check_inner_class_redefinition (raw_name, cl))
return 1;
if (!CPC_INNER_P () && (flags & ACC_PUBLIC ))
{
const char *fname = input_filename;
const char *f;
for (f = fname + strlen (fname);
f != fname && ! IS_DIR_SEPARATOR (*f);
f--)
;
if (IS_DIR_SEPARATOR (*f))
f++;
if (strncmp (IDENTIFIER_POINTER (raw_name),
f , IDENTIFIER_LENGTH (raw_name)) ||
f [IDENTIFIER_LENGTH (raw_name)] != '.')
parse_error_context
(cl, "Public %s %qs must be defined in a file called %<%s.java%>",
(is_interface ? "interface" : "class"),
IDENTIFIER_POINTER (qualified_name),
IDENTIFIER_POINTER (raw_name));
}
if (flags & ACC_STATIC)
{
if (CPC_INNER_P () && !TOPLEVEL_CLASS_DECL_P (GET_CPC()))
{
parse_error_context (cl, "Inner class %qs can't be static. Static classes can only occur in interfaces and top-level classes",
IDENTIFIER_POINTER (qualified_name));
sca = ACC_STATIC;
}
else
sca = (GET_CPC_LIST () ? ACC_STATIC : 0);
}
if (CPC_INNER_P ())
{
if (current_function_decl)
icaf = sca = uaaf = ACC_FINAL;
else
{
check_modifiers_consistency (flags);
icaf = ACC_PROTECTED;
if (! CLASS_INTERFACE (GET_CPC ()))
icaf |= ACC_PRIVATE;
}
}
if (is_interface)
{
if (CPC_INNER_P ())
uaaf = INTERFACE_INNER_MODIFIERS;
else
uaaf = INTERFACE_MODIFIERS;
check_modifiers ("Illegal modifier %qs for interface declaration",
flags, uaaf);
}
else
check_modifiers ((current_function_decl ?
"Illegal modifier %qs for local class declaration" :
"Illegal modifier %qs for class declaration"),
flags, uaaf|sca|icaf);
return 0;
}
static int
make_nested_class_name (tree cpc_list)
{
tree name;
if (!cpc_list)
return 0;
make_nested_class_name (TREE_CHAIN (cpc_list));
name = (TREE_CHAIN (cpc_list)
? TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list)));
obstack_grow (&temporary_obstack,
IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name));
obstack_1grow (&temporary_obstack, '$');
return ISDIGIT (IDENTIFIER_POINTER (name)[0]);
}
static int
check_inner_class_redefinition (tree raw_name, tree cl)
{
tree scope_list;
for (scope_list = GET_CPC_LIST (); scope_list;
scope_list = GET_NEXT_ENCLOSING_CPC (scope_list))
if (raw_name == GET_CPC_UN_NODE (scope_list))
{
parse_error_context
(cl, "The class name %qs is already defined in this scope. An inner class may not have the same simple name as any of its enclosing classes",
IDENTIFIER_POINTER (raw_name));
return 1;
}
return 0;
}
static tree
resolve_inner_class (htab_t circularity_hash, tree cl, tree *enclosing,
tree *super, tree class_type)
{
tree local_enclosing = *enclosing;
tree local_super = NULL_TREE;
while (local_enclosing)
{
tree intermediate, decl;
*htab_find_slot (circularity_hash, local_enclosing, INSERT) =
local_enclosing;
if ((decl = find_as_inner_class (local_enclosing, class_type, cl)))
return decl;
intermediate = local_enclosing;
while (INNER_CLASS_DECL_P (intermediate))
{
intermediate = DECL_CONTEXT (intermediate);
if ((decl = find_as_inner_class (intermediate, class_type, cl)))
return decl;
}
if (JPRIMITIVE_TYPE_P (TREE_TYPE (local_enclosing))
|| TREE_TYPE (local_enclosing) == void_type_node)
{
parse_error_context (cl, "Qualifier must be a reference");
local_enclosing = NULL_TREE;
break;
}
local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing));
if (!local_super || local_super == object_type_node)
break;
if (TREE_CODE (local_super) == POINTER_TYPE)
local_super = do_resolve_class (NULL, local_super, NULL, NULL);
else
local_super = TYPE_NAME (local_super);
if (htab_find (circularity_hash, local_super) != NULL)
{
if (!cl)
cl = lookup_cl (local_enclosing);
parse_error_context
(cl, "Cyclic inheritance involving %s",
IDENTIFIER_POINTER (DECL_NAME (local_enclosing)));
local_enclosing = NULL_TREE;
}
else
local_enclosing = local_super;
}
*super = local_super;
*enclosing = local_enclosing;
return NULL_TREE;
}
static tree
find_as_inner_class (tree enclosing, tree name, tree cl)
{
tree qual, to_return;
if (!enclosing)
return NULL_TREE;
name = TYPE_NAME (name);
if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
qual = EXPR_WFL_QUALIFICATION (cl);
else if (cl)
qual = build_tree_list (cl, NULL_TREE);
else
qual = build_tree_list (build_unknown_wfl (name), NULL_TREE);
if ((to_return = find_as_inner_class_do (qual, enclosing)))
return to_return;
if (QUALIFIED_P (name) && cl && EXPR_WFL_NODE (cl) == name)
{
tree acc = NULL_TREE, decl = NULL_TREE, ptr;
for (qual = EXPR_WFL_QUALIFICATION (cl); qual && !decl;
qual = TREE_CHAIN (qual))
{
acc = merge_qualified_name (acc,
EXPR_WFL_NODE (TREE_PURPOSE (qual)));
BUILD_PTR_FROM_NAME (ptr, acc);
decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl);
}
if (decl)
enclosing = decl;
else
qual = EXPR_WFL_QUALIFICATION (cl);
}
else
qual = build_tree_list (build_unknown_wfl (name), NULL_TREE);
return find_as_inner_class_do (qual, enclosing);
}
static tree
find_as_inner_class_do (tree qual, tree enclosing)
{
if (!qual)
return NULL_TREE;
for (; qual && enclosing; qual = TREE_CHAIN (qual))
{
tree name_to_match = EXPR_WFL_NODE (TREE_PURPOSE (qual));
tree next_enclosing = NULL_TREE;
tree inner_list;
for (inner_list = DECL_INNER_CLASS_LIST (enclosing);
inner_list; inner_list = TREE_CHAIN (inner_list))
{
if (TREE_VALUE (inner_list) == name_to_match)
{
next_enclosing = TREE_PURPOSE (inner_list);
break;
}
}
enclosing = next_enclosing;
}
return (!qual && enclosing ? enclosing : NULL_TREE);
}
static void
link_nested_class_to_enclosing (void)
{
if (GET_ENCLOSING_CPC ())
{
tree enclosing = GET_ENCLOSING_CPC_CONTEXT ();
DECL_INNER_CLASS_LIST (enclosing) =
tree_cons (GET_CPC (), GET_CPC_UN (),
DECL_INNER_CLASS_LIST (enclosing));
}
}
static tree
maybe_make_nested_class_name (tree name)
{
tree id = NULL_TREE;
if (CPC_INNER_P ())
{
if (! make_nested_class_name (GET_CPC_LIST ())
&& current_function_decl != NULL_TREE
&& ! ISDIGIT (IDENTIFIER_POINTER (name)[0]))
{
char buf[10];
sprintf (buf, "%d", anonymous_class_counter);
++anonymous_class_counter;
obstack_grow (&temporary_obstack, buf, strlen (buf));
obstack_1grow (&temporary_obstack, '$');
}
obstack_grow0 (&temporary_obstack,
IDENTIFIER_POINTER (name),
IDENTIFIER_LENGTH (name));
id = get_identifier (obstack_finish (&temporary_obstack));
if (ctxp->package)
QUALIFIED_P (id) = 1;
}
return id;
}
static tree
maybe_create_class_interface_decl (tree decl, tree raw_name,
tree qualified_name, tree cl)
{
if (!decl)
decl = push_class (make_class (), qualified_name);
#ifdef USE_MAPPED_LOCATION
DECL_SOURCE_LOCATION (decl) = EXPR_LOCATION (cl);
#else
DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
if (flag_emit_xref)
DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
else
DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
#endif
CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
CLASS_PARSED_P (TREE_TYPE (decl)) = 1;
#ifdef USE_MAPPED_LOCATION
{
tree tmp = maybe_get_identifier (EXPR_FILENAME (cl));
CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
tmp && IS_A_COMMAND_LINE_FILENAME_P (tmp);
}
#else
CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
#endif
PUSH_CPC (decl, raw_name);
DECL_CONTEXT (decl) = GET_ENCLOSING_CPC_CONTEXT ();
TREE_CHAIN (decl) = ctxp->class_list;
ctxp->class_list = decl;
gclass_list = tree_cons (NULL_TREE, decl, gclass_list);
all_class_list = tree_cons (NULL_TREE, decl, all_class_list);
create_jdep_list (ctxp);
SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
IDENTIFIER_POINTER (qualified_name)));
return decl;
}
static void
add_superinterfaces (tree decl, tree interface_list)
{
tree node;
for (node = interface_list; node; node = TREE_CHAIN (node))
{
tree current = TREE_PURPOSE (node);
tree idecl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (current));
if (idecl && CLASS_LOADED_P (TREE_TYPE (idecl)))
{
if (!parser_check_super_interface (idecl, decl, current))
parser_add_interface (decl, idecl, current);
}
else
register_incomplete_type (JDEP_INTERFACE,
current, decl, NULL_TREE);
}
}
static tree
create_interface (int flags, tree id, tree super)
{
tree raw_name = EXPR_WFL_NODE (id);
tree q_name = parser_qualified_classname (raw_name);
tree decl = IDENTIFIER_CLASS_VALUE (q_name);
if (ctxp->class_err && id == super)
super = NULL;
EXPR_WFL_NODE (id) = q_name;
if (check_class_interface_creation (1, flags, raw_name, q_name, decl, id))
{
PUSH_ERROR ();
return NULL_TREE;
}
if (CPC_INNER_P ())
{
java_parser_context_suspend ();
if (CLASS_INTERFACE (GET_CPC ()))
flags |= ACC_PUBLIC;
}
java_parser_context_push_initialized_field ();
if ((flags & ACC_ABSTRACT) && flag_redundant)
parse_warning_context
(MODIFIER_WFL (ABSTRACT_TK),
"Redundant use of %<abstract%> modifier. Interface %qs is implicitly abstract", IDENTIFIER_POINTER (raw_name));
decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id);
flags |= ACC_ABSTRACT;
if (INNER_CLASS_DECL_P (decl))
flags |= ACC_STATIC;
set_super_info (ACC_INTERFACE | flags, TREE_TYPE (decl),
object_type_node, ctxp->interface_number);
ctxp->interface_number = 0;
CLASS_COMPLETE_P (decl) = 1;
add_superinterfaces (decl, super);
CHECK_DEPRECATED (decl);
return decl;
}
static void
patch_anonymous_class (tree type_decl, tree class_decl, tree wfl)
{
tree class = TREE_TYPE (class_decl);
tree type = TREE_TYPE (type_decl);
tree binfo = TYPE_BINFO (class);
if (CLASS_INTERFACE (type_decl))
{
if (parser_check_super_interface (type_decl, class_decl, wfl))
return;
if (!VEC_space (tree, BINFO_BASE_BINFOS (binfo), 1))
{
tree new_binfo;
tree base_binfo;
int i;
new_binfo = make_tree_binfo ((BINFO_N_BASE_BINFOS (binfo) + 1) * 2);
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
BINFO_BASE_APPEND (new_binfo, base_binfo);
CLASS_HAS_SUPER_FLAG (new_binfo) = CLASS_HAS_SUPER_FLAG (binfo);
BINFO_VTABLE (new_binfo) = BINFO_VTABLE (binfo);
TYPE_BINFO (class) = new_binfo;
}
parser_add_interface (class_decl, type_decl, wfl);
}
else
{
if (parser_check_super (type_decl, class_decl, wfl))
return;
BINFO_TYPE (BINFO_BASE_BINFO (binfo, 0)) = type;
}
}
static tree
create_anonymous_class (tree type_name)
{
char buffer [80];
tree super = NULL_TREE, itf = NULL_TREE;
tree id, type_decl, class;
sprintf (buffer, "%d", anonymous_class_counter++);
id = build_wfl_node (get_identifier (buffer));
EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (type_name);
if ((type_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (type_name))))
{
if (CLASS_INTERFACE (type_decl))
{
ctxp->interface_number = 1;
itf = build_tree_list (type_name, NULL_TREE);
}
else
super = type_name;
}
class = create_class (ACC_FINAL, id, super, itf);
if (!type_decl)
register_incomplete_type (JDEP_ANONYMOUS, type_name, class, NULL_TREE);
ANONYMOUS_CLASS_P (TREE_TYPE (class)) = 1;
return class;
}
static tree
create_class (int flags, tree id, tree super, tree interfaces)
{
tree raw_name = EXPR_WFL_NODE (id);
tree class_id, decl;
tree super_decl_type;
if (ctxp->class_err && id == super)
super = NULL;
class_id = parser_qualified_classname (raw_name);
decl = IDENTIFIER_CLASS_VALUE (class_id);
EXPR_WFL_NODE (id) = class_id;
if (check_class_interface_creation (0, flags, raw_name, class_id, decl, id))
{
PUSH_ERROR ();
return NULL_TREE;
}
if (CPC_INNER_P ())
{
java_parser_context_suspend ();
if (CLASS_INTERFACE (GET_CPC ()))
flags |= ACC_PUBLIC;
}
java_parser_context_push_initialized_field ();
if ((flags & ACC_ABSTRACT) && (flags & ACC_FINAL))
parse_error_context
(id, "Class %qs can't be declared both abstract and final",
IDENTIFIER_POINTER (raw_name));
decl = maybe_create_class_interface_decl (decl, raw_name, class_id, id);
if (super)
{
if (TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_id)) == object_type_node)
{
parse_error_context (id, "%<java.lang.Object%> can't extend anything");
return NULL_TREE;
}
super_decl_type =
register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE);
}
else if (TREE_TYPE (decl) != object_type_node)
super_decl_type = object_type_node;
else
super_decl_type = NULL_TREE;
if (INNER_CLASS_DECL_P (decl)
&& CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (DECL_CONTEXT (decl)))))
{
flags |= ACC_STATIC;
}
set_super_info (flags, TREE_TYPE (decl), super_decl_type,
ctxp->interface_number);
ctxp->interface_number = 0;
CLASS_COMPLETE_P (decl) = 1;
add_superinterfaces (decl, interfaces);
TYPE_VFIELD (TREE_TYPE (decl)) = TYPE_VFIELD (object_type_node);
if (PURE_INNER_CLASS_DECL_P (decl))
add_inner_class_fields (decl, current_function_decl);
if (flag_emit_xref && super)
DECL_INHERITED_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (super);
CHECK_DEPRECATED (decl);
if (!INNER_CLASS_DECL_P (decl))
anonymous_class_counter = 1;
return decl;
}
static void
end_class_declaration (int resume)
{
int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node;
if (GET_CPC () != error_mark_node)
dump_java_tree (TDI_class, GET_CPC ());
java_parser_context_pop_initialized_field ();
POP_CPC ();
if (resume && no_error_occurred)
java_parser_context_resume ();
ctxp->interface_number = 0;
}
static void
add_inner_class_fields (tree class_decl, tree fct_decl)
{
tree block, marker, f;
f = add_field (TREE_TYPE (class_decl),
build_current_thisn (TREE_TYPE (class_decl)),
build_pointer_type (TREE_TYPE (DECL_CONTEXT (class_decl))),
ACC_PRIVATE);
FIELD_THISN (f) = 1;
if (!fct_decl)
return;
for (block = GET_CURRENT_BLOCK (fct_decl);
block && TREE_CODE (block) == BLOCK; block = BLOCK_SUPERCONTEXT (block))
{
tree decl;
for (decl = BLOCK_EXPR_DECLS (block); decl; decl = TREE_CHAIN (decl))
{
tree name, pname;
tree wfl, init, list;
if (!LOCAL_FINAL_P (decl))
continue;
MANGLE_OUTER_LOCAL_VARIABLE_NAME (name, DECL_NAME (decl));
MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID (pname, DECL_NAME (decl));
wfl = build_wfl_node (name);
init = build_wfl_node (pname);
init = build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (wfl),
wfl, init);
list = build_tree_list (wfl, init);
ARG_FINAL_P (list) = 1;
register_fields (ACC_PRIVATE | ACC_FINAL, TREE_TYPE (decl), list);
}
}
if (!CPC_INITIALIZER_STMT (ctxp))
return;
marker = build_tree_list (NULL_TREE, NULL_TREE);
TREE_CHAIN (marker) = CPC_INITIALIZER_STMT (ctxp);
SET_CPC_INITIALIZER_STMT (ctxp, marker);
}
static tree
find_field (tree class, tree name)
{
tree decl;
for (decl = TYPE_FIELDS (class); decl; decl = TREE_CHAIN (decl))
{
if (DECL_NAME (decl) == name)
return decl;
}
return NULL_TREE;
}
static tree
lookup_field_wrapper (tree class, tree name)
{
tree type = class;
tree decl = NULL_TREE;
java_parser_context_save_global ();
if (INNER_CLASS_TYPE_P (class) && TREE_CODE (name) == IDENTIFIER_NODE)
{
tree new_name;
MANGLE_OUTER_LOCAL_VARIABLE_NAME (new_name, name);
decl = lookup_field (&type, new_name);
if (decl && decl != error_mark_node)
FIELD_LOCAL_ALIAS_USED (decl) = 1;
}
if (!decl || decl == error_mark_node)
{
type = class;
decl = lookup_field (&type, name);
}
if (!decl && INNER_CLASS_TYPE_P (class))
{
tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class)));
decl = lookup_field_wrapper (outer_type, name);
}
java_parser_context_restore_global ();
return decl == error_mark_node ? NULL : decl;
}
static int
duplicate_declaration_error_p (tree new_field_name, tree new_type, tree cl)
{
tree decl = find_field (TREE_TYPE (GET_CPC ()), new_field_name);
if (decl)
{
char *t1 = xstrdup (purify_type_name
((TREE_CODE (new_type) == POINTER_TYPE
&& TREE_TYPE (new_type) == NULL_TREE) ?
IDENTIFIER_POINTER (TYPE_NAME (new_type)) :
lang_printable_name (new_type, 1)));
char *t2 = xstrdup (purify_type_name
((TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
&& TREE_TYPE (TREE_TYPE (decl)) == NULL_TREE) ?
IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))) :
lang_printable_name (TREE_TYPE (decl), 1)));
parse_error_context
(cl, "Duplicate variable declaration: %<%s %s%> was %<%s %s%> (%s:%d)",
t1, IDENTIFIER_POINTER (new_field_name),
t2, IDENTIFIER_POINTER (DECL_NAME (decl)),
DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
free (t1);
free (t2);
return 1;
}
return 0;
}
static void
register_fields (int flags, tree type, tree variable_list)
{
tree current, saved_type;
tree class_type = NULL_TREE;
location_t saved_location = input_location;
int must_chain = 0;
tree wfl = NULL_TREE;
if (GET_CPC ())
class_type = TREE_TYPE (GET_CPC ());
if (!class_type || class_type == error_mark_node)
return;
if (CLASS_INTERFACE (TYPE_NAME (class_type)))
{
OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (PUBLIC_TK),
flags, ACC_PUBLIC, "interface field(s)");
OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (STATIC_TK),
flags, ACC_STATIC, "interface field(s)");
OBSOLETE_MODIFIER_WARNING (MODIFIER_WFL (FINAL_TK),
flags, ACC_FINAL, "interface field(s)");
check_modifiers ("Illegal interface member modifier %qs", flags,
INTERFACE_FIELD_MODIFIERS);
flags |= (ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
}
SET_TYPE_FOR_RESOLUTION (type, wfl, must_chain);
PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
for (current = variable_list, saved_type = type; current;
current = TREE_CHAIN (current), type = saved_type)
{
tree real_type;
tree field_decl;
tree cl = TREE_PURPOSE (current);
tree init = TREE_VALUE (current);
tree current_name = EXPR_WFL_NODE (cl);
if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (class_type)
&& !(flags & ACC_FINAL))
parse_error_context
(cl, "Field %qs can't be static in inner class %qs unless it is final",
IDENTIFIER_POINTER (EXPR_WFL_NODE (cl)),
lang_printable_name (class_type, 0));
type = build_array_from_name (type, wfl, current_name, ¤t_name);
if (type != saved_type)
{
PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
if (init)
EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = current_name;
}
real_type = GET_REAL_TYPE (type);
if (duplicate_declaration_error_p (current_name, real_type, cl))
continue;
#ifdef USE_MAPPED_LOCATION
input_location = EXPR_LOCATION (cl);
#else
if (flag_emit_xref)
input_line = EXPR_WFL_LINECOL (cl);
else
input_line = EXPR_WFL_LINENO (cl);
#endif
field_decl = add_field (class_type, current_name, real_type, flags);
CHECK_DEPRECATED_NO_RESET (field_decl);
if (!ARG_FINAL_P (current) && (flags & ACC_FINAL))
{
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl);
DECL_FIELD_FINAL_WFL (field_decl) = cl;
}
if (ARG_FINAL_P (current))
{
FIELD_LOCAL_ALIAS (field_decl) = 1;
FIELD_FINAL (field_decl) = 0;
}
if (must_chain)
register_incomplete_type (JDEP_FIELD, wfl, field_decl, type);
if (init)
{
if (flags & ACC_STATIC)
{
TREE_CHAIN (init) = CPC_STATIC_INITIALIZER_STMT (ctxp);
SET_CPC_STATIC_INITIALIZER_STMT (ctxp, init);
if (TREE_OPERAND (init, 1)
&& TREE_CODE (TREE_OPERAND (init, 1)) == NEW_ARRAY_INIT)
TREE_STATIC (TREE_OPERAND (init, 1)) = 1;
}
else
{
TREE_CHAIN (init) = CPC_INITIALIZER_STMT (ctxp);
SET_CPC_INITIALIZER_STMT (ctxp, init);
}
MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
DECL_INITIAL (field_decl) = TREE_OPERAND (init, 1);
}
}
CLEAR_DEPRECATED;
input_location = saved_location;
}
static tree
generate_finit (tree class_type)
{
int count = 0;
tree list = TYPE_FINIT_STMT_LIST (class_type);
tree mdecl, current, parms;
parms = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
class_type, NULL_TREE,
&count);
CRAFTED_PARAM_LIST_FIXUP (parms);
mdecl = create_artificial_method (class_type, ACC_PRIVATE, void_type_node,
finit_identifier_node, parms);
fix_method_argument_names (parms, mdecl);
layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
mdecl, NULL_TREE);
DECL_FUNCTION_NAP (mdecl) = count;
start_artificial_method_body (mdecl);
for (current = list; current; current = TREE_CHAIN (current))
java_method_add_stmt (mdecl,
build_debugable_stmt (EXPR_WFL_LINECOL (current),
current));
end_artificial_method_body (mdecl);
return mdecl;
}
static tree
generate_instinit (tree class_type)
{
tree current;
tree compound = NULL_TREE;
tree parms = tree_cons (this_identifier_node,
build_pointer_type (class_type), end_params_node);
tree mdecl = create_artificial_method (class_type, ACC_PRIVATE,
void_type_node,
instinit_identifier_node, parms);
layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
mdecl, NULL_TREE);
for (current = TYPE_II_STMT_LIST (class_type);
current; current = TREE_CHAIN (current))
compound = add_stmt_to_compound (compound, NULL_TREE, current);
if (!ANONYMOUS_CLASS_P (class_type) &&
ctors_unchecked_throws_clause_p (class_type))
{
compound = encapsulate_with_try_catch (0, exception_type_node, compound,
build1 (THROW_EXPR, NULL_TREE,
build_wfl_node (wpv_id)));
DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE,
exception_type_node);
}
start_artificial_method_body (mdecl);
java_method_add_stmt (mdecl, compound);
end_artificial_method_body (mdecl);
return mdecl;
}
static tree
build_instinit_invocation (tree class_type)
{
tree to_return = NULL_TREE;
if (TYPE_II_STMT_LIST (class_type))
{
tree parm = build_tree_list (NULL_TREE,
build_wfl_node (this_identifier_node));
to_return =
build_method_invocation (build_wfl_node (instinit_identifier_node),
parm);
}
return to_return;
}
static int patch_stage;
static tree
method_header (int flags, tree type, tree mdecl, tree throws)
{
tree type_wfl = NULL_TREE;
tree meth_name = NULL_TREE;
tree current, orig_arg, this_class = NULL;
tree id, meth;
location_t saved_location;
int constructor_ok = 0, must_chain;
int count;
if (mdecl == error_mark_node)
return error_mark_node;
meth = TREE_VALUE (mdecl);
id = TREE_PURPOSE (mdecl);
check_modifiers_consistency (flags);
if (GET_CPC ())
this_class = TREE_TYPE (GET_CPC ());
if (!this_class || this_class == error_mark_node)
return NULL_TREE;
if (type && (flags & ACC_ABSTRACT))
{
ABSTRACT_CHECK (flags, ACC_PRIVATE, id, "Private");
ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static");
ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final");
ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native");
ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized");
ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp");
if (!CLASS_ABSTRACT (TYPE_NAME (this_class))
&& !CLASS_INTERFACE (TYPE_NAME (this_class)))
parse_error_context
(id,
"Class %qs must be declared abstract to define abstract method %qs",
IDENTIFIER_POINTER (DECL_NAME (GET_CPC ())),
IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
}
if ((flags & ACC_NATIVE) && (flags & ACC_STRICT))
parse_error_context (id, "native method %qs can't be strictfp",
IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
if ((flags & ACC_TRANSIENT))
parse_error_context (id, "method %qs can't be transient",
IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
if ((flags & ACC_VOLATILE))
parse_error_context (id, "method %qs can't be volatile",
IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
if (!type)
{
int ec = java_error_count;
if (EXPR_WFL_NODE (id) != GET_CPC_UN ())
parse_error_context
(id, "Invalid method declaration, return type required");
else
{
JCONSTRUCTOR_CHECK (flags, ACC_ABSTRACT, id, "abstract");
JCONSTRUCTOR_CHECK (flags, ACC_STATIC, id, "static");
JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final");
JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native");
JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized");
JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp");
}
if (ec == java_error_count)
constructor_ok = 1;
}
if (CLASS_INTERFACE (TYPE_NAME (this_class)))
{
if (!(flags & ACC_PUBLIC))
MODIFIER_WFL (PUBLIC_TK) = NULL;
if (!(flags & ACC_ABSTRACT))
MODIFIER_WFL (ABSTRACT_TK) = NULL;
flags |= ACC_PUBLIC;
flags |= ACC_ABSTRACT;
}
if ((flags & ACC_STATIC) && !TOPLEVEL_CLASS_TYPE_P (this_class))
{
parse_error_context
(id, "Method %qs can't be static in inner class %qs. Only members of interfaces and top-level classes can be static",
IDENTIFIER_POINTER (EXPR_WFL_NODE (id)),
lang_printable_name (this_class, 0));
}
if (!type)
{
type = void_type_node;
if (constructor_ok)
meth_name = init_identifier_node;
}
else
meth_name = EXPR_WFL_NODE (id);
SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
if (meth_name)
type = build_array_from_name (type, type_wfl, meth_name, &meth_name);
EXPR_WFL_NODE (id) = meth_name;
PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
if (must_chain)
{
patch_stage = JDEP_METHOD_RETURN;
register_incomplete_type (patch_stage, type_wfl, id, type);
TREE_TYPE (meth) = GET_REAL_TYPE (type);
}
else
TREE_TYPE (meth) = type;
saved_location = input_location;
#ifdef USE_MAPPED_LOCATION
input_location = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
EXPR_LOCATION (id));
#else
input_line = (ctxp->first_ccb_indent1 ? (int) ctxp->first_ccb_indent1 :
EXPR_WFL_LINENO (id));
#endif
orig_arg = TYPE_ARG_TYPES (meth);
if (patch_stage)
{
jdep *jdep;
meth = add_method_1 (this_class, flags, meth_name, meth);
if (patch_stage == JDEP_METHOD_RETURN)
{
jdep = CLASSD_LAST (ctxp->classd_list);
JDEP_GET_PATCH (jdep) = &TREE_TYPE (TREE_TYPE (meth));
}
register_incomplete_type (JDEP_METHOD_END, NULL_TREE, meth, NULL_TREE);
}
else
meth = add_method (this_class, flags, meth_name,
build_java_signature (meth));
MARK_FINAL_PARMS (meth, orig_arg);
fix_method_argument_names (orig_arg, meth);
DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
input_location = saved_location;
if (throws)
{
throws = nreverse (throws);
for (current = throws; current; current = TREE_CHAIN (current))
{
register_incomplete_type (JDEP_EXCEPTION, TREE_VALUE (current),
NULL_TREE, NULL_TREE);
JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
&TREE_VALUE (current);
}
DECL_FUNCTION_THROWS (meth) = throws;
}
if (TREE_TYPE (GET_CPC ()) != object_type_node)
DECL_FUNCTION_WFL (meth) = id;
if (constructor_ok)
{
DECL_CONSTRUCTOR_P (meth) = 1;
for (count = 0, current = TYPE_FIELDS (this_class); current;
current = TREE_CHAIN (current))
if (FIELD_LOCAL_ALIAS (current))
count++;
DECL_FUNCTION_NAP (meth) = count;
}
CHECK_DEPRECATED (meth);
if (flag_emit_xref)
{
#ifdef USE_MAPPED_LOCATION
DECL_SOURCE_LOCATION (meth) = EXPR_LOCATION (id);
#else
DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
#endif
}
return meth;
}
static void
fix_method_argument_names (tree orig_arg, tree meth)
{
tree arg = TYPE_ARG_TYPES (TREE_TYPE (meth));
if (TREE_CODE (TREE_TYPE (meth)) == METHOD_TYPE)
{
TREE_PURPOSE (arg) = this_identifier_node;
arg = TREE_CHAIN (arg);
}
while (orig_arg != end_params_node)
{
TREE_PURPOSE (arg) = TREE_PURPOSE (orig_arg);
orig_arg = TREE_CHAIN (orig_arg);
arg = TREE_CHAIN (arg);
}
}
static void
finish_method_declaration (tree method_body)
{
int flags;
if (!current_function_decl)
return;
flags = get_access_flags_from_decl (current_function_decl);
if ((flags & ACC_ABSTRACT || flags & ACC_NATIVE) && method_body)
{
tree name = DECL_NAME (current_function_decl);
parse_error_context (DECL_FUNCTION_WFL (current_function_decl),
"%s method %qs can't have a body defined",
(METHOD_NATIVE (current_function_decl) ?
"Native" : "Abstract"),
IDENTIFIER_POINTER (name));
method_body = NULL_TREE;
}
else if (!(flags & ACC_ABSTRACT) && !(flags & ACC_NATIVE) && !method_body)
{
tree name = DECL_NAME (current_function_decl);
parse_error_context
(DECL_FUNCTION_WFL (current_function_decl),
"Non native and non abstract method %qs must have a body defined",
IDENTIFIER_POINTER (name));
method_body = NULL_TREE;
}
if (flag_emit_class_files && method_body
&& TREE_CODE (method_body) == NOP_EXPR
&& TREE_TYPE (current_function_decl)
&& TREE_TYPE (TREE_TYPE (current_function_decl)) == void_type_node)
method_body = build1 (RETURN_EXPR, void_type_node, NULL);
BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (current_function_decl)) = method_body;
maybe_absorb_scoping_blocks ();
exit_block ();
if (!flag_emit_xref)
DECL_FUNCTION_LAST_LINE (current_function_decl) = ctxp->last_ccb_indent1;
UNMARK_FINAL_PARMS (current_function_decl);
current_function_decl = NULL_TREE;
}
static char *
constructor_circularity_msg (tree from, tree to)
{
static char string [4096];
char *t = xstrdup (lang_printable_name (from, 2));
sprintf (string, "'%s' invokes '%s'", t, lang_printable_name (to, 2));
free (t);
return string;
}
static GTY(()) tree vcc_list;
static int
verify_constructor_circularity (tree meth, tree current)
{
tree c;
for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
{
if (TREE_VALUE (c) == meth)
{
char *t;
if (vcc_list)
{
tree liste;
vcc_list = nreverse (vcc_list);
for (liste = vcc_list; liste; liste = TREE_CHAIN (liste))
{
parse_error_context
(TREE_PURPOSE (TREE_PURPOSE (liste)), "%s",
constructor_circularity_msg
(TREE_VALUE (liste), TREE_VALUE (TREE_PURPOSE (liste))));
java_error_count--;
}
}
t = xstrdup (lang_printable_name (meth, 2));
parse_error_context (TREE_PURPOSE (c),
"%s: recursive invocation of constructor %qs",
constructor_circularity_msg (current, meth), t);
free (t);
vcc_list = NULL_TREE;
return 1;
}
}
for (c = DECL_CONSTRUCTOR_CALLS (current); c; c = TREE_CHAIN (c))
{
vcc_list = tree_cons (c, current, vcc_list);
if (verify_constructor_circularity (meth, TREE_VALUE (c)))
return 1;
vcc_list = TREE_CHAIN (vcc_list);
}
return 0;
}
static void
check_modifiers_consistency (int flags)
{
int acc_count = 0;
tree cl = NULL_TREE;
THIS_MODIFIER_ONLY (flags, ACC_PUBLIC, PUBLIC_TK, acc_count, cl);
THIS_MODIFIER_ONLY (flags, ACC_PRIVATE, PRIVATE_TK, acc_count, cl);
THIS_MODIFIER_ONLY (flags, ACC_PROTECTED, PROTECTED_TK, acc_count, cl);
if (acc_count > 1)
parse_error_context
(cl, "Inconsistent member declaration. At most one of %<public%>, %<private%>, or %<protected%> may be specified");
acc_count = 0;
cl = NULL_TREE;
THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK, acc_count, cl);
THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK, acc_count, cl);
if (acc_count > 1)
parse_error_context (cl,
"Inconsistent member declaration. At most one of %<final%> or %<volatile%> may be specified");
}
static void
check_abstract_method_header (tree meth)
{
int flags = get_access_flags_from_decl (meth);
OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (ABSTRACT_TK), flags,
ACC_ABSTRACT, "abstract method",
IDENTIFIER_POINTER (DECL_NAME (meth)));
OBSOLETE_MODIFIER_WARNING2 (MODIFIER_WFL (PUBLIC_TK), flags,
ACC_PUBLIC, "abstract method",
IDENTIFIER_POINTER (DECL_NAME (meth)));
check_modifiers ("Illegal modifier %qs for interface method",
flags, INTERFACE_METHOD_MODIFIERS);
}
static tree
method_declarator (tree id, tree list)
{
tree arg_types = NULL_TREE, current, node;
tree meth = make_node (FUNCTION_TYPE);
jdep *jdep;
patch_stage = JDEP_NO_PATCH;
if (GET_CPC () == error_mark_node)
return error_mark_node;
if (PURE_INNER_CLASS_DECL_P (GET_CPC ())
&& EXPR_WFL_NODE (id) == GET_CPC_UN ())
{
tree aliases_list, type, thisn;
aliases_list =
build_alias_initializer_parameter_list (AIPL_FUNCTION_DECLARATION,
TREE_TYPE (GET_CPC ()),
NULL_TREE, NULL);
list = chainon (nreverse (aliases_list), list);
type = TREE_TYPE (DECL_CONTEXT (GET_CPC ()));
thisn = build_current_thisn (TREE_TYPE (GET_CPC ()));
list = tree_cons (build_wfl_node (thisn), build_pointer_type (type),
list);
}
for (current = list; current; current = TREE_CHAIN (current))
{
int must_chain = 0;
tree wfl_name = TREE_PURPOSE (current);
tree type = TREE_VALUE (current);
tree name = EXPR_WFL_NODE (wfl_name);
tree already, arg_node;
tree type_wfl = NULL_TREE;
tree real_type;
SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
type = build_array_from_name (type, type_wfl, name, &name);
EXPR_WFL_NODE (wfl_name) = name;
real_type = GET_REAL_TYPE (type);
if (TREE_CODE (real_type) == RECORD_TYPE)
{
real_type = promote_type (real_type);
if (TREE_CODE (type) == TREE_LIST)
TREE_PURPOSE (type) = real_type;
}
for (already = arg_types; already; already = TREE_CHAIN (already))
if (TREE_PURPOSE (already) == name)
{
parse_error_context
(wfl_name, "Variable %qs is used more than once in the argument list of method %qs",
IDENTIFIER_POINTER (name),
IDENTIFIER_POINTER (EXPR_WFL_NODE (id)));
break;
}
jdep = NULL;
if (must_chain)
{
patch_stage = JDEP_METHOD;
type = register_incomplete_type (patch_stage,
type_wfl, wfl_name, type);
jdep = CLASSD_LAST (ctxp->classd_list);
JDEP_MISC (jdep) = id;
}
arg_node = build_tree_list (name, real_type);
ARG_FINAL_P (arg_node) = ARG_FINAL_P (current);
if (jdep)
JDEP_GET_PATCH (jdep) = &TREE_VALUE (arg_node);
TREE_CHAIN (arg_node) = arg_types;
arg_types = arg_node;
}
TYPE_ARG_TYPES (meth) = chainon (nreverse (arg_types), end_params_node);
node = build_tree_list (id, meth);
return node;
}
static int
unresolved_type_p (tree wfl, tree *returned)
{
if (TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION)
{
if (returned)
{
tree decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (wfl));
if (decl && current_class && (decl == TYPE_NAME (current_class)))
*returned = TREE_TYPE (decl);
else if (GET_CPC_UN () == EXPR_WFL_NODE (wfl))
*returned = TREE_TYPE (GET_CPC ());
else
*returned = NULL_TREE;
}
return 1;
}
if (returned)
*returned = wfl;
return 0;
}
static tree
parser_qualified_classname (tree name)
{
tree nested_class_name;
if ((nested_class_name = maybe_make_nested_class_name (name)))
return nested_class_name;
if (ctxp->package)
return merge_qualified_name (ctxp->package, name);
else
return name;
}
static int
parser_check_super_interface (tree super_decl, tree this_decl, tree this_wfl)
{
tree super_type = TREE_TYPE (super_decl);
if (!CLASS_INTERFACE (super_decl))
{
parse_error_context
(this_wfl, "%s %qs can't implement/extend %s %qs",
(CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ?
"Interface" : "Class"),
IDENTIFIER_POINTER (DECL_NAME (this_decl)),
(TYPE_ARRAY_P (super_type) ? "array" : "class"),
IDENTIFIER_POINTER (DECL_NAME (super_decl)));
return 1;
}
if (! INNER_CLASS_P (super_type)
&& check_pkg_class_access (DECL_NAME (super_decl),
NULL_TREE, true, this_decl))
return 1;
SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s",
IDENTIFIER_POINTER (DECL_NAME (this_decl)),
IDENTIFIER_POINTER (DECL_NAME (super_decl))));
return 0;
}
static int
parser_check_super (tree super_decl, tree this_decl, tree wfl)
{
tree super_type = TREE_TYPE (super_decl);
if (TYPE_ARRAY_P (super_type) || CLASS_INTERFACE (TYPE_NAME (super_type)))
{
parse_error_context
(wfl, "Class %qs can't subclass %s %qs",
IDENTIFIER_POINTER (DECL_NAME (this_decl)),
(CLASS_INTERFACE (TYPE_NAME (super_type)) ? "interface" : "array"),
IDENTIFIER_POINTER (DECL_NAME (super_decl)));
return 1;
}
if (CLASS_FINAL (TYPE_NAME (super_type)))
{
parse_error_context (wfl, "Can't subclass final classes: %s",
IDENTIFIER_POINTER (DECL_NAME (super_decl)));
return 1;
}
if (! INNER_CLASS_P (super_type)
&& (check_pkg_class_access (DECL_NAME (super_decl), wfl, true, NULL_TREE)))
return 1;
SOURCE_FRONTEND_DEBUG (("Completing class %s with %s",
IDENTIFIER_POINTER (DECL_NAME (this_decl)),
IDENTIFIER_POINTER (DECL_NAME (super_decl))));
return 0;
}
static void
create_jdep_list (struct parser_ctxt *ctxp)
{
jdeplist *new = xmalloc (sizeof (jdeplist));
new->first = new->last = NULL;
new->next = ctxp->classd_list;
ctxp->classd_list = new;
}
static jdeplist *
reverse_jdep_list (struct parser_ctxt *ctxp)
{
jdeplist *prev = NULL, *current, *next;
for (current = ctxp->classd_list; current; current = next)
{
next = current->next;
current->next = prev;
prev = current;
}
return prev;
}
static tree
obtain_incomplete_type (tree type_name)
{
tree ptr = NULL_TREE, name;
if (TREE_CODE (type_name) == EXPR_WITH_FILE_LOCATION)
name = EXPR_WFL_NODE (type_name);
else if (INCOMPLETE_TYPE_P (type_name))
name = TYPE_NAME (type_name);
else
abort ();
BUILD_PTR_FROM_NAME (ptr, name);
TYPE_MODE (ptr) = ptr_mode;
layout_type (ptr);
return ptr;
}
static tree
register_incomplete_type (int kind, tree wfl, tree decl, tree ptr)
{
jdep *new = xmalloc (sizeof (jdep));
if (!ptr && kind != JDEP_METHOD_END)
ptr = obtain_incomplete_type (wfl);
JDEP_KIND (new) = kind;
JDEP_DECL (new) = decl;
JDEP_TO_RESOLVE (new) = ptr;
JDEP_WFL (new) = wfl;
JDEP_CHAIN (new) = NULL;
JDEP_MISC (new) = NULL_TREE;
if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS || kind == JDEP_SUPER)
&& GET_ENCLOSING_CPC ())
JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ());
else
JDEP_ENCLOSING (new) = GET_CPC ();
JDEP_GET_PATCH (new) = (tree *)NULL;
JDEP_INSERT (ctxp->classd_list, new);
return ptr;
}
static tree
check_inner_circular_reference (tree source, tree target)
{
tree base_binfo;
tree ctx, cl;
int i;
for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (source), i, base_binfo); i++)
{
tree su;
su = BINFO_TYPE (base_binfo);
if (INCOMPLETE_TYPE_P (su))
continue;
if (inherits_from_p (su, target))
return lookup_cl (TYPE_NAME (su));
for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx))
{
if (ctx == TYPE_NAME (target))
return lookup_cl (TYPE_NAME (su));
if (! DECL_CONTEXT (ctx) &&
(cl = check_inner_circular_reference (TREE_TYPE (ctx), target)))
return cl;
}
}
return NULL_TREE;
}
static tree
check_circular_reference (tree type)
{
tree base_binfo;
int i;
if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
return NULL_TREE;
if (! CLASS_INTERFACE (TYPE_NAME (type)))
{
if (inherits_from_p (CLASSTYPE_SUPER (type), type))
return lookup_cl (TYPE_NAME (type));
return NULL_TREE;
}
for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (type), i, base_binfo); i++)
{
if (BINFO_TYPE (base_binfo) != object_type_node
&& interface_of_p (type, BINFO_TYPE (base_binfo)))
return lookup_cl (TYPE_NAME (BINFO_TYPE (base_binfo)));
}
return NULL_TREE;
}
void
java_check_circular_reference (void)
{
tree current;
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
{
tree type = TREE_TYPE (current);
tree cl;
cl = check_circular_reference (type);
if (! cl)
cl = check_inner_circular_reference (type, type);
if (cl)
parse_error_context (cl, "Cyclic class inheritance%s",
(cyclic_inheritance_report ?
cyclic_inheritance_report : ""));
}
}
static tree
build_alias_initializer_parameter_list (int mode, tree class_type, tree parm,
int *artificial)
{
tree field;
tree additional_parms = NULL_TREE;
for (field = TYPE_FIELDS (class_type); field; field = TREE_CHAIN (field))
if (FIELD_LOCAL_ALIAS (field))
{
const char *buffer = IDENTIFIER_POINTER (DECL_NAME (field));
tree purpose = NULL_TREE, value = NULL_TREE, name = NULL_TREE;
tree mangled_id;
switch (mode)
{
case AIPL_FUNCTION_DECLARATION:
MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
&buffer [4]);
purpose = build_wfl_node (mangled_id);
if (TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE)
value = build_wfl_node (TYPE_NAME (TREE_TYPE (field)));
else
value = TREE_TYPE (field);
break;
case AIPL_FUNCTION_CREATION:
MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (purpose,
&buffer [4]);
value = TREE_TYPE (field);
break;
case AIPL_FUNCTION_FINIT_INVOCATION:
MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_STR (mangled_id,
&buffer [4]);
purpose = TREE_TYPE (field);
value = build_wfl_node (mangled_id);
break;
case AIPL_FUNCTION_CTOR_INVOCATION:
if (class_type == current_class)
value = field;
else
{
name = get_identifier (&buffer[4]);
value = IDENTIFIER_LOCAL_VALUE (name);
}
break;
}
additional_parms = tree_cons (purpose, value, additional_parms);
if (artificial)
*artificial +=1;
}
if (additional_parms)
{
if (ANONYMOUS_CLASS_P (class_type)
&& mode == AIPL_FUNCTION_CTOR_INVOCATION)
additional_parms = nreverse (additional_parms);
parm = chainon (additional_parms, parm);
}
return parm;
}
static tree
craft_constructor (tree class_decl, tree args)
{
tree class_type = TREE_TYPE (class_decl);
tree parm = NULL_TREE;
int valid_ctor_flags = ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE;
int flags = (get_access_flags_from_decl (class_decl) & valid_ctor_flags);
int i = 0, artificial = 0;
tree decl, ctor_name;
char buffer [80];
ctor_name = init_identifier_node;
if (PURE_INNER_CLASS_TYPE_P (class_type))
{
tree type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_type)));
parm = tree_cons (build_current_thisn (class_type),
build_pointer_type (type), parm);
parm = build_alias_initializer_parameter_list (AIPL_FUNCTION_CREATION,
class_type, parm,
&artificial);
}
for (; args && args != end_params_node; args = TREE_CHAIN (args))
{
if (TREE_VALUE (args) == TREE_TYPE (null_pointer_node))
TREE_VALUE (args) = object_ptr_type_node;
sprintf (buffer, "parm%d", i++);
parm = tree_cons (get_identifier (buffer), TREE_VALUE (args), parm);
}
CRAFTED_PARAM_LIST_FIXUP (parm);
decl = create_artificial_method (class_type, flags, void_type_node,
ctor_name, parm);
fix_method_argument_names (parm, decl);
DECL_FUNCTION_NAP (decl) = artificial;
DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1;
DECL_INLINE (decl) = 1;
return decl;
}
void
java_fix_constructors (void)
{
tree current;
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
{
tree class_type = TREE_TYPE (current);
int saw_ctor = 0;
tree decl;
if (CLASS_INTERFACE (TYPE_NAME (class_type)))
continue;
output_class = current_class = class_type;
for (decl = TYPE_METHODS (class_type); decl; decl = TREE_CHAIN (decl))
{
if (DECL_CONSTRUCTOR_P (decl))
{
fix_constructors (decl);
saw_ctor = 1;
}
}
if (!saw_ctor && !ANONYMOUS_CLASS_P (class_type))
craft_constructor (current, NULL_TREE);
}
}
void
safe_layout_class (tree class)
{
tree save_current_class = current_class;
location_t save_location = input_location;
layout_class (class);
current_class = save_current_class;
input_location = save_location;
}
static tree
jdep_resolve_class (jdep *dep)
{
tree decl;
if (JDEP_RESOLVED_P (dep))
decl = JDEP_RESOLVED_DECL (dep);
else
{
decl = resolve_class (JDEP_ENCLOSING (dep), JDEP_TO_RESOLVE (dep),
JDEP_DECL (dep), JDEP_WFL (dep));
JDEP_RESOLVED (dep, decl);
if (decl && JDEP_WFL (dep) != NULL_TREE)
check_deprecation (JDEP_WFL (dep), decl);
}
if (!decl)
complete_class_report_errors (dep);
else if (INNER_CLASS_DECL_P (decl))
{
tree inner = TREE_TYPE (decl);
if (! CLASS_LOADED_P (inner))
{
safe_layout_class (inner);
if (TYPE_SIZE (inner) == error_mark_node)
TYPE_SIZE (inner) = NULL_TREE;
}
check_inner_class_access (decl, JDEP_ENCLOSING (dep), JDEP_WFL (dep));
}
return decl;
}
void
java_complete_class (void)
{
tree cclass;
jdeplist *cclassd;
int error_found;
tree type;
process_imports ();
ctxp->class_list = nreverse (ctxp->class_list);
ctxp->classd_list = reverse_jdep_list (ctxp);
for (cclassd = ctxp->classd_list, cclass = ctxp->class_list;
cclass && cclassd;
cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd))
{
jdep *dep;
TYPE_IMPORT_LIST (TREE_TYPE (cclass)) = ctxp->import_list;
TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (cclass)) = ctxp->import_demand_list;
for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep))
{
tree decl;
if (!(decl = jdep_resolve_class (dep)))
continue;
switch (JDEP_KIND (dep))
{
case JDEP_SUPER:
if (parser_check_super (decl, JDEP_DECL (dep), JDEP_WFL (dep)))
continue;
BINFO_TYPE (BINFO_BASE_BINFO
(TYPE_BINFO (TREE_TYPE (JDEP_DECL (dep))), 0))
= TREE_TYPE (decl);
break;
case JDEP_FIELD:
{
tree field_decl = JDEP_DECL (dep);
tree field_type = TREE_TYPE (decl);
if (TREE_CODE (field_type) == RECORD_TYPE)
field_type = promote_type (field_type);
TREE_TYPE (field_decl) = field_type;
DECL_ALIGN (field_decl) = 0;
DECL_USER_ALIGN (field_decl) = 0;
layout_decl (field_decl, 0);
SOURCE_FRONTEND_DEBUG
(("Completed field/var decl '%s' with '%s'",
IDENTIFIER_POINTER (DECL_NAME (field_decl)),
IDENTIFIER_POINTER (DECL_NAME (decl))));
break;
}
case JDEP_METHOD:
case JDEP_METHOD_RETURN:
error_found = 0;
while (1)
{
if (decl)
{
type = TREE_TYPE(decl);
if (TREE_CODE (type) == RECORD_TYPE)
type = promote_type (type);
JDEP_APPLY_PATCH (dep, type);
SOURCE_FRONTEND_DEBUG
(((JDEP_KIND (dep) == JDEP_METHOD_RETURN ?
"Completing fct '%s' with ret type '%s'":
"Completing arg '%s' with type '%s'"),
IDENTIFIER_POINTER (EXPR_WFL_NODE
(JDEP_DECL_WFL (dep))),
IDENTIFIER_POINTER (DECL_NAME (decl))));
}
else
error_found = 1;
dep = JDEP_CHAIN (dep);
if (JDEP_KIND (dep) == JDEP_METHOD_END)
break;
else
decl = jdep_resolve_class (dep);
}
if (!error_found)
{
tree mdecl = JDEP_DECL (dep), signature;
if (check_method_types_complete (mdecl))
{
signature = build_java_signature (TREE_TYPE (mdecl));
set_java_signature (TREE_TYPE (mdecl), signature);
}
}
else
continue;
break;
case JDEP_INTERFACE:
if (parser_check_super_interface (decl, JDEP_DECL (dep),
JDEP_WFL (dep)))
continue;
parser_add_interface (JDEP_DECL (dep), decl, JDEP_WFL (dep));
break;
case JDEP_PARM:
case JDEP_VARIABLE:
type = TREE_TYPE(decl);
if (TREE_CODE (type) == RECORD_TYPE)
type = promote_type (type);
JDEP_APPLY_PATCH (dep, type);
break;
case JDEP_TYPE:
JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
SOURCE_FRONTEND_DEBUG
(("Completing a random type dependency on a '%s' node",
tree_code_name [TREE_CODE (JDEP_DECL (dep))]));
break;
case JDEP_EXCEPTION:
JDEP_APPLY_PATCH (dep, TREE_TYPE (decl));
SOURCE_FRONTEND_DEBUG
(("Completing '%s' 'throws' argument node",
IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)))));
break;
case JDEP_ANONYMOUS:
patch_anonymous_class (decl, JDEP_DECL (dep), JDEP_WFL (dep));
break;
default:
abort ();
}
}
}
return;
}
static tree
resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
{
tree tname = TYPE_NAME (class_type);
tree resolved_type = TREE_TYPE (class_type);
int array_dims = 0;
tree resolved_type_decl;
if (resolved_type != NULL_TREE)
{
tree resolved_type_decl = TYPE_NAME (resolved_type);
if (resolved_type_decl == NULL_TREE
|| TREE_CODE (resolved_type_decl) == IDENTIFIER_NODE)
{
resolved_type_decl = build_decl (TYPE_DECL,
TYPE_NAME (class_type),
resolved_type);
}
return resolved_type_decl;
}
if ((array_dims = build_type_name_from_array_name (tname,
&TYPE_NAME (class_type))))
WFL_STRIP_BRACKET (cl, cl);
if (!(resolved_type_decl = do_resolve_class (enclosing, class_type,
decl, cl)))
return NULL_TREE;
resolved_type = TREE_TYPE (resolved_type_decl);
if (array_dims)
{
for (; array_dims; array_dims--)
resolved_type = build_java_array_type (resolved_type, -1);
resolved_type_decl = TYPE_NAME (resolved_type);
}
TREE_TYPE (class_type) = resolved_type;
return resolved_type_decl;
}
tree
do_resolve_class (tree enclosing, tree class_type, tree decl, tree cl)
{
tree new_class_decl = NULL_TREE, super = NULL_TREE;
tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
tree decl_result;
htab_t circularity_hash;
if (QUALIFIED_P (TYPE_NAME (class_type)))
{
tree q, left, left_type, right;
if (split_qualified_name (&left, &right, TYPE_NAME (class_type)) == 0)
{
BUILD_PTR_FROM_NAME (left_type, left);
q = do_resolve_class (enclosing, left_type, decl, cl);
if (q)
{
enclosing = q;
saved_enclosing_type = TREE_TYPE (q);
BUILD_PTR_FROM_NAME (class_type, right);
}
}
}
if (enclosing)
{
circularity_hash = htab_create (20, htab_hash_pointer, htab_eq_pointer,
NULL);
while (enclosing)
{
new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing,
&super, class_type);
if (new_class_decl)
break;
if ((!super || super == object_type_node) &&
enclosing && INNER_CLASS_DECL_P (enclosing))
enclosing = DECL_CONTEXT (enclosing);
else
enclosing = NULL_TREE;
}
htab_delete (circularity_hash);
if (new_class_decl)
return new_class_decl;
}
find_in_imports (saved_enclosing_type, class_type);
if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
{
if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)))
load_class (TYPE_NAME (class_type), 0);
return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
}
if (!QUALIFIED_P (TYPE_NAME (class_type)))
{
if ((new_class_decl = qualify_and_find (class_type, ctxp->package,
TYPE_NAME (class_type))))
return new_class_decl;
}
if (!QUALIFIED_P (TYPE_NAME (class_type)))
if (find_in_imports_on_demand (saved_enclosing_type, class_type))
return NULL_TREE;
if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type))))
return new_class_decl;
if (!QUALIFIED_P (TYPE_NAME (class_type)))
{
tree package;
for (package = (ctxp->package ?
TREE_CHAIN (package_list) : package_list);
package; package = TREE_CHAIN (package))
if ((new_class_decl = qualify_and_find (class_type,
TREE_PURPOSE (package),
TYPE_NAME (class_type))))
return new_class_decl;
}
load_class (TYPE_NAME (class_type), 0);
if (!cl)
cl = lookup_cl (decl);
if (cl)
{
if (check_pkg_class_access (TYPE_NAME (class_type), cl, true, NULL_TREE))
return NULL_TREE;
}
decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
{
char *separator;
tree name = TYPE_NAME (class_type);
char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1);
strcpy (namebuffer, IDENTIFIER_POINTER (name));
do {
if ((separator = strrchr (namebuffer, '.')))
{
*separator = '$';
name = get_identifier (namebuffer);
decl_result = IDENTIFIER_CLASS_VALUE (name);
}
} while (!decl_result && separator);
}
return decl_result;
}
static tree
qualify_and_find (tree class_type, tree package, tree name)
{
tree new_qualified = merge_qualified_name (package, name);
tree new_class_decl;
if (!IDENTIFIER_CLASS_VALUE (new_qualified))
load_class (new_qualified, 0);
if ((new_class_decl = IDENTIFIER_CLASS_VALUE (new_qualified)))
{
if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)))
load_class (TREE_TYPE (new_class_decl), 0);
TYPE_NAME (class_type) = new_qualified;
return IDENTIFIER_CLASS_VALUE (new_qualified);
}
return NULL_TREE;
}
static tree
resolve_and_layout (tree something, tree cl)
{
tree decl, decl_type;
if (something == current_class)
return TYPE_NAME (current_class);
if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
return NULL_TREE;
if (TREE_CODE (something) == POINTER_TYPE)
{
if (TREE_TYPE (something))
{
something = TREE_TYPE (something);
if (JPRIMITIVE_TYPE_P (something) || something == void_type_node)
return NULL_TREE;
}
else
something = TYPE_NAME (something);
}
if (TREE_CODE (something) == RECORD_TYPE && TYPE_ARRAY_P (something)
&& JPRIMITIVE_TYPE_P (TYPE_ARRAY_ELEMENT (something)))
return NULL_TREE;
if (TREE_CODE (something) == EXPR_WITH_FILE_LOCATION)
something = EXPR_WFL_NODE (something);
else if (TREE_CODE (something) != IDENTIFIER_NODE)
something = (TREE_CODE (TYPE_NAME (something)) == TYPE_DECL ?
DECL_NAME (TYPE_NAME (something)) : TYPE_NAME (something));
if (!(decl = resolve_no_layout (something, cl)))
return NULL_TREE;
decl_type = TREE_TYPE (decl);
layout_class_methods (decl_type);
if (CLASS_FROM_SOURCE_P (decl_type))
java_check_methods (decl);
if (decl_type != current_class && !CLASS_LOADED_P (decl_type))
safe_layout_class (decl_type);
return decl;
}
static tree
resolve_no_layout (tree name, tree cl)
{
tree ptr, decl;
BUILD_PTR_FROM_NAME (ptr, name);
java_parser_context_save_global ();
decl = resolve_class (TYPE_NAME (current_class), ptr, NULL_TREE, cl);
java_parser_context_restore_global ();
return decl;
}
static const char *
purify_type_name (const char *name)
{
int len = strlen (name);
int bracket_found;
STRING_STRIP_BRACKETS (name, len, bracket_found);
if (bracket_found)
{
char *stripped_name = xmemdup (name, len, len+1);
stripped_name [len] = '\0';
return stripped_name;
}
return name;
}
static void
complete_class_report_errors (jdep *dep)
{
const char *name;
if (!JDEP_WFL (dep))
return;
name = IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep)));
switch (JDEP_KIND (dep))
{
case JDEP_SUPER:
parse_error_context
(JDEP_WFL (dep), "Superclass %qs of class %qs not found",
purify_type_name (name),
IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
break;
case JDEP_FIELD:
parse_error_context
(JDEP_WFL (dep), "Type %qs not found in declaration of field %qs",
purify_type_name (name),
IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
break;
case JDEP_METHOD:
parse_error_context
(JDEP_WFL (dep), "Type %qs not found in the declaration of the argument %qs of method %qs",
purify_type_name (name),
IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))),
IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_MISC (dep))));
break;
case JDEP_METHOD_RETURN:
parse_error_context
(JDEP_WFL (dep), "Type %qs not found in the declaration of the return type of method %qs",
purify_type_name (name),
IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_DECL_WFL (dep))));
break;
case JDEP_INTERFACE:
parse_error_context
(JDEP_WFL (dep), "Superinterface %qs of %s %qs not found",
IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))),
(CLASS_OR_INTERFACE (JDEP_DECL (dep), "class", "interface")),
IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
break;
case JDEP_VARIABLE:
parse_error_context
(JDEP_WFL (dep), "Type %qs not found in the declaration of the local variable %qs",
purify_type_name (IDENTIFIER_POINTER
(EXPR_WFL_NODE (JDEP_WFL (dep)))),
IDENTIFIER_POINTER (DECL_NAME (JDEP_DECL (dep))));
break;
case JDEP_EXCEPTION:
parse_error_context
(JDEP_WFL (dep), "Class %qs not found in %<throws%>",
IDENTIFIER_POINTER (EXPR_WFL_NODE (JDEP_WFL (dep))));
break;
default:
break;
}
}
static const char *
get_printable_method_name (tree decl)
{
const char *to_return;
tree name = NULL_TREE;
if (DECL_CONSTRUCTOR_P (decl))
{
name = DECL_NAME (decl);
DECL_NAME (decl) = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
}
to_return = lang_printable_name (decl, 2);
if (DECL_CONSTRUCTOR_P (decl))
DECL_NAME (decl) = name;
return to_return;
}
static int
check_method_redefinition (tree class, tree method)
{
tree redef, sig;
if (DECL_CLINIT_P (method)
|| DECL_FINIT_P (method) || DECL_INSTINIT_P (method))
return 0;
sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method));
for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
{
if (redef == method)
break;
if (DECL_NAME (redef) == DECL_NAME (method)
&& sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))
&& !DECL_ARTIFICIAL (method))
{
parse_error_context
(DECL_FUNCTION_WFL (method), "Duplicate %s declaration %qs",
(DECL_CONSTRUCTOR_P (redef) ? "constructor" : "method"),
get_printable_method_name (redef));
return 1;
}
}
return 0;
}
static int
check_abstract_method_definitions (int do_interface, tree class_decl,
tree type)
{
tree class = TREE_TYPE (class_decl);
tree method, end_type;
int ok = 1;
end_type = (do_interface ? object_type_node : type);
for (method = TYPE_METHODS (type); method; method = TREE_CHAIN (method))
{
tree other_super, other_method, method_sig, method_name;
int found = 0;
int end_type_reached = 0;
if (!METHOD_ABSTRACT (method) || METHOD_FINAL (method))
continue;
method_sig = build_java_signature (TREE_TYPE (method));
method_name = DECL_NAME (method);
if (TREE_CODE (method_name) == EXPR_WITH_FILE_LOCATION)
method_name = EXPR_WFL_NODE (method_name);
other_super = class;
do {
if (other_super == end_type)
end_type_reached = 1;
for (other_method = TYPE_METHODS (other_super); other_method;
other_method = TREE_CHAIN (other_method))
{
tree s = build_java_signature (TREE_TYPE (other_method));
tree other_name = DECL_NAME (other_method);
if (TREE_CODE (other_name) == EXPR_WITH_FILE_LOCATION)
other_name = EXPR_WFL_NODE (other_name);
if (!DECL_CLINIT_P (other_method)
&& !DECL_CONSTRUCTOR_P (other_method)
&& method_name == other_name
&& method_sig == s
&& !METHOD_ABSTRACT (other_method))
{
found = 1;
break;
}
}
other_super = CLASSTYPE_SUPER (other_super);
} while (!end_type_reached);
if (!found)
{
char *t = xstrdup (lang_printable_name
(TREE_TYPE (TREE_TYPE (method)), 0));
tree ccn = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)));
parse_error_context
(lookup_cl (class_decl),
"Class %qs doesn't define the abstract method %<%s %s%> from %s %<%s%>. This method must be defined or %s %qs must be declared abstract",
IDENTIFIER_POINTER (DECL_NAME (class_decl)),
t, lang_printable_name (method, 2),
(CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))) ?
"interface" : "class"),
IDENTIFIER_POINTER (ccn),
(CLASS_INTERFACE (class_decl) ? "interface" : "class"),
IDENTIFIER_POINTER (DECL_NAME (class_decl)));
ok = 0;
free (t);
}
}
if (ok && do_interface)
{
int i;
tree base_binfo;
for (i = 1;
ok && BINFO_BASE_ITERATE (TYPE_BINFO (type), i, base_binfo);
i++)
ok = check_abstract_method_definitions (1, class_decl,
BINFO_TYPE (base_binfo));
}
return ok;
}
static void
java_check_abstract_method_definitions (tree class_decl)
{
tree class = TREE_TYPE (class_decl);
tree super, base_binfo;
int i;
if (CLASS_ABSTRACT (class_decl))
return;
super = class;
do {
super = CLASSTYPE_SUPER (super);
check_abstract_method_definitions (0, class_decl, super);
} while (super != object_type_node);
for (i = 1; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
check_abstract_method_definitions (1, class_decl, BINFO_TYPE (base_binfo));
}
static int
check_method_types_complete (tree decl)
{
tree type = TREE_TYPE (decl);
tree args;
if (!INCOMPLETE_TYPE_P (TREE_TYPE (type)))
return 0;
args = TYPE_ARG_TYPES (type);
if (TREE_CODE (type) == METHOD_TYPE)
args = TREE_CHAIN (args);
for (; args != end_params_node; args = TREE_CHAIN (args))
if (INCOMPLETE_TYPE_P (TREE_VALUE (args)))
return 0;
return 1;
}
void
java_check_methods (tree class_decl)
{
if (CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)))
return;
if (CLASS_INTERFACE (class_decl))
java_check_abstract_methods (class_decl);
else
java_check_regular_methods (class_decl);
CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)) = 1;
}
static bool
hack_is_accessible_p (tree member, tree from_where)
{
int flags = get_access_flags_from_decl (member);
if (from_where == DECL_CONTEXT (member)
|| (flags & ACC_PUBLIC))
return true;
if ((flags & ACC_PROTECTED))
{
if (inherits_from_p (from_where, DECL_CONTEXT (member)))
return true;
}
if ((flags & ACC_PRIVATE))
return false;
return in_same_package (TYPE_NAME (from_where),
TYPE_NAME (DECL_CONTEXT (member)));
}
static void
java_check_regular_methods (tree class_decl)
{
int saw_constructor = ANONYMOUS_CLASS_P (TREE_TYPE (class_decl));
tree method;
tree class = TREE_TYPE (class_decl);
tree found = NULL_TREE;
tree mthrows;
if (class == object_type_node)
return;
if (!TYPE_NVIRTUALS (class))
TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
for (method = TYPE_METHODS (class); method; method = TREE_CHAIN (method))
{
tree sig;
tree method_wfl = DECL_FUNCTION_WFL (method);
int aflags;
if (check_method_redefinition (class, method))
continue;
for (mthrows = DECL_FUNCTION_THROWS (method);
mthrows; mthrows = TREE_CHAIN (mthrows))
{
if (!inherits_from_p (TREE_VALUE (mthrows), throwable_type_node))
parse_error_context
(TREE_PURPOSE (mthrows), "Class %qs in %<throws%> clause must be a subclass of class %<java.lang.Throwable%>",
IDENTIFIER_POINTER
(DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))));
}
if (DECL_CONSTRUCTOR_P (method))
{
saw_constructor = 1;
continue;
}
sig = build_java_argument_signature (TREE_TYPE (method));
found = lookup_argument_method_generic (class, DECL_NAME (method), sig,
SEARCH_SUPER | SEARCH_INTERFACE);
if (METHOD_STATIC (method) && !TOPLEVEL_CLASS_DECL_P (class_decl))
{
char *t = xstrdup (lang_printable_name (class, 0));
parse_error_context
(method_wfl, "Method %qs can't be static in inner class %qs. Only members of interfaces and top-level classes can be static",
lang_printable_name (method, 2), t);
free (t);
}
if (!found)
continue;
if (METHOD_PRIVATE (found))
{
found = NULL_TREE;
continue;
}
if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
&& clinit_identifier_node != DECL_NAME (found)
&& !METHOD_PUBLIC (method))
{
tree found_decl = TYPE_NAME (DECL_CONTEXT (found));
parse_error_context (method_wfl, "Class %qs must override %qs with a public method in order to implement interface %qs",
IDENTIFIER_POINTER (DECL_NAME (class_decl)),
lang_printable_name (method, 2),
IDENTIFIER_POINTER (DECL_NAME (found_decl)));
}
if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
{
char *t = xstrdup
(lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 2));
parse_error_context
(method_wfl,
"Method %qs was defined with return type %qs in class %qs",
lang_printable_name (found, 2), t,
IDENTIFIER_POINTER
(DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
free (t);
}
aflags = get_access_flags_from_decl (found);
if (METHOD_FINAL (found) || METHOD_STATIC (found))
{
if (METHOD_STATIC (found) && METHOD_STATIC (method))
continue;
parse_error_context
(method_wfl,
"%s methods can't be overridden. Method %qs is %s in class %qs",
(METHOD_FINAL (found) ? "Final" : "Static"),
lang_printable_name (found, 2),
(METHOD_FINAL (found) ? "final" : "static"),
IDENTIFIER_POINTER
(DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
continue;
}
if (METHOD_STATIC (method))
{
parse_error_context
(method_wfl,
"Instance methods can't be overridden by a static method. Method %qs is an instance method in class %qs",
lang_printable_name (found, 2),
IDENTIFIER_POINTER
(DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
continue;
}
if (!CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
&& ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
|| (METHOD_PROTECTED (found)
&& !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
|| (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
&& METHOD_PRIVATE (method))))
{
parse_error_context
(method_wfl,
"Methods can't be overridden to be more private. Method %qs is not %s in class %qs", lang_printable_name (method, 2),
(METHOD_PUBLIC (method) ? "public" :
(METHOD_PRIVATE (method) ? "private" : "protected")),
IDENTIFIER_POINTER (DECL_NAME
(TYPE_NAME (DECL_CONTEXT (found)))));
continue;
}
if (! METHOD_INVISIBLE (method))
check_concrete_throws_clauses (class, method, DECL_NAME (method), sig);
}
check_interface_throws_clauses (class, class);
if (!TYPE_NVIRTUALS (class))
TYPE_METHODS (class) = nreverse (TYPE_METHODS (class));
java_check_abstract_method_definitions (class_decl);
if (!saw_constructor)
abort ();
}
static void
check_interface_throws_clauses (tree check_class_decl, tree class_decl)
{
for (; class_decl != NULL_TREE; class_decl = CLASSTYPE_SUPER (class_decl))
{
int i;
if (! CLASS_LOADED_P (class_decl))
{
if (CLASS_FROM_SOURCE_P (class_decl))
safe_layout_class (class_decl);
else
load_class (class_decl, 1);
}
for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (class_decl)) - 1; i > 0; --i)
{
tree interface
= BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (class_decl), i));
tree iface_method;
for (iface_method = TYPE_METHODS (interface);
iface_method != NULL_TREE;
iface_method = TREE_CHAIN (iface_method))
{
tree sig, method;
sig = build_java_argument_signature (TREE_TYPE (iface_method));
method
= lookup_argument_method_generic (check_class_decl,
DECL_NAME (iface_method),
sig, SEARCH_VISIBLE);
if (method != NULL_TREE && !METHOD_ABSTRACT (method)
&& !METHOD_INVISIBLE (iface_method))
{
tree method_wfl = DECL_FUNCTION_WFL (method);
check_throws_clauses (method, method_wfl, iface_method);
}
}
check_interface_throws_clauses (check_class_decl, interface);
}
}
}
static void
check_concrete_throws_clauses (tree class, tree self_method,
tree name, tree signature)
{
tree method = lookup_argument_method_generic (class, name, signature,
SEARCH_SUPER | SEARCH_VISIBLE);
while (method != NULL_TREE)
{
if (! METHOD_INVISIBLE (method) && hack_is_accessible_p (method, class))
check_throws_clauses (self_method, DECL_FUNCTION_WFL (self_method),
method);
method = lookup_argument_method_generic (DECL_CONTEXT (method),
name, signature,
SEARCH_SUPER | SEARCH_VISIBLE);
}
}
static void
check_throws_clauses (tree method, tree method_wfl, tree found)
{
tree mthrows;
if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (found)))
return;
for (mthrows = DECL_FUNCTION_THROWS (method);
mthrows; mthrows = TREE_CHAIN (mthrows))
{
tree fthrows;
if (IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (mthrows)))
continue;
for (fthrows = DECL_FUNCTION_THROWS (found);
fthrows; fthrows = TREE_CHAIN (fthrows))
{
if (inherits_from_p (TREE_VALUE (mthrows), TREE_VALUE (fthrows)))
break;
}
if (!fthrows)
{
parse_error_context
(method_wfl, "Invalid checked exception class %qs in %<throws%> clause. The exception must be a subclass of an exception thrown by %qs from class %qs",
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (TREE_VALUE (mthrows)))),
lang_printable_name (found, 2),
IDENTIFIER_POINTER
(DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
}
}
}
static void
java_check_abstract_methods (tree interface_decl)
{
int i;
tree method, found;
tree interface = TREE_TYPE (interface_decl);
tree base_binfo;
for (method = TYPE_METHODS (interface); method; method = TREE_CHAIN (method))
{
if (check_method_redefinition (interface, method))
continue;
found = lookup_java_interface_method2 (interface, method);
if (found)
{
char *t;
t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 2));
parse_error_context
(DECL_FUNCTION_WFL (found),
"Method %qs was defined with return type %qs in class %qs",
lang_printable_name (found, 2), t,
IDENTIFIER_POINTER
(DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
free (t);
continue;
}
}
for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (interface), i, base_binfo); i++)
{
tree sub_interface_method, sub_interface;
sub_interface = BINFO_TYPE (base_binfo);
for (sub_interface_method = TYPE_METHODS (sub_interface);
sub_interface_method;
sub_interface_method = TREE_CHAIN (sub_interface_method))
{
found = lookup_java_interface_method2 (interface,
sub_interface_method);
if (found && (found != sub_interface_method))
{
parse_error_context
(lookup_cl (sub_interface_method),
"Interface %qs inherits method %qs from interface %qs. This method is redefined with a different return type in interface %qs",
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (interface))),
lang_printable_name (found, 2),
IDENTIFIER_POINTER
(DECL_NAME (TYPE_NAME
(DECL_CONTEXT (sub_interface_method)))),
IDENTIFIER_POINTER
(DECL_NAME (TYPE_NAME (DECL_CONTEXT (found)))));
}
}
}
}
static tree
lookup_java_interface_method2 (tree class, tree method_decl)
{
int i;
tree base_binfo;
tree to_return;
for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
{
if ((BINFO_TYPE (base_binfo) != object_type_node)
&& (to_return =
lookup_java_method2 (BINFO_TYPE (base_binfo), method_decl, 1)))
return to_return;
}
for (i = 0; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
{
to_return = lookup_java_interface_method2
(BINFO_TYPE (base_binfo), method_decl);
if (to_return)
return to_return;
}
return NULL_TREE;
}
static tree
lookup_java_method2 (tree clas, tree method_decl, int do_interface)
{
tree method, method_signature, method_name, method_type, name;
method_signature = build_java_argument_signature (TREE_TYPE (method_decl));
name = DECL_NAME (method_decl);
method_name = (TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
EXPR_WFL_NODE (name) : name);
method_type = TREE_TYPE (TREE_TYPE (method_decl));
while (clas != NULL_TREE)
{
for (method = TYPE_METHODS (clas);
method != NULL_TREE; method = TREE_CHAIN (method))
{
tree method_sig = build_java_argument_signature (TREE_TYPE (method));
tree name = DECL_NAME (method);
if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
EXPR_WFL_NODE (name) : name) == method_name
&& method_sig == method_signature
&& TREE_TYPE (TREE_TYPE (method)) != method_type)
return method;
}
clas = (do_interface ? NULL_TREE : CLASSTYPE_SUPER (clas));
}
return NULL_TREE;
}
static GTY(()) tree cl_v;
static tree
lookup_cl (tree decl)
{
#ifndef USE_MAPPED_LOCATION
char *line, *found;
#endif
if (!decl)
return NULL_TREE;
if (cl_v == NULL_TREE)
{
cl_v = build_unknown_wfl (NULL_TREE);
}
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (cl_v, DECL_SOURCE_LOCATION (decl));
#else
EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE (decl), -1);
line = java_get_line_col (EXPR_WFL_FILENAME (cl_v),
EXPR_WFL_LINENO (cl_v), EXPR_WFL_COLNO (cl_v));
found = strstr ((const char *)line,
(const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
if (found)
EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
#endif
return cl_v;
}
static tree
find_name_in_single_imports (tree name)
{
tree node;
for (node = ctxp->import_list; node; node = TREE_CHAIN (node))
if (TREE_VALUE (node) == name)
return (EXPR_WFL_NODE (TREE_PURPOSE (node)));
return NULL_TREE;
}
static int
process_imports (void)
{
tree import;
int error_found;
for (import = ctxp->import_list; import; import = TREE_CHAIN (import))
{
tree to_be_found = EXPR_WFL_NODE (TREE_PURPOSE (import));
char *original_name;
if (IDENTIFIER_CLASS_VALUE (to_be_found))
continue;
original_name = xmemdup (IDENTIFIER_POINTER (to_be_found),
IDENTIFIER_LENGTH (to_be_found),
IDENTIFIER_LENGTH (to_be_found) + 1);
while (1)
{
tree left;
QUALIFIED_P (to_be_found) = 1;
load_class (to_be_found, 0);
error_found =
check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true, NULL_TREE);
if (IDENTIFIER_CLASS_VALUE (to_be_found))
{
check_deprecation (TREE_PURPOSE (import),
IDENTIFIER_CLASS_VALUE (to_be_found));
break;
}
if (split_qualified_name (&left, NULL, to_be_found))
break;
to_be_found = left;
}
if (!IDENTIFIER_CLASS_VALUE (to_be_found))
{
parse_error_context (TREE_PURPOSE (import),
"Class or interface %qs not found in import",
original_name);
error_found = 1;
}
free (original_name);
if (error_found)
return 1;
}
return 0;
}
static void
find_in_imports (tree enclosing_type, tree class_type)
{
tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) :
ctxp->import_list);
while (import)
{
if (TREE_VALUE (import) == TYPE_NAME (class_type))
{
TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import));
QUALIFIED_P (TYPE_NAME (class_type)) = 1;
return;
}
import = TREE_CHAIN (import);
}
}
static int
note_possible_classname (const char *name, int len)
{
tree node;
if (len > 5 && strncmp (&name [len-5], ".java", 5) == 0)
len = len - 5;
else if (len > 6 && strncmp (&name [len-6], ".class", 6) == 0)
len = len - 6;
else
return 0;
node = ident_subst (name, len, "", '/', '.', "");
IS_A_CLASSFILE_NAME (node) = 1;
QUALIFIED_P (node) = strchr (name, '/') ? 1 : 0;
return 1;
}
static void
read_import_dir (tree wfl)
{
tree package_id = EXPR_WFL_NODE (wfl);
const char *package_name = IDENTIFIER_POINTER (package_id);
int package_length = IDENTIFIER_LENGTH (package_id);
DIR *dirp = NULL;
JCF *saved_jcf = current_jcf;
int found = 0;
int k;
void *entry;
struct buffer filename[1];
if (IS_AN_IMPORT_ON_DEMAND_P (package_id))
return;
IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1;
BUFFER_INIT (filename);
buffer_grow (filename, package_length + 100);
for (entry = jcf_path_start (); entry != NULL; entry = jcf_path_next (entry))
{
const char *entry_name = jcf_path_name (entry);
int entry_length = strlen (entry_name);
if (jcf_path_is_zipfile (entry))
{
ZipFile *zipf;
buffer_grow (filename, entry_length);
memcpy (filename->data, entry_name, entry_length - 1);
filename->data[entry_length-1] = '\0';
zipf = opendir_in_zip ((const char *) filename->data, jcf_path_is_system (entry));
if (zipf == NULL)
error ("malformed .zip archive in CLASSPATH: %s", entry_name);
else
{
ZipDirectory *zipd = (ZipDirectory *) zipf->central_directory;
BUFFER_RESET (filename);
for (k = 0; k < package_length; k++)
{
char ch = package_name[k];
*filename->ptr++ = ch == '.' ? '/' : ch;
}
*filename->ptr++ = '/';
for (k = 0; k < zipf->count; k++, zipd = ZIPDIR_NEXT (zipd))
{
const char *current_entry = ZIPDIR_FILENAME (zipd);
int current_entry_len = zipd->filename_length;
if (current_entry_len >= BUFFER_LENGTH (filename)
&& strncmp ((const char *) filename->data, current_entry,
BUFFER_LENGTH (filename)) != 0)
continue;
found |= note_possible_classname (current_entry,
current_entry_len);
}
}
}
else
{
BUFFER_RESET (filename);
buffer_grow (filename, entry_length + package_length + 4);
strcpy ((char *) filename->data, entry_name);
filename->ptr = filename->data + entry_length;
for (k = 0; k < package_length; k++)
{
char ch = package_name[k];
*filename->ptr++ = ch == '.' ? '/' : ch;
}
*filename->ptr = '\0';
dirp = opendir ((const char *) filename->data);
if (dirp == NULL)
continue;
*filename->ptr++ = '/';
for (;;)
{
int len;
const char *d_name;
struct dirent *direntp = readdir (dirp);
if (!direntp)
break;
d_name = direntp->d_name;
len = strlen (direntp->d_name);
buffer_grow (filename, len+1);
strcpy ((char *) filename->ptr, d_name);
found |= note_possible_classname ((const char *) filename->data + entry_length,
package_length+len+1);
}
if (dirp)
closedir (dirp);
}
}
free (filename->data);
if (!found)
{
static int first = 1;
if (first)
{
error ("Can't find default package %qs. Check the CLASSPATH environment variable and the access to the archives", package_name);
java_error_count++;
first = 0;
}
else
parse_error_context (wfl, "Package %qs not found in import",
package_name);
current_jcf = saved_jcf;
return;
}
current_jcf = saved_jcf;
}
static int
find_in_imports_on_demand (tree enclosing_type, tree class_type)
{
tree class_type_name = TYPE_NAME (class_type);
tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) :
ctxp->import_demand_list);
tree cl = NULL_TREE;
int seen_once = -1;
int to_return = -1;
tree node;
for (; import; import = TREE_CHAIN (import))
{
location_t saved_location = input_location;
int access_check;
const char *id_name;
tree decl, type_name_copy;
obstack_grow (&temporary_obstack,
IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))),
IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import))));
obstack_1grow (&temporary_obstack, '.');
obstack_grow0 (&temporary_obstack,
IDENTIFIER_POINTER (class_type_name),
IDENTIFIER_LENGTH (class_type_name));
id_name = obstack_finish (&temporary_obstack);
if (! (node = maybe_get_identifier (id_name)))
continue;
#ifdef USE_MAPPED_LOCATION
input_location = EXPR_LOCATION (TREE_PURPOSE (import));
#else
input_line = EXPR_WFL_LINENO (TREE_PURPOSE (import));
#endif
type_name_copy = TYPE_NAME (class_type);
TYPE_NAME (class_type) = node;
QUALIFIED_P (node) = 1;
decl = IDENTIFIER_CLASS_VALUE (node);
access_check = -1;
if (!decl || ! CLASS_LOADED_P (TREE_TYPE (decl)))
{
load_class (node, 0);
decl = IDENTIFIER_CLASS_VALUE (node);
}
if (decl && ! INNER_CLASS_P (TREE_TYPE (decl)))
access_check = check_pkg_class_access (node, TREE_PURPOSE (import),
false, NULL_TREE);
else
access_check = 0;
input_location = saved_location;
if (access_check || !decl)
{
TYPE_NAME (class_type) = type_name_copy;
continue;
}
if (IS_A_CLASSFILE_NAME (node))
{
if (seen_once < 0)
{
cl = TREE_PURPOSE (import);
seen_once = 1;
}
else if (seen_once >= 0)
{
tree location = (cl ? cl : TREE_PURPOSE (import));
tree package = (cl ? EXPR_WFL_NODE (cl) :
EXPR_WFL_NODE (TREE_PURPOSE (import)));
seen_once++;
parse_error_context
(location,
"Type %qs also potentially defined in package %qs",
IDENTIFIER_POINTER (TYPE_NAME (class_type)),
IDENTIFIER_POINTER (package));
}
}
to_return = access_check;
}
if (seen_once == 1)
return to_return;
else
return (seen_once < 0 ? 0 : seen_once);
}
static void
register_package (tree name)
{
static htab_t pht;
void **e;
if (pht == NULL)
pht = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
e = htab_find_slot (pht, name, INSERT);
if (*e == NULL)
{
package_list = chainon (package_list, build_tree_list (name, NULL));
*e = name;
}
}
static tree
resolve_package (tree pkg, tree *next, tree *type_name)
{
tree current;
tree decl = NULL_TREE;
*type_name = NULL_TREE;
*next = EXPR_WFL_QUALIFICATION (pkg);
if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION)
for (current = EXPR_WFL_QUALIFICATION (pkg);
current; current = TREE_CHAIN (current))
{
if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION)
break;
*type_name =
merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current)));
if ((decl = resolve_no_layout (*type_name, NULL_TREE)))
{
*next = current;
break;
}
}
return decl;
}
static void
check_inner_class_access (tree decl, tree enclosing_decl, tree cl)
{
const char *access;
tree enclosing_decl_type;
if (!decl || !cl)
return;
enclosing_decl_type = TREE_TYPE (enclosing_decl);
if (CLASS_PRIVATE (decl))
{
tree top_level = decl;
while (DECL_CONTEXT (top_level))
top_level = DECL_CONTEXT (top_level);
while (DECL_CONTEXT (enclosing_decl))
enclosing_decl = DECL_CONTEXT (enclosing_decl);
if (top_level == enclosing_decl)
return;
access = "private";
}
else if (CLASS_PROTECTED (decl))
{
tree decl_context;
if (in_same_package (decl, enclosing_decl))
return;
decl_context = DECL_CONTEXT (decl);
while (enclosing_decl)
{
if (CLASS_INTERFACE (decl))
{
if (interface_of_p (TREE_TYPE (decl_context),
enclosing_decl_type))
return;
}
else
{
if (inherits_from_p (enclosing_decl_type,
TREE_TYPE (decl_context)))
return;
}
enclosing_decl = DECL_CONTEXT (enclosing_decl);
}
access = "protected";
}
else if (! CLASS_PUBLIC (decl))
{
if (in_same_package (decl, enclosing_decl))
return;
access = "non-public";
}
else
return;
parse_error_context (cl, "Nested %s %s is %s; cannot be accessed from here",
(CLASS_INTERFACE (decl) ? "interface" : "class"),
lang_printable_name (decl, 2), access);
}
static int
check_pkg_class_access (tree class_name, tree cl, bool verbose, tree this_decl)
{
tree type;
if (!IDENTIFIER_CLASS_VALUE (class_name))
return 0;
if (!(type = TREE_TYPE (IDENTIFIER_CLASS_VALUE (class_name))))
return 0;
if (!CLASS_PUBLIC (TYPE_NAME (type)))
{
tree l, r;
split_qualified_name (&l, &r, class_name);
if (!QUALIFIED_P (class_name) && !ctxp->package)
return 0;
if (l == ctxp->package)
return 0;
if (verbose)
parse_error_context
(cl == NULL ? lookup_cl (this_decl): cl,
"Can't access %s %qs. Only public classes and interfaces in other packages can be accessed",
(CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"),
IDENTIFIER_POINTER (class_name));
return 1;
}
return 0;
}
static void
declare_local_variables (int modifier, tree type, tree vlist)
{
tree decl, current, saved_type;
tree type_wfl = NULL_TREE;
int must_chain = 0;
int final_p = 0;
if (BLOCK_EXPR_BODY (GET_CURRENT_BLOCK (current_function_decl)))
{
tree b = enter_block ();
BLOCK_IS_IMPLICIT (b) = 1;
}
if (modifier)
{
size_t i;
for (i = 0; i < ARRAY_SIZE (ctxp->modifier_ctx); i++)
if (1 << i & modifier)
break;
if (modifier == ACC_FINAL)
final_p = 1;
else
{
parse_error_context
(ctxp->modifier_ctx [i],
"Only %<final%> is allowed as a local variables modifier");
return;
}
}
SET_TYPE_FOR_RESOLUTION (type, type_wfl, must_chain);
PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
for (current = vlist, saved_type = type; current;
current = TREE_CHAIN (current), type = saved_type)
{
tree other, real_type;
tree wfl = TREE_PURPOSE (current);
tree name = EXPR_WFL_NODE (wfl);
tree init = TREE_VALUE (current);
type = build_array_from_name (type, type_wfl, name, &name);
if ((other = lookup_name_in_blocks (name)))
{
variable_redefinition_error (wfl, name, TREE_TYPE (other),
DECL_SOURCE_LINE (other));
continue;
}
PROMOTE_RECORD_IF_COMPLETE (type, must_chain);
real_type = GET_REAL_TYPE (type);
decl = build_decl (VAR_DECL, name, real_type);
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
DECL_FINAL (decl) = final_p;
BLOCK_CHAIN_DECL (decl);
#ifdef USE_MAPPED_LOCATION
if (flag_emit_xref)
DECL_SOURCE_LOCATION (decl) = EXPR_LOCATION (wfl);
#else
if (flag_emit_xref)
DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
#endif
if (init && java_error_count)
init = NULL_TREE;
if (init && final_p)
{
DECL_LOCAL_FINAL_IUD (decl) = 1;
}
if (init)
{
EXPR_WFL_NODE (TREE_OPERAND (init, 0)) = name;
MODIFY_EXPR_FROM_INITIALIZATION_P (init) = 1;
java_method_add_stmt (current_function_decl,
build_debugable_stmt (EXPR_WFL_LINECOL (init),
init));
}
if (must_chain)
{
jdep *dep;
register_incomplete_type (JDEP_VARIABLE, type_wfl, decl, type);
dep = CLASSD_LAST (ctxp->classd_list);
JDEP_GET_PATCH (dep) = &TREE_TYPE (decl);
}
}
SOURCE_FRONTEND_DEBUG (("Defined locals"));
}
static void
source_start_java_method (tree fndecl)
{
tree tem;
tree parm_decl;
int i;
if (!fndecl)
return;
current_function_decl = fndecl;
enter_block ();
for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
tem != end_params_node; tem = TREE_CHAIN (tem), i++)
{
tree type = TREE_VALUE (tem);
tree name = TREE_PURPOSE (tem);
if (INCOMPLETE_TYPE_P (type))
{
jdep *jdep;
tree real_type = GET_REAL_TYPE (type);
parm_decl = build_decl (PARM_DECL, name, real_type);
type = obtain_incomplete_type (type);
register_incomplete_type (JDEP_PARM, NULL_TREE, NULL_TREE, type);
jdep = CLASSD_LAST (ctxp->classd_list);
JDEP_MISC (jdep) = name;
JDEP_GET_PATCH (jdep) = &TREE_TYPE (parm_decl);
}
else
parm_decl = build_decl (PARM_DECL, name, type);
if (ARG_FINAL_P (tem))
{
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl);
DECL_FINAL (parm_decl) = 1;
}
BLOCK_CHAIN_DECL (parm_decl);
}
tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) =
nreverse (tem);
DECL_ARG_SLOT_COUNT (current_function_decl) = i;
DECL_MAX_LOCALS (current_function_decl) = i;
}
static tree
create_artificial_method (tree class, int flags, tree type,
tree name, tree args)
{
tree mdecl;
location_t save_location = input_location;
input_location = DECL_SOURCE_LOCATION (TYPE_NAME (class));
mdecl = make_node (FUNCTION_TYPE);
TREE_TYPE (mdecl) = type;
TYPE_ARG_TYPES (mdecl) = args;
mdecl = add_method_1 (class, flags, name, mdecl);
input_location = save_location;
DECL_ARTIFICIAL (mdecl) = 1;
return mdecl;
}
static void
start_artificial_method_body (tree mdecl)
{
#ifdef USE_MAPPED_LOCATION
DECL_SOURCE_LOCATION (mdecl) = ctxp->file_start_location;
DECL_FUNCTION_LAST_LINE (mdecl) = ctxp->file_start_location;
#else
DECL_SOURCE_LINE (mdecl) = 1;
DECL_FUNCTION_LAST_LINE (mdecl) = 1;
#endif
source_start_java_method (mdecl);
enter_block ();
}
static void
end_artificial_method_body (tree mdecl)
{
tree b = exit_block ();
BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)) = b;
exit_block ();
}
static void
dump_java_tree (enum tree_dump_index phase, tree t)
{
FILE *stream;
int flags;
stream = dump_begin (phase, &flags);
flags |= TDF_SLIM;
if (stream)
{
dump_node (t, flags, stream);
dump_end (phase, stream);
}
}
static void
source_end_java_method (void)
{
tree fndecl = current_function_decl;
if (!fndecl)
return;
java_parser_context_save_global ();
#ifdef USE_MAPPED_LOCATION
input_location = ctxp->last_ccb_indent1;
#else
input_line = ctxp->last_ccb_indent1;
#endif
if (IS_EMPTY_STMT (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))))
BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE;
if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))
&& ! flag_emit_class_files
&& ! flag_emit_xref)
finish_method (fndecl);
current_function_decl = NULL_TREE;
java_parser_context_restore_global ();
current_function_decl = NULL_TREE;
}
tree
java_method_add_stmt (tree fndecl, tree expr)
{
if (!GET_CURRENT_BLOCK (fndecl))
return NULL_TREE;
return add_stmt_to_block (GET_CURRENT_BLOCK (fndecl), NULL_TREE, expr);
}
static tree
add_stmt_to_block (tree b, tree type, tree stmt)
{
tree body = BLOCK_EXPR_BODY (b), c;
if (java_error_count)
return body;
if ((c = add_stmt_to_compound (body, type, stmt)) == body)
return body;
BLOCK_EXPR_BODY (b) = c;
TREE_SIDE_EFFECTS (c) = 1;
return c;
}
void
java_layout_seen_class_methods (void)
{
tree previous_list = all_class_list;
tree end = NULL_TREE;
tree current;
while (1)
{
for (current = previous_list;
current != end; current = TREE_CHAIN (current))
{
tree decl = TREE_VALUE (current);
tree cls = TREE_TYPE (decl);
input_location = DECL_SOURCE_LOCATION (decl);
if (! CLASS_LOADED_P (cls))
load_class (cls, 0);
layout_class_methods (cls);
}
if (previous_list != all_class_list)
{
end = previous_list;
previous_list = all_class_list;
}
else
break;
}
}
static GTY(()) tree stop_reordering;
void
java_reorder_fields (void)
{
tree current;
for (current = gclass_list; current; current = TREE_CHAIN (current))
{
output_class = current_class = TREE_TYPE (TREE_VALUE (current));
if (current_class == stop_reordering)
break;
if (TYPE_FIELDS (current_class) && current_class != object_type_node
&& current_class != class_type_node)
{
if (!DECL_NAME (TYPE_FIELDS (current_class)))
{
tree fields = TYPE_FIELDS (current_class);
TREE_CHAIN (fields) = nreverse (TREE_CHAIN (fields));
TYPE_SIZE (current_class) = NULL_TREE;
}
else
{
TYPE_FIELDS (current_class) =
nreverse (TYPE_FIELDS (current_class));
TYPE_SIZE (current_class) = NULL_TREE;
}
}
}
if (gclass_list)
stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list));
}
void
java_layout_classes (void)
{
tree current;
int save_error_count = java_error_count;
java_layout_seen_class_methods ();
java_parse_abort_on_error ();
all_class_list = NULL_TREE;
for (current = gclass_list; current; current = TREE_CHAIN (current))
if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
java_check_methods (TREE_VALUE (current));
java_parse_abort_on_error ();
for (current = gclass_list; current; current = TREE_CHAIN (current))
{
output_class = current_class = TREE_TYPE (TREE_VALUE (current));
layout_class (current_class);
if (java_error_count)
return;
}
java_layout_seen_class_methods ();
java_parse_abort_on_error ();
}
static void
java_complete_expand_classes (void)
{
tree current;
do_not_fold = flag_emit_xref;
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
if (!INNER_CLASS_DECL_P (current))
java_complete_expand_class (current);
}
static void
java_complete_expand_class (tree outer)
{
tree inner_list;
for (inner_list = DECL_INNER_CLASS_LIST (outer);
inner_list; inner_list = TREE_CHAIN (inner_list))
java_complete_expand_class (TREE_PURPOSE (inner_list));
java_complete_expand_methods (outer);
}
static void
java_complete_expand_methods (tree class_decl)
{
tree clinit, decl, first_decl;
output_class = current_class = TREE_TYPE (class_decl);
first_decl = TYPE_METHODS (current_class);
clinit = maybe_generate_pre_expand_clinit (current_class);
if (TYPE_FINIT_STMT_LIST (current_class))
java_complete_expand_method (generate_finit (current_class));
if (TYPE_II_STMT_LIST (current_class))
java_complete_expand_method (generate_instinit (current_class));
for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl))
{
if (!DECL_CONSTRUCTOR_P (decl))
continue;
java_complete_expand_method (decl);
}
for (decl = first_decl; decl; decl = TREE_CHAIN (decl))
{
if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl))
continue;
if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl)))
{
DECL_FUNCTION_BODY (decl) = NULL_TREE;
continue;
}
if (METHOD_NATIVE (decl))
{
tree body;
current_function_decl = decl;
body = build_jni_stub (decl);
BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body;
}
java_complete_expand_method (decl);
}
if (clinit)
{
ctxp->explicit_constructor_p = 1;
java_complete_expand_method (clinit);
ctxp->explicit_constructor_p = 0;
}
if (TYPE_DOT_CLASS (current_class))
java_complete_expand_method (TYPE_DOT_CLASS (current_class));
if (!CLASS_INTERFACE (class_decl))
for (decl = TYPE_METHODS (current_class); decl; decl = TREE_CHAIN (decl))
if (DECL_CONSTRUCTOR_P (decl)
&& verify_constructor_circularity (decl, decl))
break;
}
static tree
maybe_generate_pre_expand_clinit (tree class_type)
{
tree current, mdecl;
if (!TYPE_CLINIT_STMT_LIST (class_type))
return NULL_TREE;
for (current = TYPE_FIELDS (class_type); current;
current = TREE_CHAIN (current))
if (FIELD_STATIC (current))
build_field_ref (NULL_TREE, class_type, DECL_NAME (current));
mdecl = create_artificial_method (class_type, ACC_STATIC, void_type_node,
clinit_identifier_node, end_params_node);
layout_class_method (class_type, CLASSTYPE_SUPER (class_type),
mdecl, NULL_TREE);
start_artificial_method_body (mdecl);
for (current = TYPE_CLINIT_STMT_LIST (class_type); current;
current = TREE_CHAIN (current))
{
tree stmt = current;
if (TREE_CODE (stmt) != BLOCK && !IS_EMPTY_STMT (stmt))
stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt);
java_method_add_stmt (mdecl, stmt);
}
end_artificial_method_body (mdecl);
if (TREE_CHAIN (TYPE_METHODS (class_type)))
{
current = TREE_CHAIN (TYPE_METHODS (class_type));
TYPE_METHODS (class_type) = current;
while (TREE_CHAIN (current))
current = TREE_CHAIN (current);
TREE_CHAIN (current) = mdecl;
TREE_CHAIN (mdecl) = NULL_TREE;
}
return mdecl;
}
static int
analyze_clinit_body (tree this_class, tree bbody)
{
while (bbody)
switch (TREE_CODE (bbody))
{
case BLOCK:
bbody = BLOCK_EXPR_BODY (bbody);
break;
case EXPR_WITH_FILE_LOCATION:
bbody = EXPR_WFL_NODE (bbody);
break;
case COMPOUND_EXPR:
if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0)))
return 1;
bbody = TREE_OPERAND (bbody, 1);
break;
case MODIFY_EXPR:
if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT
&& flag_emit_class_files)
return 1;
return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1))
|| ! DECL_INITIAL (TREE_OPERAND (bbody, 0))
|| DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class);
default:
return 1;
}
return 0;
}
static int
maybe_yank_clinit (tree mdecl)
{
tree type, current;
tree fbody, bbody;
if (!DECL_CLINIT_P (mdecl))
return 0;
fbody = DECL_FUNCTION_BODY (mdecl);
bbody = BLOCK_EXPR_BODY (fbody);
if (bbody && bbody != error_mark_node)
bbody = BLOCK_EXPR_BODY (bbody);
else
return 0;
if (bbody && ! flag_emit_class_files && !IS_EMPTY_STMT (bbody))
return 0;
type = DECL_CONTEXT (mdecl);
current = TYPE_FIELDS (type);
for (current = (current ? TREE_CHAIN (current) : current);
current; current = TREE_CHAIN (current))
{
tree f_init;
if (!FIELD_STATIC (current))
continue;
f_init = DECL_INITIAL (current);
if (f_init == NULL_TREE)
continue;
if (! JSTRING_TYPE_P (TREE_TYPE (current))
&& ! JNUMERIC_TYPE_P (TREE_TYPE (current)))
return 0;
if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init))
return 0;
}
if (!IS_EMPTY_STMT (bbody) && analyze_clinit_body (type, bbody))
return 0;
if (TYPE_METHODS (type) == mdecl)
TYPE_METHODS (type) = TREE_CHAIN (mdecl);
else
for (current = TYPE_METHODS (type); current;
current = TREE_CHAIN (current))
if (TREE_CHAIN (current) == mdecl)
{
TREE_CHAIN (current) = TREE_CHAIN (mdecl);
break;
}
return 1;
}
void
start_complete_expand_method (tree mdecl)
{
tree tem;
pushlevel (1);
tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl));
DECL_ARGUMENTS (mdecl) = tem;
for (; tem; tem = TREE_CHAIN (tem))
{
tree next = TREE_CHAIN (tem);
tree type = TREE_TYPE (tem);
if (targetm.calls.promote_prototypes (type)
&& TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
&& INTEGRAL_TYPE_P (type))
type = integer_type_node;
DECL_ARG_TYPE (tem) = type;
layout_decl (tem, 0);
pushdecl (tem);
TREE_CHAIN (tem) = next;
}
pushdecl_force_head (DECL_ARGUMENTS (mdecl));
input_location = DECL_SOURCE_LOCATION (mdecl);
build_result_decl (mdecl);
}
static void
java_complete_expand_method (tree mdecl)
{
tree fbody, block_body, exception_copy;
current_function_decl = mdecl;
if (DECL_CONSTRUCTOR_P (mdecl))
fix_constructors (mdecl);
if (!DECL_FUNCTION_BODY (mdecl))
return;
fbody = DECL_FUNCTION_BODY (mdecl);
block_body = BLOCK_EXPR_BODY (fbody);
exception_copy = NULL_TREE;
current_function_decl = mdecl;
if (! quiet_flag)
fprintf (stderr, " [%s.",
lang_printable_name (DECL_CONTEXT (mdecl), 0));
announce_function (mdecl);
if (! quiet_flag)
fprintf (stderr, "]");
start_complete_expand_method (mdecl);
current_this = (!METHOD_STATIC (mdecl) ?
BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE);
exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl));
purge_unchecked_exceptions (mdecl);
PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl));
if (block_body != NULL_TREE)
{
block_body = java_complete_tree (block_body);
htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (mdecl),
attach_init_test_initialization_flags, block_body);
if (! flag_emit_xref && ! METHOD_NATIVE (mdecl))
{
check_for_initialization (block_body, mdecl);
if (STATIC_CLASS_INIT_OPT_P ())
{
if (METHOD_STATIC (mdecl))
{
*(htab_find_slot
(DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl),
DECL_CONTEXT (mdecl), INSERT)) = DECL_CONTEXT (mdecl);
}
}
}
ctxp->explicit_constructor_p = 0;
}
BLOCK_EXPR_BODY (fbody) = block_body;
if (block_body != error_mark_node
&& (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body))
&& TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE
&& !flag_emit_xref)
missing_return_error (current_function_decl);
maybe_yank_clinit (mdecl);
if (java_error_count)
pushdecl_force_head (DECL_ARGUMENTS (mdecl));
poplevel (1, 0, 1);
POP_EXCEPTIONS();
if (currently_caught_type_list)
abort ();
DECL_FUNCTION_THROWS (mdecl) = exception_copy;
}
static void
java_expand_method_bodies (tree class)
{
tree decl;
for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl))
{
tree block;
if (! DECL_FUNCTION_BODY (decl))
continue;
current_function_decl = decl;
block = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
DECL_SAVED_TREE (decl) = block;
if (STATIC_CLASS_INIT_OPT_P ())
{
tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl);
for (; list != NULL_TREE; list = TREE_CHAIN (list))
{
tree called_method = TREE_PURPOSE (list);
tree compound = TREE_VALUE (list);
tree assignment_compound_list
= build_tree_list (called_method, NULL);
htab_traverse (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method),
emit_test_initialization,
assignment_compound_list);
if (TREE_VALUE (assignment_compound_list))
TREE_OPERAND (compound, 1)
= TREE_VALUE (assignment_compound_list);
}
}
source_end_java_method ();
}
}
static tree
build_outer_field_access (tree id, tree decl)
{
tree access = NULL_TREE;
tree ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
tree decl_ctx = DECL_CONTEXT (decl);
if ((ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
&& (!FIELD_PRIVATE (decl) || !flag_emit_class_files ))
{
tree thisn = build_current_thisn (current_class);
access = make_qualified_primary (build_wfl_node (thisn),
id, EXPR_WFL_LINECOL (id));
}
else
{
int lc = EXPR_WFL_LINECOL (id);
access = build_access_to_thisn (current_class, decl_ctx, lc);
if (FIELD_PRIVATE (decl) && flag_emit_class_files )
{
tree name = build_outer_field_access_methods (decl);
access = build_outer_field_access_expr (lc, decl_ctx,
name, access, NULL_TREE);
}
else
access = make_qualified_primary (access, id, lc);
}
return resolve_expression_name (access, NULL);
}
static int
outer_field_access_p (tree type, tree decl)
{
if (!INNER_CLASS_TYPE_P (type)
|| TREE_CODE (decl) != FIELD_DECL
|| DECL_CONTEXT (decl) == type)
return 0;
if (inherits_from_p (type, DECL_CONTEXT (decl)))
return 0;
for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ;
type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))))
{
if (type == DECL_CONTEXT (decl))
return 1;
if (!DECL_CONTEXT (TYPE_NAME (type)))
{
if (inherits_from_p (type, DECL_CONTEXT (decl)))
return 1;
break;
}
}
return 0;
}
static int
outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
tree *arg)
{
int identified = 0;
if (TREE_CODE (node) != CALL_EXPR)
return 0;
if (flag_emit_class_files
&& TREE_CODE (node) == CALL_EXPR
&& OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
identified = 1;
else if (!flag_emit_class_files)
{
node = TREE_OPERAND (node, 0);
if (node && TREE_OPERAND (node, 0)
&& TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)
{
node = TREE_OPERAND (node, 0);
if (TREE_OPERAND (node, 0)
&& TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
&& (OUTER_FIELD_ACCESS_IDENTIFIER_P
(DECL_NAME (TREE_OPERAND (node, 0)))))
identified = 1;
}
}
if (identified && name && arg_type && arg)
{
tree argument = TREE_OPERAND (node, 1);
*name = DECL_NAME (TREE_OPERAND (node, 0));
*arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
*arg = TREE_VALUE (argument);
}
return identified;
}
static tree
outer_field_access_fix (tree wfl, tree node, tree rhs)
{
tree name, arg_type, arg;
if (outer_field_expanded_access_p (node, &name, &arg_type, &arg))
{
node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl),
arg_type, name, arg, rhs);
return java_complete_tree (node);
}
return NULL_TREE;
}
static tree
build_outer_field_access_expr (int lc, tree type, tree access_method_name,
tree arg1, tree arg2)
{
tree args, cn, access;
args = arg1 ? arg1 :
build_wfl_node (build_current_thisn (current_class));
args = build_tree_list (NULL_TREE, args);
if (arg2)
args = tree_cons (NULL_TREE, arg2, args);
access = build_method_invocation (build_wfl_node (access_method_name), args);
cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
return make_qualified_primary (cn, access, lc);
}
static tree
build_new_access_id (void)
{
static int access_n_counter = 1;
char buffer [128];
sprintf (buffer, "access$%d", access_n_counter++);
return get_identifier (buffer);
}
static tree
build_outer_field_access_methods (tree decl)
{
tree id, args, stmt, mdecl;
if (FIELD_INNER_ACCESS_P (decl))
return FIELD_INNER_ACCESS (decl);
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
id = build_new_access_id ();
OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
args = build_tree_list (inst_id, build_pointer_type (DECL_CONTEXT (decl)));
TREE_CHAIN (args) = end_params_node;
stmt = make_qualified_primary (build_wfl_node (inst_id),
build_wfl_node (DECL_NAME (decl)), 0);
stmt = build_return (0, stmt);
mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
TREE_TYPE (decl), id, args, stmt);
DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
if (!FIELD_FINAL (decl))
{
args = build_tree_list (inst_id,
build_pointer_type (DECL_CONTEXT (decl)));
TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
stmt = make_qualified_primary (build_wfl_node (inst_id),
build_wfl_node (DECL_NAME (decl)), 0);
stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
build_wfl_node (wpv_id)));
mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
TREE_TYPE (decl), id,
args, stmt);
}
DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
return FIELD_INNER_ACCESS (decl) = id;
}
static tree
build_outer_field_access_method (tree class, tree type, tree name,
tree args, tree body)
{
tree saved_current_function_decl, mdecl;
mdecl = create_artificial_method (class, ACC_STATIC, type, name, args);
fix_method_argument_names (args, mdecl);
layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
saved_current_function_decl = current_function_decl;
start_artificial_method_body (mdecl);
java_method_add_stmt (mdecl, body);
end_artificial_method_body (mdecl);
current_function_decl = saved_current_function_decl;
return mdecl;
}
static tree
build_outer_method_access_method (tree decl)
{
tree saved_current_function_decl, mdecl;
tree args = NULL_TREE, call_args = NULL_TREE;
tree carg, id, body, class;
char buffer [80];
int parm_id_count = 0;
if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "access$"))
abort ();
if (DECL_FUNCTION_INNER_ACCESS (decl))
return DECL_FUNCTION_INNER_ACCESS (decl);
class = DECL_CONTEXT (decl);
id = build_new_access_id ();
OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
for (; carg && carg != end_params_node;
carg = TREE_CHAIN (carg))
{
sprintf (buffer, "write_parm_value$%d", parm_id_count++);
args = chainon (args, build_tree_list (get_identifier (buffer),
TREE_VALUE (carg)));
}
args = chainon (args, end_params_node);
mdecl = create_artificial_method (class, ACC_STATIC,
TREE_TYPE (TREE_TYPE (decl)), id, args);
layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
TYPE_ARG_TYPES (TREE_TYPE (mdecl)) = args;
saved_current_function_decl = current_function_decl;
start_artificial_method_body (mdecl);
carg = args;
if (!METHOD_STATIC (decl))
carg = TREE_CHAIN (carg);
for (; carg && carg != end_params_node; carg = TREE_CHAIN (carg))
call_args = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (carg)),
call_args);
body = build_method_invocation (build_wfl_node (DECL_NAME (decl)),
call_args);
if (!METHOD_STATIC (decl))
body = make_qualified_primary (build_wfl_node (TREE_PURPOSE (args)),
body, 0);
if (TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
body = build_return (0, body);
java_method_add_stmt (mdecl,body);
end_artificial_method_body (mdecl);
current_function_decl = saved_current_function_decl;
DECL_FUNCTION_ACCESS_DECL (decl) = mdecl;
return DECL_FUNCTION_INNER_ACCESS (decl) = mdecl;
}
static tree
build_access_to_thisn (tree from, tree to, int lc)
{
tree access = NULL_TREE;
while (from != to && PURE_INNER_CLASS_TYPE_P (from))
{
if (!access)
{
access = build_current_thisn (from);
access = build_wfl_node (access);
}
else
{
tree access0_wfl, cn;
maybe_build_thisn_access_method (from);
access0_wfl = build_wfl_node (access0_identifier_node);
cn = build_wfl_node (DECL_NAME (TYPE_NAME (from)));
EXPR_WFL_LINECOL (access0_wfl) = lc;
access = build_tree_list (NULL_TREE, access);
access = build_method_invocation (access0_wfl, access);
access = make_qualified_primary (cn, access, lc);
}
from = DECL_CONTEXT (TYPE_NAME (from));
if (!from)
break;
from = TREE_TYPE (from);
}
return access;
}
static tree
maybe_build_thisn_access_method (tree type)
{
tree mdecl, args, stmt, rtype;
tree saved_current_function_decl;
if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type))
return NULL_TREE;
args = build_tree_list (inst_id, build_pointer_type (type));
TREE_CHAIN (args) = end_params_node;
rtype = build_pointer_type (TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))));
mdecl = create_artificial_method (type, ACC_STATIC, rtype,
access0_identifier_node, args);
fix_method_argument_names (args, mdecl);
layout_class_method (type, NULL_TREE, mdecl, NULL_TREE);
stmt = build_current_thisn (type);
stmt = make_qualified_primary (build_wfl_node (inst_id),
build_wfl_node (stmt), 0);
stmt = build_return (0, stmt);
saved_current_function_decl = current_function_decl;
start_artificial_method_body (mdecl);
java_method_add_stmt (mdecl, stmt);
end_artificial_method_body (mdecl);
current_function_decl = saved_current_function_decl;
CLASS_ACCESS0_GENERATED_P (type) = 1;
return mdecl;
}
static GTY(()) tree saved_thisn;
static GTY(()) tree saved_type;
static tree
build_current_thisn (tree type)
{
static int saved_i = -1;
static int saved_type_i = 0;
tree decl;
char buffer [24];
int i = 0;
if (type)
{
if (type == saved_type)
i = saved_type_i;
else
{
for (i = -1, decl = DECL_CONTEXT (TYPE_NAME (type));
decl; decl = DECL_CONTEXT (decl), i++)
;
saved_type = type;
saved_type_i = i;
}
}
else
i = list_length (GET_CPC_LIST ())-2;
if (i == saved_i)
return saved_thisn;
sprintf (buffer, "this$%d", i);
saved_i = i;
saved_thisn = get_identifier (buffer);
return saved_thisn;
}
static tree
build_thisn_assign (void)
{
if (current_class && PURE_INNER_CLASS_TYPE_P (current_class))
{
tree thisn = build_current_thisn (current_class);
tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
build_wfl_node (thisn), 0);
tree rhs = build_wfl_node (thisn);
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (lhs, input_location);
#else
EXPR_WFL_SET_LINECOL (lhs, input_line, 0);
#endif
return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
}
return NULL_TREE;
}
static GTY(()) tree get_message_wfl;
static GTY(()) tree type_parm_wfl;
static tree
build_dot_class_method (tree class)
{
#define BWF(S) build_wfl_node (get_identifier ((S)))
#ifdef USE_MAPPED_LOCATION
#define MQN(X,Y) make_qualified_name ((X), (Y), UNKNOWN_LOCATION)
#else
#define MQN(X,Y) make_qualified_name ((X), (Y), 0)
#endif
tree args, tmp, saved_current_function_decl, mdecl, qual_name;
tree stmt, throw_stmt;
if (!get_message_wfl)
{
get_message_wfl = build_wfl_node (get_identifier ("getMessage"));
type_parm_wfl = build_wfl_node (get_identifier ("type$"));
}
args = build_tree_list (get_identifier ("type$"),
build_pointer_type (string_type_node));
TREE_CHAIN (args) = end_params_node;
tmp = MQN (MQN (MQN (BWF ("java"),
BWF ("lang")), BWF ("Class")), BWF ("forName"));
mdecl = create_artificial_method (class, ACC_STATIC,
build_pointer_type (class_type_node),
classdollar_identifier_node, args);
qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
BWF ("NoClassDefFoundError"));
DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, qual_name);
register_incomplete_type (JDEP_EXCEPTION, qual_name, NULL_TREE, NULL_TREE);
JDEP_GET_PATCH (CLASSD_LAST (ctxp->classd_list)) =
&TREE_VALUE (DECL_FUNCTION_THROWS (mdecl));
stmt = build_method_invocation (tmp,
build_tree_list (NULL_TREE, type_parm_wfl));
stmt = build_return (0, stmt);
#ifdef USE_MAPPED_LOCATION
throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
get_message_wfl, UNKNOWN_LOCATION);
#else
throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
get_message_wfl, 0);
#endif
throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
throw_stmt = build_new_invocation
(build_wfl_node (get_identifier ("NoClassDefFoundError")),
build_tree_list (build_pointer_type (string_type_node), throw_stmt));
throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt);
qual_name = MQN (MQN (BWF ("java"), BWF ("lang")),
BWF ("ClassNotFoundException"));
stmt = encapsulate_with_try_catch (0, qual_name, stmt, throw_stmt);
fix_method_argument_names (args, mdecl);
layout_class_method (class, NULL_TREE, mdecl, NULL_TREE);
saved_current_function_decl = current_function_decl;
start_artificial_method_body (mdecl);
java_method_add_stmt (mdecl, stmt);
end_artificial_method_body (mdecl);
current_function_decl = saved_current_function_decl;
TYPE_DOT_CLASS (class) = mdecl;
return mdecl;
}
static tree
build_dot_class_method_invocation (tree this_class, tree type)
{
tree dot_class_method = TYPE_DOT_CLASS (this_class);
tree sig_id, s, t;
if (TYPE_ARRAY_P (type))
sig_id = build_java_signature (type);
else
sig_id = DECL_NAME (TYPE_NAME (type));
sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id),
IDENTIFIER_LENGTH (sig_id));
s = build_string (IDENTIFIER_LENGTH (sig_id),
IDENTIFIER_POINTER (sig_id));
t = build_method_invocation (build_wfl_node (DECL_NAME (dot_class_method)),
build_tree_list (NULL_TREE, s));
if (DECL_CONTEXT (dot_class_method) != this_class)
{
tree class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (dot_class_method)));
t = make_qualified_primary (build_wfl_node (class_name), t, 0);
}
return t;
}
static void
fix_constructors (tree mdecl)
{
tree iii;
tree *bodyp = &DECL_FUNCTION_BODY (mdecl);
tree thisn_assign, compound = NULL_TREE;
tree class_type = DECL_CONTEXT (mdecl);
if (DECL_FIXED_CONSTRUCTOR_P (mdecl))
return;
DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
if (!*bodyp)
{
if (verify_constructor_super (mdecl))
{
tree sclass_decl = TYPE_NAME (CLASSTYPE_SUPER (class_type));
tree save = DECL_NAME (mdecl);
const char *n = IDENTIFIER_POINTER (DECL_NAME (sclass_decl));
DECL_NAME (mdecl) = DECL_NAME (sclass_decl);
parse_error_context
(lookup_cl (TYPE_NAME (class_type)),
"No constructor matching %qs found in class %qs",
lang_printable_name (mdecl, 2), n);
DECL_NAME (mdecl) = save;
}
start_artificial_method_body (mdecl);
if ((thisn_assign = build_thisn_assign ()))
java_method_add_stmt (mdecl, thisn_assign);
java_method_add_stmt (mdecl, build_super_invocation (mdecl));
if ((iii = build_instinit_invocation (class_type)))
java_method_add_stmt (mdecl, iii);
end_artificial_method_body (mdecl);
}
else
{
int found = 0;
int invokes_this = 0;
tree main_block = BLOCK_EXPR_BODY (*bodyp);
while (*bodyp)
{
tree body = *bodyp;
switch (TREE_CODE (body))
{
case CALL_EXPR:
found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
if (CALL_THIS_CONSTRUCTOR_P (body))
invokes_this = 1;
break;
case COMPOUND_EXPR:
case EXPR_WITH_FILE_LOCATION:
bodyp = &TREE_OPERAND (body, 0);
continue;
case BLOCK:
bodyp = &BLOCK_EXPR_BODY (body);
continue;
default:
break;
}
break;
}
if ((thisn_assign = build_thisn_assign ()))
compound = add_stmt_to_compound (compound, NULL_TREE, thisn_assign);
if (!found)
compound = add_stmt_to_compound (compound, NULL_TREE,
build_super_invocation (mdecl));
else
{
compound = add_stmt_to_compound (compound, NULL_TREE, *bodyp);
*bodyp = build_java_empty_stmt ();
}
DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
if (!invokes_this && (iii = build_instinit_invocation (class_type)))
compound = add_stmt_to_compound (compound, NULL_TREE, iii);
if (compound)
{
compound = add_stmt_to_compound (compound, NULL_TREE,
BLOCK_EXPR_BODY (main_block));
BLOCK_EXPR_BODY (main_block) = compound;
}
}
}
static int
verify_constructor_super (tree mdecl)
{
tree class = CLASSTYPE_SUPER (current_class);
int super_inner = PURE_INNER_CLASS_TYPE_P (class);
tree sdecl;
if (!class)
return 0;
if (ANONYMOUS_CLASS_P (current_class))
{
tree mdecl_arg_type;
SKIP_THIS_AND_ARTIFICIAL_PARMS (mdecl_arg_type, mdecl);
for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
if (DECL_CONSTRUCTOR_P (sdecl))
{
tree m_arg_type;
tree arg_type = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
if (super_inner)
arg_type = TREE_CHAIN (arg_type);
for (m_arg_type = mdecl_arg_type;
(arg_type != end_params_node
&& m_arg_type != end_params_node);
arg_type = TREE_CHAIN (arg_type),
m_arg_type = TREE_CHAIN (m_arg_type))
if (!valid_method_invocation_conversion_p
(TREE_VALUE (arg_type),
TREE_VALUE (m_arg_type)))
break;
if (arg_type == end_params_node && m_arg_type == end_params_node)
return 0;
}
}
else
{
for (sdecl = TYPE_METHODS (class); sdecl; sdecl = TREE_CHAIN (sdecl))
{
tree arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (sdecl)));
if (super_inner)
arg = TREE_CHAIN (arg);
if (DECL_CONSTRUCTOR_P (sdecl) && arg == end_params_node)
return 0;
}
}
return 1;
}
static GTY(()) tree reversed_class_list;
void
java_expand_classes (void)
{
int save_error_count = 0;
static struct parser_ctxt *cur_ctxp = NULL;
location_t save_location;
java_parse_abort_on_error ();
if (!(ctxp = ctxp_for_generation))
return;
java_layout_classes ();
java_parse_abort_on_error ();
save_location = input_location;
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
tree current;
for (current = cur_ctxp->class_list;
current;
current = TREE_CHAIN (current))
gen_indirect_dispatch_tables (TREE_TYPE (current));
}
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
ctxp = cur_ctxp;
input_location = ctxp->file_start_location;
lang_init_source (2);
java_complete_expand_classes ();
java_parse_abort_on_error ();
}
input_location = save_location;
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
tree current;
ctxp = cur_ctxp;
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
{
output_class = current_class = TREE_TYPE (current);
if (ANONYMOUS_CLASS_P (current_class))
{
tree d;
for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
{
if (DECL_CONSTRUCTOR_P (d))
{
java_complete_expand_method (d);
break;
}
}
}
}
}
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
tree current;
ctxp = cur_ctxp;
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
{
tree d;
output_class = current_class = TREE_TYPE (current);
for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
{
if (DECL_RESULT (d) == NULL_TREE)
java_complete_expand_method (d);
}
}
}
#if 0
{
int something_changed;
do
{
something_changed = 0;
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
tree current;
ctxp = cur_ctxp;
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
{
tree d;
output_class = current_class = TREE_TYPE (current);
for (d = TYPE_METHODS (current_class); d; d = TREE_CHAIN (d))
{
if (DECL_RESULT (d) == NULL_TREE)
{
something_changed = 1;
java_complete_expand_method (d);
}
}
}
}
}
while (something_changed);
}
#endif
if (java_error_count && !flag_emit_xref
&& (!flag_syntax_only && !flag_emit_class_files))
return;
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
tree current;
ctxp = cur_ctxp;
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
java_mark_class_local (TREE_TYPE (current));
}
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
tree current;
reversed_class_list = NULL;
ctxp = cur_ctxp;
for (current = ctxp->class_list;
current;
current = TREE_CHAIN (current))
reversed_class_list
= tree_cons (NULL_TREE, current, reversed_class_list);
for (current = reversed_class_list;
current;
current = TREE_CHAIN (current))
{
output_class = current_class = TREE_TYPE (TREE_VALUE (current));
if (flag_emit_class_files)
write_classfile (current_class);
if (flag_emit_xref)
expand_xref (current_class);
else if (! flag_syntax_only)
java_expand_method_bodies (current_class);
}
}
}
void
java_finish_classes (void)
{
static struct parser_ctxt *cur_ctxp = NULL;
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
tree current;
ctxp = cur_ctxp;
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
{
output_class = current_class = TREE_TYPE (current);
finish_class ();
}
}
}
static tree
make_qualified_primary (tree primary, tree right, int location)
{
tree wfl;
if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION)
wfl = build_wfl_wrap (primary, location);
else
{
wfl = primary;
if (!EXPR_WFL_QUALIFICATION (wfl))
EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (wfl, NULL_TREE);
}
EXPR_WFL_LINECOL (right) = location;
chainon (EXPR_WFL_QUALIFICATION (wfl), build_tree_list (right, NULL_TREE));
PRIMARY_P (wfl) = 1;
return wfl;
}
static tree
merge_qualified_name (tree left, tree right)
{
tree node;
if (!left && !right)
return NULL_TREE;
if (!left)
return right;
if (!right)
return left;
obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (left),
IDENTIFIER_LENGTH (left));
obstack_1grow (&temporary_obstack, '.');
obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (right),
IDENTIFIER_LENGTH (right));
node = get_identifier (obstack_base (&temporary_obstack));
obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
QUALIFIED_P (node) = 1;
return node;
}
static tree
make_qualified_name (tree left, tree right,
#ifdef USE_MAPPED_LOCATION
source_location location
#else
int location
#endif
)
{
#ifdef USE_COMPONENT_REF
tree node = build3 (COMPONENT_REF, NULL_TREE, left, right, NULL_TREE);
SET_EXPR_LOCATION (node, location);
return node;
#else
tree left_id = EXPR_WFL_NODE (left);
tree right_id = EXPR_WFL_NODE (right);
tree wfl, merge;
merge = merge_qualified_name (left_id, right_id);
#ifdef USE_MAPPED_LOCATION
if (!QUALIFIED_P (left_id))
{
tree wfl = build_expr_wfl (left_id, EXPR_LOCATION (left));
EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
}
wfl = build_expr_wfl (right_id, location);
#else
if (!QUALIFIED_P (left_id))
{
tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (left);
EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
}
wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
EXPR_WFL_LINECOL (wfl) = location;
#endif
chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
EXPR_WFL_NODE (left) = merge;
return left;
#endif
}
static tree
cut_identifier_in_qualified (tree wfl)
{
tree q;
tree previous = NULL_TREE;
for (q = EXPR_WFL_QUALIFICATION (wfl); ; previous = q, q = TREE_CHAIN (q))
if (!TREE_CHAIN (q))
{
if (!previous)
abort ();
TREE_CHAIN (previous) = NULL_TREE;
return TREE_PURPOSE (q);
}
}
static tree
resolve_expression_name (tree id, tree *orig)
{
tree name = EXPR_WFL_NODE (id);
tree decl;
if (!PRIMARY_P (id) && !QUALIFIED_P (name))
{
if ((decl = IDENTIFIER_LOCAL_VALUE (name)))
return decl;
else
{
decl = lookup_field_wrapper (current_class, name);
if (decl)
{
tree access = NULL_TREE;
int fs = FIELD_STATIC (decl);
if (FIELD_LOCAL_ALIAS_USED (decl))
name = DECL_NAME (decl);
check_deprecation (id, decl);
if (!fs && METHOD_STATIC (current_function_decl))
{
static_ref_err (id, name, current_class);
return error_mark_node;
}
if (!fs && ctxp->explicit_constructor_p
&& !enclosing_context_p (DECL_CONTEXT (decl), current_class))
{
parse_error_context
(id, "Can't reference %qs before the superclass constructor has been called", IDENTIFIER_POINTER (name));
return error_mark_node;
}
if (!fs && outer_field_access_p (current_class, decl))
{
if (CLASS_STATIC (TYPE_NAME (current_class)))
{
static_ref_err (id, DECL_NAME (decl), current_class);
return error_mark_node;
}
access = build_outer_field_access (id, decl);
if (orig)
*orig = access;
return access;
}
access = build_field_ref ((fs ? NULL_TREE : current_this),
DECL_CONTEXT (decl), name);
if (fs)
access = maybe_build_class_init_for_field (decl, access);
if (orig)
*orig = access;
if (not_accessible_p (current_class, decl, NULL_TREE, 0))
{
not_accessible_field_error (id, decl);
return error_mark_node;
}
return access;
}
}
}
else
{
if (orig)
*orig = NULL_TREE;
qualify_ambiguous_name (id);
return resolve_field_access (id, orig, NULL);
}
if (INNER_CLASS_TYPE_P (current_class))
parse_error_context (id,
"Local variable %qs can't be accessed from within the inner class %qs unless it is declared final",
IDENTIFIER_POINTER (name),
IDENTIFIER_POINTER (DECL_NAME
(TYPE_NAME (current_class))));
else
parse_error_context (id, "Undefined variable %qs",
IDENTIFIER_POINTER (name));
return error_mark_node;
}
static void
static_ref_err (tree wfl, tree field_id, tree class_type)
{
parse_error_context
(wfl,
"Can't make a static reference to nonstatic variable %qs in class %qs",
IDENTIFIER_POINTER (field_id),
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type))));
}
static tree
resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
{
int is_static = 0;
tree field_ref;
tree decl = NULL_TREE, where_found, type_found;
if (resolve_qualified_expression_name (qual_wfl, &decl,
&where_found, &type_found))
return error_mark_node;
if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node
&& type_found && TYPE_ARRAY_P (type_found)
&& ! flag_emit_class_files && ! flag_emit_xref)
{
tree length = build_java_array_length_access (where_found);
field_ref = length;
if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
{
build_static_field_ref (where_found);
field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
}
}
else if (JDECL_P (decl) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) == decl)
field_ref = decl;
else if (JDECL_P (decl))
{
if (!type_found)
type_found = DECL_CONTEXT (decl);
is_static = FIELD_STATIC (decl);
field_ref = build_field_ref ((is_static && !flag_emit_xref?
NULL_TREE : where_found),
type_found, DECL_NAME (decl));
if (field_ref == error_mark_node)
return error_mark_node;
if (is_static)
field_ref = maybe_build_class_init_for_field (decl, field_ref);
if (!flag_emit_class_files
&& !flag_emit_xref
&& TREE_CODE (where_found) == VAR_DECL
&& FIELD_STATIC (where_found))
{
build_static_field_ref (where_found);
field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
}
}
else
field_ref = decl;
if (field_decl)
*field_decl = decl;
if (field_type)
*field_type = (QUAL_DECL_TYPE (decl) ?
QUAL_DECL_TYPE (decl) : TREE_TYPE (decl));
return field_ref;
}
tree
extract_field_decl (tree node)
{
if (TREE_CODE (node) == COMPOUND_EXPR)
{
tree op1 = TREE_OPERAND (node, 1);
if (TREE_CODE (op1) == COMPOUND_EXPR)
{
tree call = TREE_OPERAND (op1, 0);
if (TREE_CODE (call) == CALL_EXPR
&& TREE_CODE (TREE_OPERAND (call, 0)) == ADDR_EXPR
&& (TREE_OPERAND (TREE_OPERAND (call, 0), 0)
== soft_initclass_node))
return TREE_OPERAND (op1, 1);
}
else if (JDECL_P (op1))
return op1;
}
return node;
}
static int
resolve_qualified_expression_name (tree wfl, tree *found_decl,
tree *where_found, tree *type_found)
{
int from_type = 0;
int from_super = 0, from_cast = 0, from_qualified_this = 0;
int previous_call_static = 0;
int is_static;
tree decl = NULL_TREE, type = NULL_TREE, q;
tree saved_current, saved_this;
#define RESTORE_THIS_AND_CURRENT_CLASS \
{ current_class = saved_current; current_this = saved_this;}
*type_found = *where_found = NULL_TREE;
for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
{
tree qual_wfl = QUAL_WFL (q);
tree ret_decl;
#ifdef USE_MAPPED_LOCATION
source_location location;
#else
int location;
#endif
switch (TREE_CODE (qual_wfl))
{
case CALL_EXPR:
case NEW_CLASS_EXPR:
if (JDECL_P (decl) && !FIELD_STATIC (decl))
{
decl = maybe_access_field (decl, *where_found,
DECL_CONTEXT (decl));
if (decl == error_mark_node)
return 1;
}
if (complete_function_arguments (qual_wfl))
return 1;
saved_current = current_class;
saved_this = current_this;
if (decl
&& (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
|| from_qualified_this))
{
if (from_qualified_this)
{
decl = build_access_to_thisn (current_class, type, 0);
decl = java_complete_tree (decl);
type = TREE_TYPE (TREE_TYPE (decl));
}
current_class = type;
current_this = decl;
from_qualified_this = 0;
}
if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
CALL_USING_SUPER (qual_wfl) = 1;
#ifdef USE_MAPPED_LOCATION
location = (TREE_CODE (qual_wfl) == CALL_EXPR
? EXPR_LOCATION (TREE_OPERAND (qual_wfl, 0))
: UNKNOWN_LOCATION);
#else
location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
#endif
*where_found = patch_method_invocation (qual_wfl, decl, type,
from_super,
&is_static, &ret_decl);
from_super = 0;
if (*where_found == error_mark_node)
{
RESTORE_THIS_AND_CURRENT_CLASS;
return 1;
}
*type_found = type = QUAL_DECL_TYPE (*where_found);
*where_found = force_evaluation_order (*where_found);
if (TREE_CODE (qual_wfl) == NEW_CLASS_EXPR
&& INNER_ENCLOSING_SCOPE_CHECK (type))
{
parse_error_context
(qual_wfl, "No enclosing instance for inner class %qs is in scope%s",
lang_printable_name (type, 0),
(!current_this ? "" :
"; an explicit one must be provided when creating this inner class"));
RESTORE_THIS_AND_CURRENT_CLASS;
return 1;
}
RESTORE_THIS_AND_CURRENT_CLASS;
#ifdef USE_MAPPED_LOCATION
if (location != UNKNOWN_LOCATION)
#else
if (location)
#endif
{
tree arguments = NULL_TREE;
if (TREE_CODE (qual_wfl) == CALL_EXPR
&& TREE_OPERAND (qual_wfl, 1) != NULL_TREE)
arguments = TREE_VALUE (TREE_OPERAND (qual_wfl, 1));
check_thrown_exceptions (location, ret_decl, arguments);
}
if (previous_call_static && is_static)
{
CAN_COMPLETE_NORMALLY (decl) = 1;
decl = build2 (COMPOUND_EXPR, TREE_TYPE (*where_found),
decl, *where_found);
TREE_SIDE_EFFECTS (decl) = 1;
}
else
{
previous_call_static = is_static;
decl = *where_found;
}
from_type = 0;
continue;
case NEW_ARRAY_EXPR:
case NEW_ANONYMOUS_ARRAY_EXPR:
*where_found = decl = java_complete_tree (qual_wfl);
if (decl == error_mark_node)
return 1;
*type_found = type = QUAL_DECL_TYPE (decl);
continue;
case CONVERT_EXPR:
*where_found = decl = java_complete_tree (qual_wfl);
if (decl == error_mark_node)
return 1;
*type_found = type = QUAL_DECL_TYPE (decl);
from_cast = 1;
continue;
case CONDITIONAL_EXPR:
case STRING_CST:
case MODIFY_EXPR:
*where_found = decl = java_complete_tree (qual_wfl);
if (decl == error_mark_node)
return 1;
*type_found = type = QUAL_DECL_TYPE (decl);
continue;
case ARRAY_REF:
if (JDECL_P (decl) && !FIELD_STATIC (decl))
{
decl = maybe_access_field (decl, *where_found, type);
if (decl == error_mark_node)
return 1;
}
decl = java_complete_tree (qual_wfl);
if (decl == error_mark_node)
return 1;
type = QUAL_DECL_TYPE (decl);
continue;
case PLUS_EXPR:
if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
return 1;
if ((type = patch_string (decl)))
decl = type;
*where_found = QUAL_RESOLUTION (q) = decl;
*type_found = type = TREE_TYPE (decl);
break;
case CLASS_LITERAL:
if ((decl = java_complete_tree (qual_wfl)) == error_mark_node)
return 1;
*where_found = QUAL_RESOLUTION (q) = decl;
*type_found = type = TREE_TYPE (decl);
break;
default:
break;
}
previous_call_static = 0;
if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
&& EXPR_WFL_NODE (qual_wfl) == this_identifier_node)
{
if (!current_this)
{
parse_error_context
(wfl, "Keyword %<this%> used outside allowed context");
return 1;
}
if (ctxp->explicit_constructor_p
&& type == current_class)
{
parse_error_context (wfl, "Can't reference %<this%> before the superclass constructor has been called");
return 1;
}
if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type)
{
*where_found = decl = current_this;
*type_found = type = QUAL_DECL_TYPE (decl);
}
else
{
if (!enclosing_context_p (type, current_class))
{
char *p = xstrdup (lang_printable_name (type, 0));
parse_error_context (qual_wfl, "Can't use variable %<%s.this%>: type %qs isn't an outer type of type %qs",
p, p,
lang_printable_name (current_class, 0));
free (p);
return 1;
}
from_qualified_this = 1;
if (!TREE_CHAIN (q))
{
decl = build_access_to_thisn (current_class, type, 0);
*where_found = decl = java_complete_tree (decl);
*type_found = type = TREE_TYPE (decl);
}
}
from_type = 0;
continue;
}
if (TREE_CODE (qual_wfl) == EXPR_WITH_FILE_LOCATION
&& EXPR_WFL_NODE (qual_wfl) == super_identifier_node)
{
tree node;
if (METHOD_STATIC (current_function_decl)
|| current_class == object_type_node)
{
parse_error_context
(wfl, "Keyword %<super%> used outside allowed context");
return 1;
}
node = build_cast (EXPR_WFL_LINECOL (qual_wfl),
CLASSTYPE_SUPER (current_class),
build_this (EXPR_WFL_LINECOL (qual_wfl)));
*where_found = decl = java_complete_tree (node);
if (decl == error_mark_node)
return 1;
*type_found = type = QUAL_DECL_TYPE (decl);
from_super = from_type = 1;
continue;
}
if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
{
tree name;
if ((decl = resolve_package (wfl, &q, &name)))
{
tree list;
*where_found = decl;
check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
*type_found = type = TREE_TYPE (decl);
layout_class (type);
from_type = 1;
if (q)
{
list = TREE_CHAIN (q);
while (list)
{
RESOLVE_PACKAGE_NAME_P (QUAL_WFL (list)) = 0;
list = TREE_CHAIN (list);
}
}
}
else
{
if (from_super || from_cast)
parse_error_context
((from_cast ? qual_wfl : wfl),
"No variable %qs defined in class %qs",
IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
lang_printable_name (type, 0));
else
parse_error_context
(qual_wfl, "Undefined variable or class name: %qs",
IDENTIFIER_POINTER (name));
return 1;
}
}
else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q))
{
decl = QUAL_RESOLUTION (q);
if(TREE_CHAIN (q)
&& TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR)
{
parse_error_context (qual_wfl, "Undefined variable %qs",
IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
return 1;
}
check_pkg_class_access (DECL_NAME (decl), qual_wfl, true, NULL);
check_deprecation (qual_wfl, decl);
type = TREE_TYPE (decl);
from_type = 1;
}
else
{
tree field_decl = NULL_TREE;
if (!from_super && QUAL_RESOLUTION (q))
{
decl = QUAL_RESOLUTION (q);
if (!type)
{
if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
{
if (current_this)
*where_found = current_this;
else
{
static_ref_err (qual_wfl, DECL_NAME (decl),
current_class);
return 1;
}
if (outer_field_access_p (current_class, decl))
decl = build_outer_field_access (qual_wfl, decl);
}
else
{
*where_found = TREE_TYPE (decl);
if (TREE_CODE (*where_found) == POINTER_TYPE)
*where_found = TREE_TYPE (*where_found);
}
}
}
else if (TREE_CODE (qual_wfl) == INTEGER_CST)
{
parse_error_context
(wfl, "Can't use type %qs as a qualifier",
lang_printable_name (TREE_TYPE (qual_wfl), 0));
return 1;
}
else
{
int is_static;
tree field_decl_type;
if (!from_type && !JREFERENCE_TYPE_P (type))
{
parse_error_context
(qual_wfl, "Attempt to reference field %qs in %<%s %s%>",
IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
lang_printable_name (type, 0),
IDENTIFIER_POINTER (DECL_NAME (decl)));
return 1;
}
field_decl = lookup_field_wrapper (type,
EXPR_WFL_NODE (qual_wfl));
if (!field_decl && TREE_CODE (decl) == TYPE_DECL)
{
tree ptr, inner_decl;
BUILD_PTR_FROM_NAME (ptr, EXPR_WFL_NODE (qual_wfl));
inner_decl = resolve_class (decl, ptr, NULL_TREE, qual_wfl);
if (inner_decl)
{
check_inner_class_access (inner_decl, decl, qual_wfl);
type = TREE_TYPE (inner_decl);
decl = inner_decl;
from_type = 1;
continue;
}
}
if (field_decl == NULL_TREE)
{
parse_error_context
(qual_wfl, "No variable %qs defined in type %qs",
IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)),
GET_TYPE_NAME (type));
return 1;
}
if (field_decl == error_mark_node)
return 1;
if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
field_decl_type = TREE_TYPE (TREE_TYPE (field_decl));
else
field_decl_type = TREE_TYPE (field_decl);
if (!JPRIMITIVE_TYPE_P (field_decl_type)
&& !CLASS_LOADED_P (field_decl_type)
&& !TYPE_ARRAY_P (field_decl_type))
resolve_and_layout (field_decl_type, NULL_TREE);
if (not_accessible_p (current_class, field_decl,
*type_found, from_super))
return not_accessible_field_error (qual_wfl,field_decl);
check_deprecation (qual_wfl, field_decl);
is_static = FIELD_STATIC (field_decl);
if (!from_super && from_type
&& !TYPE_INTERFACE_P (type)
&& !is_static
&& (current_function_decl
&& METHOD_STATIC (current_function_decl)))
{
static_ref_err (qual_wfl, EXPR_WFL_NODE (qual_wfl), type);
return 1;
}
from_cast = from_super = 0;
if (!is_static && from_type)
decl = current_this;
if (!is_static)
{
decl = maybe_access_field (decl, *where_found, *type_found);
if (decl == error_mark_node)
return 1;
}
*where_found = decl;
*type_found = type;
if (from_qualified_this)
{
field_decl = build_outer_field_access (qual_wfl, field_decl);
from_qualified_this = 0;
}
decl = field_decl;
}
from_type = 0;
type = QUAL_DECL_TYPE (decl);
if (TREE_CHAIN (q)
&& TREE_CODE (TREE_PURPOSE (TREE_CHAIN (q))) == NEW_CLASS_EXPR
&& !JREFERENCE_TYPE_P (type))
{
parse_error_context (qual_wfl, "Attempt to reference field %<new%> in a %qs",
lang_printable_name (type, 0));
return 1;
}
}
if (!q)
break;
}
*found_decl = decl;
return 0;
}
static int
not_accessible_p (tree reference, tree member, tree where, int from_super)
{
int access_flag = get_access_flags_from_decl (member);
bool is_static = false;
if (TREE_CODE (member) == FIELD_DECL ||
TREE_CODE (member) == VAR_DECL)
is_static = FIELD_STATIC (member);
else
is_static = METHOD_STATIC (member);
if (access_flag & ACC_PUBLIC)
return 0;
if (access_flag & ACC_PROTECTED)
{
if (class_in_current_package (DECL_CONTEXT (member)))
return 0;
if (from_super)
return 0;
if (where && !is_static)
{
while (reference)
{
if (inherits_from_p (where, reference))
return 0;
if (INNER_CLASS_TYPE_P (reference))
reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
else
break;
}
return 1;
}
while (reference)
{
if (inherits_from_p (reference, DECL_CONTEXT (member)))
return 0;
if (INNER_CLASS_TYPE_P (reference))
reference = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (reference)));
else
break;
}
return 1;
}
if (access_flag & ACC_PRIVATE)
{
if (reference == DECL_CONTEXT (member) ||
common_enclosing_context_p (DECL_CONTEXT (member), reference))
return 0;
return 1;
}
return !class_in_current_package (DECL_CONTEXT (member));
}
static void
check_deprecation (tree wfl, tree decl)
{
const char *file;
tree elt;
if (! warn_deprecated)
return;
if (TYPE_ARRAY_P (TREE_TYPE (decl)))
{
elt = TREE_TYPE (decl);
while (TYPE_ARRAY_P (elt))
elt = TYPE_ARRAY_ELEMENT (elt);
decl = TYPE_NAME (TREE_TYPE (elt));
}
file = DECL_SOURCE_FILE (decl);
if (DECL_DEPRECATED (decl)
&& !IS_A_COMMAND_LINE_FILENAME_P (get_identifier (file)))
{
const char *the;
switch (TREE_CODE (decl))
{
case FUNCTION_DECL:
the = "method";
break;
case FIELD_DECL:
case VAR_DECL:
the = "field";
break;
case TYPE_DECL:
parse_warning_context (wfl, "The class %qs has been deprecated",
IDENTIFIER_POINTER (DECL_NAME (decl)));
return;
default:
abort ();
}
if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl))))
parse_warning_context
(wfl, "The %s %qs in class %qs has been deprecated",
the, lang_printable_name (decl, 0),
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))));
}
}
static GTY(()) tree cicp_cache;
static int
class_in_current_package (tree class)
{
int qualified_flag;
tree left;
if (cicp_cache == class)
return 1;
qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
return 0;
if (!ctxp->package && !qualified_flag)
return 1;
split_qualified_name (&left, NULL, DECL_NAME (TYPE_NAME (class)));
if (ctxp->package == left)
{
cicp_cache = class;
return 1;
}
return 0;
}
static tree
maybe_access_field (tree decl, tree where, tree type)
{
if (TREE_CODE (decl) == FIELD_DECL && decl != current_this
&& !FIELD_STATIC (decl))
decl = build_field_ref (where ? where : current_this,
(type ? type : DECL_CONTEXT (decl)),
DECL_NAME (decl));
return decl;
}
static tree
patch_method_invocation (tree patch, tree primary, tree where, int from_super,
int *is_static, tree *ret_decl)
{
tree wfl = TREE_OPERAND (patch, 0);
tree args = TREE_OPERAND (patch, 1);
tree name = EXPR_WFL_NODE (wfl);
tree list;
int is_static_flag = 0;
int is_super_init = 0;
tree this_arg = NULL_TREE;
int is_array_clone_call = 0;
TREE_TYPE (patch) = error_mark_node;
java_parser_context_save_global ();
if (QUALIFIED_P (name) && !CALL_CONSTRUCTOR_P (patch))
{
tree identifier, identifier_wfl, type, resolved;
identifier_wfl = cut_identifier_in_qualified (wfl);
identifier = EXPR_WFL_NODE (identifier_wfl);
qualify_ambiguous_name (wfl);
resolved = resolve_field_access (wfl, NULL, NULL);
if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved)
&& FIELD_FINAL (resolved)
&& !inherits_from_p (DECL_CONTEXT (resolved), current_class)
&& !flag_emit_class_files && !flag_emit_xref)
resolved = build_class_init (DECL_CONTEXT (resolved), resolved);
if (resolved == error_mark_node)
PATCH_METHOD_RETURN_ERROR ();
type = GET_SKIP_TYPE (resolved);
resolve_and_layout (type, NULL_TREE);
if (JPRIMITIVE_TYPE_P (type))
{
parse_error_context
(identifier_wfl,
"Can't invoke a method on primitive type %qs",
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
PATCH_METHOD_RETURN_ERROR ();
}
list = lookup_method_invoke (0, identifier_wfl, type, identifier, args);
args = nreverse (args);
if (TREE_CODE (resolved) == TYPE_DECL)
{
if (CLASS_INTERFACE (resolved))
{
parse_error_context
(identifier_wfl,
"Can't make static reference to method %qs in interface %qs",
IDENTIFIER_POINTER (identifier),
IDENTIFIER_POINTER (name));
PATCH_METHOD_RETURN_ERROR ();
}
if (list && !METHOD_STATIC (list))
{
char *fct_name = xstrdup (lang_printable_name (list, 2));
parse_error_context
(identifier_wfl,
"Can't make static reference to method %<%s %s%> in class %qs",
lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
free (fct_name);
PATCH_METHOD_RETURN_ERROR ();
}
}
else
this_arg = primary = resolved;
if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
is_array_clone_call = 1;
wfl = identifier_wfl;
}
else
{
tree class_to_search = NULL_TREE;
int lc;
if (CALL_CONSTRUCTOR_P (patch))
{
if (TREE_CODE (patch) == NEW_CLASS_EXPR)
class_to_search = EXPR_WFL_NODE (wfl);
else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
this_identifier_node)
class_to_search = NULL_TREE;
else if (EXPR_WFL_NODE (TREE_OPERAND (patch, 0)) ==
super_identifier_node)
{
is_super_init = 1;
if (CLASSTYPE_SUPER (current_class))
class_to_search =
DECL_NAME (TYPE_NAME (CLASSTYPE_SUPER (current_class)));
else
{
parse_error_context (wfl, "Can't invoke super constructor on java.lang.Object");
PATCH_METHOD_RETURN_ERROR ();
}
}
if (class_to_search)
{
class_to_search = resolve_and_layout (class_to_search, wfl);
if (!class_to_search)
{
parse_error_context
(wfl, "Class %qs not found in type declaration",
IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
PATCH_METHOD_RETURN_ERROR ();
}
if (CLASS_ABSTRACT (class_to_search)
&& TREE_CODE (patch) == NEW_CLASS_EXPR)
{
parse_error_context
(wfl, "Class %qs is an abstract class. It can't be instantiated",
IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)));
PATCH_METHOD_RETURN_ERROR ();
}
class_to_search = TREE_TYPE (class_to_search);
}
else
class_to_search = current_class;
lc = 1;
}
else
{
if (where != NULL_TREE)
class_to_search = where;
else if (QUALIFIED_P (name))
class_to_search = current_class;
else
{
class_to_search = current_class;
for (;;)
{
if (has_method (class_to_search, name))
break;
if (! INNER_CLASS_TYPE_P (class_to_search))
{
parse_error_context (wfl,
"No method named %qs in scope",
IDENTIFIER_POINTER (name));
PATCH_METHOD_RETURN_ERROR ();
}
class_to_search
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
}
}
lc = 0;
}
resolve_and_layout (class_to_search, NULL_TREE);
list = lookup_method_invoke (lc, wfl, class_to_search, name, args);
if (!list)
PATCH_METHOD_RETURN_ERROR ();
if (TYPE_ARRAY_P (class_to_search)
&& DECL_NAME (list) == get_identifier ("clone"))
is_array_clone_call = 1;
if (check_for_static_method_reference (wfl, patch, list,
class_to_search, primary))
PATCH_METHOD_RETURN_ERROR ();
if (lc && (INNER_CLASS_TYPE_P (class_to_search)
&& !CLASS_STATIC (TYPE_NAME (class_to_search)))
&& INNER_ENCLOSING_SCOPE_CHECK (class_to_search)
&& !DECL_INIT_P (current_function_decl))
{
parse_error_context
(wfl, "No enclosing instance for inner class %qs is in scope%s",
lang_printable_name (class_to_search, 0),
(!current_this ? "" :
"; an explicit one must be provided when creating this inner class"));
PATCH_METHOD_RETURN_ERROR ();
}
args = nreverse (args);
if (TREE_CODE (patch) != NEW_CLASS_EXPR)
{
this_arg = primary ? primary : current_this;
if (!primary &&
maybe_use_access_method (is_super_init, &list, &this_arg))
{
args = tree_cons (NULL_TREE, this_arg, args);
this_arg = NULL_TREE;
}
}
}
if (!list)
PATCH_METHOD_RETURN_ERROR ();
if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
(primary ? TREE_TYPE (TREE_TYPE (primary)) :
NULL_TREE), from_super)
&& !is_array_clone_call)
{
const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list));
const char *const access =
accessibility_string (get_access_flags_from_decl (list));
const char *const klass =
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list))));
const char *const refklass =
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
const char *const what = (DECL_CONSTRUCTOR_P (list)
? "constructor" : "method");
parse_error_context (wfl,
"Can't access %s %s %<%s.%s%> from %qs",
access, what, klass, fct_name, refklass);
PATCH_METHOD_RETURN_ERROR ();
}
if (TREE_CODE (patch) == NEW_CLASS_EXPR)
check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list)));
check_deprecation (wfl, list);
if (TREE_CODE (patch) == NEW_CLASS_EXPR
&& PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
{
args = build_alias_initializer_parameter_list
(AIPL_FUNCTION_CTOR_INVOCATION, DECL_CONTEXT (list), args, NULL);
if (primary || current_this)
{
tree extra_arg;
tree this_type = (current_this ?
TREE_TYPE (TREE_TYPE (current_this)) : NULL_TREE);
tree mec = DECL_CONTEXT (TYPE_NAME (DECL_CONTEXT (list)));
if (primary)
extra_arg = primary;
else if (current_this && PURE_INNER_CLASS_TYPE_P (this_type)
&& this_type != TREE_TYPE (mec))
{
extra_arg = build_access_to_thisn (current_class,
TREE_TYPE (mec), 0);
extra_arg = java_complete_tree (extra_arg);
}
else
extra_arg = current_this;
args = tree_cons (NULL_TREE, extra_arg, args);
}
else
args = tree_cons (NULL_TREE, integer_zero_node, args);
}
if ((is_super_init ||
(TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node))
&& PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list)))
{
tree dest = TYPE_NAME (DECL_CONTEXT (list));
tree extra_arg =
build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0);
extra_arg = java_complete_tree (extra_arg);
args = tree_cons (NULL_TREE, extra_arg, args);
}
is_static_flag = METHOD_STATIC (list);
if (! is_static_flag && this_arg != NULL_TREE)
args = tree_cons (NULL_TREE, this_arg, args);
if (ctxp->explicit_constructor_p
&& !is_static_flag
&& (!primary || primary == current_this)
&& (TREE_CODE (patch) != NEW_CLASS_EXPR))
{
parse_error_context (wfl, "Can't reference %<this%> before the superclass constructor has been called");
PATCH_METHOD_RETURN_ERROR ();
}
java_parser_context_restore_global ();
if (is_static)
*is_static = is_static_flag;
if (ret_decl)
*ret_decl = list;
patch = patch_invoke (patch, list, args);
if (is_super_init && CLASS_HAS_FINIT_P (current_class))
{
tree finit_parms, finit_call;
finit_parms = build_alias_initializer_parameter_list
(AIPL_FUNCTION_FINIT_INVOCATION, current_class, NULL_TREE, NULL);
finit_call =
build_method_invocation (build_wfl_node (finit_identifier_node),
finit_parms);
CAN_COMPLETE_NORMALLY (patch) = 1;
patch = build2 (COMPOUND_EXPR, void_type_node, patch,
java_complete_tree (finit_call));
}
return patch;
}
static int
check_for_static_method_reference (tree wfl, tree node, tree method,
tree where, tree primary)
{
if (METHOD_STATIC (current_function_decl)
&& !METHOD_STATIC (method) && !primary && !CALL_CONSTRUCTOR_P (node))
{
char *fct_name = xstrdup (lang_printable_name (method, 0));
parse_error_context
(wfl, "Can't make static reference to method %<%s %s%> in class %qs",
lang_printable_name (TREE_TYPE (TREE_TYPE (method)), 0), fct_name,
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (where))));
free (fct_name);
return 1;
}
return 0;
}
static int
maybe_use_access_method (int is_super_init, tree *mdecl, tree *this_arg)
{
tree ctx;
tree md = *mdecl, ta = *this_arg;
int to_return = 0;
int non_static_context = !METHOD_STATIC (md);
if (is_super_init
|| DECL_CONTEXT (md) == current_class
|| !PURE_INNER_CLASS_TYPE_P (current_class)
|| DECL_FINIT_P (md)
|| DECL_INSTINIT_P (md))
return 0;
if (non_static_context && DECL_CONTEXT (md) != object_type_node)
{
ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
if (inherits_from_p (ctx, DECL_CONTEXT (md)))
{
ta = build_current_thisn (current_class);
ta = build_wfl_node (ta);
}
else
{
tree type = ctx;
while (type)
{
maybe_build_thisn_access_method (type);
if (inherits_from_p (type, DECL_CONTEXT (md)))
{
ta = build_access_to_thisn (ctx, type, 0);
break;
}
type = (DECL_CONTEXT (TYPE_NAME (type)) ?
TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))) : NULL_TREE);
}
}
ta = java_complete_tree (ta);
}
if (METHOD_PRIVATE (md) && flag_emit_class_files)
{
md = build_outer_method_access_method (md);
to_return = 1;
}
*mdecl = md;
*this_arg = ta;
return (non_static_context && to_return);
}
static tree
patch_invoke (tree patch, tree method, tree args)
{
tree dtable, func;
tree original_call, t, ta;
tree check = NULL_TREE;
t = TYPE_ARG_TYPES (TREE_TYPE (method));
if (TREE_CODE (patch) == NEW_CLASS_EXPR)
t = TREE_CHAIN (t);
for (ta = args; t != end_params_node && ta;
t = TREE_CHAIN (t), ta = TREE_CHAIN (ta))
if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
t = TREE_TYPE (TREE_TYPE (method));
if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
resolve_and_layout (TREE_TYPE (t), NULL);
if (flag_emit_class_files || flag_emit_xref)
func = method;
else
{
switch (invocation_mode (method, CALL_USING_SUPER (patch)))
{
case INVOKE_VIRTUAL:
dtable = invoke_build_dtable (0, args);
func = build_invokevirtual (dtable, method);
break;
case INVOKE_NONVIRTUAL:
if (TREE_VALUE (args) != current_this)
{
tree save_arg = save_expr (TREE_VALUE (args));
TREE_VALUE (args) = save_arg;
check = java_check_reference (save_arg, 1);
}
case INVOKE_SUPER:
case INVOKE_STATIC:
{
tree signature = build_java_signature (TREE_TYPE (method));
func = build_known_method_ref (method, TREE_TYPE (method),
DECL_CONTEXT (method),
signature, args);
}
break;
case INVOKE_INTERFACE:
dtable = invoke_build_dtable (1, args);
func = build_invokeinterface (dtable, method);
break;
default:
abort ();
}
func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (method)), func);
}
TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method));
TREE_OPERAND (patch, 0) = func;
TREE_OPERAND (patch, 1) = args;
patch = check_for_builtin (method, patch);
original_call = patch;
if (TREE_CODE (original_call) == NEW_CLASS_EXPR)
{
tree class = DECL_CONTEXT (method);
tree c1, saved_new, new;
tree alloc_node;
if (flag_emit_class_files || flag_emit_xref)
{
TREE_TYPE (patch) = build_pointer_type (class);
return patch;
}
if (!TYPE_SIZE (class))
safe_layout_class (class);
alloc_node =
(class_has_finalize_method (class) ? alloc_object_node
: alloc_no_finalizer_node);
new = build3 (CALL_EXPR, promote_type (class),
build_address_of (alloc_node),
build_tree_list (NULL_TREE, build_class_ref (class)),
NULL_TREE);
saved_new = save_expr (new);
c1 = build_tree_list (NULL_TREE, saved_new);
TREE_CHAIN (c1) = TREE_OPERAND (original_call, 1);
TREE_OPERAND (original_call, 1) = c1;
TREE_SET_CODE (original_call, CALL_EXPR);
patch = build2 (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new);
}
if (check != NULL_TREE)
{
patch = build2 (COMPOUND_EXPR, TREE_TYPE (patch), check,
force_evaluation_order (patch));
TREE_SIDE_EFFECTS (patch) = 1;
}
if (STATIC_CLASS_INIT_OPT_P ()
&& current_function_decl && METHOD_STATIC (method))
{
tree list;
tree fndecl = current_function_decl;
tree save = force_evaluation_order (patch);
tree type = TREE_TYPE (patch);
patch = build2 (COMPOUND_EXPR, type, save, build_java_empty_stmt ());
list = tree_cons (method, patch,
DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl));
DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list;
patch = build2 (COMPOUND_EXPR, type, patch, save);
}
return patch;
}
static int
invocation_mode (tree method, int super)
{
int access = get_access_flags_from_decl (method);
if (super)
return INVOKE_SUPER;
if (access & ACC_STATIC)
return INVOKE_STATIC;
if (DECL_CONSTRUCTOR_P (method))
return INVOKE_STATIC;
if (access & ACC_PRIVATE)
return INVOKE_NONVIRTUAL;
if (! flag_indirect_dispatch
|| DECL_CONTEXT (method) == object_type_node)
{
if (access & ACC_FINAL)
return INVOKE_NONVIRTUAL;
if (CLASS_FINAL (TYPE_NAME (DECL_CONTEXT (method))))
return INVOKE_NONVIRTUAL;
}
if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (method))))
return INVOKE_INTERFACE;
return INVOKE_VIRTUAL;
}
static tree
lookup_method_invoke (int lc, tree cl, tree class, tree name, tree arg_list)
{
tree atl = end_params_node;
tree method, signature, list, node;
const char *candidates;
char *dup;
for (node = arg_list; node; node = TREE_CHAIN (node))
{
tree current_arg = TREE_TYPE (TREE_VALUE (node));
if (!JPRIMITIVE_TYPE_P (current_arg))
resolve_and_layout (current_arg, NULL_TREE);
if (TREE_CODE (current_arg) == RECORD_TYPE)
current_arg = promote_type (current_arg);
atl = tree_cons (NULL_TREE, current_arg, atl);
}
if (lc && ANONYMOUS_CLASS_P (class))
{
tree mdecl = craft_constructor (TYPE_NAME (class), atl);
layout_class_method (class, CLASSTYPE_SUPER (class), mdecl, NULL_TREE);
}
list = find_applicable_accessible_methods_list (lc, class, name, atl);
list = find_most_specific_methods_list (list);
if (list && !TREE_CHAIN (list))
return TREE_VALUE (list);
candidates = NULL;
if (list)
{
tree current;
obstack_grow (&temporary_obstack, ". Candidates are:\n", 18);
for (current = list; current; current = TREE_CHAIN (current))
{
tree cm = TREE_VALUE (current);
char string [4096];
if (!cm || not_accessible_p (class, cm, NULL_TREE, 0))
continue;
sprintf
(string, " '%s' in '%s'%s",
get_printable_method_name (cm),
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (cm)))),
(TREE_CHAIN (current) ? "\n" : ""));
obstack_grow (&temporary_obstack, string, strlen (string));
}
obstack_1grow (&temporary_obstack, '\0');
candidates = obstack_finish (&temporary_obstack);
}
method = make_node (FUNCTION_TYPE);
TYPE_ARG_TYPES (method) = atl;
signature = build_java_argument_signature (method);
dup = xstrdup (lang_printable_name (class, 0));
parse_error_context (cl, "Can't find %s %<%s(%s)%> in type %qs%s",
(lc ? "constructor" : "method"),
(lc ? dup : IDENTIFIER_POINTER (name)),
IDENTIFIER_POINTER (signature), dup,
(candidates ? candidates : ""));
free (dup);
return NULL_TREE;
}
static tree
find_applicable_accessible_methods_list (int lc, tree class, tree name,
tree arglist)
{
static htab_t searched_classes;
static int search_not_done = 0;
tree list = NULL_TREE, all_list = NULL_TREE;
tree base_binfo;
int i;
if (searched_classes)
{
if (htab_find (searched_classes, class) != NULL)
return NULL;
}
else
{
searched_classes = htab_create (10, htab_hash_pointer,
htab_eq_pointer, NULL);
}
search_not_done++;
*htab_find_slot (searched_classes, class, INSERT) = class;
if (!CLASS_LOADED_P (class))
{
load_class (class, 1);
safe_layout_class (class);
}
if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL
&& CLASS_INTERFACE (TYPE_NAME (class)))
{
search_applicable_methods_list (lc, TYPE_METHODS (class),
name, arglist, &list, &all_list);
for (i = 1; BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
{
tree t = BINFO_TYPE (base_binfo);
tree rlist;
rlist = find_applicable_accessible_methods_list (lc, t, name,
arglist);
list = chainon (rlist, list);
}
}
else
{
search_applicable_methods_list (lc, TYPE_METHODS (class),
name, arglist, &list, &all_list);
if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name))
{
lc = 1;
if (!list)
abort ();
}
if (!lc)
{
for (i = 1;
BINFO_BASE_ITERATE (TYPE_BINFO (class), i, base_binfo); i++)
{
tree t = BINFO_TYPE (base_binfo);
if (t != object_type_node)
{
tree rlist
= find_applicable_accessible_methods_list (lc, t,
name, arglist);
list = chainon (rlist, list);
}
}
}
if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
{
tree rlist;
class = CLASSTYPE_SUPER (class);
rlist = find_applicable_accessible_methods_list (lc, class,
name, arglist);
list = chainon (rlist, list);
}
}
search_not_done--;
if (!search_not_done)
{
if (!lc
&& TYPE_METHODS (object_type_node)
&& htab_find (searched_classes, object_type_node) == NULL)
{
search_applicable_methods_list (lc,
TYPE_METHODS (object_type_node),
name, arglist, &list, &all_list);
}
htab_delete (searched_classes);
searched_classes = NULL;
}
return (!list ? all_list : list);
}
static void
search_applicable_methods_list (int lc, tree method, tree name, tree arglist,
tree *list, tree *all_list)
{
for (; method; method = TREE_CHAIN (method))
{
if (lc && !DECL_CONSTRUCTOR_P (method))
continue;
else if (!lc && (DECL_CONSTRUCTOR_P (method)
|| (DECL_NAME (method) != name)))
continue;
if (argument_types_convertible (method, arglist))
{
if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
method, NULL_TREE, 0))
*list = tree_cons (NULL_TREE, method, *list);
else
*all_list = tree_cons (NULL_TREE, method, *list);
}
}
}
static tree
find_most_specific_methods_list (tree list)
{
int max = 0;
int abstract, candidates;
tree current, new_list = NULL_TREE;
for (current = list; current; current = TREE_CHAIN (current))
{
tree method;
DECL_SPECIFIC_COUNT (TREE_VALUE (current)) = 0;
for (method = list; method; method = TREE_CHAIN (method))
{
tree method_v, current_v;
if (method == current)
continue;
method_v = TREE_VALUE (method);
current_v = TREE_VALUE (current);
if (argument_types_convertible (method_v, current_v))
{
if (valid_method_invocation_conversion_p
(DECL_CONTEXT (method_v), DECL_CONTEXT (current_v))
|| (INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v))
&& enclosing_context_p (DECL_CONTEXT (method_v),
DECL_CONTEXT (current_v))))
{
int v = (DECL_SPECIFIC_COUNT (current_v) +=
(INNER_CLASS_TYPE_P (DECL_CONTEXT (current_v)) ? 2 : 1));
max = (v > max ? v : max);
}
}
}
}
for (current = list, abstract = -1, candidates = -1;
current; current = TREE_CHAIN (current))
if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
{
new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0);
candidates++;
}
if (candidates > 0 && candidates == abstract)
{
new_list = nreverse (new_list);
TREE_CHAIN (new_list) = NULL_TREE;
return new_list;
}
if (candidates > 0 && (candidates == abstract+1))
{
for (current = new_list; current; current = TREE_CHAIN (current))
if (!METHOD_ABSTRACT (TREE_VALUE (current)))
{
TREE_CHAIN (current) = NULL_TREE;
new_list = current;
}
}
while (!new_list && max)
{
while (--max > 0)
{
if (DECL_SPECIFIC_COUNT (TREE_VALUE (current)) == max)
new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list);
}
}
return new_list;
}
static GTY(()) tree m2_arg_value;
static GTY(()) tree m2_arg_cache;
static int
argument_types_convertible (tree m1, tree m2_or_arglist)
{
tree m1_arg, m2_arg;
SKIP_THIS_AND_ARTIFICIAL_PARMS (m1_arg, m1)
if (m2_arg_value == m2_or_arglist)
m2_arg = m2_arg_cache;
else
{
if (m2_or_arglist && TREE_CODE (m2_or_arglist) == FUNCTION_DECL)
{
m2_arg = TYPE_ARG_TYPES (TREE_TYPE (m2_or_arglist));
if (!METHOD_STATIC (m2_or_arglist))
m2_arg = TREE_CHAIN (m2_arg);
}
else
m2_arg = m2_or_arglist;
m2_arg_value = m2_or_arglist;
m2_arg_cache = m2_arg;
}
while (m1_arg != end_params_node && m2_arg != end_params_node)
{
resolve_and_layout (TREE_VALUE (m1_arg), NULL_TREE);
if (!valid_method_invocation_conversion_p (TREE_VALUE (m1_arg),
TREE_VALUE (m2_arg)))
break;
m1_arg = TREE_CHAIN (m1_arg);
m2_arg = TREE_CHAIN (m2_arg);
}
return m1_arg == end_params_node && m2_arg == end_params_node;
}
static void
qualify_ambiguous_name (tree id)
{
tree name, decl;
tree qual = EXPR_WFL_QUALIFICATION (id);
tree qual_wfl = QUAL_WFL (qual);
if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
return;
name = EXPR_WFL_NODE (qual_wfl);
if (!name || TREE_CODE (name) != IDENTIFIER_NODE ||
name == this_identifier_node ||
name == super_identifier_node)
return;
if ((decl = IDENTIFIER_LOCAL_VALUE (name)) ||
(decl = lookup_field_wrapper (current_class, name)))
{
QUAL_RESOLUTION (qual) = decl;
return;
}
if ((decl = resolve_and_layout (name, NULL_TREE)))
{
RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
QUAL_RESOLUTION (qual) = decl;
}
else
RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
for (qual = TREE_CHAIN (qual); qual;
qual_wfl = QUAL_WFL (qual), qual = TREE_CHAIN (qual))
{
if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
RESOLVE_PACKAGE_NAME_P (QUAL_WFL (qual)) = 1;
}
if (RESOLVE_TYPE_NAME_P (qual_wfl))
RESOLVE_TYPE_NAME_P (id) = 1;
else if (RESOLVE_PACKAGE_NAME_P (qual_wfl))
RESOLVE_PACKAGE_NAME_P (id) = 1;
}
static tree
java_complete_tree (tree node)
{
node = java_complete_lhs (node);
if (JDECL_P (node) && CLASS_FINAL_VARIABLE_P (node)
&& DECL_INITIAL (node) != NULL_TREE
&& !flag_emit_xref)
{
tree value = fold_constant_for_init (node, node);
if (value != NULL_TREE)
return value;
}
return node;
}
static tree
java_stabilize_reference (tree node)
{
if (TREE_CODE (node) == COMPOUND_EXPR)
{
tree op0 = TREE_OPERAND (node, 0);
tree op1 = TREE_OPERAND (node, 1);
TREE_OPERAND (node, 0) = save_expr (op0);
TREE_OPERAND (node, 1) = java_stabilize_reference (op1);
return node;
}
return stabilize_reference (node);
}
static tree
java_complete_lhs (tree node)
{
tree nn, cn, wfl_op1, wfl_op2, wfl_op3;
int flag;
if (TREE_TYPE (node) && TREE_CODE (node) != CONVERT_EXPR)
return node;
switch (TREE_CODE (node))
{
case BLOCK:
for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
{
DECL_CONTEXT (cn) = current_function_decl;
IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = cn;
}
if (BLOCK_EXPR_BODY (node) == NULL_TREE)
CAN_COMPLETE_NORMALLY (node) = 1;
else
{
tree stmt = BLOCK_EXPR_BODY (node);
tree *ptr;
int error_seen = 0;
if (TREE_CODE (stmt) == COMPOUND_EXPR)
{
for (;;)
{
tree left = TREE_OPERAND (stmt, 0);
if (TREE_CODE (left) != COMPOUND_EXPR)
break;
TREE_OPERAND (stmt, 0) = TREE_OPERAND (left, 1);
TREE_OPERAND (left, 1) = stmt;
stmt = left;
}
BLOCK_EXPR_BODY (node) = stmt;
}
ptr = &BLOCK_EXPR_BODY (node);
while (TREE_CODE (*ptr) == COMPOUND_EXPR
&& !IS_EMPTY_STMT (TREE_OPERAND (*ptr, 1)))
{
tree cur = java_complete_tree (TREE_OPERAND (*ptr, 0));
tree *next = &TREE_OPERAND (*ptr, 1);
TREE_OPERAND (*ptr, 0) = cur;
if (IS_EMPTY_STMT (cur))
{
*ptr = *next;
continue;
}
if (TREE_CODE (cur) == ERROR_MARK)
error_seen++;
else if (! CAN_COMPLETE_NORMALLY (cur))
{
wfl_op2 = *next;
for (;;)
{
if (TREE_CODE (wfl_op2) == BLOCK)
wfl_op2 = BLOCK_EXPR_BODY (wfl_op2);
else if (TREE_CODE (wfl_op2) == COMPOUND_EXPR)
wfl_op2 = TREE_OPERAND (wfl_op2, 0);
else
break;
}
if (TREE_CODE (wfl_op2) != CASE_EXPR
&& TREE_CODE (wfl_op2) != DEFAULT_EXPR)
unreachable_stmt_error (*ptr);
}
if (TREE_TYPE (*ptr) == NULL_TREE)
TREE_TYPE (*ptr) = void_type_node;
ptr = next;
}
*ptr = java_complete_tree (*ptr);
if (TREE_CODE (*ptr) == ERROR_MARK || error_seen > 0)
return error_mark_node;
CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (*ptr);
}
for (cn = BLOCK_EXPR_DECLS (node); cn; cn = TREE_CHAIN (cn))
IDENTIFIER_LOCAL_VALUE (DECL_NAME (cn)) = NULL_TREE;
TREE_TYPE (node) = void_type_node;
break;
case THROW_EXPR:
wfl_op1 = TREE_OPERAND (node, 0);
COMPLETE_CHECK_OP_0 (node);
CAN_COMPLETE_NORMALLY (node) = 0;
return patch_throw_statement (node, wfl_op1);
case SYNCHRONIZED_EXPR:
wfl_op1 = TREE_OPERAND (node, 0);
return patch_synchronized_statement (node, wfl_op1);
case TRY_EXPR:
return patch_try_statement (node);
case TRY_FINALLY_EXPR:
COMPLETE_CHECK_OP_0 (node);
COMPLETE_CHECK_OP_1 (node);
if (IS_EMPTY_STMT (TREE_OPERAND (node, 0)))
return TREE_OPERAND (node, 1);
if (IS_EMPTY_STMT (TREE_OPERAND (node, 1)))
return TREE_OPERAND (node, 0);
CAN_COMPLETE_NORMALLY (node)
= (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
&& CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0));
return node;
case LABELED_BLOCK_EXPR:
PUSH_LABELED_BLOCK (node);
if (LABELED_BLOCK_BODY (node))
COMPLETE_CHECK_OP_1 (node);
TREE_TYPE (node) = void_type_node;
POP_LABELED_BLOCK ();
if (IS_EMPTY_STMT (LABELED_BLOCK_BODY (node)))
{
LABELED_BLOCK_BODY (node) = NULL_TREE;
CAN_COMPLETE_NORMALLY (node) = 1;
}
else if (CAN_COMPLETE_NORMALLY (LABELED_BLOCK_BODY (node)))
CAN_COMPLETE_NORMALLY (node) = 1;
return node;
case EXIT_BLOCK_EXPR:
return patch_bc_statement (node);
case CASE_EXPR:
cn = java_complete_tree (TREE_OPERAND (node, 0));
if (cn == error_mark_node)
return cn;
cn = fold (cn);
if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
&& JDECL_P (TREE_OPERAND (cn, 1))
&& FIELD_FINAL (TREE_OPERAND (cn, 1))
&& DECL_INITIAL (TREE_OPERAND (cn, 1)))
{
cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)),
TREE_OPERAND (cn, 1));
}
else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn)
&& DECL_INITIAL (cn))
cn = fold_constant_for_init (DECL_INITIAL (cn), cn);
if (!TREE_CONSTANT (cn) && !flag_emit_xref)
{
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
parse_error_context (node, "Constant expression required");
return error_mark_node;
}
nn = ctxp->current_loop;
if (!try_builtin_assignconv (NULL_TREE,
TREE_TYPE (TREE_OPERAND (nn, 0)), cn))
{
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
parse_error_context
(wfl_operator,
"Incompatible type for case. Can't convert %qs to %<int%>",
lang_printable_name (TREE_TYPE (cn), 0));
return error_mark_node;
}
cn = fold (convert (int_type_node, cn));
TREE_CONSTANT_OVERFLOW (cn) = 0;
CAN_COMPLETE_NORMALLY (cn) = 1;
case_label_list = tree_cons (node, cn, case_label_list);
if (TREE_CODE (cn) == VAR_DECL)
cn = DECL_INITIAL (cn);
TREE_OPERAND (node, 0) = cn;
TREE_TYPE (node) = void_type_node;
CAN_COMPLETE_NORMALLY (node) = 1;
TREE_SIDE_EFFECTS (node) = 1;
break;
case DEFAULT_EXPR:
nn = ctxp->current_loop;
if (SWITCH_HAS_DEFAULT (nn))
{
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (wfl_operator, EXPR_LOCATION (node));
#else
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
#endif
parse_error_context (wfl_operator,
"Duplicate case label: %<default%>");
return error_mark_node;
}
else
SWITCH_HAS_DEFAULT (nn) = 1;
TREE_TYPE (node) = void_type_node;
TREE_SIDE_EFFECTS (node) = 1;
CAN_COMPLETE_NORMALLY (node) = 1;
break;
case SWITCH_EXPR:
case LOOP_EXPR:
PUSH_LOOP (node);
nn = patch_loop_statement (node);
if (TREE_CODE (node) == LOOP_EXPR)
TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
else
node = patch_switch_statement (node);
if (node == error_mark_node || TREE_OPERAND (node, 0) == error_mark_node)
nn = error_mark_node;
else
{
TREE_TYPE (nn) = TREE_TYPE (node) = void_type_node;
if (nn != node)
{
if (CAN_COMPLETE_NORMALLY (node))
CAN_COMPLETE_NORMALLY (nn) = 1;
POP_LABELED_BLOCK ();
}
}
POP_LOOP ();
return nn;
case EXIT_EXPR:
TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
return patch_exit_expr (node);
case COND_EXPR:
TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
if (TREE_OPERAND (node, 0) == error_mark_node)
return error_mark_node;
TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
if (TREE_OPERAND (node, 1) == error_mark_node)
return error_mark_node;
{
tree patched = patch_string (TREE_OPERAND (node, 1));
if (patched)
TREE_OPERAND (node, 1) = patched;
}
TREE_OPERAND (node, 2) = java_complete_tree (TREE_OPERAND (node, 2));
if (TREE_OPERAND (node, 2) == error_mark_node)
return error_mark_node;
return patch_if_else_statement (node);
break;
case CONDITIONAL_EXPR:
wfl_op1 = TREE_OPERAND (node, 0);
COMPLETE_CHECK_OP_0 (node);
wfl_op2 = TREE_OPERAND (node, 1);
COMPLETE_CHECK_OP_1 (node);
wfl_op3 = TREE_OPERAND (node, 2);
COMPLETE_CHECK_OP_2 (node);
return patch_conditional_expr (node, wfl_op1, wfl_op2);
case COMPOUND_EXPR:
wfl_op2 = TREE_OPERAND (node, 1);
TREE_OPERAND (node, 0) = nn =
java_complete_tree (TREE_OPERAND (node, 0));
if (IS_EMPTY_STMT (wfl_op2))
CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (nn);
else
{
if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK)
{
nn = wfl_op2;
if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION)
nn = EXPR_WFL_NODE (nn);
if (nn != NULL_TREE && TREE_CODE (nn) != EXIT_EXPR)
{
SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
if (SUPPRESS_UNREACHABLE_ERROR (nn))
{
parse_warning_context (wfl_operator,
"Unreachable statement");
}
else
parse_error_context (wfl_operator,
"Unreachable statement");
}
}
TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
if (TREE_OPERAND (node, 1) == error_mark_node)
return error_mark_node;
CAN_COMPLETE_NORMALLY (node)
= (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0))
&& CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)));
}
TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1));
break;
case RETURN_EXPR:
return patch_return (node);
case EXPR_WITH_FILE_LOCATION:
if (!EXPR_WFL_NODE (node)
|| TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
{
tree wfl = node;
node = resolve_expression_name (node, NULL);
if (node == error_mark_node)
return node;
if (flag_emit_xref && TREE_CODE (node) != CALL_EXPR)
{
EXPR_WFL_NODE (wfl) = TREE_OPERAND (node, 1);
TREE_OPERAND (node, 1) = wfl;
}
CAN_COMPLETE_NORMALLY (node) = 1;
}
else
{
tree body;
location_t save_location = input_location;
#ifdef USE_MAPPED_LOCATION
input_location = EXPR_LOCATION (node);
if (input_location == UNKNOWN_LOCATION)
input_location = save_location;
#else
input_line = EXPR_WFL_LINENO (node);
#endif
body = java_complete_tree (EXPR_WFL_NODE (node));
input_location = save_location;
EXPR_WFL_NODE (node) = body;
TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
if (IS_EMPTY_STMT (body) || TREE_CONSTANT (body))
{
return body;
}
if (body == error_mark_node)
{
TREE_TYPE (node) = error_mark_node;
return error_mark_node;
}
else
TREE_TYPE (node) = TREE_TYPE (EXPR_WFL_NODE (node));
}
break;
case NEW_ARRAY_EXPR:
flag = 0;
for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
{
int location = EXPR_WFL_LINECOL (TREE_VALUE (cn));
tree dim = convert (int_type_node,
java_complete_tree (TREE_VALUE (cn)));
if (dim == error_mark_node)
{
flag = 1;
continue;
}
else
{
TREE_VALUE (cn) = dim;
#ifdef USE_MAPPED_LOCATION
TREE_PURPOSE (cn) = expr_add_location (NULL_TREE, location, 0);
#else
TREE_PURPOSE (cn) =
build_expr_wfl (NULL_TREE, input_filename, 0, 0);
EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
#endif
}
}
CAN_COMPLETE_NORMALLY (node) = 1;
return (flag ? error_mark_node
: force_evaluation_order (patch_newarray (node)));
case NEW_ANONYMOUS_ARRAY_EXPR:
if (ANONYMOUS_ARRAY_DIMS_SIG (node))
{
tree type = ANONYMOUS_ARRAY_BASE_TYPE (node);
if (!(type = resolve_type_during_patch (type)))
return error_mark_node;
type = build_array_from_name (type, NULL_TREE,
ANONYMOUS_ARRAY_DIMS_SIG (node), NULL);
ANONYMOUS_ARRAY_BASE_TYPE (node) = build_pointer_type (type);
}
node = patch_new_array_init (ANONYMOUS_ARRAY_BASE_TYPE (node),
ANONYMOUS_ARRAY_INITIALIZER (node));
if (node == error_mark_node)
return error_mark_node;
CAN_COMPLETE_NORMALLY (node) = 1;
return node;
case NEW_CLASS_EXPR:
case CALL_EXPR:
if (complete_function_arguments (node))
return error_mark_node;
else
{
tree decl, wfl = TREE_OPERAND (node, 0);
int in_this = CALL_THIS_CONSTRUCTOR_P (node);
int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
super_identifier_node);
tree arguments;
#ifdef USE_MAPPED_LOCATION
source_location location = EXPR_LOCATION (node);
#else
int location = EXPR_WFL_LINECOL (node);
#endif
node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
from_super, 0, &decl);
if (node == error_mark_node)
return error_mark_node;
if (TREE_CODE (node) == CALL_EXPR
&& TREE_OPERAND (node, 1) != NULL_TREE)
arguments = TREE_VALUE (TREE_OPERAND (node, 1));
else
arguments = NULL_TREE;
check_thrown_exceptions (location, decl, arguments);
if (in_this)
DECL_CONSTRUCTOR_CALLS (current_function_decl) =
tree_cons (wfl, decl,
DECL_CONSTRUCTOR_CALLS (current_function_decl));
CAN_COMPLETE_NORMALLY (node) = 1;
return force_evaluation_order (node);
}
case MODIFY_EXPR:
wfl_op1 = TREE_OPERAND (node, 0);
TREE_OPERAND (node, 0) = nn = java_complete_lhs (wfl_op1);
if (MODIFY_EXPR_FROM_INITIALIZATION_P (node)
&& TREE_CODE (nn) == VAR_DECL && TREE_STATIC (nn)
&& DECL_INITIAL (nn) != NULL_TREE)
{
tree value;
value = fold_constant_for_init (nn, nn);
if (value != NULL_TREE &&
(JPRIMITIVE_TYPE_P (TREE_TYPE (value)) ||
(TREE_TYPE (value) == string_ptr_type_node &&
! flag_emit_class_files)))
{
TREE_OPERAND (node, 1) = value;
if (patch_assignment (node, wfl_op1) == error_mark_node)
return error_mark_node;
else
{
tree patched = patch_string (TREE_OPERAND (node, 1));
if (patched)
DECL_INITIAL (nn) = patched;
else
DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
DECL_FIELD_FINAL_IUD (nn) = 1;
return build_java_empty_stmt ();
}
}
if (! flag_emit_class_files)
DECL_INITIAL (nn) = NULL_TREE;
}
wfl_op2 = TREE_OPERAND (node, 1);
if (TREE_OPERAND (node, 0) == error_mark_node)
return error_mark_node;
flag = COMPOUND_ASSIGN_P (wfl_op2);
if (flag)
{
tree lvalue = java_stabilize_reference (TREE_OPERAND (node, 0));
TREE_OPERAND (node, 0) = lvalue;
TREE_OPERAND (TREE_OPERAND (node, 1), 0) =
(flag_emit_class_files ? lvalue : save_expr (lvalue));
nn = java_complete_tree (TREE_OPERAND (node, 1));
if ((cn = patch_string (nn)))
nn = cn;
nn = java_complete_tree (build_cast (EXPR_WFL_LINECOL (wfl_op2),
TREE_TYPE (lvalue), nn));
if (JREFERENCE_TYPE_P (TREE_TYPE (lvalue))
&& ! JSTRING_TYPE_P (TREE_TYPE (lvalue)))
parse_error_context (wfl_op2,
"Incompatible type for %<+=%>. Can't convert %qs to %<java.lang.String%>",
lang_printable_name (TREE_TYPE (lvalue), 0));
}
else if (TREE_CODE (wfl_op2) == NEW_ARRAY_INIT && !TREE_TYPE (wfl_op2))
nn = patch_new_array_init (TREE_TYPE (TREE_OPERAND (node, 0)),
TREE_OPERAND (node, 1));
else
nn = java_complete_tree (TREE_OPERAND (node, 1));
if (nn == error_mark_node)
return error_mark_node;
TREE_OPERAND (node, 1) = nn;
if ((nn = patch_string (TREE_OPERAND (node, 1))))
TREE_OPERAND (node, 1) = nn;
if ((nn = outer_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
TREE_OPERAND (node, 1))))
{
if (nn == error_mark_node)
return error_mark_node;
node = nn;
}
else
{
node = patch_assignment (node, wfl_op1);
if (node == error_mark_node)
return error_mark_node;
if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node))
|| JSTRING_P (TREE_TYPE (node))))
node = java_refold (node);
}
nn = TREE_OPERAND (node, 0);
if (TREE_CODE (nn) == VAR_DECL
&& DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn))
&& FIELD_STATIC (nn) && FIELD_FINAL (nn)
&& (JPRIMITIVE_TYPE_P (TREE_TYPE (nn))
|| TREE_TYPE (nn) == string_ptr_type_node))
DECL_INITIAL (nn) = TREE_OPERAND (node, 1);
CAN_COMPLETE_NORMALLY (node) = 1;
return node;
case MULT_EXPR:
case PLUS_EXPR:
case MINUS_EXPR:
case LSHIFT_EXPR:
case RSHIFT_EXPR:
case URSHIFT_EXPR:
case BIT_AND_EXPR:
case BIT_XOR_EXPR:
case BIT_IOR_EXPR:
case TRUNC_MOD_EXPR:
case TRUNC_DIV_EXPR:
case RDIV_EXPR:
case TRUTH_ANDIF_EXPR:
case TRUTH_ORIF_EXPR:
case EQ_EXPR:
case NE_EXPR:
case GT_EXPR:
case GE_EXPR:
case LT_EXPR:
case LE_EXPR:
wfl_op1 = TREE_OPERAND (node, 0);
wfl_op2 = TREE_OPERAND (node, 1);
CAN_COMPLETE_NORMALLY (node) = 1;
if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op1))
{
nn = java_complete_tree (wfl_op1);
if (nn == error_mark_node)
return error_mark_node;
TREE_OPERAND (node, 0) = nn;
}
if (TREE_CODE (node) != PLUS_EXPR || !JSTRING_P (wfl_op2))
{
nn = java_complete_tree (wfl_op2);
if (nn == error_mark_node)
return error_mark_node;
TREE_OPERAND (node, 1) = nn;
}
return patch_binop (node, wfl_op1, wfl_op2);
case INSTANCEOF_EXPR:
wfl_op1 = TREE_OPERAND (node, 0);
COMPLETE_CHECK_OP_0 (node);
if (flag_emit_xref)
{
TREE_TYPE (node) = boolean_type_node;
return node;
}
return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
case UNARY_PLUS_EXPR:
case NEGATE_EXPR:
case TRUTH_NOT_EXPR:
case BIT_NOT_EXPR:
case PREDECREMENT_EXPR:
case PREINCREMENT_EXPR:
case POSTDECREMENT_EXPR:
case POSTINCREMENT_EXPR:
case CONVERT_EXPR:
wfl_op1 = TREE_OPERAND (node, 0);
CAN_COMPLETE_NORMALLY (node) = 1;
TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
if (TREE_OPERAND (node, 0) == error_mark_node)
return error_mark_node;
node = patch_unaryop (node, wfl_op1);
CAN_COMPLETE_NORMALLY (node) = 1;
break;
case ARRAY_REF:
wfl_op1 = TREE_OPERAND (node, 0);
TREE_OPERAND (node, 0) = java_complete_tree (wfl_op1);
if (TREE_OPERAND (node, 0) == error_mark_node)
return error_mark_node;
if (!flag_emit_class_files && !flag_emit_xref)
TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
wfl_op2 = TREE_OPERAND (node, 1);
TREE_OPERAND (node, 1) = java_complete_tree (wfl_op2);
if (TREE_OPERAND (node, 1) == error_mark_node)
return error_mark_node;
if (!flag_emit_class_files && !flag_emit_xref)
TREE_OPERAND (node, 1) = save_expr (TREE_OPERAND (node, 1));
return patch_array_ref (node);
case RECORD_TYPE:
return node;;
case COMPONENT_REF:
TREE_OPERAND (node, 0) = java_complete_tree (TREE_OPERAND (node, 0));
if (TREE_CODE (TREE_OPERAND (node, 0)) == RECORD_TYPE)
{
tree name = TREE_OPERAND (node, 1);
tree field = lookup_field_wrapper (TREE_OPERAND (node, 0), name);
if (field == NULL_TREE)
{
error ("missing static field %qs", IDENTIFIER_POINTER (name));
return error_mark_node;
}
if (! FIELD_STATIC (field))
{
error ("not a static field %qs", IDENTIFIER_POINTER (name));
return error_mark_node;
}
return field;
}
else
abort ();
break;
case THIS_EXPR:
if (!current_this)
{
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
parse_error_context (wfl_operator,
"Keyword %<this%> used outside allowed context");
TREE_TYPE (node) = error_mark_node;
return error_mark_node;
}
if (ctxp->explicit_constructor_p)
{
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
parse_error_context
(wfl_operator, "Can't reference %<this%> or %<super%> before the superclass constructor has been called");
TREE_TYPE (node) = error_mark_node;
return error_mark_node;
}
return current_this;
case CLASS_LITERAL:
CAN_COMPLETE_NORMALLY (node) = 1;
node = patch_incomplete_class_ref (node);
if (node == error_mark_node)
return error_mark_node;
break;
default:
CAN_COMPLETE_NORMALLY (node) = 1;
if ((nn = patch_string (node)))
node = nn;
else
internal_error ("No case for %s", tree_code_name [TREE_CODE (node)]);
}
return node;
}
static int
complete_function_arguments (tree node)
{
int flag = 0;
tree cn;
ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn))
{
tree wfl = TREE_VALUE (cn), parm, temp;
parm = java_complete_tree (wfl);
if (parm == error_mark_node)
{
flag = 1;
continue;
}
if ((temp = patch_string (parm)))
parm = temp;
TREE_VALUE (cn) = parm;
}
ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0);
return flag;
}
static tree
build_debugable_stmt (int location, tree stmt)
{
if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
{
#ifdef USE_MAPPED_LOCATION
stmt = expr_add_location (stmt, location, 1);
#else
stmt = build_expr_wfl (stmt, input_filename, 0, 0);
EXPR_WFL_LINECOL (stmt) = location;
JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
#endif
}
return stmt;
}
static tree
build_expr_block (tree body, tree decls)
{
tree node = make_node (BLOCK);
BLOCK_EXPR_DECLS (node) = decls;
BLOCK_EXPR_BODY (node) = body;
if (body)
TREE_TYPE (node) = TREE_TYPE (body);
TREE_SIDE_EFFECTS (node) = 1;
return node;
}
static tree
enter_block (void)
{
tree b = build_expr_block (NULL_TREE, NULL_TREE);
tree fndecl = current_function_decl;
if (!fndecl) {
BLOCK_SUPERCONTEXT (b) = current_static_block;
current_static_block = b;
}
else if (!DECL_FUNCTION_BODY (fndecl))
{
BLOCK_SUPERCONTEXT (b) = fndecl;
DECL_FUNCTION_BODY (fndecl) = b;
}
else
{
BLOCK_SUPERCONTEXT (b) = DECL_FUNCTION_BODY (fndecl);
DECL_FUNCTION_BODY (fndecl) = b;
}
return b;
}
static tree
exit_block (void)
{
tree b;
if (current_function_decl)
{
b = DECL_FUNCTION_BODY (current_function_decl);
if (BLOCK_SUPERCONTEXT (b) != current_function_decl)
DECL_FUNCTION_BODY (current_function_decl) = BLOCK_SUPERCONTEXT (b);
}
else
{
b = current_static_block;
if (BLOCK_SUPERCONTEXT (b))
current_static_block = BLOCK_SUPERCONTEXT (b);
}
return b;
}
static tree
lookup_name_in_blocks (tree name)
{
tree b = GET_CURRENT_BLOCK (current_function_decl);
while (b != current_function_decl)
{
tree current;
if (TREE_CODE (b) != BLOCK)
abort ();
for (current = BLOCK_EXPR_DECLS (b); current;
current = TREE_CHAIN (current))
if (DECL_NAME (current) == name)
return current;
b = BLOCK_SUPERCONTEXT (b);
}
return NULL_TREE;
}
static void
maybe_absorb_scoping_blocks (void)
{
while (BLOCK_IS_IMPLICIT (GET_CURRENT_BLOCK (current_function_decl)))
{
tree b = exit_block ();
java_method_add_stmt (current_function_decl, b);
SOURCE_FRONTEND_DEBUG (("Absorbing scoping block at line %d", input_line));
}
}
static tree
build_wfl_wrap (tree node, int location)
{
tree wfl, node_to_insert = node;
if (TREE_CODE (node) == THIS_EXPR)
node_to_insert = wfl = build_wfl_node (this_identifier_node);
else
#ifdef USE_MAPPED_LOCATION
wfl = build_unknown_wfl (NULL_TREE);
SET_EXPR_LOCATION (wfl, location);
#else
wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
EXPR_WFL_LINECOL (wfl) = location;
#endif
EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
return wfl;
}
static tree
build_super_invocation (tree mdecl)
{
if (DECL_CONTEXT (mdecl) == object_type_node)
return build_java_empty_stmt ();
else
{
tree super_wfl = build_wfl_node (super_identifier_node);
tree a = NULL_TREE, t;
tree class_wfl = lookup_cl (TYPE_NAME (current_class));
EXPR_WFL_LINECOL (super_wfl) = EXPR_WFL_LINECOL (class_wfl);
if (ANONYMOUS_CLASS_P (DECL_CONTEXT (mdecl)))
{
SKIP_THIS_AND_ARTIFICIAL_PARMS (t, mdecl);
for (; t != end_params_node; t = TREE_CHAIN (t))
a = tree_cons (NULL_TREE, build_wfl_node (TREE_PURPOSE (t)), a);
}
return build_method_invocation (super_wfl, a);
}
}
static tree
build_this_super_qualified_invocation (int use_this, tree name, tree args,
int lloc, int rloc)
{
tree invok;
tree wfl =
build_wfl_node (use_this ? this_identifier_node : super_identifier_node);
EXPR_WFL_LINECOL (wfl) = lloc;
invok = build_method_invocation (name, args);
return make_qualified_primary (wfl, invok, rloc);
}
static tree
build_method_invocation (tree name, tree args)
{
tree call = build3 (CALL_EXPR, NULL_TREE, name, args, NULL_TREE);
TREE_SIDE_EFFECTS (call) = 1;
EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
return call;
}
static tree
build_new_invocation (tree name, tree args)
{
tree call = build3 (NEW_CLASS_EXPR, NULL_TREE, name, args, NULL_TREE);
TREE_SIDE_EFFECTS (call) = 1;
EXPR_WFL_LINECOL (call) = EXPR_WFL_LINECOL (name);
return call;
}
static tree
build_assignment (int op, int op_location, tree lhs, tree rhs)
{
tree assignment;
if (op != ASSIGN_TK)
{
rhs = build_binop (BINOP_LOOKUP (op), op_location, lhs, rhs);
COMPOUND_ASSIGN_P (rhs) = 1;
}
assignment = build2 (MODIFY_EXPR, NULL_TREE, lhs, rhs);
TREE_SIDE_EFFECTS (assignment) = 1;
EXPR_WFL_LINECOL (assignment) = op_location;
return assignment;
}
static char *
string_convert_int_cst (tree node)
{
static char buffer[21];
unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
char *p = buffer + sizeof (buffer);
int neg = 0;
unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
<< (HOST_BITS_PER_WIDE_INT - 1));
*--p = '\0';
if ((hi & hibit))
{
lo = ~lo;
hi = ~hi;
if (++lo == 0)
++hi;
neg = 1;
}
do
{
unsigned HOST_WIDE_INT acc = 0;
unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
unsigned int i;
for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
{
acc <<= 1;
if ((hi & hibit))
acc |= 1;
hi <<= 1;
if ((lo & hibit))
hi |= 1;
lo <<= 1;
outhi <<= 1;
if ((outlo & hibit))
outhi |= 1;
outlo <<= 1;
if (acc >= 10)
{
acc -= 10;
outlo |= 1;
}
}
*--p = '\060' + acc;
hi = outhi;
lo = outlo;
}
while (hi || lo);
if (neg)
*--p = '\055';
return p;
}
char *
print_int_node (tree node)
{
static char buffer [80];
if (TREE_CONSTANT_OVERFLOW (node))
sprintf (buffer, "<overflow>");
if (TREE_INT_CST_HIGH (node) == 0)
sprintf (buffer, HOST_WIDE_INT_PRINT_UNSIGNED,
TREE_INT_CST_LOW (node));
else if (TREE_INT_CST_HIGH (node) == -1
&& TREE_INT_CST_LOW (node) != 0)
sprintf (buffer, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
-TREE_INT_CST_LOW (node));
else
sprintf (buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
return buffer;
}
static tree
patch_assignment (tree node, tree wfl_op1)
{
tree rhs = TREE_OPERAND (node, 1);
tree lvalue = TREE_OPERAND (node, 0), llvalue;
tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE;
int error_found = 0;
int lvalue_from_array = 0;
int is_return = 0;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
if (JDECL_P (lvalue))
{
lhs_type = TREE_TYPE (lvalue);
}
else if (TREE_CODE (lvalue) == ARRAY_REF)
{
lhs_type = TREE_TYPE (lvalue);
lvalue_from_array = 1;
}
else if (TREE_CODE (lvalue) == COMPONENT_REF)
lhs_type = TREE_TYPE (lvalue);
else if (TREE_CODE (lvalue) == RESULT_DECL)
{
lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl));
is_return = 1;
}
else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
&& resolve_expression_name (wfl_op1, &llvalue))
{
lhs_type = TREE_TYPE (lvalue);
}
else
{
parse_error_context (wfl_op1, "Invalid left hand side of assignment");
error_found = 1;
}
rhs_type = TREE_TYPE (rhs);
new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs);
if (!new_rhs)
new_rhs = try_reference_assignconv (lhs_type, rhs);
else if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
new_rhs = convert (lhs_type, rhs);
if (!new_rhs)
{
char *t1 = xstrdup (lang_printable_name (TREE_TYPE (rhs), 0));
char *t2 = xstrdup (lang_printable_name (lhs_type, 0));
tree wfl;
char operation [32];
if (MODIFY_EXPR_FROM_INITIALIZATION_P (node))
{
wfl = wfl_op1;
strcpy (operation, "declaration");
}
else
{
wfl = wfl_operator;
if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1)))
strcpy (operation, "assignment");
else if (is_return)
strcpy (operation, "'return'");
else
strcpy (operation, "'='");
}
if (!valid_cast_to_p (rhs_type, lhs_type))
parse_error_context
(wfl, "Incompatible type for %s. Can't convert %qs to %qs",
operation, t1, t2);
else
parse_error_context (wfl, "Incompatible type for %s. Explicit cast needed to convert %qs to %qs",
operation, t1, t2);
free (t1); free (t2);
error_found = 1;
}
if (error_found)
return error_mark_node;
if (is_return)
new_rhs = convert (TREE_TYPE (lvalue), new_rhs);
if (!flag_emit_class_files
&& !flag_emit_xref
&& lvalue_from_array
&& JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type)))
{
tree array, store_check, base, index_expr;
new_rhs = save_expr (new_rhs);
array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0);
array = TREE_OPERAND (array, 0);
store_check = build_java_arraystore_check (array, new_rhs);
index_expr = TREE_OPERAND (lvalue, 1);
if (TREE_CODE (index_expr) == COMPOUND_EXPR)
{
base = index_expr;
}
else
base = lvalue;
index_expr = TREE_OPERAND (base, 1);
TREE_OPERAND (base, 1) = build2 (COMPOUND_EXPR, TREE_TYPE (index_expr),
store_check, index_expr);
}
if (TREE_CODE (lvalue) == VAR_DECL
&& DECL_FINAL (lvalue)
&& TREE_CONSTANT (new_rhs)
&& IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
&& JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
)
{
TREE_CONSTANT (lvalue) = 1;
TREE_INVARIANT (lvalue) = 1;
DECL_INITIAL (lvalue) = new_rhs;
}
if (! flag_check_references && ! flag_emit_class_files && optimize > 0)
{
switch (TREE_CODE (new_rhs))
{
case ARRAY_REF:
case INDIRECT_REF:
case COMPONENT_REF:
{
tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"),
TREE_TYPE (new_rhs));
tree block = make_node (BLOCK);
tree assignment
= build2 (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
DECL_CONTEXT (tmp) = current_function_decl;
TREE_TYPE (block) = TREE_TYPE (new_rhs);
BLOCK_VARS (block) = tmp;
BLOCK_EXPR_BODY (block) = assignment;
TREE_SIDE_EFFECTS (block) = 1;
new_rhs = block;
}
break;
default:
break;
}
}
TREE_OPERAND (node, 0) = lvalue;
TREE_OPERAND (node, 1) = new_rhs;
TREE_TYPE (node) = lhs_type;
return node;
}
static tree
try_reference_assignconv (tree lhs_type, tree rhs)
{
tree new_rhs = NULL_TREE;
tree rhs_type = TREE_TYPE (rhs);
if (!JPRIMITIVE_TYPE_P (rhs_type) && JREFERENCE_TYPE_P (lhs_type))
{
if (rhs == null_pointer_node)
new_rhs = null_pointer_node;
else if (valid_ref_assignconv_cast_p (rhs_type, lhs_type, 0))
new_rhs = rhs;
else if (TREE_CODE (rhs) == JAVA_EXC_OBJ_EXPR)
new_rhs = rhs;
}
return new_rhs;
}
static tree
try_builtin_assignconv (tree wfl_op1, tree lhs_type, tree rhs)
{
tree new_rhs = NULL_TREE;
tree rhs_type = TREE_TYPE (rhs);
if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
|| TREE_CODE (lhs_type) == BOOLEAN_TYPE)
{
if (TREE_CODE (rhs_type) == BOOLEAN_TYPE
&& TREE_CODE (lhs_type) == BOOLEAN_TYPE)
new_rhs = rhs;
}
else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type))
new_rhs = convert (lhs_type, rhs);
else if ((rhs_type == byte_type_node || rhs_type == short_type_node
|| rhs_type == char_type_node || rhs_type == int_type_node)
&& TREE_CONSTANT (rhs)
&& (lhs_type == byte_type_node || lhs_type == char_type_node
|| lhs_type == short_type_node))
{
if (int_fits_type_p (rhs, lhs_type))
new_rhs = convert (lhs_type, rhs);
else if (wfl_op1)
parse_warning_context
(wfl_op1,
"Constant expression %qs too wide for narrowing primitive conversion to %qs",
print_int_node (rhs), lang_printable_name (lhs_type, 0));
}
return new_rhs;
}
static int
valid_builtin_assignconv_identity_widening_p (tree lhs_type, tree rhs_type)
{
if (lhs_type == rhs_type)
return 1;
if (!JNUMERIC_TYPE_P (lhs_type) || !JNUMERIC_TYPE_P (rhs_type))
return 0;
if (lhs_type == char_type_node && rhs_type == byte_type_node)
return 0;
if (lhs_type == int_type_node
&& (rhs_type == promoted_byte_type_node
|| rhs_type == promoted_short_type_node
|| rhs_type == promoted_char_type_node
|| rhs_type == promoted_boolean_type_node))
return 1;
if ((JINTEGRAL_TYPE_P (rhs_type) && JINTEGRAL_TYPE_P (lhs_type)
&& (TYPE_PRECISION (rhs_type) < TYPE_PRECISION (lhs_type)))
|| (JINTEGRAL_TYPE_P (rhs_type) && JFLOAT_TYPE_P (lhs_type))
|| (rhs_type == float_type_node && lhs_type == double_type_node))
return 1;
return 0;
}
static int
valid_ref_assignconv_cast_p (tree source, tree dest, int cast)
{
if (!source || !dest)
return 0;
if (JNULLP_TYPE_P (source))
return 1;
if (TREE_CODE (source) == POINTER_TYPE)
source = TREE_TYPE (source);
if (TREE_CODE (dest) == POINTER_TYPE)
dest = TREE_TYPE (dest);
if (CLASS_P (source) && !CLASS_LOADED_P (source))
{
load_class (source, 1);
safe_layout_class (source);
}
if (CLASS_P (dest) && !CLASS_LOADED_P (dest))
{
load_class (dest, 1);
safe_layout_class (dest);
}
if (TYPE_CLASS_P (source))
{
if (TYPE_CLASS_P (dest))
return (source == dest
|| inherits_from_p (source, dest)
|| (cast && inherits_from_p (dest, source)));
if (TYPE_INTERFACE_P (dest))
{
if (cast && !CLASS_FINAL (TYPE_NAME (source)))
return 1;
return interface_of_p (dest, source);
}
return (cast && source == object_type_node ? 1 : 0);
}
if (TYPE_INTERFACE_P (source))
{
if (TYPE_CLASS_P (dest))
{
if (!cast)
return dest == object_type_node;
else if (!CLASS_FINAL (TYPE_NAME (dest)))
return 1;
else
return interface_of_p (source, dest);
}
if (TYPE_INTERFACE_P (dest))
{
if (cast)
{
tree method_source, method_dest;
tree source_type;
tree source_sig;
tree source_name;
for (method_source = TYPE_METHODS (source); method_source;
method_source = TREE_CHAIN (method_source))
{
source_sig =
build_java_argument_signature (TREE_TYPE (method_source));
source_type = TREE_TYPE (TREE_TYPE (method_source));
source_name = DECL_NAME (method_source);
for (method_dest = TYPE_METHODS (dest);
method_dest; method_dest = TREE_CHAIN (method_dest))
if (source_sig ==
build_java_argument_signature (TREE_TYPE (method_dest))
&& source_name == DECL_NAME (method_dest)
&& source_type != TREE_TYPE (TREE_TYPE (method_dest)))
return 0;
}
return 1;
}
else
return source == dest || interface_of_p (dest, source);
}
else
{
return (cast
&& (DECL_NAME (TYPE_NAME (source))
== java_lang_cloneable_identifier_node
|| (DECL_NAME (TYPE_NAME (source))
== java_io_serializable_identifier_node)));
}
}
if (TYPE_ARRAY_P (source))
{
if (TYPE_CLASS_P (dest))
return dest == object_type_node;
if (TYPE_INTERFACE_P (dest))
return (DECL_NAME (TYPE_NAME (dest))
== java_lang_cloneable_identifier_node
|| (DECL_NAME (TYPE_NAME (dest))
== java_io_serializable_identifier_node));
else
{
tree source_element_type = TYPE_ARRAY_ELEMENT (source);
tree dest_element_type = TYPE_ARRAY_ELEMENT (dest);
if (!dest_element_type || !source_element_type)
return 0;
if (source_element_type == dest_element_type)
return 1;
return valid_ref_assignconv_cast_p (source_element_type,
dest_element_type, cast);
}
return 0;
}
return 0;
}
static int
valid_cast_to_p (tree source, tree dest)
{
if (TREE_CODE (source) == POINTER_TYPE)
source = TREE_TYPE (source);
if (TREE_CODE (dest) == POINTER_TYPE)
dest = TREE_TYPE (dest);
if (TREE_CODE (source) == RECORD_TYPE && TREE_CODE (dest) == RECORD_TYPE)
return valid_ref_assignconv_cast_p (source, dest, 1);
else if (JNUMERIC_TYPE_P (source) && JNUMERIC_TYPE_P (dest))
return 1;
else if (TREE_CODE (source) == BOOLEAN_TYPE
&& TREE_CODE (dest) == BOOLEAN_TYPE)
return 1;
return 0;
}
static tree
do_unary_numeric_promotion (tree arg)
{
tree type = TREE_TYPE (arg);
if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
|| TREE_CODE (type) == CHAR_TYPE)
arg = convert (int_type_node, arg);
return arg;
}
static int
valid_method_invocation_conversion_p (tree dest, tree source)
{
return ((JPRIMITIVE_TYPE_P (source) && JPRIMITIVE_TYPE_P (dest)
&& valid_builtin_assignconv_identity_widening_p (dest, source))
|| ((JREFERENCE_TYPE_P (source) || JNULLP_TYPE_P (source))
&& (JREFERENCE_TYPE_P (dest) || JNULLP_TYPE_P (dest))
&& valid_ref_assignconv_cast_p (source, dest, 0)));
}
static tree
build_binop (enum tree_code op, int op_location, tree op1, tree op2)
{
tree binop = build2 (op, NULL_TREE, op1, op2);
TREE_SIDE_EFFECTS (binop) = 1;
EXPR_WFL_LINECOL (binop) = op_location;
return binop;
}
static char *
operator_string (tree node)
{
#define BUILD_OPERATOR_STRING(S) \
{ \
sprintf (buffer, "%s%s", S, (COMPOUND_ASSIGN_P (node) ? "=" : "")); \
return buffer; \
}
static char buffer [10];
switch (TREE_CODE (node))
{
case MULT_EXPR: BUILD_OPERATOR_STRING ("*");
case RDIV_EXPR: BUILD_OPERATOR_STRING ("/");
case TRUNC_MOD_EXPR: BUILD_OPERATOR_STRING ("%");
case PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
case MINUS_EXPR: BUILD_OPERATOR_STRING ("-");
case LSHIFT_EXPR: BUILD_OPERATOR_STRING ("<<");
case RSHIFT_EXPR: BUILD_OPERATOR_STRING (">>");
case URSHIFT_EXPR: BUILD_OPERATOR_STRING (">>>");
case BIT_AND_EXPR: BUILD_OPERATOR_STRING ("&");
case BIT_XOR_EXPR: BUILD_OPERATOR_STRING ("^");
case BIT_IOR_EXPR: BUILD_OPERATOR_STRING ("|");
case TRUTH_ANDIF_EXPR: BUILD_OPERATOR_STRING ("&&");
case TRUTH_ORIF_EXPR: BUILD_OPERATOR_STRING ("||");
case EQ_EXPR: BUILD_OPERATOR_STRING ("==");
case NE_EXPR: BUILD_OPERATOR_STRING ("!=");
case GT_EXPR: BUILD_OPERATOR_STRING (">");
case GE_EXPR: BUILD_OPERATOR_STRING (">=");
case LT_EXPR: BUILD_OPERATOR_STRING ("<");
case LE_EXPR: BUILD_OPERATOR_STRING ("<=");
case UNARY_PLUS_EXPR: BUILD_OPERATOR_STRING ("+");
case NEGATE_EXPR: BUILD_OPERATOR_STRING ("-");
case TRUTH_NOT_EXPR: BUILD_OPERATOR_STRING ("!");
case BIT_NOT_EXPR: BUILD_OPERATOR_STRING ("~");
case PREINCREMENT_EXPR:
case POSTINCREMENT_EXPR: BUILD_OPERATOR_STRING ("++");
case PREDECREMENT_EXPR:
case POSTDECREMENT_EXPR: BUILD_OPERATOR_STRING ("--");
default:
internal_error ("unregistered operator %s",
tree_code_name [TREE_CODE (node)]);
}
return NULL;
#undef BUILD_OPERATOR_STRING
}
static int
java_decl_equiv (tree var_acc1, tree var_acc2)
{
if (JDECL_P (var_acc1))
return (var_acc1 == var_acc2);
return (TREE_CODE (var_acc1) == COMPONENT_REF
&& TREE_CODE (var_acc2) == COMPONENT_REF
&& TREE_OPERAND (TREE_OPERAND (var_acc1, 0), 0)
== TREE_OPERAND (TREE_OPERAND (var_acc2, 0), 0)
&& TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
}
static int
binop_compound_p (enum tree_code code)
{
int i;
for (i = 0; i < BINOP_COMPOUND_CANDIDATES; i++)
if (binop_lookup [i] == code)
break;
return i < BINOP_COMPOUND_CANDIDATES;
}
static tree
java_refold (tree t)
{
tree c, b, ns, decl;
if (TREE_CODE (t) != MODIFY_EXPR)
return t;
c = TREE_OPERAND (t, 1);
if (! (c && TREE_CODE (c) == COMPOUND_EXPR
&& TREE_CODE (TREE_OPERAND (c, 0)) == MODIFY_EXPR
&& binop_compound_p (TREE_CODE (TREE_OPERAND (c, 1)))))
return t;
b = TREE_OPERAND (TREE_OPERAND (c, 1), 0);
if (! (b && TREE_CODE (b) == NOP_EXPR
&& TREE_CODE (TREE_OPERAND (b, 0)) == SAVE_EXPR))
return t;
ns = TREE_OPERAND (TREE_OPERAND (b, 0), 0);
if (! (ns && TREE_CODE (ns) == NOP_EXPR
&& TREE_CODE (TREE_OPERAND (ns, 0)) == SAVE_EXPR))
return t;
decl = TREE_OPERAND (TREE_OPERAND (ns, 0), 0);
if ((JDECL_P (decl) || TREE_CODE (decl) == COMPONENT_REF)
&& java_decl_equiv (decl, TREE_OPERAND (TREE_OPERAND (c, 0), 0)))
{
TREE_OPERAND (TREE_OPERAND (c, 1), 0) = TREE_OPERAND (ns, 0);
TREE_OPERAND (t, 1) = TREE_OPERAND (c, 1);
TREE_OPERAND (TREE_OPERAND (t, 1), 1) = TREE_OPERAND (c, 0);
}
return t;
}
static tree
patch_binop (tree node, tree wfl_op1, tree wfl_op2)
{
tree op1 = TREE_OPERAND (node, 0);
tree op2 = TREE_OPERAND (node, 1);
tree op1_type = TREE_TYPE (op1);
tree op2_type = TREE_TYPE (op2);
tree prom_type = NULL_TREE, cn;
enum tree_code code = TREE_CODE (node);
int error_found = 0;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
if (! (code == PLUS_EXPR || code == NE_EXPR
|| code == EQ_EXPR || code == INSTANCEOF_EXPR))
{
tree n;
if (! op1_type)
{
n = java_complete_tree (op1);
op1_type = TREE_TYPE (n);
}
if (! op2_type)
{
n = java_complete_tree (op2);
op2_type = TREE_TYPE (n);
}
}
switch (code)
{
case MULT_EXPR:
case RDIV_EXPR:
case TRUNC_DIV_EXPR:
case TRUNC_MOD_EXPR:
if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
{
if (!JNUMERIC_TYPE_P (op1_type))
ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
TREE_TYPE (node) = error_mark_node;
error_found = 1;
break;
}
prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR)
&& TREE_CODE (prom_type) == INTEGER_TYPE
&& (op2 == integer_zero_node || op2 == long_zero_node ||
(TREE_CODE (op2) == INTEGER_CST &&
! TREE_INT_CST_LOW (op2) && ! TREE_INT_CST_HIGH (op2))))
{
parse_warning_context
(wfl_operator,
"Evaluating this expression will result in an arithmetic exception being thrown");
TREE_CONSTANT (node) = 0;
TREE_INVARIANT (node) = 0;
}
if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE)
TREE_SET_CODE (node, TRUNC_DIV_EXPR);
if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2)
&& JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2))
{
TREE_TYPE (node) = prom_type;
node = fold (node);
if (TREE_CODE (node) != code)
return node;
}
if (TREE_CODE (prom_type) == INTEGER_TYPE
&& flag_use_divide_subroutine
&& ! flag_emit_class_files
&& (code == RDIV_EXPR || code == TRUNC_MOD_EXPR))
return build_java_soft_divmod (TREE_CODE (node), prom_type, op1, op2);
if (code == TRUNC_MOD_EXPR)
{
tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
return mod;
}
break;
case PLUS_EXPR:
if (TREE_CODE (op1) == STRING_CST
|| TREE_CODE (op2) == STRING_CST
|| JSTRING_TYPE_P (op1_type)
|| JSTRING_TYPE_P (op2_type)
|| IS_CRAFTED_STRING_BUFFER_P (op1)
|| IS_CRAFTED_STRING_BUFFER_P (op2))
return build_string_concatenation (op1, op2);
case MINUS_EXPR:
if (!JNUMERIC_TYPE_P (op1_type) || !JNUMERIC_TYPE_P (op2_type))
{
if (!JNUMERIC_TYPE_P (op1_type))
ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
TREE_TYPE (node) = error_mark_node;
error_found = 1;
break;
}
prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
break;
case LSHIFT_EXPR:
case RSHIFT_EXPR:
case URSHIFT_EXPR:
if (!JINTEGRAL_TYPE_P (op1_type) || !JINTEGRAL_TYPE_P (op2_type))
{
if (!JINTEGRAL_TYPE_P (op1_type))
ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
else
{
if (JNUMERIC_TYPE_P (op2_type))
parse_error_context (wfl_operator,
"Incompatible type for %qs. Explicit cast needed to convert shift distance from %qs to integral",
operator_string (node),
lang_printable_name (op2_type, 0));
else
parse_error_context (wfl_operator,
"Incompatible type for %qs. Can't convert shift distance from %qs to integral",
operator_string (node),
lang_printable_name (op2_type, 0));
}
TREE_TYPE (node) = error_mark_node;
error_found = 1;
break;
}
op1 = do_unary_numeric_promotion (op1);
op2 = do_unary_numeric_promotion (op2);
if (TREE_TYPE (op2) == long_type_node)
op2 = build1 (CONVERT_EXPR, int_type_node, op2);
prom_type = TREE_TYPE (op1);
if (prom_type == int_type_node)
op2 = fold (build2 (BIT_AND_EXPR, int_type_node, op2,
build_int_cst (NULL_TREE, 0x1f)));
else
op2 = fold (build2 (BIT_AND_EXPR, int_type_node, op2,
build_int_cst (NULL_TREE, 0x3f)));
if (code == URSHIFT_EXPR && ! flag_emit_class_files)
{
tree to_return;
tree utype = java_unsigned_type (prom_type);
op1 = convert (utype, op1);
TREE_SET_CODE (node, RSHIFT_EXPR);
TREE_OPERAND (node, 0) = op1;
TREE_OPERAND (node, 1) = op2;
TREE_TYPE (node) = utype;
to_return = convert (prom_type, node);
COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
TREE_SIDE_EFFECTS (to_return)
= TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
return to_return;
}
break;
case INSTANCEOF_EXPR:
TREE_TYPE (node) = boolean_type_node;
if ((cn = patch_string (op1)))
{
op1 = cn;
op1_type = TREE_TYPE (op1);
}
if (op1_type == NULL_TREE)
abort ();
if (!(op2_type = resolve_type_during_patch (op2)))
return error_mark_node;
if (!JREFERENCE_TYPE_P (op1_type) && op1 != null_pointer_node)
error_found = 1;
if (!JREFERENCE_TYPE_P (op2_type))
{
SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
parse_error_context
(wfl_operator, "Invalid argument %qs for %<instanceof%>",
lang_printable_name (op2_type, 0));
error_found = 1;
}
if (!error_found && valid_ref_assignconv_cast_p (op1_type, op2_type, 1))
{
if (op1 == null_pointer_node)
return boolean_false_node;
else if (flag_emit_class_files)
{
TREE_OPERAND (node, 1) = op2_type;
TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1);
return node;
}
else
return build_instanceof (op1, op2_type);
}
else
{
char *t1 = xstrdup (lang_printable_name (op1_type, 0));
SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
parse_error_context
(wfl_operator, "Impossible for %qs to be instance of %qs",
t1, lang_printable_name (op2_type, 0));
free (t1);
error_found = 1;
}
break;
case BIT_AND_EXPR:
case BIT_XOR_EXPR:
case BIT_IOR_EXPR:
if (JINTEGRAL_TYPE_P (op1_type) && JINTEGRAL_TYPE_P (op2_type))
prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
else if (TREE_CODE (op1_type) == BOOLEAN_TYPE
&& TREE_CODE (op1_type) == BOOLEAN_TYPE)
prom_type = boolean_type_node;
else
{
if (!JINTEGRAL_TYPE_P (op1_type))
ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op1_type);
if (!JINTEGRAL_TYPE_P (op2_type) && (op1_type != op2_type))
ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op2_type);
TREE_TYPE (node) = error_mark_node;
error_found = 1;
}
break;
case TRUTH_ANDIF_EXPR:
case TRUTH_ORIF_EXPR:
if (TREE_CODE (op1_type) != BOOLEAN_TYPE ||
TREE_CODE (op2_type) != BOOLEAN_TYPE)
{
if (TREE_CODE (op1_type) != BOOLEAN_TYPE)
ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op1_type);
if (TREE_CODE (op2_type) != BOOLEAN_TYPE && (op1_type != op2_type))
ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op2_type);
TREE_TYPE (node) = boolean_type_node;
error_found = 1;
break;
}
else if (integer_zerop (op1))
{
return code == TRUTH_ANDIF_EXPR ? op1 : op2;
}
else if (integer_onep (op1))
{
return code == TRUTH_ANDIF_EXPR ? op2 : op1;
}
prom_type = boolean_type_node;
break;
case LT_EXPR:
case GT_EXPR:
case LE_EXPR:
case GE_EXPR:
if (!JNUMERIC_TYPE_P (op1_type) || ! JNUMERIC_TYPE_P (op2_type))
{
if (!JNUMERIC_TYPE_P (op1_type))
ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op1_type);
if (!JNUMERIC_TYPE_P (op2_type) && (op1_type != op2_type))
ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op2_type);
TREE_TYPE (node) = boolean_type_node;
error_found = 1;
break;
}
binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
prom_type = boolean_type_node;
break;
case EQ_EXPR:
case NE_EXPR:
if ((cn = patch_string (op1)))
{
op1 = cn;
op1_type = TREE_TYPE (op1);
}
if ((cn = patch_string (op2)))
{
op2 = cn;
op2_type = TREE_TYPE (op2);
}
if (JNUMERIC_TYPE_P (op1_type) && JNUMERIC_TYPE_P (op2_type))
binary_numeric_promotion (op1_type, op2_type, &op1, &op2);
else if (TREE_CODE (op1_type) == BOOLEAN_TYPE &&
TREE_CODE (op2_type) == BOOLEAN_TYPE)
;
else if ((op1 == null_pointer_node && op2 == null_pointer_node)
|| (op1 == null_pointer_node && JREFERENCE_TYPE_P (op2_type))
|| (JREFERENCE_TYPE_P (op1_type) && op2 == null_pointer_node)
|| (JREFERENCE_TYPE_P (op1_type) && JREFERENCE_TYPE_P (op2_type)
&& (valid_ref_assignconv_cast_p (op1_type, op2_type, 1)
|| valid_ref_assignconv_cast_p (op2_type,
op1_type, 1))))
;
else
{
char *t1;
t1 = xstrdup (lang_printable_name (op1_type, 0));
parse_error_context
(wfl_operator,
"Incompatible type for %qs. Can't convert %qs to %qs",
operator_string (node), t1,
lang_printable_name (op2_type, 0));
free (t1);
TREE_TYPE (node) = boolean_type_node;
error_found = 1;
break;
}
prom_type = boolean_type_node;
break;
default:
abort ();
}
if (error_found)
return error_mark_node;
TREE_OPERAND (node, 0) = op1;
TREE_OPERAND (node, 1) = op2;
TREE_TYPE (node) = prom_type;
TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
if (flag_emit_xref)
return node;
if (flag_emit_class_files ? (TREE_CONSTANT (op1) && TREE_CONSTANT (op2))
: ! TREE_SIDE_EFFECTS (node))
node = fold (node);
return node;
}
static tree
do_merge_string_cste (tree cste, const char *string, int string_len, int after)
{
const char *old = TREE_STRING_POINTER (cste);
int old_len = TREE_STRING_LENGTH (cste);
int len = old_len + string_len;
char *new = alloca (len+1);
if (after)
{
memcpy (new, string, string_len);
memcpy (&new [string_len], old, old_len);
}
else
{
memcpy (new, old, old_len);
memcpy (&new [old_len], string, string_len);
}
new [len] = '\0';
return build_string (len, new);
}
static tree
merge_string_cste (tree op1, tree op2, int after)
{
if (TREE_CODE (op2) == STRING_CST)
return do_merge_string_cste (op1, TREE_STRING_POINTER (op2),
TREE_STRING_LENGTH (op2), after);
if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2))
{
static const char *const boolean_true = "true";
static const char *const boolean_false = "false";
static const char *const null_pointer = "null";
char ch[4];
const char *string;
if (op2 == boolean_true_node)
string = boolean_true;
else if (op2 == boolean_false_node)
string = boolean_false;
else if (op2 == null_pointer_node
|| (integer_zerop (op2)
&& TREE_CODE (TREE_TYPE (op2)) == POINTER_TYPE))
string = null_pointer;
else if (TREE_TYPE (op2) == char_type_node)
{
unsigned int c = (unsigned int) TREE_INT_CST_LOW (op2);
unsigned char *p = (unsigned char *) ch;
if (0x01 <= c && c <= 0x7f)
*p++ = (unsigned char) c;
else if (c < 0x7ff)
{
*p++ = (unsigned char) (c >> 6 | 0xc0);
*p++ = (unsigned char) ((c & 0x3f) | 0x80);
}
else
{
*p++ = (unsigned char) (c >> 12 | 0xe0);
*p++ = (unsigned char) (((c >> 6) & 0x3f) | 0x80);
*p++ = (unsigned char) ((c & 0x3f) | 0x80);
}
*p = '\0';
string = ch;
}
else
string = string_convert_int_cst (op2);
return do_merge_string_cste (op1, string, strlen (string), after);
}
return NULL_TREE;
}
static tree
string_constant_concatenation (tree op1, tree op2)
{
if (TREE_CODE (op1) == STRING_CST || (TREE_CODE (op2) == STRING_CST))
{
tree string, rest;
int invert;
string = (TREE_CODE (op1) == STRING_CST ? op1 : op2);
rest = (string == op1 ? op2 : op1);
invert = (string == op1 ? 0 : 1 );
if (TREE_CODE (rest) != STRING_CST
&& !IS_CRAFTED_STRING_BUFFER_P (rest)
&& !JSTRING_TYPE_P (TREE_TYPE (rest))
&& TREE_CODE (rest) == EXPR_WITH_FILE_LOCATION)
{
rest = java_complete_tree (rest);
if (rest == error_mark_node)
return error_mark_node;
rest = fold (rest);
}
return merge_string_cste (string, rest, invert);
}
return NULL_TREE;
}
static tree
build_string_concatenation (tree op1, tree op2)
{
tree result;
int side_effects = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
if (flag_emit_xref)
return build2 (PLUS_EXPR, string_type_node, op1, op2);
if ((result = string_constant_concatenation (op1, op2)))
return result;
if (TREE_CODE (op1) == STRING_CST && TREE_STRING_LENGTH (op1) == 0)
{
op1 = op2;
op2 = NULL_TREE;
}
else if (TREE_CODE (op2) == STRING_CST && TREE_STRING_LENGTH (op2) == 0)
op2 = NULL_TREE;
if (TREE_CODE (op1) == STRING_CST)
op1 = patch_string_cst (op1);
if (op2 && TREE_CODE (op2) == STRING_CST)
op2 = patch_string_cst (op2);
if ((TREE_CODE (op1) == STRING_CST) && !op2)
return op1;
if (!IS_CRAFTED_STRING_BUFFER_P (op1))
{
if (TREE_CONSTANT (op1) && JSTRING_TYPE_P (TREE_TYPE (op1)))
op1 = BUILD_STRING_BUFFER (op1);
else
{
tree aNew = BUILD_STRING_BUFFER (NULL_TREE);
op1 = make_qualified_primary (aNew, BUILD_APPEND (op1), 0);
}
}
if (op2)
{
IS_CRAFTED_STRING_BUFFER_P (op1) = 0;
op1 = make_qualified_primary (op1, BUILD_APPEND (op2), 0);
}
IS_CRAFTED_STRING_BUFFER_P (op1) = 1;
TREE_SIDE_EFFECTS (op1) = side_effects;
return op1;
}
static tree
patch_string (tree node)
{
if (node == error_mark_node)
return error_mark_node;
if (TREE_CODE (node) == STRING_CST)
return patch_string_cst (node);
else if (IS_CRAFTED_STRING_BUFFER_P (node))
{
int saved = ctxp->explicit_constructor_p;
tree invoke = build_method_invocation (wfl_to_string, NULL_TREE);
tree ret;
ctxp->explicit_constructor_p = 0;
ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
ret = force_evaluation_order (ret);
ctxp->explicit_constructor_p = saved;
return ret;
}
return NULL_TREE;
}
static tree
patch_string_cst (tree node)
{
int location;
if (! flag_emit_class_files)
{
node = get_identifier (TREE_STRING_POINTER (node));
location = alloc_name_constant (CONSTANT_String, node);
node = build_ref_from_constant_pool (location);
}
TREE_CONSTANT (node) = 1;
TREE_INVARIANT (node) = 1;
if (! flag_emit_class_files)
node = convert (string_ptr_type_node, node);
else
TREE_TYPE (node) = string_ptr_type_node;
return node;
}
static tree
build_unaryop (int op_token, int op_location, tree op1)
{
enum tree_code op;
tree unaryop;
switch (op_token)
{
case PLUS_TK: op = UNARY_PLUS_EXPR; break;
case MINUS_TK: op = NEGATE_EXPR; break;
case NEG_TK: op = TRUTH_NOT_EXPR; break;
case NOT_TK: op = BIT_NOT_EXPR; break;
default: abort ();
}
unaryop = build1 (op, NULL_TREE, op1);
TREE_SIDE_EFFECTS (unaryop) = 1;
EXPR_WFL_LINECOL (unaryop) = op_location;
return unaryop;
}
static tree
build_incdec (int op_token, int op_location, tree op1, int is_post_p)
{
static const enum tree_code lookup [2][2] =
{
{ PREDECREMENT_EXPR, PREINCREMENT_EXPR, },
{ POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, },
};
tree node = build2 (lookup [is_post_p][(op_token - DECR_TK)],
NULL_TREE, op1, NULL_TREE);
TREE_SIDE_EFFECTS (node) = 1;
EXPR_WFL_LINECOL (node) = op_location;
return node;
}
static tree
build_cast (int location, tree type, tree exp)
{
tree node = build1 (CONVERT_EXPR, type, exp);
EXPR_WFL_LINECOL (node) = location;
return node;
}
static tree
build_incomplete_class_ref (int location, tree class_name)
{
tree node = build1 (CLASS_LITERAL, NULL_TREE, class_name);
tree class_decl = GET_CPC ();
tree this_class = TREE_TYPE (class_decl);
if (!TYPE_DOT_CLASS (this_class)
&& !JPRIMITIVE_TYPE_P (class_name)
&& !(TREE_CODE (class_name) == VOID_TYPE))
{
tree cpc_list = GET_CPC_LIST();
tree cpc = cpc_list;
tree target_class;
while (GET_NEXT_ENCLOSING_CPC(cpc))
cpc = GET_NEXT_ENCLOSING_CPC(cpc);
class_decl = TREE_VALUE (cpc);
target_class = TREE_TYPE (class_decl);
if (CLASS_INTERFACE (TYPE_NAME (target_class)))
{
tree t, inner;
GET_CPC_LIST() = cpc;
t = build_wfl_node (DECL_NAME (TYPE_NAME (object_type_node)));
inner = create_anonymous_class (t);
target_class = TREE_TYPE (inner);
end_class_declaration (1);
GET_CPC_LIST() = cpc_list;
}
if (TYPE_DOT_CLASS (target_class) == NULL_TREE)
build_dot_class_method (target_class);
if (this_class != target_class)
TYPE_DOT_CLASS (this_class) = TYPE_DOT_CLASS (target_class);
}
EXPR_WFL_LINECOL (node) = location;
return node;
}
static tree
patch_incomplete_class_ref (tree node)
{
tree type = TREE_OPERAND (node, 0);
tree ref_type;
if (!(ref_type = resolve_type_during_patch (type)))
return error_mark_node;
if ((! flag_emit_class_files && is_compiled_class (ref_type))
|| JPRIMITIVE_TYPE_P (ref_type)
|| TREE_CODE (ref_type) == VOID_TYPE)
{
tree dot = build_class_ref (ref_type);
if (!flag_emit_class_files)
dot = build_class_init (ref_type, dot);
return java_complete_tree (dot);
}
ref_type = build_dot_class_method_invocation (current_class, ref_type);
return java_complete_tree (ref_type);
}
static tree
patch_unaryop (tree node, tree wfl_op)
{
tree op = TREE_OPERAND (node, 0);
tree op_type = TREE_TYPE (op);
tree prom_type = NULL_TREE, value, decl;
int outer_field_flag = 0;
int code = TREE_CODE (node);
int error_found = 0;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
switch (code)
{
case POSTINCREMENT_EXPR:
case POSTDECREMENT_EXPR:
case PREINCREMENT_EXPR:
case PREDECREMENT_EXPR:
op = decl = extract_field_decl (op);
outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
if (outer_field_flag)
{
if (flag_emit_class_files)
decl = TREE_OPERAND (op, 0);
else
decl = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (op, 0), 0), 0);
decl = DECL_FUNCTION_ACCESS_DECL (decl);
}
else if (!JDECL_P (decl)
&& TREE_CODE (decl) != COMPONENT_REF
&& !(flag_emit_class_files && TREE_CODE (decl) == ARRAY_REF)
&& TREE_CODE (decl) != INDIRECT_REF
&& !(TREE_CODE (decl) == COMPOUND_EXPR
&& TREE_OPERAND (decl, 1)
&& (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)))
{
TREE_TYPE (node) = error_mark_node;
error_found = 1;
}
if (!JNUMERIC_TYPE_P (op_type))
{
parse_error_context
(wfl_op, "Invalid argument type %qs to %qs",
lang_printable_name (op_type, 0), operator_string (node));
TREE_TYPE (node) = error_mark_node;
error_found = 1;
}
else
{
if (JINTEGRAL_TYPE_P (op_type))
{
value = build_int_cst (op_type, 1);
TREE_TYPE (node) = op_type;
}
else
{
value = build_int_cst (NULL_TREE, 1);
TREE_TYPE (node) =
binary_numeric_promotion (op_type,
TREE_TYPE (value), &op, &value);
}
if (outer_field_flag)
{
value = build2 (PLUS_EXPR, TREE_TYPE (op),
build_outer_field_access (wfl_op, decl), value);
return outer_field_access_fix (node, op, value);
}
TREE_OPERAND (node, 0) = op;
TREE_OPERAND (node, 1) = value;
if (JINTEGRAL_TYPE_P (op_type))
return fold (node);
else
return fold (convert (op_type, node));
}
break;
case UNARY_PLUS_EXPR:
case NEGATE_EXPR:
if (!JNUMERIC_TYPE_P (op_type))
{
ERROR_CANT_CONVERT_TO_NUMERIC (wfl_operator, node, op_type);
TREE_TYPE (node) = error_mark_node;
error_found = 1;
}
else
{
op = do_unary_numeric_promotion (op);
prom_type = TREE_TYPE (op);
if (code == UNARY_PLUS_EXPR)
return fold (op);
}
break;
case BIT_NOT_EXPR:
if (!JINTEGRAL_TYPE_P (op_type))
{
ERROR_CAST_NEEDED_TO_INTEGRAL (wfl_operator, node, op_type);
TREE_TYPE (node) = error_mark_node;
error_found = 1;
}
else
{
op = do_unary_numeric_promotion (op);
prom_type = TREE_TYPE (op);
}
break;
case TRUTH_NOT_EXPR:
if (TREE_CODE (op_type) != BOOLEAN_TYPE)
{
ERROR_CANT_CONVERT_TO_BOOLEAN (wfl_operator, node, op_type);
TREE_TYPE (node) = boolean_type_node;
error_found = 1;
}
else
prom_type = boolean_type_node;
break;
case CONVERT_EXPR:
value = patch_cast (node, wfl_operator);
if (value == error_mark_node)
{
TREE_TYPE (node) = error_mark_node;
error_found = 1;
}
else
{
value = fold (value);
return value;
}
break;
}
if (error_found)
return error_mark_node;
TREE_OPERAND (node, 0) = fold (op);
TREE_TYPE (node) = prom_type;
TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (op);
return fold (node);
}
static tree
resolve_type_during_patch (tree type)
{
if (unresolved_type_p (type, NULL))
{
tree type_decl = resolve_and_layout (EXPR_WFL_NODE (type), type);
if (!type_decl)
{
parse_error_context (type,
"Class %qs not found in type declaration",
IDENTIFIER_POINTER (EXPR_WFL_NODE (type)));
return NULL_TREE;
}
check_deprecation (type, type_decl);
return TREE_TYPE (type_decl);
}
return type;
}
static tree
patch_cast (tree node, tree wfl_op)
{
tree op = TREE_OPERAND (node, 0);
tree cast_type = TREE_TYPE (node);
tree patched, op_type;
char *t1;
if ((patched = patch_string (op)))
TREE_OPERAND (node, 0) = op = patched;
op_type = TREE_TYPE (op);
if (!(cast_type = resolve_type_during_patch (cast_type)))
return error_mark_node;
if (JNUMERIC_TYPE_P (cast_type) && JNUMERIC_TYPE_P (op_type))
{
if (cast_type == op_type)
return node;
if (JFLOAT_TYPE_P (op_type) && JINTEGRAL_TYPE_P (cast_type))
if (cast_type != long_type_node)
op = convert (integer_type_node, op);
return convert (cast_type, op);
}
if (op_type == boolean_type_node && cast_type == boolean_type_node)
return node;
if (op == null_pointer_node && JREFERENCE_TYPE_P (cast_type))
return build_null_of_type (cast_type);
if (JREFERENCE_TYPE_P (op_type) && JREFERENCE_TYPE_P (cast_type)
&& valid_ref_assignconv_cast_p (op_type, cast_type, 1))
{
TREE_TYPE (node) = promote_type (cast_type);
if (valid_ref_assignconv_cast_p (op_type, cast_type, 0))
{
TREE_SET_CODE (node, NOP_EXPR);
return node;
}
if (flag_emit_class_files)
{
TREE_SET_CODE (node, CONVERT_EXPR);
return node;
}
return build3 (CALL_EXPR, promote_type (cast_type),
build_address_of (soft_checkcast_node),
tree_cons (NULL_TREE, build_class_ref (cast_type),
build_tree_list (NULL_TREE, op)),
NULL_TREE);
}
t1 = xstrdup (lang_printable_name (op_type, 0));
parse_error_context (wfl_op, "Invalid cast from %qs to %qs",
t1, lang_printable_name (cast_type, 0));
free (t1);
return error_mark_node;
}
static tree
build_null_of_type (tree type)
{
tree node = build_int_cst (promote_type (type), 0);
return node;
}
static tree
build_array_ref (int location, tree array, tree index)
{
tree node = build4 (ARRAY_REF, NULL_TREE, array, index,
NULL_TREE, NULL_TREE);
EXPR_WFL_LINECOL (node) = location;
return node;
}
static tree
patch_array_ref (tree node)
{
tree array = TREE_OPERAND (node, 0);
tree array_type = TREE_TYPE (array);
tree index = TREE_OPERAND (node, 1);
tree index_type = TREE_TYPE (index);
int error_found = 0;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
if (TREE_CODE (array_type) == POINTER_TYPE)
array_type = TREE_TYPE (array_type);
if (!TYPE_ARRAY_P (array_type))
{
parse_error_context
(wfl_operator,
"%<[]%> can only be applied to arrays. It can't be applied to %qs",
lang_printable_name (array_type, 0));
TREE_TYPE (node) = error_mark_node;
error_found = 1;
}
index = do_unary_numeric_promotion (index);
if (TREE_TYPE (index) != int_type_node)
{
if (valid_cast_to_p (index_type, int_type_node))
parse_error_context (wfl_operator,
"Incompatible type for %<[]%>. Explicit cast needed to convert %qs to %<int%>",
lang_printable_name (index_type, 0));
else
parse_error_context (wfl_operator,
"Incompatible type for %<[]%>. Can't convert %qs to %<int%>",
lang_printable_name (index_type, 0));
TREE_TYPE (node) = error_mark_node;
error_found = 1;
}
if (error_found)
return error_mark_node;
array_type = TYPE_ARRAY_ELEMENT (array_type);
if (flag_emit_class_files || flag_emit_xref)
{
TREE_OPERAND (node, 0) = array;
TREE_OPERAND (node, 1) = index;
}
else
node = build_java_arrayaccess (array, array_type, index);
TREE_TYPE (node) = array_type;
return node;
}
static tree
build_newarray_node (tree type, tree dims, int extra_dims)
{
tree node = build3 (NEW_ARRAY_EXPR, NULL_TREE, type,
nreverse (dims),
build_int_cst (NULL_TREE, extra_dims));
return node;
}
static tree
patch_newarray (tree node)
{
tree type = TREE_OPERAND (node, 0);
tree dims = TREE_OPERAND (node, 1);
tree cdim, array_type;
int error_found = 0;
int ndims = 0;
int xdims = TREE_INT_CST_LOW (TREE_OPERAND (node, 2));
for (cdim = dims, ndims = 0; cdim; cdim = TREE_CHAIN (cdim), ndims++ )
{
int dim_error = 0;
tree dim = TREE_VALUE (cdim);
dim = (TREE_CODE (dim) == SAVE_EXPR ? TREE_OPERAND (dim, 0) : dim);
if (!JINTEGRAL_TYPE_P (TREE_TYPE (dim)))
dim_error = 1;
else
{
dim = do_unary_numeric_promotion (dim);
if (TREE_TYPE (dim) != int_type_node)
dim_error = 1;
}
if (dim_error)
{
parse_error_context
(TREE_PURPOSE (cdim),
"Incompatible type for dimension in array creation expression. %s convert %qs to %<int%>",
(valid_cast_to_p (TREE_TYPE (dim), int_type_node) ?
"Explicit cast needed to" : "Can't"),
lang_printable_name (TREE_TYPE (dim), 0));
error_found = 1;
}
TREE_PURPOSE (cdim) = NULL_TREE;
}
if (!(type = resolve_type_during_patch (type)))
error_found = 1;
if (error_found)
{
TREE_TYPE (node) = error_mark_node;
return error_mark_node;
}
if (TREE_CODE (type) == RECORD_TYPE)
type = build_pointer_type (type);
while (--xdims >= 0)
{
type = promote_type (build_java_array_type (type, -1));
}
dims = nreverse (dims);
array_type = type;
for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
{
type = array_type;
array_type
= build_java_array_type (type,
TREE_CODE (cdim) == INTEGER_CST
? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
: -1);
array_type = promote_type (array_type);
}
dims = nreverse (dims);
if (ndims == 1)
return build_new_array (type, TREE_VALUE (dims));
return build3 (CALL_EXPR, array_type,
build_address_of (soft_multianewarray_node),
tree_cons (NULL_TREE,
build_class_ref (TREE_TYPE (array_type)),
tree_cons (NULL_TREE,
build_int_cst (NULL_TREE, ndims),
dims)),
NULL_TREE);
}
static tree
maybe_build_array_element_wfl (tree node)
{
if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
{
return build_expr_wfl (NULL_TREE,
#ifdef USE_MAPPED_LOCATION
input_location
#else
ctxp->filename,
ctxp->lexer->token_start.line,
ctxp->lexer->token_start.col
#endif
);
}
else
return NULL_TREE;
}
static tree
build_new_array_init (int location, tree values)
{
tree constructor = build_constructor (NULL_TREE, values);
tree to_return = build1 (NEW_ARRAY_INIT, NULL_TREE, constructor);
EXPR_WFL_LINECOL (to_return) = location;
return to_return;
}
static tree
patch_new_array_init (tree type, tree node)
{
int error_seen = 0;
tree current, element_type;
HOST_WIDE_INT length;
int all_constant = 1;
tree init = TREE_OPERAND (node, 0);
if (TREE_CODE (type) != POINTER_TYPE || ! TYPE_ARRAY_P (TREE_TYPE (type)))
{
parse_error_context (node,
"Invalid array initializer for non-array type %qs",
lang_printable_name (type, 1));
return error_mark_node;
}
type = TREE_TYPE (type);
element_type = TYPE_ARRAY_ELEMENT (type);
CONSTRUCTOR_ELTS (init) = nreverse (CONSTRUCTOR_ELTS (init));
for (length = 0, current = CONSTRUCTOR_ELTS (init);
current; length++, current = TREE_CHAIN (current))
{
tree elt = TREE_VALUE (current);
if (elt == NULL_TREE || TREE_CODE (elt) != NEW_ARRAY_INIT)
{
error_seen |= array_constructor_check_entry (element_type, current);
elt = TREE_VALUE (current);
if (! TREE_CONSTANT (elt) || TREE_CODE (elt) == INDIRECT_REF)
all_constant = 0;
}
else
{
TREE_VALUE (current) = patch_new_array_init (element_type, elt);
TREE_PURPOSE (current) = NULL_TREE;
all_constant = 0;
}
if (elt && TREE_CODE (elt) == TREE_LIST
&& TREE_VALUE (elt) == error_mark_node)
error_seen = 1;
}
if (error_seen)
return error_mark_node;
type = build_java_array_type (element_type, length);
TREE_TYPE (init) = TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (type))));
TREE_TYPE (node) = promote_type (type);
TREE_CONSTANT (init) = all_constant;
TREE_INVARIANT (init) = all_constant;
TREE_CONSTANT (node) = all_constant;
TREE_INVARIANT (node) = all_constant;
return node;
}
static int
array_constructor_check_entry (tree type, tree entry)
{
char *array_type_string = NULL;
tree value, type_value, new_value, wfl_value, patched;
int error_seen = 0;
new_value = NULL_TREE;
wfl_value = TREE_VALUE (entry);
value = java_complete_tree (TREE_VALUE (entry));
if ((patched = patch_string (value)))
value = patched;
if (value == error_mark_node)
return 1;
type_value = TREE_TYPE (value);
SET_WFL_OPERATOR (wfl_operator, TREE_PURPOSE (entry), wfl_value);
new_value = try_builtin_assignconv (wfl_operator, type, value);
if (!new_value && (new_value = try_reference_assignconv (type, value)))
type_value = promote_type (type);
if (!new_value)
{
const char *const msg = (!valid_cast_to_p (type_value, type) ?
"Can't" : "Explicit cast needed to");
if (!array_type_string)
array_type_string = xstrdup (lang_printable_name (type, 1));
parse_error_context
(wfl_operator, "Incompatible type for array. %s convert %qs to %qs",
msg, lang_printable_name (type_value, 1), array_type_string);
error_seen = 1;
}
if (new_value)
TREE_VALUE (entry) = new_value;
if (array_type_string)
free (array_type_string);
TREE_PURPOSE (entry) = NULL_TREE;
return error_seen;
}
static tree
build_this (int location)
{
tree node = build_wfl_node (this_identifier_node);
TREE_SET_CODE (node, THIS_EXPR);
EXPR_WFL_LINECOL (node) = location;
return node;
}
static tree
build_return (int location, tree op)
{
tree node = build1 (RETURN_EXPR, NULL_TREE, op);
EXPR_WFL_LINECOL (node) = location;
node = build_debugable_stmt (location, node);
return node;
}
static tree
patch_return (tree node)
{
tree return_exp = TREE_OPERAND (node, 0);
tree meth = current_function_decl;
tree mtype = TREE_TYPE (TREE_TYPE (current_function_decl));
int error_found = 0;
TREE_TYPE (node) = error_mark_node;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
if (return_exp && (mtype == void_type_node || DECL_CONSTRUCTOR_P (meth)))
error_found = 1;
if (DECL_CLINIT_P (current_function_decl))
error_found = 1;
if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth)))
error_found = 2;
if (DECL_INSTINIT_P (current_function_decl))
error_found = 1;
if (error_found)
{
if (DECL_INSTINIT_P (current_function_decl))
parse_error_context (wfl_operator,
"%<return%> inside instance initializer");
else if (DECL_CLINIT_P (current_function_decl))
parse_error_context (wfl_operator,
"%<return%> inside static initializer");
else if (!DECL_CONSTRUCTOR_P (meth))
{
char *t = xstrdup (lang_printable_name (mtype, 0));
parse_error_context (wfl_operator,
"%<return%> with%s value from %<%s %s%>",
(error_found == 1 ? "" : "out"),
t, lang_printable_name (meth, 2));
free (t);
}
else
parse_error_context (wfl_operator,
"%<return%> with value from constructor %qs",
lang_printable_name (meth, 2));
return error_mark_node;
}
if (return_exp)
{
tree exp = java_complete_tree (return_exp);
tree modify, patched;
if ((patched = patch_string (exp)))
exp = patched;
modify = build2 (MODIFY_EXPR, NULL_TREE, DECL_RESULT (meth), exp);
EXPR_WFL_LINECOL (modify) = EXPR_WFL_LINECOL (node);
modify = java_complete_tree (modify);
if (modify != error_mark_node)
{
TREE_SIDE_EFFECTS (modify) = 1;
TREE_OPERAND (node, 0) = modify;
}
else
return error_mark_node;
}
TREE_TYPE (node) = void_type_node;
TREE_SIDE_EFFECTS (node) = 1;
return node;
}
static tree
build_if_else_statement (int location, tree expression, tree if_body,
tree else_body)
{
tree node;
if (!else_body)
else_body = build_java_empty_stmt ();
node = build3 (COND_EXPR, NULL_TREE, expression, if_body, else_body);
EXPR_WFL_LINECOL (node) = location;
node = build_debugable_stmt (location, node);
return node;
}
static tree
patch_if_else_statement (tree node)
{
tree expression = TREE_OPERAND (node, 0);
int can_complete_normally
= (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
| CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)));
TREE_TYPE (node) = error_mark_node;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
if (TREE_TYPE (expression) != boolean_type_node
&& TREE_TYPE (expression) != promoted_boolean_type_node)
{
parse_error_context
(wfl_operator,
"Incompatible type for %<if%>. Can't convert %qs to %<boolean%>",
lang_printable_name (TREE_TYPE (expression), 0));
return error_mark_node;
}
TREE_TYPE (node) = void_type_node;
TREE_SIDE_EFFECTS (node) = 1;
CAN_COMPLETE_NORMALLY (node) = can_complete_normally;
return node;
}
static tree
build_labeled_block (int location, tree label)
{
tree label_name ;
tree label_decl, node;
if (label == NULL_TREE || label == continue_identifier_node)
label_name = label;
else
{
label_name = merge_qualified_name (label_id, label);
if (IDENTIFIER_LOCAL_VALUE (label_name))
{
EXPR_WFL_LINECOL (wfl_operator) = location;
parse_error_context (wfl_operator,
"Declaration of %qs shadows a previous label declaration",
IDENTIFIER_POINTER (label));
EXPR_WFL_LINECOL (wfl_operator) =
EXPR_WFL_LINECOL (IDENTIFIER_LOCAL_VALUE (label_name));
parse_error_context (wfl_operator,
"This is the location of the previous declaration of label %qs",
IDENTIFIER_POINTER (label));
java_error_count--;
}
}
label_decl = create_label_decl (label_name);
node = build2 (LABELED_BLOCK_EXPR, NULL_TREE, label_decl, NULL_TREE);
EXPR_WFL_LINECOL (node) = location;
TREE_SIDE_EFFECTS (node) = 1;
return node;
}
static tree
finish_labeled_statement (tree lbe,
tree statement)
{
LABELED_BLOCK_BODY (lbe) = statement;
pop_labeled_block ();
POP_LABELED_BLOCK ();
return lbe;
}
static tree
build_new_loop (tree loop_body)
{
tree loop = build1 (LOOP_EXPR, NULL_TREE, loop_body);
TREE_SIDE_EFFECTS (loop) = 1;
PUSH_LOOP (loop);
return loop;
}
static tree
build_loop_body (int location, tree condition, int reversed)
{
tree first, second, body;
condition = build1 (EXIT_EXPR, NULL_TREE, condition);
EXPR_WFL_LINECOL (condition) = location;
condition = build_debugable_stmt (location, condition);
TREE_SIDE_EFFECTS (condition) = 1;
body = build_labeled_block (0, continue_identifier_node);
first = (reversed ? body : condition);
second = (reversed ? condition : body);
return build2 (COMPOUND_EXPR, NULL_TREE,
build2 (COMPOUND_EXPR, NULL_TREE, first, second),
build_java_empty_stmt ());
}
static tree
finish_loop_body (int location, tree condition, tree body, int reversed)
{
tree to_return = ctxp->current_loop;
tree loop_body = LOOP_EXPR_BODY (to_return);
if (condition)
{
tree cnode = LOOP_EXPR_BODY_CONDITION_EXPR (loop_body, reversed);
EXPR_WFL_LINECOL (cnode) = location;
if (TREE_CODE (cnode) == EXPR_WITH_FILE_LOCATION)
{
cnode = EXPR_WFL_NODE (cnode);
EXPR_WFL_LINECOL (cnode) = location;
}
TREE_OPERAND (cnode, 0) = condition;
}
LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
POP_LOOP ();
return to_return;
}
static tree
finish_for_loop (int location, tree condition, tree update, tree body)
{
tree loop = finish_loop_body (location, condition, body, 0);
if (update != NULL_TREE && !IS_EMPTY_STMT (update))
{
tree up2 = update;
if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
up2 = EXPR_WFL_NODE (up2);
if (up2 != NULL_TREE && !IS_EMPTY_STMT (up2))
{
if (! EXPR_P (up2) || TREE_CODE (up2) == LOOP_EXPR)
abort ();
SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
}
}
LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
return loop;
}
static tree
search_loop (tree statement)
{
if (TREE_CODE (statement) == LOOP_EXPR)
return statement;
if (TREE_CODE (statement) == BLOCK)
statement = BLOCK_SUBBLOCKS (statement);
else
return NULL_TREE;
if (statement && TREE_CODE (statement) == COMPOUND_EXPR)
while (statement && TREE_CODE (statement) == COMPOUND_EXPR)
statement = TREE_OPERAND (statement, 1);
return (TREE_CODE (statement) == LOOP_EXPR
&& FOR_LOOP_P (statement) ? statement : NULL_TREE);
}
static int
labeled_block_contains_loop_p (tree block, tree loop)
{
if (!block)
return 0;
if (LABELED_BLOCK_BODY (block) == loop)
return 1;
if (FOR_LOOP_P (loop) && search_loop (LABELED_BLOCK_BODY (block)) == loop)
return 1;
return 0;
}
static tree
patch_loop_statement (tree loop)
{
tree loop_label;
TREE_TYPE (loop) = void_type_node;
if (labeled_block_contains_loop_p (ctxp->current_labeled_block, loop))
return loop;
loop_label = build_labeled_block (0, NULL_TREE);
LABELED_BLOCK_BODY (loop_label) = loop;
PUSH_LABELED_BLOCK (loop_label);
return loop_label;
}
static tree
build_bc_statement (int location, int is_break, tree name)
{
tree break_continue, label_block_expr = NULL_TREE;
if (name)
{
if (!(label_block_expr = IDENTIFIER_LOCAL_VALUE
(merge_qualified_name (label_id, EXPR_WFL_NODE (name)))))
label_block_expr = EXPR_WFL_NODE (name);
}
break_continue = build1 (EXIT_BLOCK_EXPR, NULL_TREE, label_block_expr);
IS_BREAK_STMT_P (break_continue) = is_break;
TREE_SIDE_EFFECTS (break_continue) = 1;
EXPR_WFL_LINECOL (break_continue) = location;
break_continue = build_debugable_stmt (location, break_continue);
return break_continue;
}
static tree
patch_bc_statement (tree node)
{
tree bc_label = EXIT_BLOCK_LABELED_BLOCK (node), target_stmt;
tree labeled_block = ctxp->current_labeled_block;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
if (bc_label != NULL_TREE && TREE_CODE (bc_label) == IDENTIFIER_NODE)
{
parse_error_context (wfl_operator, "No label definition found for %qs",
IDENTIFIER_POINTER (bc_label));
return error_mark_node;
}
if (! IS_BREAK_STMT_P (node))
{
for (;; labeled_block = TREE_CHAIN (labeled_block))
{
if (labeled_block == NULL_TREE)
{
if (bc_label == NULL_TREE)
parse_error_context (wfl_operator,
"%<continue%> must be in loop");
else
parse_error_context
(wfl_operator, "continue label %qs does not name a loop",
IDENTIFIER_POINTER (bc_label));
return error_mark_node;
}
if ((DECL_NAME (LABELED_BLOCK_LABEL (labeled_block))
== continue_identifier_node)
&& (bc_label == NULL_TREE
|| TREE_CHAIN (labeled_block) == bc_label))
{
bc_label = labeled_block;
break;
}
}
}
else if (!bc_label)
{
for (;; labeled_block = TREE_CHAIN (labeled_block))
{
if (labeled_block == NULL_TREE)
{
parse_error_context (wfl_operator,
"%<break%> must be in loop or switch");
return error_mark_node;
}
target_stmt = LABELED_BLOCK_BODY (labeled_block);
if (TREE_CODE (target_stmt) == SWITCH_EXPR
|| search_loop (target_stmt))
{
bc_label = labeled_block;
break;
}
}
}
EXIT_BLOCK_LABELED_BLOCK (node) = bc_label;
CAN_COMPLETE_NORMALLY (bc_label) = 1;
TREE_TYPE (node) = void_type_node;
node = add_stmt_to_compound (NULL_TREE, void_type_node, node);
TREE_SIDE_EFFECTS (node) = 1;
return node;
}
static tree
patch_exit_expr (tree node)
{
tree expression = TREE_OPERAND (node, 0);
TREE_TYPE (node) = error_mark_node;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
if (TREE_TYPE (expression) != boolean_type_node)
{
parse_error_context
(wfl_operator,
"Incompatible type for loop conditional. Can't convert %qs to %<boolean%>",
lang_printable_name (TREE_TYPE (expression), 0));
return error_mark_node;
}
TREE_OPERAND (node, 0) =
fold (build1 (TRUTH_NOT_EXPR, boolean_type_node, expression));
if (! integer_zerop (TREE_OPERAND (node, 0))
&& ctxp->current_loop != NULL_TREE
&& TREE_CODE (ctxp->current_loop) == LOOP_EXPR)
CAN_COMPLETE_NORMALLY (ctxp->current_loop) = 1;
if (! integer_onep (TREE_OPERAND (node, 0)))
CAN_COMPLETE_NORMALLY (node) = 1;
TREE_TYPE (node) = void_type_node;
return node;
}
static tree
patch_switch_statement (tree node)
{
tree se = TREE_OPERAND (node, 0), se_type;
tree save, iter;
se = TREE_OPERAND (node, 0) = java_complete_tree (se);
se_type = TREE_TYPE (se);
if (! JINTEGRAL_TYPE_P (se_type) || se_type == long_type_node)
{
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
parse_error_context (wfl_operator,
"Incompatible type for %<switch%>. Can't convert %qs to %<int%>",
lang_printable_name (se_type, 0));
TREE_OPERAND (node, 0) = error_mark_node;
return error_mark_node;
}
save = case_label_list;
case_label_list = NULL_TREE;
TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter))
{
HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter));
tree subiter;
for (subiter = TREE_CHAIN (iter);
subiter != NULL_TREE;
subiter = TREE_CHAIN (subiter))
{
HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter));
if (val == subval)
{
EXPR_WFL_LINECOL (wfl_operator)
= EXPR_WFL_LINECOL (TREE_PURPOSE (iter));
parse_error_context (wfl_operator, "duplicate case label: %<"
HOST_WIDE_INT_PRINT_DEC "%>", subval);
EXPR_WFL_LINECOL (wfl_operator)
= EXPR_WFL_LINECOL (TREE_PURPOSE (subiter));
parse_error_context (wfl_operator, "original label is here");
break;
}
}
}
case_label_list = save;
if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK)
{
TREE_TYPE (node) = error_mark_node;
return error_mark_node;
}
TREE_TYPE (node) = void_type_node;
TREE_SIDE_EFFECTS (node) = 1;
CAN_COMPLETE_NORMALLY (node)
= CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))
|| ! SWITCH_HAS_DEFAULT (node);
return node;
}
static tree
build_assertion (
#ifdef USE_MAPPED_LOCATION
source_location location,
#else
int location,
#endif
tree condition, tree value)
{
tree node;
tree klass = GET_CPC ();
if (! enable_assertions (klass))
{
condition = build2 (TRUTH_ANDIF_EXPR, NULL_TREE,
boolean_false_node, condition);
if (value == NULL_TREE)
value = build_java_empty_stmt ();
return build_if_else_statement (location, condition,
value, NULL_TREE);
}
if (! CLASS_USES_ASSERTIONS (klass))
{
tree field, classdollar, id, call;
tree class_type = TREE_TYPE (klass);
field = add_field (class_type,
get_identifier ("$assertionsDisabled"),
boolean_type_node,
ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
FIELD_SYNTHETIC (field) = 1;
classdollar = build_incomplete_class_ref (location, class_type);
id = build_wfl_node (get_identifier ("desiredAssertionStatus"));
call = build3 (CALL_EXPR, NULL_TREE, id, NULL_TREE, NULL_TREE);
call = make_qualified_primary (classdollar, call, location);
TREE_SIDE_EFFECTS (call) = 1;
call = build1 (TRUTH_NOT_EXPR, NULL_TREE, call);
TREE_SIDE_EFFECTS (call) = 1;
DECL_INITIAL (field) = call;
call = build2 (MODIFY_EXPR, NULL_TREE, field, call);
TREE_CHAIN (call) = CPC_STATIC_INITIALIZER_STMT (ctxp);
SET_CPC_STATIC_INITIALIZER_STMT (ctxp, call);
MODIFY_EXPR_FROM_INITIALIZATION_P (call) = 1;
CLASS_USES_ASSERTIONS (klass) = 1;
}
if (value != NULL_TREE)
value = tree_cons (NULL_TREE, value, NULL_TREE);
node = build_wfl_node (get_identifier ("java"));
node = make_qualified_name (node, build_wfl_node (get_identifier ("lang")),
location);
node = make_qualified_name (node, build_wfl_node (get_identifier ("AssertionError")),
location);
node = build3 (NEW_CLASS_EXPR, NULL_TREE, node, value, NULL_TREE);
TREE_SIDE_EFFECTS (node) = 1;
node = build1 (THROW_EXPR, NULL_TREE, node);
TREE_SIDE_EFFECTS (node) = 1;
condition = build1 (TRUTH_NOT_EXPR, NULL_TREE, condition);
condition
= build2 (TRUTH_ANDIF_EXPR, NULL_TREE,
build1 (TRUTH_NOT_EXPR, NULL_TREE,
build_wfl_node (get_identifier ("$assertionsDisabled"))),
condition);
node = build_if_else_statement (location, condition, node, NULL_TREE);
return node;
}
static tree
encapsulate_with_try_catch (int location, tree type_or_name, tree try_stmts,
tree catch_stmts)
{
tree try_block, catch_clause_param, catch_block, catch;
try_block = build_expr_block (try_stmts, NULL_TREE);
if (TREE_CODE (type_or_name) == EXPR_WITH_FILE_LOCATION)
{
tree catch_type = obtain_incomplete_type (type_or_name);
jdep *dep;
catch_clause_param = build_decl (VAR_DECL, wpv_id, catch_type);
register_incomplete_type (JDEP_VARIABLE, type_or_name,
catch_clause_param, catch_type);
dep = CLASSD_LAST (ctxp->classd_list);
JDEP_GET_PATCH (dep) = &TREE_TYPE (catch_clause_param);
}
else
catch_clause_param = build_decl (VAR_DECL, wpv_id,
build_pointer_type (type_or_name));
catch_block = build_expr_block (NULL_TREE, catch_clause_param);
catch = build2 (MODIFY_EXPR, NULL_TREE, catch_clause_param,
build0 (JAVA_EXC_OBJ_EXPR, ptr_type_node));
add_stmt_to_block (catch_block, NULL_TREE, catch);
add_stmt_to_block (catch_block, NULL_TREE, catch_stmts);
catch_block = build1 (JAVA_CATCH_EXPR, NULL_TREE, catch_block);
return build_try_statement (location, try_block, catch_block);
}
static tree
build_try_statement (int location, tree try_block, tree catches)
{
tree node = build2 (TRY_EXPR, NULL_TREE, try_block, catches);
EXPR_WFL_LINECOL (node) = location;
return node;
}
static tree
build_try_finally_statement (int location, tree try_block, tree finally)
{
tree node = build2 (TRY_FINALLY_EXPR, NULL_TREE, try_block, finally);
EXPR_WFL_LINECOL (node) = location;
return node;
}
static tree
patch_try_statement (tree node)
{
int error_found = 0;
tree try = TREE_OPERAND (node, 0);
tree catch = nreverse (TREE_OPERAND (node, 1));
tree current, caught_type_list = NULL_TREE;
for (current = catch; current; current = TREE_CHAIN (current))
{
tree carg_decl, carg_type;
tree sub_current, catch_block, catch_clause;
int unreachable;
catch_clause = TREE_OPERAND (current, 0);
carg_decl = BLOCK_EXPR_DECLS (catch_clause);
carg_type = TREE_TYPE (TREE_TYPE (carg_decl));
if (!inherits_from_p (carg_type, throwable_type_node))
{
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
parse_error_context (wfl_operator,
"Can't catch class %qs. Catch clause parameter type must be a subclass of class %<java.lang.Throwable%>",
lang_printable_name (carg_type, 0));
error_found = 1;
continue;
}
unreachable = 0;
for (sub_current = catch;
sub_current != current; sub_current = TREE_CHAIN (sub_current))
{
tree sub_catch_clause, decl;
sub_catch_clause = TREE_OPERAND (sub_current, 0);
decl = BLOCK_EXPR_DECLS (sub_catch_clause);
if (inherits_from_p (carg_type, TREE_TYPE (TREE_TYPE (decl))))
{
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (current);
parse_error_context
(wfl_operator,
"%<catch%> not reached because of the catch clause at line %d",
EXPR_WFL_LINENO (sub_current));
unreachable = error_found = 1;
break;
}
}
catch_block = java_complete_tree (TREE_OPERAND (current, 0));
if (catch_block == error_mark_node)
{
error_found = 1;
continue;
}
if (CAN_COMPLETE_NORMALLY (catch_block))
CAN_COMPLETE_NORMALLY (node) = 1;
TREE_OPERAND (current, 0) = catch_block;
if (unreachable)
continue;
caught_type_list = tree_cons (NULL_TREE, carg_type, caught_type_list);
}
PUSH_EXCEPTIONS (caught_type_list);
if ((try = java_complete_tree (try)) == error_mark_node)
error_found = 1;
if (CAN_COMPLETE_NORMALLY (try))
CAN_COMPLETE_NORMALLY (node) = 1;
POP_EXCEPTIONS ();
if (error_found)
return error_mark_node;
TREE_OPERAND (node, 0) = try;
TREE_OPERAND (node, 1) = catch;
TREE_TYPE (node) = void_type_node;
return node;
}
static tree
patch_synchronized_statement (tree node, tree wfl_op1)
{
tree expr = java_complete_tree (TREE_OPERAND (node, 0));
tree block = TREE_OPERAND (node, 1);
tree tmp, enter, exit, expr_decl, assignment;
if (expr == error_mark_node)
{
block = java_complete_tree (block);
return expr;
}
if ((tmp = patch_string (expr)))
expr = tmp;
if (!JREFERENCE_TYPE_P (TREE_TYPE (expr)))
{
SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
parse_error_context (wfl_operator, "Incompatible type for %<synchronized%>. Can't convert %qs to %<java.lang.Object%>",
lang_printable_name (TREE_TYPE (expr), 0));
return error_mark_node;
}
if (flag_emit_xref)
{
TREE_OPERAND (node, 0) = expr;
TREE_OPERAND (node, 1) = java_complete_tree (block);
CAN_COMPLETE_NORMALLY (node) = 1;
return node;
}
expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
BUILD_MONITOR_ENTER (enter, expr_decl);
BUILD_MONITOR_EXIT (exit, expr_decl);
CAN_COMPLETE_NORMALLY (enter) = 1;
CAN_COMPLETE_NORMALLY (exit) = 1;
assignment = build2 (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
TREE_SIDE_EFFECTS (assignment) = 1;
node = build2 (COMPOUND_EXPR, NULL_TREE,
build2 (COMPOUND_EXPR, NULL_TREE, assignment, enter),
build2 (TRY_FINALLY_EXPR, NULL_TREE, block, exit));
node = build_expr_block (node, expr_decl);
return java_complete_tree (node);
}
static tree
patch_throw_statement (tree node, tree wfl_op1)
{
tree expr = TREE_OPERAND (node, 0);
tree type = TREE_TYPE (expr);
int unchecked_ok = 0, tryblock_throws_ok = 0;
if (!try_reference_assignconv (throwable_type_node, expr))
{
SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
parse_error_context (wfl_operator,
"Can't throw %qs; it must be a subclass of class %<java.lang.Throwable%>",
lang_printable_name (type, 0));
if (!JREFERENCE_TYPE_P (type))
return error_mark_node;
}
unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type));
SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
if (!unchecked_ok
&& DECL_INSTINIT_P (current_function_decl)
&& !ANONYMOUS_CLASS_P (current_class))
{
tree current;
for (current = TYPE_METHODS (current_class); current;
current = TREE_CHAIN (current))
if (DECL_CONSTRUCTOR_P (current)
&& !check_thrown_exceptions_do (TREE_TYPE (expr)))
{
parse_error_context (wfl_operator, "Checked exception %qs can't be thrown in instance initializer (not all declared constructor are declaring it in their %<throws%> clause)",
lang_printable_name (TREE_TYPE (expr), 0));
return error_mark_node;
}
}
if (!unchecked_ok)
tryblock_throws_ok = check_thrown_exceptions_do (TREE_TYPE (expr));
if (!(unchecked_ok || tryblock_throws_ok))
{
if (IN_TRY_BLOCK_P ())
parse_error_context (wfl_operator, "Checked exception %qs can't be caught by any of the catch clause(s) of the surrounding %<try%> block",
lang_printable_name (type, 0));
else if (!EXCEPTIONS_P (currently_caught_type_list)
&& !tryblock_throws_ok)
{
if (DECL_CLINIT_P (current_function_decl))
parse_error_context (wfl_operator,
"Checked exception %qs can't be thrown in initializer",
lang_printable_name (type, 0));
else
parse_error_context (wfl_operator,
"Checked exception %qs isn't thrown from a %<try%> block",
lang_printable_name (type, 0));
}
else
parse_error_context (wfl_operator, "Checked exception %qs doesn't match any of current method's %<throws%> declaration(s)",
lang_printable_name (type, 0));
return error_mark_node;
}
if (! flag_emit_class_files && ! flag_emit_xref)
BUILD_THROW (node, expr);
if (flag_emit_xref)
EXPR_WFL_LINECOL (node) = EXPR_WFL_LINECOL (wfl_op1);
return node;
}
static void
check_thrown_exceptions (
#ifdef USE_MAPPED_LOCATION
source_location location,
#else
int location,
#endif
tree decl, tree this_expr)
{
tree throws;
int is_array_call = 0;
if (OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
return;
if (this_expr != NULL_TREE
&& TREE_CODE (TREE_TYPE (this_expr)) == POINTER_TYPE
&& TYPE_ARRAY_P (TREE_TYPE (TREE_TYPE (this_expr))))
is_array_call = 1;
for (throws = DECL_FUNCTION_THROWS (decl); throws;
throws = TREE_CHAIN (throws))
if (!check_thrown_exceptions_do (TREE_VALUE (throws)))
{
if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
continue;
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (wfl_operator, location);
#else
EXPR_WFL_LINECOL (wfl_operator) = location;
#endif
if (DECL_FINIT_P (current_function_decl))
parse_error_context
(wfl_operator, "Exception %qs can't be thrown in initializer",
lang_printable_name (TREE_VALUE (throws), 0));
else
{
parse_error_context
(wfl_operator, "Exception %qs must be caught, or it must be declared in the %<throws%> clause of %qs",
lang_printable_name (TREE_VALUE (throws), 0),
(DECL_INIT_P (current_function_decl) ?
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
}
}
}
static int
check_thrown_exceptions_do (tree exception)
{
tree list = currently_caught_type_list;
resolve_and_layout (exception, NULL_TREE);
if (IS_UNCHECKED_EXCEPTION_P (exception))
return 1;
while (list)
{
tree caught;
for (caught = TREE_VALUE (list); caught; caught = TREE_CHAIN (caught))
if (valid_ref_assignconv_cast_p (exception, TREE_VALUE (caught), 0))
return 1;
list = TREE_CHAIN (list);
}
return 0;
}
static void
purge_unchecked_exceptions (tree mdecl)
{
tree throws = DECL_FUNCTION_THROWS (mdecl);
tree new = NULL_TREE;
while (throws)
{
tree next = TREE_CHAIN (throws);
if (!IS_UNCHECKED_EXCEPTION_P (TREE_VALUE (throws)))
{
TREE_CHAIN (throws) = new;
new = throws;
}
throws = next;
}
DECL_FUNCTION_THROWS (mdecl) = new;
}
static bool
ctors_unchecked_throws_clause_p (tree class_type)
{
tree current;
for (current = TYPE_METHODS (class_type); current;
current = TREE_CHAIN (current))
{
bool ctu = false;
if (DECL_CONSTRUCTOR_P (current))
{
tree throws;
for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu;
throws = TREE_CHAIN (throws))
if (inherits_from_p (TREE_VALUE (throws), exception_type_node))
ctu = true;
}
if (!ctu && DECL_CONSTRUCTOR_P (current))
return false;
}
return true;
}
static tree
patch_conditional_expr (tree node, tree wfl_cond, tree wfl_op1)
{
tree cond = TREE_OPERAND (node, 0);
tree op1 = TREE_OPERAND (node, 1);
tree op2 = TREE_OPERAND (node, 2);
tree resulting_type = NULL_TREE;
tree t1, t2, patched;
int error_found = 0;
if ((patched = patch_string (cond)))
TREE_OPERAND (node, 0) = cond = patched;
if ((patched = patch_string (op1)))
TREE_OPERAND (node, 1) = op1 = patched;
if ((patched = patch_string (op2)))
TREE_OPERAND (node, 2) = op2 = patched;
t1 = TREE_TYPE (op1);
t2 = TREE_TYPE (op2);
if (TREE_TYPE (cond) != boolean_type_node)
{
SET_WFL_OPERATOR (wfl_operator, node, wfl_cond);
parse_error_context (wfl_operator,
"Incompatible type for %<?:%>. Can't convert %qs to %<boolean%>",
lang_printable_name (TREE_TYPE (cond), 0));
error_found = 1;
}
if (!((JNUMERIC_TYPE_P (t1) && JNUMERIC_TYPE_P (t2))
|| ((JREFERENCE_TYPE_P (t1) || op1 == null_pointer_node)
&& (JREFERENCE_TYPE_P (t2) || op2 == null_pointer_node))
|| (t1 == boolean_type_node && t2 == boolean_type_node)))
error_found = 1;
else if (t1 == t2)
resulting_type = t1;
else if (JNUMERIC_TYPE_P (t1))
{
if ((t1 == byte_type_node && t2 == short_type_node)
|| (t1 == short_type_node && t2 == byte_type_node))
resulting_type = short_type_node;
else if ((t1 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 1)))
&& JBSC_TYPE_P (t2) && int_fits_type_p (TREE_OPERAND (node, 1), t2))
resulting_type = t2;
else if ((t2 == int_type_node && TREE_CONSTANT (TREE_OPERAND (node, 2)))
&& JBSC_TYPE_P (t1) && int_fits_type_p (TREE_OPERAND (node, 2), t1))
resulting_type = t1;
else
resulting_type = binary_numeric_promotion (t1, t2,
&TREE_OPERAND (node, 1),
&TREE_OPERAND (node, 2));
}
else if (JREFERENCE_TYPE_P (t1) && op2 == null_pointer_node)
resulting_type = t1;
else if (JREFERENCE_TYPE_P (t2) && op1 == null_pointer_node)
resulting_type = t2;
else if ((resulting_type = try_reference_assignconv (t1, op2)))
resulting_type = promote_type (t1);
else if ((resulting_type = try_reference_assignconv (t2, op1)))
resulting_type = promote_type (t2);
if (!resulting_type)
{
char *t = xstrdup (lang_printable_name (t1, 0));
SET_WFL_OPERATOR (wfl_operator, node, wfl_op1);
parse_error_context (wfl_operator,
"Incompatible type for %<?:%>. Can't convert %qs to %qs",
t, lang_printable_name (t2, 0));
free (t);
error_found = 1;
}
if (error_found)
{
TREE_TYPE (node) = error_mark_node;
return error_mark_node;
}
TREE_TYPE (node) = resulting_type;
TREE_SET_CODE (node, COND_EXPR);
CAN_COMPLETE_NORMALLY (node) = 1;
return node;
}
static tree
maybe_build_class_init_for_field (tree decl, tree expr)
{
tree clas = DECL_CONTEXT (decl);
if (flag_emit_class_files || flag_emit_xref)
return expr;
if (TREE_CODE (decl) == VAR_DECL && FIELD_STATIC (decl)
&& FIELD_FINAL (decl))
{
tree init = DECL_INITIAL (decl);
if (init != NULL_TREE)
init = fold_constant_for_init (init, decl);
if (init != NULL_TREE && CONSTANT_VALUE_P (init))
return expr;
}
return build_class_init (clas, expr);
}
static tree
fold_constant_for_init (tree node, tree context)
{
tree op0, op1, val;
enum tree_code code = TREE_CODE (node);
switch (code)
{
case INTEGER_CST:
if (node == null_pointer_node)
return NULL_TREE;
case STRING_CST:
case REAL_CST:
return node;
case PLUS_EXPR:
case MINUS_EXPR:
case MULT_EXPR:
case TRUNC_MOD_EXPR:
case RDIV_EXPR:
case LSHIFT_EXPR:
case RSHIFT_EXPR:
case URSHIFT_EXPR:
case BIT_AND_EXPR:
case BIT_XOR_EXPR:
case BIT_IOR_EXPR:
case TRUTH_ANDIF_EXPR:
case TRUTH_ORIF_EXPR:
case EQ_EXPR:
case NE_EXPR:
case GT_EXPR:
case GE_EXPR:
case LT_EXPR:
case LE_EXPR:
op0 = TREE_OPERAND (node, 0);
op1 = TREE_OPERAND (node, 1);
val = fold_constant_for_init (op0, context);
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 0) = val;
val = fold_constant_for_init (op1, context);
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 1) = val;
return patch_binop (node, op0, op1);
case UNARY_PLUS_EXPR:
case NEGATE_EXPR:
case TRUTH_NOT_EXPR:
case BIT_NOT_EXPR:
case CONVERT_EXPR:
op0 = TREE_OPERAND (node, 0);
val = fold_constant_for_init (op0, context);
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 0) = val;
val = patch_unaryop (node, op0);
if (! TREE_CONSTANT (val))
return NULL_TREE;
return val;
break;
case COND_EXPR:
val = fold_constant_for_init (TREE_OPERAND (node, 0), context);
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 0) = val;
val = fold_constant_for_init (TREE_OPERAND (node, 1), context);
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 1) = val;
val = fold_constant_for_init (TREE_OPERAND (node, 2), context);
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 2) = val;
return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
: TREE_OPERAND (node, 2);
case VAR_DECL:
case FIELD_DECL:
if (! FIELD_FINAL (node)
|| DECL_INITIAL (node) == NULL_TREE)
return NULL_TREE;
val = DECL_INITIAL (node);
DECL_INITIAL (node) = NULL_TREE;
val = fold_constant_for_init (val, node);
if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
DECL_INITIAL (node) = val;
return val;
case EXPR_WITH_FILE_LOCATION:
if (!EXPR_WFL_NODE (node)
|| TREE_CODE (EXPR_WFL_NODE (node)) == IDENTIFIER_NODE)
{
tree name = EXPR_WFL_NODE (node);
tree decl;
if (PRIMARY_P (node))
return NULL_TREE;
else if (! QUALIFIED_P (name))
{
decl = lookup_field_wrapper (DECL_CONTEXT (context), name);
if (decl == NULL_TREE
|| (! FIELD_STATIC (decl) && ! FIELD_FINAL (decl)))
return NULL_TREE;
return fold_constant_for_init (decl, decl);
}
else
{
tree r = NULL_TREE;
tree saved_current_class = current_class;
current_class = DECL_CONTEXT (context);
qualify_ambiguous_name (node);
r = resolve_field_access (node, &decl, NULL);
current_class = saved_current_class;
if (r != error_mark_node && decl != NULL_TREE)
return fold_constant_for_init (decl, decl);
return NULL_TREE;
}
}
else
{
op0 = TREE_OPERAND (node, 0);
val = fold_constant_for_init (op0, context);
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 0) = val;
return val;
}
#ifdef USE_COMPONENT_REF
case IDENTIFIER:
case COMPONENT_REF:
?;
#endif
default:
return NULL_TREE;
}
}
#ifdef USE_COMPONENT_REF
tree
resolve_simple_name (tree name, int context)
{
}
tree
resolve_qualified_name (tree name, int context)
{
}
#endif
void
init_src_parse (void)
{
if (ARRAY_SIZE (ctxp->modifier_ctx) != MODIFIER_TK - PUBLIC_TK)
abort ();
}
static int
emit_test_initialization (void **entry_p, void *info)
{
tree l = (tree) info;
tree decl, init;
tree key = (tree) *entry_p;
tree *ite;
htab_t cf_ht = DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl);
if (current_function_decl == TREE_PURPOSE (l)
&& java_treetreehash_find (cf_ht, key) == NULL)
return true;
ite = java_treetreehash_new (cf_ht, key);
if (*ite == NULL)
{
tree block;
decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node);
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
DECL_CONTEXT (decl) = current_function_decl;
DECL_INITIAL (decl) = boolean_true_node;
DECL_IGNORED_P (decl) = 1;
block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl));
TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block);
BLOCK_EXPR_DECLS (block) = decl;
*ite = decl;
}
else
decl = *ite;
init = build2 (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node);
TREE_SIDE_EFFECTS (init) = 1;
TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init);
TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1;
return true;
}
#ifdef __XGETTEXT__
const char d1[] = N_("syntax error");
const char d2[] = N_("parse error");
const char d3[] = N_("syntax error; also virtual memory exhausted");
const char d4[] = N_("parse error; also virtual memory exhausted");
const char d5[] = N_("syntax error: cannot back up");
const char d6[] = N_("parse error: cannot back up");
#endif
#include "gt-java-parse.h"
#include "gtype-java.h"