diff options
author | Alexandre Petit-Bianco <apbianco@cygnus.com> | 2000-03-07 22:09:56 +0000 |
---|---|---|
committer | Alexandre Petit-Bianco <apbianco@gcc.gnu.org> | 2000-03-07 14:09:56 -0800 |
commit | 1729c265058cc349c8298bebc01b684a012bc8f6 (patch) | |
tree | 33e903d1ca8568421d6e5d2dd63b96b066a8e70f /gcc | |
parent | b0699daddf1eead3861e67808ac915f21f82dcf3 (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/java/check-init.c | 8 | ||||
-rw-r--r-- | gcc/java/expr.c | 2 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 5 | ||||
-rw-r--r-- | gcc/java/parse.c | 2 | ||||
-rw-r--r-- | gcc/java/parse.y | 2 |
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; |