aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1997-11-02 18:49:29 -0800
committerJeff Law <law@gcc.gnu.org>1997-11-02 19:49:29 -0700
commitaf75269882c389f1abce41e732b27fdfedba1131 (patch)
treea6fe550b8a49ba2c769237d4f02e2c52e7308cd0 /gcc
parentcbd44549e68e0124548f12f3500a0a64ff17b3f9 (diff)
downloadgcc-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.egcs5
-rw-r--r--gcc/f/com.c82
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: