From d9288bd28e24c755a7216311ee5247e7c88270a6 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 24 Nov 2020 18:21:38 -0500 Subject: [PATCH] c++: Improve init handling 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. 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 **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 -- 2.30.2