aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2008-04-16 20:53:07 +0000
committerPaul Thomas <pault@gcc.gnu.org>2008-04-16 20:53:07 +0000
commitc240868146f0421a88ea96f9fdbe42e0327805be (patch)
treeb7396555ae74660be2232a9236a2e8e7f45950c1 /gcc
parent64bfac414632be741d0e760d2eacfddb0f72a775 (diff)
downloadgcc-c240868146f0421a88ea96f9fdbe42e0327805be.zip
gcc-c240868146f0421a88ea96f9fdbe42e0327805be.tar.gz
gcc-c240868146f0421a88ea96f9fdbe42e0327805be.tar.bz2
re PR fortran/35932 (ICE: CHAR with array arg and also a KIND arg)
2008-04-16 Paul Thomas <pault@gcc.gnu.org> PR fortran/35932 * trans-intrinsic.c (gfc_conv_intrinsic_char): Even though KIND is not used, the argument must be converted. 2008-04-16 Paul Thomas <pault@gcc.gnu.org> PR fortran/35932 * gfortran.dg/intrinsic_char_1.f90: New test. From-SVN: r134364
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-intrinsic.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/intrinsic_char_1.f9017
4 files changed, 36 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f7ed06b..3e4dfa2 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-16 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/35932
+ * trans-intrinsic.c (gfc_conv_intrinsic_char): Even though KIND
+ is not used, the argument must be converted.
+
2008-04-16 Jakub Jelinek <jakub@redhat.com>
PR target/35662
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 066b18e..e832b8a 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -1266,19 +1266,22 @@ gfc_conv_intrinsic_dprod (gfc_se * se, gfc_expr * expr)
static void
gfc_conv_intrinsic_char (gfc_se * se, gfc_expr * expr)
{
- tree arg;
+ tree arg[2];
tree var;
tree type;
+ unsigned int num_args;
- gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
+ /* We must allow for the KIND argument, even though.... */
+ num_args = gfc_intrinsic_argument_list_length (expr);
+ gfc_conv_intrinsic_function_args (se, expr, arg, num_args);
- /* We currently don't support character types != 1. */
+ /* .... we currently don't support character types != 1. */
gcc_assert (expr->ts.kind == 1);
type = gfc_character1_type_node;
var = gfc_create_var (type, "char");
- arg = convert (type, arg);
- gfc_add_modify_expr (&se->pre, var, arg);
+ arg[0] = convert (type, arg[0]);
+ gfc_add_modify_expr (&se->pre, var, arg[0]);
se->expr = gfc_build_addr_expr (build_pointer_type (type), var);
se->string_length = integer_one_node;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6f60dc3..2c6e58b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-04-16 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/35932
+ * gfortran.dg/intrinsic_char_1.f90: New test.
+
2008-04-16 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR target/35944
diff --git a/gcc/testsuite/gfortran.dg/intrinsic_char_1.f90 b/gcc/testsuite/gfortran.dg/intrinsic_char_1.f90
new file mode 100644
index 0000000..845493c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/intrinsic_char_1.f90
@@ -0,0 +1,17 @@
+! { dg-do run }
+! Tests the fix for PR35932, in which the KIND argument of CHAR
+! was not converted and this screwed up the scalarizer.
+!
+! Contributed by Dick Hendrickson <dick.hendrickson@gmail.com>
+!
+program FA0005
+
+ CHARACTER(1) CDA1(10)
+ character(10) CDA10
+ INTEGER :: IDA(10) = [(i, i = 97,106)]
+
+ CDA1 = CHAR ( IDA, KIND("A" )) !failed
+ if (transfer (CDA1, CDA10) /= "abcdefghij") call abort ()
+ CDA1 = CHAR ( IDA ) !worked
+ if (transfer (CDA1, CDA10) /= "abcdefghij") call abort ()
+END