2016-02-17 Jason Merrill <jason@redhat.com>
+ PR c++/65985
+ * constexpr.c (build_constexpr_constructor_member_initializers):
+ Handle an additional STATEMENT_LIST.
+
PR c++/68585
* constexpr.c (cxx_eval_bare_aggregate): Fix 'changed' detection.
{
vec<constructor_elt, va_gc> *vec = NULL;
bool ok = true;
- if (TREE_CODE (body) == MUST_NOT_THROW_EXPR
- || TREE_CODE (body) == EH_SPEC_BLOCK)
- body = TREE_OPERAND (body, 0);
- if (TREE_CODE (body) == STATEMENT_LIST)
- {
- for (tree_stmt_iterator i = tsi_start (body);
- !tsi_end_p (i); tsi_next (&i))
- {
- body = tsi_stmt (i);
- if (TREE_CODE (body) == BIND_EXPR)
- break;
- }
+ while (true)
+ switch (TREE_CODE (body))
+ {
+ case MUST_NOT_THROW_EXPR:
+ case EH_SPEC_BLOCK:
+ body = TREE_OPERAND (body, 0);
+ break;
+
+ case STATEMENT_LIST:
+ for (tree_stmt_iterator i = tsi_start (body);
+ !tsi_end_p (i); tsi_next (&i))
+ {
+ body = tsi_stmt (i);
+ if (TREE_CODE (body) == BIND_EXPR)
+ break;
+ }
+ break;
+
+ case BIND_EXPR:
+ body = BIND_EXPR_BODY (body);
+ goto found;
+
+ default:
+ gcc_unreachable ();
}
- if (TREE_CODE (body) == BIND_EXPR)
- body = BIND_EXPR_BODY (body);
+ found:
if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
{
body = TREE_OPERAND (body, 0);
--- /dev/null
+// PR c++/65985
+// { dg-do compile { target c++14 } }
+
+#include <cassert>
+
+class Angle
+{
+ int degrees = 0;
+
+ constexpr auto invariant() const noexcept
+ {
+ return 0 <= degrees && degrees < 360;
+ }
+
+public:
+ explicit constexpr Angle(int n) noexcept
+ : degrees{n % 360}
+ {
+ assert(invariant());
+ }
+
+ /* implicit */ constexpr operator auto() const noexcept
+ {
+ return degrees;
+ }
+};
+
+int main()
+{
+ static_assert(Angle{360} == 0, "");
+}