From 97458df5ebc7eb9d723735b457bc6451b13f1b68 Mon Sep 17 00:00:00 2001 From: law Date: Mon, 3 Nov 1997 02:49:29 +0000 Subject: [PATCH] * com.c (ffecom_expr_): Only use TREE_TYPE argument for simple arithmetic; convert types as necessary; recurse with target tree type. CVS _---------------------------------------------------------------------- git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@16287 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/f/ChangeLog.egcs | 5 ++++ 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 eb3f9b5099c..9f11174616b 100644 --- a/gcc/f/ChangeLog.egcs +++ b/gcc/f/ChangeLog.egcs @@ -1,3 +1,8 @@ +Sun Nov 2 19:49:51 1997 Richard Henderson + + * 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 * 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 ba197f9829f..e53190abbbb 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: -- 2.11.0