re PR fortran/54756 ([OOP] [F08] Should reject CLASS, intent(out) in PURE procedures)
authorJanus Weil <janus@gcc.gnu.org>
Sat, 27 Dec 2014 22:40:21 +0000 (23:40 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 27 Dec 2014 22:40:21 +0000 (23:40 +0100)
2014-12-27  Janus Weil  <janus@gcc.gnu.org>

PR fortran/54756
* resolve.c (resolve_formal_arglist): Reject polymorphic INTENT(OUT)
arguments of pure procedures.

2014-12-27  Janus Weil  <janus@gcc.gnu.org>

PR fortran/54756
* gfortran.dg/class_array_3.f03: Fixed invalid test case.
* gfortran.dg/class_array_7.f03: Ditto.
* gfortran.dg/class_dummy_4.f03: Ditto.
* gfortran.dg/defined_assignment_3.f90: Ditto.
* gfortran.dg/defined_assignment_5.f90: Ditto.
* gfortran.dg/elemental_subroutine_10.f90: Ditto.
* gfortran.dg/typebound_operator_4.f03: Ditto.
* gfortran.dg/typebound_proc_16.f03: Ditto.
* gfortran.dg/unlimited_polymorphic_19.f90: Ditto.
* gfortran.dg/class_dummy_5.f90: New test.

From-SVN: r219085

13 files changed:
gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/class_array_3.f03
gcc/testsuite/gfortran.dg/class_array_7.f03
gcc/testsuite/gfortran.dg/class_dummy_4.f03
gcc/testsuite/gfortran.dg/class_dummy_5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/defined_assignment_3.f90
gcc/testsuite/gfortran.dg/defined_assignment_5.f90
gcc/testsuite/gfortran.dg/elemental_subroutine_10.f90
gcc/testsuite/gfortran.dg/typebound_operator_4.f03
gcc/testsuite/gfortran.dg/typebound_proc_16.f03
gcc/testsuite/gfortran.dg/unlimited_polymorphic_19.f90

index 58b2554334b27dbcd367f64b0b17873dc89d4ec2..6912797a456274231dfa3a5866dfa040ffe5eab1 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-27  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/54756
+       * resolve.c (resolve_formal_arglist): Reject polymorphic INTENT(OUT)
+       arguments of pure procedures.
+
 2014-12-22  Tobias Burnus  <burnus@net-b.de>
 
        * trans-intrinsic.c (gfc_conv_intrinsic_caf_get, conv_caf_send):
index 3b8b8695bc16ec30c1ce9db5bc1a6f2d70df37a6..05a948b749d2c98afa4a74e2d7377f3ffd06aaa7 100644 (file)
@@ -414,6 +414,15 @@ resolve_formal_arglist (gfc_symbol *proc)
                               &sym->declared_at);
                }
            }
+
+         /* F08:C1278a.  */
+         if (sym->ts.type == BT_CLASS && sym->attr.intent == INTENT_OUT)
+           {
+             gfc_error ("INTENT(OUT) argument '%s' of pure procedure %qs at %L"
+                        " may not be polymorphic", sym->name, proc->name,
+                        &sym->declared_at);
+             continue;
+           }
        }
 
       if (proc->attr.implicit_pure)
index ec4d75ea9488841ab1f93505894b9f57e8171fa5..4422c960deb56fbf1018f133a9cb74ec88209d30 100644 (file)
@@ -1,3 +1,17 @@
+2014-12-27  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/54756
+       * gfortran.dg/class_array_3.f03: Fixed invalid test case.
+       * gfortran.dg/class_array_7.f03: Ditto.
+       * gfortran.dg/class_dummy_4.f03: Ditto.
+       * gfortran.dg/defined_assignment_3.f90: Ditto.
+       * gfortran.dg/defined_assignment_5.f90: Ditto.
+       * gfortran.dg/elemental_subroutine_10.f90: Ditto.
+       * gfortran.dg/typebound_operator_4.f03: Ditto.
+       * gfortran.dg/typebound_proc_16.f03: Ditto.
+       * gfortran.dg/unlimited_polymorphic_19.f90: Ditto.
+       * gfortran.dg/class_dummy_5.f90: New test.
+
 2014-12-27  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * lib/ubsan-dg.exp (check_effective_target_fsanitize_undefined):
index 6db375c9425bd82e927204b2ab778f2201ec191f..cab2b1be874cc27ff7b7c9e6cc288d37280bba6c 100644 (file)
@@ -29,7 +29,7 @@ module m_qsort
    end function lt_cmp
  end interface
  interface
-   elemental subroutine assign(a,b)
+   impure elemental subroutine assign(a,b)
      import
      class(sort_t), intent(out) :: a
      class(sort_t), intent(in) :: b
@@ -100,7 +100,7 @@ contains
      class(sort_int_t), intent(in) :: a
      disp_int = a%i
  end function disp_int
- elemental subroutine assign_int (a, b)
impure elemental subroutine assign_int (a, b)
    class(sort_int_t), intent(out) :: a
    class(sort_t), intent(in) :: b         ! TODO: gfortran does not throw 'class(sort_int_t)'
    select type (b)
index 5c9673ff72bf6135b2362dd626ca3e65d18c7359..e6d79d8f6ef199fa066d1e898071a09e583de56a 100644 (file)
@@ -19,7 +19,7 @@ module realloc
 
 contains
 
-  elemental subroutine assign (a, b)
+  impure elemental subroutine assign (a, b)
     class(base_type), intent(out) :: a
     type(base_type), intent(in) :: b
     a%i = b%i
