diff mbox

[fortran,pr77785,v3,Coarray] ICE in gfc_get_caf_token_offset, at fortran/trans-expr.c:1990

Message ID 20161213145436.5d293776@vepi2
State Superseded
Headers show

Commit Message

Andre Vehreschild Dec. 13, 2016, 1:54 p.m. UTC
Hi Janus, hi all,

thanks for the input on the missing testcase, Janus (btw, when you know where to
get a new crystal ball, let me know; I am missing mine, too). The new version
of the patch adds a new testcase coarray_41.f90 to test that the compiler
compiles correctly and the test runs ok.

Bootstrapped and regtested on x86_64-linux/f23. Ok for trunk?

Regards,
	Andre

On Tue, 13 Dec 2016 12:11:50 +0100
Janus Weil <janus@gcc.gnu.org> wrote:

> Hi Andre,

> 

> > all the sanitizer issues I fixed occur during compiling the testsuite. So I

> > would say, that when with the patch these errors do not occur anymore while

> > processing the testsuite, then those are tested for, right?  

> 

> aah, so you're saying that hunk is not actually related to the PR in

> the subject line, but instead fixes a testsuite failure seen with a

> sanitized compiler? That wasn't mentioned anywhere and sadly I forgot

> to bring my crystal ball ...

> 

> Cheers,

> Janus

> 

> 

> 

> > On Mon, 12 Dec 2016 13:37:43 +0100

> > Janus Weil <janus@gcc.gnu.org> wrote:

> >  

> >> Hi Andre,

> >>  

> >> > the attached patch corrects reporting of "Sorry, unimplemented yet" for

> >> > allocatable and pointer components in polymorphic objects (BT_CLASS) thus

> >> > fixing two ICEs reported in the PR.

> >> >

> >> > The next chunk fixes an ICE when the declaration containing the token

> >> > information is of type POINTER or REFERENCE.

> >> >

> >> > Bootstraps and regtests ok on x86_64-linux/f23. Ok for trunk?  

> >>

> >> the resolve.c hunk is certainly ok. The trans-array.c part looks

> >> reasonable as well, but I wonder if it is actually covered by any of

> >> your test cases? Since they are all compile-only, with errors being

> >> thrown at resolution stage, do they even get to the translation stage?

> >>

> >> Cheers,

> >> Janus  

> >

> >

> > --

> > Andre Vehreschild * Email: vehre ad gmx dot de  



-- 
Andre Vehreschild * Email: vehre ad gmx dot de
gcc/fortran/ChangeLog:

2016-12-13  Andre Vehreschild  <vehre@gcc.gnu.org>

	PR fortran/77785
	* resolve.c (resolve_symbol): Correct attr lookup to the _data
	component.
	* trans-array.c (gfc_alloc_allocatable_for_assignment): Indirect ref
	pointers and references before retrieving the caf-token.

gcc/testsuite/ChangeLog:

2016-12-13  Andre Vehreschild  <vehre@gcc.gnu.org>

	PR fortran/77785
	* gfortran.dg/coarray_38.f90: Added expecting error message.
	* gfortran.dg/coarray_41.f90: New test.
	* gfortran.dg/coarray_class_2.f90: New test.

Comments

Janus Weil Dec. 13, 2016, 3:08 p.m. UTC | #1
Hi Andre,

> thanks for the input on the missing testcase, Janus (btw, when you know where to

> get a new crystal ball, let me know; I am missing mine, too). The new version

> of the patch adds a new testcase coarray_41.f90 to test that the compiler

> compiles correctly and the test runs ok.

>

> Bootstrapped and regtested on x86_64-linux/f23. Ok for trunk?


yes, good for trunk then.

Cheers,
Janus



> On Tue, 13 Dec 2016 12:11:50 +0100

> Janus Weil <janus@gcc.gnu.org> wrote:

>

>> Hi Andre,

>>

>> > all the sanitizer issues I fixed occur during compiling the testsuite. So I

>> > would say, that when with the patch these errors do not occur anymore while

>> > processing the testsuite, then those are tested for, right?

>>

>> aah, so you're saying that hunk is not actually related to the PR in

>> the subject line, but instead fixes a testsuite failure seen with a

>> sanitized compiler? That wasn't mentioned anywhere and sadly I forgot

>> to bring my crystal ball ...

>>

>> Cheers,

>> Janus

>>

>>

>>

>> > On Mon, 12 Dec 2016 13:37:43 +0100

>> > Janus Weil <janus@gcc.gnu.org> wrote:

>> >

>> >> Hi Andre,

>> >>

>> >> > the attached patch corrects reporting of "Sorry, unimplemented yet" for

>> >> > allocatable and pointer components in polymorphic objects (BT_CLASS) thus

>> >> > fixing two ICEs reported in the PR.

>> >> >

>> >> > The next chunk fixes an ICE when the declaration containing the token

>> >> > information is of type POINTER or REFERENCE.

>> >> >

>> >> > Bootstraps and regtests ok on x86_64-linux/f23. Ok for trunk?

