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

--- Comment #12 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by Marek Polacek
<mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:b0426fbc85333775ef97cc135e87dd6cae876af7

commit r13-9291-gb0426fbc85333775ef97cc135e87dd6cae876af7
Author: Marek Polacek <pola...@redhat.com>
Date:   Mon Jun 17 17:53:12 2024 -0400

    c++: ICE with __has_unique_object_representations [PR115476]

    Here we started to ICE with r13-25: in check_trait_type, for "X[]" we
    return true here:

      if (kind == 1 && TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type))
        return true; // Array of unknown bound. Don't care about completeness.

    and then end up crashing in record_has_unique_obj_representations:

    4836      if (cur != wi::to_offset (sz))

    because sz is null.

   
https://eel.is/c++draft/type.traits#tab:meta.unary.prop-row-47-column-3-sentence-1
    says that the preconditions for __has_unique_object_representations are:
    "T shall be a complete type, cv void, or an array of unknown bound" and
    that "For an array type T, the same result as
    has_unique_object_representations_v<remove_all_extents_t<T>>" so T[]
    should be treated as T.  So we should use kind==2 for the trait.

            PR c++/115476

    gcc/cp/ChangeLog:

            * semantics.cc (finish_trait_expr)
            <case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS>: Move below to call
            check_trait_type with kind==2.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp1z/has-unique-obj-representations4.C: New test.

    (cherry picked from commit c314867fc06d475e3c2ace32032e0d72e3915b55)
  • [Bug c++/115476] [13 Regression... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to