index fa302bf1ada058e4fb45f4ac66c6d6daa7cabfdb..24841305bf53e7726076454fb1aa2247109ae529 100644 (file)
@@ -11,7 +11,7 @@ module m1
   procedure, pass(x) :: source
  end type c_stv
 contains
pure subroutine source(y,x)
+ subroutine source(y,x)
   class(c_stv), intent(in)               :: x
   class(c_stv), allocatable, intent(out) :: y
  end subroutine source
diff --git a/gcc/testsuite/gfortran.dg/class_dummy_5.f90 b/gcc/testsuite/gfortran.dg/class_dummy_5.f90
new file mode 100644 (file)
index 0000000..8da19af
--- /dev/null
@@ -0,0 +1,30 @@
+! { dg-do compile }
+!
+! PR 54756: [OOP] [F08] Should reject CLASS, intent(out) in PURE procedures
+!
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+
+module m
+  type t
+  contains
+    final :: fnl   ! impure finalizer
+  end type t
+contains
+  impure subroutine fnl(x)
+    type(t) :: x
+    print *,"finalized!"
+  end subroutine
+end
+
+program test
+  use m
+  type(t) :: x
+  call foo(x)
+contains
+  pure subroutine foo(x)  ! { dg-error "may not be polymorphic" }
+    ! pure subroutine would call impure finalizer
+    class(t), intent(out) :: x
+  end subroutine
+end
+
+! { dg-final { cleanup-modules "m" } }
index 81a9841434fd49d3479b7ce733a9c30566e1faf1..ce58cee6359cf55e894dfe8f54b55a1af2d21037 100644 (file)
@@ -17,7 +17,7 @@ module m0
     integer :: j
   end type
 contains
-  elemental subroutine assign0(lhs,rhs)
+  impure elemental subroutine assign0(lhs,rhs)
     class(component), intent(out) :: lhs
     class(component), intent(in) :: rhs
     lhs%i = 20
index faf38298e4267fab03fdd12cb0f639e692324991..ca5a9262698e69a2246aa07648148820c5b1104f 100644 (file)
@@ -38,7 +38,7 @@ module m1
     integer :: j = 7
   end type
 contains
-  elemental subroutine assign1(lhs,rhs)
+  impure elemental subroutine assign1(lhs,rhs)
     class(component1), intent(out) :: lhs
     class(component1), intent(in) :: rhs
     lhs%i = 30
index be343e6ff25ab97ff9d618d6d59c1c91be4e712c..011a7046e3a9c761ad85d7a5a02385282b435462 100644 (file)
@@ -15,7 +15,7 @@ module m_assertion_character
     procedure :: write => assertion_array_write
   end type t_assertion_character
 contains
-  elemental subroutine assertion_character( ast, name )
+  impure elemental subroutine assertion_character( ast, name )
     class(t_assertion_character), intent(out) :: ast
     character(len=*), intent(in) :: name
     ast%name = name
@@ -37,7 +37,7 @@ module m_assertion_array_character
     procedure :: write => assertion_array_character_write
   end type t_assertion_array_character
 contains
-  pure subroutine assertion_array_character( ast, name, nast )
+  subroutine assertion_array_character( ast, name, nast )
     class(t_assertion_array_character), intent(out) :: ast
     character(len=*), intent(in) :: name
     integer, intent(in) :: nast
index f9a2612530ce34d843c4157681e567df4b728f4a..836505bba3d1ec3d5a1b797be7815d9aa64ec6d8 100644 (file)
@@ -34,7 +34,7 @@ CONTAINS
     add_int = myint (a%value + b)
   END FUNCTION add_int
 
-  PURE SUBROUTINE assign_int (dest, from)
+  SUBROUTINE assign_int (dest, from)
     CLASS(myint), INTENT(OUT) :: dest
     INTEGER, INTENT(IN) :: from
     dest%value = from
@@ -62,7 +62,6 @@ CONTAINS
   PURE SUBROUTINE iampure ()
     TYPE(myint) :: x
 
-    x = 0 ! { dg-bogus "is not PURE" }
     x = x + 42 ! { dg-bogus "to a impure procedure" }
     x = x .PLUS. 5 ! { dg-bogus "to a impure procedure" }
   END SUBROUTINE iampure
index e43b3f8065f749fda35f7ef7bafc3b41580a16ac..33e3579a3c8bb91a782a5e25c7cafe17dc909d17 100644 (file)
@@ -27,7 +27,7 @@ MODULE rational_numbers
       r = REAL(this%n)/this%d
     END FUNCTION
 
-    ELEMENTAL SUBROUTINE rat_asgn_i(a,b)
+    impure ELEMENTAL SUBROUTINE rat_asgn_i(a,b)
       CLASS(rational),INTENT(OUT) :: a
       INTEGER,INTENT(IN) :: b
       a%n = b
index a2dbaef2e4d6776d6802a434671a492848fe1580..51359d1461c63524f985cb31cb3c73148cdad832 100644 (file)
@@ -12,7 +12,7 @@ MODULE m
     PROCEDURE :: copy
   END TYPE t
   INTERFACE 
-    PURE SUBROUTINE copy_proc_intr(a,b)
+    SUBROUTINE copy_proc_intr(a,b)
       CLASS(*), INTENT(IN) :: a
       CLASS(*), INTENT(OUT) :: b
     END SUBROUTINE copy_proc_intr
@@ -40,7 +40,7 @@ PROGRAM main
   CALL test%copy(copy_int,copy_x)
 !   PRINT '(*(I0,:2X))', copy_x
 CONTAINS
-  PURE SUBROUTINE copy_int(a,b)
+  SUBROUTINE copy_int(a,b)
     CLASS(*), INTENT(IN) :: a
     CLASS(*), INTENT(OUT) :: b
     SELECT TYPE(a); TYPE IS(integer)