>> >>

>> >> the resolve.c hunk is certainly ok. The trans-array.c part looks

>> >> reasonable as well, but I wonder if it is actually covered by any of

>> >> your test cases? Since they are all compile-only, with errors being

>> >> thrown at resolution stage, do they even get to the translation stage?

>> >>

>> >> Cheers,

>> >> Janus

>> >

>> >

>> > --

>> > Andre Vehreschild * Email: vehre ad gmx dot de

>

>

> --

> Andre Vehreschild * Email: vehre ad gmx dot de
diff mbox

Patch

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index c7d872c..b610797 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -14044,8 +14044,8 @@  resolve_symbol (gfc_symbol *sym)
   if (flag_coarray == GFC_FCOARRAY_LIB && sym->ts.type == BT_CLASS
       && sym->ts.u.derived && CLASS_DATA (sym)
       && CLASS_DATA (sym)->attr.codimension
-      && (sym->ts.u.derived->attr.alloc_comp
-	  || sym->ts.u.derived->attr.pointer_comp))
+      && (CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp
+	  || CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp))
     {
       gfc_error ("Sorry, allocatable/pointer components in polymorphic (CLASS) "
 		 "type coarrays at %L are unsupported", &sym->declared_at);
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 8753cbf..0cd83f4 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -9337,6 +9337,8 @@  gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
       if (token == NULL_TREE)
 	{
 	  tmp = gfc_get_tree_for_caf_expr (expr1);
+	  if (POINTER_TYPE_P (TREE_TYPE (tmp)))
+	    tmp = build_fold_indirect_ref (tmp);
 	  gfc_get_caf_token_offset (&caf_se, &token, NULL, tmp, NULL_TREE,
 				    expr1);
 	  token = gfc_build_addr_expr (NULL_TREE, token);
diff --git a/gcc/testsuite/gfortran.dg/coarray_38.f90 b/gcc/testsuite/gfortran.dg/coarray_38.f90
index c8011d4..04ef742 100644
--- a/gcc/testsuite/gfortran.dg/coarray_38.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_38.f90
@@ -92,7 +92,7 @@  end type t
 type t2
   class(t), allocatable :: caf2[:]
 end type t2
-class(t), save, allocatable :: caf[:]
+class(t), save, allocatable :: caf[:] ! { dg-error "Sorry, allocatable/pointer components in polymorphic" }
 type(t) :: x
 type(t2) :: y
 
diff --git a/gcc/testsuite/gfortran.dg/coarray_41.f90 b/gcc/testsuite/gfortran.dg/coarray_41.f90
new file mode 100644
index 0000000..b62d8e4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_41.f90
@@ -0,0 +1,29 @@ 
+! { dg-do run }
+! { dg-options "-fcoarray=lib -lcaf_single" }
+
+program coarray_41
+
+  integer, allocatable :: vec(:)[:,:]
+
+  allocate(vec(10)[2,*], source= 37)
+
+  if (.not. allocated(vec)) error stop
+
+  call foo(vec)
+
+  if (any(vec /= 42)) error stop
+
+  deallocate(vec)
+contains
+
+  subroutine foo(gv)
+
+    integer, allocatable, intent(inout) :: gv(:)[:,:]
+    integer, allocatable :: gvin(:)
+
+    allocate(gvin, mold=gv)
+    gvin = 5
+    gv = gv + gvin
+  end subroutine foo
+
+end program coarray_41
diff --git a/gcc/testsuite/gfortran.dg/coarray_class_2.f90 b/gcc/testsuite/gfortran.dg/coarray_class_2.f90
new file mode 100644
index 0000000..58dce1a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_class_2.f90
@@ -0,0 +1,45 @@ 
+! { dg-do compile }
+! { dg-options "-fcoarray=lib" }
+! Check that error message is presented as long as polymorphic coarrays are
+! not implemented.
+
+module maccscal
+   type t
+      real, allocatable :: a
+   end type
+contains
+   subroutine s(x) ! { dg-error "Sorry, allocatable/pointer components in polymorphic \\(CLASS\\)" }
+      class(t) :: x[*]
+      allocate (x%a)
+   end
+end
+module mptrscal
+   type t
+      real, pointer :: a
+   end type
+contains
+   subroutine s(x) ! { dg-error "Sorry, allocatable/pointer components in polymorphic \\(CLASS\\)" }
+      class(t) :: x[*]
+      allocate (x%a)
+   end
+end
+module mallarr
+   type t
+      real, allocatable :: a(:)
+   end type
+contains
+   subroutine s(x) ! { dg-error "Sorry, allocatable/pointer components in polymorphic \\(CLASS\\)" }
+      class(t) :: x[*]
+      allocate (x%a(2))
+   end
+end
+module mptrarr
+   type t
+      real, pointer :: a(:)
+   end type
+contains
+   subroutine s(x) ! { dg-error "Sorry, allocatable/pointer components in polymorphic \\(CLASS\\)" }
+      class(t) :: x[*]
+      allocate (x%a(2))
+   end
+end