return __tmp;
}
else
- return _M_insert_aux(__position._M_const_cast(),
- std::forward<_Args>(__args)...);
+ return _M_emplace_aux(__position._M_const_cast(),
+ std::forward<_Args>(__args)...);
}
#endif
template<typename... _Args>
typename deque<_Tp, _Alloc>::iterator
deque<_Tp, _Alloc>::
- _M_insert_aux(iterator __pos, _Args&&... __args)
+ _M_emplace_aux(iterator __pos, _Args&&... __args)
{
value_type __x_copy(std::forward<_Args>(__args)...); // XXX copy
#else
iterator
_M_insert_aux(iterator __pos, const value_type& __x);
#else
+ iterator
+ _M_insert_aux(iterator __pos, const value_type& __x)
+ { return _M_emplace_aux(__pos, __x); }
+
template<typename... _Args>
iterator
- _M_insert_aux(iterator __pos, _Args&&... __args);
+ _M_emplace_aux(iterator __pos, _Args&&... __args);
#endif
// called by insert(p,n,x) via fill_insert
--- /dev/null
+// { dg-do run { target c++11 } }
+
+// Bug 90389 - std::deque::emplace tries to call wrong overload internally
+
+#include <deque>
+#include <testsuite_hooks.h>
+
+struct X
+{
+ X() = default;
+ X(void*, void*, std::size_t) { }
+};
+
+void
+test_pr90389()
+{
+ const int n = 3;
+ std::deque<X> d(n);
+ d.emplace(d.begin(), nullptr, nullptr, d.size());
+ VERIFY( d.size() == n+1 );
+}
+
+struct Y
+{
+ Y() = default;
+ Y(std::size_t, const Y&) { }
+};
+
+void
+test_pr118079()
+{
+ const int n = 3;
+ std::deque<Y> d(n);
+ const Y y{};
+ d.emplace(d.begin(), d.size(), y);
+ VERIFY( d.size() == n+1 );
+}
+
+int main()
+{
+ test_pr90389();
+ test_pr118079();
+}