While looking at another issue I noticed that in a template we were failing to find the INIT_EXPR we were looking for, and so ended up doing redundant processing. No testcase, as the redundant processing ended up getting the right result.
Tested x86_64-pc-linux-gnu, applying to trunk. gcc/cp/ChangeLog: * decl.c (check_initializer): Also look through STMT_EXPR and BIND_EXPR. --- gcc/cp/decl.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index df76155a243..1e2bae4afba 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6892,9 +6892,17 @@ check_initializer (tree decl, tree init, int flags, vec<tree, va_gc> **cleanups) have returned an INIT_EXPR rather than a CALL_EXPR. In that case, pull the initializer back out and pass it down into store_init_value. */ - while (TREE_CODE (init_code) == EXPR_STMT - || TREE_CODE (init_code) == CONVERT_EXPR) - init_code = TREE_OPERAND (init_code, 0); + while (true) + { + if (TREE_CODE (init_code) == EXPR_STMT + || TREE_CODE (init_code) == STMT_EXPR + || TREE_CODE (init_code) == CONVERT_EXPR) + init_code = TREE_OPERAND (init_code, 0); + else if (TREE_CODE (init_code) == BIND_EXPR) + init_code = BIND_EXPR_BODY (init_code); + else + break; + } if (TREE_CODE (init_code) == INIT_EXPR) { /* In C++20, the call to build_aggr_init could have created base-commit: 4ed34c60a818cc513239844f336fc781a8b47a24 -- 2.27.0