mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 14:11:18 +08:00
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
This commit is contained in:
parent
99739a3e63
commit
06bcd7510e
gcc
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
49
gcc/testsuite/gfortran.dg/interface_assignment_3.f90
Normal file
49
gcc/testsuite/gfortran.dg/interface_assignment_3.f90
Normal file
@ -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" } }
|
||||
|
Loading…
x
Reference in New Issue
Block a user