This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/50919] New: [OOP] Don't use vtable for NON_OVERRIDABLE TBP
- From: "burnus at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 30 Oct 2011 10:09:03 +0000
- Subject: [Bug fortran/50919] New: [OOP] Don't use vtable for NON_OVERRIDABLE TBP
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50919
Bug #: 50919
Summary: [OOP] Don't use vtable for NON_OVERRIDABLE TBP
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: burnus@gcc.gnu.org
CC: janus@gcc.gnu.org
Current, gfortran uses always a vtable for type-bound procedures. However, a
vtable only makes sense if the type-bound procedure can be overridden (C++: if
it is "virtual").
Expected:
a) gfortran call the procedure directly, which allows for inlining and avoids
the pointer dereference.
b) When the ABI is changed, the procedure is no longer added to the vtable.
Hence, it should be added as item to
http://gcc.gnu.org/wiki/LibgfortranAbiCleanup
Test case. The dump shows the following rather than a simple "test ()":
callit (struct __class_m_T & restrict x)
{
x->_vptr->test ();
module m
type t
contains
procedure, nopass, NON_OVERRIDABLE :: test
end type t
contains
subroutine test()
print *, "t's test"
end subroutine test
subroutine callit(x)
class(t) :: x
call x%test()
end subroutine
end module m
tob@archimedes:/dev/shm> less poly.f90.*
tob@archimedes:/dev/shm> cat poly.f90
module m
type t
contains
procedure, nopass, NON_OVERRIDABLE :: test
end type t
contains
subroutine test()
print *, "t's test"
end subroutine test
subroutine callit(x)
class(t) :: x
call x%test()
end subroutine
end module m