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:
parent
639d4bb87c
commit
1cef710256
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
25
gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C
Normal file
25
gcc/testsuite/g++.dg/cpp0x/constexpr-diag4.C
Normal 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" }
|
||||
};
|
48
gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C
Normal file
48
gcc/testsuite/g++.dg/cpp0x/constexpr-diag5.C
Normal 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" }
|
||||
};
|
Loading…
Reference in New Issue
Block a user