From 427180d243e562912cc37f09b140a4d8c042ae4c Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Sun, 29 May 2011 20:17:40 +0200 Subject: [PATCH] re PR fortran/18918 (Eventually support Fortran 2008's coarrays [co-arrays]) 2011-05-29 Tobias Burnus PR fortran/18918 * interface.c (compare_parameter): Add check for passing coarray to allocatable noncoarray dummy. 2011-05-29 Tobias Burnus PR fortran/18918 * gfortran.dg/coarray_24.f90: New. From-SVN: r174411 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/interface.c | 18 ++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/coarray_24.f90 | 26 ++++++++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/coarray_24.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 71e6452ca5b..5ffa5f673f9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2011-05-29 Tobias Burnus + + PR fortran/18918 + * interface.c (compare_parameter): Add check for passing coarray + to allocatable noncoarray dummy. + 2011-05-29 Tobias Burnus Richard Guenther diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 732a0c59d01..6575fbe1539 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -1645,6 +1645,24 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual, return 0; } + if (formal->attr.allocatable && !formal->attr.codimension + && gfc_expr_attr (actual).codimension) + { + if (formal->attr.intent == INTENT_OUT) + { + if (where) + gfc_error ("Passing coarray at %L to allocatable, noncoarray, " + "INTENT(OUT) dummy argument '%s'", &actual->where, + formal->name); + return 0; + } + else if (gfc_option.warn_surprising && where + && formal->attr.intent != INTENT_IN) + gfc_warning ("Passing coarray at %L to allocatable, noncoarray dummy " + "argument '%s', which is invalid if the allocation status" + " is modified", &actual->where, formal->name); + } + if (symbol_rank (formal) == actual->rank) return 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fce1c3256f7..c416d1aea30 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-29 Tobias Burnus + + PR fortran/18918 + * gfortran.dg/coarray_24.f90: New. + 2011-05-29 Tobias Burnus PR fortran/18918 diff --git a/gcc/testsuite/gfortran.dg/coarray_24.f90 b/gcc/testsuite/gfortran.dg/coarray_24.f90 new file mode 100644 index 00000000000..d8d92816d26 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray_24.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! { dg-options "-fcoarray=single -Wall" } +! +! This program is perfectly valid; however, passing an (allocatable) coarray +! as actual argument to a non-coarray allocatable dummy is doubtful as +! reallocation is not allowed. Thus, an intent(out) dummy should be always +! wrong. +! + +integer, allocatable :: myCaf(:)[:] + +allocate(myCaf(1)[*]) + +call doubtful_valid(myCaf) ! { dg-warning "to allocatable, noncoarray dummy" } +call invalid(myCaf) ! { dg-error "to allocatable, noncoarray, INTENT.OUT. dummy" } +contains + subroutine doubtful_valid(x) + integer, allocatable :: x(:) + ! Valid as x's allocation status is not touched. + x(1) = 7 + end subroutine doubtful_valid + subroutine invalid(y) + integer, allocatable, intent(out) :: y(:) + allocate (y(1)) + end subroutine invalid +end -- 2.30.2