[libc++] Fix padding calculation for function reference types#142125
Merged
[libc++] Fix padding calculation for function reference types#142125
Conversation
Member
|
@llvm/pr-subscribers-libcxx Author: A. Jiang (frederick-vs-ja) Changes#109028 caused Fixes #142118. Full diff: https://github.com/llvm/llvm-project/pull/142125.diff 2 Files Affected:
diff --git a/libcxx/include/__memory/compressed_pair.h b/libcxx/include/__memory/compressed_pair.h
index 38798a21fa3c9..fb7b7b7afcc8c 100644
--- a/libcxx/include/__memory/compressed_pair.h
+++ b/libcxx/include/__memory/compressed_pair.h
@@ -15,7 +15,6 @@
#include <__type_traits/datasizeof.h>
#include <__type_traits/is_empty.h>
#include <__type_traits/is_final.h>
-#include <__type_traits/is_reference.h>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
@@ -63,9 +62,17 @@ inline const size_t __compressed_pair_alignment = _LIBCPP_ALIGNOF(_Tp);
template <class _Tp>
inline const size_t __compressed_pair_alignment<_Tp&> = _LIBCPP_ALIGNOF(void*);
-template <class _ToPad,
- bool _Empty = ((is_empty<_ToPad>::value && !__libcpp_is_final<_ToPad>::value) ||
- is_reference<_ToPad>::value || sizeof(_ToPad) == __datasizeof_v<_ToPad>)>
+template <class _ToPad>
+inline const bool __is_reference_or_unpadded_object =
+ (is_empty<_ToPad>::value && !__libcpp_is_final<_ToPad>::value) || sizeof(_ToPad) == __datasizeof_v<_ToPad>;
+
+template <class _Tp>
+inline const bool __is_reference_or_unpadded_object<_Tp&> = true;
+
+template <class _Tp>
+inline const bool __is_reference_or_unpadded_object<_Tp&&> = true;
+
+template <class _ToPad, bool _Empty = __is_reference_or_unpadded_object<_ToPad> >
class __compressed_pair_padding {
char __padding_[sizeof(_ToPad) - __datasizeof_v<_ToPad>] = {};
};
diff --git a/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.ctor/pointer_deleter.pass.cpp b/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.ctor/pointer_deleter.pass.cpp
index a91abc856fb19..a438bfb58ce44 100644
--- a/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.ctor/pointer_deleter.pass.cpp
+++ b/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.ctor/pointer_deleter.pass.cpp
@@ -32,6 +32,8 @@ bool my_free_called = false;
void my_free(void*) { my_free_called = true; }
+TEST_CONSTEXPR_CXX23 void deleter_function(A*) {}
+
#if TEST_STD_VER >= 11
struct DeleterBase {
TEST_CONSTEXPR_CXX23 void operator()(void*) const {}
@@ -325,6 +327,21 @@ TEST_CONSTEXPR_CXX23 void test_nullptr() {
#endif
}
+template <bool IsArray>
+TEST_CONSTEXPR_CXX23 void test_function_reference() {
+ typedef typename std::conditional<!IsArray, A, A[]>::type VT;
+ {
+ std::unique_ptr<VT, void (&)(A*)> u(nullptr, deleter_function);
+ assert(u.get() == nullptr);
+ assert(u.get_deleter() == deleter_function);
+ }
+ {
+ std::unique_ptr<VT, void (&)(A*)> u(nullptr, deleter_function);
+ assert(u.get() == nullptr);
+ assert(u.get_deleter() == deleter_function);
+ }
+}
+
TEST_CONSTEXPR_CXX23 bool test() {
{
test_basic</*IsArray*/ false>();
@@ -332,6 +349,7 @@ TEST_CONSTEXPR_CXX23 bool test() {
test_basic_single();
test_sfinae<false>();
test_noexcept<false>();
+ test_function_reference<false>();
}
{
test_basic</*IsArray*/ true>();
@@ -339,6 +357,7 @@ TEST_CONSTEXPR_CXX23 bool test() {
test_sfinae<true>();
test_sfinae_runtime();
test_noexcept<true>();
+ test_function_reference<true>();
}
return true;
|
shafik
reviewed
Jun 2, 2025
| template <class _ToPad, | ||
| bool _Empty = ((is_empty<_ToPad>::value && !__libcpp_is_final<_ToPad>::value) || | ||
| is_reference<_ToPad>::value || sizeof(_ToPad) == __datasizeof_v<_ToPad>)> | ||
| template <class _ToPad> |
Collaborator
There was a problem hiding this comment.
Do this have to be updated as well?
Contributor
Author
There was a problem hiding this comment.
Looks like that changes in lldbsuite should belong to another PR. I've opened #142516.
ldionne
approved these changes
Jun 3, 2025
1 task
Michael137
pushed a commit
to swiftlang/llvm-project
that referenced
this pull request
Aug 26, 2025
…m#142516) This PR mirrors changes of `__compressed_pair_padding` in libc++ into lldb test suite. Related PR for libc++: - llvm#108956 - llvm#109028 - llvm#142125 (cherry picked from commit 119705e)
Michael137
pushed a commit
to swiftlang/llvm-project
that referenced
this pull request
Aug 26, 2025
…m#142516) This PR mirrors changes of `__compressed_pair_padding` in libc++ into lldb test suite. Related PR for libc++: - llvm#108956 - llvm#109028 - llvm#142125 (cherry picked from commit 119705e) (cherry picked from commit 205591b)
Michael137
pushed a commit
to swiftlang/llvm-project
that referenced
this pull request
Aug 26, 2025
…m#142516) This PR mirrors changes of `__compressed_pair_padding` in libc++ into lldb test suite. Related PR for libc++: - llvm#108956 - llvm#109028 - llvm#142125 (cherry picked from commit 119705e) (cherry picked from commit 205591b)
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
#109028 caused
sizeofto be sometimes applied to function reference types, which makes a program ill-formed. This PR handles reference types by specializations to prevent such bogussizeofexpression to be instantiated.Fixes #142118.