re PR fortran/15327 (ICE when using MERGE on strings)

fortran/
PR fortran/15327
* trans-intrinsic.c (gfc_conv_intrinsic_merge): Do the right thing for
strings.

testsuite/
PR fortran/15327
* gfortran.dg/merge_char_1.f90: New test.

From-SVN: r86940
This commit is contained in:
Tobias Schlüter 2004-09-02 01:29:46 +02:00 committed by Tobias Schlüter
parent 40219f9650
commit c3d0559da5
4 changed files with 39 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2004-09-01 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/15327
* trans-intrinsic.c (gfc_conv_intrinsic_merge): Do the right thing for
strings.
2004-09-01 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/16400

View File

@ -1998,14 +1998,30 @@ gfc_conv_intrinsic_merge (gfc_se * se, gfc_expr * expr)
tree fsource;
tree mask;
tree type;
tree len;
arg = gfc_conv_intrinsic_function_args (se, expr);
tsource = TREE_VALUE (arg);
arg = TREE_CHAIN (arg);
fsource = TREE_VALUE (arg);
arg = TREE_CHAIN (arg);
mask = TREE_VALUE (arg);
if (expr->ts.type != BT_CHARACTER)
{
tsource = TREE_VALUE (arg);
arg = TREE_CHAIN (arg);
fsource = TREE_VALUE (arg);
mask = TREE_VALUE (TREE_CHAIN (arg));
}
else
{
/* We do the same as in the non-character case, but the argument
list is different because of the string length arguments. We
also have to set the string length for the result. */
len = TREE_VALUE (arg);
arg = TREE_CHAIN (arg);
tsource = TREE_VALUE (arg);
arg = TREE_CHAIN (TREE_CHAIN (arg));
fsource = TREE_VALUE (arg);
mask = TREE_VALUE (TREE_CHAIN (arg));
se->string_length = len;
}
type = TREE_TYPE (tsource);
se->expr = fold (build3 (COND_EXPR, type, mask, tsource, fsource));
}

View File

@ -1,3 +1,8 @@
2004-09-01 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/15327
* gfortran.dg/merge_char_1.f90: New test.
2004-09-01 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/16404

View File

@ -0,0 +1,7 @@
! { dg-do run }
! PR 15327
! The merge intrinsic didn't work for strings
character*2 :: c(2)
c = merge( (/ "AA", "BB" /), (/ "CC", "DD" /), (/ .TRUE., .FALSE. /) )
if (c(1).ne."AA" .or. c(2).ne."DD") call abort ()
end