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

--- Comment #8 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:8156cfaa4c45f1249bbdda29d04b4fef84b7eafe

commit r11-5180-g8156cfaa4c45f1249bbdda29d04b4fef84b7eafe
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Nov 19 20:02:41 2020 +0100

    c, tree: Fix ICE from get_parm_array_spec [PR97860]

    The C and C++ FEs handle zero sized arrays differently, C uses
    NULL TYPE_MAX_VALUE on non-NULL TYPE_DOMAIN on complete ARRAY_TYPEs
    with bitsize_zero_node TYPE_SIZE, while C++ FE likes to set
    TYPE_MAX_VALUE to the largest value (and min to the lowest).

    Martin has used array_type_nelts in get_parm_array_spec where the
    function on the C form of [0] arrays returns error_mark_node and the code
    crashes soon afterwards.  The following patch teaches array_type_nelts
about
    this (e.g. dwarf2out already handles that as [0]).  While it will change
    what is_empty_type returns for certain types (e.g. struct S { int a[0];
};),
    as those types occupy zero bits in C, it should make an ABI difference.

    So, the tree.c change makes the c-decl.c code handle the [0] arrays
    like any other constant extents, and the c-decl.c change just makes sure
    that if we'd run into error_mark_node e.g. from the VLA expressions, we
    don't crash on those.

    2020-11-19  Jakub Jelinek  <ja...@redhat.com>

            PR c/97860
            * tree.c (array_type_nelts): For complete arrays with zero min
            and NULL max and zero size return -1.

            * c-decl.c (get_parm_array_spec): Bail out of nelts is
            error_operand_p.

            * gcc.dg/pr97860.c: New test.

Reply via email to