aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/interface.c3
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_override_4.f9034
4 files changed, 48 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index e13a46b5..4ebdf3c 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2013-05-28 Janus Weil <janus@gcc.gnu.org>
+ Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/57217
+ * interface.c (check_dummy_characteristics): Symmetrize type check.
+
2013-05-27 Bud Davis <jmdavis@link.com>
PR fortran/50405
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 1b967fa..2f8c6a5 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -1030,7 +1030,8 @@ check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2,
return s1 == s2 ? true : false;
/* Check type and rank. */
- if (type_must_agree && !compare_type_rank (s2, s1))
+ if (type_must_agree &&
+ (!compare_type_rank (s1, s2) || !compare_type_rank (s2, s1)))
{
snprintf (errmsg, err_len, "Type/rank mismatch in argument '%s'",
s1->name);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c62514c..7e70dce 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2013-05-28 Janus Weil <janus@gcc.gnu.org>
+ Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/57217
+ * gfortran.dg/typebound_override_4.f90: New.
+
2013-05-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/57411
diff --git a/gcc/testsuite/gfortran.dg/typebound_override_4.f90 b/gcc/testsuite/gfortran.dg/typebound_override_4.f90
new file mode 100644
index 0000000..2b747a8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/typebound_override_4.f90
@@ -0,0 +1,34 @@
+! { dg-do compile }
+!
+! PR 57217: [4.7/4.8/4.9 Regression][OOP] Accepts invalid TBP overriding - lacking arguments check
+!
+! Contributed by Salvatore Filippone <filippone.salvatore@gmail.com>
+
+module base_mod
+ implicit none
+ type base_type
+ contains
+ procedure, pass(map) :: clone => base_clone
+ end type
+contains
+ subroutine base_clone(map,mapout)
+ class(base_type) :: map
+ class(base_type) :: mapout
+ end subroutine
+end module
+
+module r_mod
+ use base_mod
+ implicit none
+ type, extends(base_type) :: r_type
+ contains
+ procedure, pass(map) :: clone => r_clone ! { dg-error "Type/rank mismatch in argument" }
+ end type
+contains
+ subroutine r_clone(map,mapout)
+ class(r_type) :: map
+ class(r_type) :: mapout
+ end subroutine
+end module
+
+! { dg-final { cleanup-modules "base_mod r_mod" } }