Skip to content

Commit 3687d3c

Browse files
committed
Implement void_t from N3911. Add a private version for use in the library before C++1z. Update the 1z status page, marking a bunch of issues that don't require library changes as complete (2129, 2212, 2230, 2233, 2325, 2365, 2376)
llvm-svn: 222138
1 parent 5bef24d commit 3687d3c

File tree

3 files changed

+91
-11
lines changed

3 files changed

+91
-11
lines changed

libcxx/include/type_traits

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,9 @@ namespace std
197197
template <class F, class... ArgTypes>
198198
using result_of_t = typename result_of<F(ArgTypes...)>::type; // C++14
199199
200-
} // std
200+
template <class...>
201+
using void_t = void;
202+
} // C++17
201203
202204
*/
203205
#include <__config>
@@ -209,6 +211,11 @@ namespace std
209211

210212
_LIBCPP_BEGIN_NAMESPACE_STD
211213

214+
#ifndef _LIBCPP_HAS_NO_VARIADICS
215+
template <class...>
216+
struct __void_t { typedef void type; };
217+
#endif
218+
212219
template <bool _Bp, class _If, class _Then>
213220
struct _LIBCPP_TYPE_VIS_ONLY conditional {typedef _If type;};
214221
template <class _If, class _Then>
@@ -3673,6 +3680,10 @@ struct __has_operator_addressof
36733680

36743681
#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
36753682

3683+
#if _LIBCPP_STD_VER > 14
3684+
template <class...> using void_t = void;
3685+
#endif
3686+
36763687
_LIBCPP_END_NAMESPACE_STD
36773688

36783689
#endif // _LIBCPP_TYPE_TRAITS
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is dual licensed under the MIT and the University of Illinois Open
6+
// Source Licenses. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
// type_traits
11+
12+
// void_t
13+
14+
#include <type_traits>
15+
16+
#if _LIBCPP_STD_VER <= 14
17+
int main () {}
18+
#else
19+
20+
template <class T>
21+
void test1()
22+
{
23+
static_assert( std::is_same<void, std::void_t<T>>::value, "");
24+
static_assert( std::is_same<void, std::void_t<const T>>::value, "");
25+
static_assert( std::is_same<void, std::void_t<volatile T>>::value, "");
26+
static_assert( std::is_same<void, std::void_t<const volatile T>>::value, "");
27+
}
28+
29+
template <class T, class U>
30+
void test2()
31+
{
32+
static_assert( std::is_same<void, std::void_t<T, U>>::value, "");
33+
static_assert( std::is_same<void, std::void_t<const T, U>>::value, "");
34+
static_assert( std::is_same<void, std::void_t<volatile T, U>>::value, "");
35+
static_assert( std::is_same<void, std::void_t<const volatile T, U>>::value, "");
36+
37+
static_assert( std::is_same<void, std::void_t<T, const U>>::value, "");
38+
static_assert( std::is_same<void, std::void_t<const T, const U>>::value, "");
39+
static_assert( std::is_same<void, std::void_t<volatile T, const U>>::value, "");
40+
static_assert( std::is_same<void, std::void_t<const volatile T, const U>>::value, "");
41+
}
42+
43+
class Class
44+
{
45+
public:
46+
~Class();
47+
};
48+
49+
int main()
50+
{
51+
static_assert( std::is_same<void, std::void_t<>>::value, "");
52+
53+
test1<void>();
54+
test1<int>();
55+
test1<double>();
56+
test1<int&>();
57+
test1<Class>();
58+
test1<Class[]>();
59+
test1<Class[5]>();
60+
61+
test2<void, int>();
62+
test2<double, int>();
63+
test2<int&, int>();
64+
test2<Class&, bool>();
65+
test2<void *, int&>();
66+
67+
static_assert( std::is_same<void, std::void_t<int, double const &, Class, volatile int[], void>>::value, "");
68+
}
69+
#endif

