Fix for LWG Issue 2059: C++0x ambiguity problem with map::erase
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@236950 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3607f8640d
commit
488025c316
@ -136,6 +136,7 @@ public:
|
|||||||
void insert(initializer_list<value_type> il);
|
void insert(initializer_list<value_type> il);
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
iterator erase(const_iterator position);
|
||||||
|
iterator erase(iterator position); // C++14
|
||||||
size_type erase(const key_type& k);
|
size_type erase(const key_type& k);
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
iterator erase(const_iterator first, const_iterator last);
|
||||||
void clear() noexcept;
|
void clear() noexcept;
|
||||||
@ -330,6 +331,7 @@ public:
|
|||||||
void insert(initializer_list<value_type> il);
|
void insert(initializer_list<value_type> il);
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
iterator erase(const_iterator position);
|
||||||
|
iterator erase(iterator position); // C++14
|
||||||
size_type erase(const key_type& k);
|
size_type erase(const key_type& k);
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
iterator erase(const_iterator first, const_iterator last);
|
||||||
void clear() noexcept;
|
void clear() noexcept;
|
||||||
@ -1079,6 +1081,8 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
|
iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
size_type erase(const key_type& __k)
|
size_type erase(const key_type& __k)
|
||||||
{return __tree_.__erase_unique(__k);}
|
{return __tree_.__erase_unique(__k);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@ -1811,6 +1815,8 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
|
iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
|
size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator erase(const_iterator __f, const_iterator __l)
|
iterator erase(const_iterator __f, const_iterator __l)
|
||||||
|
@ -116,6 +116,7 @@ public:
|
|||||||
void insert(initializer_list<value_type> il);
|
void insert(initializer_list<value_type> il);
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
iterator erase(const_iterator position);
|
||||||
|
iterator erase(iterator position); // C++14
|
||||||
size_type erase(const key_type& k);
|
size_type erase(const key_type& k);
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
iterator erase(const_iterator first, const_iterator last);
|
||||||
void clear() noexcept;
|
void clear() noexcept;
|
||||||
@ -297,6 +298,7 @@ public:
|
|||||||
void insert(initializer_list<value_type> il);
|
void insert(initializer_list<value_type> il);
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
iterator erase(const_iterator position);
|
||||||
|
iterator erase(iterator position); // C++14
|
||||||
size_type erase(const key_type& k);
|
size_type erase(const key_type& k);
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
iterator erase(const_iterator first, const_iterator last);
|
||||||
void clear() noexcept;
|
void clear() noexcept;
|
||||||
|
@ -123,6 +123,7 @@ public:
|
|||||||
void insert(initializer_list<value_type>);
|
void insert(initializer_list<value_type>);
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
iterator erase(const_iterator position);
|
||||||
|
iterator erase(iterator position); // C++14
|
||||||
size_type erase(const key_type& k);
|
size_type erase(const key_type& k);
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
iterator erase(const_iterator first, const_iterator last);
|
||||||
void clear() noexcept;
|
void clear() noexcept;
|
||||||
@ -287,6 +288,7 @@ public:
|
|||||||
void insert(initializer_list<value_type>);
|
void insert(initializer_list<value_type>);
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
iterator erase(const_iterator position);
|
||||||
|
iterator erase(iterator position); // C++14
|
||||||
size_type erase(const key_type& k);
|
size_type erase(const key_type& k);
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
iterator erase(const_iterator first, const_iterator last);
|
||||||
void clear() noexcept;
|
void clear() noexcept;
|
||||||
@ -944,6 +946,8 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
|
iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
|
size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator erase(const_iterator __first, const_iterator __last)
|
iterator erase(const_iterator __first, const_iterator __last)
|
||||||
@ -1644,6 +1648,8 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
|
iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
|
size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator erase(const_iterator __first, const_iterator __last)
|
iterator erase(const_iterator __first, const_iterator __last)
|
||||||
|
@ -114,6 +114,7 @@ public:
|
|||||||
void insert(initializer_list<value_type>);
|
void insert(initializer_list<value_type>);
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
iterator erase(const_iterator position);
|
||||||
|
iterator erase(iterator position); // C++14
|
||||||
size_type erase(const key_type& k);
|
size_type erase(const key_type& k);
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
iterator erase(const_iterator first, const_iterator last);
|
||||||
void clear() noexcept;
|
void clear() noexcept;
|
||||||
@ -263,6 +264,7 @@ public:
|
|||||||
void insert(initializer_list<value_type>);
|
void insert(initializer_list<value_type>);
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
iterator erase(const_iterator position);
|
||||||
|
iterator erase(iterator position); // C++14
|
||||||
size_type erase(const key_type& k);
|
size_type erase(const key_type& k);
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
iterator erase(const_iterator first, const_iterator last);
|
||||||
void clear() noexcept;
|
void clear() noexcept;
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
|
|
||||||
#include "min_allocator.h"
|
#include "min_allocator.h"
|
||||||
|
|
||||||
|
struct TemplateConstructor
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
TemplateConstructor (const T&) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; }
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -234,4 +242,18 @@ int main()
|
|||||||
assert(i == m.end());
|
assert(i == m.end());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
{
|
||||||
|
// This is LWG #2059
|
||||||
|
typedef TemplateConstructor T;
|
||||||
|
typedef std::map<T, int> C;
|
||||||
|
typedef C::iterator I;
|
||||||
|
|
||||||
|
C c;
|
||||||
|
T a{0};
|
||||||
|
I it = c.find(a);
|
||||||
|
if (it != c.end())
|
||||||
|
c.erase(it);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
|
|
||||||
#include "min_allocator.h"
|
#include "min_allocator.h"
|
||||||
|
|
||||||
|
struct TemplateConstructor
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
TemplateConstructor (const T&) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; }
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -276,4 +284,18 @@ int main()
|
|||||||
assert(i == m.end());
|
assert(i == m.end());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
{
|
||||||
|
// This is LWG #2059
|
||||||
|
typedef TemplateConstructor T;
|
||||||
|
typedef std::multimap<T, int> C;
|
||||||
|
typedef C::iterator I;
|
||||||
|
|
||||||
|
C c;
|
||||||
|
T a{0};
|
||||||
|
I it = c.find(a);
|
||||||
|
if (it != c.end())
|
||||||
|
c.erase(it);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
|
|
||||||
#include "min_allocator.h"
|
#include "min_allocator.h"
|
||||||
|
|
||||||
|
struct TemplateConstructor
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
TemplateConstructor (const T&) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; }
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -178,4 +186,18 @@ int main()
|
|||||||
assert(i == m.end());
|
assert(i == m.end());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
{
|
||||||
|
// This is LWG #2059
|
||||||
|
typedef TemplateConstructor T;
|
||||||
|
typedef std::multiset<T> C;
|
||||||
|
typedef C::iterator I;
|
||||||
|
|
||||||
|
C c;
|
||||||
|
T a{0};
|
||||||
|
I it = c.find(a);
|
||||||
|
if (it != c.end())
|
||||||
|
c.erase(it);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,14 @@
|
|||||||
|
|
||||||
#include "min_allocator.h"
|
#include "min_allocator.h"
|
||||||
|
|
||||||
|
struct TemplateConstructor
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
TemplateConstructor (const T&) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; }
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -178,4 +186,18 @@ int main()
|
|||||||
assert(i == m.end());
|
assert(i == m.end());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
{
|
||||||
|
// This is LWG #2059
|
||||||
|
typedef TemplateConstructor T;
|
||||||
|
typedef std::set<T> C;
|
||||||
|
typedef C::iterator I;
|
||||||
|
|
||||||
|
C c;
|
||||||
|
T a{0};
|
||||||
|
I it = c.find(a);
|
||||||
|
if (it != c.end())
|
||||||
|
c.erase(it);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,15 @@
|
|||||||
|
|
||||||
#include "min_allocator.h"
|
#include "min_allocator.h"
|
||||||
|
|
||||||
|
struct TemplateConstructor
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
TemplateConstructor (const T&) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const TemplateConstructor&, const TemplateConstructor&) { return false; }
|
||||||
|
struct Hash { size_t operator() (const TemplateConstructor &) const { return 0; } };
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -66,4 +75,18 @@ int main()
|
|||||||
assert(c.at(4) == "four");
|
assert(c.at(4) == "four");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
{
|
||||||
|
// This is LWG #2059
|
||||||
|
typedef TemplateConstructor T;
|
||||||
|
typedef std::unordered_map<T, int, Hash> C;
|
||||||
|
typedef C::iterator I;
|
||||||
|
|
||||||
|
C m;
|
||||||
|
T a{0};
|
||||||
|
I it = m.find(a);
|
||||||
|
if (it != m.end())
|
||||||
|
m.erase(it);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,15 @@
|
|||||||
|
|
||||||
#include "min_allocator.h"
|
#include "min_allocator.h"
|
||||||
|
|
||||||
|
struct TemplateConstructor
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
TemplateConstructor (const T&) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const TemplateConstructor&, const TemplateConstructor&) { return false; }
|
||||||
|
struct Hash { size_t operator() (const TemplateConstructor &) const { return 0; } };
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -114,4 +123,18 @@ int main()
|
|||||||
assert(std::distance(c.cbegin(), c.cend()) == c.size());
|
assert(std::distance(c.cbegin(), c.cend()) == c.size());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
{
|
||||||
|
// This is LWG #2059
|
||||||
|
typedef TemplateConstructor T;
|
||||||
|
typedef std::unordered_multimap<T, int, Hash> C;
|
||||||
|
typedef C::iterator I;
|
||||||
|
|
||||||
|
C m;
|
||||||
|
T a{0};
|
||||||
|
I it = m.find(a);
|
||||||
|
if (it != m.end())
|
||||||
|
m.erase(it);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,15 @@
|
|||||||
|
|
||||||
#include "min_allocator.h"
|
#include "min_allocator.h"
|
||||||
|
|
||||||
|
struct TemplateConstructor
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
TemplateConstructor (const T&) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const TemplateConstructor&, const TemplateConstructor&) { return false; }
|
||||||
|
struct Hash { size_t operator() (const TemplateConstructor &) const { return 0; } };
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -67,4 +76,18 @@ int main()
|
|||||||
assert(c.count(4) == 1);
|
assert(c.count(4) == 1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
{
|
||||||
|
// This is LWG #2059
|
||||||
|
typedef TemplateConstructor T;
|
||||||
|
typedef std::unordered_set<T, Hash> C;
|
||||||
|
typedef C::iterator I;
|
||||||
|
|
||||||
|
C m;
|
||||||
|
T a{0};
|
||||||
|
I it = m.find(a);
|
||||||
|
if (it != m.end())
|
||||||
|
m.erase(it);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,15 @@
|
|||||||
|
|
||||||
#include "min_allocator.h"
|
#include "min_allocator.h"
|
||||||
|
|
||||||
|
struct TemplateConstructor
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
TemplateConstructor (const T&) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const TemplateConstructor&, const TemplateConstructor&) { return false; }
|
||||||
|
struct Hash { size_t operator() (const TemplateConstructor &) const { return 0; } };
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -64,4 +73,18 @@ int main()
|
|||||||
assert(c.count(4) == 1);
|
assert(c.count(4) == 1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if __cplusplus >= 201402L
|
||||||
|
{
|
||||||
|
// This is LWG #2059
|
||||||
|
typedef TemplateConstructor T;
|
||||||
|
typedef std::unordered_set<T, Hash> C;
|
||||||
|
typedef C::iterator I;
|
||||||
|
|
||||||
|
C m;
|
||||||
|
T a{0};
|
||||||
|
I it = m.find(a);
|
||||||
|
if (it != m.end())
|
||||||
|
m.erase(it);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user