-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[Clang] __has_unique_object_representations should not accept Incomplete[] #138291
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…ete[] This implements [LWG4113](https://cplusplus.github.io/LWG/issue411) This is technically a breaking change, but it's a fix and I think anyone who relies on this to day is in a world of hurt. Fixes llvm#118350
@llvm/pr-subscribers-clang Author: cor3ntin (cor3ntin) ChangesThis implements LWG4113 This is technically a breaking change, but it's a fix, and I think anyone who relies on this today is in a world of hurt. Fixes #118350 Full diff: https://github.com/llvm/llvm-project/pull/138291.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 95e0574562a2d..5a9f5edfcf9ca 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -547,6 +547,9 @@ Bug Fixes to Compiler Builtins
``void(char *, char *)`` to ``void(void *, void *)`` to match GCC's signature
for the same builtin. (#GH47833)
+- ``__has_unique_object_representations(Incomplete[])`` is no longer accepted, per
+ `LWG4113 <https://cplusplus.github.io/LWG/issue4113>`_.
+
Bug Fixes to Attribute Support
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Fixed crash when a parameter to the ``clang::annotate`` attribute evaluates to ``void``. See #GH119125
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index ee45e196bdb5d..d1121a605dbbd 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -5418,6 +5418,15 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, TypeTrait UTT,
return !S.RequireCompleteType(
Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
+ // has_unique_object_representations<T>
+ // remove_all_extents_t<T> shall be a complete type or cv void (LWG4113).
+ case UTT_HasUniqueObjectRepresentations:
+ ArgTy = QualType(ArgTy->getBaseElementTypeUnsafe(), 0);
+ if (ArgTy->isVoidType())
+ return true;
+ return !S.RequireCompleteType(
+ Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
+
// C++1z [meta.unary.prop]:
// remove_all_extents_t<T> shall be a complete type or cv void.
case UTT_IsTrivial:
@@ -5445,13 +5454,8 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, TypeTrait UTT,
case UTT_HasTrivialCopy:
case UTT_HasTrivialDestructor:
case UTT_HasVirtualDestructor:
- // has_unique_object_representations<T> when T is an array is defined in terms
- // of has_unique_object_representations<remove_all_extents_t<T>>, so the base
- // type needs to be complete even if the type is an incomplete array type.
- case UTT_HasUniqueObjectRepresentations:
ArgTy = QualType(ArgTy->getBaseElementTypeUnsafe(), 0);
[[fallthrough]];
-
// C++1z [meta.unary.prop]:
// T shall be a complete type, cv void, or an array of unknown bound.
case UTT_IsDestructible:
diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp
index b130024503101..7768f61ac2d00 100644
--- a/clang/test/SemaCXX/type-traits.cpp
+++ b/clang/test/SemaCXX/type-traits.cpp
@@ -3383,6 +3383,16 @@ static_assert(!__has_unique_object_representations(float), "definitely not Float
static_assert(!__has_unique_object_representations(double), "definitely not Floating Point");
static_assert(!__has_unique_object_representations(long double), "definitely not Floating Point");
+
+static_assert(!__has_unique_object_representations(AnIncompleteType[]));
+//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}}
+static_assert(!__has_unique_object_representations(AnIncompleteType[][1]));
+//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}}
+static_assert(!__has_unique_object_representations(AnIncompleteType[1]));
+//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}}
+static_assert(!__has_unique_object_representations(AnIncompleteType));
+//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}}
+
struct NoPadding {
int a;
int b;
|
erichkeane
approved these changes
May 2, 2025
IanWood1
pushed a commit
to IanWood1/llvm-project
that referenced
this pull request
May 6, 2025
…ete[] (llvm#138291) This implements [LWG4113](https://cplusplus.github.io/LWG/issue411) This is technically a breaking change, but it's a fix, and I think anyone who relies on this today is in a world of hurt. Fixes llvm#118350
IanWood1
pushed a commit
to IanWood1/llvm-project
that referenced
this pull request
May 6, 2025
…ete[] (llvm#138291) This implements [LWG4113](https://cplusplus.github.io/LWG/issue411) This is technically a breaking change, but it's a fix, and I think anyone who relies on this today is in a world of hurt. Fixes llvm#118350
IanWood1
pushed a commit
to IanWood1/llvm-project
that referenced
this pull request
May 6, 2025
…ete[] (llvm#138291) This implements [LWG4113](https://cplusplus.github.io/LWG/issue411) This is technically a breaking change, but it's a fix, and I think anyone who relies on this today is in a world of hurt. Fixes llvm#118350
GeorgeARM
pushed a commit
to GeorgeARM/llvm-project
that referenced
this pull request
May 7, 2025
…ete[] (llvm#138291) This implements [LWG4113](https://cplusplus.github.io/LWG/issue411) This is technically a breaking change, but it's a fix, and I think anyone who relies on this today is in a world of hurt. Fixes llvm#118350
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
clang:frontend
Language frontend issues, e.g. anything involving "Sema"
clang
Clang issues not falling into any other category
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This implements LWG4113
This is technically a breaking change, but it's a fix, and I think anyone who relies on this today is in a world of hurt.
Fixes #118350