public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@redhat.com>
To: Jonathan Wakely <jwakely@redhat.com>
Cc: Marek Polacek <polacek@redhat.com>,
	GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] c++: ICE with __has_unique_object_representations [PR115476]
Date: Tue, 25 Jun 2024 11:17:31 -0400	[thread overview]
Message-ID: <300bec1d-9b80-4605-adfa-1e3e59d217a8@redhat.com> (raw)
In-Reply-To: <CACb0b4mBj2-iWcaWQ+0deGkW1YBbJaFjNYZ5sC-+a-GQ+YHeng@mail.gmail.com>

On 6/25/24 07:15, Jonathan Wakely wrote:
> On Tue, 25 Jun 2024 at 03:12, Jason Merrill <jason@redhat.com> wrote:
>>
>> On 6/18/24 10:31, Marek Polacek wrote:
>>> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/14/13?
>>
>> Makes sense to me, though probably the [meta.unary.prop] table should be
>> adjusted in the same way.  Jonathan, what do you think?
> 
> Just to make sure I understand correctly, the suggestion is to change
> the precondition for the trait to something like:
> 
> "remove_all_extents_t<T> shall be a complete type or cv void."
> 
> i.e. if T is incomplete then T[] cannot be used with the trait, right?

Yes.

Jason

>>
>>> -- >8 --
>>> 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.
>>> ---
>>>    gcc/cp/semantics.cc                              |  2 +-
>>>    .../cpp1z/has-unique-obj-representations4.C      | 16 ++++++++++++++++
>>>    2 files changed, 17 insertions(+), 1 deletion(-)
>>>    create mode 100644 gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C
>>>
>>> diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
>>> index 08f5f245e7d..42251b6764b 100644
>>> --- a/gcc/cp/semantics.cc
>>> +++ b/gcc/cp/semantics.cc
>>> @@ -12966,7 +12966,6 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2)
>>>        case CPTK_HAS_NOTHROW_COPY:
>>>        case CPTK_HAS_TRIVIAL_COPY:
>>>        case CPTK_HAS_TRIVIAL_DESTRUCTOR:
>>> -    case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
>>>          if (!check_trait_type (type1))
>>>        return error_mark_node;
>>>          break;
>>> @@ -12976,6 +12975,7 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2)
>>>        case CPTK_IS_STD_LAYOUT:
>>>        case CPTK_IS_TRIVIAL:
>>>        case CPTK_IS_TRIVIALLY_COPYABLE:
>>> +    case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
>>>          if (!check_trait_type (type1, /* kind = */ 2))
>>>        return error_mark_node;
>>>          break;
>>> diff --git a/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C b/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C
>>> new file mode 100644
>>> index 00000000000..d6949dc7005
>>> --- /dev/null
>>> +++ b/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C
>>> @@ -0,0 +1,16 @@
>>> +// PR c++/115476
>>> +// { dg-do compile { target c++11 } }
>>> +
>>> +struct X;
>>> +static_assert(__has_unique_object_representations(X), "");     // { dg-error "invalid use of incomplete type" }
>>> +static_assert(__has_unique_object_representations(X[]), "");  // { dg-error "invalid use of incomplete type" }
>>> +static_assert(__has_unique_object_representations(X[1]), "");  // { dg-error "invalid use of incomplete type" }
>>> +static_assert(__has_unique_object_representations(X[][1]), "");  // { dg-error "invalid use of incomplete type" }
>>> +
>>> +struct X {
>>> +  int x;
>>> +};
>>> +static_assert(__has_unique_object_representations(X), "");
>>> +static_assert(__has_unique_object_representations(X[]), "");
>>> +static_assert(__has_unique_object_representations(X[1]), "");
>>> +static_assert(__has_unique_object_representations(X[][1]), "");
>>>
>>> base-commit: 7f9be55a4630134a237219af9cc8143e02080380
>>
> 


  reply	other threads:[~2024-06-25 15:17 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-18 14:31 Marek Polacek
2024-06-25  2:12 ` Jason Merrill
2024-06-25 11:15   ` Jonathan Wakely
2024-06-25 15:17     ` Jason Merrill [this message]
2024-06-25 17:22       ` Jonathan Wakely
2024-06-25 19:07         ` Marek Polacek
2024-06-25 21:23           ` Jason Merrill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=300bec1d-9b80-4605-adfa-1e3e59d217a8@redhat.com \
    --to=jason@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jwakely@redhat.com \
    --cc=polacek@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).