From 06919226fd73218490d67faf506bb61dedf63c18 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Sun, 16 Nov 2008 15:19:38 +0100 Subject: [PATCH] re PR fortran/38095 (character ICE) 2008-11-16 Tobias Burnus PR fortran/38095 * trans-expr.c (gfc_map_intrinsic_function): Fix pointer access. 2008-11-16 Tobias Burnus PR fortran/38095 * gfortran.dg/char_length_13.f90: New test. From-SVN: r141917 --- gcc/fortran/ChangeLog | 9 +++-- gcc/fortran/trans-expr.c | 5 +-- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gfortran.dg/char_length_13.f90 | 36 ++++++++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/char_length_13.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4e3ac606a496..ceb2f7c00e09 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2008-11-16 Tobias Burnus + + PR fortran/38095 + * trans-expr.c (gfc_map_intrinsic_function): Fix pointer access. + 2008-11-16 Paul Thomas PR fortran/38119 @@ -14,8 +19,8 @@ 2008-11-15 Paul Thomas - PR fortran/37926 - * trans-expr.c (gfc_add_interface_mapping): Transfer the formal + PR fortran/37926 + * trans-expr.c (gfc_add_interface_mapping): Transfer the formal arglist and the always_explicit attribute if the dummy arg is a procedure. diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 2e148f2c765a..58a18b9e2f94 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1922,8 +1922,9 @@ gfc_map_intrinsic_function (gfc_expr *expr, gfc_interface_mapping *mapping) case GFC_ISYM_LEN: /* TODO figure out why this condition is necessary. */ if (sym->attr.function - && arg1->ts.cl->length->expr_type != EXPR_CONSTANT - && arg1->ts.cl->length->expr_type != EXPR_VARIABLE) + && (arg1->ts.cl->length == NULL + || (arg1->ts.cl->length->expr_type != EXPR_CONSTANT + && arg1->ts.cl->length->expr_type != EXPR_VARIABLE))) return false; new_expr = gfc_copy_expr (arg1->ts.cl->length); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8327d6ca027a..d2b74b1ded9f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-11-16 Tobias Burnus + + PR fortran/38095 + * gfortran.dg/char_length_13.f90: New test. + 2008-11-16 Uros Bizjak * gcc.target/i386/pr36246.c: Add -fomit-frame-pointer to dg-options. diff --git a/gcc/testsuite/gfortran.dg/char_length_13.f90 b/gcc/testsuite/gfortran.dg/char_length_13.f90 new file mode 100644 index 000000000000..576d5be77755 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/char_length_13.f90 @@ -0,0 +1,36 @@ +! { dg-do compile } +! +! PR fortran/38095 +! +! Contributed by Vivek Rao +! +! Compiling the program below gave an ICE +! +module bar + implicit none +contains +elemental function trim_append(xx,yy) result(xy) + character (len=*), intent(in) :: xx,yy + character (len=len(xx) + len(yy)) :: xy + xy = trim(xx) // yy +end function trim_append +function same(xx) result(yy) + character (len=*), intent(in) :: xx(:) + character (len=len(xx)) :: yy(size(xx)) + yy = [xx] +end function same +subroutine foo(labels) + character (len=*), intent(in) :: labels(:) + print*,"size(labels)=",size(labels) +end subroutine foo +subroutine xmain() + call foo(trim_append(["a"],same(["b"]))) +end subroutine xmain +end module bar + +program main + use bar + call xmain() +end program main + +! { dg-final { cleanup-modules "bar" } } -- 2.47.2