string_compare.patch [plain text]
diff -upr /Users/hhinnant/Documents/libstdcxx_build/libstdcxx.roots/libstdcxx/libstdcxx/libstdc++-v3/ChangeLog /Users/hhinnant/Documents/libstdc++-v3/ChangeLog
--- libstdcxx/libstdc++-v3/ChangeLog 2008-10-27 12:28:07.000000000 -0400
+++ libstdc++-v3/ChangeLog 2008-10-27 12:47:49.000000000 -0400
@@ -1,3 +1,8 @@
+2008-10-27 Howard Hinnant <hhinnant@apple.com>
+
+ * Fixed basic_string.h, basic_string.tcc, incorrect 64bit to
+ 32bit narrowing. <rdar://problem/5410410>
+
2008-08-27 Howard Hinnant <hhinnant@apple.com>
* Versioned libstdc++ <rdar://problem/6163061>
diff -upr /Users/hhinnant/Documents/libstdcxx_build/libstdcxx.roots/libstdcxx/libstdcxx/libstdc++-v3/include/bits/basic_string.h /Users/hhinnant/Documents/libstdc++-v3/include/bits/basic_string.h
--- libstdc++-v3/include/bits/basic_string.h 2007-04-12 19:06:37.000000000 -0400
+++ libstdc++-v3/include/bits/basic_string.h 2008-10-24 13:07:47.000000000 -0400
@@ -390,6 +390,16 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
{ _M_copy(__p, __k1, __k2 - __k1); }
+ static int
+ _S_compare(size_type __x, size_type __y)
+ {
+ if (__x > __y)
+ return 1;
+ if (__x < __y)
+ return -1;
+ return 0;
+ }
+
void
_M_mutate(size_type __pos, size_type __len1, size_type __len2);
@@ -1934,7 +1944,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
int __r = traits_type::compare(_M_data(), __str.data(), __len);
if (!__r)
- __r = __size - __osize;
+ __r = _S_compare(__size, __osize);
return __r;
}
diff -upr /Users/hhinnant/Documents/libstdcxx_build/libstdcxx.roots/libstdcxx/libstdcxx/libstdc++-v3/include/bits/basic_string.tcc /Users/hhinnant/Documents/libstdc++-v3/include/bits/basic_string.tcc
--- libstdc++-v3/include/bits/basic_string.tcc 2007-03-30 13:11:22.000000000 -0400
+++ libstdc++-v3/include/bits/basic_string.tcc 2008-10-24 13:09:12.000000000 -0400
@@ -903,7 +903,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_type __len = std::min(__n, __osize);
int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
if (!__r)
- __r = __n - __osize;
+ __r = _S_compare(__n, __osize);
return __r;
}
@@ -921,7 +921,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
int __r = traits_type::compare(_M_data() + __pos1,
__str.data() + __pos2, __len);
if (!__r)
- __r = __n1 - __n2;
+ __r = _S_compare(__n1, __n2);
return __r;
}
@@ -936,7 +936,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __s, __len);
if (!__r)
- __r = __size - __osize;
+ __r = _S_compare(__size, __osize);
return __r;
}
@@ -952,7 +952,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_type __len = std::min(__n1, __osize);
int __r = traits_type::compare(_M_data() + __pos, __s, __len);
if (!__r)
- __r = __n1 - __osize;
+ __r = _S_compare(__n1, __osize);
return __r;
}
@@ -968,7 +968,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_type __len = std::min(__n1, __n2);
int __r = traits_type::compare(_M_data() + __pos, __s, __len);
if (!__r)
- __r = __n1 - __n2;
+ __r = _S_compare(__n1, __n2);
return __r;
}