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 <[email protected]> wrote: > Hi, > > On Sun, 17 Aug 2014 15:06:02 +0200 > Mikael Morin <[email protected]> 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
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
+
