This is not my patch, but I'd like to ping it anyway as it also fixes PR66467 (you might want to add a testcase from this PR as well).
On Sun, Apr 26, 2015 at 02:11:14PM +0300, Mikhail Maltsev wrote: > The attached patch was bootstrapped and regtested on > x86_64-unknown-linux-gnu. > > -- > Regards, > Mikhail Maltsev > gcc/cp/ChangeLog: > > 2015-04-26 Mikhail Maltsev <malts...@gmail.com> > > * call.c (build_new_op_1): Check tf_warning flag in all cases > > gcc/testsuite/ChangeLog: > > 2015-04-26 Mikhail Maltsev <malts...@gmail.com> > > * g++.dg/diagnostic/inhibit-warn.C: New test. > > > diff --git a/gcc/cp/call.c b/gcc/cp/call.c > index 7bdf236..689d542 100644 > --- a/gcc/cp/call.c > +++ b/gcc/cp/call.c > @@ -5677,8 +5677,9 @@ build_new_op_1 (location_t loc, enum tree_code code, > int flags, tree arg1, > case TRUTH_ORIF_EXPR: > case TRUTH_AND_EXPR: > case TRUTH_OR_EXPR: > - warn_logical_operator (loc, code, boolean_type_node, > - code_orig_arg1, arg1, code_orig_arg2, arg2); > + if (complain & tf_warning) > + warn_logical_operator (loc, code, boolean_type_node, > + code_orig_arg1, arg1, code_orig_arg2, arg2); > /* Fall through. */ > case GT_EXPR: > case LT_EXPR: > @@ -5686,8 +5687,9 @@ build_new_op_1 (location_t loc, enum tree_code code, > int flags, tree arg1, > case LE_EXPR: > case EQ_EXPR: > case NE_EXPR: > - if ((code_orig_arg1 == BOOLEAN_TYPE) > - ^ (code_orig_arg2 == BOOLEAN_TYPE)) > + if ((complain & tf_warning) > + && ((code_orig_arg1 == BOOLEAN_TYPE) > + ^ (code_orig_arg2 == BOOLEAN_TYPE))) > maybe_warn_bool_compare (loc, code, arg1, arg2); > /* Fall through. */ > case PLUS_EXPR: > diff --git a/gcc/testsuite/g++.dg/diagnostic/inhibit-warn.C > b/gcc/testsuite/g++.dg/diagnostic/inhibit-warn.C > new file mode 100644 > index 0000000..5655eb4 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/diagnostic/inhibit-warn.C > @@ -0,0 +1,32 @@ > +// PR c++/65882 > +// { dg-do compile { target c++11 } } > +// { dg-options "-Wbool-compare" } > + > +// Check that we don't ICE because of reentering error reporting routines > while > +// evaluating template parameters > + > +template<typename> > +struct type_function { > + static constexpr bool value = false; > +}; > + > +template<bool> > +struct dependent_type { > + typedef int type; > +}; > + > +template<typename T> > +typename dependent_type<(5 > type_function<T>::value)>::type > +bar(); > + > +template<typename T> > +typename dependent_type<(5 > type_function<T>::value)>::type > +foo() > +{ > + return bar<int>(); > +} > + > +int main() > +{ > + foo<int>(); > +} Marek