From: Paul Thomas Date: Sat, 24 Nov 2018 18:54:52 +0000 (+0000) Subject: re PR fortran/88143 (ICE in resolve_variable at gcc/fortran/resolve.c:5413 since... X-Git-Tag: releases/gcc-7.4.0~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57c426a788ee5c13a06082987f79ed141a7913b5;p=thirdparty%2Fgcc.git re PR fortran/88143 (ICE in resolve_variable at gcc/fortran/resolve.c:5413 since r253077) 2018-11-24 Paul Thomas PR fortran/88143 * resolve.c (resolve_variable): Check for associate names with NULL target. 2018-11-24 Paul Thomas PR fortran/88143 * gfortran.dg/associate_46.f90: New test. From-SVN: r266431 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6c85b63169cb..95f097cad1ec 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2018-11-24 Paul Thomas + + Backport from mainline + PR fortran/88143 + * resolve.c (resolve_variable): Check for associate names with + NULL target. + 2019-11-03 Tobias Burnus Thomas Koenig diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 483f3b2a7b70..06d98da636d5 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -5132,7 +5132,7 @@ resolve_variable (gfc_expr *e) the ts' type of the component refs is still array valued, which can't be translated that way. */ if (sym->assoc && e->rank == 0 && e->ref && sym->ts.type == BT_CLASS - && sym->assoc->target->ts.type == BT_CLASS + && sym->assoc->target && sym->assoc->target->ts.type == BT_CLASS && CLASS_DATA (sym->assoc->target)->as) { gfc_ref *ref = e->ref; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4194ad6185e6..7d3dbd150a50 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-11-24 Paul Thomas + + Backport from mainline + PR fortran/88143 + * gfortran.dg/associate_46.f90: New test. + 2018-11-22 Eric Botcazou Backport from mainline diff --git a/gcc/testsuite/gfortran.dg/associate_46.f90 b/gcc/testsuite/gfortran.dg/associate_46.f90 new file mode 100644 index 000000000000..69cc189bfa4e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/associate_46.f90 @@ -0,0 +1,37 @@ +! { dg-do run } +! +! Check the fix for PR88143, in which the associate name caused +! a segfault in resolve.c. Make sure that the associate construct +! does its job correctly, as well as compiles. +! +! Contributed by Andrew Wood +! +MODULE m + IMPLICIT NONE + TYPE t + INTEGER, DIMENSION(:), ALLOCATABLE :: i + END TYPE + CONTAINS + SUBROUTINE s(x, idx1, idx2, k) + CLASS(*), DIMENSION(:), INTENT(IN), OPTIONAL :: x + INTEGER :: idx1, idx2, k + SELECT TYPE ( x ) + CLASS IS ( t ) + ASSOCIATE ( j => x(idx1)%i ) + k = j(idx2) + END ASSOCIATE + END SELECT + END +END + + use m + class (t), allocatable :: c(:) + integer :: k + allocate (c(2)) + allocate (c(1)%i, source = [3,2,1]) + allocate (c(2)%i, source = [6,5,4]) + call s(c, 1, 3, k) + if (k .ne. 1) stop 1 + call s(c, 2, 1, k) + if (k .ne. 6) stop 2 +end