Commit 67f0527a by Steven G. Kargl

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
parent 230b4ede
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> 2015-11-13 Steven G. Kargl <kargl@gccc.gnu.org>
PR fortran/68319 PR fortran/68319
......
...@@ -1162,6 +1162,35 @@ done: ...@@ -1162,6 +1162,35 @@ done:
{ {
expr = gfc_get_array_expr (ts.type, ts.kind, &where); expr = gfc_get_array_expr (ts.type, ts.kind, &where);
expr->ts = ts; 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 else
expr = gfc_get_array_expr (BT_UNKNOWN, 0, &where); expr = gfc_get_array_expr (BT_UNKNOWN, 0, &where);
...@@ -1171,6 +1200,7 @@ done: ...@@ -1171,6 +1200,7 @@ done:
expr->ts.u.cl->length_from_typespec = seen_ts; expr->ts.u.cl->length_from_typespec = seen_ts;
*result = expr; *result = expr;
return MATCH_YES; return MATCH_YES;
syntax: syntax:
......
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> 2015-11-14 David Edelsohn <dje.gcc@gmail.com>
* g++.dg/cpp/ucn-1.C: Fix typo. * g++.dg/cpp/ucn-1.C: Fix typo.
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment