mirror of git://gcc.gnu.org/git/gcc.git
re PR libstdc++/38720 (_Relative_pointer_impl invokes undefined behavior)
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. From-SVN: r143058
This commit is contained in:
parent
70e72065c3
commit
9c01326d9a
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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" }
|
||||
|
||||
|
|
Loading…
Reference in New Issue