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

--- Comment #7 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:69165332a914f1167c3077fa1f57afc64fd8a667

commit r11-6271-g69165332a914f1167c3077fa1f57afc64fd8a667
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Sat Dec 19 22:24:10 2020 +0100

    expr: Fix up constant_byte_string bitfield handling [PR98366]

    constant_byte_string now uses a convert_to_bytes function, which doesn't
    handle bitfields at all (don't punt on them, just puts them into wrong bits
    or bytes).  Furthermore, I don't see a reason why that function should
exist
    at all, it duplicates native_encode_initializer functionality.
    Except that native_encode_initializer punted on flexible array members and
2
    tests in the testsuite relied on constant_byte_string handling those.
    So, this patch throws away convert_to_bytes, uses native_encode_initializer
    instead, but teaches it to handle flexible array members (only in the
    non-mask mode with off == -1 for now), furthermore, it adds various corner
    case checks that the old implementation was missing (like that STRING_CSTs
    use int as length and therefore we shouldn't try to build larger than that
    strings, or that native_encode*/native_interpret* APIs require sane
    host and target bytes (8-bit on both).

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

            PR middle-end/98366
            * fold-const.c (native_encode_initializer): Don't try to
            memset more than total_bytes with off == -1 even if len is large.
            Handle flexible array member initializers if off == -1 and mask is
            NULL.
            * expr.c (convert_to_bytes): Remove.
            (constant_byte_string): Use native_encode_initializer instead of
            convert_to_bytes.  Remove extraneous semicolon.  Punt on various
            corner-cases the APIs don't handle, like sizes > INT_MAX,
            BITS_PER_UNIT != 8, CHAR_BIT != 8.

            * gcc.c-torture/execute/pr98366.c: New test.

Reply via email to