aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog14
-rw-r--r--gcc/fortran/ChangeLog-20084
-rw-r--r--gcc/fortran/dependency.c34
-rw-r--r--gcc/fortran/trans-stmt.c8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/elemental_dependency_3.f9027
-rw-r--r--gcc/testsuite/gfortran.dg/elemental_subroutine_7.f9040
7 files changed, 114 insertions, 19 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index c7f9107..2bf2a01 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,17 @@
+2009-01-04 Mikael Morin <mikael.morin@tele2.fr>
+
+ PR fortran/35681
+ * ChangeLog-2008: Fix function name.
+
+ PR fortran/38487
+ * dependency.c (gfc_check_argument_var_dependency):
+ Move the check for pointerness inside the if block
+ so that it doesn't affect the return value.
+
+ PR fortran/38669
+ * trans-stmt.c (gfc_trans_call):
+ Add the dependency code after the loop bounds calculation one.
+
2009-01-04 Daniel Franke <franke.daniel@gmail.com>
* intrinsic.c (do_simplify): Removed already implemented TODO.
diff --git a/gcc/fortran/ChangeLog-2008 b/gcc/fortran/ChangeLog-2008
index d1135b3..b4b7f2a 100644
--- a/gcc/fortran/ChangeLog-2008
+++ b/gcc/fortran/ChangeLog-2008
@@ -322,9 +322,9 @@
(gfc_check_fncall_dependency): Add elemental check flag.
Update call to gfc_check_argument_dependency.
* trans-stmt.c (gfc_trans_call): Make call to
- gfc_conv_elemental_dependency unconditional, but with a flag
+ gfc_conv_elemental_dependencies unconditional, but with a flag
whether we should check dependencies between variables.
- (gfc_conv_elemental_dependency): Add elemental check flag.
+ (gfc_conv_elemental_dependencies): Add elemental check flag.
Update call to gfc_check_fncall_dependency.
* trans-expr.c (gfc_trans_arrayfunc_assign): Update call to
gfc_check_fncall_dependency.
diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c
index 639d6e3..b110f4a 100644
--- a/gcc/fortran/dependency.c
+++ b/gcc/fortran/dependency.c
@@ -469,23 +469,25 @@ gfc_check_argument_var_dependency (gfc_expr *var, sym_intent intent,
if (gfc_ref_needs_temporary_p (expr->ref)
|| gfc_check_dependency (var, expr, !elemental))
{
- if (elemental == ELEM_DONT_CHECK_VARIABLE
- && !gfc_is_data_pointer (var)
- && !gfc_is_data_pointer (expr))
+ if (elemental == ELEM_DONT_CHECK_VARIABLE)
{
- /* Elemental procedures forbid unspecified intents,
- and we don't check dependencies for INTENT_IN args. */
- gcc_assert (intent == INTENT_OUT || intent == INTENT_INOUT);
-
- /* We are told not to check dependencies.
- We do it, however, and issue a warning in case we find one.
- If a dependency is found in the case
- elemental == ELEM_CHECK_VARIABLE, we will generate
- a temporary, so we don't need to bother the user. */
- gfc_warning ("INTENT(%s) actual argument at %L might interfere "
- "with actual argument at %L.",
- intent == INTENT_OUT ? "OUT" : "INOUT",
- &var->where, &expr->where);
+ /* Too many false positive with pointers. */
+ if (!gfc_is_data_pointer (var) && !gfc_is_data_pointer (expr))
+ {
+ /* Elemental procedures forbid unspecified intents,
+ and we don't check dependencies for INTENT_IN args. */
+ gcc_assert (intent == INTENT_OUT || intent == INTENT_INOUT);
+
+ /* We are told not to check dependencies.
+ We do it, however, and issue a warning in case we find one.
+ If a dependency is found in the case
+ elemental == ELEM_CHECK_VARIABLE, we will generate
+ a temporary, so we don't need to bother the user. */
+ gfc_warning ("INTENT(%s) actual argument at %L might "
+ "interfere with actual argument at %L.",
+ intent == INTENT_OUT ? "OUT" : "INOUT",
+ &var->where, &expr->where);
+ }
return 0;
}
else
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 9505dfb..801063d 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -386,6 +386,7 @@ gfc_trans_call (gfc_code * code, bool dependency_check)
stmtblock_t body;
stmtblock_t block;
gfc_se loopse;
+ gfc_se depse;
/* gfc_walk_elemental_function_args renders the ss chain in the
reverse order to the actual argument order. */
@@ -413,9 +414,14 @@ gfc_trans_call (gfc_code * code, bool dependency_check)
check_variable = ELEM_CHECK_VARIABLE;
else
check_variable = ELEM_DONT_CHECK_VARIABLE;
- gfc_conv_elemental_dependencies (&se, &loopse, code->resolved_sym,
+
+ gfc_init_se (&depse, NULL);
+ gfc_conv_elemental_dependencies (&depse, &loopse, code->resolved_sym,
code->ext.actual, check_variable);
+ gfc_add_block_to_block (&loop.pre, &depse.pre);
+ gfc_add_block_to_block (&loop.post, &depse.post);
+
/* Generate the loop body. */
gfc_start_scalarized_body (&loop, &body);
gfc_init_block (&block);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a38b9d1..fde2ce2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2009-01-04 Mikael Morin <mikael.morin@tele2.fr>
+
+ PR fortran/38669
+ * gfortran.dg/elemental_dependency_3.f90: New test.
+ * gfortran.dg/elemental_subroutine_7.f90: New test.
+
2009-01-04 Uros Bizjak <ubizjak@gmail.com>
* gcc.dg/struct-ret-3.c: Include unistd.h.
diff --git a/gcc/testsuite/gfortran.dg/elemental_dependency_3.f90 b/gcc/testsuite/gfortran.dg/elemental_dependency_3.f90
new file mode 100644
index 0000000..ac0a882
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/elemental_dependency_3.f90
@@ -0,0 +1,27 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! PR fortran/38669
+! Temporary created for pointer as actual argument of an elemental subroutine
+!
+! Original testcase by Harald Anlauf <anlauf@gmx.de>
+
+program gfcbu84_main
+ implicit none
+ integer :: jplev, k_lev
+ real :: p(42)
+ real, pointer :: q(:)
+ jplev = 42
+ k_lev = 1
+ allocate (q(jplev))
+ call tq_tvgh (q(k_lev:), p(k_lev:))
+ deallocate (q)
+
+ contains
+ elemental subroutine tq_tvgh (t, p)
+ real ,intent (out) :: t
+ real ,intent (in) :: p
+ t=p
+ end subroutine tq_tvgh
+end program gfcbu84_main
+! { dg-final { scan-tree-dump-times "atmp" 0 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/elemental_subroutine_7.f90 b/gcc/testsuite/gfortran.dg/elemental_subroutine_7.f90
new file mode 100644
index 0000000..20e0e0c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/elemental_subroutine_7.f90
@@ -0,0 +1,40 @@
+! { dg-do run }
+!
+! PR fortran/38669
+! Loop bounds temporaries used before being defined for elemental subroutines
+!
+! Original testcase by Harald Anlauf <anlauf@gmx.de>
+
+program gfcbu84_main
+ implicit none
+ integer :: jplev, k_lev
+ integer :: p(42)
+ real :: r(42)
+ integer, pointer :: q(:)
+ jplev = 42
+ k_lev = 1
+ call random_number (r)
+ p = 20 * r - 10
+ allocate (q(jplev))
+
+ q = 0
+ call tq_tvgh (q(k_lev:), p(k_lev:))
+ if (any (p /= q)) call abort
+
+ q = 0
+ call tq_tvgh (q(k_lev:), (p(k_lev:)))
+ if (any (p /= q)) call abort
+
+ q = 0
+ call tq_tvgh (q(k_lev:), (p(p(k_lev:))))
+ if (any (p(p) /= q)) call abort
+
+ deallocate (q)
+
+ contains
+ elemental subroutine tq_tvgh (t, p)
+ integer ,intent (out) :: t
+ integer ,intent (in) :: p
+ t=p
+ end subroutine tq_tvgh
+end program gfcbu84_main