diff options
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/pointer.h | 40 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc | 16 |
3 files changed, 40 insertions, 23 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cdf2770..94f3bd7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2009-01-04 Richard Guenther <rguenther@suse.de> + + PR libstdc++/38720 + * include/ext/pointer.h (_Relative_pointer_impl): Use an unsigned + integer type for storage, arithmetic and comparisons. + * testsuite/ext/ext_pointer/1_neg.cc: Adjust line numbers. + 2009-01-04 Paolo Carlini <paolo.carlini@oracle.com> PR libstdc++/38719 diff --git a/libstdc++-v3/include/ext/pointer.h b/libstdc++-v3/include/ext/pointer.h index 5c764cf..ff409b6 100644 --- a/libstdc++-v3/include/ext/pointer.h +++ b/libstdc++-v3/include/ext/pointer.h @@ -42,6 +42,7 @@ #include <iosfwd> #include <bits/stl_iterator_base_types.h> #include <ext/cast.h> +#include <ext/type_traits.h> _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) @@ -111,9 +112,8 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) if (_M_diff == 1) return 0; else - return reinterpret_cast<_Tp*>( - const_cast<char*>(reinterpret_cast<const char*>(this)) - + _M_diff); + return reinterpret_cast<_Tp*>(reinterpret_cast<_UIntPtrType>(this) + + _M_diff); } void @@ -122,21 +122,26 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) if (!__arg) _M_diff = 1; else - _M_diff = reinterpret_cast<char*>(__arg) - - reinterpret_cast<char*>(this); + _M_diff = reinterpret_cast<_UIntPtrType>(__arg) + - reinterpret_cast<_UIntPtrType>(this); } // Comparison of pointers inline bool operator<(const _Relative_pointer_impl& __rarg) const - { return (this->get() < __rarg.get()); } + { return (reinterpret_cast<_UIntPtrType>(this->get()) + < reinterpret_cast<_UIntPtrType>(__rarg.get())); } inline bool operator==(const _Relative_pointer_impl& __rarg) const - { return (this->get() == __rarg.get()); } + { return (reinterpret_cast<_UIntPtrType>(this->get()) + == reinterpret_cast<_UIntPtrType>(__rarg.get())); } private: - std::ptrdiff_t _M_diff; + typedef __gnu_cxx::__conditional_type< + (sizeof(unsigned long) >= sizeof(void*)), + unsigned long, unsigned long long>::__type _UIntPtrType; + _UIntPtrType _M_diff; }; /** @@ -155,8 +160,8 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) if (_M_diff == 1) return 0; else - return reinterpret_cast<const _Tp*>( - (reinterpret_cast<const char*>(this)) + _M_diff); + return reinterpret_cast<const _Tp*> + (reinterpret_cast<_UIntPtrType>(this) + _M_diff); } void @@ -165,21 +170,26 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) if (!__arg) _M_diff = 1; else - _M_diff = reinterpret_cast<const char*>(__arg) - - reinterpret_cast<const char*>(this); + _M_diff = reinterpret_cast<_UIntPtrType>(__arg) + - reinterpret_cast<_UIntPtrType>(this); } // Comparison of pointers inline bool operator<(const _Relative_pointer_impl& __rarg) const - { return (this->get() < __rarg.get()); } + { return (reinterpret_cast<_UIntPtrType>(this->get()) + < reinterpret_cast<_UIntPtrType>(__rarg.get())); } inline bool operator==(const _Relative_pointer_impl& __rarg) const - { return (this->get() == __rarg.get()); } + { return (reinterpret_cast<_UIntPtrType>(this->get()) + == reinterpret_cast<_UIntPtrType>(__rarg.get())); } private: - std::ptrdiff_t _M_diff; + typedef __gnu_cxx::__conditional_type + <(sizeof(unsigned long) >= sizeof(void*)), + unsigned long, unsigned long long>::__type _UIntPtrType; + _UIntPtrType _M_diff; }; /** diff --git a/libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc b/libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc index 452de7b..f9f7454 100644 --- a/libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc +++ b/libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc @@ -100,13 +100,13 @@ void test01(void) { aptr5 = __const_pointer_cast<B_pointer>(cbptr); // ok } -// { dg-error "invalid conversion " "" { target *-*-* } 289 } -// { dg-error "initializing argument 1 of" "" { target *-*-* } 289 } -// { dg-error "invalid conversion " "" { target *-*-* } 295 } -// { dg-error "initializing argument 1 of" "" { target *-*-* } 295 } -// { dg-error "invalid conversion " "" { target *-*-* } 312 } -// { dg-error "initializing argument 1 of" "" { target *-*-* } 312 } -// { dg-error "invalid conversion " "" { target *-*-* } 320 } -// { dg-error "initializing argument 1 of" "" { target *-*-* } 320 } +// { dg-error "invalid conversion " "" { target *-*-* } 299 } +// { dg-error "initializing argument 1 of" "" { target *-*-* } 299 } +// { dg-error "invalid conversion " "" { target *-*-* } 305 } +// { dg-error "initializing argument 1 of" "" { target *-*-* } 305 } +// { dg-error "invalid conversion " "" { target *-*-* } 322 } +// { dg-error "initializing argument 1 of" "" { target *-*-* } 322 } +// { dg-error "invalid conversion " "" { target *-*-* } 330 } +// { dg-error "initializing argument 1 of" "" { target *-*-* } 330 } // { dg-excess-errors "In constructor" } |