aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2011-05-27 23:29:19 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2011-05-27 23:29:19 +0200
commit5aacb11e06658a9d38b9810db0d9587c64271122 (patch)
tree22ef55bff748e9924fba15d6b5baabb76acb616d /gcc/fortran
parentfc64b4481d6085c4f4fd260b5801d0785c8a7a02 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/fortran/check.c27
-rw-r--r--gcc/fortran/match.c7
-rw-r--r--gcc/fortran/resolve.c7
-rw-r--r--gcc/fortran/trans-types.c9
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));
}