diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2008-11-16 15:19:38 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2008-11-16 15:19:38 +0100 |
commit | 06919226fd73218490d67faf506bb61dedf63c18 (patch) | |
tree | 52f1a0e5c1acfebc7fecf51a5b4eab527c7f3346 /gcc | |
parent | 7cf98868513b35e5b9607e03577c17f490a172bb (diff) | |
download | gcc-06919226fd73218490d67faf506bb61dedf63c18.zip gcc-06919226fd73218490d67faf506bb61dedf63c18.tar.gz gcc-06919226fd73218490d67faf506bb61dedf63c18.tar.bz2 |
re PR fortran/38095 (character ICE)
2008-11-16 Tobias Burnus <burnus@net-b.de>
PR fortran/38095
* trans-expr.c (gfc_map_intrinsic_function): Fix pointer access.
2008-11-16 Tobias Burnus <burnus@net-b.de>
PR fortran/38095
* gfortran.dg/char_length_13.f90: New test.
From-SVN: r141917
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/char_length_13.f90 | 36 |
4 files changed, 51 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4e3ac60..ceb2f7c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2008-11-16 Tobias Burnus <burnus@net-b.de> + + PR fortran/38095 + * trans-expr.c (gfc_map_intrinsic_function): Fix pointer access. + 2008-11-16 Paul Thomas <pault@gcc.gnu.org> PR fortran/38119 @@ -14,8 +19,8 @@ 2008-11-15 Paul Thomas <pault@gcc.gnu.org> - 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 2e148f2c..58a18b9 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 8327d6c..d2b74b1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-11-16 Tobias Burnus <burnus@net-b.de> + + PR fortran/38095 + * gfortran.dg/char_length_13.f90: New test. + 2008-11-16 Uros Bizjak <ubizjak@gmail.com> * 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 0000000..576d5be --- /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" } } |