]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR fortran/82841 (Segfault in gfc_simplify_transfer)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 10 Jan 2018 18:44:12 +0000 (18:44 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 10 Jan 2018 18:44:12 +0000 (18:44 +0000)
2018-01-10  Steven G. Kargl  <kargl@kgcc.gnu.org>

Backport r254555 from trunk
PR Fortran/82841
* gfortran.dg/transfer_simplify_11.f90: New test.

2018-01-10  Steven G. Kargl  <kargl@kgcc.gnu.org>

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

From-SVN: r256444

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

index 11095e9f17d2950b68e972e88de5db4a52e3101e..3d7454b7b57ce05e8a01a195b864e6e862310b05 100644 (file)
@@ -1,3 +1,10 @@
+2018-01-10  Steven G. Kargl  <kargl@kgcc.gnu.org>
+
+       Backport r254555 from trunk
+       PR Fortran/82841
+       * simplify.c(gfc_simplify_transfer): Do not dereference a NULL pointer.
+       Unwrap a short line.
+
 2018-01-04  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR Fortran/83679
index c9a6dd55b463054ac2559e7ee5b6ecf14fa95514..75fedc0f5988edef4db21249f63b8525197b3e02 100644 (file)
@@ -6361,8 +6361,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.  */
@@ -6370,7 +6369,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 650741746ebdcbb647d548b9d4e832e29cf14ac8..e4f50caf4a93869af5966c7cd884c93b7a094ccb 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-10  Steven G. Kargl  <kargl@kgcc.gnu.org>
+
+       Backport r254555 from trunk
+       PR Fortran/82841
+       * gfortran.dg/transfer_simplify_11.f90: New test.
+
 2018-01-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        Backport from mainline
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