diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-11 22:25:58 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-11 22:25:58 +0000 |
commit | bee621f2d5f9ec8a0fe1771d4481af18ecbf1b6b (patch) | |
tree | 160412e4c30689240c5cb4f4ee1ae6194d4735b6 /gcc/fortran/dependency.c | |
parent | 158733a6ea24a2dc0481442467f2302fc3c598ce (diff) | |
download | gcc-bee621f2d5f9ec8a0fe1771d4481af18ecbf1b6b.tar.gz |
* dependency.c (gfc_dep_compare_expr) <EXPR_OP>: Allow unary and
binary operators to compare equal if their operands are equal.
<EXPR_FUNCTION>: Allow "constant" intrinsic conversion functions
to compare equal, if their operands are equal.
* gfortran.dg/dependency_10.f90: New test case.
* gfortran.dg/dependency_11.f90: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111970 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/dependency.c')
-rw-r--r-- | gcc/fortran/dependency.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 187b2077716..d60b7ebbceb 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -97,6 +97,57 @@ gfc_dep_compare_expr (gfc_expr * e1, gfc_expr * e2) return 0; return -2; + case EXPR_OP: + /* Intrinsic operators are the same if their operands are the same. */ + if (e1->value.op.operator != e2->value.op.operator) + return -2; + if (e1->value.op.op2 == 0) + { + i = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1); + return i == 0 ? 0 : -2; + } + if (gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1) == 0 + && gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2) == 0) + return 0; + /* TODO Handle commutative binary operators here? */ + return -2; + + case EXPR_FUNCTION: + /* We can only compare calls to the same intrinsic function. */ + if (e1->value.function.isym == 0 + || e2->value.function.isym == 0 + || e1->value.function.isym != e2->value.function.isym) + return -2; + + /* We should list the "constant" intrinsic functions. Those + without side-effects that provide equal results given equal + argument lists. */ + switch (e1->value.function.isym->generic_id) + { + case GFC_ISYM_CONVERSION: + case GFC_ISYM_REAL: + case GFC_ISYM_LOGICAL: + case GFC_ISYM_DBLE: + break; + + default: + return -2; + } + + /* Compare the argument lists for equality. */ + { + gfc_actual_arglist *args1 = e1->value.function.actual; + gfc_actual_arglist *args2 = e2->value.function.actual; + while (args1 && args2) + { + if (gfc_dep_compare_expr (args1->expr, args2->expr) != 0) + return -2; + args1 = args1->next; + args2 = args2->next; + } + return (args1 || args2) ? -2 : 0; + } + default: return -2; } |