re PR fortran/82841 (Segfault in gfc_simplify_transfer)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 8 Nov 2017 22:56:58 +0000 (22:56 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 8 Nov 2017 22:56:58 +0000 (22:56 +0000)
2017-11-08  Steven G. Kargl  <kargl@kgcc.gnu.org>

PR Fortran/82841
* simplify.c(gfc_simplify_transfer): Do not dereference a NULL pointer.
Unwrap a short line.

2017-11-08  Steven G. Kargl  <kargl@kgcc.gnu.org>

PR Fortran/82841
* gfortran.dg/transfer_simplify_11.f90: new test.

From-SVN: r254555

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/transfer_simplify_11.f90 [new file with mode: 0644]

index b554f9f..6c9f246 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-08  Steven G. Kargl  <kargl@kgcc.gnu.org>
+
+       PR Fortran/82841
+       * simplify.c(gfc_simplify_transfer): Do not dereference a NULL pointer.
+       Unwrap a short line.
+
 2017-11-08  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/82884
index ba010a0..c7b7e1a 100644 (file)
@@ -6576,8 +6576,7 @@ gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
     return NULL;
 
   /* Calculate the size of the source.  */
-  if (source->expr_type == EXPR_ARRAY
-      && !gfc_array_size (source, &tmp))
+  if (source->expr_type == EXPR_ARRAY && !gfc_array_size (source, &tmp))
     gfc_internal_error ("Failure getting length of a constant array.");
 
   /* Create an empty new expression with the appropriate characteristics.  */
@@ -6585,7 +6584,7 @@ gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
                                  &source->where);
   result->ts = mold->ts;
 
-  mold_element = mold->expr_type == EXPR_ARRAY
+  mold_element = (mold->expr_type == EXPR_ARRAY && mold->value.constructor)
                 ? gfc_constructor_first (mold->value.constructor)->expr
                 : mold;
 
index 475cc27..75c8a0a 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-08  Steven G. Kargl  <kargl@kgcc.gnu.org>
+
+       PR Fortran/82841
+       * gfortran.dg/transfer_simplify_11.f90: New test.
+
 2017-11-08  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/82884
diff --git a/gcc/testsuite/gfortran.dg/transfer_simplify_11.f90 b/gcc/testsuite/gfortran.dg/transfer_simplify_11.f90
new file mode 100644 (file)
index 0000000..ce7a4ad
--- /dev/null
@@ -0,0 +1,8 @@
+! { dg-do run }
+! PR Fortran/82841
+!
+   integer, parameter :: N = 2
+   character(len=1) :: chr(N)
+   chr = transfer(repeat("x",ncopies=N),[character(len=1) ::], N)
+   if (chr(1) /= 'x' .and. chr(2) /= 'x') call abort
+end