This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/54784] [4.7/4.8 Regression] [OOP] wrong code in polymorphic allocation with SOURCE


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54784

Salvatore Filippone <sfilippone at uniroma2 dot it> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |sfilippone at uniroma2 dot
                   |                            |it

--- Comment #8 from Salvatore Filippone <sfilippone at uniroma2 dot it> 2012-10-08 16:22:42 UTC ---
Hello,
I have a different problem that is definitely related to this area, but may or
may not be the same. 
I have (as usual :) a complex nesting of polymorphic derived types, and I have
a need to handle reallocation and re-population of a vector of such containers. 
The type hierarchy is something like this

  type mld_d_base_solver_type
  end type 

  type  mld_d_base_smoother_type
    class(mld_d_base_solver_type), allocatable :: sv
  end 

  type mld_d_onelev_type
    class(mld_d_base_smoother_type), allocatable :: sm
  end type 

  type, extends(psb_dprec_type)         :: mld_dprec_type
    type(mld_d_onelev_type), allocatable :: precv(:) 
  end type 


Consider the following snippet of code:
  --------------------
    deallocate(p%precv,stat=info)

    if (info == 0) allocate(p%precv(newsz),stat=info) 
    if (info /= 0) then 
      info = -1
      return
    end if

    do i=1, newsz
      if (info == 0) then 
        if (i ==1) then 
          allocate(p%precv(i)%sm,source=base_sm,stat=info) 
        else if (i < newsz) then 
          allocate(p%precv(i)%sm,source=med_sm,stat=info) 
        else
          allocate(p%precv(i)%sm,source=coarse_sm,stat=info) 
        end if
      end if
      if (info /= 0) then 
        info = -1
        return
      end if
      write(0,*) 'Copy back at level',i
      do k=1,i
        write(0,*) '   level',k
        call p%precv(k)%sm%sv%descr(info,iout=0)
        if (info /= 0) return
      end do



    end do
------------------------------------------------
You would expect the allocate with source at I=4 to leave untouched the
elements of p%precv(1:3), and yet this is the output I get with 4.7.2:
------------------------------------------------

 Copy back at level           1
    level           1
   TLU: test a new solver kind

 Copy back at level           2
    level           1
   TLU: test a new solver kind

    level           2
   TLU: test a new solver kind

 Copy back at level           3
    level           1
   TLU: test a new solver kind

    level           2
   TLU: test a new solver kind

    level           3
   TLU: test a new solver kind

 Copy back at level           4
    level           1
   Incomplete factorization solver: ILU(n)         
   Fill level:           0
    level           2
   Incomplete factorization solver: ILU(n)         
   Fill level:           0
    level           3
   Incomplete factorization solver: ILU(n)         
   Fill level:           0
    level           4
   Incomplete factorization solver: ILU(n)         
   Fill level:           0
 Intermediate at level 1
   Incomplete factorization solver: ILU(n)         
   Fill level:           0
-----------------------------------------------------------------
This clearly does not make sense. 
I can send Janus the full code to reproduce the error. 
Does it seem related? 
Thanks
Salvatore


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]