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

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |marxin at gcc dot gnu.org

--- Comment #5 from Martin Liška <marxin at gcc dot gnu.org> ---
commit r10-7125-ge835226bab5b3575c8a55c048dcfed3d4cde5e0e
Author: Eric Botcazou <ebotca...@gcc.gnu.org>
Date:   Wed Mar 11 11:29:39 2020 +0100

    Fix GIMPLE verification failure in LTO mode on Ada code

    The issue is that tree_is_indexable doesn't return the same result for
    a FIELD_DECL with QUAL_UNION_TYPE and the QUAL_UNION_TYPE, resulting
    in two instances of the QUAL_UNION_TYPE in the bytecode.  The result
    for the type is the correct one (false, since it is variably modified)
    while the result for the field is falsely true because:

      else if (TREE_CODE (t) == FIELD_DECL
               && lto_variably_modified_type_p (DECL_CONTEXT (t)))
        return false;

    is not satisfied.  The reason for this is that the DECL_QUALIFIER of
    fields of a QUAL_UNION_TYPE depends on a discriminant in Ada, which
    means that the size of the type does too (CONTAINS_PLACEHOLDER_P),
    which in turn means that it is reset to a mere PLACEHOLDER_EXPR by
    free_lang_data, which finally means that the size of DECL_CONTEXT is
    too, so RETURN_TRUE_IF_VAR is false.

    In other words, the CONTAINS_PLACEHOLDER_P property of the DECL_QUALIFIER
    of fields of a QUAL_UNION_TYPE hides the variably_modified_type_p property
    of  these fields, if you look from the outside.

            PR middle-end/93961
            * tree.c (variably_modified_type_p) <RECORD_TYPE>: Recurse into
            fields whose type is a qualified union.

Reply via email to