Commit 6ab6c0c3 by Paul Thomas

re PR fortran/86863 ([OOP][F2008] type-bound module procedure name not recognized)

2017-08-23  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/86863
	* resolve.c (resolve_typebound_call): If the TBP is not marked
	as a subroutine, check the specific symbol.

2017-08-23  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/86863
	* gfortran.dg/submodule_32.f08: New test.

From-SVN: r263799
parent ba7a2ad8
2017-08-23 Paul Thomas <pault@gcc.gnu.org>
PR fortran/86863
* resolve.c (resolve_typebound_call): If the TBP is not marked
as a subroutine, check the specific symbol.
2018-08-22 Thomas Koenig <tkoenig@gcc.gnu.org>
* gfortran.texi: Mention that asynchronous I/O does
......
......@@ -6266,9 +6266,17 @@ resolve_typebound_call (gfc_code* c, const char **name, bool *overridable)
/* Check that's really a SUBROUTINE. */
if (!c->expr1->value.compcall.tbp->subroutine)
{
gfc_error ("%qs at %L should be a SUBROUTINE",
c->expr1->value.compcall.name, &c->loc);
return false;
if (!c->expr1->value.compcall.tbp->is_generic
&& c->expr1->value.compcall.tbp->u.specific
&& c->expr1->value.compcall.tbp->u.specific->n.sym
&& c->expr1->value.compcall.tbp->u.specific->n.sym->attr.subroutine)
c->expr1->value.compcall.tbp->subroutine = 1;
else
{
gfc_error ("%qs at %L should be a SUBROUTINE",
c->expr1->value.compcall.name, &c->loc);
return false;
}
}
if (!check_typebound_baseobject (c->expr1))
......
2017-08-23 Paul Thomas <pault@gcc.gnu.org>
PR fortran/86863
* gfortran.dg/submodule_32.f08: New test.
2018-08-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/86935
......
! { dg-do run }
!
! Test the fix for PR86863, where the Type Bound Procedures were
! not flagged as subroutines thereby causing an error at the call
! statements.
!
! Contributed by Damian Rouson <damian@sourceryinstitute.org>
!
module foo
implicit none
integer :: flag = 0
type bar
contains
procedure, nopass :: foobar
procedure, nopass :: barfoo
end type
contains
subroutine foobar
flag = 1
end subroutine
subroutine barfoo
flag = 0
end subroutine
end module
module foobartoo
implicit none
interface
module subroutine set(object)
use foo
implicit none
type(bar) object
end subroutine
module subroutine unset(object)
use foo
implicit none
type(bar) object
end subroutine
end interface
contains
module procedure unset
use foo, only : bar
call object%barfoo
end procedure
end module
submodule(foobartoo) subfoobar
contains
module procedure set
use foo, only : bar
call object%foobar
end procedure
end submodule
use foo
use foobartoo
type(bar) :: obj
call set(obj)
if (flag .ne. 1) stop 1
call unset(obj)
if (flag .ne. 0) stop 2
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment