aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2012-11-16 18:02:02 +0100
committerJanus Weil <janus@gcc.gnu.org>2012-11-16 18:02:02 +0100
commitb185792f5216497c74664bdf9ba2d465628d6f4c (patch)
treeece13feefe2356866c55f461775d7e5f155825f0
parente731262b38e57a608b2c12ffc76fb682c1672d31 (diff)
downloadgcc-b185792f5216497c74664bdf9ba2d465628d6f4c.zip
gcc-b185792f5216497c74664bdf9ba2d465628d6f4c.tar.gz
gcc-b185792f5216497c74664bdf9ba2d465628d6f4c.tar.bz2
re PR fortran/55297 ([OOP] type-bound operator clashes with abstract interface)
2012-11-16 Janus Weil <janus@gcc.gnu.org> PR fortran/55297 * resolve.c (resolve_typebound_intrinsic_op): Only add typebound operators to the operator list in the namespace of the derived type. 2012-11-16 Janus Weil <janus@gcc.gnu.org> PR fortran/55297 * gfortran.dg/typebound_operator_18.f90: New. From-SVN: r193568
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_operator_18.f9025
4 files changed, 37 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 74ea42a..439eae5 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2012-11-16 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/55297
+ * resolve.c (resolve_typebound_intrinsic_op): Only add typebound
+ operators to the operator list in the namespace of the derived type.
+
2012-11-12 Jan Hubicka <jh@suse.cz>
* f95-lang.c (ATTR_NOTHROW_LEAF_MALLOC_LIST): New macro.
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index e39a137..53d695cd 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -11540,7 +11540,7 @@ resolve_typebound_intrinsic_op (gfc_symbol* derived, gfc_intrinsic_op op,
/* Add target to non-typebound operator list. */
if (!target->specific->deferred && !derived->attr.use_assoc
- && p->access != ACCESS_PRIVATE)
+ && p->access != ACCESS_PRIVATE && derived->ns == gfc_current_ns)
{
gfc_interface *head, *intr;
if (gfc_check_new_interface (derived->ns->op[op], target_proc,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d93adcc..7606bac 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-11-16 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/55297
+ * gfortran.dg/typebound_operator_18.f90: New.
+
2012-11-16 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/55330
diff --git a/gcc/testsuite/gfortran.dg/typebound_operator_18.f90 b/gcc/testsuite/gfortran.dg/typebound_operator_18.f90
new file mode 100644
index 0000000..d5ac9e9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/typebound_operator_18.f90
@@ -0,0 +1,25 @@
+! { dg-do compile }
+!
+! PR 55297: [4.8 Regression] [OOP] type-bound operator clashes with abstract interface
+!
+! Contributed by Damian Rouson <damian@rouson.net>
+
+module athlete_module
+ type athlete
+ contains
+ procedure :: negative
+ generic :: operator(-) => negative
+ end type
+ abstract interface
+ integer function sum_interface(this)
+ import athlete
+ class(athlete) this
+ end function
+ end interface
+contains
+ integer function negative(this)
+ class(athlete) ,intent(in) :: this
+ end function
+end module
+
+! { dg-final { cleanup-modules "athlete_module" } }