aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/resolve.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_call_25.f9038
4 files changed, 55 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d4cc083..0723c6d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@
2013-07-25 Janus Weil <janus@gcc.gnu.org>
+ PR fortran/57966
+ * resolve.c (resolve_typebound_function): Make sure the declared type,
+ including its type-bound procedures, is resolved before resolving the
+ actual type-bound call.
+
+2013-07-25 Janus Weil <janus@gcc.gnu.org>
+
PR fortran/57639
* interface.c (compare_parameter): Check for class_ok.
* simplify.c (gfc_simplify_same_type_as): Ditto.
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 08e197b..c348788 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -5686,6 +5686,8 @@ resolve_compcall (gfc_expr* e, const char **name)
}
+static bool resolve_fl_derived (gfc_symbol *sym);
+
/* Resolve a typebound function, or 'method'. First separate all
the non-CLASS references by calling resolve_compcall directly. */
@@ -5772,6 +5774,9 @@ resolve_typebound_function (gfc_expr* e)
/* Get the CLASS declared type. */
declared = get_declared_from_expr (&class_ref, &new_ref, e, true);
+
+ if (!resolve_fl_derived (declared))
+ return false;
/* Weed out cases of the ultimate component being a derived type. */
if ((class_ref && class_ref->u.c.component->ts.type == BT_DERIVED)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b47813e..202cdaa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-07-25 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/57966
+ * gfortran.dg/typebound_call_25.f90: New.
+
2013-07-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57981
diff --git a/gcc/testsuite/gfortran.dg/typebound_call_25.f90 b/gcc/testsuite/gfortran.dg/typebound_call_25.f90
new file mode 100644
index 0000000..df81c79
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/typebound_call_25.f90
@@ -0,0 +1,38 @@
+! { dg-do compile }
+!
+! PR 57966: [OOP] Using a TBP to specify the shape of a dummy argument
+!
+! Contributed by Stefan Mauerberger <stefan.mauerberger@gmail.com>
+
+MODULE my_mod
+ IMPLICIT NONE
+
+ TYPE config_cls
+ CONTAINS
+ PROCEDURE, NOPASS :: my_size
+ PROCEDURE, NOPASS :: my_sub
+ GENERIC :: sz => my_size
+ GENERIC :: sub => my_sub
+ END TYPE
+
+ TYPE(config_cls) :: config
+
+CONTAINS
+
+ PURE INTEGER FUNCTION my_size()
+ my_size = 10
+ END FUNCTION
+
+ SUBROUTINE my_sub
+ END SUBROUTINE
+
+ SUBROUTINE test (field1, field2, field3, field4)
+ REAL :: field1 (config%my_size())
+ REAL :: field2 (config%sz())
+ REAL :: field3 (config%my_sub()) ! { dg-error "should be a FUNCTION" }
+ REAL :: field4 (config%sub()) ! { dg-error "should be a FUNCTION" }
+ END SUBROUTINE
+
+END MODULE
+
+! { dg-final { cleanup-modules "my_mod" } }