[Patch, C++, PR65882] Check tf_warning flag in build_new_op_1
Marek Polacek
polacek@redhat.com
Tue Jun 9 07:53:00 GMT 2015
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 <maltsevm@gmail.com>
>
> * call.c (build_new_op_1): Check tf_warning flag in all cases
>
> gcc/testsuite/ChangeLog:
>
> 2015-04-26 Mikhail Maltsev <maltsevm@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
More information about the Gcc-patches
mailing list