libcxx/www/cxx1z_status.html

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ <h3>Paper Status</h3>
5555
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190">N4190</a></td></td><td>LWG</td><td>Removing auto_ptr, random_shuffle(), And Old <functional> Stuff.</td><td>Urbana</td><td></td><td></td></tr>
5656
<tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4284.html">N4284</a></td><td>LWG</td></td><td>Contiguous Iterators.</td><td>Urbana</td><td></td><td></td></tr>
5757
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4089">N4089</a></td><td>LWG</td></td><td>Safe conversions in <code>unique_ptr&lt;T[]&gt;</code>.</td><td>Urbana</td><td></td><td></td></tr>
58-
<tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/N4277.html">N4277</a></td><td>LWG</td></td><td>TriviallyCopyable <code>reference_wrapper</code>.</td><td>Urbana</td><td></td><td></td></tr>
58+
<tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/N4277.html">N4277</a></td><td>LWG</td></td><td>TriviallyCopyable <code>reference_wrapper</code>.</td><td>Urbana</td><td>Complete</td><td>3.2</td></tr>
5959
<tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4258.pdf">N4258</a></td><td>LWG</td></td><td>Cleaning-up noexcept in the Library.</td><td>Urbana</td><td></td><td></td></tr>
6060
<tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4279.html">N4279</a></td><td>LWG</td></td><td>Improved insertion interface for unique-key maps.</td><td>Urbana</td><td></td><td></td></tr>
61-
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3911">N3911</a></td><td>LWG</td></td><td>TransformationTrait Alias <code>void_t</code>.</td><td>Urbana</td><td></td><td></td></tr>
61+
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3911">N3911</a></td><td>LWG</td></td><td>TransformationTrait Alias <code>void_t</code>.</td><td>Urbana</td><td>Complete</td><td>3.6</td></tr>
6262
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4169">N4169</a></td><td>LWG</td></td><td>A proposal to add invoke function template</td><td>Urbana</td><td></td><td></td></tr>
6363
<tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4280.pdf">N4280</a></td><td>LWG</td></td><td>Non-member size() and more</td><td>Urbana</td><td></td><td></td></tr>
6464

@@ -83,24 +83,24 @@ <h3>Library Working group Issues Status</h3>
8383
<tr><td></td><td></td><td></td><td></td></tr>
8484

8585
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2106">2106</td><td><code>move_iterator</code> wrapping iterators returning prvalues</td><td>Urbana</td><td></td></tr>
86-
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2129">2129</td><td>User specializations of <code>std::initializer_list</code></td><td>Urbana</td><td></td></tr>
87-
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2212">2212</td><td><code>tuple_size</code> for <code>const pair</code> request <tuple> header</td><td>Urbana</td><td></td></tr>
86+
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2129">2129</td><td>User specializations of <code>std::initializer_list</code></td><td>Urbana</td><td>Complete</td></tr>
87+
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2212">2212</td><td><code>tuple_size</code> for <code>const pair</code> request <tuple> header</td><td>Urbana</td><td>Complete</td></tr>
8888
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2217">2217</td><td><code>operator==(sub_match, string)</code> slices on embedded '\0's</td><td>Urbana</td><td></td></tr>
89-
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2233">2233</td><td><code>bad_function_call::what()</code> unhelpful</td><td>Urbana</td><td></td></tr>
89+
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2230">2230</td><td>"see below" for <code>initializer_list</code> constructors of unordered containers</td><td>Urbana</td><td>Complete</td></tr>
90+
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2233">2233</td><td><code>bad_function_call::what()</code> unhelpful</td><td>Urbana</td><td>Complete</td></tr>
9091
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2266">2266</td><td><code>vector</code> and <code>deque</code> have incorrect insert requirements</td><td>Urbana</td><td></td></tr>
91-
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2325">2325</td><td><code>minmax_element()</code> 's behavior differing from <code>max_element()</code>'s should be noted</td><td>Urbana</td><td></td></tr>
92-
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2230">2230</td><td>"see below" for <code>initializer_list</code> constructors of unordered containers</td><td>Urbana</td><td></td></tr>
92+
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2325">2325</td><td><code>minmax_element()</code>'s behavior differing from <code>max_element()</code>'s should be noted</td><td>Urbana</td><td>Complete</td></tr>
9393
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2361">2361</td><td>Apply 2299 resolution throughout library</td><td>Urbana</td><td></td></tr>
94-
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2365">2365</td><td>Missing noexcept in <code>shared_ptr::shared_ptr(nullptr_t)</code></td><td>Urbana</td><td></td></tr>
95-
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2376">2376</td><td><code>bad_weak_ptr::what()</code> overspecified</td><td>Urbana</td><td></td></tr>
94+
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2365">2365</td><td>Missing noexcept in <code>shared_ptr::shared_ptr(nullptr_t)</code></td><td>Urbana</td><td>Complete</td></tr>
95+
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2376">2376</td><td><code>bad_weak_ptr::what()</code> overspecified</td><td>Urbana</td><td>Complete</td></tr>
9696
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2387">2387</td><td>More nested types that must be accessible and unambiguous</td><td>Urbana</td><td></td></tr>
9797
<!--
9898
<tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1214">1214</a></td><td>Insufficient/inconsistent key immutability requirements for associative containers</td><td>Urbana</td><td></td></tr>
9999
-->
100100
<!-- <tr><td></td><td></td><td></td><td></td></tr> -->
101101
</table>
102102

103-
<p>Last Updated: 10-Nov-2014</p>
103+
<p>Last Updated: 17-Nov-2014</p>
104104
</div>
105105
</body>
106106
</html>

0 commit comments

Comments
 (0)