Commit 5aacb11e by Tobias Burnus Committed by Tobias Burnus

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

2011-05-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/18918
        * check.c (gfc_check_associated, gfc_check_null): Add coindexed
        * check.
        * match.c (gfc_match_nullify): Ditto.
        * resolve.c (resolve_deallocate_expr): Ditto.
        * trans-types.c (gfc_get_nodesc_array_type): Don't set
        * restricted
        for nonpointers.

2011-05-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/18918
        * gfortran.dg/coarray_22.f90: New.

From-SVN: r174364
parent fc64b448
2011-05-27 Tobias Burnus <burnus@net-b.de> 2011-05-27 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
* check.c (gfc_check_associated, gfc_check_null): Add coindexed check.
* match.c (gfc_match_nullify): Ditto.
* resolve.c (resolve_deallocate_expr): Ditto.
* trans-types.c (gfc_get_nodesc_array_type): Don't set restricted
for nonpointers.
2011-05-27 Tobias Burnus <burnus@net-b.de>
PR fortran/48820 PR fortran/48820
* gfortran.h (gfc_isym_id): Add GFC_ISYM_RANK. * gfortran.h (gfc_isym_id): Add GFC_ISYM_RANK.
* intrinsic.c (add_functions): Add rank intrinsic. * intrinsic.c (add_functions): Add rank intrinsic.
......
...@@ -875,6 +875,15 @@ gfc_check_associated (gfc_expr *pointer, gfc_expr *target) ...@@ -875,6 +875,15 @@ gfc_check_associated (gfc_expr *pointer, gfc_expr *target)
return FAILURE; return FAILURE;
} }
/* F2008, C1242. */
if (attr1.pointer && gfc_is_coindexed (pointer))
{
gfc_error ("'%s' argument of '%s' intrinsic at %L shall not be "
"conindexed", gfc_current_intrinsic_arg[0]->name,
gfc_current_intrinsic, &pointer->where);
return FAILURE;
}
/* Target argument is optional. */ /* Target argument is optional. */
if (target == NULL) if (target == NULL)
return SUCCESS; return SUCCESS;
...@@ -902,6 +911,15 @@ gfc_check_associated (gfc_expr *pointer, gfc_expr *target) ...@@ -902,6 +911,15 @@ gfc_check_associated (gfc_expr *pointer, gfc_expr *target)
return FAILURE; return FAILURE;
} }
/* F2008, C1242. */
if (attr1.pointer && gfc_is_coindexed (target))
{
gfc_error ("'%s' argument of '%s' intrinsic at %L shall not be "
"conindexed", gfc_current_intrinsic_arg[1]->name,
gfc_current_intrinsic, &target->where);
return FAILURE;
}
t = SUCCESS; t = SUCCESS;
if (same_type_check (pointer, 0, target, 1) == FAILURE) if (same_type_check (pointer, 0, target, 1) == FAILURE)
t = FAILURE; t = FAILURE;
...@@ -2651,6 +2669,15 @@ gfc_check_null (gfc_expr *mold) ...@@ -2651,6 +2669,15 @@ gfc_check_null (gfc_expr *mold)
return FAILURE; return FAILURE;
} }
/* F2008, C1242. */
if (gfc_is_coindexed (mold))
{
gfc_error ("'%s' argument of '%s' intrinsic at %L shall not be "
"conindexed", gfc_current_intrinsic_arg[0]->name,
gfc_current_intrinsic, &mold->where);
return FAILURE;
}
return SUCCESS; return SUCCESS;
} }
......
...@@ -3194,6 +3194,13 @@ gfc_match_nullify (void) ...@@ -3194,6 +3194,13 @@ gfc_match_nullify (void)
if (gfc_check_do_variable (p->symtree)) if (gfc_check_do_variable (p->symtree))
goto cleanup; goto cleanup;
/* F2008, C1242. */
if (gfc_is_coindexed (p))
{
gfc_error ("Pointer object at %C shall not be conindexed");
goto cleanup;
}
/* build ' => NULL() '. */ /* build ' => NULL() '. */
e = gfc_get_null_expr (&gfc_current_locus); e = gfc_get_null_expr (&gfc_current_locus);
......
...@@ -6494,6 +6494,13 @@ resolve_deallocate_expr (gfc_expr *e) ...@@ -6494,6 +6494,13 @@ resolve_deallocate_expr (gfc_expr *e)
return FAILURE; return FAILURE;
} }
/* F2008, C644. */
if (gfc_is_coindexed (e))
{
gfc_error ("Coindexed allocatable object at %L", &e->where);
return FAILURE;
}
if (pointer if (pointer
&& gfc_check_vardef_context (e, true, _("DEALLOCATE object")) == FAILURE) && gfc_check_vardef_context (e, true, _("DEALLOCATE object")) == FAILURE)
return FAILURE; return FAILURE;
......
...@@ -1543,13 +1543,12 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed, ...@@ -1543,13 +1543,12 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed,
if (as->rank == 0) if (as->rank == 0)
{ {
if (packed != PACKED_STATIC || gfc_option.coarray == GFC_FCOARRAY_LIB) if (packed != PACKED_STATIC || gfc_option.coarray == GFC_FCOARRAY_LIB)
type = build_pointer_type (type); {
type = build_pointer_type (type);
if (restricted) if (restricted)
type = build_qualified_type (type, TYPE_QUAL_RESTRICT); type = build_qualified_type (type, TYPE_QUAL_RESTRICT);
if (packed != PACKED_STATIC || gfc_option.coarray == GFC_FCOARRAY_LIB)
{
GFC_ARRAY_TYPE_P (type) = 1; GFC_ARRAY_TYPE_P (type) = 1;
TYPE_LANG_SPECIFIC (type) = TYPE_LANG_SPECIFIC (TREE_TYPE (type)); TYPE_LANG_SPECIFIC (type) = TYPE_LANG_SPECIFIC (TREE_TYPE (type));
} }
......
2011-05-27 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
* gfortran.dg/coarray_22.f90: New.
2011-05-27 Bill Schmidt <wschmidt@linux.vnet.ibm.com> 2011-05-27 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR tree-optimization/46728 PR tree-optimization/46728
......
! { dg-do compile }
! { dg-options "-fcoarray=single" }
!
! Constraint checks for invalid access of remote pointers
! (Accessing the value is ok, checking/changing association
! status is invalid)
!
! PR fortran/18918
!
type t
integer, pointer :: ptr => null()
end type t
type(t) :: x[*], y[*]
if (associated(x%ptr)) stop 0
if (associated(x%ptr,y%ptr)) stop 0
if (associated(x[1]%ptr)) stop 0 ! { dg-error "shall not be conindexed" }
if (associated(x%ptr,y[1]%ptr)) stop 0 ! { dg-error "shall not be conindexed" }
nullify (x%ptr)
nullify (x[1]%ptr) ! { dg-error "shall not be conindexed" }
x%ptr => null(x%ptr)
x%ptr => null(x[1]%ptr) ! { dg-error "shall not be conindexed" }
x[1]%ptr => null(x%ptr) ! { dg-error "shall not have a coindex" }
allocate(x%ptr)
deallocate(x%ptr)
allocate(x[1]%ptr) ! { dg-error "Coindexed allocatable object" }
deallocate(x[1]%ptr) ! { dg-error "Coindexed allocatable object" }
end
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