-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[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
Conversation
…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;
|
…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
…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
…ing To Do A few LWG issues did require some testing changes and were not just non-normative wording changes in the spec, so those should be "Complete" instead of "Nothing to do". Also mark LWG3987 and LWG4113 as complete: - LWG3987 was done in llvm/llvm-project#137524 - LWG4113 was done in llvm/llvm-project#138291
|
I was a bit confused by this PR and #95432. The previous PR seemingly made the same prohibition (in a different way), so what was additionally fixed in this PR? The newly added test cases were already rejected in Clang 19. |
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