Revert r225053: Add an ArrayRef upcasting constructor from ArrayRef<U*> -> ArrayRef<T*> where T is a base of U.

This appears to have broken at least the windows build bots due to
compile errors in the predicate that didn't simply supress the overload.
I'm not sure what the fix is, and the bots have been broken for a long
time now so I'm just reverting until Michael can figure out a fix.

llvm-svn: 225064
This commit is contained in:
Chandler Carruth 2015-01-01 13:01:25 +00:00
parent b27ce0e2ce
commit d5912b0090
2 changed files with 0 additions and 45 deletions

View File

@ -112,16 +112,6 @@ namespace llvm {
std::is_convertible<U *const *, T const *>::value>::type* = 0)
: Data(A.data()), Length(A.size()) {}
/// Construct an ArrayRef<T*> from an ArrayRef<U*> where T is a super class
/// of U. This uses SFINAE to ensure that only ArrayRefs with this property
/// can be converted. This is an upcasting constructor.
template <typename U>
ArrayRef(const ArrayRef<U> &A,
typename std::enable_if<std::is_base_of<
typename std::remove_pointer<T>::type,
typename std::remove_pointer<U>::type>::value>::type * = 0)
: Data(reinterpret_cast<T const *>(A.data())), Length(A.size()) {}
/// @}
/// @name Simple Operations
/// @{

View File

@ -90,39 +90,4 @@ TEST(ArrayRefTest, ConstConvert) {
a = ArrayRef<int *>(A);
}
struct A {
int data;
A() : data(0) {}
};
struct B : A {
int data2;
B() : A(), data2(0) {}
};
TEST(ArrayRefTest, UpcastConvert) {
B Data[5];
for (unsigned i = 0, e = 5; i != e; ++i) {
Data[i].data = i + 5;
Data[i].data2 = i + 30;
}
B *DataPtrs[5];
for (unsigned i = 0, e = 5; i != e; ++i) {
DataPtrs[i] = &Data[i];
}
ArrayRef<B *> BArray(DataPtrs, 5);
ArrayRef<A *> AArray(BArray);
EXPECT_TRUE(AArray.size() == 5);
for (unsigned i = 0, e = 5; i != e; ++i) {
A *a = AArray[i];
EXPECT_TRUE(a->data == int(i + 5));
}
}
} // end anonymous namespace