diff options
author | Tobias Burnus <burnus@net-b.de> | 2015-12-12 20:00:32 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2015-12-12 20:00:32 +0100 |
commit | 460263d0ef85e47cff2f39181a06d1d235ad4df7 (patch) | |
tree | b4b313cc1ea7b49c947ce78542b13088030fe79e /gcc/fortran/interface.c | |
parent | 8d4227c89bd724cba6995aa50f7c566d95b9ce51 (diff) | |
download | gcc-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.c | 13 |
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)) |