re PR fortran/78278 (ICE in gfc_wide_memset, at fortran/scanner.c:153)

2018-06-09  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/78278
	* data.c (gfc_assign_data_value): Re-arrange code to allow for
	an error for double initialization of CHARACTER entities.

2018-06-09  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/78278
	* gfortran.dg/data_bounds_1.f90: Add -std=gnu option.
	* gfortran.dg/data_char_1.f90: Ditto.
	* gfortran.dg/pr78571.f90: Ditto.
	* gfortran.dg/pr78278.f90: New test.

From-SVN: r261361
This commit is contained in:
Steven G. Kargl 2018-06-09 15:39:29 +00:00
parent 598dc594fa
commit 4ea0af1da0
7 changed files with 46 additions and 16 deletions

View File

@ -1,3 +1,9 @@
2018-06-09 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/78278
* data.c (gfc_assign_data_value): Re-arrange code to allow for
an error for double initialization of CHARACTER entities.
2018-06-09 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/63514

View File

@ -483,6 +483,21 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index,
mpz_clear (offset);
gcc_assert (repeat == NULL);
/* Overwriting an existing initializer is non-standard but usually only
provokes a warning from other compilers. */
if (init != NULL && init->where.lb && rvalue->where.lb)
{
/* Order in which the expressions arrive here depends on whether
they are from data statements or F95 style declarations.
Therefore, check which is the most recent. */
expr = (LOCATION_LINE (init->where.lb->location)
> LOCATION_LINE (rvalue->where.lb->location))
? init : rvalue;
if (gfc_notify_std (GFC_STD_GNU, "re-initialization of %qs at %L",
symbol->name, &expr->where) == false)
return false;
}
if (ref || last_ts->type == BT_CHARACTER)
{
/* An initializer has to be constant. */
@ -503,22 +518,6 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index,
return false;
}
/* Overwriting an existing initializer is non-standard but usually only
provokes a warning from other compilers. */
if (init != NULL)
{
/* Order in which the expressions arrive here depends on whether
they are from data statements or F95 style declarations.
Therefore, check which is the most recent. */
expr = (LOCATION_LINE (init->where.lb->location)
> LOCATION_LINE (rvalue->where.lb->location))
? init : rvalue;
if (gfc_notify_std (GFC_STD_GNU,
"re-initialization of %qs at %L",
symbol->name, &expr->where) == false)
return false;
}
expr = gfc_copy_expr (rvalue);
if (!gfc_compare_types (&lvalue->ts, &expr->ts))
gfc_convert_type (expr, &lvalue->ts, 0);

View File

@ -1,3 +1,11 @@
2018-06-09 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/78278
* gfortran.dg/data_bounds_1.f90: Add -std=gnu option.
* gfortran.dg/data_char_1.f90: Ditto.
* gfortran.dg/pr78571.f90: Ditto.
* gfortran.dg/pr78278.f90: New test.
2018-06-09 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/63514

View File

@ -1,4 +1,5 @@
! { dg-do compile }
! { dg-options "-std=gnu" }
! Checks the fix for PR32315, in which the bounds checks below were not being done.
!
! Contributed by Tobias Burnus <burnus@gcc.gnu.org>

View File

@ -1,4 +1,5 @@
! { dg-do run }
! { dg-options "-std=gnu" }
! Test character variables in data statements
! Also substrings of character variables.
! PR14976 PR16228

View File

@ -0,0 +1,14 @@
! { dg-do compile }
! { dg-options "-std=f95" }
! PR fortran/78278
program p
character, pointer :: x => null()
data x /null()/ ! { dg-error "GNU Extension: re-initialization" }
print *, associated(x)
end
subroutine foo
real :: x = 42
data x /0/ ! { dg-error "GNU Extension: re-initialization" }
print *, x
end subroutine foo

View File

@ -1,4 +1,5 @@
! { dg-do compile }
! { dg-options "-std=gnu" }
! PR fortran/78571
program p
type t