+2015-06-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/66001
+ * constexpr.c (cxx_eval_constant_expression): Handle TRY_BLOCK and
+ TRY_FINALLY_EXPR.
+ (potential_constant_expression_1): Likewise.
+
2015-06-17 Jason Merrill <jason@redhat.com>
PR c++/66515
case NON_LVALUE_EXPR:
case TRY_CATCH_EXPR:
+ case TRY_BLOCK:
case CLEANUP_POINT_EXPR:
case MUST_NOT_THROW_EXPR:
case EXPR_STMT:
jump_target);
break;
+ case TRY_FINALLY_EXPR:
+ r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
+ non_constant_p, overflow_p,
+ jump_target);
+ if (!*non_constant_p)
+ /* Also evaluate the cleanup. */
+ cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1), true,
+ non_constant_p, overflow_p,
+ jump_target);
+ break;
+
/* These differ from cxx_eval_unary_expression in that this doesn't
check for a constant operand or result; an address can be
constant without its operand being, and vice versa. */
case CLEANUP_POINT_EXPR:
case MUST_NOT_THROW_EXPR:
case TRY_CATCH_EXPR:
+ case TRY_BLOCK:
case EH_SPEC_BLOCK:
case EXPR_STMT:
case PAREN_EXPR:
case RETURN_EXPR:
return RECUR (TREE_OPERAND (t, 0), want_rval);
+ case TRY_FINALLY_EXPR:
+ return (RECUR (TREE_OPERAND (t, 0), want_rval)
+ && RECUR (TREE_OPERAND (t, 1), any));
+
case SCOPE_REF:
return RECUR (TREE_OPERAND (t, 1), want_rval);
--- /dev/null
+// PR c++/66001
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+struct dt
+ { dt() {} ~ dt() {} };
+
+struct x {
+ std::initializer_list< dt > f = { {} };
+} cx;
+
+struct x2 {
+ struct dt { ~ dt() {} }
+ const & m = {};
+} cx2;