re PR fortran/35932 (ICE: CHAR with array arg and also a KIND arg)
authorPaul Thomas <pault@gcc.gnu.org>
Wed, 16 Apr 2008 20:53:07 +0000 (20:53 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Wed, 16 Apr 2008 20:53:07 +0000 (20:53 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-intrinsic.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/intrinsic_char_1.f90 [new file with mode: 0644]

index f7ed06b370821f2970044c24c5775c6aa83583c4..3e4dfa2e0d902315f48b400551aff5555b432fde 100644 (file)
@@ -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
index 066b18ea8c2c0f390d6217f173e9ced9ef850915..e832b8a30e99c8a533876ecfee129a0f3f64aaba 100644 (file)
@@ -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;
 }
index 6f60dc33c7d5247b1384482abdd8885bb83ec0d9..2c6e58b396ca697fee98c9f397fc8b522d4e9534 100644 (file)
@@ -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 (file)
index 0000000..845493c
--- /dev/null
@@ -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