diff options
Diffstat (limited to 'cross/cross-gcc/pr65882.patch')
-rw-r--r-- | cross/cross-gcc/pr65882.patch | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/cross/cross-gcc/pr65882.patch b/cross/cross-gcc/pr65882.patch new file mode 100644 index 000000000..673712b2b --- /dev/null +++ b/cross/cross-gcc/pr65882.patch @@ -0,0 +1,66 @@ +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>(); ++} |