On 05/13/2013 03:36 PM, Jakub Jelinek wrote:
What about the 4 other maybe_constant_value on fold_non_dependent_expr_sfinae (something, tf_none) calls in typeck.c (two for -Wdiv-by-zero and two for shift diagnostics)?
You're right, that was a poor approach to fixing the bug. This one properly fixes potential_constant_expression to recognize that the expression can't be constant, so it never gets to value_dependent_expression.
commit 24c19b3d38977fafbf870ef2ea45d05f37feb36a Author: Jason Merrill <ja...@redhat.com> Date: Mon May 13 17:09:36 2013 -0400 PR c++/56998 * semantics.c (potential_constant_expression_1): Make sure the called function is potentially constant. * call.c (null_ptr_cst_p): Revert earlier change. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 9f3a50d..bd8f531 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -554,7 +554,7 @@ null_ptr_cst_p (tree t) if (CP_INTEGRAL_TYPE_P (TREE_TYPE (t))) { /* Core issue 903 says only literal 0 is a null pointer constant. */ - if (cxx_dialect < cxx0x && !TREE_SIDE_EFFECTS (t)) + if (cxx_dialect < cxx0x) t = maybe_constant_value (fold_non_dependent_expr_sfinae (t, tf_none)); STRIP_NOPS (t); if (integer_zerop (t) && !TREE_OVERFLOW (t)) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 3e78887..92a4917 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -8476,7 +8476,11 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) } } else - fun = get_first_fn (fun); + { + if (!potential_constant_expression_1 (fun, true, flags)) + return false; + fun = get_first_fn (fun); + } /* Skip initial arguments to base constructors. */ if (DECL_BASE_CONSTRUCTOR_P (fun)) i = num_artificial_parms_for (fun);