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'.

Reply via email to