From: Richard Guenther Date: Sun, 4 Jan 2009 19:51:18 +0000 (+0000) Subject: re PR libstdc++/38720 (_Relative_pointer_impl invokes undefined behavior) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9c01326d9a6d56c381ef139a2c25953f483feec8;p=gcc.git re PR libstdc++/38720 (_Relative_pointer_impl invokes undefined behavior) 2009-01-04 Richard Guenther 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. From-SVN: r143058 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cdf2770f945..94f3bd7dfac 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2009-01-04 Richard Guenther + + 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 PR libstdc++/38719 diff --git a/libstdc++-v3/include/ext/pointer.h b/libstdc++-v3/include/ext/pointer.h index 5c764cfd4b0..ff409b6557e 100644 --- a/libstdc++-v3/include/ext/pointer.h +++ b/libstdc++-v3/include/ext/pointer.h @@ -42,6 +42,7 @@ #include #include #include +#include _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(reinterpret_cast(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(__arg) - - reinterpret_cast(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( - (reinterpret_cast(this)) + _M_diff); + return reinterpret_cast + (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(__arg) - - reinterpret_cast(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 452de7b6b8e..f9f7454ce8c 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(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" }