Commit Graph

2793 Commits

Author SHA1 Message Date
Eric Fiselier e2fd8b8db9 Flatten tuple_constructible, tuple_convertible and tuple_assignable.
This patch is the last in a series that replaces recursive meta-programming
in std::tuple with non-recursive implementations.

Previously std::tuple could only be instantiated with 126 elements before
it blew the max template instantiation depth. Now the size of std::tuple is
essentially unbounded (I've tested with over 5000 elements).

One unfortunate side-effect of this change is that tuple_constructible
and similar no longer short circuit after the first failure. Instead they
evaluate the conditions for all elements. This could be potentially breaking.
I plan to look into this further.

llvm-svn: 274331
2016-07-01 04:07:39 +00:00
Eric Fiselier 10b9a1bb42 Flatten the tuple_element and __make_tuple_types implementations.
This patch attempts to improve the QoI of std::tuples tuple_element and
__make_tuple_types helpers. Previously they required O(N) instantiations,
one for every element in the tuple

The new implementations are O(1) after __tuple_indices<Id...> is created.

llvm-svn: 274330
2016-07-01 03:54:54 +00:00
Eric Fiselier 9743af6e31 Replace __make_tuple_indices implementation with superior implementation.
The previous __make_tuple_indices implementation caused O(N) instantiations
and was pretty inefficient. The C++14 __make_integer_sequence implementation
is much better, since it either uses a builtin to generate the sequence or
a very nice Log8(N) implementation provided by richard smith.

This patch moves the __make_integer_sequence implementation into __tuple
and uses it to implement __make_tuple_indices.

Since libc++ can't expose the name 'integer_sequence' in C++11 this patch
also introduces a dummy type '__integer_sequence' which is used when generating
the sequence. One the sequence is generated '__integer_sequence' can be
converted into the required type; either '__tuple_indices' or 'integer_sequence'.

llvm-svn: 274286
2016-06-30 22:34:43 +00:00
Marshall Clow 3b8669edbf Fix static assert problem on gcc; remove XFAILs that I put in in r274250
llvm-svn: 274285
2016-06-30 22:05:45 +00:00
Eric Fiselier 19cf6b6c93 Fix C++03 build.
llvm-svn: 274274
2016-06-30 20:46:58 +00:00
Marshall Clow f7aaf31c53 Mark issues 2550, 2551, 2555, 2685, 2698 as complete. These issues are wording clarifications; no code changes required.
llvm-svn: 274255
2016-06-30 18:05:19 +00:00
Marshall Clow 2f63da2887 Mark issues 2667, 2669, 2670, 2671, 2673 as complete. These issues are wording clarifications; no code changes required.
llvm-svn: 274253
2016-06-30 17:59:01 +00:00
Marshall Clow e46c0885ff Implement LWG#2688: 'clamp misses preconditions and has extraneous condition on result'. We already did this, just added tests
llvm-svn: 274252
2016-06-30 17:52:51 +00:00
Marshall Clow bc4618647f Temporarily XFAIL the incomplete type tests for GCC while I figure out why adding a static_assert in r274235 broken them
llvm-svn: 274250
2016-06-30 17:49:36 +00:00
Marshall Clow c8afc869b0 Implement LWG#2684: 'priority_queue lacking comparator typedef'. We already did this, just added tests
llvm-svn: 274243
2016-06-30 16:03:50 +00:00
Marshall Clow 81fce9729c Implement LWG#2596: 'vector::data() should use addressof'
llvm-svn: 274241
2016-06-30 15:50:55 +00:00
Marshall Clow e766a87b01 Implement LWG#2441: 'Exact-width atomic typedefs should be provided'
llvm-svn: 274236
2016-06-30 15:28:38 +00:00
Marshall Clow 497677449b Implement LWG#2436: 'Comparators for associative containers should always be CopyConstructible'
llvm-svn: 274235
2016-06-30 15:11:53 +00:00
Eric Fiselier b4fe59b595 Update status of already completed Oulu issues.
* P0163r0: Implemented in r273839.

* LWG 2309: pthread_mutex_lock only returns this error if certain debug flags
  were passed during construction. libc++ does not pass these flags. There is
  nothing to do.

* LWG 2310: Wording fix. No impact on libc++'s implementation.

* LWG 2312: libc++'s std::tuple implementation already constrains the overloads
  based on the number of arguments.

* LWG 2549: libc++'s std::tuple already applied this fix.

* LWG 2674: libc++ already depends on this relaxed wording.

* LWG 2704, 2706, 2707, 2719, 2720, 2721, 2723, 2725, 2728: All of these filesystem were either
  submitted by me and fixed before submission, or have already been applied.

llvm-svn: 274214
2016-06-30 06:59:29 +00:00
Eric Fiselier d3c2acd38c Make futures.overview enum tests more portable. Patch from STL@microsoft.com
llvm-svn: 274211
2016-06-30 05:00:32 +00:00
Eric Fiselier b21f96ac4b Make std::array typedef tests more portable.
llvm-svn: 274210
2016-06-30 04:54:00 +00:00
Eric Fiselier 8892b4eef0 Fix ::reference typedef in insert iterators.
Since at least the C++11 standard insert iterators are specified
as having ::reference typedef void. Libc++ was not doing that.
This patch corrects the typedef.

This patch changes the std::iterator base class of insert_iterator,
front_insert_iterator and back_insert_iterator. This should not
be an ABI breaking change.

llvm-svn: 274209
2016-06-30 04:40:50 +00:00
Eric Fiselier cb1fd66853 Make instreambuf.iterator/types.pass.cpp more portable.
llvm-svn: 274207
2016-06-30 04:31:09 +00:00
Eric Fiselier c76111a132 Fix use of terse static assert. Patch from STL@microsoft.com
llvm-svn: 274206
2016-06-30 04:29:12 +00:00
Eric Fiselier 3b0184321f Fix unary_function inheritance assumption. Patch from STL@microsoft.com
llvm-svn: 274205
2016-06-30 04:28:12 +00:00
Eric Fiselier 2bbb125d4e Fix unreferenced parameter warning. Patch from STL@microsoft.com
llvm-svn: 274204
2016-06-30 04:22:58 +00:00
Eric Fiselier 2afa66e124 Avoid applying unary minus to unsigned integers. Patch from STL@microsoft.com
llvm-svn: 274203
2016-06-30 04:21:52 +00:00
Akira Hatanaka 2556b769ec [libcxx] Fix a bug in strstreambuf::overflow.
The end pointer should point to one past the end of the newly allocated
buffer.

rdar://problem/24265174

Differential Revision: http://reviews.llvm.org/D20334

llvm-svn: 274132
2016-06-29 15:26:13 +00:00
Marshall Clow 91bd7dda3a Use WG21.link reflector to get to issues, rather than linking directly
llvm-svn: 274018
2016-06-28 14:13:28 +00:00
Marshall Clow baf27df0bf Updated C++1Z status page with new work from Oulu WG21 meeting
llvm-svn: 274016
2016-06-28 14:11:54 +00:00
Marshall Clow 3044c34c45 Fix bad link for P0006
llvm-svn: 273861
2016-06-27 11:14:34 +00:00
Eric Fiselier e3c72c1c85 Fix UB in uses_alloc_types.hpp
llvm-svn: 273840
2016-06-27 01:52:14 +00:00
Eric Fiselier 68436a9b48 Implement P0163r0. Add shared_ptr::weak_type.
This patch adds the weak_type typedef in shared_ptr. It is available in
C++17 and newer.

This patch also updates the _LIBCPP_STD_VER and TEST_STD_VER macros to
have the value of 16, since 2016 is the current year.

llvm-svn: 273839
2016-06-27 01:02:43 +00:00
Eric Fiselier 8b7faa6871 Implement p0337r0. Delete operator= for polymorphic_allocator.
llvm-svn: 273838
2016-06-27 00:55:25 +00:00
Eric Fiselier 9372d8bc61 Implement P0358r1. Fixes for not_fn.
llvm-svn: 273837
2016-06-27 00:40:41 +00:00
Eric Fiselier 06e9017d7b Fix C++03 failure in enable_shared_from_this test
llvm-svn: 273836
2016-06-27 00:38:28 +00:00
Eric Fiselier 39005d3019 Fix PR27115 - enable_shared_from_this does not work as a virtual base class.
See https://llvm.org/bugs/show_bug.cgi?id=27115

The problem was that the conversion from
'const enable_shared_from_this<T>*' to 'const T*' didn't work if
T inherited enable_shared_from_this as a virtual base class. The fix
is to take the original pointer passed to shared_ptr's constructor in the
__enable_weak_this method and perform an upcast to 'const T*' instead of
performing a downcast from the enable_shared_from_this base.

llvm-svn: 273835
2016-06-26 23:56:32 +00:00
Eric Fiselier 66fe5a4e2b Fix C++03 build
llvm-svn: 273832
2016-06-26 23:18:23 +00:00
Eric Fiselier bb94dca13a Fix PR28079 - std::wstring_convert move constructor broken.
The move constructor for wstring_convert accidentally copied the state member
into the converted count member in the move constructor. This patch fixes
the typo.

While working on this I discovered that wstring_convert doesn't actually
provide a move constructor according to the standard and therefore this
constructor is a libc++ extension. I'll look further into whether libc++ should
provide this constructor at all. Neither libstdc++ or MSVC's STL provide it.

llvm-svn: 273831
2016-06-26 22:56:26 +00:00
Eric Fiselier 555330719a Implement LWG 2488 - Make the placeholders constexpr.
This patch makes the bind placeholders in std::placeholders both (1) const and
(2) constexpr (See below).

This is technically a breaking change for any code using the placeholders
outside of std::bind and depending on them being non-const. However I don't
think this will break any real world code.

(1) Previously the placeholders were non-const extern globals in all
dialects. This patch changes these extern globals to be const in all dialects.
Since the cv-qualifiers don't participate in name mangling for globals this
is an ABI compatible change.

(2) Make the placeholders constexpr in C++11 and beyond. Although LWG 2488 only
applies to C++17 I don't see any reason not to backport this change.

llvm-svn: 273824
2016-06-26 21:01:34 +00:00
Eric Fiselier a9fb19d3a5 Make default_noexcept.pass.cpp container tests more portable. Patch from STL@microsoft.com
llvm-svn: 273823
2016-06-26 20:21:22 +00:00
Eric Fiselier 7cca38bfd1 Work around MSVC bug in atomics.types.generic/address.pass.cpp test. Patch from STL@microsoft.com
llvm-svn: 273822
2016-06-26 19:59:11 +00:00
Eric Fiselier 384e012561 Use L"cat" L"dog" when concatenating string literals. Patch from STL@microsoft.com
llvm-svn: 273821
2016-06-26 19:53:46 +00:00
Eric Fiselier 2e0e3df9da Add array bounds assertions to satisfy MSVC's /analyze flag. Patch from STL@microsoft.com
llvm-svn: 273820
2016-06-26 19:48:29 +00:00
Eric Fiselier 3740071be0 Add [[noreturn]] attribute to throw_bad_alloc_helper().
llvm-svn: 273819
2016-06-26 19:42:59 +00:00
Eric Fiselier 95b5ac7df9 Avoid narrowing conversions in quoted test. Patch from STL@microsoft.com
llvm-svn: 273818
2016-06-26 19:37:23 +00:00
Weiming Zhao 41583957a5 [libcxx] guard throw with exception enabling check
Summary: this fixes build error when built with c++14 and no exceptions

Reviewers: rmaprath

Subscribers: weimingz, grandinj, rmaprath, cfe-commits

Differential Revision: http://reviews.llvm.org/D21673

llvm-svn: 273697
2016-06-24 18:02:27 +00:00
Eric Fiselier 351a709781 Run list debug copy test in C++03.
llvm-svn: 273395
2016-06-22 08:57:33 +00:00
Eric Fiselier 75fd25e4bc Finish converting list _LIBCPP_DEBUG tests.
llvm-svn: 273394
2016-06-22 08:47:43 +00:00
Eric Fiselier 3624fedb68 Cleanup _LIBCPP_DEBUG tests in std::list. More to come.
llvm-svn: 273393
2016-06-22 08:01:27 +00:00
Eric Fiselier e357c0ad3b Cleanup filesystem::permissions ever more.
llvm-svn: 273392
2016-06-22 07:57:38 +00:00
Eric Fiselier c4f6eda006 Avoid unnecessary stat call in filesystem::permissions implementation.
llvm-svn: 273391
2016-06-22 07:24:00 +00:00
Eric Fiselier eea7a01a28 Disable ccache usage for .fail.cpp tests. It causes bugs.
llvm-svn: 273390
2016-06-22 07:09:59 +00:00
Eric Fiselier 0e9272bee2 Placate MSVC's unchecked malloc warning in thread tests.
llvm-svn: 273385
2016-06-22 05:44:08 +00:00
Eric Fiselier 19d44836d7 Use correct Clang feature names. I got them wrong in the previous commit
llvm-svn: 273384
2016-06-22 05:40:17 +00:00