[PATCH v2] c++: Prevent warnings for value-dependent exprs [PR96742]

Marek Polacek polacek@redhat.com
Wed Oct 28 21:29:47 GMT 2020


On Wed, Oct 28, 2020 at 02:46:36PM -0400, Jason Merrill wrote:
> On 10/28/20 2:00 PM, Marek Polacek wrote:
> > On Tue, Oct 27, 2020 at 01:36:30PM -0400, Jason Merrill wrote:
> > > On 10/24/20 6:52 PM, Marek Polacek wrote:
> > > > Here, in r11-155, I changed the call to uses_template_parms to
> > > > type_dependent_expression_p_push to avoid a crash in C++98 in
> > > > value_dependent_expression_p on a non-constant expression.  But that
> > > > prompted a host of complaints that we now warn for value-dependent
> > > > expressions in templates.  Those warnings are technically valid, but
> > > > people still don't want them because they're awkward to avoid.  So let's
> > > > partially revert my earlier fix and make sure that we don't ICE in
> > > > value_dependent_expression_p by checking potential_constant_expression
> > > > first.
> > > > 
> > > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/10?
> > > > 
> > > > gcc/cp/ChangeLog:
> > > > 
> > > > 	PR c++/96675
> > > > 	PR c++/96742
> > > > 	* pt.c (tsubst_copy_and_build): Call uses_template_parms instead of
> > > > 	type_dependent_expression_p_push.  Only call uses_template_parms
> > > > 	for expressions that are potential_constant_expression.
> > > > 
> > > > gcc/testsuite/ChangeLog:
> > > > 
> > > > 	PR c++/96675
> > > > 	PR c++/96742
> > > > 	* g++.dg/warn/Wdiv-by-zero-3.C: Turn dg-warning into dg-bogus.
> > > > 	* g++.dg/warn/Wtautological-compare3.C: New test.
> > > > 	* g++.dg/warn/Wtype-limits5.C: New test.
> > > > 	* g++.old-deja/g++.pt/crash10.C: Remove dg-warning.
> > > > ---
> > > >    gcc/cp/pt.c                                        |  6 ++++--
> > > >    gcc/testsuite/g++.dg/warn/Wdiv-by-zero-3.C         |  6 ++++--
> > > >    gcc/testsuite/g++.dg/warn/Wtautological-compare3.C | 11 +++++++++++
> > > >    gcc/testsuite/g++.dg/warn/Wtype-limits5.C          | 11 +++++++++++
> > > >    gcc/testsuite/g++.old-deja/g++.pt/crash10.C        |  1 -
> > > >    5 files changed, 30 insertions(+), 5 deletions(-)
> > > >    create mode 100644 gcc/testsuite/g++.dg/warn/Wtautological-compare3.C
> > > >    create mode 100644 gcc/testsuite/g++.dg/warn/Wtype-limits5.C
> > > > 
> > > > diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
> > > > index dc664ec3798..8aa0bc2c0d8 100644
> > > > --- a/gcc/cp/pt.c
> > > > +++ b/gcc/cp/pt.c
> > > > @@ -19618,8 +19618,10 @@ tsubst_copy_and_build (tree t,
> > > >          {
> > > >    	/* If T was type-dependent, suppress warnings that depend on the range
> > > >    	   of the types involved.  */
> > > > -	bool was_dep = type_dependent_expression_p_push (t);
> > > > -
> > > > +	++processing_template_decl;
> > > > +	const bool was_dep = (!potential_constant_expression (t)
> > > > +			      || uses_template_parms (t));
> > > 
> > > We don't want to suppress warnings for a non-constant expression that uses
> > > no template parms.  So maybe
> > 
> > Fair enough.
> > 
> > > potential_c_e ? value_d : type_d
> > 
> > That works for all the cases I have.
> > 
> > > ?  Or perhaps instantiation_dependent_expression_p.
> > 
> > i_d_e_p would still crash in C++98 :(.
> 
> Perhaps we should protect the value_d call in i_d_e_p with potential_c_e?

Yeah, probably.  But then we should also guard the call to value_d in
uses_template_parms.  I can apply such a patch if it tests fine, if you
want.

> > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/10?
> 
> OK.

Thanks,

Marek



More information about the Gcc-patches mailing list