[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