Patchwork [Fortran] Coarray - fix var decl check

login
register
mail settings
Submitter Tobias Burnus
Date July 22, 2011, 9:51 p.m.
Message ID <4E29F0E3.6050002@net-b.de>
Download mbox | patch
Permalink /patch/106394/
State New
Headers show

Comments

Tobias Burnus - July 22, 2011, 9:51 p.m.
Local, nostatic/nonallocable DT variables were rejected if they 
contained (allocatable) coarray components. However, those are allowed - 
I had initially misread the constraint.

   C526 A coarray or an object with a coarray ultimate
        component shall be a dummy argument or have the
        ALLOCATABLE or SAVE attribute.

Cf. also http://j3-fortran.org/pipermail/j3/2011-June/004403.html
if you have the same trouble as I initially had with "ultimate component".

Build and regtested on x86-64-linux.
OK for the trunk?

Tobias
jerry DeLisle - July 22, 2011, 10:16 p.m.
On 07/22/2011 02:51 PM, Tobias Burnus wrote:
> Local, nostatic/nonallocable DT variables were rejected if they contained
> (allocatable) coarray components. However, those are allowed - I had initially
> misread the constraint.
>
> C526 A coarray or an object with a coarray ultimate
> component shall be a dummy argument or have the
> ALLOCATABLE or SAVE attribute.
>
> Cf. also http://j3-fortran.org/pipermail/j3/2011-June/004403.html
> if you have the same trouble as I initially had with "ultimate component".
>
> Build and regtested on x86-64-linux.
> OK for the trunk?
>
> Tobias
>

OK for trunk.

Jerry

Patch

2011-07-23  Tobias Burnus  <burnus@net-b.de>

	* resolve.c (resolve_symbol): Fix coarray var decl check.

2011-07-23  Tobias Burnus  <burnus@net-b.de>

	* gfortran.dg/coarray_25.f90: New.

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 71e0ba0..e9e7bf0 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -12435,16 +12435,14 @@  resolve_symbol (gfc_symbol *sym)
 	       sym->name, &sym->declared_at);
 
   /* F2008, C526.  The function-result case was handled above.  */
-  if (((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.coarray_comp)
-       || sym->attr.codimension)
+  if (sym->attr.codimension
       && !(sym->attr.allocatable || sym->attr.dummy || sym->attr.save
 	   || sym->ns->save_all
 	   || sym->ns->proc_name->attr.flavor == FL_MODULE
 	   || sym->ns->proc_name->attr.is_main_program
 	   || sym->attr.function || sym->attr.result || sym->attr.use_assoc))
-    gfc_error ("Variable '%s' at %L is a coarray or has a coarray "
-	       "component and is not ALLOCATABLE, SAVE nor a "
-	       "dummy argument", sym->name, &sym->declared_at);
+    gfc_error ("Variable '%s' at %L is a coarray and is not ALLOCATABLE, SAVE "
+	       "nor a dummy argument", sym->name, &sym->declared_at);
   /* F2008, C528.  */  /* FIXME: sym->as check due to PR 43412.  */
   else if (sym->attr.codimension && !sym->attr.allocatable
       && sym->as && sym->as->cotype == AS_DEFERRED)
diff --git a/gcc/testsuite/gfortran.dg/coarray_4.f90 b/gcc/testsuite/gfortran.dg/coarray_4.f90
index be2bc4e..cdc4ef8 100644
--- a/gcc/testsuite/gfortran.dg/coarray_4.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_4.f90
@@ -31,7 +31,7 @@  subroutine valid2()
     integer, allocatable :: b[:]
   end type tt
   type(tt), save :: foo
-  type(tt) :: bar ! { dg-error "is a coarray or has a coarray component" }
+  type(tt) :: bar
 end subroutine valid2
 
 subroutine invalid(n)
--- /dev/null	2011-07-22 07:25:31.139891427 +0200
+++ gcc/gcc/testsuite/gfortran.dg/coarray_25.f90	2011-07-22 23:10:41.000000000 +0200
@@ -0,0 +1,18 @@ 
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+!
+! Used to be rejected with:
+!  Error: Variable 'x' at (1) is a coarray or has a coarray
+!  component and is not ALLOCATABLE, SAVE nor a dummy argument
+!
+! Is valid as "a" is allocatable, cf. C526
+! and http://j3-fortran.org/pipermail/j3/2011-June/004403.html
+!
+
+  subroutine test2()
+    type t
+      integer, allocatable :: a(:)[:]
+    end type t
+    type(t) :: x
+    allocate(x%a(1)[*])
+  end subroutine test2