diff options
author | Tobias Burnus <burnus@net-b.de> | 2011-05-27 23:29:19 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2011-05-27 23:29:19 +0200 |
commit | 5aacb11e06658a9d38b9810db0d9587c64271122 (patch) | |
tree | 22ef55bff748e9924fba15d6b5baabb76acb616d /gcc/fortran | |
parent | fc64b4481d6085c4f4fd260b5801d0785c8a7a02 (diff) | |
download | gcc-5aacb11e06658a9d38b9810db0d9587c64271122.zip gcc-5aacb11e06658a9d38b9810db0d9587c64271122.tar.gz gcc-5aacb11e06658a9d38b9810db0d9587c64271122.tar.bz2 |
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
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/check.c | 27 | ||||
-rw-r--r-- | gcc/fortran/match.c | 7 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 9 |
5 files changed, 54 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 63ff7db..10ec0b0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,14 @@ 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 * gfortran.h (gfc_isym_id): Add GFC_ISYM_RANK. * intrinsic.c (add_functions): Add rank intrinsic. diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 01651cb..70c23e6 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -875,6 +875,15 @@ gfc_check_associated (gfc_expr *pointer, gfc_expr *target) 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. */ if (target == NULL) return SUCCESS; @@ -902,6 +911,15 @@ gfc_check_associated (gfc_expr *pointer, gfc_expr *target) 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; if (same_type_check (pointer, 0, target, 1) == FAILURE) t = FAILURE; @@ -2651,6 +2669,15 @@ gfc_check_null (gfc_expr *mold) 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; } diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 75f2a7f..f275239 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -3194,6 +3194,13 @@ gfc_match_nullify (void) if (gfc_check_do_variable (p->symtree)) goto cleanup; + /* F2008, C1242. */ + if (gfc_is_coindexed (p)) + { + gfc_error ("Pointer object at %C shall not be conindexed"); + goto cleanup; + } + /* build ' => NULL() '. */ e = gfc_get_null_expr (&gfc_current_locus); diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 3483bc7..4b18529 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6494,6 +6494,13 @@ resolve_deallocate_expr (gfc_expr *e) return FAILURE; } + /* F2008, C644. */ + if (gfc_is_coindexed (e)) + { + gfc_error ("Coindexed allocatable object at %L", &e->where); + return FAILURE; + } + if (pointer && gfc_check_vardef_context (e, true, _("DEALLOCATE object")) == FAILURE) return FAILURE; diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 9c4f5f6..94b9a59 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -1543,13 +1543,12 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed, if (as->rank == 0) { if (packed != PACKED_STATIC || gfc_option.coarray == GFC_FCOARRAY_LIB) - type = build_pointer_type (type); + { + type = build_pointer_type (type); - if (restricted) - type = build_qualified_type (type, TYPE_QUAL_RESTRICT); + if (restricted) + type = build_qualified_type (type, TYPE_QUAL_RESTRICT); - if (packed != PACKED_STATIC || gfc_option.coarray == GFC_FCOARRAY_LIB) - { GFC_ARRAY_TYPE_P (type) = 1; TYPE_LANG_SPECIFIC (type) = TYPE_LANG_SPECIFIC (TREE_TYPE (type)); } |