[Bug c++/86763] [7/8/9 Regression] Wrong code comparing member of copy of a 237 byte object with nontrivial default constructor on x86-64 arch

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Aug 2 08:20:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86763

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |NEW
                 CC|                            |jason at gcc dot gnu.org,
                   |                            |nathan at gcc dot gnu.org,
                   |                            |rguenth at gcc dot gnu.org
          Component|middle-end                  |c++

--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> ---
So the question is why T doesn't get TYPE_TYPELESS_STORAGE set even though
we propagate that flag from children upwards in place_field.  That's what
is missing here and why things go wrong.

Ah, so we go

build_base_field (rli=0x2ea1780, binfo=0x7ffff6a2f120, offsets=0x2ea2280, 
    next_field=0x7ffff6a285c8)
    at /space/rguenther/src/svn/gcc-8-branch/gcc/cp/class.c:4244
4244      tree t = rli->t;
(gdb) p basetype->type_common.typeless_storage 
$30 = 1

OK

4262          decl = build_base_field_1 (t, basetype, next_field);
(gdb) p decl->typed.type->type_common.typeless_storage 
$31 = 0

looks like the as-base type doesn't inherit this flag.  If I fix that up here
where it matters rather than tracking down the gazillion places the C++ FE
seems to set CLASSTYPE_AS_BASE and where I'm unsure at that time layout
is finished the bug is fixed:

Index: gcc/cp/class.c
===================================================================
--- gcc/cp/class.c      (revision 263209)
+++ gcc/cp/class.c      (working copy)
@@ -4202,6 +4202,8 @@ build_base_field_1 (tree t, tree basetyp
 {
   /* Create the FIELD_DECL.  */
   gcc_assert (CLASSTYPE_AS_BASE (basetype));
+  TYPE_TYPELESS_STORAGE (CLASSTYPE_AS_BASE (basetype))
+    = TYPE_TYPELESS_STORAGE (basetype);
   tree decl = build_decl (input_location,
                          FIELD_DECL, NULL_TREE, CLASSTYPE_AS_BASE (basetype));
   DECL_ARTIFICIAL (decl) = 1;


C++ folks?


More information about the Gcc-bugs mailing list