re PR fortran/78443 ([OOP] Incorrect behavior with non_overridable keyword)
2016-11-22 Janus Weil <janus@gcc.gnu.org> PR fortran/78443 * class.c (add_proc_comp): Add a vtype component for non-overridable procedures that are overriding. 2016-11-22 Janus Weil <janus@gcc.gnu.org> PR fortran/78443 * gfortran.dg/typebound_proc_35.f90: New test case. From-SVN: r242703
This commit is contained in:
parent
4fa33072bf
commit
5d382ed61b
@ -1,3 +1,9 @@
|
||||
2016-11-22 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/78443
|
||||
* class.c (add_proc_comp): Add a vtype component for non-overridable
|
||||
procedures that are overriding.
|
||||
|
||||
2016-11-20 Harald Anlauf <anlauf@gmx.de>
|
||||
|
||||
PR fortran/69741
|
||||
|
@ -751,7 +751,7 @@ add_proc_comp (gfc_symbol *vtype, const char *name, gfc_typebound_proc *tb)
|
||||
{
|
||||
gfc_component *c;
|
||||
|
||||
if (tb->non_overridable)
|
||||
if (tb->non_overridable && !tb->overridden)
|
||||
return;
|
||||
|
||||
c = gfc_find_component (vtype, name, true, true, NULL);
|
||||
|
@ -1,3 +1,8 @@
|
||||
2016-11-22 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/78443
|
||||
* gfortran.dg/typebound_proc_35.f90: New test case.
|
||||
|
||||
2016-11-22 Georg-Johann Lay <avr@gjlay.de>
|
||||
|
||||
* gcc.c-torture/execute/pr30778.c (memset): Use size_t for 3rd
|
||||
|
88
gcc/testsuite/gfortran.dg/typebound_proc_35.f90
Normal file
88
gcc/testsuite/gfortran.dg/typebound_proc_35.f90
Normal file
@ -0,0 +1,88 @@
|
||||
! { dg-do run }
|
||||
!
|
||||
! PR 78443: [OOP] Incorrect behavior with non_overridable keyword
|
||||
!
|
||||
! Contributed by federico <perini@wisc.edu>
|
||||
|
||||
module types
|
||||
implicit none
|
||||
|
||||
|
||||
! Abstract parent class and its child type
|
||||
type, abstract :: P1
|
||||
contains
|
||||
procedure :: test => test1
|
||||
procedure (square_interface), deferred :: square
|
||||
endtype
|
||||
|
||||
! Deferred procedure interface
|
||||
abstract interface
|
||||
function square_interface( this, x ) result( y )
|
||||
import P1
|
||||
class(P1) :: this
|
||||
real :: x, y
|
||||
end function square_interface
|
||||
end interface
|
||||
|
||||
type, extends(P1) :: C1
|
||||
contains
|
||||
procedure, non_overridable :: square => C1_square
|
||||
endtype
|
||||
|
||||
! Non-abstract parent class and its child type
|
||||
type :: P2
|
||||
contains
|
||||
procedure :: test => test2
|
||||
procedure :: square => P2_square
|
||||
endtype
|
||||
|
||||
type, extends(P2) :: C2
|
||||
contains
|
||||
procedure, non_overridable :: square => C2_square
|
||||
endtype
|
||||
|
||||
contains
|
||||
|
||||
real function test1( this, x )
|
||||
class(P1) :: this
|
||||
real :: x
|
||||
test1 = this % square( x )
|
||||
end function
|
||||
|
||||
real function test2( this, x )
|
||||
class(P2) :: this
|
||||
real :: x
|
||||
test2 = this % square( x )
|
||||
end function
|
||||
|
||||
function P2_square( this, x ) result( y )
|
||||
class(P2) :: this
|
||||
real :: x, y
|
||||
y = -100. ! dummy
|
||||
end function
|
||||
|
||||
function C1_square( this, x ) result( y )
|
||||
class(C1) :: this
|
||||
real :: x, y
|
||||
y = x**2
|
||||
end function
|
||||
|
||||
function C2_square( this, x ) result( y )
|
||||
class(C2) :: this
|
||||
real :: x, y
|
||||
y = x**2
|
||||
end function
|
||||
|
||||
end module
|
||||
|
||||
program main
|
||||
use types
|
||||
implicit none
|
||||
type(P2) :: t1
|
||||
type(C2) :: t2
|
||||
type(C1) :: t3
|
||||
|
||||
if ( t1 % test( 2. ) /= -100.) call abort()
|
||||
if ( t2 % test( 2. ) /= 4.) call abort()
|
||||
if ( t3 % test( 2. ) /= 4.) call abort()
|
||||
end program
|
Loading…
Reference in New Issue
Block a user