[libcxx] r292990 - Change the return type of emplace_[front|back] back to void when building with C++14 or before. Resolves PR31680.
Marshall Clow via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 24 15:09:13 PST 2017
Author: marshall
Date: Tue Jan 24 17:09:12 2017
New Revision: 292990
URL: http://llvm.org/viewvc/llvm-project?rev=292990&view=rev
Log:
Change the return type of emplace_[front|back] back to void when building with C++14 or before. Resolves PR31680.
Modified:
libcxx/trunk/include/deque
libcxx/trunk/include/forward_list
libcxx/trunk/include/list
libcxx/trunk/include/queue
libcxx/trunk/include/stack
libcxx/trunk/include/vector
libcxx/trunk/test/std/containers/container.adaptors/queue/queue.defn/emplace.pass.cpp
libcxx/trunk/test/std/containers/container.adaptors/stack/stack.defn/emplace.pass.cpp
libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_back.pass.cpp
libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_front.pass.cpp
libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.modifiers/emplace_front.pass.cpp
libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_back.pass.cpp
libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_front.pass.cpp
libcxx/trunk/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp
libcxx/trunk/test/std/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp
libcxx/trunk/www/cxx1z_status.html
Modified: libcxx/trunk/include/deque
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/deque?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/include/deque (original)
+++ libcxx/trunk/include/deque Tue Jan 24 17:09:12 2017
@@ -110,8 +110,8 @@ public:
void push_front(value_type&& v);
void push_back(const value_type& v);
void push_back(value_type&& v);
- template <class... Args> reference emplace_front(Args&&... args);
- template <class... Args> reference emplace_back(Args&&... args);
+ template <class... Args> reference emplace_front(Args&&... args); // reference in C++17
+ template <class... Args> reference emplace_back(Args&&... args); // reference in C++17
template <class... Args> iterator emplace(const_iterator p, Args&&... args);
iterator insert(const_iterator p, const value_type& v);
iterator insert(const_iterator p, value_type&& v);
@@ -1342,8 +1342,13 @@ public:
void push_back(const value_type& __v);
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
#ifndef _LIBCPP_HAS_NO_VARIADICS
+#if _LIBCPP_STD_VER > 14
template <class... _Args> reference emplace_front(_Args&&... __args);
- template <class... _Args> reference emplace_back(_Args&&... __args);
+ template <class... _Args> reference emplace_back (_Args&&... __args);
+#else
+ template <class... _Args> void emplace_front(_Args&&... __args);
+ template <class... _Args> void emplace_back (_Args&&... __args);
+#endif
template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args);
#endif // _LIBCPP_HAS_NO_VARIADICS
void push_front(value_type&& __v);
@@ -1822,7 +1827,11 @@ deque<_Tp, _Allocator>::push_back(value_
template <class _Tp, class _Allocator>
template <class... _Args>
+#if _LIBCPP_STD_VER > 14
typename deque<_Tp, _Allocator>::reference
+#else
+void
+#endif
deque<_Tp, _Allocator>::emplace_back(_Args&&... __args)
{
allocator_type& __a = __base::__alloc();
@@ -1832,7 +1841,9 @@ deque<_Tp, _Allocator>::emplace_back(_Ar
__alloc_traits::construct(__a, _VSTD::addressof(*__base::end()),
_VSTD::forward<_Args>(__args)...);
++__base::size();
+#if _LIBCPP_STD_VER > 14
return *--__base::end();
+#endif
}
#endif // _LIBCPP_HAS_NO_VARIADICS
@@ -1870,7 +1881,11 @@ deque<_Tp, _Allocator>::push_front(value
template <class _Tp, class _Allocator>
template <class... _Args>
+#if _LIBCPP_STD_VER > 14
typename deque<_Tp, _Allocator>::reference
+#else
+void
+#endif
deque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
{
allocator_type& __a = __base::__alloc();
@@ -1880,7 +1895,9 @@ deque<_Tp, _Allocator>::emplace_front(_A
__alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
--__base::__start_;
++__base::size();
+#if _LIBCPP_STD_VER > 14
return *__base::begin();
+#endif
}
#endif // _LIBCPP_HAS_NO_VARIADICS
Modified: libcxx/trunk/include/forward_list
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/forward_list?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/include/forward_list (original)
+++ libcxx/trunk/include/forward_list Tue Jan 24 17:09:12 2017
@@ -87,7 +87,7 @@ public:
reference front();
const_reference front() const;
- template <class... Args> reference emplace_front(Args&&... args);
+ template <class... Args> reference emplace_front(Args&&... args); // reference in C++17
void push_front(const value_type& v);
void push_front(value_type&& v);
@@ -747,7 +747,11 @@ public:
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
#ifndef _LIBCPP_HAS_NO_VARIADICS
+#if _LIBCPP_STD_VER > 14
template <class... _Args> reference emplace_front(_Args&&... __args);
+#else
+ template <class... _Args> void emplace_front(_Args&&... __args);
+#endif
#endif
void push_front(value_type&& __v);
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1103,7 +1107,11 @@ forward_list<_Tp, _Alloc>::assign(initia
template <class _Tp, class _Alloc>
template <class... _Args>
+#if _LIBCPP_STD_VER > 14
typename forward_list<_Tp, _Alloc>::reference
+#else
+void
+#endif
forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
{
__node_allocator& __a = base::__alloc();
@@ -1113,7 +1121,9 @@ forward_list<_Tp, _Alloc>::emplace_front
_VSTD::forward<_Args>(__args)...);
__h->__next_ = base::__before_begin()->__next_;
base::__before_begin()->__next_ = __h.release();
+#if _LIBCPP_STD_VER > 14
return base::__before_begin()->__next_->__value_;
+#endif
}
#endif // _LIBCPP_HAS_NO_VARIADICS
Modified: libcxx/trunk/include/list
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/list?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/include/list (original)
+++ libcxx/trunk/include/list Tue Jan 24 17:09:12 2017
@@ -93,10 +93,10 @@ public:
size_type max_size() const noexcept;
template <class... Args>
- reference emplace_front(Args&&... args);
+ reference emplace_front(Args&&... args); // reference in C++17
void pop_front();
template <class... Args>
- reference emplace_back(Args&&... args);
+ reference emplace_back(Args&&... args); // reference in C++17
void pop_back();
void push_front(const value_type& x);
void push_front(value_type&& x);
@@ -969,9 +969,17 @@ public:
void push_back(value_type&& __x);
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args>
+#if _LIBCPP_STD_VER > 14
reference emplace_front(_Args&&... __args);
+#else
+ void emplace_front(_Args&&... __args);
+#endif
template <class... _Args>
+#if _LIBCPP_STD_VER > 14
reference emplace_back(_Args&&... __args);
+#else
+ void emplace_back(_Args&&... __args);
+#endif
template <class... _Args>
iterator emplace(const_iterator __p, _Args&&... __args);
#endif // _LIBCPP_HAS_NO_VARIADICS
@@ -1600,7 +1608,11 @@ list<_Tp, _Alloc>::push_back(value_type&
template <class _Tp, class _Alloc>
template <class... _Args>
+#if _LIBCPP_STD_VER > 14
typename list<_Tp, _Alloc>::reference
+#else
+void
+#endif
list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
{
__node_allocator& __na = base::__node_alloc();
@@ -1609,12 +1621,20 @@ list<_Tp, _Alloc>::emplace_front(_Args&&
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
__link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
++base::__sz();
+#if _LIBCPP_STD_VER > 14
return __hold.release()->__value_;
+#else
+ __hold.release();
+#endif
}
template <class _Tp, class _Alloc>
template <class... _Args>
+#if _LIBCPP_STD_VER > 14
typename list<_Tp, _Alloc>::reference
+#else
+void
+#endif
list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
{
__node_allocator& __na = base::__node_alloc();
@@ -1624,7 +1644,11 @@ list<_Tp, _Alloc>::emplace_back(_Args&&.
__link_pointer __nl = __hold->__as_link();
__link_nodes_at_back(__nl, __nl);
++base::__sz();
+#if _LIBCPP_STD_VER > 14
return __hold.release()->__value_;
+#else
+ __hold.release();
+#endif
}
template <class _Tp, class _Alloc>
Modified: libcxx/trunk/include/queue
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/queue?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/include/queue (original)
+++ libcxx/trunk/include/queue Tue Jan 24 17:09:12 2017
@@ -63,7 +63,7 @@ public:
void push(const value_type& v);
void push(value_type&& v);
- template <class... Args> reference emplace(Args&&... args);
+ template <class... Args> reference emplace(Args&&... args); // reference in C++17
void pop();
void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
@@ -292,8 +292,13 @@ public:
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args>
_LIBCPP_INLINE_VISIBILITY
+#if _LIBCPP_STD_VER > 14
reference emplace(_Args&&... __args)
{ return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
+#else
+ void emplace(_Args&&... __args)
+ { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
+#endif
#endif // _LIBCPP_HAS_NO_VARIADICS
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
_LIBCPP_INLINE_VISIBILITY
Modified: libcxx/trunk/include/stack
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/stack?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/include/stack (original)
+++ libcxx/trunk/include/stack Tue Jan 24 17:09:12 2017
@@ -55,7 +55,7 @@ public:
void push(const value_type& x);
void push(value_type&& x);
- template <class... Args> reference emplace(Args&&... args);
+ template <class... Args> reference emplace(Args&&... args); // reference in C++17
void pop();
void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>)
@@ -199,8 +199,13 @@ public:
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args>
_LIBCPP_INLINE_VISIBILITY
+#if _LIBCPP_STD_VER > 14
reference emplace(_Args&&... __args)
{ return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
+#else
+ void emplace(_Args&&... __args)
+ { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
+#endif
#endif // _LIBCPP_HAS_NO_VARIADICS
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
_LIBCPP_INLINE_VISIBILITY
Modified: libcxx/trunk/include/vector
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/vector?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/include/vector (original)
+++ libcxx/trunk/include/vector Tue Jan 24 17:09:12 2017
@@ -99,7 +99,7 @@ public:
void push_back(const value_type& x);
void push_back(value_type&& x);
template <class... Args>
- reference emplace_back(Args&&... args);
+ reference emplace_back(Args&&... args); // reference in C++17
void pop_back();
template <class... Args> iterator emplace(const_iterator position, Args&&... args);
@@ -218,7 +218,7 @@ public:
const_reference back() const;
void push_back(const value_type& x);
- template <class... Args> reference emplace_back(Args&&... args); // C++14
+ template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17
void pop_back();
template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14
@@ -679,7 +679,11 @@ public:
#ifndef _LIBCPP_HAS_NO_VARIADICS
template <class... _Args>
_LIBCPP_INLINE_VISIBILITY
+#if _LIBCPP_STD_VER > 14
reference emplace_back(_Args&&... __args);
+#else
+ void emplace_back(_Args&&... __args);
+#endif
#endif // _LIBCPP_HAS_NO_VARIADICS
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
_LIBCPP_INLINE_VISIBILITY
@@ -1625,7 +1629,11 @@ vector<_Tp, _Allocator>::__emplace_back_
template <class _Tp, class _Allocator>
template <class... _Args>
inline
+#if _LIBCPP_STD_VER > 14
typename vector<_Tp, _Allocator>::reference
+#else
+void
+#endif
vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
{
if (this->__end_ < this->__end_cap())
@@ -1639,7 +1647,9 @@ vector<_Tp, _Allocator>::emplace_back(_A
}
else
__emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
+#if _LIBCPP_STD_VER > 14
return this->back();
+#endif
}
#endif // _LIBCPP_HAS_NO_VARIADICS
@@ -2336,9 +2346,16 @@ public:
void push_back(const value_type& __x);
#if _LIBCPP_STD_VER > 11
template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args) {
+#if _LIBCPP_STD_VER > 14
+ _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args)
+#else
+ _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
+#endif
+ {
push_back ( value_type ( _VSTD::forward<_Args>(__args)... ));
+#if _LIBCPP_STD_VER > 14
return this->back();
+#endif
}
#endif
Modified: libcxx/trunk/test/std/containers/container.adaptors/queue/queue.defn/emplace.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/container.adaptors/queue/queue.defn/emplace.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/container.adaptors/queue/queue.defn/emplace.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/container.adaptors/queue/queue.defn/emplace.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,25 +12,35 @@
// <queue>
// template <class... Args> reference emplace(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
+
#include <queue>
#include <cassert>
+#include "test_macros.h"
+
#include "../../../Emplaceable.h"
int main()
{
typedef Emplaceable T;
std::queue<Emplaceable> q;
+#if TEST_STD_VER > 14
T& r1 = q.emplace(1, 2.5);
assert(&r1 == &q.back());
T& r2 = q.emplace(2, 3.5);
assert(&r2 == &q.back());
T& r3 = q.emplace(3, 4.5);
assert(&r3 == &q.back());
+ assert(&r1 == &q.front());
+#else
+ q.emplace(1, 2.5);
+ q.emplace(2, 3.5);
+ q.emplace(3, 4.5);
+#endif
+
assert(q.size() == 3);
assert(q.front() == Emplaceable(1, 2.5));
assert(q.back() == Emplaceable(3, 4.5));
- assert(&r3 == &q.back());
- assert(&r1 == &q.front());
}
Modified: libcxx/trunk/test/std/containers/container.adaptors/stack/stack.defn/emplace.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/container.adaptors/stack/stack.defn/emplace.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/container.adaptors/stack/stack.defn/emplace.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/container.adaptors/stack/stack.defn/emplace.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,22 +12,31 @@
// <stack>
// template <class... Args> reference emplace(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
#include <stack>
#include <cassert>
+#include "test_macros.h"
+
#include "../../../Emplaceable.h"
int main()
{
typedef Emplaceable T;
std::stack<Emplaceable> q;
+#if TEST_STD_VER > 14
T& r1 = q.emplace(1, 2.5);
assert(&r1 == &q.top());
T& r2 = q.emplace(2, 3.5);
assert(&r2 == &q.top());
T& r3 = q.emplace(3, 4.5);
assert(&r3 == &q.top());
+#else
+ q.emplace(1, 2.5);
+ q.emplace(2, 3.5);
+ q.emplace(3, 4.5);
+#endif
assert(q.size() == 3);
assert(q.top() == Emplaceable(3, 4.5));
}
Modified: libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_back.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_back.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_back.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_back.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,6 +12,7 @@
// <deque>
// template <class... Args> reference emplace_back(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
#include <deque>
#include <cstddef>
@@ -49,15 +50,21 @@ void
test(C& c1)
{
typedef typename C::iterator I;
- typedef typename C::reference Ref;
std::size_t c1_osize = c1.size();
+#if TEST_STD_VER > 14
+ typedef typename C::reference Ref;
Ref ref = c1.emplace_back(Emplaceable(1, 2.5));
+#else
+ c1.emplace_back(Emplaceable(1, 2.5));
+#endif
assert(c1.size() == c1_osize + 1);
assert(distance(c1.begin(), c1.end())
== static_cast<std::ptrdiff_t>(c1.size()));
I i = c1.end();
assert(*--i == Emplaceable(1, 2.5));
+#if TEST_STD_VER > 14
assert(&(*i) == &ref);
+#endif
}
template <class C>
Modified: libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_front.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_front.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_front.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/deque/deque.modifiers/emplace_front.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,6 +12,7 @@
// <deque>
// template <class... Args> reference emplace_front(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
#include <deque>
#include <cstddef>
@@ -20,6 +21,7 @@
#include "test_macros.h"
#include "../../../Emplaceable.h"
#include "min_allocator.h"
+#include "test_allocator.h"
template <class C>
C
@@ -48,15 +50,21 @@ void
test(C& c1)
{
typedef typename C::iterator I;
- typedef typename C::reference Ref;
std::size_t c1_osize = c1.size();
+#if TEST_STD_VER > 14
+ typedef typename C::reference Ref;
Ref res_ref = c1.emplace_front(Emplaceable(1, 2.5));
+#else
+ c1.emplace_front(Emplaceable(1, 2.5));
+#endif
assert(c1.size() == c1_osize + 1);
assert(distance(c1.begin(), c1.end())
== static_cast<std::ptrdiff_t>(c1.size()));
I i = c1.begin();
assert(*i == Emplaceable(1, 2.5));
+#if TEST_STD_VER > 14
assert(&res_ref == &(*i));
+#endif
}
template <class C>
@@ -84,4 +92,15 @@ int main()
for (int j = 0; j < N; ++j)
testN<std::deque<Emplaceable, min_allocator<Emplaceable>> >(rng[i], rng[j]);
}
+ {
+ std::deque<Tag_X, TaggingAllocator<Tag_X>> c;
+ c.emplace_front();
+ assert(c.size() == 1);
+ c.emplace_front(1, 2, 3);
+ assert(c.size() == 2);
+ c.emplace_front();
+ assert(c.size() == 3);
+ c.emplace_front(1, 2, 3);
+ assert(c.size() == 4);
+ }
}
Modified: libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.modifiers/emplace_front.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.modifiers/emplace_front.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.modifiers/emplace_front.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.modifiers/emplace_front.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,10 +12,13 @@
// <forward_list>
// template <class... Args> reference emplace_front(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
#include <forward_list>
#include <cassert>
+#include "test_macros.h"
+
#include "../../../Emplaceable.h"
#include "min_allocator.h"
@@ -25,6 +28,7 @@ int main()
typedef Emplaceable T;
typedef std::forward_list<T> C;
C c;
+#if TEST_STD_VER > 14
T& r1 = c.emplace_front();
assert(c.front() == Emplaceable());
assert(&r1 == &c.front());
@@ -32,6 +36,13 @@ int main()
T& r2 = c.emplace_front(1, 2.5);
assert(c.front() == Emplaceable(1, 2.5));
assert(&r2 == &c.front());
+#else
+ c.emplace_front();
+ assert(c.front() == Emplaceable());
+ assert(distance(c.begin(), c.end()) == 1);
+ c.emplace_front(1, 2.5);
+ assert(c.front() == Emplaceable(1, 2.5));
+#endif
assert(*next(c.begin()) == Emplaceable());
assert(distance(c.begin(), c.end()) == 2);
}
@@ -39,6 +50,7 @@ int main()
typedef Emplaceable T;
typedef std::forward_list<T, min_allocator<T>> C;
C c;
+#if TEST_STD_VER > 14
T& r1 = c.emplace_front();
assert(c.front() == Emplaceable());
assert(&r1 == &c.front());
@@ -46,6 +58,13 @@ int main()
T& r2 = c.emplace_front(1, 2.5);
assert(c.front() == Emplaceable(1, 2.5));
assert(&r2 == &c.front());
+#else
+ c.emplace_front();
+ assert(c.front() == Emplaceable());
+ assert(distance(c.begin(), c.end()) == 1);
+ c.emplace_front(1, 2.5);
+ assert(c.front() == Emplaceable(1, 2.5));
+#endif
assert(*next(c.begin()) == Emplaceable());
assert(distance(c.begin(), c.end()) == 2);
}
Modified: libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_back.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_back.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_back.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_back.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,10 +12,12 @@
// <list>
// template <class... Args> reference emplace_back(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
#include <list>
#include <cassert>
+#include "test_macros.h"
#include "min_allocator.h"
class A
@@ -37,6 +39,7 @@ int main()
{
{
std::list<A> c;
+#if TEST_STD_VER > 14
A& r1 = c.emplace_back(2, 3.5);
assert(c.size() == 1);
assert(&r1 == &c.back());
@@ -45,6 +48,14 @@ int main()
A& r2 = c.emplace_back(3, 4.5);
assert(c.size() == 2);
assert(&r2 == &c.back());
+#else
+ c.emplace_back(2, 3.5);
+ assert(c.size() == 1);
+ assert(c.front().geti() == 2);
+ assert(c.front().getd() == 3.5);
+ c.emplace_back(3, 4.5);
+ assert(c.size() == 2);
+#endif
assert(c.front().geti() == 2);
assert(c.front().getd() == 3.5);
assert(c.back().geti() == 3);
@@ -52,6 +63,7 @@ int main()
}
{
std::list<A, min_allocator<A>> c;
+#if TEST_STD_VER > 14
A& r1 = c.emplace_back(2, 3.5);
assert(c.size() == 1);
assert(&r1 == &c.back());
@@ -60,6 +72,14 @@ int main()
A& r2 = c.emplace_back(3, 4.5);
assert(c.size() == 2);
assert(&r2 == &c.back());
+#else
+ c.emplace_back(2, 3.5);
+ assert(c.size() == 1);
+ assert(c.front().geti() == 2);
+ assert(c.front().getd() == 3.5);
+ c.emplace_back(3, 4.5);
+ assert(c.size() == 2);
+#endif
assert(c.front().geti() == 2);
assert(c.front().getd() == 3.5);
assert(c.back().geti() == 3);
Modified: libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_front.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_front.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_front.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/list/list.modifiers/emplace_front.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,6 +12,7 @@
// <list>
// template <class... Args> reference emplace_front(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
#include <list>
#include <cassert>
@@ -37,6 +38,7 @@ int main()
{
{
std::list<A> c;
+#if TEST_STD_VER > 14
A& r1 = c.emplace_front(2, 3.5);
assert(c.size() == 1);
assert(&r1 == &c.front());
@@ -45,13 +47,23 @@ int main()
A& r2 = c.emplace_front(3, 4.5);
assert(c.size() == 2);
assert(&r2 == &c.front());
+#else
+ c.emplace_front(2, 3.5);
+ assert(c.size() == 1);
+ assert(c.front().geti() == 2);
+ assert(c.front().getd() == 3.5);
+ c.emplace_front(3, 4.5);
+ assert(c.size() == 2);
+#endif
assert(c.front().geti() == 3);
assert(c.front().getd() == 4.5);
assert(c.back().geti() == 2);
assert(c.back().getd() == 3.5);
}
+
{
std::list<A, min_allocator<A>> c;
+#if TEST_STD_VER > 14
A& r1 = c.emplace_front(2, 3.5);
assert(c.size() == 1);
assert(&r1 == &c.front());
@@ -60,6 +72,14 @@ int main()
A& r2 = c.emplace_front(3, 4.5);
assert(c.size() == 2);
assert(&r2 == &c.front());
+#else
+ c.emplace_front(2, 3.5);
+ assert(c.size() == 1);
+ assert(c.front().geti() == 2);
+ assert(c.front().getd() == 3.5);
+ c.emplace_front(3, 4.5);
+ assert(c.size() == 2);
+#endif
assert(c.front().geti() == 3);
assert(c.front().getd() == 4.5);
assert(c.back().geti() == 2);
Modified: libcxx/trunk/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/vector.bool/emplace_back.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,17 +12,20 @@
// vector.bool
// template <class... Args> reference emplace_back(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
#include <vector>
#include <cassert>
+#include "test_macros.h"
#include "min_allocator.h"
int main()
{
{
typedef std::vector<bool> C;
- typedef C::reference Ref;
C c;
+#if TEST_STD_VER > 14
+ typedef C::reference Ref;
Ref r1 = c.emplace_back();
assert(c.size() == 1);
assert(c.front() == false);
@@ -36,19 +39,27 @@ int main()
r2 = false;
assert(c.back() == false);
r2 = true;
- Ref r3 = c.emplace_back(1 == 1);
+#else
+ c.emplace_back();
+ assert(c.size() == 1);
+ assert(c.front() == false);
+ c.emplace_back(true);
+ assert(c.size() == 2);
+ assert(c.front() == false);
+ assert(c.back() == true);
+#endif
+ c.emplace_back(1 == 1);
assert(c.size() == 3);
assert(c.front() == false);
assert(c[1] == true);
assert(c.back() == true);
- r3 = false;
- assert(c.back() == false);
}
{
typedef std::vector<bool, min_allocator<bool>> C;
- typedef C::reference Ref;
C c;
+#if TEST_STD_VER > 14
+ typedef C::reference Ref;
Ref r1 = c.emplace_back();
assert(c.size() == 1);
assert(c.front() == false);
@@ -62,6 +73,15 @@ int main()
r2 = false;
assert(c.back() == false);
r2 = true;
+#else
+ c.emplace_back();
+ assert(c.size() == 1);
+ assert(c.front() == false);
+ c.emplace_back(true);
+ assert(c.size() == 2);
+ assert(c.front() == false);
+ assert(c.back() == true);
+#endif
c.emplace_back(1 == 1);
assert(c.size() == 3);
assert(c.front() == false);
Modified: libcxx/trunk/test/std/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp Tue Jan 24 17:09:12 2017
@@ -12,9 +12,11 @@
// <vector>
// template <class... Args> reference emplace_back(Args&&... args);
+// return type is 'reference' in C++17; 'void' before
#include <vector>
#include <cassert>
+#include "test_macros.h"
#include "test_allocator.h"
#include "min_allocator.h"
#include "test_allocator.h"
@@ -56,6 +58,7 @@ int main()
{
{
std::vector<A> c;
+#if TEST_STD_VER > 14
A& r1 = c.emplace_back(2, 3.5);
assert(c.size() == 1);
assert(&r1 == &c.back());
@@ -65,6 +68,15 @@ int main()
A& r2 = c.emplace_back(3, 4.5);
assert(c.size() == 2);
assert(&r2 == &c.back());
+#else
+ c.emplace_back(2, 3.5);
+ assert(c.size() == 1);
+ assert(c.front().geti() == 2);
+ assert(c.front().getd() == 3.5);
+ assert(is_contiguous_container_asan_correct(c));
+ c.emplace_back(3, 4.5);
+ assert(c.size() == 2);
+#endif
assert(c.front().geti() == 2);
assert(c.front().getd() == 3.5);
assert(c.back().geti() == 3);
@@ -73,6 +85,7 @@ int main()
}
{
std::vector<A, limited_allocator<A, 4> > c;
+#if TEST_STD_VER > 14
A& r1 = c.emplace_back(2, 3.5);
assert(c.size() == 1);
assert(&r1 == &c.back());
@@ -82,6 +95,15 @@ int main()
A& r2 = c.emplace_back(3, 4.5);
assert(c.size() == 2);
assert(&r2 == &c.back());
+#else
+ c.emplace_back(2, 3.5);
+ assert(c.size() == 1);
+ assert(c.front().geti() == 2);
+ assert(c.front().getd() == 3.5);
+ assert(is_contiguous_container_asan_correct(c));
+ c.emplace_back(3, 4.5);
+ assert(c.size() == 2);
+#endif
assert(c.front().geti() == 2);
assert(c.front().getd() == 3.5);
assert(c.back().geti() == 3);
@@ -90,6 +112,7 @@ int main()
}
{
std::vector<A, min_allocator<A>> c;
+#if TEST_STD_VER > 14
A& r1 = c.emplace_back(2, 3.5);
assert(c.size() == 1);
assert(&r1 == &c.back());
@@ -99,6 +122,15 @@ int main()
A& r2 = c.emplace_back(3, 4.5);
assert(c.size() == 2);
assert(&r2 == &c.back());
+#else
+ c.emplace_back(2, 3.5);
+ assert(c.size() == 1);
+ assert(c.front().geti() == 2);
+ assert(c.front().getd() == 3.5);
+ assert(is_contiguous_container_asan_correct(c));
+ c.emplace_back(3, 4.5);
+ assert(c.size() == 2);
+#endif
assert(c.front().geti() == 2);
assert(c.front().getd() == 3.5);
assert(c.back().geti() == 3);
Modified: libcxx/trunk/www/cxx1z_status.html
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1z_status.html?rev=292990&r1=292989&r2=292990&view=diff
==============================================================================
--- libcxx/trunk/www/cxx1z_status.html (original)
+++ libcxx/trunk/www/cxx1z_status.html Tue Jan 24 17:09:12 2017
@@ -376,10 +376,10 @@
<tr><td><a href="http://wg21.link/LWG2680">2680</a></td><td>Add "Equivalent to" to filesystem</td><td>Issaquah</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2681">2681</a></td><td>filesystem::copy() cannot copy symlinks</td><td>Issaquah</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2682">2682</a></td><td>filesystem::copy() won't create a symlink to a directory</td><td>Issaquah</td><td>Complete</td></tr>
- <tr><td><a href="http://wg21.link/LWG2686">2686</a></td><td>Why is std::hash specialized for error_code, but not error_condition?</td><td>Issaquah</td><td>Patch ready</td></tr>
+ <tr><td><a href="http://wg21.link/LWG2686">2686</a></td><td>Why is std::hash specialized for error_code, but not error_condition?</td><td>Issaquah</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2694">2694</a></td><td>Application of LWG 436 accidentally deleted definition of "facet"</td><td>Issaquah</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2696">2696</a></td><td>Interaction between make_shared and enable_shared_from_this is underspecified</td><td>Issaquah</td><td></td></tr>
- <tr><td><a href="http://wg21.link/LWG2699">2699</a></td><td>Missing restriction in [numeric.requirements]</td><td>Issaquah</td><td></td></tr>
+ <tr><td><a href="http://wg21.link/LWG2699">2699</a></td><td>Missing restriction in [numeric.requirements]</td><td>Issaquah</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2712">2712</a></td><td>copy_file(from, to, ...) has a number of unspecified error conditions</td><td>Issaquah</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2722">2722</a></td><td>equivalent incorrectly specifies throws clause</td><td>Issaquah</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2729">2729</a></td><td>Missing SFINAE on std::pair::operator=</td><td>Issaquah</td><td></td></tr>
More information about the cfe-commits
mailing list