#ifdef _MSC_VER
namespace std {
- // Fix bug in VC++ implementation of std::uninitialized_copy. Define
- // additional overloads so that the copy is recognized as a scalar and
- // not an object copy.
+#if _MSC_VER <= 1310
+ // Work around flawed VC++ implementation of std::uninitialized_copy. Define
+ // additional overloads so that elements with pointer types are recognized as
+ // scalars and not objects, causing bizarre type conversion errors.
template<class T1, class T2>
inline _Scalar_ptr_iterator_tag _Ptr_cat(T1 **, T2 **) {
- _Scalar_ptr_iterator_tag _Cat;
- return _Cat;
+ _Scalar_ptr_iterator_tag _Cat;
+ return _Cat;
}
template<class T1, class T2>
inline _Scalar_ptr_iterator_tag _Ptr_cat(T1* const *, T2 **) {
- _Scalar_ptr_iterator_tag _Cat;
- return _Cat;
+ _Scalar_ptr_iterator_tag _Cat;
+ return _Cat;
}
+#else
+// FIXME: It is not clear if the problem is fixed in VS 2005. What is clear
+// is that the above hack won't work if it wasn't fixed.
+#endif
}
#endif
// Define this out-of-line to dissuade the C++ compiler from inlining it.
template <typename T>
void SmallVectorImpl<T>::grow(unsigned MinSize) {
- unsigned CurCapacity = Capacity-Begin;
- unsigned CurSize = size();
+ unsigned CurCapacity = unsigned(Capacity-Begin);
+ unsigned CurSize = unsigned(size());
unsigned NewCapacity = 2*CurCapacity;
if (NewCapacity < MinSize)
NewCapacity = MinSize;
// If we already have sufficient space, assign the common elements, then
// destroy any excess.
- unsigned RHSSize = RHS.size();
- unsigned CurSize = size();
+ unsigned RHSSize = unsigned(RHS.size());
+ unsigned CurSize = unsigned(size());
if (CurSize >= RHSSize) {
// Assign common elements.
iterator NewEnd = std::copy(RHS.Begin, RHS.Begin+RHSSize, Begin);