re PR fortran/67803 (ICE on concatenating wrong character array constructor)

2015-11-14  Steven G. Kargl  <kargl@gcc.gnu.org>

    PR fortran/67803
    * array.c (gfc_match_array_constructor): If array constructor included
    a CHARACTER typespec, check array elements for compatible type.

2015-11-14  Steven G. Kargl  <kargl@gcc.gnu.org>

    PR fortran/67803
    * gfortran.dg/pr67803.f90: New test.

From-SVN: r230379
This commit is contained in:
Steven G. Kargl 2015-11-14 17:31:16 +00:00
parent 230b4edeee
commit 67f0527a22
4 changed files with 55 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2015-11-14 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/67803
* array.c (gfc_match_array_constructor): If array constructor included
a CHARACTER typespec, check array elements for compatible type.
2015-11-13 Steven G. Kargl <kargl@gccc.gnu.org>
PR fortran/68319

View File

@ -1162,6 +1162,35 @@ done:
{
expr = gfc_get_array_expr (ts.type, ts.kind, &where);
expr->ts = ts;
/* If the typespec is CHARACTER, check that array elements can
be converted. See PR fortran/67803. */
if (ts.type == BT_CHARACTER)
{
gfc_constructor *c;
c = gfc_constructor_first (head);
for (; c; c = gfc_constructor_next (c))
{
if (gfc_numeric_ts (&c->expr->ts)
|| c->expr->ts.type == BT_LOGICAL)
{
gfc_error ("Incompatible typespec for array element at %L",
&c->expr->where);
return MATCH_ERROR;
}
/* Special case null(). */
if (c->expr->expr_type == EXPR_FUNCTION
&& c->expr->ts.type == BT_UNKNOWN
&& strcmp (c->expr->symtree->name, "null") == 0)
{
gfc_error ("Incompatible typespec for array element at %L",
&c->expr->where);
return MATCH_ERROR;
}
}
}
}
else
expr = gfc_get_array_expr (BT_UNKNOWN, 0, &where);
@ -1171,6 +1200,7 @@ done:
expr->ts.u.cl->length_from_typespec = seen_ts;
*result = expr;
return MATCH_YES;
syntax:

View File

@ -1,3 +1,8 @@
2015-11-14 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/67803
* gfortran.dg/pr67803.f90: New test.
2015-11-14 David Edelsohn <dje.gcc@gmail.com>
* g++.dg/cpp/ucn-1.C: Fix typo.

View File

@ -0,0 +1,14 @@
! { dg-do compile }
! PR fortran/67803
! Original code submitted by Gerhard Steinmetz
! <gerhard dot steinmetz dot fortran at t-online dot de >
!
program p
character(2) :: x(1)
x = '0' // [character :: 1] ! { dg-error "Incompatible typespec for" }
x = '0' // [character :: 1.] ! { dg-error "Incompatible typespec for" }
x = '0' // [character :: 1d1] ! { dg-error "Incompatible typespec for" }
x = '0' // [character :: (0.,1.)] ! { dg-error "Incompatible typespec for" }
x = '0' // [character :: .true.] ! { dg-error "Incompatible typespec for" }
x = '0' // [character :: null()] ! { dg-error "Incompatible typespec for" }
end