On Thu, Dec 06, 2012 at 09:07:43AM -0500, Jason Merrill wrote: > These are the only two possibilities for a boolean INTEGER_CST, so > let's assert that it's false if it isn't true. > > You can then leave the 'else' on the "if (expr == error_mark_node)". > > And here you don't need to check the value at all unless in an assert.
Ok, here is what I'm going to bootstrap/regtest then: 2012-12-06 Jakub Jelinek <ja...@redhat.com> PR c++/54207 * except.c (build_noexcept_spec): Avoid direct comparison with boolean_true_node or boolean_false_node, instead use operand_equal_p and/or INTEGER_CST check. * pt.c (tsubst_exception_specification): Likewise. * typeck2.c (merge_exception_specifiers): Likewise. * g++.dg/cpp0x/noexcept18.C: New test. --- gcc/cp/pt.c.jj 2012-12-04 14:17:26.829197995 +0100 +++ gcc/cp/pt.c 2012-12-06 15:26:07.574298792 +0100 @@ -10840,7 +10840,7 @@ tsubst_exception_specification (tree fnt { /* A noexcept-specifier. */ tree expr = TREE_PURPOSE (specs); - if (expr == boolean_true_node || expr == boolean_false_node) + if (TREE_CODE (expr) == INTEGER_CST) new_specs = expr; else if (defer_ok) { --- gcc/cp/typeck2.c.jj 2012-12-04 14:17:26.882197630 +0100 +++ gcc/cp/typeck2.c 2012-12-06 15:16:28.091620326 +0100 @@ -1871,7 +1871,7 @@ merge_exception_specifiers (tree list, t /* If ADD is a deferred noexcept, we must have been called from process_subob_fn. For implicitly declared functions, we build up a list of functions to consider at instantiation time. */ - if (noex == boolean_true_node) + if (operand_equal_p (noex, boolean_true_node, 0)) noex = NULL_TREE; gcc_assert (fn && (!noex || is_overloaded_fn (noex))); noex = build_overload (fn, noex); --- gcc/cp/except.c.jj 2012-12-04 14:17:26.916197394 +0100 +++ gcc/cp/except.c 2012-12-06 15:23:46.169113297 +0100 @@ -1316,15 +1316,21 @@ build_noexcept_spec (tree expr, int comp LOOKUP_NORMAL); expr = cxx_constant_value (expr); } - if (expr == boolean_true_node) - return noexcept_true_spec; - else if (expr == boolean_false_node) - return noexcept_false_spec; + if (TREE_CODE (expr) == INTEGER_CST) + { + if (operand_equal_p (expr, boolean_true_node, 0)) + return noexcept_true_spec; + else + { + gcc_checking_assert (operand_equal_p (expr, boolean_false_node, 0)); + return noexcept_false_spec; + } + } else if (expr == error_mark_node) return error_mark_node; else { - gcc_assert (processing_template_decl || expr == error_mark_node + gcc_assert (processing_template_decl || TREE_CODE (expr) == DEFERRED_NOEXCEPT); return build_tree_list (expr, NULL_TREE); } --- gcc/testsuite/g++.dg/cpp0x/noexcept18.C.jj 2012-12-06 15:16:28.125619775 +0100 +++ gcc/testsuite/g++.dg/cpp0x/noexcept18.C 2012-12-06 15:16:28.125619775 +0100 @@ -0,0 +1,11 @@ +// PR c++/54207 +// { dg-do compile } +// { dg-options "-std=c++11" } + +typedef bool B; +constexpr B foo () { return true; } + +void +bar () noexcept (foo ()) +{ +} Jakub