aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>2004-09-02 01:29:46 +0200
committerTobias Schlüter <tobi@gcc.gnu.org>2004-09-02 01:29:46 +0200
commitc3d0559da5e101d454cc4e90d67f08d11ea1036c (patch)
tree645d3bcde8225440ecfbf1676a7dc7ef7f2d6a7b
parent40219f9650a956d7fbff36721fae3a5b761311b1 (diff)
downloadgcc-c3d0559da5e101d454cc4e90d67f08d11ea1036c.zip
gcc-c3d0559da5e101d454cc4e90d67f08d11ea1036c.tar.gz
gcc-c3d0559da5e101d454cc4e90d67f08d11ea1036c.tar.bz2
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
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-intrinsic.c26
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/merge_char_1.f907
4 files changed, 39 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 1c792b9..abeaaaa 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
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
PR fortran/16404
(port from g95)
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index bdb307f..79d6689 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -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));
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ba2a713..da0463c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* gfortran.dg/der_io_1.f90: XFAIL illegal testcase.
diff --git a/gcc/testsuite/gfortran.dg/merge_char_1.f90 b/gcc/testsuite/gfortran.dg/merge_char_1.f90
new file mode 100644
index 0000000..0a8036d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/merge_char_1.f90
@@ -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