aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2014-12-27 23:40:21 +0100
committerJanus Weil <janus@gcc.gnu.org>2014-12-27 23:40:21 +0100
commitc19a00337aa1cd579cb51ce5aa71a81261b97fe3 (patch)
treef236c561664ad5e7b935c8e3abb09856fcc8631d /gcc
parent2e4aa0a5016c595477c0638765b6ceef8e0fb3c0 (diff)
downloadgcc-c19a00337aa1cd579cb51ce5aa71a81261b97fe3.zip
gcc-c19a00337aa1cd579cb51ce5aa71a81261b97fe3.tar.gz
gcc-c19a00337aa1cd579cb51ce5aa71a81261b97fe3.tar.bz2
re PR fortran/54756 ([OOP] [F08] Should reject CLASS, intent(out) in PURE procedures)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c9
-rw-r--r--gcc/testsuite/ChangeLog14
-rw-r--r--gcc/testsuite/gfortran.dg/class_array_3.f034
-rw-r--r--gcc/testsuite/gfortran.dg/class_array_7.f032
-rw-r--r--gcc/testsuite/gfortran.dg/class_dummy_4.f032
-rw-r--r--gcc/testsuite/gfortran.dg/class_dummy_5.f9030
-rw-r--r--gcc/testsuite/gfortran.dg/defined_assignment_3.f902
-rw-r--r--gcc/testsuite/gfortran.dg/defined_assignment_5.f902
-rw-r--r--gcc/testsuite/gfortran.dg/elemental_subroutine_10.f904
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_operator_4.f033
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_proc_16.f032
-rw-r--r--gcc/testsuite/gfortran.dg/unlimited_polymorphic_19.f904
13 files changed, 71 insertions, 13 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 58b2554..6912797 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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):
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 3b8b869..05a948b 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ec4d75e..4422c96 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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):
diff --git a/gcc/testsuite/gfortran.dg/class_array_3.f03 b/gcc/testsuite/gfortran.dg/class_array_3.f03
index 6db375c..cab2b1b 100644
--- a/gcc/testsuite/gfortran.dg/class_array_3.f03
+++ b/gcc/testsuite/gfortran.dg/class_array_3.f03
@@ -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)
diff --git a/gcc/testsuite/gfortran.dg/class_array_7.f03 b/gcc/testsuite/gfortran.dg/class_array_7.f03
index 5c9673f..e6d79d8 100644
--- a/gcc/testsuite/gfortran.dg/class_array_7.f03
+++ b/gcc/testsuite/gfortran.dg/class_array_7.f03
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/class_dummy_4.f03 b/gcc/testsuite/gfortran.dg/class_dummy_4.f03
index fa302bf..2484130 100644
--- a/gcc/testsuite/gfortran.dg/class_dummy_4.f03
+++ b/gcc/testsuite/gfortran.dg/class_dummy_4.f03
@@ -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
index 0000000..8da19af
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/class_dummy_5.f90
@@ -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" } }
diff --git a/gcc/testsuite/gfortran.dg/defined_assignment_3.f90 b/gcc/testsuite/gfortran.dg/defined_assignment_3.f90
index 81a9841..ce58cee 100644
--- a/gcc/testsuite/gfortran.dg/defined_assignment_3.f90
+++ b/gcc/testsuite/gfortran.dg/defined_assignment_3.f90
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/defined_assignment_5.f90 b/gcc/testsuite/gfortran.dg/defined_assignment_5.f90
index faf3829..ca5a926 100644
--- a/gcc/testsuite/gfortran.dg/defined_assignment_5.f90
+++ b/gcc/testsuite/gfortran.dg/defined_assignment_5.f90
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/elemental_subroutine_10.f90 b/gcc/testsuite/gfortran.dg/elemental_subroutine_10.f90
index be343e6..011a704 100644
--- a/gcc/testsuite/gfortran.dg/elemental_subroutine_10.f90
+++ b/gcc/testsuite/gfortran.dg/elemental_subroutine_10.f90
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/typebound_operator_4.f03 b/gcc/testsuite/gfortran.dg/typebound_operator_4.f03
index f9a2612..836505b 100644
--- a/gcc/testsuite/gfortran.dg/typebound_operator_4.f03
+++ b/gcc/testsuite/gfortran.dg/typebound_operator_4.f03
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/typebound_proc_16.f03 b/gcc/testsuite/gfortran.dg/typebound_proc_16.f03
index e43b3f8..33e3579 100644
--- a/gcc/testsuite/gfortran.dg/typebound_proc_16.f03
+++ b/gcc/testsuite/gfortran.dg/typebound_proc_16.f03
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_19.f90 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_19.f90
index a2dbaef..51359d1 100644
--- a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_19.f90
+++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_19.f90
@@ -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)