c++: ICE with VEC_INIT_EXPR and defarg [PR106925]
Since r12-8066, in cxx_eval_vec_init we perform expand_vec_init_expr while processing the default argument in this test. At this point start_preparsed_function hasn't yet set current_function_decl. expand_vec_init_expr then leads to maybe_splice_retval_cleanup which checks DECL_CONSTRUCTOR_P (current_function_decl) without checking that c_f_d is non-null first. It seems correct that c_f_d is null here, so it seems to me that maybe_splice_retval_cleanup should check c_f_d as in the following patch. PR c++/106925 gcc/cp/ChangeLog: * except.cc (maybe_splice_retval_cleanup): Check current_function_decl. Make the bool const. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/initlist-defarg3.C: New test.
This commit is contained in:
parent
e5139d18df
commit
3130e70dab
2 changed files with 18 additions and 2 deletions
|
@ -1307,9 +1307,12 @@ maybe_splice_retval_cleanup (tree compound_stmt)
|
|||
{
|
||||
/* If we need a cleanup for the return value, add it in at the same level as
|
||||
pushdecl_outermost_localscope. And also in try blocks. */
|
||||
bool function_body
|
||||
const bool function_body
|
||||
= (current_binding_level->level_chain
|
||||
&& current_binding_level->level_chain->kind == sk_function_parms);
|
||||
&& current_binding_level->level_chain->kind == sk_function_parms
|
||||
/* When we're processing a default argument, c_f_d may not have been
|
||||
set. */
|
||||
&& current_function_decl);
|
||||
|
||||
if ((function_body || current_binding_level->kind == sk_try)
|
||||
&& !DECL_CONSTRUCTOR_P (current_function_decl)
|
||||
|
|
13
gcc/testsuite/g++.dg/cpp0x/initlist-defarg3.C
Normal file
13
gcc/testsuite/g++.dg/cpp0x/initlist-defarg3.C
Normal file
|
@ -0,0 +1,13 @@
|
|||
// PR c++/106925
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
struct Foo;
|
||||
template <int _Nm> struct __array_traits { typedef Foo _Type[_Nm]; };
|
||||
template <int _Nm> struct array {
|
||||
typename __array_traits<_Nm>::_Type _M_elems;
|
||||
};
|
||||
template <int size> struct MyVector { array<size> data{}; };
|
||||
struct Foo {
|
||||
float a{0};
|
||||
};
|
||||
void foo(MyVector<1> = MyVector<1>());
|
Loading…
Add table
Reference in a new issue