OSDN Git Service

2011-05-27 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 May 2011 21:29:19 +0000 (21:29 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 May 2011 21:29:19 +0000 (21:29 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174364 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/check.c
gcc/fortran/match.c
gcc/fortran/resolve.c
gcc/fortran/trans-types.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/coarray_22.f90 [new file with mode: 0644]

index 63ff7db..10ec0b0 100644 (file)
@@ -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.
index 01651cb..70c23e6 100644 (file)
@@ -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;
 }
 
index 75f2a7f..f275239 100644 (file)
@@ -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);
 
index 3483bc7..4b18529 100644 (file)
@@ -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;
index 9c4f5f6..94b9a59 100644 (file)
@@ -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)); 
        }
index a8be7cd..915cd90 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR tree-optimization/46728
diff --git a/gcc/testsuite/gfortran.dg/coarray_22.f90 b/gcc/testsuite/gfortran.dg/coarray_22.f90
new file mode 100644 (file)
index 0000000..b09dfe3
--- /dev/null
@@ -0,0 +1,33 @@
+! { 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