On 19.06.2015 19:35, Jason Merrill wrote: > OK, thanks. > > Sorry this took so long to review; please feel free to ping me every week. > > Jason
I added the testcase from PR66467, bootstrapped and regtested on x86_64-linux. The final variant is attached. I applied it to trunk. I see that version 5.2 is set as target milestone for this bug. Should I backport the patch? -- Regards, Mikhail Maltsev
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index eb5e4c5..6656441 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2015-06-20 Mikhail Maltsev <malts...@gmail.com> + + PR c++/65882 + * call.c (build_new_op_1): Check tf_warning flag in all cases. + 2015-06-19 Jason Merrill <ja...@redhat.com> PR c++/66585 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5d1891d..ba5da4c 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5640,8 +5640,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: @@ -5649,8 +5650,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/ChangeLog b/gcc/testsuite/ChangeLog index 42a0ee9d..89b859f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-06-20 Mikhail Maltsev <malts...@gmail.com> + + PR c++/65882 + * g++.dg/diagnostic/inhibit-warn-1.C: New test. + * g++.dg/diagnostic/inhibit-warn-2.C: New test. + 2015-06-19 Eric Botcazou <ebotca...@adacore.com> * gnat.dg/specs/debug1.ads: Adjust. diff --git a/gcc/testsuite/g++.dg/diagnostic/inhibit-warn-1.C b/gcc/testsuite/g++.dg/diagnostic/inhibit-warn-1.C new file mode 100644 index 0000000..5655eb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/inhibit-warn-1.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>(); +} diff --git a/gcc/testsuite/g++.dg/diagnostic/inhibit-warn-2.C b/gcc/testsuite/g++.dg/diagnostic/inhibit-warn-2.C new file mode 100644 index 0000000..cb16b4c --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/inhibit-warn-2.C @@ -0,0 +1,36 @@ +// PR c++/65882 +// PR c++/66467 +// { dg-do compile } + +template <bool> +struct A +{ + typedef int type; +}; + +struct B +{ + static const int value = 0; +}; + +template <class> +struct C +{ + typedef int type; +}; + +template <class> +struct F : B {}; + +class D +{ + template <class Expr> + typename A<F<typename C<Expr>::type>::value || B::value>::type + operator=(Expr); // { dg-message "declared" } +}; + +void fn1() +{ + D opt; + opt = 0; // { dg-error "private" } +}