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

Reply via email to