From: Steven G. Kargl Date: Wed, 10 Jan 2018 23:55:00 +0000 (+0000) Subject: re PR fortran/82367 (ICE with deferred length string allocate on non-deferred length... X-Git-Tag: releases/gcc-6.5.0~592 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3917c91a5bf9c29fb5f4cba9356f85a13b550d1f;p=thirdparty%2Fgcc.git re PR fortran/82367 (ICE with deferred length string allocate on non-deferred length argument) 2018-01-10 Steven G. Kargl PR fortran/82367 * resolve.c (resolve_allocate_expr): Check for NULL pointer. 2018-01-10 Steven G. Kargl PR fortran/82367 * gfortran.dg/deferred_character_18.f90: New test. From-SVN: r256467 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 095b1bb7a15e..cd2be3fecdcc 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-01-10 Steven G. Kargl + + Backport from trunk + PR fortran/82367 + * resolve.c (resolve_allocate_expr): Check for NULL pointer. + 2018-01-10 Steven G. Kargl Backport from trunk diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 222fb7854c4a..ef938009f755 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -7136,8 +7136,13 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec) if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred && !UNLIMITED_POLY (e)) { - int cmp = gfc_dep_compare_expr (e->ts.u.cl->length, - code->ext.alloc.ts.u.cl->length); + int cmp; + + if (!e->ts.u.cl->length) + goto failure; + + cmp = gfc_dep_compare_expr (e->ts.u.cl->length, + code->ext.alloc.ts.u.cl->length); if (cmp == 1 || cmp == -1 || cmp == -3) { gfc_error ("Allocating %s at %L with type-spec requires the same " diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9304367256ad..300e93dcf504 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-01-10 Steven G. Kargl + + Backport from trunk + PR fortran/82367 + * gfortran.dg/deferred_character_18.f90: New test. + 2018-01-10 Steven G. Kargl Backport from trunk diff --git a/gcc/testsuite/gfortran.dg/deferred_character_18.f90 b/gcc/testsuite/gfortran.dg/deferred_character_18.f90 new file mode 100644 index 000000000000..1b1457fa293c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_18.f90 @@ -0,0 +1,29 @@ +! { dg-do compile } +! PR Fortran/82367 +! Contributed by Walter Spector +module cls_allocmod + implicit none + +contains + + subroutine cls_alloc (n, str) + integer, intent(in) :: n + character(*), allocatable, intent(out) :: str +! Note: Star ^ should have been a colon (:) + + allocate (character(n)::str) + + end subroutine + +end module + +program cls + use cls_allocmod + implicit none + + character(:), allocatable :: s + + call cls_alloc(42, s) ! { dg-error "allocatable or pointer dummy argument" } + print *, 'string len =', len(s) + +end program