summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libcxx/include/functional33
-rw-r--r--libcxx/src/bind.cpp21
-rw-r--r--libcxx/test/std/utilities/function.objects/bind/func.bind/func.bind.place/placeholders.pass.cpp28
-rw-r--r--libcxx/www/cxx1z_status.html2
4 files changed, 63 insertions, 21 deletions
diff --git a/libcxx/include/functional b/libcxx/include/functional
index 9e4d5db4162..a13772f31ae 100644
--- a/libcxx/include/functional
+++ b/libcxx/include/functional
@@ -1980,16 +1980,29 @@ namespace placeholders
template <int _Np> struct __ph {};
-_LIBCPP_FUNC_VIS extern __ph<1> _1;
-_LIBCPP_FUNC_VIS extern __ph<2> _2;
-_LIBCPP_FUNC_VIS extern __ph<3> _3;
-_LIBCPP_FUNC_VIS extern __ph<4> _4;
-_LIBCPP_FUNC_VIS extern __ph<5> _5;
-_LIBCPP_FUNC_VIS extern __ph<6> _6;
-_LIBCPP_FUNC_VIS extern __ph<7> _7;
-_LIBCPP_FUNC_VIS extern __ph<8> _8;
-_LIBCPP_FUNC_VIS extern __ph<9> _9;
-_LIBCPP_FUNC_VIS extern __ph<10> _10;
+#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_BIND)
+_LIBCPP_FUNC_VIS extern const __ph<1> _1;
+_LIBCPP_FUNC_VIS extern const __ph<2> _2;
+_LIBCPP_FUNC_VIS extern const __ph<3> _3;
+_LIBCPP_FUNC_VIS extern const __ph<4> _4;
+_LIBCPP_FUNC_VIS extern const __ph<5> _5;
+_LIBCPP_FUNC_VIS extern const __ph<6> _6;
+_LIBCPP_FUNC_VIS extern const __ph<7> _7;
+_LIBCPP_FUNC_VIS extern const __ph<8> _8;
+_LIBCPP_FUNC_VIS extern const __ph<9> _9;
+_LIBCPP_FUNC_VIS extern const __ph<10> _10;
+#else
+constexpr __ph<1> _1{};
+constexpr __ph<2> _2{};
+constexpr __ph<3> _3{};
+constexpr __ph<4> _4{};
+constexpr __ph<5> _5{};
+constexpr __ph<6> _6{};
+constexpr __ph<7> _7{};
+constexpr __ph<8> _8{};
+constexpr __ph<9> _9{};
+constexpr __ph<10> _10{};
+#endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_BIND)
} // placeholders
diff --git a/libcxx/src/bind.cpp b/libcxx/src/bind.cpp
index cab0b7c03a9..b318fc16979 100644
--- a/libcxx/src/bind.cpp
+++ b/libcxx/src/bind.cpp
@@ -7,6 +7,7 @@
//
//===----------------------------------------------------------------------===//
+#define _LIBCPP_BUILDING_BIND
#include "functional"
_LIBCPP_BEGIN_NAMESPACE_STD
@@ -14,16 +15,16 @@ _LIBCPP_BEGIN_NAMESPACE_STD
namespace placeholders
{
-__ph<1> _1;
-__ph<2> _2;
-__ph<3> _3;
-__ph<4> _4;
-__ph<5> _5;
-__ph<6> _6;
-__ph<7> _7;
-__ph<8> _8;
-__ph<9> _9;
-__ph<10> _10;
+const __ph<1> _1{};
+const __ph<2> _2{};
+const __ph<3> _3{};
+const __ph<4> _4{};
+const __ph<5> _5{};
+const __ph<6> _6{};
+const __ph<7> _7{};
+const __ph<8> _8{};
+const __ph<9> _9{};
+const __ph<10> _10{};
} // placeholders
diff --git a/libcxx/test/std/utilities/function.objects/bind/func.bind/func.bind.place/placeholders.pass.cpp b/libcxx/test/std/utilities/function.objects/bind/func.bind/func.bind.place/placeholders.pass.cpp
index 246186040c5..68986ac1aeb 100644
--- a/libcxx/test/std/utilities/function.objects/bind/func.bind/func.bind.place/placeholders.pass.cpp
+++ b/libcxx/test/std/utilities/function.objects/bind/func.bind/func.bind.place/placeholders.pass.cpp
@@ -10,10 +10,14 @@
// <functional>
// placeholders
+// The placeholders are constexpr in C++17 and beyond.
+// libc++ provides constexpr placeholders in C++11 and beyond.
#include <functional>
#include <type_traits>
+#include "test_macros.h"
+
template <class T>
void
test(const T& t)
@@ -28,6 +32,30 @@ test(const T& t)
static_assert(std::is_nothrow_move_constructible<T>::value, "");
}
+#if TEST_STD_VER >= 11
+constexpr decltype(std::placeholders::_1) default1{};
+constexpr decltype(std::placeholders::_2) default2{};
+constexpr decltype(std::placeholders::_3) default3{};
+constexpr decltype(std::placeholders::_4) default4{};
+constexpr decltype(std::placeholders::_5) default5{};
+constexpr decltype(std::placeholders::_6) default6{};
+constexpr decltype(std::placeholders::_7) default7{};
+constexpr decltype(std::placeholders::_8) default8{};
+constexpr decltype(std::placeholders::_9) default9{};
+constexpr decltype(std::placeholders::_10) default10{};
+
+constexpr decltype(std::placeholders::_1) cp1 = std::placeholders::_1;
+constexpr decltype(std::placeholders::_2) cp2 = std::placeholders::_2;
+constexpr decltype(std::placeholders::_3) cp3 = std::placeholders::_3;
+constexpr decltype(std::placeholders::_4) cp4 = std::placeholders::_4;
+constexpr decltype(std::placeholders::_5) cp5 = std::placeholders::_5;
+constexpr decltype(std::placeholders::_6) cp6 = std::placeholders::_6;
+constexpr decltype(std::placeholders::_7) cp7 = std::placeholders::_7;
+constexpr decltype(std::placeholders::_8) cp8 = std::placeholders::_8;
+constexpr decltype(std::placeholders::_9) cp9 = std::placeholders::_9;
+constexpr decltype(std::placeholders::_10) cp10 = std::placeholders::_10;
+#endif // TEST_STD_VER >= 11
+
int main()
{
test(std::placeholders::_1);
diff --git a/libcxx/www/cxx1z_status.html b/libcxx/www/cxx1z_status.html
index fb25cf35f6b..e11b7426512 100644
--- a/libcxx/www/cxx1z_status.html
+++ b/libcxx/www/cxx1z_status.html
@@ -161,7 +161,7 @@
<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2467">2467</td><td>is_always_equal has slightly inconsistent default</td><td>Lenexa</td><td>Complete</td></tr>
<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2470">2470</td><td>Allocator's destroy function should be allowed to fail to instantiate</td><td>Lenexa</td><td>Complete</td></tr>
<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2482">2482</td><td>[c.strings] Table 73 mentions nonexistent functions</td><td>Lenexa</td><td>Complete</td></tr>
- <tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2488">2488</td><td>Placeholders should be allowed and encouraged to be constexpr</td><td>Lenexa</td><td></td></tr>
+ <tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2488">2488</td><td>Placeholders should be allowed and encouraged to be constexpr</td><td>Lenexa</td><td>Complete</td></tr>
<tr><td></td><td></td><td></td><td></td></tr>
<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#1169">1169</a></td><td><tt>num_get</tt> not fully compatible with <tt>strto*</tt></td><td>Kona</td><td>Complete</td></tr>
<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2072">2072</a></td><td>Unclear wording about capacity of temporary buffers</td><td>Kona</td><td>Complete</td></tr>
OpenPOWER on IntegriCloud