Hi, 

this patch is ready for commit now. Please apply. There have been no objections
against doing dg-do compile only, since my last post in August.

- Andre

On Tue, 26 Aug 2014 11:30:12 +0200
Andre Vehreschild <ve...@gmx.de> wrote:

> Hi,
> 
> On Sun, 17 Aug 2014 15:06:02 +0200
> Mikael Morin <mikael.mo...@sfr.fr> wrote:
> 
> > Le 17/08/2014 14:26, Dominique Dhumieres a écrit :
> > > As Mikael said in https://gcc.gnu.org/ml/fortran/2014-08/msg00047.html
> > > 
> > >> the testcase should check that the code generated is actually working,
> > >> not just that the ICE disappeared. ...
> > > 
> > Well, this is for another patch where deferred character variable are
> > made acceptable as argument to unlimited polymorphic dummies.
> > Here the ICE comes (if I remember correctly) from the wrong generic
> > procedure being picked, so there is not really some new feature enabled
> > with the patch.
> 
> This is correct so far. 
> 
> > 
> > > thus I think the test should be run, i.e., '! { dg-do compile }' should
> > > be replaced with '! { dg-do run }' (I have checked that the test
> > > succeeds).
> > > 
> > I don't have a strong opinion for it, but I'm OK with that change.
> > In fact the initial test was a run one, and it has been changed to
> > compile.  Andre: why?
> 
> I was asked to move to compile only, because a run test takes a lot of time.
> I was told that the run test compiles the code multiple times with different
> optimization. This issue was deemed to be solely on the compile stage and was
> not influenced by optimization. Therefore I agreed to switch to dg-do compile.
> That the test is fine for running, too, is merely for my training of how to do
> that. My opinion is, that dg-do compile is sufficient to prove, that PR60414
> is resolved, because that is the sole purpose of the patch. I understand
> Dominique wanting to have the dg-do run, because the effectiveness of the
> patch is only shown on running the test. Is there a compromise of running a
> test, but only for one optimization stage? Then may be we can do that.
> 
> - Andre


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

Attachment: pr60414_6.clg
Description: Binary data

diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 2429fd2..c8f61e1 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -2156,10 +2156,6 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
   if (symbol_rank (formal) == actual->rank || symbol_rank (formal) == -1)
     return 1;
 
-  if (actual->ts.type == BT_CLASS && CLASS_DATA (actual)->as
-	&& CLASS_DATA (actual)->as->rank == symbol_rank (formal))
-    return 1;
-
   rank_check = where != NULL && !is_elemental && formal->as
 	       && (formal->as->type == AS_ASSUMED_SHAPE
 		   || formal->as->type == AS_DEFERRED)
diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_18.f90 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_18.f90
new file mode 100644
index 0000000..7a0df1a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_18.f90
@@ -0,0 +1,69 @@
+! { dg-do compile }
+! Testing fix for
+! PR fortran/60414
+!
+module m
+    implicit none
+    Type T
+        real, public :: expectedScalar;
+    contains
+        procedure :: FCheck
+        procedure :: FCheckArr
+        generic :: Check => FCheck, FCheckArr
+    end Type
+
+contains
+
+    subroutine FCheck(this,X)
+        class(T) this
+        class(*) X
+        real :: r
+        select type (X)
+            type is (real)
+                if ( abs (X - this%expectedScalar) > 0.0001 ) then
+                    call abort()
+                end if
+            class default
+                call abort ()
+         end select
+    end subroutine FCheck
+
+    subroutine FCheckArr(this,X)
+        class(T) this
+        class(*) X(:)
+        integer i
+        do i = 1,6
+            this%expectedScalar = i - 1.0
+            call this%FCheck(X(i))
+        end do
+    end subroutine FCheckArr
+
+    subroutine CheckTextVector(vec, n, scal)
+        integer, intent(in) :: n
+        class(*), intent(in) :: vec(n)
+        class(*), intent(in) :: scal
+        integer j
+        Type(T) :: Tester
+
+        ! Check full vector
+        call Tester%Check(vec)
+        ! Check a scalar of the same class like the vector
+        Tester%expectedScalar = 5.0
+        call Tester%Check(scal)
+        ! Check an element of the vector, which is a scalar
+        j=3
+        Tester%expectedScalar = 2.0
+        call Tester%Check(vec(j))
+
+    end subroutine CheckTextVector
+
+end module
+
+program test
+   use :: m
+   implicit none
+
+   real :: vec(1:6) = (/ 0, 1, 2, 3, 4, 5 /)
+   call checktextvector(vec, 6, 5.0)
+end program test
+

Reply via email to