aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-10-12 14:04:44 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-10-12 14:04:44 +0100
commit2d3a867807bedc27b0fbf2c6e8d4cf557d5e43c9 (patch)
tree8294dad9ea0ccf695bb7ece32f588e5cb220b26c
parentf993eed162d0b0e7ff8740893ebb7802a51f71b1 (diff)
downloadgcc-2d3a867807bedc27b0fbf2c6e8d4cf557d5e43c9.zip
gcc-2d3a867807bedc27b0fbf2c6e8d4cf557d5e43c9.tar.gz
gcc-2d3a867807bedc27b0fbf2c6e8d4cf557d5e43c9.tar.bz2
Fix __gnu_cxx::_Pointer_adapter for long long arithmetic
Backport from mainline 2018-08-30 Jonathan Wakely <jwakely@redhat.com> * include/ext/pointer.h (_Pointer_adapter): Define operators for pointer arithmetic using long long offsets. * testsuite/ext/ext_pointer/1.cc: Test pointer arithmetic using long long values. From-SVN: r265099
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/include/ext/pointer.h4
-rw-r--r--libstdc++-v3/testsuite/ext/ext_pointer/1.cc14
3 files changed, 28 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f576444..6f78ace 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,6 +1,16 @@
2018-10-12 Jonathan Wakely <jwakely@redhat.com>
Backport from mainline
+ 2018-08-30 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/ext/pointer.h (_Pointer_adapter): Define operators for
+ pointer arithmetic using long long offsets.
+ * testsuite/ext/ext_pointer/1.cc: Test pointer arithmetic using
+ long long values.
+
+2018-10-12 Jonathan Wakely <jwakely@redhat.com>
+
+ Backport from mainline
2018-08-22 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/87061
diff --git a/libstdc++-v3/include/ext/pointer.h b/libstdc++-v3/include/ext/pointer.h
index 75c8fbe..9c63847 100644
--- a/libstdc++-v3/include/ext/pointer.h
+++ b/libstdc++-v3/include/ext/pointer.h
@@ -437,6 +437,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_CXX_POINTER_ARITH_OPERATOR_SET(unsigned int);
_CXX_POINTER_ARITH_OPERATOR_SET(long);
_CXX_POINTER_ARITH_OPERATOR_SET(unsigned long);
+#ifdef _GLIBCXX_USE_LONG_LONG
+ _CXX_POINTER_ARITH_OPERATOR_SET(long long);
+ _CXX_POINTER_ARITH_OPERATOR_SET(unsigned long long);
+#endif
// Mathematical Manipulators
inline _Pointer_adapter&
diff --git a/libstdc++-v3/testsuite/ext/ext_pointer/1.cc b/libstdc++-v3/testsuite/ext/ext_pointer/1.cc
index 3c61866..ebce1979 100644
--- a/libstdc++-v3/testsuite/ext/ext_pointer/1.cc
+++ b/libstdc++-v3/testsuite/ext/ext_pointer/1.cc
@@ -188,11 +188,25 @@ void test04() {
VERIFY(bPtr3 == aPtr);
}
+// Check that long long values can be used for pointer arithmetic.
+void test05()
+{
+ A a[2] = { 1, 2 };
+ A_pointer p = a;
+ A_pointer q = p + 0ull;
+ VERIFY( p == q );
+ q += 0ll;
+ VERIFY( p == q );
+ q += 1ll;
+ VERIFY( q->i == p[1ll].i );
+}
+
int main()
{
test01();
test02();
test03();
test04();
+ test05();
return 0;
}