aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2007-11-16 14:47:31 +0000
committerPaul Thomas <pault@gcc.gnu.org>2007-11-16 14:47:31 +0000
commit06bcd7510e792c17a6a5354c612cf288b37a08c4 (patch)
tree727b197952b036bc87e12eea803c0341debe75b2 /gcc
parent99739a3e63eb906c77b8acdb76d4f40485eb56fe (diff)
downloadgcc-06bcd7510e792c17a6a5354c612cf288b37a08c4.zip
gcc-06bcd7510e792c17a6a5354c612cf288b37a08c4.tar.gz
gcc-06bcd7510e792c17a6a5354c612cf288b37a08c4.tar.bz2
re PR fortran/34008 (ICE in gfc_trans_call, at fortran/trans-stmt.c:389 on elemental assignment)
2007-11-16 Paul Thomas <pault@gcc.gnu.org> PR fortran/34008 * trans-stmt.c (gfc_conv_elemental_dependencies): Add check for INTENT_INOUT as well as INTENT_OUT. (gfc_trans_call): Remove redundant gcc_asserts in dependency check. 2007-11-16 Paul Thomas <pault@gcc.gnu.org> PR fortran/34008 * gfortran.dg/interface_assignment_3.f90. From-SVN: r130232
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog15
-rw-r--r--gcc/fortran/trans-stmt.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/interface_assignment_3.f9049
4 files changed, 73 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 776b652..fb94711 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,9 +1,24 @@
2007-11-16 Paul Thomas <pault@gcc.gnu.org>
+ PR fortran/34008
+ * trans-stmt.c (gfc_conv_elemental_dependencies): Add check for
+ INTENT_INOUT as well as INTENT_OUT.
+ (gfc_trans_call): Remove redundant gcc_asserts in dependency
+ check.
+
+2007-11-16 Paul Thomas <pault@gcc.gnu.org>
+
PR fortran/33986
* trans-array.c (gfc_conv_array_parameter ): Allow allocatable
function results.
+2007-11-15 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/33917
+ * decl.c (match_procedure_decl): Pre-resolve interface.
+ * resolve.c (resolve_symbol): Reject interfaces later
+ declared in procedure statements.
+
2007-11-13 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/33162
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index cbb15a5..ee176dc 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -246,8 +246,9 @@ gfc_conv_elemental_dependencies (gfc_se * se, gfc_se * loopse,
fsym = formal ? formal->sym : NULL;
if (e->expr_type == EXPR_VARIABLE
&& e->rank && fsym
- && fsym->attr.intent == INTENT_OUT
- && gfc_check_fncall_dependency (e, INTENT_OUT, sym, arg0))
+ && fsym->attr.intent != INTENT_IN
+ && gfc_check_fncall_dependency (e, fsym->attr.intent,
+ sym, arg0))
{
/* Make a local loopinfo for the temporary creation, so that
none of the other ss->info's have to be renormalized. */
@@ -380,14 +381,11 @@ gfc_trans_call (gfc_code * code, bool dependency_check)
gfc_copy_loopinfo_to_se (&loopse, &loop);
loopse.ss = ss;
- /* For operator assignment, we need to do dependency checking.
- We also check the intent of the parameters. */
+ /* For operator assignment, do dependency checking. */
if (dependency_check)
{
gfc_symbol *sym;
sym = code->resolved_sym;
- gcc_assert (sym->formal->sym->attr.intent == INTENT_OUT);
- gcc_assert (sym->formal->next->sym->attr.intent == INTENT_IN);
gfc_conv_elemental_dependencies (&se, &loopse, sym,
code->ext.actual);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dc2c207..a2a1caa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-16 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/34008
+ * gfortran.dg/interface_assignment_3.f90.
+
2007-11-16 Richard Guenther <rguenther@suse.de>
PR tree-optimization/33870
diff --git a/gcc/testsuite/gfortran.dg/interface_assignment_3.f90 b/gcc/testsuite/gfortran.dg/interface_assignment_3.f90
new file mode 100644
index 0000000..6b7881b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/interface_assignment_3.f90
@@ -0,0 +1,49 @@
+! { dg-do compile }
+! Checks the fix for PR34008, in which INTENT(INOUT) was disallowed
+! for the first argument of assign_m, whereas both INOUT and OUT
+! should be allowed.
+!
+! Contributed by Harald Anlauf <anlauf@gmx.de>
+!
+module mo_memory
+ implicit none
+ type t_mi
+ logical :: alloc = .false.
+ end type t_mi
+ type t_m
+ type(t_mi) :: i ! meta data
+ real, pointer :: ptr (:,:,:,:) => NULL ()
+ end type t_m
+
+ interface assignment (=)
+ module procedure assign_m
+ end interface
+contains
+ elemental subroutine assign_m (y, x)
+ !---------------------------------------
+ ! overwrite intrinsic assignment routine
+ !---------------------------------------
+ type (t_m), intent(inout) :: y
+ type (t_m), intent(in) :: x
+ y% i = x% i
+ if (y% i% alloc) y% ptr = x% ptr
+ end subroutine assign_m
+end module mo_memory
+
+module gfcbug74
+ use mo_memory, only: t_m, assignment (=)
+ implicit none
+ type t_atm
+ type(t_m) :: m(42)
+ end type t_atm
+contains
+ subroutine assign_atm_to_atm (y, x)
+ type (t_atm), intent(inout) :: y
+ type (t_atm), intent(in) :: x
+ integer :: i
+! do i=1,42; y% m(i) = x% m(i); end do ! Works
+ y% m = x% m ! ICE
+ end subroutine assign_atm_to_atm
+end module gfcbug74
+! { dg-final { cleanup-modules "mo_memory gfcbug74" } }
+