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:
Marek Polacek 2022-10-11 14:16:54 -04:00
parent e5139d18df
commit 3130e70dab
2 changed files with 18 additions and 2 deletions

View file

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

View 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>());