From 6168891d1f70ad7e962dbe9cbeac6944e9473d97 Mon Sep 17 00:00:00 2001 From: Janus Weil Date: Wed, 4 Nov 2009 20:41:07 +0100 Subject: [PATCH] [multiple changes] 2009-11-04 Tobias Burnus Janus Weil PR fortran/41556 PR fortran/41937 * interface.c (gfc_check_operator_interface): Handle CLASS arguments. * resolve.c (resolve_allocate_expr): Handle allocatable components of CLASS variables. 2009-11-04 Janus Weil PR fortran/41556 PR fortran/41937 * gfortran.dg/class_11.f03: New test. From-SVN: r153911 --- gcc/fortran/ChangeLog | 9 +++++++ gcc/fortran/interface.c | 1 + gcc/fortran/resolve.c | 2 +- gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gfortran.dg/class_11.f03 | 37 ++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/class_11.f03 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 47cfead00e0e..5bf0ccc7aaac 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2009-11-04 Tobias Burnus + Janus Weil + + PR fortran/41556 + PR fortran/41937 + * interface.c (gfc_check_operator_interface): Handle CLASS arguments. + * resolve.c (resolve_allocate_expr): Handle allocatable components of + CLASS variables. + 2009-11-04 Richard Guenther * options.c (gfc_post_options): Rely on common code processing diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 0fd4742a1de8..05e5d2d8a1f2 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -626,6 +626,7 @@ gfc_check_operator_interface (gfc_symbol *sym, gfc_intrinsic_op op, - Types and kinds do not conform, and - First argument is of derived type. */ if (sym->formal->sym->ts.type != BT_DERIVED + && sym->formal->sym->ts.type != BT_CLASS && (r1 == 0 || r1 == r2) && (sym->formal->sym->ts.type == sym->formal->next->sym->ts.type || (gfc_numeric_ts (&sym->formal->sym->ts) diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 5a5fcccc1f8f..4a83f22dfd45 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6198,7 +6198,7 @@ check_symbols: sym = a->expr->symtree->n.sym; /* TODO - check derived type components. */ - if (sym->ts.type == BT_DERIVED) + if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS) continue; if ((ar->start[i] != NULL diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67869642dbeb..3066e3d17ff4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-11-04 Janus Weil + + PR fortran/41556 + PR fortran/41937 + * gfortran.dg/class_11.f03: New test. + 2009-11-04 Jason Merrill PR c++/35067 diff --git a/gcc/testsuite/gfortran.dg/class_11.f03 b/gcc/testsuite/gfortran.dg/class_11.f03 new file mode 100644 index 000000000000..bf80c4e00e61 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_11.f03 @@ -0,0 +1,37 @@ +! { dg-do compile } +! +! PR 41556 +! Contributed by Damian Rouson + + implicit none + + type ,abstract :: object + contains + procedure(assign_interface) ,deferred :: assign + generic :: assignment(=) => assign + end type + + abstract interface + subroutine assign_interface(lhs,rhs) + import :: object + class(object) ,intent(inout) :: lhs + class(object) ,intent(in) :: rhs + end subroutine + end interface + +! PR 41937 +! Contributed by Juergen Reuter + + type, abstract :: cuba_abstract_type + integer :: dim_f = 1 + real, dimension(:), allocatable :: integral + end type cuba_abstract_type + +contains + + subroutine cuba_abstract_alloc_dim_f(this) + class(cuba_abstract_type) :: this + allocate(this%integral(this%dim_f)) + end subroutine cuba_abstract_alloc_dim_f + +end -- 2.43.5