c++: Layout decls with newly-complete type.
authorJason Merrill <jason@redhat.com>
Fri, 4 Sep 2020 16:14:19 +0000 (12:14 -0400)
committerJason Merrill <jason@redhat.com>
Fri, 18 Sep 2020 03:19:59 +0000 (23:19 -0400)
Martin's -Wplacement-new patch ran into a problem with DECL_SIZE not being
set on an extern variable for which the type was not complete until after
its declaration.  complete_vars was deliberately not calling layout_decl for
some reason, instead leaving that for expand_expr_real_1 much later in the
compilation.  But if we layout decls at declaration time, I don't see any
reason we shouldn't lay them out here, when their type is newly complete.

gcc/cp/ChangeLog:

* decl.c (complete_vars): Call layout_var_decl.

gcc/cp/decl.c

index ad2a30fcf71867bf2347b6fda2773211d6ec7e1a..746ed101fef9d241b77a42d9d6255546ec2376ee 100644 (file)
@@ -17460,10 +17460,10 @@ complete_vars (tree type)
              && (TYPE_MAIN_VARIANT (strip_array_types (type))
                  == iv->incomplete_type))
            {
-             /* Complete the type of the variable.  The VAR_DECL itself
-                will be laid out in expand_expr.  */
+             /* Complete the type of the variable.  */
              complete_type (type);
              cp_apply_type_quals_to_decl (cp_type_quals (type), var);
+             layout_var_decl (var);
            }
 
          /* Remove this entry from the list.  */