Dear All,
This regression arose from my patch for PR79382. I have removed the
compile time error but have prevented the ICE by ensuring that the
dtio generic symbol has flavor FL_PROCEDURE. dtio_23.f90 has been
modified to incorporate the test for this PR and not to check for the
now absent error message. At the moment, I do not see how to recover
the error. However, with this patch applied, no incorrect code is
generated and the spurious error is suppressed.
Bootstraps and regtests on FC23/x86_64 - OK for trunk?
Paul
2017-03-25 Paul Thomas <[email protected]>
PR fortran/80156
PR fortran/79382
* decl.c (access_attr_decl): Remove the error for an absent
generic DTIO interface and ensure that symbol has the flavor
FL_PROCEDURE.
2017-03-25 Paul Thomas <[email protected]>
PR fortran/80156
PR fortran/79382
* gfortran.dg/dtio_23.f90 : Remove the dg-error and add the
testcase for PR80156. Add a main programme that tests that
the typebound generic is accessible.
--
"If you can't explain it simply, you don't understand it well enough"
- Albert Einstein
Index: gcc/fortran/decl.c
===================================================================
*** gcc/fortran/decl.c (revision 246255)
--- gcc/fortran/decl.c (working copy)
*************** access_attr_decl (gfc_statement st)
*** 7569,7591 ****
case INTERFACE_GENERIC:
case INTERFACE_DTIO:
- if (type == INTERFACE_DTIO
- && gfc_current_ns->proc_name
- && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)
- {
- gfc_find_symbol (name, gfc_current_ns, 0, &sym);
- if (sym == NULL)
- {
- gfc_error ("The GENERIC DTIO INTERFACE at %C is not "
- "present in the MODULE '%s'",
- gfc_current_ns->proc_name->name);
- return MATCH_ERROR;
- }
- }
-
if (gfc_get_symbol (name, NULL, &sym))
goto done;
if (!gfc_add_access (&sym->attr,
(st == ST_PUBLIC)
? ACCESS_PUBLIC : ACCESS_PRIVATE,
--- 7569,7583 ----
case INTERFACE_GENERIC:
case INTERFACE_DTIO:
if (gfc_get_symbol (name, NULL, &sym))
goto done;
+ if (type == INTERFACE_DTIO
+ && gfc_current_ns->proc_name
+ && gfc_current_ns->proc_name->attr.flavor == FL_MODULE
+ && sym->attr.flavor == FL_UNKNOWN)
+ sym->attr.flavor = FL_PROCEDURE;
+
if (!gfc_add_access (&sym->attr,
(st == ST_PUBLIC)
? ACCESS_PUBLIC : ACCESS_PRIVATE,
Index: gcc/testsuite/gfortran.dg/dtio_23.f90
===================================================================
*** gcc/testsuite/gfortran.dg/dtio_23.f90 (revision 246255)
--- gcc/testsuite/gfortran.dg/dtio_23.f90 (working copy)
***************
*** 1,8 ****
! { dg-do compile }
!
! ! Test fix for the original in PR79832.
!
! Contributed by Walt Brainerd <[email protected]>
!
module dollar_mod
--- 1,9 ----
! { dg-do compile }
!
! ! Test fix for the original in PR793822 and for PR80156.
!
! Contributed by Walt Brainerd <[email protected]>
+ ! and (PR80156) <[email protected]>
!
module dollar_mod
*************** module dollar_mod
*** 16,22 ****
generic :: write(formatted) => Write_dollar
end type dollar_type
! PRIVATE :: write (formatted) ! { dg-error "is not present" }
contains
--- 17,23 ----
generic :: write(formatted) => Write_dollar
end type dollar_type
! PRIVATE :: write (formatted) ! This used to ICE
contains
*************** subroutine Write_dollar &
*** 35,37 ****
--- 36,76 ----
end subroutine Write_dollar
end module dollar_mod
+
+ module pr80156
+
+ implicit none
+ private
+
+ type, public :: String
+ character(len=:), allocatable :: raw
+ end type
+
+ public :: write(unformatted) ! Gave an error due to the first fix for
PR79382.
+ interface write(unformatted)
+ module procedure writeUnformatted
+ end interface
+
+ contains
+
+ subroutine writeUnformatted(self, unit, iostat, iomsg)
+ class(String) , intent(in) :: self
+ integer , intent(in) :: unit
+ integer , intent(out) :: iostat
+ character(len=*), intent(inout) :: iomsg
+
+ if (allocated(self%raw)) then
+ write (unit, iostat=iostat, iomsg=iomsg) self%raw
+ else
+ write (unit, iostat=iostat, iomsg=iomsg) ''
+ endif
+
+ end subroutine
+
+ end module
+
+ use dollar_mod
+ type(dollar_type) :: money
+ money = dollar_type(50.0)
+ print '(DT)', money ! Make sure that the typebound generic is accessible.
+ end