c++: Improve init handling
authorJason Merrill <jason@redhat.com>
Tue, 24 Nov 2020 23:21:38 +0000 (18:21 -0500)
committerJason Merrill <jason@redhat.com>
Wed, 2 Dec 2020 21:14:21 +0000 (16:14 -0500)
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

index df76155..1e2bae4 100644 (file)
@@ -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