aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/interface.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2015-12-12 20:00:32 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2015-12-12 20:00:32 +0100
commit460263d0ef85e47cff2f39181a06d1d235ad4df7 (patch)
treeb4b313cc1ea7b49c947ce78542b13088030fe79e /gcc/fortran/interface.c
parent8d4227c89bd724cba6995aa50f7c566d95b9ce51 (diff)
downloadgcc-460263d0ef85e47cff2f39181a06d1d235ad4df7.zip
gcc-460263d0ef85e47cff2f39181a06d1d235ad4df7.tar.gz
gcc-460263d0ef85e47cff2f39181a06d1d235ad4df7.tar.bz2
re PR fortran/45859 ([Coarray, F2008, IR] Rejects valid actuals to coarray dummies)
2014-12-12 Tobias Burnus <burnus@net-b.de> gcc/fortran PR fortran/45859 * expr.c (gfc_is_simply_contiguous): Optionally permit array * elements. (gfc_check_pointer_assign): Update call. * interface.c (compare_parameter): Ditto. * trans-array.c (gfc_conv_array_parameter): Ditto. * trans-intrinsic.c (gfc_conv_intrinsic_transfer, conv_isocbinding_function): Ditto. * gfortran.h (gfc_is_simply_contiguous): Update prototype. gcc/testsuite/ PR fortran/45859 * gcc/testsuite/gfortran.dg/coarray_args_2.f90: Remove dg-error. From-SVN: r231585
Diffstat (limited to 'gcc/fortran/interface.c')
-rw-r--r--gcc/fortran/interface.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index f74239d..bfd5d36 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -2020,7 +2020,7 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
/* F2008, C1241. */
if (formal->attr.pointer && formal->attr.contiguous
- && !gfc_is_simply_contiguous (actual, true))
+ && !gfc_is_simply_contiguous (actual, true, false))
{
if (where)
gfc_error ("Actual argument to contiguous pointer dummy %qs at %L "
@@ -2131,15 +2131,17 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
if (formal->attr.codimension)
{
- /* F2008, 12.5.2.8. */
+ /* F2008, 12.5.2.8 + Corrig 2 (IR F08/0048). */
+ /* F2015, 12.5.2.8. */
if (formal->attr.dimension
&& (formal->attr.contiguous || formal->as->type != AS_ASSUMED_SHAPE)
&& gfc_expr_attr (actual).dimension
- && !gfc_is_simply_contiguous (actual, true))
+ && !gfc_is_simply_contiguous (actual, true, true))
{
if (where)
gfc_error ("Actual argument to %qs at %L must be simply "
- "contiguous", formal->name, &actual->where);
+ "contiguous or an element of such an array",
+ formal->name, &actual->where);
return 0;
}
@@ -2179,7 +2181,8 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
&& (actual->symtree->n.sym->attr.asynchronous
|| actual->symtree->n.sym->attr.volatile_)
&& (formal->attr.asynchronous || formal->attr.volatile_)
- && actual->rank && formal->as && !gfc_is_simply_contiguous (actual, true)
+ && actual->rank && formal->as
+ && !gfc_is_simply_contiguous (actual, true, false)
&& ((formal->as->type != AS_ASSUMED_SHAPE
&& formal->as->type != AS_ASSUMED_RANK && !formal->attr.pointer)
|| formal->attr.contiguous))