[PATCH] D24372: [libcxx] Sprinkle constexpr over compressed_pair
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 15 14:46:36 PDT 2016
EricWF added a comment.
Thanks for working on this. That static initialization bug is ugly.
My only concern with this patch is that adding `constexpr` to unconstrained constructors is going to result compile errors caused by Clang's eager instantiation.
Also, unlike @mclow.lists, I think we should make `std::forward` and `std::move` constexpr in C++11 as an extension. libstdc++ does it so it should be safe. I'm working on a patch that adds this extension now.
More comments to come shortly.
================
Comment at: include/memory:2056
@@ -2055,1 +2055,3 @@
+// Private copy of forward, for use only in this file, which is constexpr even
+// in C++11
----------------
I would put this right next to `std::forward`.
================
Comment at: include/memory:2531
@@ -2491,3 +2530,3 @@
- _LIBCPP_INLINE_VISIBILITY
+ _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
__compressed_pair& operator=(__compressed_pair&& __p)
----------------
The body of this function is only constexpr in C++14 because it contains two statements.
`return base::operator=(static_cast<__compressed_pair&&>(__p)), *this` is a constant expression in C++11 though.
================
Comment at: include/memory:2546
@@ -2507,2 +2545,3 @@
+ _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
__compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args,
tuple<_Args2...> __second_args)
----------------
This isn't a constant expression until C++14, since both `tuple` and `move` are only constexpr in C++14.
(Although I guess two default constructed tuple's would be constexpr in C++11).
================
Comment at: test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/constinit.pass.cpp:1
@@ +1,2 @@
+//===----------------------------------------------------------------------===//
+//
----------------
This test should live under `test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor` since `unique.ptr.runtime` is for unique_ptr's of arrays (e.g. `unique_ptr<T[]>`). Adding a separate version of this test for unique_ptr<T[]> would also be appreciated.
================
Comment at: test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/constinit.pass.cpp:20
@@ +19,3 @@
+extern std::unique_ptr<int> a;
+extern std::unique_ptr<int> b;
+void *tramplea = std::memset(&a, 0xab, sizeof(a));
----------------
Could this add a test case for a unique_ptr with a non-empty deleter? That will test an entirely different specialization of `__compressed_pair`.
Repository:
rL LLVM
https://reviews.llvm.org/D24372
More information about the cfe-commits
mailing list