Hello world, the attached patch fixes an ICE regression by issuing an error when a clever combination of array constructors ends up in gfc_arith_concat with mismatched types, before resultion has a chance to report the error.
Regression-tested. OK for trunk? Regards Thomas 2018-10-06 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/86111 * gfortran.h (enum arith): Add ARITH_WRONGCONCAT. * arith.h (gfc_arith_error): Issue error for ARITH_WRONGCONCAT. (gfc_arith_concat): If the types of op1 and op2 are not character of if their kinds do not match, issue ARITH_WRONGCONCAT. 2018-10-06 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/86111 * gfortran.dg/array_constructor_type_23.f90: New test.
Index: arith.c =================================================================== --- arith.c (Revision 264897) +++ arith.c (Arbeitskopie) @@ -113,6 +113,11 @@ gfc_arith_error (arith code) p = _("Integer outside symmetric range implied by Standard Fortran at %L"); break; + case ARITH_WRONGCONCAT: + p = + _("Illegal type in character concatenation at %L"); + break; + default: gfc_internal_error ("gfc_arith_error(): Bad error code"); } @@ -982,7 +987,12 @@ gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gf gfc_expr *result; size_t len; - gcc_assert (op1->ts.kind == op2->ts.kind); + /* By cleverly playing around with constructors, is is possible + to get mismaching types here. */ + if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER + || op1->ts.kind != op2->ts.kind) + return ARITH_WRONGCONCAT; + result = gfc_get_constant_expr (BT_CHARACTER, op1->ts.kind, &op1->where); Index: gfortran.h =================================================================== --- gfortran.h (Revision 264897) +++ gfortran.h (Arbeitskopie) @@ -191,7 +191,8 @@ enum gfc_intrinsic_op /* Arithmetic results. */ enum arith { ARITH_OK = 1, ARITH_OVERFLOW, ARITH_UNDERFLOW, ARITH_NAN, - ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT + ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT, + ARITH_WRONGCONCAT }; /* Statements. */
! { dg-do compile } ! PR 83999 - this used to ICE ! Origial test case by Gerhard Steinmetz program p character(2) :: c = 'a' // [character :: [1]] ! { dg-error "Illegal type in character concatenation" } end