diff options
author | Tobias Burnus <burnus@net-b.de> | 2012-07-21 13:02:47 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2012-07-21 13:02:47 +0200 |
commit | 63fbf5865a5fc48a25ff4410e7c2757bb24c36c8 (patch) | |
tree | 33f73a98fbea8e542783998243400448f3ba8051 /gcc/fortran/decl.c | |
parent | aea21190650881b9b17580a55f61393eb78f33a4 (diff) | |
download | gcc-63fbf5865a5fc48a25ff4410e7c2757bb24c36c8.zip gcc-63fbf5865a5fc48a25ff4410e7c2757bb24c36c8.tar.gz gcc-63fbf5865a5fc48a25ff4410e7c2757bb24c36c8.tar.bz2 |
re PR fortran/48820 (TR 29113: Implement parts needed for MPI 3)
2012-07-21 Tobias Burnus <burnus@net-b.de>
PR fortran/48820
* trans-intrinsic.c (gfc_conv_intrinsic_bound): Support
lbound/ubound with dim= for assumed-rank arrays.
* array.c (gfc_set_array_spec): Reject coarrays with
assumed shape.
* decl.c (merge_array_spec): Ditto. Return gfc_try.
(match_attr_spec, match_attr_spec): Update call.
2012-07-21 Tobias Burnus <burnus@net-b.de>
PR fortran/48820
* gfortran.dg/assumed_rank_3.f90: New.
* gfortran.dg/assumed_rank_11.f90: New.
* gfortran.dg/assumed_rank_1.f90: Update dg-error.
* gfortran.dg/assumed_rank_2.f90: Update dg-error.
* gfortran.dg/assumed_rank_7.f90: Update dg-error.
From-SVN: r189743
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r-- | gcc/fortran/decl.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 28e5a5b..5d234e6 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -589,13 +589,17 @@ cleanup: /* Auxiliary function to merge DIMENSION and CODIMENSION array specs. */ -static void +static gfc_try merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy) { int i; - gcc_assert (from->rank != -1 || to->corank == 0); - gcc_assert (to->rank != -1 || from->corank == 0); + if ((from->type == AS_ASSUMED_RANK && to->corank) + || (to->type == AS_ASSUMED_RANK && from->corank)) + { + gfc_error ("The assumed-rank array at %C shall not have a codimension"); + return FAILURE; + } if (to->rank == 0 && from->rank > 0) { @@ -642,6 +646,8 @@ merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy) } } } + + return SUCCESS; } @@ -1799,8 +1805,12 @@ variable_decl (int elem) if (m == MATCH_NO) as = gfc_copy_array_spec (current_as); - else if (current_as) - merge_array_spec (current_as, as, true); + else if (current_as + && merge_array_spec (current_as, as, true) == FAILURE) + { + m = MATCH_ERROR; + goto cleanup; + } if (gfc_option.flag_cray_pointer) cp_as = gfc_copy_array_spec (as); @@ -3512,7 +3522,8 @@ match_attr_spec (void) current_as = as; else if (m == MATCH_YES) { - merge_array_spec (as, current_as, false); + if (merge_array_spec (as, current_as, false) == FAILURE) + m = MATCH_ERROR; free (as); } |