backport: re PR fortran/82841 (Segfault in gfc_simplify_transfer)

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: r256445
This commit is contained in:
Steven G. Kargl 2018-01-10 18:47:44 +00:00
parent df18d5afa6
commit ee30b822e5
4 changed files with 23 additions and 3 deletions

View 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

View File

@ -6577,8 +6577,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. */
@ -6586,7 +6585,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;

View 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 Richard Biener <rguenther@suse.de>
Backport from mainline

View File

@ -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