@@ -17418,7 +17418,7 @@ cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser)
cp_parser_function_body changed its state. */
if (check_body_p)
{
- list = body;
+ list = cur_stmt_list;
if (TREE_CODE (list) == BIND_EXPR)
list = BIND_EXPR_BODY (list);
if (TREE_CODE (list) == STATEMENT_LIST
@@ -5930,6 +5930,8 @@ build_constexpr_constructor_member_initializers (tree type, tree body)
break;
}
}
+ else if (EXPR_P (body))
+ ok = build_data_member_initialization (body, &vec);
else
gcc_assert (errorcount > 0);
if (ok)
new file mode 100644
@@ -0,0 +1,28 @@
+// Origin: PR c++/51633
+// { dg-options "-std=c++11" }
+
+struct A
+{
+ ~A();
+};
+
+struct B
+{
+ A a;
+ constexpr B() {}
+};
+
+struct A1
+{
+ int a;
+ ~A1();
+};
+
+struct B1
+{
+ A1 a1;
+ constexpr B1() {} // { dg-error "uninitialized member" }
+};
+
+
+
new file mode 100644
@@ -0,0 +1,48 @@
+// Origin: PR c++/51633
+// { dg-options "-std=c++11" }
+
+struct A
+{
+ constexpr A() {}
+ ~A();
+};
+
+struct B
+{
+ A a;
+ A b;
+ A c;
+ constexpr B() {}
+};
+
+struct C
+{
+ A a;
+ constexpr C() {}
+};
+
+struct D
+{
+ constexpr D() { return;} // { dg-error "does not have empty body" }
+};
+
+struct D1
+{
+ A a;
+ constexpr D1() { return;} // { dg-error "does not have empty body" }
+};
+
+struct D2
+{
+ A a;
+ A b;
+ constexpr D2() { return;} // { dg-error "does not have empty body" }
+};
+
+struct D3
+{
+ A a;
+ A b;
+ A c;
+ constexpr D3() { return;} // { dg-error "does not have empty body" }
+};