Commit e84b920c by Tobias Burnus Committed by Tobias Burnus

re PR fortran/18918 (Eventually support Fortran 2008's coarrays [co-arrays])

2011-04-18  Tobias Burnus  <burnus@net-b.de>

        PR fortran/18918
        * array.c (gfc_match_array_ref): Check for too many
        * codimensions.
        * check.c (gfc_check_image_index): Check number of elements
        in SUB argument.
        * simplify.c (gfc_simplify_image_index): Remove unreachable
        * checks.

2011-04-18  Tobias Burnus  <burnus@net-b.de>

        PR fortran/18918
        * gfortran.dg/coarray_17.f90: New.
        * gfortran.dg/coarray_10.f90: Update dg-error.

From-SVN: r172658
parent 9c41356c
2011-04-18 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
* array.c (gfc_match_array_ref): Check for too many codimensions.
* check.c (gfc_check_image_index): Check number of elements
in SUB argument.
* simplify.c (gfc_simplify_image_index): Remove unreachable checks.
2011-04-18 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
* iresolve.c (gfc_resolve_image_index): Set ts.type.
* simplify.c (gfc_simplify_image_index): Don't abort if the bounds
are not known at compile time and handle -fcoarray=lib.
......
......@@ -237,6 +237,12 @@ coarray:
corank, ar->codimen);
return MATCH_ERROR;
}
if (ar->codimen > corank)
{
gfc_error ("Too many codimensions at %C, expected %d not %d",
corank, ar->codimen);
return MATCH_ERROR;
}
return MATCH_YES;
}
......
......@@ -3667,6 +3667,8 @@ gfc_check_stat_sub (gfc_expr *name, gfc_expr *array, gfc_expr *status)
gfc_try
gfc_check_image_index (gfc_expr *coarray, gfc_expr *sub)
{
mpz_t nelems;
if (gfc_option.coarray == GFC_FCOARRAY_NONE)
{
gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
......@@ -3683,6 +3685,21 @@ gfc_check_image_index (gfc_expr *coarray, gfc_expr *sub)
return FAILURE;
}
if (gfc_array_size (sub, &nelems) == SUCCESS)
{
int corank = gfc_get_corank (coarray);
if (mpz_cmp_ui (nelems, corank) != 0)
{
gfc_error ("The number of array elements of the SUB argument to "
"IMAGE_INDEX at %L shall be %d (corank) not %d",
&sub->where, corank, (int) mpz_get_si (nelems));
mpz_clear (nelems);
return FAILURE;
}
mpz_clear (nelems);
}
return SUCCESS;
}
......
......@@ -6211,12 +6211,7 @@ gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
gfc_expr *ca_bound;
int cmp;
if (sub_cons == NULL)
{
gfc_error ("Too few elements in expression for SUB= argument at %L",
&sub->where);
return &gfc_bad_expr;
}
gcc_assert (sub_cons != NULL);
ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
NULL, true);
......@@ -6278,13 +6273,7 @@ gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
sub_cons = gfc_constructor_next (sub_cons);
}
if (sub_cons != NULL)
{
gfc_error ("Too many elements in expression for SUB= argument at %L",
&sub->where);
return &gfc_bad_expr;
}
gcc_assert (sub_cons == NULL);
if (gfc_option.coarray != GFC_FCOARRAY_SINGLE && !first_image)
return NULL;
......
2011-04-18 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
* gfortran.dg/coarray_17.f90: New.
* gfortran.dg/coarray_10.f90: Update dg-error.
2011-04-18 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR testsuite/48251
......
......@@ -11,8 +11,8 @@ subroutine image_idx_test1()
WRITE (*,*) IMAGE_INDEX (array, [2,0,3,1])
WRITE (*,*) IMAGE_INDEX (array, [0,0,3,1]) ! { dg-error "for dimension 1, SUB has 0 and COARRAY lower bound is 1" }
WRITE (*,*) IMAGE_INDEX (array, [1,2,9,0]) ! { dg-error "for dimension 3, SUB has 9 and COARRAY upper bound is 8" }
WRITE (*,*) IMAGE_INDEX (array, [2,0,3]) ! { dg-error "Too few elements" }
WRITE (*,*) IMAGE_INDEX (array, [2,0,3,1,1])! { dg-error "Too many elements" }
WRITE (*,*) IMAGE_INDEX (array, [2,0,3]) ! { dg-error "array elements of the SUB argument to IMAGE_INDEX at .1. shall be 4" }
WRITE (*,*) IMAGE_INDEX (array, [2,0,3,1,1])! { dg-error "array elements of the SUB argument to IMAGE_INDEX at .1. shall be 4" }
end subroutine
subroutine this_image_check()
......
! { dg-do compile }
! { dg-options "-fcoarray=single" }
!
! Two simple diagnostics, which were initially not thought of
!
! General coarray PR: PR fortran/18918
!
subroutine one
integer, allocatable :: a(:)[:,:] ! corank = 2
integer :: index,nn1,nn2,nn3,mm0
allocate(a(mm0)[nn1:nn2,nn3,*]) ! { dg-error "Too many codimensions at .1., expected 2 not 3" }
end subroutine one
subroutine two
integer, allocatable :: a(:)[:,:,:], b(:)[:,:], c(:)[:]
index1 = image_index(a, [2, 1, 1] ) !OK
index2 = image_index(b, [2, 1, 1] ) ! { dg-error "array elements of the SUB argument to IMAGE_INDEX at .1. shall be 2 .corank. not 3" }
index3 = image_index(c, [1] ) !OK
end subroutine two
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment