aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/ext/pointer.h40
-rw-r--r--libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc16
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" }