diff options
author | Alexandre Petit-Bianco <apbianco@gcc.gnu.org> | 2000-06-21 22:17:35 -0700 |
---|---|---|
committer | Alexandre Petit-Bianco <apbianco@gcc.gnu.org> | 2000-06-21 22:17:35 -0700 |
commit | 9a7ab4b335fbcbe44a95d92defed46c0e16a5b8e (patch) | |
tree | ff9df27c0d4cd502638abc1b22e1967847919550 | |
parent | e605b0403e89c0286910889cfca158bfc2567cfa (diff) | |
download | gcc-9a7ab4b335fbcbe44a95d92defed46c0e16a5b8e.zip gcc-9a7ab4b335fbcbe44a95d92defed46c0e16a5b8e.tar.gz gcc-9a7ab4b335fbcbe44a95d92defed46c0e16a5b8e.tar.bz2 |
[multiple changes]
2000-06-21 Alexandre Petit-Bianco <apbianco@cygnus.com>
* except.c (prepare_eh_table_type): Use `CATCH_ALL_TYPE'.
2000-06-20 Alexandre Petit-Bianco <apbianco@cygnus.com>
* check-init.c (ENABLE_JC1_CHECKING): Replaces ENABLE_CHECKING for
Java specific checks.
* expr.c (build_instanceof): CLASS_INTERFACE and CLASS_FINAL usage
screened by DECL_P.
* java-tree.def (CASE_EXPR): Marked 'e'.
(DEFAULT_EXPR): Likewise.
* jcf-parse.c (set_source_filename): CLASS_COMPLETE_P usage
screened by DECL_P.
* jcf-write.c (ENABLE_JC1_CHECKING): Replaces ENABLE_CHECKING for
Java specific checks.
(generate_bytecode_insns): Test try_block for BLOCK before using
BLOCK_EXPR_BODY.
* parse.y (build_wfl_wrap): Added `location' argument. Set
EXPR_WFL_LINECOL accordingly.
(dim_expr:): Wrap constants with WFLs.
(method_declarator): Use TREE_TYPE not TYPE_NAME on GET_CPC.
(resolve_package): Check for `stmt' not being a BLOCK before
building a debuggable statement with it.
(make_qualified_primary): Added extra parameter to build_wfl_wrap
invocation.
(resolve_field_access): Make sure `decl' is a DECL before treating
it as such.
(maybe_build_primttype_type_ref): Make sure `wfl''s node is an
IDENTIFIER_NODE before treating it as such.
(patch_new_array_init): Make sure `elt' is a TREE_LIST before
treating it as such.
(find_applicable_accessible_methods_list): CLASS_INTERFACE macro
to be applied only on non array types.
2000-06-16 Per Bothner <per@bothner.com>
* java-tree.h (LABEL_RETURN_LABELS, LABEL_PENDING_CHAIN): Don't
define in terms of DECL_RESULT, as that fails when --enable-checking.
2000-06-06 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.h (REGISTER_IMPORT): Use `chainon' to link new entries.
* parse.y (find_in_imports): Returned type changed to void,
leading comment fixed.
(register_package): New function.
(qualify_and_find): Likewise.
(package_declaration:): Use `register_package'.
(single_type_import_declaration:): Removed local variable
`node'. Added missing `;' for consistency.
(type_import_on_demand_declaration:): Use `chainon' to link new
entries.
(lookup_field_wrapper): Lookup local variables defined in outer
contexts first.
(java_complete_class): Don't reverse the list of imported on demand.
(do_resolve_class): Reorganized. Removed local variable
`original_name'. Call `qualify_and_find' with the current package
name, invoke `find_in_imports_on_demand' right after. Call
`qualify_and_find' with the packages we've seen so far. Fixed
operations numbering in comments.
(java_expand_class): Don't reverse `package_list'.
(find_most_specific_methods_list): New local variables `abstract'
and `candidates'. Use them to pick the right method.
(Fixes for the ENABLE_TREE_CHECKING Java run-time build problem:
http://gcc.gnu.org/ml/gcc-patches/2000-06/msg00551.html)
From-SVN: r34642
-rw-r--r-- | gcc/java/ChangeLog | 64 | ||||
-rw-r--r-- | gcc/java/check-init.c | 4 | ||||
-rw-r--r-- | gcc/java/except.c | 2 | ||||
-rw-r--r-- | gcc/java/expr.c | 5 | ||||
-rw-r--r-- | gcc/java/java-tree.def | 4 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 5 | ||||
-rw-r--r-- | gcc/java/jcf-parse.c | 2 | ||||
-rw-r--r-- | gcc/java/jcf-write.c | 5 | ||||
-rw-r--r-- | gcc/java/parse.c | 1097 | ||||
-rw-r--r-- | gcc/java/parse.h | 11 | ||||
-rw-r--r-- | gcc/java/parse.y | 231 |
11 files changed, 806 insertions, 624 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 1c4743f..70b26f0 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,43 @@ +2000-06-21 Alexandre Petit-Bianco <apbianco@cygnus.com> + + * except.c (prepare_eh_table_type): Use `CATCH_ALL_TYPE'. + +2000-06-20 Alexandre Petit-Bianco <apbianco@cygnus.com> + + * check-init.c (ENABLE_JC1_CHECKING): Replaces ENABLE_CHECKING for + Java specific checks. + * expr.c (build_instanceof): CLASS_INTERFACE and CLASS_FINAL usage + screened by DECL_P. + * java-tree.def (CASE_EXPR): Marked 'e'. + (DEFAULT_EXPR): Likewise. + * jcf-parse.c (set_source_filename): CLASS_COMPLETE_P usage + screened by DECL_P. + * jcf-write.c (ENABLE_JC1_CHECKING): Replaces ENABLE_CHECKING for + Java specific checks. + (generate_bytecode_insns): Test try_block for BLOCK before using + BLOCK_EXPR_BODY. + * parse.y (build_wfl_wrap): Added `location' argument. Set + EXPR_WFL_LINECOL accordingly. + (dim_expr:): Wrap constants with WFLs. + (method_declarator): Use TREE_TYPE not TYPE_NAME on GET_CPC. + (resolve_package): Check for `stmt' not being a BLOCK before + building a debuggable statement with it. + (make_qualified_primary): Added extra parameter to build_wfl_wrap + invocation. + (resolve_field_access): Make sure `decl' is a DECL before treating + it as such. + (maybe_build_primttype_type_ref): Make sure `wfl''s node is an + IDENTIFIER_NODE before treating it as such. + (patch_new_array_init): Make sure `elt' is a TREE_LIST before + treating it as such. + (find_applicable_accessible_methods_list): CLASS_INTERFACE macro + to be applied only on non array types. + +2000-06-16 Per Bothner <per@bothner.com> + + * java-tree.h (LABEL_RETURN_LABELS, LABEL_PENDING_CHAIN): Don't + define in terms of DECL_RESULT, as that fails when --enable-checking. + 2000-06-15 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * jcf-write.c (CHECK_PUT): Add static prototype. Make pointer @@ -19,6 +59,30 @@ * lang.c (lang_get_alias_set): Mark parameter with ATTRIBUTE_UNUSED. +2000-06-06 Alexandre Petit-Bianco <apbianco@cygnus.com> + + * parse.h (REGISTER_IMPORT): Use `chainon' to link new entries. + * parse.y (find_in_imports): Returned type changed to void, + leading comment fixed. + (register_package): New function. + (qualify_and_find): Likewise. + (package_declaration:): Use `register_package'. + (single_type_import_declaration:): Removed local variable + `node'. Added missing `;' for consistency. + (type_import_on_demand_declaration:): Use `chainon' to link new + entries. + (lookup_field_wrapper): Lookup local variables defined in outer + contexts first. + (java_complete_class): Don't reverse the list of imported on demand. + (do_resolve_class): Reorganized. Removed local variable + `original_name'. Call `qualify_and_find' with the current package + name, invoke `find_in_imports_on_demand' right after. Call + `qualify_and_find' with the packages we've seen so far. Fixed + operations numbering in comments. + (java_expand_class): Don't reverse `package_list'. + (find_most_specific_methods_list): New local variables `abstract' + and `candidates'. Use them to pick the right method. + Tue Jun 6 11:39:05 2000 Tom Tromey <tromey@ferrule.cygnus.com> * parse.y (check_modifiers_consistency): Don't subtract out diff --git a/gcc/java/check-init.c b/gcc/java/check-init.c index 24be236..ffa65da 100644 --- a/gcc/java/check-init.c +++ b/gcc/java/check-init.c @@ -463,7 +463,7 @@ check_init (exp, before) words tmp = ALLOC_WORDS (2 * num_current_words); words when_true = tmp; words when_false = tmp + num_current_words; -#ifdef ENABLE_CHECKING +#ifdef ENABLE_JC1_CHECKING if (TREE_CODE (alt->block) != LOOP_EXPR) fatal ("internal error in check-init: EXIT_EXPR not in LOOP_EXPR"); #endif @@ -534,7 +534,7 @@ check_init (exp, before) case WITH_CLEANUP_EXPR: { struct alternatives *alt = alternatives; -#ifdef ENABLE_CHECKING +#ifdef ENABLE_JC1_CHECKING if (TREE_CODE (alt->block) != CLEANUP_POINT_EXPR) fatal ("internal error in check-init: WITH_CLEANUP_EXPR not in CLEANUP_POINT_EXPR"); #endif diff --git a/gcc/java/except.c b/gcc/java/except.c index 80f24f8..9075e61 100644 --- a/gcc/java/except.c +++ b/gcc/java/except.c @@ -325,7 +325,7 @@ prepare_eh_table_type (type) push_obstacks (&permanent_obstack, &permanent_obstack); if (type == NULL_TREE) - exp = null_pointer_node; + exp = CATCH_ALL_TYPE; else if (is_compiled_class (type)) exp = build_class_ref (type); else diff --git a/gcc/java/expr.c b/gcc/java/expr.c index 9a583b1..886c0cd 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -1087,7 +1087,8 @@ build_instanceof (value, type) value, boolean_true_node, boolean_false_node); } - else if (! CLASS_INTERFACE (valclass) + else if (DECL_P (klass) && DECL_P (valclass) + && ! CLASS_INTERFACE (valclass) && ! CLASS_INTERFACE (klass) && ! inherits_from_p (type, valtype) && (CLASS_FINAL (klass) @@ -1097,7 +1098,7 @@ build_instanceof (value, type) tree, so we immediately know the answer. */ expr = boolean_false_node; } - else if (CLASS_FINAL (klass)) + else if (DECL_P (klass) && CLASS_FINAL (klass)) { tree save = save_expr (value); expr = build (COND_EXPR, itype, diff --git a/gcc/java/java-tree.def b/gcc/java/java-tree.def index 1b00769..930979b 100644 --- a/gcc/java/java-tree.def +++ b/gcc/java/java-tree.def @@ -42,10 +42,10 @@ DEFTREECODE (THIS_EXPR, "this", '1', 0) /* Case statement expression. Operand 1 is the case value. */ -DEFTREECODE (CASE_EXPR, "case", 'x', 1) +DEFTREECODE (CASE_EXPR, "case", 'e', 1) /* Default statement expression. */ -DEFTREECODE (DEFAULT_EXPR, "default", 'x', 0) +DEFTREECODE (DEFAULT_EXPR, "default", 'e', 0) /* Try expression Operand 0 is the tried block, diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 8f2b2c8..6f3d327 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -465,11 +465,12 @@ struct lang_identifier #define RETURN_MAP_ADJUSTED(NODE) TREE_LANG_FLAG_2(NODE) /* In the label of a sub-routine, a chain of the return location labels. */ -#define LABEL_RETURN_LABELS(node) DECL_RESULT (LABEL_RETURN_LABEL(node)) +#define LABEL_RETURN_LABELS(node) \ + (LABEL_DECL_CHECK (LABEL_RETURN_LABEL(node))->decl.result) /* In a LABEL_DECL, the next pending label. See pending_blocks in expr.c. */ -#define LABEL_PENDING_CHAIN(NODE) DECL_RESULT(NODE) +#define LABEL_PENDING_CHAIN(NODE) (LABEL_DECL_CHECK (NODE)->decl.result) /* In a LABEL_DECL, the corresponding bytecode program counter. */ #define LABEL_PC(NODE) ((NODE)->decl.u2.i) diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index 6ef02bc..bd41b8b 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -193,7 +193,7 @@ set_source_filename (jcf, index) while (c--) \ { \ tree class = get_class_constant (jcf, JCF_readu2 (jcf)); \ - if (!CLASS_COMPLETE_P (class)) \ + if (DECL_P (class) && !CLASS_COMPLETE_P (class)) \ { \ tree outer = TYPE_NAME (get_class_constant (jcf, \ JCF_readu2 (jcf))); \ diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index 483a4a9..3fc8b30 100644 --- a/gcc/java/jcf-write.c +++ b/gcc/java/jcf-write.c @@ -347,7 +347,7 @@ static void append_innerclasses_attribute_entry PARAMS ((struct jcf_partial *, t We assume a local variable 'ptr' points into where we want to write next, and we assume enoygh space has been allocated. */ -#ifdef ENABLE_CHECKING +#ifdef ENABLE_JC1_CHECKING static int CHECK_PUT PARAMS ((void *, struct jcf_partial *, int)); static int @@ -403,7 +403,7 @@ alloc_chunk (last, data, size, work) return chunk; } -#ifdef ENABLE_CHECKING +#ifdef ENABLE_JC1_CHECKING static int CHECK_OP PARAMS ((struct jcf_partial *)); static int @@ -2358,6 +2358,7 @@ generate_bytecode_insns (exp, target, state) } if (CAN_COMPLETE_NORMALLY (try_block) + && TREE_CODE (try_block) == BLOCK && BLOCK_EXPR_BODY (try_block) != empty_stmt_node) emit_goto (finished_label, state); diff --git a/gcc/java/parse.c b/gcc/java/parse.c index 22c5bf1..415d877 100644 --- a/gcc/java/parse.c +++ b/gcc/java/parse.c @@ -174,8 +174,9 @@ static void complete_class_report_errors PARAMS ((jdep *)); static int process_imports PARAMS ((void)); static void read_import_dir PARAMS ((tree)); static int find_in_imports_on_demand PARAMS ((tree)); -static int find_in_imports PARAMS ((tree)); +static void find_in_imports PARAMS ((tree)); static int check_pkg_class_access PARAMS ((tree, tree)); +static void register_package PARAMS ((tree)); static tree resolve_package PARAMS ((tree, tree *)); static tree lookup_package_type PARAMS ((const char *, int)); static tree lookup_package_type_and_set_next PARAMS ((const char *, int, tree *)); @@ -195,6 +196,7 @@ static tree patch_method_invocation PARAMS ((tree, tree, tree, int *, tree *)); static int breakdown_qualified PARAMS ((tree *, tree *, tree)); static tree resolve_and_layout PARAMS ((tree, tree)); +static tree qualify_and_find PARAMS ((tree, tree, tree)); static tree resolve_no_layout PARAMS ((tree, tree)); static int invocation_mode PARAMS ((tree, int)); static tree find_applicable_accessible_methods_list PARAMS ((int, tree, @@ -209,7 +211,7 @@ static tree lookup_method_invoke PARAMS ((int, tree, tree, tree, tree)); static tree register_incomplete_type PARAMS ((int, tree, tree, tree)); static tree obtain_incomplete_type PARAMS ((tree)); static tree java_complete_lhs PARAMS ((tree)); -static tree java_complete_tree PARAMS ((tree)); +tree java_complete_tree PARAMS ((tree)); static tree maybe_generate_pre_expand_clinit PARAMS ((tree)); static int maybe_yank_clinit PARAMS ((tree)); static void java_complete_expand_method PARAMS ((tree)); @@ -255,7 +257,7 @@ static tree build_newarray_node PARAMS ((tree, tree, int)); static tree patch_newarray PARAMS ((tree)); static tree resolve_type_during_patch PARAMS ((tree)); static tree build_this PARAMS ((int)); -static tree build_wfl_wrap PARAMS ((tree)); +static tree build_wfl_wrap PARAMS ((tree, int)); static tree build_return PARAMS ((int, tree)); static tree patch_return PARAMS ((tree)); static tree maybe_access_field PARAMS ((tree, tree, tree)); @@ -486,7 +488,7 @@ static tree package_list = NULL_TREE; } while (0) -#line 415 "./parse.y" +#line 417 "./parse.y" typedef union { tree node; int sub_token; @@ -496,7 +498,7 @@ typedef union { } operator; int value; } YYSTYPE; -#line 425 "./parse.y" +#line 427 "./parse.y" #include "lex.c" #ifndef YYDEBUG @@ -797,57 +799,57 @@ static const short yyrhs[] = { 123, #if YYDEBUG != 0 static const short yyrline[] = { 0, - 574, 580, 582, 583, 584, 585, 586, 590, 592, 595, - 597, 598, 601, 603, 606, 610, 614, 618, 624, 626, - 628, 630, 635, 637, 640, 644, 649, 654, 656, 657, - 658, 659, 660, 661, 662, 665, 670, 676, 678, 681, - 687, 689, 693, 695, 698, 725, 727, 731, 744, 746, - 750, 753, 755, 757, 767, 772, 787, 791, 791, 794, - 794, 796, 798, 803, 807, 809, 811, 813, 817, 819, - 821, 828, 834, 839, 843, 852, 862, 864, 867, 869, - 870, 871, 878, 880, 882, 883, 885, 890, 893, 903, - 906, 908, 912, 915, 922, 928, 936, 938, 940, 942, - 944, 948, 950, 954, 965, 966, 970, 973, 975, 977, - 979, 984, 986, 988, 990, 997, 1003, 1005, 1014, 1016, - 1020, 1025, 1030, 1034, 1039, 1044, 1049, 1056, 1066, 1068, - 1070, 1074, 1077, 1079, 1083, 1085, 1086, 1091, 1097, 1104, - 1120, 1127, 1130, 1133, 1137, 1143, 1147, 1156, 1158, 1160, - 1164, 1166, 1169, 1176, 1184, 1186, 1190, 1197, 1207, 1211, - 1211, 1214, 1214, 1217, 1217, 1220, 1220, 1222, 1226, 1232, - 1237, 1239, 1243, 1246, 1250, 1252, 1255, 1257, 1258, 1260, - 1264, 1268, 1274, 1279, 1282, 1284, 1288, 1294, 1298, 1303, - 1312, 1316, 1321, 1335, 1337, 1340, 1342, 1344, 1351, 1355, - 1358, 1362, 1364, 1365, 1366, 1367, 1368, 1372, 1374, 1375, - 1376, 1377, 1381, 1383, 1384, 1385, 1386, 1387, 1388, 1389, - 1390, 1391, 1392, 1395, 1400, 1411, 1414, 1418, 1425, 1435, - 1441, 1447, 1453, 1455, 1460, 1462, 1467, 1469, 1471, 1473, - 1475, 1479, 1481, 1482, 1483, 1484, 1485, 1486, 1489, 1495, - 1497, 1499, 1503, 1508, 1513, 1519, 1529, 1535, 1537, 1539, - 1546, 1549, 1551, 1553, 1557, 1559, 1562, 1566, 1568, 1571, - 1578, 1584, 1586, 1588, 1592, 1600, 1603, 1605, 1607, 1611, - 1616, 1625, 1630, 1633, 1640, 1642, 1644, 1648, 1651, 1660, - 1667, 1669, 1673, 1686, 1688, 1694, 1700, 1704, 1706, 1710, - 1713, 1715, 1719, 1722, 1724, 1726, 1730, 1733, 1735, 1737, - 1741, 1744, 1746, 1748, 1752, 1758, 1760, 1764, 1771, 1773, - 1775, 1777, 1781, 1793, 1796, 1798, 1803, 1807, 1809, 1816, - 1824, 1841, 1843, 1848, 1852, 1855, 1860, 1862, 1865, 1867, - 1869, 1871, 1872, 1873, 1874, 1875, 1879, 1884, 1886, 1888, - 1890, 1897, 1903, 1912, 1915, 1917, 1919, 1923, 1926, 1928, - 1932, 1938, 1939, 1945, 1946, 1948, 1950, 1952, 1954, 1956, - 1965, 1969, 1999, 2002, 2016, 2019, 2023, 2029, 2034, 2038, - 2041, 2043, 2045, 2049, 2058, 2066, 2068, 2072, 2075, 2079, - 2085, 2087, 2095, 2122, 2124, 2128, 2133, 2140, 2144, 2147, - 2149, 2160, 2171, 2176, 2185, 2187, 2191, 2194, 2196, 2201, - 2206, 2211, 2218, 2220, 2221, 2222, 2225, 2230, 2235, 2237, - 2238, 2240, 2242, 2243, 2245, 2249, 2252, 2256, 2259, 2263, - 2265, 2267, 2269, 2270, 2272, 2276, 2285, 2287, 2289, 2302, - 2304, 2310, 2312, 2314, 2318, 2320, 2325, 2330, 2335, 2337, - 2339, 2343, 2345, 2350, 2355, 2357, 2361, 2363, 2368, 2373, - 2378, 2380, 2382, 2386, 2388, 2393, 2398, 2403, 2408, 2410, - 2412, 2414, 2416, 2418, 2422, 2424, 2429, 2434, 2436, 2440, - 2442, 2447, 2451, 2453, 2458, 2462, 2464, 2469, 2473, 2475, - 2480, 2484, 2486, 2491, 2495, 2497, 2502, 2508, 2510, 2514, - 2516, 2519, 2522, 2530, 2532, 2533, 2536, 2538, 2541, 2545 + 576, 582, 584, 585, 586, 587, 588, 592, 594, 597, + 599, 600, 603, 605, 608, 612, 616, 620, 626, 628, + 630, 632, 637, 639, 642, 646, 651, 656, 658, 659, + 660, 661, 662, 663, 664, 667, 672, 678, 680, 683, + 689, 691, 695, 697, 700, 727, 729, 733, 746, 748, + 752, 755, 757, 759, 769, 774, 789, 793, 793, 796, + 796, 798, 800, 805, 809, 811, 813, 815, 819, 821, + 823, 830, 836, 841, 845, 854, 864, 866, 869, 871, + 872, 873, 880, 882, 884, 885, 887, 892, 895, 905, + 908, 910, 914, 917, 924, 930, 938, 940, 942, 944, + 946, 950, 952, 956, 967, 968, 972, 975, 977, 979, + 981, 986, 988, 990, 992, 999, 1005, 1007, 1016, 1018, + 1022, 1027, 1032, 1036, 1041, 1046, 1051, 1058, 1068, 1070, + 1072, 1076, 1079, 1081, 1085, 1087, 1088, 1093, 1099, 1106, + 1122, 1129, 1132, 1135, 1139, 1145, 1149, 1158, 1160, 1162, + 1166, 1168, 1171, 1178, 1186, 1188, 1192, 1199, 1209, 1213, + 1213, 1216, 1216, 1219, 1219, 1222, 1222, 1224, 1228, 1234, + 1239, 1241, 1245, 1248, 1252, 1254, 1257, 1259, 1260, 1262, + 1266, 1270, 1276, 1281, 1284, 1286, 1290, 1296, 1300, 1305, + 1314, 1318, 1323, 1337, 1339, 1342, 1344, 1346, 1353, 1357, + 1360, 1364, 1366, 1367, 1368, 1369, 1370, 1374, 1376, 1377, + 1378, 1379, 1383, 1385, 1386, 1387, 1388, 1389, 1390, 1391, + 1392, 1393, 1394, 1397, 1402, 1413, 1416, 1420, 1427, 1437, + 1443, 1449, 1455, 1457, 1462, 1464, 1469, 1471, 1473, 1475, + 1477, 1481, 1483, 1484, 1485, 1486, 1487, 1488, 1491, 1497, + 1499, 1501, 1505, 1510, 1515, 1521, 1531, 1537, 1539, 1541, + 1548, 1551, 1553, 1555, 1559, 1561, 1564, 1568, 1570, 1573, + 1580, 1586, 1588, 1590, 1594, 1602, 1605, 1607, 1609, 1613, + 1618, 1627, 1632, 1635, 1642, 1644, 1646, 1650, 1653, 1662, + 1669, 1671, 1675, 1688, 1690, 1696, 1702, 1706, 1708, 1712, + 1715, 1717, 1721, 1724, 1726, 1728, 1732, 1735, 1737, 1739, + 1743, 1746, 1748, 1750, 1754, 1760, 1762, 1766, 1773, 1775, + 1777, 1779, 1783, 1795, 1798, 1800, 1805, 1809, 1811, 1818, + 1826, 1843, 1845, 1850, 1854, 1857, 1862, 1864, 1867, 1869, + 1871, 1873, 1874, 1875, 1876, 1877, 1881, 1886, 1888, 1890, + 1892, 1899, 1905, 1914, 1917, 1919, 1921, 1925, 1928, 1930, + 1934, 1940, 1941, 1947, 1948, 1950, 1952, 1954, 1956, 1958, + 1967, 1971, 2001, 2004, 2018, 2021, 2025, 2031, 2036, 2040, + 2043, 2045, 2047, 2051, 2060, 2068, 2070, 2074, 2077, 2081, + 2092, 2094, 2102, 2129, 2131, 2135, 2140, 2147, 2151, 2154, + 2156, 2167, 2178, 2183, 2192, 2194, 2198, 2201, 2203, 2208, + 2213, 2218, 2225, 2227, 2228, 2229, 2232, 2237, 2242, 2244, + 2245, 2247, 2249, 2250, 2252, 2256, 2259, 2263, 2266, 2270, + 2272, 2274, 2276, 2277, 2279, 2283, 2292, 2294, 2296, 2309, + 2311, 2317, 2319, 2321, 2325, 2327, 2332, 2337, 2342, 2344, + 2346, 2350, 2352, 2357, 2362, 2364, 2368, 2370, 2375, 2380, + 2385, 2387, 2389, 2393, 2395, 2400, 2405, 2410, 2415, 2417, + 2419, 2421, 2423, 2425, 2429, 2431, 2436, 2441, 2443, 2447, + 2449, 2454, 2458, 2460, 2465, 2469, 2471, 2476, 2480, 2482, + 2487, 2491, 2493, 2498, 2502, 2504, 2509, 2515, 2517, 2521, + 2523, 2526, 2529, 2537, 2539, 2540, 2543, 2545, 2548, 2552 }; #endif @@ -2930,71 +2932,71 @@ yyreduce: switch (yyn) { case 1: -#line 576 "./parse.y" +#line 578 "./parse.y" {; break;} case 18: -#line 620 "./parse.y" +#line 622 "./parse.y" { yyval.node = build_java_array_type (yyvsp[-2].node, -1); CLASS_LOADED_P (yyval.node) = 1; ; break;} case 19: -#line 625 "./parse.y" +#line 627 "./parse.y" { yyval.node = build_unresolved_array_type (yyvsp[-2].node); ; break;} case 20: -#line 627 "./parse.y" +#line 629 "./parse.y" { yyval.node = build_unresolved_array_type (yyvsp[-2].node); ; break;} case 21: -#line 629 "./parse.y" +#line 631 "./parse.y" {RULE ("']' expected"); RECOVER;; break;} case 22: -#line 631 "./parse.y" +#line 633 "./parse.y" {RULE ("']' expected"); RECOVER;; break;} case 26: -#line 646 "./parse.y" +#line 648 "./parse.y" { yyval.node = make_qualified_name (yyvsp[-2].node, yyvsp[0].node, yyvsp[-1].operator.location); ; break;} case 28: -#line 655 "./parse.y" +#line 657 "./parse.y" {yyval.node = NULL;; break;} case 36: -#line 667 "./parse.y" +#line 669 "./parse.y" { yyval.node = NULL; ; break;} case 37: -#line 671 "./parse.y" +#line 673 "./parse.y" { yyval.node = NULL; ; break;} case 40: -#line 683 "./parse.y" +#line 685 "./parse.y" { ctxp->package = EXPR_WFL_NODE (yyvsp[-1].node); - package_list = tree_cons (ctxp->package, NULL, package_list); + register_package (ctxp->package); ; break;} case 41: -#line 688 "./parse.y" +#line 690 "./parse.y" {yyerror ("Missing name"); RECOVER;; break;} case 42: -#line 690 "./parse.y" +#line 692 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 45: -#line 700 "./parse.y" +#line 702 "./parse.y" { - tree name = EXPR_WFL_NODE (yyvsp[-1].node), node, last_name; + 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)) @@ -3013,69 +3015,69 @@ case 45: IDENTIFIER_POINTER (name), IDENTIFIER_POINTER (err)); else - REGISTER_IMPORT (yyvsp[-1].node, last_name) + REGISTER_IMPORT (yyvsp[-1].node, last_name); } else REGISTER_IMPORT (yyvsp[-1].node, last_name); ; break;} case 46: -#line 726 "./parse.y" +#line 728 "./parse.y" {yyerror ("Missing name"); RECOVER;; break;} case 47: -#line 728 "./parse.y" +#line 730 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 48: -#line 733 "./parse.y" +#line 735 "./parse.y" { tree name = EXPR_WFL_NODE (yyvsp[-3].node); /* Don't import java.lang.* twice. */ if (name != java_lang_id) { - tree node = build_tree_list (yyvsp[-3].node, NULL_TREE); read_import_dir (yyvsp[-3].node); - TREE_CHAIN (node) = ctxp->import_demand_list; - ctxp->import_demand_list = node; + ctxp->import_demand_list = + chainon (ctxp->import_demand_list, + build_tree_list (yyvsp[-3].node, NULL_TREE)); } ; break;} case 49: -#line 745 "./parse.y" +#line 747 "./parse.y" {yyerror ("'*' expected"); RECOVER;; break;} case 50: -#line 747 "./parse.y" +#line 749 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 51: -#line 752 "./parse.y" +#line 754 "./parse.y" { end_class_declaration (0); ; break;} case 52: -#line 754 "./parse.y" +#line 756 "./parse.y" { end_class_declaration (0); ; break;} case 53: -#line 756 "./parse.y" +#line 758 "./parse.y" { yyval.node = NULL; ; break;} case 54: -#line 758 "./parse.y" +#line 760 "./parse.y" { YYERROR_NOW; yyerror ("Class or interface declaration expected"); ; break;} case 55: -#line 769 "./parse.y" +#line 771 "./parse.y" { yyval.value = (1 << yyvsp[0].value); ; break;} case 56: -#line 773 "./parse.y" +#line 775 "./parse.y" { int acc = (1 << yyvsp[0].value); if (yyval.value & acc) @@ -3089,83 +3091,83 @@ case 56: ; break;} case 57: -#line 789 "./parse.y" +#line 791 "./parse.y" { create_class (yyvsp[-4].value, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 59: -#line 792 "./parse.y" +#line 794 "./parse.y" { create_class (0, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 61: -#line 795 "./parse.y" +#line 797 "./parse.y" {yyerror ("Missing class name"); RECOVER;; break;} case 62: -#line 797 "./parse.y" +#line 799 "./parse.y" {yyerror ("Missing class name"); RECOVER;; break;} case 63: -#line 799 "./parse.y" +#line 801 "./parse.y" { if (!ctxp->class_err) yyerror ("'{' expected"); DRECOVER(class1); ; break;} case 64: -#line 804 "./parse.y" +#line 806 "./parse.y" {if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER;; break;} case 65: -#line 808 "./parse.y" +#line 810 "./parse.y" { yyval.node = NULL; ; break;} case 66: -#line 810 "./parse.y" +#line 812 "./parse.y" { yyval.node = yyvsp[0].node; ; break;} case 67: -#line 812 "./parse.y" +#line 814 "./parse.y" {yyerror ("'{' expected"); ctxp->class_err=1;; break;} case 68: -#line 814 "./parse.y" +#line 816 "./parse.y" {yyerror ("Missing super class name"); ctxp->class_err=1;; break;} case 69: -#line 818 "./parse.y" +#line 820 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 70: -#line 820 "./parse.y" +#line 822 "./parse.y" { yyval.node = yyvsp[0].node; ; break;} case 71: -#line 822 "./parse.y" +#line 824 "./parse.y" { ctxp->class_err=1; yyerror ("Missing interface name"); ; break;} case 72: -#line 830 "./parse.y" +#line 832 "./parse.y" { ctxp->interface_number = 1; yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 73: -#line 835 "./parse.y" +#line 837 "./parse.y" { ctxp->interface_number++; yyval.node = chainon (yyvsp[-2].node, build_tree_list (yyvsp[0].node, NULL_TREE)); ; break;} case 74: -#line 840 "./parse.y" +#line 842 "./parse.y" {yyerror ("Missing interface name"); RECOVER;; break;} case 75: -#line 845 "./parse.y" +#line 847 "./parse.y" { /* Store the location of the `}' when doing xrefs */ if (flag_emit_xref) @@ -3175,7 +3177,7 @@ case 75: ; break;} case 76: -#line 853 "./parse.y" +#line 855 "./parse.y" { /* Store the location of the `}' when doing xrefs */ if (flag_emit_xref) @@ -3185,30 +3187,30 @@ case 76: ; break;} case 82: -#line 872 "./parse.y" +#line 874 "./parse.y" { TREE_CHAIN (yyvsp[0].node) = CPC_INSTANCE_INITIALIZER_STMT (ctxp); SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, yyvsp[0].node); ; break;} case 84: -#line 881 "./parse.y" +#line 883 "./parse.y" { yyval.node = yyvsp[-1].node; ; break;} case 86: -#line 884 "./parse.y" +#line 886 "./parse.y" { end_class_declaration (1); ; break;} case 87: -#line 886 "./parse.y" +#line 888 "./parse.y" { end_class_declaration (1); ; break;} case 88: -#line 892 "./parse.y" +#line 894 "./parse.y" { register_fields (0, yyvsp[-2].node, yyvsp[-1].node); ; break;} case 89: -#line 894 "./parse.y" +#line 896 "./parse.y" { check_modifiers ("Illegal modifier `%s' for field declaration", @@ -3218,19 +3220,19 @@ case 89: ; break;} case 91: -#line 907 "./parse.y" +#line 909 "./parse.y" { yyval.node = chainon (yyvsp[-2].node, yyvsp[0].node); ; break;} case 92: -#line 909 "./parse.y" +#line 911 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 93: -#line 914 "./parse.y" +#line 916 "./parse.y" { yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 94: -#line 916 "./parse.y" +#line 918 "./parse.y" { if (java_error_count) yyvsp[0].node = NULL_TREE; @@ -3239,7 +3241,7 @@ case 94: ; break;} case 95: -#line 923 "./parse.y" +#line 925 "./parse.y" { yyerror ("Missing variable initializer"); yyval.node = build_tree_list (yyvsp[-2].node, NULL_TREE); @@ -3247,7 +3249,7 @@ case 95: ; break;} case 96: -#line 929 "./parse.y" +#line 931 "./parse.y" { yyerror ("';' expected"); yyval.node = build_tree_list (yyvsp[-3].node, NULL_TREE); @@ -3255,23 +3257,23 @@ case 96: ; break;} case 98: -#line 939 "./parse.y" +#line 941 "./parse.y" { yyval.node = build_unresolved_array_type (yyvsp[-2].node); ; break;} case 99: -#line 941 "./parse.y" +#line 943 "./parse.y" {yyerror ("Invalid declaration"); DRECOVER(vdi);; break;} case 100: -#line 943 "./parse.y" +#line 945 "./parse.y" {yyerror ("']' expected"); DRECOVER(vdi);; break;} case 101: -#line 945 "./parse.y" +#line 947 "./parse.y" {yyerror ("Unbalanced ']'"); DRECOVER(vdi);; break;} case 104: -#line 956 "./parse.y" +#line 958 "./parse.y" { current_function_decl = yyvsp[0].node; if (current_function_decl @@ -3282,68 +3284,68 @@ case 104: ; break;} case 105: -#line 965 "./parse.y" +#line 967 "./parse.y" { finish_method_declaration (yyvsp[0].node); ; break;} case 106: -#line 967 "./parse.y" +#line 969 "./parse.y" {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;; break;} case 107: -#line 972 "./parse.y" +#line 974 "./parse.y" { yyval.node = method_header (0, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 108: -#line 974 "./parse.y" +#line 976 "./parse.y" { yyval.node = method_header (0, void_type_node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 109: -#line 976 "./parse.y" +#line 978 "./parse.y" { yyval.node = method_header (yyvsp[-3].value, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 110: -#line 978 "./parse.y" +#line 980 "./parse.y" { yyval.node = method_header (yyvsp[-3].value, void_type_node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 111: -#line 980 "./parse.y" +#line 982 "./parse.y" { yyerror ("Invalid method declaration, method name required"); RECOVER; ; break;} case 112: -#line 985 "./parse.y" +#line 987 "./parse.y" {RECOVER;; break;} case 113: -#line 987 "./parse.y" +#line 989 "./parse.y" {yyerror ("Identifier expected"); RECOVER;; break;} case 114: -#line 989 "./parse.y" +#line 991 "./parse.y" {yyerror ("Identifier expected"); RECOVER;; break;} case 115: -#line 991 "./parse.y" +#line 993 "./parse.y" { yyerror ("Invalid method declaration, return type required"); RECOVER; ; break;} case 116: -#line 999 "./parse.y" +#line 1001 "./parse.y" { ctxp->formal_parameter_number = 0; yyval.node = method_declarator (yyvsp[-2].node, NULL_TREE); ; break;} case 117: -#line 1004 "./parse.y" +#line 1006 "./parse.y" { yyval.node = method_declarator (yyvsp[-3].node, yyvsp[-1].node); ; break;} case 118: -#line 1006 "./parse.y" +#line 1008 "./parse.y" { EXPR_WFL_LINECOL (wfl_operator) = yyvsp[-1].operator.location; TREE_PURPOSE (yyvsp[-2].node) = @@ -3354,59 +3356,59 @@ case 118: ; break;} case 119: -#line 1015 "./parse.y" +#line 1017 "./parse.y" {yyerror ("')' expected"); DRECOVER(method_declarator);; break;} case 120: -#line 1017 "./parse.y" +#line 1019 "./parse.y" {yyerror ("']' expected"); RECOVER;; break;} case 121: -#line 1022 "./parse.y" +#line 1024 "./parse.y" { ctxp->formal_parameter_number = 1; ; break;} case 122: -#line 1026 "./parse.y" +#line 1028 "./parse.y" { ctxp->formal_parameter_number += 1; yyval.node = chainon (yyvsp[-2].node, yyvsp[0].node); ; break;} case 123: -#line 1031 "./parse.y" +#line 1033 "./parse.y" { yyerror ("Missing formal parameter term"); RECOVER; ; break;} case 124: -#line 1036 "./parse.y" +#line 1038 "./parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[-1].node); ; break;} case 125: -#line 1040 "./parse.y" +#line 1042 "./parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[-1].node); ARG_FINAL_P (yyval.node) = 1; ; break;} case 126: -#line 1045 "./parse.y" +#line 1047 "./parse.y" { yyerror ("Missing identifier"); RECOVER; yyval.node = NULL_TREE; ; break;} case 127: -#line 1050 "./parse.y" +#line 1052 "./parse.y" { yyerror ("Missing identifier"); RECOVER; yyval.node = NULL_TREE; ; break;} case 128: -#line 1058 "./parse.y" +#line 1060 "./parse.y" { check_modifiers ("Illegal modifier `%s'. Only `final' was expected here", yyvsp[0].value, ACC_FINAL); @@ -3415,49 +3417,49 @@ case 128: ; break;} case 129: -#line 1067 "./parse.y" +#line 1069 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 130: -#line 1069 "./parse.y" +#line 1071 "./parse.y" { yyval.node = yyvsp[0].node; ; break;} case 131: -#line 1071 "./parse.y" +#line 1073 "./parse.y" {yyerror ("Missing class type term"); RECOVER;; break;} case 132: -#line 1076 "./parse.y" +#line 1078 "./parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[0].node); ; break;} case 133: -#line 1078 "./parse.y" +#line 1080 "./parse.y" { yyval.node = tree_cons (yyvsp[0].node, yyvsp[0].node, yyvsp[-2].node); ; break;} case 134: -#line 1080 "./parse.y" +#line 1082 "./parse.y" {yyerror ("Missing class type term"); RECOVER;; break;} case 137: -#line 1087 "./parse.y" +#line 1089 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 138: -#line 1093 "./parse.y" +#line 1095 "./parse.y" { TREE_CHAIN (yyvsp[0].node) = CPC_STATIC_INITIALIZER_STMT (ctxp); SET_CPC_STATIC_INITIALIZER_STMT (ctxp, yyvsp[0].node); ; break;} case 139: -#line 1098 "./parse.y" +#line 1100 "./parse.y" { TREE_CHAIN (yyvsp[-1].node) = CPC_STATIC_INITIALIZER_STMT (ctxp); SET_CPC_STATIC_INITIALIZER_STMT (ctxp, yyvsp[-1].node); ; break;} case 140: -#line 1106 "./parse.y" +#line 1108 "./parse.y" { check_modifiers ("Illegal modifier `%s' for static initializer", yyvsp[0].value, ACC_STATIC); /* Can't have a static initializer in an innerclass */ @@ -3471,56 +3473,56 @@ case 140: ; break;} case 141: -#line 1122 "./parse.y" +#line 1124 "./parse.y" { current_function_decl = yyvsp[0].node; source_start_java_method (current_function_decl); ; break;} case 142: -#line 1127 "./parse.y" +#line 1129 "./parse.y" { finish_method_declaration (yyvsp[0].node); ; break;} case 143: -#line 1132 "./parse.y" +#line 1134 "./parse.y" { yyval.node = method_header (0, NULL_TREE, yyvsp[-1].node, yyvsp[0].node); ; break;} case 144: -#line 1134 "./parse.y" +#line 1136 "./parse.y" { yyval.node = method_header (yyvsp[-2].value, NULL_TREE, yyvsp[-1].node, yyvsp[0].node); ; break;} case 145: -#line 1139 "./parse.y" +#line 1141 "./parse.y" { ctxp->formal_parameter_number = 0; yyval.node = method_declarator (yyvsp[-2].node, NULL_TREE); ; break;} case 146: -#line 1144 "./parse.y" +#line 1146 "./parse.y" { yyval.node = method_declarator (yyvsp[-3].node, yyvsp[-1].node); ; break;} case 147: -#line 1152 "./parse.y" +#line 1154 "./parse.y" { BLOCK_EXPR_BODY (yyvsp[0].node) = empty_stmt_node; yyval.node = yyvsp[0].node; ; break;} case 148: -#line 1157 "./parse.y" +#line 1159 "./parse.y" { yyval.node = yyvsp[0].node; ; break;} case 149: -#line 1159 "./parse.y" +#line 1161 "./parse.y" { yyval.node = yyvsp[0].node; ; break;} case 150: -#line 1161 "./parse.y" +#line 1163 "./parse.y" { yyval.node = yyvsp[0].node; ; break;} case 153: -#line 1171 "./parse.y" +#line 1173 "./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); @@ -3528,7 +3530,7 @@ case 153: ; break;} case 154: -#line 1177 "./parse.y" +#line 1179 "./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); @@ -3536,15 +3538,15 @@ case 154: ; break;} case 155: -#line 1185 "./parse.y" +#line 1187 "./parse.y" {yyval.node = parse_jdk1_1_error ("explicit constructor invocation"); ; break;} case 156: -#line 1187 "./parse.y" +#line 1189 "./parse.y" {yyval.node = parse_jdk1_1_error ("explicit constructor invocation"); ; break;} case 157: -#line 1192 "./parse.y" +#line 1194 "./parse.y" { tree wfl = build_wfl_node (this_identifier_node); EXPR_WFL_LINECOL (wfl) = yyvsp[0].operator.location; @@ -3552,7 +3554,7 @@ case 157: ; break;} case 158: -#line 1198 "./parse.y" +#line 1200 "./parse.y" { tree wfl = build_wfl_node (super_identifier_node); EXPR_WFL_LINECOL (wfl) = yyvsp[0].operator.location; @@ -3560,109 +3562,109 @@ case 158: ; break;} case 159: -#line 1209 "./parse.y" +#line 1211 "./parse.y" { create_interface (0, yyvsp[0].node, NULL_TREE); ; break;} case 161: -#line 1212 "./parse.y" +#line 1214 "./parse.y" { create_interface (yyvsp[-2].value, yyvsp[0].node, NULL_TREE); ; break;} case 163: -#line 1215 "./parse.y" +#line 1217 "./parse.y" { create_interface (0, yyvsp[-1].node, yyvsp[0].node); ; break;} case 165: -#line 1218 "./parse.y" +#line 1220 "./parse.y" { create_interface (yyvsp[-3].value, yyvsp[-1].node, yyvsp[0].node); ; break;} case 167: -#line 1221 "./parse.y" +#line 1223 "./parse.y" {yyerror ("'{' expected"); RECOVER;; break;} case 168: -#line 1223 "./parse.y" +#line 1225 "./parse.y" {yyerror ("'{' expected"); RECOVER;; break;} case 169: -#line 1228 "./parse.y" +#line 1230 "./parse.y" { ctxp->interface_number = 1; yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 170: -#line 1233 "./parse.y" +#line 1235 "./parse.y" { ctxp->interface_number++; yyval.node = chainon (yyvsp[-2].node, build_tree_list (yyvsp[0].node, NULL_TREE)); ; break;} case 171: -#line 1238 "./parse.y" +#line 1240 "./parse.y" {yyerror ("Invalid interface type"); RECOVER;; break;} case 172: -#line 1240 "./parse.y" +#line 1242 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 173: -#line 1245 "./parse.y" +#line 1247 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 174: -#line 1247 "./parse.y" +#line 1249 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 179: -#line 1259 "./parse.y" +#line 1261 "./parse.y" { end_class_declaration (1); ; break;} case 180: -#line 1261 "./parse.y" +#line 1263 "./parse.y" { end_class_declaration (1); ; break;} case 182: -#line 1270 "./parse.y" +#line 1272 "./parse.y" { check_abstract_method_header (yyvsp[-1].node); current_function_decl = NULL_TREE; /* FIXME ? */ ; break;} case 183: -#line 1275 "./parse.y" +#line 1277 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 184: -#line 1281 "./parse.y" +#line 1283 "./parse.y" { yyval.node = build_new_array_init (yyvsp[-1].operator.location, NULL_TREE); ; break;} case 185: -#line 1283 "./parse.y" +#line 1285 "./parse.y" { yyval.node = build_new_array_init (yyvsp[-2].operator.location, yyvsp[-1].node); ; break;} case 186: -#line 1285 "./parse.y" +#line 1287 "./parse.y" { yyval.node = build_new_array_init (yyvsp[-3].operator.location, yyvsp[-2].node); ; break;} case 187: -#line 1290 "./parse.y" +#line 1292 "./parse.y" { yyval.node = tree_cons (maybe_build_array_element_wfl (yyvsp[0].node), yyvsp[0].node, NULL_TREE); ; break;} case 188: -#line 1295 "./parse.y" +#line 1297 "./parse.y" { yyval.node = tree_cons (maybe_build_array_element_wfl (yyvsp[0].node), yyvsp[0].node, yyvsp[-2].node); ; break;} case 189: -#line 1299 "./parse.y" +#line 1301 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 190: -#line 1305 "./parse.y" +#line 1307 "./parse.y" { /* Store the location of the `}' when doing xrefs */ if (current_function_decl && flag_emit_xref) @@ -3672,15 +3674,15 @@ case 190: ; break;} case 191: -#line 1313 "./parse.y" +#line 1315 "./parse.y" { yyval.node = yyvsp[0].node; ; break;} case 192: -#line 1318 "./parse.y" +#line 1320 "./parse.y" { enter_block (); ; break;} case 193: -#line 1323 "./parse.y" +#line 1325 "./parse.y" { maybe_absorb_scoping_blocks (); /* Store the location of the `}' when doing xrefs */ @@ -3693,38 +3695,38 @@ case 193: ; break;} case 197: -#line 1343 "./parse.y" +#line 1345 "./parse.y" { java_method_add_stmt (current_function_decl, yyvsp[0].node); ; break;} case 198: -#line 1345 "./parse.y" +#line 1347 "./parse.y" { LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1; end_class_declaration (1); ; break;} case 200: -#line 1357 "./parse.y" +#line 1359 "./parse.y" { declare_local_variables (0, yyvsp[-1].node, yyvsp[0].node); ; break;} case 201: -#line 1359 "./parse.y" +#line 1361 "./parse.y" { declare_local_variables (yyvsp[-2].value, yyvsp[-1].node, yyvsp[0].node); ; break;} case 207: -#line 1369 "./parse.y" +#line 1371 "./parse.y" { yyval.node = exit_block (); ; break;} case 212: -#line 1378 "./parse.y" +#line 1380 "./parse.y" { yyval.node = exit_block (); ; break;} case 224: -#line 1397 "./parse.y" +#line 1399 "./parse.y" { yyval.node = empty_stmt_node; ; break;} case 225: -#line 1402 "./parse.y" +#line 1404 "./parse.y" { yyval.node = build_labeled_block (EXPR_WFL_LINECOL (yyvsp[-1].node), EXPR_WFL_NODE (yyvsp[-1].node)); @@ -3734,19 +3736,19 @@ case 225: ; break;} case 226: -#line 1413 "./parse.y" +#line 1415 "./parse.y" { yyval.node = finish_labeled_statement (yyvsp[-1].node, yyvsp[0].node); ; break;} case 227: -#line 1415 "./parse.y" +#line 1417 "./parse.y" {yyerror ("':' expected"); RECOVER;; break;} case 228: -#line 1420 "./parse.y" +#line 1422 "./parse.y" { yyval.node = finish_labeled_statement (yyvsp[-1].node, yyvsp[0].node); ; break;} case 229: -#line 1427 "./parse.y" +#line 1429 "./parse.y" { /* We have a statement. Generate a WFL around it so we can debug it */ @@ -3757,7 +3759,7 @@ case 229: ; break;} case 230: -#line 1436 "./parse.y" +#line 1438 "./parse.y" { if (ctxp->prevent_ese != lineno) yyerror ("Invalid expression statement"); @@ -3765,7 +3767,7 @@ case 230: ; break;} case 231: -#line 1442 "./parse.y" +#line 1444 "./parse.y" { if (ctxp->prevent_ese != lineno) yyerror ("Invalid expression statement"); @@ -3773,7 +3775,7 @@ case 231: ; break;} case 232: -#line 1448 "./parse.y" +#line 1450 "./parse.y" { if (ctxp->prevent_ese != lineno) yyerror ("Invalid expression statement"); @@ -3781,82 +3783,82 @@ case 232: ; break;} case 233: -#line 1454 "./parse.y" +#line 1456 "./parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 234: -#line 1456 "./parse.y" +#line 1458 "./parse.y" { parse_ctor_invocation_error (); RECOVER; ; break;} case 235: -#line 1461 "./parse.y" +#line 1463 "./parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 236: -#line 1463 "./parse.y" +#line 1465 "./parse.y" { parse_ctor_invocation_error (); RECOVER; ; break;} case 237: -#line 1468 "./parse.y" +#line 1470 "./parse.y" {yyerror ("'(' expected"); RECOVER;; break;} case 238: -#line 1470 "./parse.y" +#line 1472 "./parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 239: -#line 1472 "./parse.y" +#line 1474 "./parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 240: -#line 1474 "./parse.y" +#line 1476 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 241: -#line 1476 "./parse.y" +#line 1478 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 249: -#line 1491 "./parse.y" +#line 1493 "./parse.y" { yyval.node = build_if_else_statement (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node, NULL_TREE); ; break;} case 250: -#line 1496 "./parse.y" +#line 1498 "./parse.y" {yyerror ("'(' expected"); RECOVER;; break;} case 251: -#line 1498 "./parse.y" +#line 1500 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 252: -#line 1500 "./parse.y" +#line 1502 "./parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 253: -#line 1505 "./parse.y" +#line 1507 "./parse.y" { yyval.node = build_if_else_statement (yyvsp[-5].operator.location, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; break;} case 254: -#line 1510 "./parse.y" +#line 1512 "./parse.y" { yyval.node = build_if_else_statement (yyvsp[-5].operator.location, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; break;} case 255: -#line 1515 "./parse.y" +#line 1517 "./parse.y" { enter_block (); ; break;} case 256: -#line 1519 "./parse.y" +#line 1521 "./parse.y" { /* Make into "proper list" of COMPOUND_EXPRs. I.e. make the last statment also have its own @@ -3867,42 +3869,42 @@ case 256: ; break;} case 257: -#line 1531 "./parse.y" +#line 1533 "./parse.y" { yyval.node = build (SWITCH_EXPR, NULL_TREE, yyvsp[-1].node, NULL_TREE); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-2].operator.location; ; break;} case 258: -#line 1536 "./parse.y" +#line 1538 "./parse.y" {yyerror ("'(' expected"); RECOVER;; break;} case 259: -#line 1538 "./parse.y" +#line 1540 "./parse.y" {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);; break;} case 260: -#line 1540 "./parse.y" +#line 1542 "./parse.y" {yyerror ("'{' expected"); RECOVER;; break;} case 261: -#line 1548 "./parse.y" +#line 1550 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 262: -#line 1550 "./parse.y" +#line 1552 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 263: -#line 1552 "./parse.y" +#line 1554 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 264: -#line 1554 "./parse.y" +#line 1556 "./parse.y" { yyval.node = NULL_TREE; ; break;} case 270: -#line 1573 "./parse.y" +#line 1575 "./parse.y" { tree lab = build1 (CASE_EXPR, NULL_TREE, yyvsp[-1].node); EXPR_WFL_LINECOL (lab) = yyvsp[-2].operator.location; @@ -3910,7 +3912,7 @@ case 270: ; break;} case 271: -#line 1579 "./parse.y" +#line 1581 "./parse.y" { tree lab = build1 (DEFAULT_EXPR, NULL_TREE, NULL_TREE); EXPR_WFL_LINECOL (lab) = yyvsp[-1].operator.location; @@ -3918,61 +3920,61 @@ case 271: ; break;} case 272: -#line 1585 "./parse.y" +#line 1587 "./parse.y" {yyerror ("Missing or invalid constant expression"); RECOVER;; break;} case 273: -#line 1587 "./parse.y" +#line 1589 "./parse.y" {yyerror ("':' expected"); RECOVER;; break;} case 274: -#line 1589 "./parse.y" +#line 1591 "./parse.y" {yyerror ("':' expected"); RECOVER;; break;} case 275: -#line 1594 "./parse.y" +#line 1596 "./parse.y" { tree body = build_loop_body (yyvsp[-2].operator.location, yyvsp[-1].node, 0); yyval.node = build_new_loop (body); ; break;} case 276: -#line 1602 "./parse.y" +#line 1604 "./parse.y" { yyval.node = finish_loop_body (0, NULL_TREE, yyvsp[0].node, 0); ; break;} case 277: -#line 1604 "./parse.y" +#line 1606 "./parse.y" {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;; break;} case 278: -#line 1606 "./parse.y" +#line 1608 "./parse.y" {yyerror ("Missing term and ')' expected"); RECOVER;; break;} case 279: -#line 1608 "./parse.y" +#line 1610 "./parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 280: -#line 1613 "./parse.y" +#line 1615 "./parse.y" { yyval.node = finish_loop_body (0, NULL_TREE, yyvsp[0].node, 0); ; break;} case 281: -#line 1618 "./parse.y" +#line 1620 "./parse.y" { tree body = build_loop_body (0, NULL_TREE, 1); yyval.node = build_new_loop (body); ; break;} case 282: -#line 1627 "./parse.y" +#line 1629 "./parse.y" { yyval.node = finish_loop_body (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[-5].node, 1); ; break;} case 283: -#line 1632 "./parse.y" +#line 1634 "./parse.y" { yyval.node = finish_for_loop (EXPR_WFL_LINECOL (yyvsp[-4].node), yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; break;} case 284: -#line 1634 "./parse.y" +#line 1636 "./parse.y" { yyval.node = finish_for_loop (0, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); /* We have not condition, so we get rid of the EXIT_EXPR */ @@ -3981,23 +3983,23 @@ case 284: ; break;} case 285: -#line 1641 "./parse.y" +#line 1643 "./parse.y" {yyerror ("Invalid control expression"); RECOVER;; break;} case 286: -#line 1643 "./parse.y" +#line 1645 "./parse.y" {yyerror ("Invalid update expression"); RECOVER;; break;} case 287: -#line 1645 "./parse.y" +#line 1647 "./parse.y" {yyerror ("Invalid update expression"); RECOVER;; break;} case 288: -#line 1650 "./parse.y" +#line 1652 "./parse.y" { yyval.node = finish_for_loop (EXPR_WFL_LINECOL (yyvsp[-4].node), yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node);; break;} case 289: -#line 1652 "./parse.y" +#line 1654 "./parse.y" { yyval.node = finish_for_loop (0, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); /* We have not condition, so we get rid of the EXIT_EXPR */ @@ -4006,7 +4008,7 @@ case 289: ; break;} case 290: -#line 1662 "./parse.y" +#line 1664 "./parse.y" { /* This scope defined for local variable that may be defined within the scope of the for loop */ @@ -4014,15 +4016,15 @@ case 290: ; break;} case 291: -#line 1668 "./parse.y" +#line 1670 "./parse.y" {yyerror ("'(' expected"); DRECOVER(for_1);; break;} case 292: -#line 1670 "./parse.y" +#line 1672 "./parse.y" {yyerror ("Invalid init statement"); RECOVER;; break;} case 293: -#line 1675 "./parse.y" +#line 1677 "./parse.y" { /* We now declare the loop body. The loop is declared as a for loop. */ @@ -4035,11 +4037,11 @@ case 293: ; break;} case 294: -#line 1687 "./parse.y" +#line 1689 "./parse.y" { yyval.node = empty_stmt_node; ; break;} case 295: -#line 1689 "./parse.y" +#line 1691 "./parse.y" { /* Init statement recorded within the previously defined block scope */ @@ -4047,7 +4049,7 @@ case 295: ; break;} case 296: -#line 1695 "./parse.y" +#line 1697 "./parse.y" { /* Local variable are recorded within the previously defined block scope */ @@ -4055,94 +4057,94 @@ case 296: ; break;} case 297: -#line 1701 "./parse.y" +#line 1703 "./parse.y" {yyerror ("';' expected"); DRECOVER(for_init_1);; break;} case 298: -#line 1705 "./parse.y" +#line 1707 "./parse.y" {yyval.node = empty_stmt_node;; break;} case 299: -#line 1707 "./parse.y" +#line 1709 "./parse.y" { yyval.node = build_debugable_stmt (BUILD_LOCATION (), yyvsp[0].node); ; break;} case 300: -#line 1712 "./parse.y" +#line 1714 "./parse.y" { yyval.node = add_stmt_to_compound (NULL_TREE, NULL_TREE, yyvsp[0].node); ; break;} case 301: -#line 1714 "./parse.y" +#line 1716 "./parse.y" { yyval.node = add_stmt_to_compound (yyvsp[-2].node, NULL_TREE, yyvsp[0].node); ; break;} case 302: -#line 1716 "./parse.y" +#line 1718 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 303: -#line 1721 "./parse.y" +#line 1723 "./parse.y" { yyval.node = build_bc_statement (yyvsp[-1].operator.location, 1, NULL_TREE); ; break;} case 304: -#line 1723 "./parse.y" +#line 1725 "./parse.y" { yyval.node = build_bc_statement (yyvsp[-2].operator.location, 1, yyvsp[-1].node); ; break;} case 305: -#line 1725 "./parse.y" +#line 1727 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 306: -#line 1727 "./parse.y" +#line 1729 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 307: -#line 1732 "./parse.y" +#line 1734 "./parse.y" { yyval.node = build_bc_statement (yyvsp[-1].operator.location, 0, NULL_TREE); ; break;} case 308: -#line 1734 "./parse.y" +#line 1736 "./parse.y" { yyval.node = build_bc_statement (yyvsp[-2].operator.location, 0, yyvsp[-1].node); ; break;} case 309: -#line 1736 "./parse.y" +#line 1738 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 310: -#line 1738 "./parse.y" +#line 1740 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 311: -#line 1743 "./parse.y" +#line 1745 "./parse.y" { yyval.node = build_return (yyvsp[-1].operator.location, NULL_TREE); ; break;} case 312: -#line 1745 "./parse.y" +#line 1747 "./parse.y" { yyval.node = build_return (yyvsp[-2].operator.location, yyvsp[-1].node); ; break;} case 313: -#line 1747 "./parse.y" +#line 1749 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 314: -#line 1749 "./parse.y" +#line 1751 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 315: -#line 1754 "./parse.y" +#line 1756 "./parse.y" { yyval.node = build1 (THROW_EXPR, NULL_TREE, yyvsp[-1].node); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-2].operator.location; ; break;} case 316: -#line 1759 "./parse.y" +#line 1761 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 317: -#line 1761 "./parse.y" +#line 1763 "./parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 318: -#line 1766 "./parse.y" +#line 1768 "./parse.y" { yyval.node = build (SYNCHRONIZED_EXPR, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); EXPR_WFL_LINECOL (yyval.node) = @@ -4150,23 +4152,23 @@ case 318: ; break;} case 319: -#line 1772 "./parse.y" +#line 1774 "./parse.y" {yyerror ("'{' expected"); RECOVER;; break;} case 320: -#line 1774 "./parse.y" +#line 1776 "./parse.y" {yyerror ("'(' expected"); RECOVER;; break;} case 321: -#line 1776 "./parse.y" +#line 1778 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 322: -#line 1778 "./parse.y" +#line 1780 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 323: -#line 1783 "./parse.y" +#line 1785 "./parse.y" { check_modifiers ( "Illegal modifier `%s'. Only `synchronized' was expected here", @@ -4177,33 +4179,33 @@ case 323: ; break;} case 324: -#line 1795 "./parse.y" +#line 1797 "./parse.y" { yyval.node = build_try_statement (yyvsp[-2].operator.location, yyvsp[-1].node, yyvsp[0].node); ; break;} case 325: -#line 1797 "./parse.y" +#line 1799 "./parse.y" { yyval.node = build_try_finally_statement (yyvsp[-2].operator.location, yyvsp[-1].node, yyvsp[0].node); ; break;} case 326: -#line 1799 "./parse.y" +#line 1801 "./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 1804 "./parse.y" +#line 1806 "./parse.y" {yyerror ("'{' expected"); DRECOVER (try_statement);; break;} case 329: -#line 1810 "./parse.y" +#line 1812 "./parse.y" { TREE_CHAIN (yyvsp[0].node) = yyvsp[-1].node; yyval.node = yyvsp[0].node; ; break;} case 330: -#line 1818 "./parse.y" +#line 1820 "./parse.y" { java_method_add_stmt (current_function_decl, yyvsp[0].node); exit_block (); @@ -4211,7 +4213,7 @@ case 330: ; break;} case 331: -#line 1826 "./parse.y" +#line 1828 "./parse.y" { /* We add a block to define a scope for formal_parameter (CCBP). The formal parameter is @@ -4229,96 +4231,96 @@ case 331: ; break;} case 332: -#line 1842 "./parse.y" +#line 1844 "./parse.y" {yyerror ("'(' expected"); RECOVER; yyval.node = NULL_TREE;; break;} case 333: -#line 1844 "./parse.y" +#line 1846 "./parse.y" { yyerror ("Missing term or ')' expected"); RECOVER; yyval.node = NULL_TREE; ; break;} case 334: -#line 1849 "./parse.y" +#line 1851 "./parse.y" {yyerror ("Missing term"); RECOVER; yyval.node = NULL_TREE;; break;} case 335: -#line 1854 "./parse.y" +#line 1856 "./parse.y" { yyval.node = yyvsp[0].node; ; break;} case 336: -#line 1856 "./parse.y" +#line 1858 "./parse.y" {yyerror ("'{' expected"); RECOVER; ; break;} case 340: -#line 1868 "./parse.y" +#line 1870 "./parse.y" { yyval.node = build_this (yyvsp[0].operator.location); ; break;} case 341: -#line 1870 "./parse.y" +#line 1872 "./parse.y" {yyval.node = yyvsp[-1].node;; break;} case 347: -#line 1880 "./parse.y" +#line 1882 "./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 348: -#line 1885 "./parse.y" +#line 1887 "./parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 349: -#line 1887 "./parse.y" +#line 1889 "./parse.y" {yyerror ("'class' or 'this' expected" ); RECOVER;; break;} case 350: -#line 1889 "./parse.y" +#line 1891 "./parse.y" {yyerror ("'class' expected" ); RECOVER;; break;} case 351: -#line 1891 "./parse.y" +#line 1893 "./parse.y" {yyerror ("'class' expected" ); RECOVER;; break;} case 352: -#line 1899 "./parse.y" +#line 1901 "./parse.y" { yyval.node = build_java_array_type (yyvsp[-2].node, -1); CLASS_LOADED_P (yyval.node) = 1; ; break;} case 353: -#line 1904 "./parse.y" +#line 1906 "./parse.y" { yyval.node = build_unresolved_array_type (yyvsp[-2].node); ; break;} case 354: -#line 1914 "./parse.y" +#line 1916 "./parse.y" { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ; break;} case 355: -#line 1916 "./parse.y" +#line 1918 "./parse.y" { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ; break;} case 356: -#line 1918 "./parse.y" +#line 1920 "./parse.y" { yyval.node = build_class_ref (yyvsp[-2].node); ; break;} case 357: -#line 1920 "./parse.y" +#line 1922 "./parse.y" { yyval.node = build_class_ref (void_type_node); ; break;} case 358: -#line 1925 "./parse.y" +#line 1927 "./parse.y" { yyval.node = build_new_invocation (yyvsp[-3].node, yyvsp[-1].node); ; break;} case 359: -#line 1927 "./parse.y" +#line 1929 "./parse.y" { yyval.node = build_new_invocation (yyvsp[-2].node, NULL_TREE); ; break;} case 361: -#line 1933 "./parse.y" +#line 1935 "./parse.y" { tree ctor = build_new_invocation (yyvsp[-2].node, NULL_TREE); yyval.node = make_qualified_primary (yyvsp[-3].node, ctor, @@ -4326,7 +4328,7 @@ case 361: ; break;} case 363: -#line 1940 "./parse.y" +#line 1942 "./parse.y" { tree ctor = build_new_invocation (yyvsp[-3].node, yyvsp[-1].node); yyval.node = make_qualified_primary (yyvsp[-4].node, ctor, @@ -4334,35 +4336,35 @@ case 363: ; break;} case 365: -#line 1947 "./parse.y" +#line 1949 "./parse.y" {yyerror ("'(' expected"); DRECOVER(new_1);; break;} case 366: -#line 1949 "./parse.y" +#line 1951 "./parse.y" {yyerror ("'(' expected"); RECOVER;; break;} case 367: -#line 1951 "./parse.y" +#line 1953 "./parse.y" {yyerror ("')' or term expected"); RECOVER;; break;} case 368: -#line 1953 "./parse.y" +#line 1955 "./parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 369: -#line 1955 "./parse.y" +#line 1957 "./parse.y" {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;; break;} case 370: -#line 1957 "./parse.y" +#line 1959 "./parse.y" {yyerror ("'(' expected"); RECOVER;; break;} case 371: -#line 1967 "./parse.y" +#line 1969 "./parse.y" { create_anonymous_class (yyvsp[-4].operator.location, yyvsp[-3].node); ; break;} case 372: -#line 1969 "./parse.y" +#line 1971 "./parse.y" { tree id = build_wfl_node (DECL_NAME (GET_CPC ())); EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (yyvsp[-5].node); @@ -4395,11 +4397,11 @@ case 372: ; break;} case 373: -#line 2000 "./parse.y" +#line 2002 "./parse.y" { create_anonymous_class (yyvsp[-3].operator.location, yyvsp[-2].node); ; break;} case 374: -#line 2002 "./parse.y" +#line 2004 "./parse.y" { tree id = build_wfl_node (DECL_NAME (GET_CPC ())); EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (yyvsp[-4].node); @@ -4414,49 +4416,49 @@ case 374: ; break;} case 375: -#line 2018 "./parse.y" +#line 2020 "./parse.y" { yyval.node = yyvsp[-2].node; ; break;} case 376: -#line 2020 "./parse.y" +#line 2022 "./parse.y" { yyval.node = yyvsp[-2].node; ; break;} case 377: -#line 2025 "./parse.y" +#line 2027 "./parse.y" { yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, NULL_TREE); ctxp->formal_parameter_number = 1; ; break;} case 378: -#line 2030 "./parse.y" +#line 2032 "./parse.y" { ctxp->formal_parameter_number += 1; yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, yyvsp[-2].node); ; break;} case 379: -#line 2035 "./parse.y" +#line 2037 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 380: -#line 2040 "./parse.y" +#line 2042 "./parse.y" { yyval.node = build_newarray_node (yyvsp[-1].node, yyvsp[0].node, 0); ; break;} case 381: -#line 2042 "./parse.y" +#line 2044 "./parse.y" { yyval.node = build_newarray_node (yyvsp[-1].node, yyvsp[0].node, 0); ; break;} case 382: -#line 2044 "./parse.y" +#line 2046 "./parse.y" { yyval.node = build_newarray_node (yyvsp[-2].node, yyvsp[-1].node, CURRENT_OSB (ctxp));; break;} case 383: -#line 2046 "./parse.y" +#line 2048 "./parse.y" { yyval.node = build_newarray_node (yyvsp[-2].node, yyvsp[-1].node, CURRENT_OSB (ctxp));; break;} case 384: -#line 2050 "./parse.y" +#line 2052 "./parse.y" { char *sig; while (CURRENT_OSB (ctxp)--) @@ -4467,7 +4469,7 @@ case 384: ; break;} case 385: -#line 2059 "./parse.y" +#line 2061 "./parse.y" { tree type = yyvsp[-2].node; while (CURRENT_OSB (ctxp)--) @@ -4477,34 +4479,39 @@ case 385: ; break;} case 386: -#line 2067 "./parse.y" +#line 2069 "./parse.y" {yyerror ("'[' expected"); DRECOVER ("]");; break;} case 387: -#line 2069 "./parse.y" +#line 2071 "./parse.y" {yyerror ("']' expected"); RECOVER;; break;} case 388: -#line 2074 "./parse.y" +#line 2076 "./parse.y" { yyval.node = build_tree_list (NULL_TREE, yyvsp[0].node); ; break;} case 389: -#line 2076 "./parse.y" +#line 2078 "./parse.y" { yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, yyval.node); ; break;} case 390: -#line 2081 "./parse.y" +#line 2083 "./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 391: -#line 2086 "./parse.y" +#line 2093 "./parse.y" {yyerror ("']' expected"); RECOVER;; break;} case 392: -#line 2088 "./parse.y" +#line 2095 "./parse.y" { yyerror ("Missing term"); yyerror ("']' expected"); @@ -4512,7 +4519,7 @@ case 392: ; break;} case 393: -#line 2097 "./parse.y" +#line 2104 "./parse.y" { int allocate = 0; /* If not initialized, allocate memory for the osb @@ -4540,19 +4547,19 @@ case 393: ; break;} case 394: -#line 2123 "./parse.y" +#line 2130 "./parse.y" { CURRENT_OSB (ctxp)++; ; break;} case 395: -#line 2125 "./parse.y" +#line 2132 "./parse.y" { yyerror ("']' expected"); RECOVER;; break;} case 396: -#line 2130 "./parse.y" +#line 2137 "./parse.y" { yyval.node = make_qualified_primary (yyvsp[-2].node, yyvsp[0].node, yyvsp[-1].operator.location); ; break;} case 397: -#line 2134 "./parse.y" +#line 2141 "./parse.y" { tree super_wfl = build_wfl_node (super_identifier_node); @@ -4561,19 +4568,19 @@ case 397: ; break;} case 398: -#line 2141 "./parse.y" +#line 2148 "./parse.y" {yyerror ("Field expected"); DRECOVER (super_field_acces);; break;} case 399: -#line 2146 "./parse.y" +#line 2153 "./parse.y" { yyval.node = build_method_invocation (yyvsp[-2].node, NULL_TREE); ; break;} case 400: -#line 2148 "./parse.y" +#line 2155 "./parse.y" { yyval.node = build_method_invocation (yyvsp[-3].node, yyvsp[-1].node); ; break;} case 401: -#line 2150 "./parse.y" +#line 2157 "./parse.y" { if (TREE_CODE (yyvsp[-4].node) == THIS_EXPR) yyval.node = build_this_super_qualified_invocation @@ -4586,7 +4593,7 @@ case 401: ; break;} case 402: -#line 2161 "./parse.y" +#line 2168 "./parse.y" { if (TREE_CODE (yyvsp[-5].node) == THIS_EXPR) yyval.node = build_this_super_qualified_invocation @@ -4599,121 +4606,121 @@ case 402: ; break;} case 403: -#line 2172 "./parse.y" +#line 2179 "./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 404: -#line 2177 "./parse.y" +#line 2184 "./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 405: -#line 2186 "./parse.y" +#line 2193 "./parse.y" { yyerror ("'(' expected"); DRECOVER (method_invocation); ; break;} case 406: -#line 2188 "./parse.y" +#line 2195 "./parse.y" { yyerror ("'(' expected"); DRECOVER (method_invocation); ; break;} case 407: -#line 2193 "./parse.y" +#line 2200 "./parse.y" { yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ; break;} case 408: -#line 2195 "./parse.y" +#line 2202 "./parse.y" { yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ; break;} case 409: -#line 2197 "./parse.y" +#line 2204 "./parse.y" { yyerror ("Missing term and ']' expected"); DRECOVER(array_access); ; break;} case 410: -#line 2202 "./parse.y" +#line 2209 "./parse.y" { yyerror ("']' expected"); DRECOVER(array_access); ; break;} case 411: -#line 2207 "./parse.y" +#line 2214 "./parse.y" { yyerror ("Missing term and ']' expected"); DRECOVER(array_access); ; break;} case 412: -#line 2212 "./parse.y" +#line 2219 "./parse.y" { yyerror ("']' expected"); DRECOVER(array_access); ; break;} case 417: -#line 2227 "./parse.y" +#line 2234 "./parse.y" { yyval.node = build_incdec (yyvsp[0].operator.token, yyvsp[0].operator.location, yyvsp[-1].node, 1); ; break;} case 418: -#line 2232 "./parse.y" +#line 2239 "./parse.y" { yyval.node = build_incdec (yyvsp[0].operator.token, yyvsp[0].operator.location, yyvsp[-1].node, 1); ; break;} case 421: -#line 2239 "./parse.y" +#line 2246 "./parse.y" {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 422: -#line 2241 "./parse.y" +#line 2248 "./parse.y" {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 424: -#line 2244 "./parse.y" +#line 2251 "./parse.y" {yyerror ("Missing term"); RECOVER; break;} case 425: -#line 2246 "./parse.y" +#line 2253 "./parse.y" {yyerror ("Missing term"); RECOVER; break;} case 426: -#line 2251 "./parse.y" +#line 2258 "./parse.y" {yyval.node = build_incdec (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node, 0); ; break;} case 427: -#line 2253 "./parse.y" +#line 2260 "./parse.y" {yyerror ("Missing term"); RECOVER; break;} case 428: -#line 2258 "./parse.y" +#line 2265 "./parse.y" {yyval.node = build_incdec (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node, 0); ; break;} case 429: -#line 2260 "./parse.y" +#line 2267 "./parse.y" {yyerror ("Missing term"); RECOVER; break;} case 431: -#line 2266 "./parse.y" +#line 2273 "./parse.y" {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 432: -#line 2268 "./parse.y" +#line 2275 "./parse.y" {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 434: -#line 2271 "./parse.y" +#line 2278 "./parse.y" {yyerror ("Missing term"); RECOVER; break;} case 435: -#line 2273 "./parse.y" +#line 2280 "./parse.y" {yyerror ("Missing term"); RECOVER; break;} case 436: -#line 2278 "./parse.y" +#line 2285 "./parse.y" { tree type = yyvsp[-3].node; while (CURRENT_OSB (ctxp)--) @@ -4723,15 +4730,15 @@ case 436: ; break;} case 437: -#line 2286 "./parse.y" +#line 2293 "./parse.y" { yyval.node = build_cast (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 438: -#line 2288 "./parse.y" +#line 2295 "./parse.y" { yyval.node = build_cast (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 439: -#line 2290 "./parse.y" +#line 2297 "./parse.y" { const char *ptr; while (CURRENT_OSB (ctxp)--) @@ -4746,11 +4753,11 @@ case 439: ; break;} case 440: -#line 2303 "./parse.y" +#line 2310 "./parse.y" {yyerror ("']' expected, invalid type expression");; break;} case 441: -#line 2305 "./parse.y" +#line 2312 "./parse.y" { if (ctxp->prevent_ese != lineno) yyerror ("Invalid type expression"); RECOVER; @@ -4758,243 +4765,243 @@ case 441: ; break;} case 442: -#line 2311 "./parse.y" +#line 2318 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 443: -#line 2313 "./parse.y" +#line 2320 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 444: -#line 2315 "./parse.y" +#line 2322 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 446: -#line 2321 "./parse.y" +#line 2328 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 447: -#line 2326 "./parse.y" +#line 2333 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 448: -#line 2331 "./parse.y" +#line 2338 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 449: -#line 2336 "./parse.y" +#line 2343 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 450: -#line 2338 "./parse.y" +#line 2345 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 451: -#line 2340 "./parse.y" +#line 2347 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 453: -#line 2346 "./parse.y" +#line 2353 "./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 2351 "./parse.y" +#line 2358 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 455: -#line 2356 "./parse.y" +#line 2363 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 456: -#line 2358 "./parse.y" +#line 2365 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 458: -#line 2364 "./parse.y" +#line 2371 "./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 2369 "./parse.y" +#line 2376 "./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 2374 "./parse.y" +#line 2381 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 461: -#line 2379 "./parse.y" +#line 2386 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 462: -#line 2381 "./parse.y" +#line 2388 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 463: -#line 2383 "./parse.y" +#line 2390 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 465: -#line 2389 "./parse.y" +#line 2396 "./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 2394 "./parse.y" +#line 2401 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 467: -#line 2399 "./parse.y" +#line 2406 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 468: -#line 2404 "./parse.y" +#line 2411 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 469: -#line 2409 "./parse.y" +#line 2416 "./parse.y" { yyval.node = build_binop (INSTANCEOF_EXPR, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 470: -#line 2411 "./parse.y" +#line 2418 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 471: -#line 2413 "./parse.y" +#line 2420 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 472: -#line 2415 "./parse.y" +#line 2422 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 473: -#line 2417 "./parse.y" +#line 2424 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 474: -#line 2419 "./parse.y" +#line 2426 "./parse.y" {yyerror ("Invalid reference type"); RECOVER;; break;} case 476: -#line 2425 "./parse.y" +#line 2432 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 477: -#line 2430 "./parse.y" +#line 2437 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 478: -#line 2435 "./parse.y" +#line 2442 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 479: -#line 2437 "./parse.y" +#line 2444 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 481: -#line 2443 "./parse.y" +#line 2450 "./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 2448 "./parse.y" +#line 2455 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 484: -#line 2454 "./parse.y" +#line 2461 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 485: -#line 2459 "./parse.y" +#line 2466 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 487: -#line 2465 "./parse.y" +#line 2472 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 488: -#line 2470 "./parse.y" +#line 2477 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 490: -#line 2476 "./parse.y" +#line 2483 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 491: -#line 2481 "./parse.y" +#line 2488 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 493: -#line 2487 "./parse.y" +#line 2494 "./parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 494: -#line 2492 "./parse.y" +#line 2499 "./parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 496: -#line 2498 "./parse.y" +#line 2505 "./parse.y" { yyval.node = build (CONDITIONAL_EXPR, NULL_TREE, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-3].operator.location; ; break;} case 497: -#line 2503 "./parse.y" +#line 2510 "./parse.y" { YYERROR_NOW; yyerror ("Missing term"); @@ -5002,19 +5009,19 @@ case 497: ; break;} case 498: -#line 2509 "./parse.y" +#line 2516 "./parse.y" {yyerror ("Missing term"); DRECOVER (2);; break;} case 499: -#line 2511 "./parse.y" +#line 2518 "./parse.y" {yyerror ("Missing term"); DRECOVER (3);; break;} case 502: -#line 2521 "./parse.y" +#line 2528 "./parse.y" { yyval.node = build_assignment (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} case 503: -#line 2523 "./parse.y" +#line 2530 "./parse.y" { if (ctxp->prevent_ese != lineno) yyerror ("Missing term"); @@ -5243,7 +5250,7 @@ yyerrhandle: } return 1; } -#line 2549 "./parse.y" +#line 2556 "./parse.y" @@ -6691,23 +6698,27 @@ lookup_field_wrapper (class, name) tree class, name; { tree type = class; - tree decl; + tree decl = NULL_TREE; java_parser_context_save_global (); - decl = lookup_field (&type, name); /* Last chance: if we're within the context of an inner class, we might be trying to access a local variable defined in an outer context. We try to look for it now. */ - if (INNER_CLASS_TYPE_P (class) && (!decl || decl == error_mark_node)) + if (INNER_CLASS_TYPE_P (class)) { char *alias_buffer; + tree new_name; MANGLE_OUTER_LOCAL_VARIABLE_NAME (alias_buffer, name); - name = get_identifier (alias_buffer); - type = class; - decl = lookup_field (&type, name); + new_name = get_identifier (alias_buffer); + 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); + } java_parser_context_restore_global (); return decl == error_mark_node ? NULL : decl; @@ -7311,10 +7322,8 @@ check_modifiers_consistency (flags) acc_count = 0; cl = NULL_TREE; - THIS_MODIFIER_ONLY (flags, ACC_FINAL, FINAL_TK - PUBLIC_TK, - acc_count, cl); - THIS_MODIFIER_ONLY (flags, ACC_VOLATILE, VOLATILE_TK - PUBLIC_TK, - acc_count, cl); + 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"); @@ -7373,7 +7382,7 @@ method_declarator (id, list) /* Then this$<n> */ type = TREE_TYPE (DECL_CONTEXT (GET_CPC ())); - thisn = build_current_thisn (TYPE_NAME (GET_CPC ())); + thisn = build_current_thisn (TREE_TYPE (GET_CPC ())); list = tree_cons (build_wfl_node (thisn), build_pointer_type (type), list); } @@ -7907,10 +7916,8 @@ java_complete_class () push_obstacks (&permanent_obstack, &permanent_obstack); - /* Process imports and reverse the import on demand list */ + /* Process imports */ process_imports (); - if (ctxp->import_demand_list) - ctxp->import_demand_list = nreverse (ctxp->import_demand_list); /* Rever things so we have the right order */ ctxp->class_list = nreverse (ctxp->class_list); @@ -8115,10 +8122,10 @@ do_resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { tree new_class_decl; - tree original_name = NULL_TREE; /* Do not try to replace TYPE_NAME (class_type) by a variable, since - its is changed by find_in_imports{_on_demand} */ + it is changed by find_in_imports{_on_demand} and (but it doesn't + really matter) qualify_and_find */ /* 0- Search in the current class as an inner class */ @@ -8152,12 +8159,11 @@ do_resolve_class (enclosing, class_type, decl, cl) enclosing = do_resolve_class (NULL, name, NULL, NULL); } - /* 1- Check for the type in single imports */ - if (find_in_imports (class_type)) - return NULL_TREE; + /* 1- Check for the type in single imports. This will change + TYPE_NAME() if something relevant is found */ + find_in_imports (class_type); - /* 2- And check for the type in the current compilation unit. If it fails, - try with a name qualified with the package name we've seen so far */ + /* 2- And check for the type in the current compilation unit */ if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) { if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) && @@ -8166,34 +8172,37 @@ do_resolve_class (enclosing, class_type, decl, cl) return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); } - original_name = TYPE_NAME (class_type); + /* 3- Search according to the current package definition */ + 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; + } + + /* 4- Check the import on demands. Don't allow bar.baz to be + imported from foo.* */ + if (!QUALIFIED_P (TYPE_NAME (class_type))) + if (find_in_imports_on_demand (class_type)) + return NULL_TREE; + + /* If found in find_in_imports_on_demant, the type has already been + loaded. */ + if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) + return new_class_decl; + + /* 5- Try with a name qualified with the package name we've seen so far */ if (!QUALIFIED_P (TYPE_NAME (class_type))) { tree package; for (package = package_list; package; package = TREE_CHAIN (package)) - { - tree new_qualified; - - new_qualified = merge_qualified_name (TREE_PURPOSE (package), - original_name); - TYPE_NAME (class_type) = new_qualified; - new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); - if (!new_class_decl) - load_class (TYPE_NAME (class_type), 0); - new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); - if (new_class_decl) - { - if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) && - !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl))) - load_class (TYPE_NAME (class_type), 0); - return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); - } - } + if ((new_class_decl = qualify_and_find (class_type, + TREE_PURPOSE (package), + TYPE_NAME (class_type)))) + return new_class_decl; } - TYPE_NAME (class_type) = original_name; - - /* 3- Check an other compilation unit that bears the name of type */ + /* 5- Check an other compilation unit that bears the name of type */ load_class (TYPE_NAME (class_type), 0); if (check_pkg_class_access (TYPE_NAME (class_type), (cl ? cl : lookup_cl (decl)))) @@ -8202,16 +8211,30 @@ do_resolve_class (enclosing, class_type, decl, cl) if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) return new_class_decl; - /* 4- Check the import on demands. Don't allow bar.baz to be - imported from foo.* */ - if (!QUALIFIED_P (TYPE_NAME (class_type))) - if (find_in_imports_on_demand (class_type)) - return NULL_TREE; - - /* 5- Last call for a resolution */ + /* 6- Last call for a resolution */ return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); } +static tree +qualify_and_find (class_type, package, name) + tree class_type, package, 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)) && + !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl))) + load_class (new_qualified, 0); + TYPE_NAME (class_type) = new_qualified; + return IDENTIFIER_CLASS_VALUE (new_qualified); + } + return NULL_TREE; +} + /* Resolve NAME and lay it out (if not done and if not the current parsed class). Return a decl node. This function is meant to be called when type resolution is necessary during the walk pass. */ @@ -9085,10 +9108,10 @@ process_imports () return 0; } -/* Possibly find a class imported by a single-type import statement. Return - 1 if an error occured, 0 otherwise. */ +/* Possibly find and mark a class imported by a single-type import + statement. */ -static int +static void find_in_imports (class_type) tree class_type; { @@ -9100,7 +9123,6 @@ find_in_imports (class_type) TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import)); QUALIFIED_P (TYPE_NAME (class_type)) = 1; } - return 0; } static int @@ -9310,6 +9332,30 @@ find_in_imports_on_demand (class_type) return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */ } +/* Add package NAME to the list of package encountered so far. To + speed up class lookup in do_resolve_class, we make sure a + particular package is added only once. */ + +static void +register_package (name) + tree name; +{ + static struct hash_table _pht, *pht = NULL; + + if (!pht) + { + hash_table_init (&_pht, hash_newfunc, + java_hash_hash_tree_node, java_hash_compare_tree_node); + pht = &_pht; + } + + if (!hash_lookup (pht, (const hash_table_key) name, FALSE, NULL)) + { + package_list = chainon (package_list, build_tree_list (name, NULL)); + hash_lookup (pht, (const hash_table_key) name, TRUE, NULL); + } +} + static tree resolve_package (pkg, next) tree pkg, *next; @@ -10078,10 +10124,12 @@ maybe_generate_pre_expand_clinit (class_type) for (current = TYPE_CLINIT_STMT_LIST (class_type); current; current = TREE_CHAIN (current)) { + tree stmt = current; /* We build the assignment expression that will initialize the field to its value. There are strict rules on static initializers (8.5). FIXME */ - tree stmt = build_debugable_stmt (EXPR_WFL_LINECOL (current), current); + if (TREE_CODE (stmt) != BLOCK) + stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt); java_method_add_stmt (mdecl, stmt); } @@ -11042,12 +11090,6 @@ java_expand_classes () java_layout_classes (); java_parse_abort_on_error (); - /* The list of packages declaration seen so far needs to be - reversed, so that package declared in a file being compiled gets - priority over packages declared as a side effect of parsing other - files.*/ - package_list = nreverse (package_list); - saved_ctxp = ctxp_for_generation; for (; ctxp_for_generation; ctxp_for_generation = ctxp_for_generation->next) { @@ -11126,7 +11168,7 @@ make_qualified_primary (primary, right, location) tree wfl; if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION) - wfl = build_wfl_wrap (primary); + wfl = build_wfl_wrap (primary, location); else { wfl = primary; @@ -11343,7 +11385,8 @@ resolve_field_access (qual_wfl, field_decl, field_type) return error_mark_node; /* Resolve the LENGTH field of an array here */ - if (DECL_NAME (decl) == length_identifier_node && TYPE_ARRAY_P (type_found) + if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node + && TYPE_ARRAY_P (type_found) && ! flag_emit_class_files && ! flag_emit_xref) { tree length = build_java_array_length_access (where_found); @@ -12735,7 +12778,8 @@ find_applicable_accessible_methods_list (lc, class, name, arglist) } /* Search interfaces */ - if (CLASS_INTERFACE (TYPE_NAME (class))) + if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL + && CLASS_INTERFACE (TYPE_NAME (class))) { static struct hash_table t, *searched_interfaces = NULL; static int search_not_done = 0; @@ -12883,6 +12927,7 @@ find_most_specific_methods_list (list) tree list; { int max = 0; + int abstract, candidates; tree current, new_list = NULL_TREE; for (current = list; current; current = TREE_CHAIN (current)) { @@ -12909,24 +12954,33 @@ find_most_specific_methods_list (list) } /* Review the list and select the maximally specific methods */ - for (current = list; current; current = TREE_CHAIN (current)) + 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); + { + new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list); + abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0); + candidates++; + } /* If we have several and they're all abstract, just pick the closest one. */ + if (candidates > 0 && (candidates == abstract)) + { + new_list = nreverse (new_list); + TREE_CHAIN (new_list) = NULL_TREE; + } - if (new_list && TREE_CHAIN (new_list)) + /* We have several, we couldn't find a most specific, all but one are + abstract, we pick the only non abstract one. */ + if (candidates > 0 && !max && (candidates == abstract+1)) { - tree c; - for (c = new_list; c && METHOD_ABSTRACT (TREE_VALUE (c)); - c = TREE_CHAIN (c)) - ; - if (!c) - { - new_list = nreverse (new_list); - TREE_CHAIN (new_list) = NULL_TREE; - } + for (current = new_list; current; current = TREE_CHAIN (current)) + if (!METHOD_ABSTRACT (TREE_VALUE (current))) + { + TREE_CHAIN (current) = NULL_TREE; + new_list = current; + } } /* If we can't find one, lower expectations and try to gather multiple @@ -13226,7 +13280,7 @@ breakdown_qualified (left, right, source) local variable decls if present. Same as java_complete_lhs, but does resolve static finals to values. */ -static tree +tree java_complete_tree (node) tree node; { @@ -14165,8 +14219,9 @@ maybe_absorb_scoping_blocks () /* Wrap a non WFL node around a WFL. */ static tree -build_wfl_wrap (node) +build_wfl_wrap (node, location) tree node; + int location; { tree wfl, node_to_insert = node; @@ -14178,7 +14233,7 @@ build_wfl_wrap (node) else wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0); - EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (node); + EXPR_WFL_LINECOL (wfl) = location; EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE); return wfl; } @@ -14344,7 +14399,8 @@ maybe_build_primttype_type_ref (rhs, wfl) tree n = TREE_OPERAND (rhs, 1); if (TREE_CODE (n) == VAR_DECL && DECL_NAME (n) == TYPE_identifier_node - && rhs_type == class_ptr_type) + && rhs_type == class_ptr_type + && TREE_CODE (EXPR_WFL_NODE (wfl)) == IDENTIFIER_NODE) { const char *self_name = IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)); if (!strncmp (self_name, "java.lang.", 10)) @@ -16236,7 +16292,8 @@ patch_new_array_init (type, node) TREE_PURPOSE (current) = NULL_TREE; all_constant = 0; } - if (elt && TREE_VALUE (elt) == error_mark_node) + if (elt && TREE_CODE (elt) == TREE_LIST + && TREE_VALUE (elt) == error_mark_node) error_seen = 1; } diff --git a/gcc/java/parse.h b/gcc/java/parse.h index 24b0b9b..45573fb 100644 --- a/gcc/java/parse.h +++ b/gcc/java/parse.h @@ -687,12 +687,11 @@ typedef struct _jdeplist { } /* Register an import */ -#define REGISTER_IMPORT(WHOLE, NAME) \ -{ \ - IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P ((NAME)) = 1; \ - node = build_tree_list ((WHOLE), (NAME)); \ - TREE_CHAIN (node) = ctxp->import_list; \ - ctxp->import_list = node; \ +#define REGISTER_IMPORT(WHOLE, NAME) \ +{ \ + IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P ((NAME)) = 1; \ + ctxp->import_list = chainon (ctxp->import_list, \ + build_tree_list ((WHOLE), (NAME))); \ } /* Macro to access the osb (opening square bracket) count */ diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 6b13e0c..3cf2df4 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -99,8 +99,9 @@ static void complete_class_report_errors PARAMS ((jdep *)); static int process_imports PARAMS ((void)); static void read_import_dir PARAMS ((tree)); static int find_in_imports_on_demand PARAMS ((tree)); -static int find_in_imports PARAMS ((tree)); +static void find_in_imports PARAMS ((tree)); static int check_pkg_class_access PARAMS ((tree, tree)); +static void register_package PARAMS ((tree)); static tree resolve_package PARAMS ((tree, tree *)); static tree lookup_package_type PARAMS ((const char *, int)); static tree lookup_package_type_and_set_next PARAMS ((const char *, int, tree *)); @@ -120,6 +121,7 @@ static tree patch_method_invocation PARAMS ((tree, tree, tree, int *, tree *)); static int breakdown_qualified PARAMS ((tree *, tree *, tree)); static tree resolve_and_layout PARAMS ((tree, tree)); +static tree qualify_and_find PARAMS ((tree, tree, tree)); static tree resolve_no_layout PARAMS ((tree, tree)); static int invocation_mode PARAMS ((tree, int)); static tree find_applicable_accessible_methods_list PARAMS ((int, tree, @@ -180,7 +182,7 @@ static tree build_newarray_node PARAMS ((tree, tree, int)); static tree patch_newarray PARAMS ((tree)); static tree resolve_type_during_patch PARAMS ((tree)); static tree build_this PARAMS ((int)); -static tree build_wfl_wrap PARAMS ((tree)); +static tree build_wfl_wrap PARAMS ((tree, int)); static tree build_return PARAMS ((int, tree)); static tree patch_return PARAMS ((tree)); static tree maybe_access_field PARAMS ((tree, tree, tree)); @@ -682,7 +684,7 @@ package_declaration: PACKAGE_TK name SC_TK { ctxp->package = EXPR_WFL_NODE ($2); - package_list = tree_cons (ctxp->package, NULL, package_list); + register_package (ctxp->package); } | PACKAGE_TK error {yyerror ("Missing name"); RECOVER;} @@ -698,7 +700,7 @@ import_declaration: single_type_import_declaration: IMPORT_TK name SC_TK { - tree name = EXPR_WFL_NODE ($2), node, last_name; + tree name = EXPR_WFL_NODE ($2), last_name; int i = IDENTIFIER_LENGTH (name)-1; const char *last = &IDENTIFIER_POINTER (name)[i]; while (last != IDENTIFIER_POINTER (name)) @@ -717,7 +719,7 @@ single_type_import_declaration: IDENTIFIER_POINTER (name), IDENTIFIER_POINTER (err)); else - REGISTER_IMPORT ($2, last_name) + REGISTER_IMPORT ($2, last_name); } else REGISTER_IMPORT ($2, last_name); @@ -735,10 +737,10 @@ type_import_on_demand_declaration: /* Don't import java.lang.* twice. */ if (name != java_lang_id) { - tree node = build_tree_list ($2, NULL_TREE); read_import_dir ($2); - TREE_CHAIN (node) = ctxp->import_demand_list; - ctxp->import_demand_list = node; + ctxp->import_demand_list = + chainon (ctxp->import_demand_list, + build_tree_list ($2, NULL_TREE)); } } | IMPORT_TK name DOT_TK error @@ -2079,6 +2081,11 @@ dim_exprs: dim_expr: OSB_TK expression CSB_TK { + if (JNUMERIC_TYPE_P (TREE_TYPE ($2))) + { + $2 = build_wfl_node ($2); + TREE_TYPE ($2) = NULL_TREE; + } EXPR_WFL_LINECOL ($2) = $1.location; $$ = $2; } @@ -3993,23 +4000,27 @@ lookup_field_wrapper (class, name) tree class, name; { tree type = class; - tree decl; + tree decl = NULL_TREE; java_parser_context_save_global (); - decl = lookup_field (&type, name); /* Last chance: if we're within the context of an inner class, we might be trying to access a local variable defined in an outer context. We try to look for it now. */ - if (INNER_CLASS_TYPE_P (class) && (!decl || decl == error_mark_node)) + if (INNER_CLASS_TYPE_P (class)) { char *alias_buffer; + tree new_name; MANGLE_OUTER_LOCAL_VARIABLE_NAME (alias_buffer, name); - name = get_identifier (alias_buffer); - type = class; - decl = lookup_field (&type, name); + new_name = get_identifier (alias_buffer); + 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); + } java_parser_context_restore_global (); return decl == error_mark_node ? NULL : decl; @@ -4673,7 +4684,7 @@ method_declarator (id, list) /* Then this$<n> */ type = TREE_TYPE (DECL_CONTEXT (GET_CPC ())); - thisn = build_current_thisn (TYPE_NAME (GET_CPC ())); + thisn = build_current_thisn (TREE_TYPE (GET_CPC ())); list = tree_cons (build_wfl_node (thisn), build_pointer_type (type), list); } @@ -5207,10 +5218,8 @@ java_complete_class () push_obstacks (&permanent_obstack, &permanent_obstack); - /* Process imports and reverse the import on demand list */ + /* Process imports */ process_imports (); - if (ctxp->import_demand_list) - ctxp->import_demand_list = nreverse (ctxp->import_demand_list); /* Rever things so we have the right order */ ctxp->class_list = nreverse (ctxp->class_list); @@ -5415,10 +5424,10 @@ do_resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { tree new_class_decl; - tree original_name = NULL_TREE; /* Do not try to replace TYPE_NAME (class_type) by a variable, since - its is changed by find_in_imports{_on_demand} */ + it is changed by find_in_imports{_on_demand} and (but it doesn't + really matter) qualify_and_find */ /* 0- Search in the current class as an inner class */ @@ -5452,12 +5461,11 @@ do_resolve_class (enclosing, class_type, decl, cl) enclosing = do_resolve_class (NULL, name, NULL, NULL); } - /* 1- Check for the type in single imports */ - if (find_in_imports (class_type)) - return NULL_TREE; + /* 1- Check for the type in single imports. This will change + TYPE_NAME() if something relevant is found */ + find_in_imports (class_type); - /* 2- And check for the type in the current compilation unit. If it fails, - try with a name qualified with the package name we've seen so far */ + /* 2- And check for the type in the current compilation unit */ if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) { if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) && @@ -5466,34 +5474,37 @@ do_resolve_class (enclosing, class_type, decl, cl) return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); } - original_name = TYPE_NAME (class_type); + /* 3- Search according to the current package definition */ + 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; + } + + /* 4- Check the import on demands. Don't allow bar.baz to be + imported from foo.* */ + if (!QUALIFIED_P (TYPE_NAME (class_type))) + if (find_in_imports_on_demand (class_type)) + return NULL_TREE; + + /* If found in find_in_imports_on_demant, the type has already been + loaded. */ + if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) + return new_class_decl; + + /* 5- Try with a name qualified with the package name we've seen so far */ if (!QUALIFIED_P (TYPE_NAME (class_type))) { tree package; for (package = package_list; package; package = TREE_CHAIN (package)) - { - tree new_qualified; - - new_qualified = merge_qualified_name (TREE_PURPOSE (package), - original_name); - TYPE_NAME (class_type) = new_qualified; - new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); - if (!new_class_decl) - load_class (TYPE_NAME (class_type), 0); - new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); - if (new_class_decl) - { - if (!CLASS_LOADED_P (TREE_TYPE (new_class_decl)) && - !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl))) - load_class (TYPE_NAME (class_type), 0); - return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); - } - } - } - - TYPE_NAME (class_type) = original_name; - - /* 3- Check an other compilation unit that bears the name of type */ + if ((new_class_decl = qualify_and_find (class_type, + TREE_PURPOSE (package), + TYPE_NAME (class_type)))) + return new_class_decl; + } + + /* 5- Check an other compilation unit that bears the name of type */ load_class (TYPE_NAME (class_type), 0); if (check_pkg_class_access (TYPE_NAME (class_type), (cl ? cl : lookup_cl (decl)))) @@ -5502,16 +5513,30 @@ do_resolve_class (enclosing, class_type, decl, cl) if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) return new_class_decl; - /* 4- Check the import on demands. Don't allow bar.baz to be - imported from foo.* */ - if (!QUALIFIED_P (TYPE_NAME (class_type))) - if (find_in_imports_on_demand (class_type)) - return NULL_TREE; - - /* 5- Last call for a resolution */ + /* 6- Last call for a resolution */ return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); } +static tree +qualify_and_find (class_type, package, name) + tree class_type, package, 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)) && + !CLASS_FROM_SOURCE_P (TREE_TYPE (new_class_decl))) + load_class (new_qualified, 0); + TYPE_NAME (class_type) = new_qualified; + return IDENTIFIER_CLASS_VALUE (new_qualified); + } + return NULL_TREE; +} + /* Resolve NAME and lay it out (if not done and if not the current parsed class). Return a decl node. This function is meant to be called when type resolution is necessary during the walk pass. */ @@ -6385,10 +6410,10 @@ process_imports () return 0; } -/* Possibly find a class imported by a single-type import statement. Return - 1 if an error occured, 0 otherwise. */ +/* Possibly find and mark a class imported by a single-type import + statement. */ -static int +static void find_in_imports (class_type) tree class_type; { @@ -6400,7 +6425,6 @@ find_in_imports (class_type) TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import)); QUALIFIED_P (TYPE_NAME (class_type)) = 1; } - return 0; } static int @@ -6610,6 +6634,30 @@ find_in_imports_on_demand (class_type) return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */ } +/* Add package NAME to the list of package encountered so far. To + speed up class lookup in do_resolve_class, we make sure a + particular package is added only once. */ + +static void +register_package (name) + tree name; +{ + static struct hash_table _pht, *pht = NULL; + + if (!pht) + { + hash_table_init (&_pht, hash_newfunc, + java_hash_hash_tree_node, java_hash_compare_tree_node); + pht = &_pht; + } + + if (!hash_lookup (pht, (const hash_table_key) name, FALSE, NULL)) + { + package_list = chainon (package_list, build_tree_list (name, NULL)); + hash_lookup (pht, (const hash_table_key) name, TRUE, NULL); + } +} + static tree resolve_package (pkg, next) tree pkg, *next; @@ -7378,10 +7426,12 @@ maybe_generate_pre_expand_clinit (class_type) for (current = TYPE_CLINIT_STMT_LIST (class_type); current; current = TREE_CHAIN (current)) { + tree stmt = current; /* We build the assignment expression that will initialize the field to its value. There are strict rules on static initializers (8.5). FIXME */ - tree stmt = build_debugable_stmt (EXPR_WFL_LINECOL (current), current); + if (TREE_CODE (stmt) != BLOCK) + stmt = build_debugable_stmt (EXPR_WFL_LINECOL (stmt), stmt); java_method_add_stmt (mdecl, stmt); } @@ -8342,12 +8392,6 @@ java_expand_classes () java_layout_classes (); java_parse_abort_on_error (); - /* The list of packages declaration seen so far needs to be - reversed, so that package declared in a file being compiled gets - priority over packages declared as a side effect of parsing other - files.*/ - package_list = nreverse (package_list); - saved_ctxp = ctxp_for_generation; for (; ctxp_for_generation; ctxp_for_generation = ctxp_for_generation->next) { @@ -8426,7 +8470,7 @@ make_qualified_primary (primary, right, location) tree wfl; if (TREE_CODE (primary) != EXPR_WITH_FILE_LOCATION) - wfl = build_wfl_wrap (primary); + wfl = build_wfl_wrap (primary, location); else { wfl = primary; @@ -8643,7 +8687,8 @@ resolve_field_access (qual_wfl, field_decl, field_type) return error_mark_node; /* Resolve the LENGTH field of an array here */ - if (DECL_NAME (decl) == length_identifier_node && TYPE_ARRAY_P (type_found) + if (DECL_P (decl) && DECL_NAME (decl) == length_identifier_node + && TYPE_ARRAY_P (type_found) && ! flag_emit_class_files && ! flag_emit_xref) { tree length = build_java_array_length_access (where_found); @@ -10035,7 +10080,8 @@ find_applicable_accessible_methods_list (lc, class, name, arglist) } /* Search interfaces */ - if (CLASS_INTERFACE (TYPE_NAME (class))) + if (TREE_CODE (TYPE_NAME (class)) == TYPE_DECL + && CLASS_INTERFACE (TYPE_NAME (class))) { static struct hash_table t, *searched_interfaces = NULL; static int search_not_done = 0; @@ -10183,6 +10229,7 @@ find_most_specific_methods_list (list) tree list; { int max = 0; + int abstract, candidates; tree current, new_list = NULL_TREE; for (current = list; current; current = TREE_CHAIN (current)) { @@ -10209,24 +10256,33 @@ find_most_specific_methods_list (list) } /* Review the list and select the maximally specific methods */ - for (current = list; current; current = TREE_CHAIN (current)) + 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); + { + new_list = tree_cons (NULL_TREE, TREE_VALUE (current), new_list); + abstract += (METHOD_ABSTRACT (TREE_VALUE (current)) ? 1 : 0); + candidates++; + } /* If we have several and they're all abstract, just pick the closest one. */ + if (candidates > 0 && (candidates == abstract)) + { + new_list = nreverse (new_list); + TREE_CHAIN (new_list) = NULL_TREE; + } - if (new_list && TREE_CHAIN (new_list)) + /* We have several, we couldn't find a most specific, all but one are + abstract, we pick the only non abstract one. */ + if (candidates > 0 && !max && (candidates == abstract+1)) { - tree c; - for (c = new_list; c && METHOD_ABSTRACT (TREE_VALUE (c)); - c = TREE_CHAIN (c)) - ; - if (!c) - { - new_list = nreverse (new_list); - TREE_CHAIN (new_list) = NULL_TREE; - } + for (current = new_list; current; current = TREE_CHAIN (current)) + if (!METHOD_ABSTRACT (TREE_VALUE (current))) + { + TREE_CHAIN (current) = NULL_TREE; + new_list = current; + } } /* If we can't find one, lower expectations and try to gather multiple @@ -11465,8 +11521,9 @@ maybe_absorb_scoping_blocks () /* Wrap a non WFL node around a WFL. */ static tree -build_wfl_wrap (node) +build_wfl_wrap (node, location) tree node; + int location; { tree wfl, node_to_insert = node; @@ -11478,7 +11535,7 @@ build_wfl_wrap (node) else wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0); - EXPR_WFL_LINECOL (wfl) = EXPR_WFL_LINECOL (node); + EXPR_WFL_LINECOL (wfl) = location; EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE); return wfl; } @@ -11644,7 +11701,8 @@ maybe_build_primttype_type_ref (rhs, wfl) tree n = TREE_OPERAND (rhs, 1); if (TREE_CODE (n) == VAR_DECL && DECL_NAME (n) == TYPE_identifier_node - && rhs_type == class_ptr_type) + && rhs_type == class_ptr_type + && TREE_CODE (EXPR_WFL_NODE (wfl)) == IDENTIFIER_NODE) { const char *self_name = IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)); if (!strncmp (self_name, "java.lang.", 10)) @@ -13536,7 +13594,8 @@ patch_new_array_init (type, node) TREE_PURPOSE (current) = NULL_TREE; all_constant = 0; } - if (elt && TREE_VALUE (elt) == error_mark_node) + if (elt && TREE_CODE (elt) == TREE_LIST + && TREE_VALUE (elt) == error_mark_node) error_seen = 1; } |