[libc++] Fix constant initialization of unique_ptr in C++17 and prior#108956
[libc++] Fix constant initialization of unique_ptr in C++17 and prior#108956philnik777 merged 1 commit intollvm:mainfrom
Conversation
|
@llvm/pr-subscribers-libcxx Author: Nikolas Klauser (philnik777) ChangesFull diff: https://github.com/llvm/llvm-project/pull/108956.diff 3 Files Affected:
diff --git a/libcxx/include/__memory/compressed_pair.h b/libcxx/include/__memory/compressed_pair.h
index 629e3ad8848ffa..afa78f99612693 100644
--- a/libcxx/include/__memory/compressed_pair.h
+++ b/libcxx/include/__memory/compressed_pair.h
@@ -56,7 +56,7 @@ template <class _ToPad>
class __compressed_pair_padding {
char __padding_[((is_empty<_ToPad>::value && !__libcpp_is_final<_ToPad>::value) || is_reference<_ToPad>::value)
? 0
- : sizeof(_ToPad) - __datasizeof_v<_ToPad>];
+ : sizeof(_ToPad) - __datasizeof_v<_ToPad>] = {};
};
# define _LIBCPP_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \
diff --git a/libcxx/test/std/utilities/smartptr/unique.ptr/constinit.compile.pass.cpp b/libcxx/test/std/utilities/smartptr/unique.ptr/constinit.compile.pass.cpp
new file mode 100644
index 00000000000000..a52089385211fb
--- /dev/null
+++ b/libcxx/test/std/utilities/smartptr/unique.ptr/constinit.compile.pass.cpp
@@ -0,0 +1,19 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03
+
+// <memory>
+
+// Check that uniuqe_ptr<T> is constant initialized
+
+#include <memory>
+
+#include "test_macros.h"
+
+TEST_CONSTINIT std::unique_ptr<int> ptr;
diff --git a/libcxx/test/support/test_macros.h b/libcxx/test/support/test_macros.h
index 3aa818af1d2695..ae171b3f223ab3 100644
--- a/libcxx/test/support/test_macros.h
+++ b/libcxx/test/support/test_macros.h
@@ -221,9 +221,11 @@
#endif
#if TEST_STD_VER > 17
-#define TEST_CONSTINIT constinit
+# define TEST_CONSTINIT constinit
+#elif __has_cpp_attribute(clang::require_constant_initialization)
+# define TEST_CONSTINIT [[clang::require_constant_initialization]]
#else
-#define TEST_CONSTINIT
+# define TEST_CONSTINIT
#endif
#if TEST_STD_VER < 11
|
1ce42ba to
f7885f0
Compare
mstorsjo
left a comment
There was a problem hiding this comment.
LGTM, thanks! This does indeed seem to fix my build issues.
f7885f0 to
21d887e
Compare
ldionne
left a comment
There was a problem hiding this comment.
Would these tests fail if we refactored to run them in a constexpr context, or is this required to use constinit? I'm worried that this is a roundabout way of testing this and that we could lose the coverage in the future via some refactoring.
It requires constant initialization, since |
21d887e to
5f59339
Compare
5f59339 to
5a5d2f4
Compare
…llvm#108956) This is already tested in `std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.ctor/default.pass.cpp` except that `TEST_CONSTINIT` doesn't do anything before C++20 without this patch.
…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)
…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)
…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 is already tested in
std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.ctor/default.pass.cppexcept thatTEST_CONSTINITdoesn't do anything before C++20 without this patch.