aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Petit-Bianco <apbianco@cygnus.com>2000-03-07 22:09:56 +0000
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>2000-03-07 14:09:56 -0800
commit1729c265058cc349c8298bebc01b684a012bc8f6 (patch)
tree33e903d1ca8568421d6e5d2dd63b96b066a8e70f /gcc
parentb0699daddf1eead3861e67808ac915f21f82dcf3 (diff)
downloadgcc-1729c265058cc349c8298bebc01b684a012bc8f6.zip
gcc-1729c265058cc349c8298bebc01b684a012bc8f6.tar.gz
gcc-1729c265058cc349c8298bebc01b684a012bc8f6.tar.bz2
re GNATS gcj/108 (Compiler doesn't check access modifiers on interface implementations)
2000-03-07 Alexandre Petit-Bianco <apbianco@cygnus.com> * java-tree.h (IS_INIT_CHECKED): New flag. * check-init.c (check_init): Test and set IS_INIT_CHECKED. * parse.y (patch_string): Call force_evaluation_order on the completed string concatenation tree. * expr.c (force_evaluation_order): Call force_evaluation_order on function's arguments too. (This fixes the Java PR #108: http://sourceware.cygnus.com/ml/java-prs/1999-q4/msg00174.html) From-SVN: r32391
Diffstat (limited to 'gcc')
-rw-r--r--gcc/java/ChangeLog9
-rw-r--r--gcc/java/check-init.c8
-rw-r--r--gcc/java/expr.c2
-rw-r--r--gcc/java/java-tree.h5
-rw-r--r--gcc/java/parse.c2
-rw-r--r--gcc/java/parse.y2
6 files changed, 26 insertions, 2 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 1620c53..a125f42 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,12 @@
+2000-03-07 Alexandre Petit-Bianco <apbianco@cygnus.com>
+
+ * java-tree.h (IS_INIT_CHECKED): New flag.
+ * check-init.c (check_init): Test and set IS_INIT_CHECKED.
+ * parse.y (patch_string): Call force_evaluation_order on the
+ completed string concatenation tree.
+ * expr.c (force_evaluation_order): Call force_evaluation_order on
+ function's arguments too.
+
Mon Mar 6 18:07:07 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* decl.c (emit_init_test_initialization): Mark KEY as unused.
diff --git a/gcc/java/check-init.c b/gcc/java/check-init.c
index 63ee697..36a0f19 100644
--- a/gcc/java/check-init.c
+++ b/gcc/java/check-init.c
@@ -611,7 +611,6 @@ check_init (exp, before)
case FIX_TRUNC_EXPR:
case INDIRECT_REF:
case ADDR_EXPR:
- case SAVE_EXPR:
case PREDECREMENT_EXPR:
case PREINCREMENT_EXPR:
case POSTDECREMENT_EXPR:
@@ -622,6 +621,13 @@ check_init (exp, before)
exp = TREE_OPERAND (exp, 0);
goto again;
+ case SAVE_EXPR:
+ if (IS_INIT_CHECKED (exp))
+ return;
+ IS_INIT_CHECKED (exp) = 1;
+ exp = TREE_OPERAND (exp, 0);
+ goto again;
+
case COMPOUND_EXPR:
case PLUS_EXPR:
case MINUS_EXPR:
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 4db334d..2d569bf 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -2749,7 +2749,7 @@ force_evaluation_order (node)
for (cmp = NULL_TREE, arg = TREE_OPERAND (node, 1);
arg; arg = TREE_CHAIN (arg))
{
- tree saved = save_expr (TREE_VALUE (arg));
+ tree saved = save_expr (force_evaluation_order (TREE_VALUE (arg)));
cmp = (cmp == NULL_TREE ? saved :
build (COMPOUND_EXPR, void_type_node, cmp, saved));
TREE_VALUE (arg) = saved;
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index e50bab0..950efd4 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -58,6 +58,7 @@ struct JCF;
5: HAS_BEEN_ALREADY_PARSED_P (in IDENTIFIER_NODE)
IS_BREAK_STMT_P (in EXPR_WITH_FILE_LOCATION)
IS_CRAFTED_STRING_BUFFER_P (in CALL_EXPR)
+ IS_INIT_CHECKED (in SAVE_EXPR)
6: CAN_COMPLETE_NORMALLY (in statement nodes).
Usage of TYPE_LANG_FLAG_?:
@@ -869,6 +870,10 @@ extern tree *type_map;
/* True if EXPR (a CALL_EXPR in that case) is a crafted StringBuffer */
#define IS_CRAFTED_STRING_BUFFER_P(EXPR) TREE_LANG_FLAG_5 (EXPR)
+/* True if EXPR (a SAVE_EXPR in that case) had its content already
+ checked for (un)initialized local variables. */
+#define IS_INIT_CHECKED(EXPR) TREE_LANG_FLAG_5 (EXPR)
+
/* If set in CALL_EXPR, the receiver is 'super'. */
#define CALL_USING_SUPER(EXPR) TREE_LANG_FLAG_4 (EXPR)
diff --git a/gcc/java/parse.c b/gcc/java/parse.c
index 5325130..c019101 100644
--- a/gcc/java/parse.c
+++ b/gcc/java/parse.c
@@ -12963,6 +12963,8 @@ patch_string (node)
/* Temporary disable forbid the use of `this'. */
ctxp->explicit_constructor_p = 0;
ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
+ /* String concatenation arguments must be evaluated in order too. */
+ ret = force_evaluation_order (ret);
/* Restore it at its previous value */
ctxp->explicit_constructor_p = saved;
return ret;
diff --git a/gcc/java/parse.y b/gcc/java/parse.y
index 1fb2175..2196968 100644
--- a/gcc/java/parse.y
+++ b/gcc/java/parse.y
@@ -10273,6 +10273,8 @@ patch_string (node)
/* Temporary disable forbid the use of `this'. */
ctxp->explicit_constructor_p = 0;
ret = java_complete_tree (make_qualified_primary (node, invoke, 0));
+ /* String concatenation arguments must be evaluated in order too. */
+ ret = force_evaluation_order (ret);
/* Restore it at its previous value */
ctxp->explicit_constructor_p = saved;
return ret;