https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107000
--- Comment #6 from Steve Kargl <sgk at troutmask dot apl.washington.edu> --- On Mon, Sep 26, 2022 at 08:38:56PM +0000, anlauf at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107000 > > --- Comment #5 from anlauf at gcc dot gnu.org --- > (In reply to kargl from comment #4) > > I think we need to expand the checking in array.cc > > > > /* Convert components of an array constructor to the type in ts. */ > > > > static match > > walk_array_constructor (gfc_typespec *ts, gfc_constructor_base head) > > > > I haven't had time to look deeper, but this function should be comparing > > the typespecs of REAL and -'1' or +'1'. That should fail. I suspect that > > the EXPR_OP of type_expr is allowing the array constructor walk to succeed. > > You mean sth. like: > > diff --git a/gcc/fortran/array.cc b/gcc/fortran/array.cc > index bbdb5b392fc..78a15917cec 100644 > --- a/gcc/fortran/array.cc > +++ b/gcc/fortran/array.cc > @@ -1213,7 +1213,7 @@ walk_array_constructor (gfc_typespec *ts, > gfc_constructor_base head) > return m; > } > else if (!gfc_convert_type_warn (e, ts, 1, 1, true) > - && e->ts.type != BT_UNKNOWN) > + && (e->ts.type != BT_UNKNOWN || e->expr_type == EXPR_OP)) > return MATCH_ERROR; > } > return MATCH_YES; > > in addition to the fix from comment#2? This works and regtests ok. > Yes, that would work! I was thinking of something more complex such as looking at the types of the operand(s), but simplification probably handles +1 and -1 correctly and punts on +'1' and -'1'.