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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
                 CC|                            |jason at gcc dot gnu.org

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
The reason we are warning is a C++ FE one - the C++ FE emits the warning during
the parsing of func() at which point it has not yet placed a field for 'Parent'
in Child.

But for some reason it _did_ lay out the type already (TYPE_SIZE is zero,
not NULL_TREE).

This also causes wrong-code since we set TYPE_ALIAS_SET too early and
fail to record all subsets.

OK, it doesn't call layout_type but

Old value = <tree 0x0>
New value = <integer_cst 0x2aaaac0a1f00>
finish_struct (t=<record_type 0x2aaaac2063f0 Child>, attributes=<tree 0x0>)
    at /space/rguenther/src/gcc/gcc/cp/class.c:7456
7456          TYPE_SIZE_UNIT (t) = size_zero_node;
(gdb) l
7451          DECL_ARTIFICIAL (ass_op) = true;
7452          DECL_CHAIN (ass_op) = TYPE_FIELDS (t);
7453          TYPE_FIELDS (t) = ass_op;
7454
7455          TYPE_SIZE (t) = bitsize_zero_node;
7456          TYPE_SIZE_UNIT (t) = size_zero_node;
7457          /* COMPLETE_TYPE_P is now true.  */

and that size is never changed.  Guess that's because it's a template.
Maybe we should fend off this diagnostic based on processing_template_decl?

We don't warn when it's not a template and the explicit instantiation
isn't necessary.  The function in question is static but 'Child'
in this context is dependent? (does it inherit the template param?  I guess
so?)

Anyhow, a fix could be put, for example, in C++ get_alias_set langhook
as well.  Not sure if we ever end up calling get_alias_set on a type
that isn't complete but was marked as such like

struct Foo {
   int i;
   void bar() { Foo *p; *p; }
   float j;
};

as said this can result in bougs alias-set subset representation.

C++ FE folks, please have a look.

Reply via email to