diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-10-12 14:04:44 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-10-12 14:04:44 +0100 |
commit | 2d3a867807bedc27b0fbf2c6e8d4cf557d5e43c9 (patch) | |
tree | 8294dad9ea0ccf695bb7ece32f588e5cb220b26c | |
parent | f993eed162d0b0e7ff8740893ebb7802a51f71b1 (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/pointer.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/ext/ext_pointer/1.cc | 14 |
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; } |