* 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.
Tested x86_64-linux, committed to trunk.
commit af21edc2b1e8b124b55d2f1a7bd34eeb7fccb889 Author: Jonathan Wakely <jwak...@redhat.com> Date: Thu Aug 30 12:21:33 2018 +0100 Fix __gnu_cxx::_Pointer_adapter for long long arithmetic * 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. diff --git a/libstdc++-v3/include/ext/pointer.h b/libstdc++-v3/include/ext/pointer.h index ee5c30dfa64..1e89c3779af 100644 --- a/libstdc++-v3/include/ext/pointer.h +++ b/libstdc++-v3/include/ext/pointer.h @@ -441,6 +441,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 351a9775ec8..bbedc43b12e 100644 --- a/libstdc++-v3/testsuite/ext/ext_pointer/1.cc +++ b/libstdc++-v3/testsuite/ext/ext_pointer/1.cc @@ -180,11 +180,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; }