re PR fortran/80156 (Generic DTIO interface reported missing if public statement...
authorPaul Thomas <pault@gcc.gnu.org>
Sat, 25 Mar 2017 17:38:17 +0000 (17:38 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sat, 25 Mar 2017 17:38:17 +0000 (17:38 +0000)
2017-03-25  Paul Thomas  <pault@gcc.gnu.org>

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  <pault@gcc.gnu.org>

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.

From-SVN: r246476

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dtio_23.f90

index 344798d49a744503890a265c0f7aed77d5867618..20ad8578bfaf5ceec3bbacc64faa1a83659e1971 100644 (file)
@@ -1,3 +1,11 @@
+2017-03-25  Paul Thomas  <pault@gcc.gnu.org>
+
+       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-22  Dominique d'Humieres  <dominiq@lps.ens.fr>
 
        PR fortran/79838
index a04f5a66ec31b129865ecef2b74b2bc4de397815..5ca664e57a5740a1559480a0c15d5c9b5ebdb16d 100644 (file)
@@ -7570,23 +7570,15 @@ access_attr_decl (gfc_statement st)
        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 %qs",
-                            gfc_current_ns->proc_name->name);
-                 return MATCH_ERROR;
-               }
-           }
-
          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 36a082a305cb1879c91fdddb40738d3f66f6da64..8306a1c0c35cf39b9c8842be76d008b14373a45b 100644 (file)
@@ -1,3 +1,11 @@
+2017-03-25  Paul Thomas  <pault@gcc.gnu.org>
+
+       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.
+
 2017-03-25  Bernd Schmidt  <bschmidt@redhat.com>
 
        PR rtl-optimization/80160
index 4ebddbbe854bb87e37ee628d0bec25ac892756c4..bee9acbd6b592c17313a917798e5081af5ce3dcc 100644 (file)
@@ -1,8 +1,9 @@
 ! { dg-do compile }
 !
-! Test fix for the original in PR79832.
+! Test fix for the original in PR793822 and for PR80156.
 !
 ! Contributed by Walt Brainerd  <walt.brainerd@gmail.com>
+! and (PR80156)  <pedsxing@gmx.net>
 !
 module dollar_mod
 
@@ -16,7 +17,7 @@ module dollar_mod
       generic :: write(formatted) => Write_dollar
    end type dollar_type
 
-   PRIVATE :: write (formatted) ! { dg-error "is not present" }
+   PRIVATE :: write (formatted) ! This used to ICE
 
 contains
 
@@ -35,3 +36,41 @@ subroutine Write_dollar &
 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