summaryrefslogtreecommitdiff
path: root/gcc/fortran/dependency.c
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-11 22:25:58 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-11 22:25:58 +0000
commitbee621f2d5f9ec8a0fe1771d4481af18ecbf1b6b (patch)
tree160412e4c30689240c5cb4f4ee1ae6194d4735b6 /gcc/fortran/dependency.c
parent158733a6ea24a2dc0481442467f2302fc3c598ce (diff)
downloadgcc-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.c51
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;
}