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;
     }