]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix __gnu_cxx::_Pointer_adapter for long long arithmetic
authorJonathan Wakely <jwakely@redhat.com>
Fri, 12 Oct 2018 13:04:44 +0000 (14:04 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 12 Oct 2018 13:04:44 +0000 (14:04 +0100)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/pointer.h
libstdc++-v3/testsuite/ext/ext_pointer/1.cc

index f5764441f0b0545c75e957166e83277a11d4a703..6f78ace928f1375a33bdc02640d690faacdf8d94 100644 (file)
@@ -1,3 +1,13 @@
+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
index 75c8fbeae4529f03af58331b91ea33deb7ea63e2..9c638477f0f8ee11c430372334e4791e687e965b 100644 (file)
@@ -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& 
index 3c61866b97813789576844f730c4c12d75fadb72..ebce1979c9b2bb8134603599cbd49cedf4564f9d 100644 (file)
@@ -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;
 }