On Thu, Dec 05, 2024 at 01:15:49PM -0500, Jason Merrill wrote:
> On 12/4/24 12:27 PM, Marek Polacek wrote:
> > On Tue, Dec 03, 2024 at 04:27:22PM -0500, Jason Merrill wrote:
> > > On 12/3/24 2:46 PM, Marek Polacek wrote:
> > > > On Thu, Nov 28, 2024 at 12:04:56PM -0500, Jason Merrill wrote:
> > > > > On 11/27/24 9:06 PM, Marek Polacek wrote:
> > > > > > Not a bugfix, but this should only affect C++26.
> > > > > > 
> > > > > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
> > > > > > 
> > > > > > -- >8--
> > > > > > This patch implements P2865R5 by promoting the warning to error in 
> > > > > > C++26
> > > > > > only.  -Wno-array-compare shouldn't disable the error, so adjust 
> > > > > > the call
> > > > > > sites as well.
> > > > > 
> > > > > I think it's fine for -Wno-array-compare to suppress the error (and
> > > > > -Wno-error=array-compare to reduce it to a warning), so how about
> > > > > DK_PERMERROR rather than DK_ERROR?
> > > > 
> > > > Sounds good.
> > > > > We also need SFINAE for this when !tf_warning_or_error.
> > > > 
> > > > I've added Warray-compare-1.C, which has:
> > > > 
> > > >     template<int I>
> > > >     void f (int(*)[arr1 == arr2 ? I : I]);
> > > > 
> > > > but when we call cp_build_binary_op from the parser, complain is
> > > > tf_warning_or_error, so we warn (as does clang++).  I suspect
> > > > that goes against [temp.deduct.general]/8.
> > > 
> > > No, that's fine; in C++26 that template is IFNDR because no well-formed
> > > instantiation exists, it's OK for us to give a diagnostic and then 
> > > continue
> > > just like in a non-template.
> > 
> > Ah yes.
> > 
> > > I'm not sure there is a SFINAE situation where this would come up, but I'd
> > > still like to adjust this:
> > > 
> > > > @@ -6125,11 +6124,10 @@ cp_build_binary_op (const op_location_t 
> > > > &location,
> > > >                         "comparison with string literal results "
> > > >                         "in unspecified behavior");
> > > >         }
> > > > -      else if (warn_array_compare
> > > > -              && TREE_CODE (TREE_TYPE (orig_op0)) == ARRAY_TYPE
> > > > +      else if (TREE_CODE (TREE_TYPE (orig_op0)) == ARRAY_TYPE
> > > >                && TREE_CODE (TREE_TYPE (orig_op1)) == ARRAY_TYPE
> > > >                && code != SPACESHIP_EXPR
> > > > -              && (complain & tf_warning))
> > > > +              && (complain & tf_warning_or_error))
> > > >         do_warn_array_compare (location, code,
> > > >                                tree_strip_any_location_wrapper 
> > > > (orig_op0),
> > > >                                tree_strip_any_location_wrapper 
> > > > (orig_op1));
> > > 
> > > If we happen to get here when not complaining, we'll silently accept it.
> > > Either we should handle that case by returning error_mark_node in C++26 
> > > and
> > > above, or we should assert that it can't happen.
> > 
> > We actually can get there.  But returning error_mark_node in C++26
> > causes problems: we hit:
> > 
> >          /* If we ran into a problem, make sure we complained.  */
> >          gcc_assert (seen_error ());
> > 
> > because a permerror doesn't count as an error.  Either we'd have to go
> > back to DK_ERROR, or leave the patch as-is.
> 
> Hmm, I guess cp_seen_error should also consider werrorcount.

That still wouldn't work with -Wno-array-compare.  Nor would adding
permerrorcount.

I suppose I could still add permerrorcount and do permerrorcount++;,
and have cp_seen_error check permerrorcount.  Does that seem acceptable?

Marek

Reply via email to