This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/48351] [OOP] Realloc on assignment fails if parent component is CLASS
- From: "townsend at astro dot wisc.edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 7 Jul 2011 02:34:42 +0000
- Subject: [Bug fortran/48351] [OOP] Realloc on assignment fails if parent component is CLASS
- Auto-submitted: auto-generated
- References: <bug-48351-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48351
Rich Townsend <townsend at astro dot wisc.edu> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |townsend at astro dot
| |wisc.edu
--- Comment #3 from Rich Townsend <townsend at astro dot wisc.edu> 2011-07-07 02:34:41 UTC ---
(In reply to comment #0)
> http://groups.google.com/group/comp.lang.fortran/browse_thread/thread/b7a36eba5ef7f68b
> by Nasser M. Abbasi
>
> In the following program "%u" is allocatable. For
>
> this%u = u
>
> the LHS should be allocated, but this only happens if "this" is a TYPE and not
> a CLASS - but that should be completely unrelated to (re)alloc on assignment.
>
> The program works with ifort 11.1.
>
>
> module foo
> implicit none
> type :: foo_t
> ! private
> DOUBLE PRECISION , ALLOCATABLE :: u(:)
> contains
> PROCEDURE :: make ! or procedure, pass, same effect
> end type foo_t
>
> contains
> subroutine make(this,u)
> implicit none
> CLASS(foo_t) :: this
> DOUBLE PRECISION, intent(in) :: u(:) ! must be CLASS
> ! allocate(this%u(size(u))) ! Must allocate now, else crash
> this%u = u
> end subroutine make
> end module foo
>
> program main2
> use foo
> implicit none
> TYPE(foo_t) :: o
> DOUBLE PRECISION , ALLOCATABLE :: u(:)
>
> u=[1,2,3,4]
> CALL o%make(u)
> print *, o%u
> end program main2
I've run into what appears to be this bug with 4.7 (Mac OS 10.6). My sample
code is as follows:
module realloc_lhs_m
implicit none
type mytype
real, allocatable :: a(:)
contains
procedure :: set_a
end type mytype
contains
subroutine set_a (this, a)
class(mytype), intent(out) :: this
real, intent(in) :: a(:)
this%a = a
end subroutine set_a
end module realloc_lhs_m
program realloc_lhs
use realloc_lhs_m
implicit none
real, allocatable :: a(:)
type(mytype) :: m
a = [1.,2.,3.,4.,5.]
call m%set_a(a)
print *, m%a
end program realloc_lhs
This can be easily worked around -- but of course should nevertheless be fixed.
cheers,
Rich