http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50959
Bug #: 50959
Summary: [OOP] Redundant setting of the vptr
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: fortran
AssignedTo: [email protected]
ReportedBy: [email protected]
CC: [email protected]
It is pointless to store the vptr if one does not use it.
Example: The invalid ("x" is not allocated) code
use m
class(t), allocatable :: x
j = x%i
produces the dump:
x._data = 0B;
(struct __vtype_m_T *) x._vptr = &__vtab_m_T;
j = x._data->i;
There is no point for the "x._vptr = ". The vptr for pointers/allocatable
should only be set for ALLOCATE (explicit or polymorphic intrinsic) or pointer
assignment - but not as part of the initialization.
For a more real-world example, see below. There one has:
(struct __vtype_m_T *) x._vptr = &__vtab_m_T;
/* malloc block */
(struct __vtype_m_T *) x._vptr = &__vtab_m_T;
where the last line is part of the ALLOCATE.
module m
type t
contains
procedure, nopass :: bar => base
end type t
type, extends(t) :: t2
contains
procedure, nopass :: bar => ext
end type t2
contains
subroutine base()
write(*,*) 'BASE t1'
end subroutine
subroutine ext()
write(*,*) 'EXT t2'
end subroutine
end module
program test
use m
class(t), allocatable :: x
allocate (t :: x)
call x%bar ()
end program test