mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[ADT] Use explicit constructors for DenseMapPair to work around compiler issues.
Inheriting constructors from std::pair caused clang-3.8 to treat some DenseMap initializer_list constructor calls as ambiguous, which broke several bots. This commit explicitly defines DenseMapPair's constructos to work around the issue. https://reviews.llvm.org/D53726 llvm-svn: 345411
This commit is contained in:
parent
d14eeb2c34
commit
e145227c44
@ -40,7 +40,32 @@ namespace detail {
|
||||
template <typename KeyT, typename ValueT>
|
||||
struct DenseMapPair : public std::pair<KeyT, ValueT> {
|
||||
|
||||
using std::pair<KeyT, ValueT>::pair;
|
||||
// FIXME: Switch to inheriting constructors when we drop support for older
|
||||
// clang versions.
|
||||
// NOTE: This default constructor is declared with '{}' rather than
|
||||
// '= default' to work around a separate bug in clang-3.8. This can
|
||||
// also go when we switch to inheriting constructors.
|
||||
DenseMapPair() {}
|
||||
|
||||
DenseMapPair(const KeyT &Key, const ValueT &Value)
|
||||
: std::pair<KeyT, ValueT>(Key, Value) {}
|
||||
|
||||
DenseMapPair(KeyT &&Key, ValueT &&Value)
|
||||
: std::pair<KeyT, ValueT>(std::move(Key), std::move(Value)) {}
|
||||
|
||||
template <typename AltKeyT, typename AltValueT>
|
||||
DenseMapPair(AltKeyT &&AltKey, AltValueT &&AltValue,
|
||||
typename std::enable_if<
|
||||
std::is_convertible<AltKeyT, KeyT>::value &&
|
||||
std::is_convertible<AltValueT, ValueT>::value>::type * = 0)
|
||||
: std::pair<KeyT, ValueT>(std::forward<AltKeyT>(AltKey),
|
||||
std::forward<AltValueT>(AltValue)) {}
|
||||
|
||||
template <typename AltPairT>
|
||||
DenseMapPair(AltPairT &&AltPair,
|
||||
typename std::enable_if<std::is_convertible<
|
||||
AltPairT, std::pair<KeyT, ValueT>>::value>::type * = 0)
|
||||
: std::pair<KeyT, ValueT>(std::forward<AltPairT>(AltPair)) {}
|
||||
|
||||
KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
|
||||
const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
|
||||
|
Loading…
Reference in New Issue
Block a user