diff mbox

[C++,PR65882] Check tf_warning flag in build_new_op_1

Message ID 553CC7D2.5050708@gmail.com
State New
Headers show

Commit Message

Mikhail Maltsev April 26, 2015, 11:11 a.m. UTC
The attached patch was bootstrapped and regtested on
x86_64-unknown-linux-gnu.

Comments

Marek Polacek June 9, 2015, 7:51 a.m. UTC | #1
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
Jason Merrill June 19, 2015, 4:35 p.m. UTC | #2
OK, thanks.

Sorry this took so long to review; please feel free to ping me every week.

Jason
diff mbox

Patch

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>();
+}