+2010-09-03 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/45159
+ * dependency.c (gfc_deb_compare_expr): Compare equal for equal
+ arglists for pure user functions, or for those intrinsic
+ functions which are also pure.
+ * intrinsics.c (add_conv): Mark conversion functions as pure.
+ (add_char_conversions): Likewise.
+
2010-09-03 Daniel Kraft <d@domob.eu>
PR fortran/34162
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;
-
- args1 = e1->value.function.actual;
- args2 = e2->value.function.actual;
- /* We should list the "constant" intrinsic functions. Those
- without side-effects that provide equal results given equal
- argument lists. */
- switch (e1->value.function.isym->id)
+ /* PURE functions can be compared for argument equality. */
+ if ((e1->value.function.esym && e2->value.function.esym
+ && e1->value.function.esym == e2->value.function.esym
+ && e1->value.function.esym->result->attr.pure)
+ || (e1->value.function.isym && e2->value.function.isym
+ && e1->value.function.isym == e2->value.function.isym
+ && e1->value.function.isym->pure))
{
+ args1 = e1->value.function.actual;
+ args2 = e2->value.function.actual;
- case GFC_ISYM_REAL:
- case GFC_ISYM_LOGICAL:
- case GFC_ISYM_DBLE:
- break;
-
- default:
- return -2;
+ /* Compare the argument lists for equality. */
+ 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;
}
+ else
+ return -2;
+ break;
- /* Compare the argument lists for equality. */
- 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;
}
sym->simplify.cc = gfc_convert_constant;
sym->standard = standard;
sym->elemental = 1;
+ sym->pure = 1;
sym->conversion = 1;
sym->ts = to;
sym->id = GFC_ISYM_CONVERSION;
char_conversions[n].simplify.cc = gfc_convert_char_constant;
char_conversions[n].standard = GFC_STD_F2003;
char_conversions[n].elemental = 1;
+ char_conversions[n].pure = 1;
char_conversions[n].conversion = 0;
char_conversions[n].ts = to;
char_conversions[n].id = GFC_ISYM_CONVERSION;
+2010-09-03 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/45159
+ * gfortran.dg/dependency_34.f90: New test.
+
2010-09-03 Steve Ellcey <sje@cup.hp.com>
* gcc.dg/torture/pr44806.c: Add -std=c99 to access uint32_t.
--- /dev/null
+! { dg-do compile }
+! { dg-options "-Warray-temporaries" }
+module foo
+ implicit none
+contains
+ integer pure function bar(i,j)
+ integer, intent(in) :: i,j
+ bar = 3 - i + 1 * abs(i) + j
+ end function bar
+end module foo
+
+program main
+ use foo
+ implicit none
+ real a(10)
+ integer :: i
+ read (*,*) a, i
+ a(i:abs(i)) = a(i:abs(i))
+ a(bar(i,i+2):2) = a(bar(i,i+2):2)
+ a(int(i,kind=2):5) = a(int(i,kind=2)+1:6)
+end program main
+! { dg-final { cleanup-modules "foo" } }