[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