From 461db9e39abdfb7f209252f9255e5342008530cf Mon Sep 17 00:00:00 2001 From: pault Date: Fri, 21 Dec 2012 14:29:34 +0000 Subject: [PATCH] 2012-12-21 Paul Thomas PR fortran/55763 * match.c (select_type_set_tmp): Return is a derived type or class typespec has no derived type. * resolve.c (resolve_fl_var_and_proc): Exclude select type temporaries from 'pointer'. (resolve_symbol): Exclude select type temporaries from tests for assumed size and assumed rank. 2012-12-21 Paul Thomas PR fortran/55763 * gfortran.dg/unlimited_polymorphic_4.f03: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194663 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 10 ++++++ gcc/fortran/match.c | 3 ++ gcc/fortran/resolve.c | 7 ++-- gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/unlimited_polymorphic_4.f03 | 41 ++++++++++++++++++++++ 5 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/unlimited_polymorphic_4.f03 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index db7383c57f2..7924fe77055 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2012-12-21 Paul Thomas + + PR fortran/55763 + * match.c (select_type_set_tmp): Return is a derived type or + class typespec has no derived type. + * resolve.c (resolve_fl_var_and_proc): Exclude select type + temporaries from 'pointer'. + (resolve_symbol): Exclude select type temporaries from tests + for assumed size and assumed rank. + 2012-12-20 Janus Weil PR fortran/36044 diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 6322fae6fda..ca8f08c6822 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -5293,6 +5293,9 @@ select_type_set_tmp (gfc_typespec *ts) if (tmp == NULL) { + if (!ts->u.derived) + return; + if (ts->type == BT_CLASS) sprintf (name, "__tmp_class_%s", ts->u.derived->name); else diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 6208a819c13..fce6f732e59 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -11056,7 +11056,7 @@ resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag) } else { - pointer = sym->attr.pointer; + pointer = sym->attr.pointer && !sym->attr.select_type_temporary; allocatable = sym->attr.allocatable; dimension = sym->attr.dimension; } @@ -13315,7 +13315,7 @@ resolve_symbol (gfc_symbol *sym) gcc_assert (as->type != AS_IMPLIED_SHAPE); if (((as->type == AS_ASSUMED_SIZE && !as->cp_was_assumed) || as->type == AS_ASSUMED_SHAPE) - && sym->attr.dummy == 0) + && !sym->attr.dummy && !sym->attr.select_type_temporary) { if (as->type == AS_ASSUMED_SIZE) gfc_error ("Assumed size array at %L must be a dummy argument", @@ -13326,7 +13326,8 @@ resolve_symbol (gfc_symbol *sym) return; } /* TS 29113, C535a. */ - if (as->type == AS_ASSUMED_RANK && !sym->attr.dummy) + if (as->type == AS_ASSUMED_RANK && !sym->attr.dummy + && !sym->attr.select_type_temporary) { gfc_error ("Assumed-rank array at %L must be a dummy argument", &sym->declared_at); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a51f09e2aad..f720276921b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-12-21 Paul Thomas + + PR fortran/55763 + * gfortran.dg/unlimited_polymorphic_4.f03: New test. + 2012-12-21 Richard Biener PR tree-optimization/52996 diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_4.f03 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_4.f03 new file mode 100644 index 00000000000..d289b69199f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_4.f03 @@ -0,0 +1,41 @@ +! { dg-do compile } +! +! Fix PR55763 +! Contributed by Tobias Burnus +! +module mpi_f08_f + implicit none + abstract interface + subroutine user_function( inoutvec ) + class(*), dimension(:), intent(inout) :: inoutvec + end subroutine user_function + end interface +end module + +module mod_test1 + use mpi_f08_f + implicit none +contains + subroutine my_function( invec ) ! { dg-error "no IMPLICIT type" } + class(*), dimension(:), intent(inout) :: inoutvec ! { dg-error "not a DUMMY" } + + select type (inoutvec) + type is (integer) + inoutvec = 2*inoutvec + end select + end subroutine my_function +end module + +module mod_test2 + use mpi_f08_f + implicit none +contains + subroutine my_function( inoutvec ) ! Used to produce a BOGUS ERROR + class(*), dimension(:), intent(inout) :: inoutvec + + select type (inoutvec) + type is (integer) + inoutvec = 2*inoutvec + end select + end subroutine my_function +end module -- 2.11.4.GIT