diff options
author | Richard Henderson <rth@cygnus.com> | 1997-11-02 18:49:29 -0800 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-11-02 19:49:29 -0700 |
commit | af75269882c389f1abce41e732b27fdfedba1131 (patch) | |
tree | a6fe550b8a49ba2c769237d4f02e2c52e7308cd0 /gcc | |
parent | cbd44549e68e0124548f12f3500a0a64ff17b3f9 (diff) | |
download | gcc-af75269882c389f1abce41e732b27fdfedba1131.zip gcc-af75269882c389f1abce41e732b27fdfedba1131.tar.gz gcc-af75269882c389f1abce41e732b27fdfedba1131.tar.bz2 |
com.c (ffecom_expr_): Only use TREE_TYPE argument for simple arithmetic...
* com.c (ffecom_expr_): Only use TREE_TYPE argument for simple
arithmetic; convert types as necessary; recurse with target tree type.
CVS _----------------------------------------------------------------------
From-SVN: r16287
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/f/ChangeLog.egcs | 5 | ||||
-rw-r--r-- | gcc/f/com.c | 82 |
2 files changed, 67 insertions, 20 deletions
diff --git a/gcc/f/ChangeLog.egcs b/gcc/f/ChangeLog.egcs index eb3f9b5..9f11174 100644 --- a/gcc/f/ChangeLog.egcs +++ b/gcc/f/ChangeLog.egcs @@ -1,3 +1,8 @@ +Sun Nov 2 19:49:51 1997 Richard Henderson <rth@cygnus.com> + + * com.c (ffecom_expr_): Only use TREE_TYPE argument for simple + arithmetic; convert types as necessary; recurse with target tree type. + Wed Oct 22 11:37:41 1997 Richard Henderson <rth@cygnus.com> * com.c (ffecom_expr_): Take an new arg TREE_TYPE that if non-null diff --git a/gcc/f/com.c b/gcc/f/com.c index ba197f9..e53190a 100644 --- a/gcc/f/com.c +++ b/gcc/f/com.c @@ -2674,7 +2674,7 @@ ffecom_do_entry_ (ffesymbol fn, int entrynum) #if FFECOM_targetCURRENT == FFECOM_targetGCC static tree -ffecom_expr_ (ffebld expr, tree tree_type, tree dest_tree, +ffecom_expr_ (ffebld expr, tree tree_type_x, tree dest_tree, ffebld dest, bool *dest_used, bool assignp) { @@ -2685,6 +2685,8 @@ ffecom_expr_ (ffebld expr, tree tree_type, tree dest_tree, ffeinfoKindtype kt; tree t; tree dt; /* decl_tree for an ffesymbol. */ + tree tree_type; + tree left, right; ffesymbol s; enum tree_code code; @@ -2695,8 +2697,7 @@ ffecom_expr_ (ffebld expr, tree tree_type, tree dest_tree, bt = ffeinfo_basictype (ffebld_info (expr)); kt = ffeinfo_kindtype (ffebld_info (expr)); - if (!tree_type) - tree_type = ffecom_tree_type[bt][kt]; + tree_type = ffecom_tree_type[bt][kt]; switch (ffebld_op (expr)) { @@ -2940,35 +2941,76 @@ ffecom_expr_ (ffebld expr, tree tree_type, tree dest_tree, } case FFEBLD_opUPLUS: - return ffecom_1 (NOP_EXPR, tree_type, ffecom_expr (ffebld_left (expr))); + left = ffecom_expr_ (ffebld_left (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + return ffecom_1 (NOP_EXPR, tree_type, left); case FFEBLD_opPAREN: /* ~~~Make sure Fortran rules respected here */ - return ffecom_1 (NOP_EXPR, tree_type, ffecom_expr (ffebld_left (expr))); + left = ffecom_expr_ (ffebld_left (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + return ffecom_1 (NOP_EXPR, tree_type, left); case FFEBLD_opUMINUS: - return ffecom_1 (NEGATE_EXPR, tree_type, - ffecom_expr (ffebld_left (expr))); + left = ffecom_expr_ (ffebld_left (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + if (tree_type_x) + { + tree_type = tree_type_x; + left = convert (tree_type, left); + } + return ffecom_1 (NEGATE_EXPR, tree_type, left); case FFEBLD_opADD: - return ffecom_2 (PLUS_EXPR, tree_type, - ffecom_expr (ffebld_left (expr)), - ffecom_expr (ffebld_right (expr))); - break; + left = ffecom_expr_ (ffebld_left (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + right = ffecom_expr_ (ffebld_right (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + if (tree_type_x) + { + tree_type = tree_type_x; + left = convert (tree_type, left); + right = convert (tree_type, right); + } + return ffecom_2 (PLUS_EXPR, tree_type, left, right); case FFEBLD_opSUBTRACT: - return ffecom_2 (MINUS_EXPR, tree_type, - ffecom_expr (ffebld_left (expr)), - ffecom_expr (ffebld_right (expr))); + left = ffecom_expr_ (ffebld_left (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + right = ffecom_expr_ (ffebld_right (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + if (tree_type_x) + { + tree_type = tree_type_x; + left = convert (tree_type, left); + right = convert (tree_type, right); + } + return ffecom_2 (MINUS_EXPR, tree_type, left, right); case FFEBLD_opMULTIPLY: - return ffecom_2 (MULT_EXPR, tree_type, - ffecom_expr (ffebld_left (expr)), - ffecom_expr (ffebld_right (expr))); + left = ffecom_expr_ (ffebld_left (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + right = ffecom_expr_ (ffebld_right (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + if (tree_type_x) + { + tree_type = tree_type_x; + left = convert (tree_type, left); + right = convert (tree_type, right); + } + return ffecom_2 (MULT_EXPR, tree_type, left, right); case FFEBLD_opDIVIDE: - return ffecom_tree_divide_ (tree_type, - ffecom_expr (ffebld_left (expr)), - ffecom_expr (ffebld_right (expr)), + left = ffecom_expr_ (ffebld_left (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + right = ffecom_expr_ (ffebld_right (expr), tree_type_x, NULL, NULL, + NULL, FALSE); + if (tree_type_x) + { + tree_type = tree_type_x; + left = convert (tree_type, left); + right = convert (tree_type, right); + } + return ffecom_tree_divide_ (tree_type, left, right, dest_tree, dest, dest_used); case FFEBLD_opPOWER: |