PR c++/51633 - ICEs with constexpr constructor

gcc/cp/

	PR c++/51633
	* semantics.c (cp_parser_ctor_initializer_opt_and_function_body):
	Set the pointer to the last block of the constructor to the
	current statement.
	(build_constexpr_constructor_member_initializers): Get
	build_data_member_initialization a chance to deal with more
	statements before we choke.

gcc/testsuite/

	PR c++/51633
	* g++.dg/cpp0x/constexpr-diag4.C: New test.

From-SVN: r183144
This commit is contained in:
Dodji Seketeli 2012-01-12 23:28:46 +00:00 committed by Dodji Seketeli
parent 639d4bb87c
commit 1cef710256
6 changed files with 92 additions and 5 deletions

View File

@ -1,3 +1,13 @@
2012-01-13 Dodji Seketeli <dodji@redhat.com>
PR c++/51633
* semantics.c (cp_parser_ctor_initializer_opt_and_function_body):
Set the pointer to the last block of the constructor to the
current statement.
(build_constexpr_constructor_member_initializers): Get
build_data_member_initialization a chance to deal with more
statements before we choke.
2012-01-12 Jason Merrill <jason@redhat.com>
PR c++/48051

View File

@ -17424,11 +17424,8 @@ cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser)
cp_parser_function_body changed its state. */
if (check_body_p)
{
list = body;
if (TREE_CODE (list) == BIND_EXPR)
list = BIND_EXPR_BODY (list);
if (TREE_CODE (list) == STATEMENT_LIST
&& STATEMENT_LIST_TAIL (list) != NULL)
list = cur_stmt_list;
if (STATEMENT_LIST_TAIL (list))
last = STATEMENT_LIST_TAIL (list)->stmt;
}
/* Parse the function-body. */

View File

@ -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)

View File

@ -1,3 +1,8 @@
2012-01-13 Dodji Seketeli <dodji@redhat.com>
PR c++/51633
* g++.dg/cpp0x/constexpr-diag4.C: New test.
2012-01-12 Jason Merrill <jason@redhat.com>
PR c++/48051

View File

@ -0,0 +1,25 @@
// 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" }
};

View File

@ -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" }
};