From 6a344b953a3e8a51808bc260f8f5f2f2f363e2c2 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 28 May 2015 12:53:35 +0100 Subject: [PATCH] re PR libstdc++/65352 (array::begin()/end() etc. forms a null reference and breaks on clang+ubsan) PR libstdc++/65352 * include/std/array (__array_traits::_S_ptr): New function. (array::data): Use _S_ptr to avoid creating invalid reference. * testsuite/23_containers/array/tuple_interface/get_neg.cc: Adjust dg-error line numbers. * testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc: likewise. From-SVN: r223806 --- libstdc++-v3/ChangeLog | 10 ++++++++++ libstdc++-v3/include/std/array | 12 ++++++++++-- .../23_containers/array/tuple_interface/get_neg.cc | 4 ++-- .../array/tuple_interface/tuple_element_neg.cc | 2 +- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cadee8312b4..aea089adef8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2015-05-28 Jonathan Wakely + + PR libstdc++/65352 + * include/std/array (__array_traits::_S_ptr): New function. + (array::data): Use _S_ptr to avoid creating invalid reference. + * testsuite/23_containers/array/tuple_interface/get_neg.cc: Adjust + dg-error line numbers. + * testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc: + likewise. + 2015-05-27 Jonathan Wakely * include/bits/stl_tree.h (_Rb_tree::_M_end()): Return _Base_ptr diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array index 429506b3850..24be44f5b13 100644 --- a/libstdc++-v3/include/std/array +++ b/libstdc++-v3/include/std/array @@ -51,6 +51,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER static constexpr _Tp& _S_ref(const _Type& __t, std::size_t __n) noexcept { return const_cast<_Tp&>(__t[__n]); } + + static constexpr _Tp* + _S_ptr(const _Type& __t) noexcept + { return const_cast<_Tp*>(__t); } }; template @@ -61,6 +65,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER static constexpr _Tp& _S_ref(const _Type&, std::size_t) noexcept { return *static_cast<_Tp*>(nullptr); } + + static constexpr _Tp* + _S_ptr(const _Type&) noexcept + { return nullptr; } }; /** @@ -219,11 +227,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER pointer data() noexcept - { return std::__addressof(_AT_Type::_S_ref(_M_elems, 0)); } + { return _AT_Type::_S_ptr(_M_elems); } const_pointer data() const noexcept - { return std::__addressof(_AT_Type::_S_ref(_M_elems, 0)); } + { return _AT_Type::_S_ptr(_M_elems); } }; // Array comparisons. diff --git a/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc b/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc index 76044125fa3..68309645317 100644 --- a/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc @@ -28,6 +28,6 @@ int n1 = std::get<1>(a); int n2 = std::get<1>(std::move(a)); int n3 = std::get<1>(ca); -// { dg-error "static assertion failed" "" { target *-*-* } 274 } -// { dg-error "static assertion failed" "" { target *-*-* } 283 } +// { dg-error "static assertion failed" "" { target *-*-* } 282 } // { dg-error "static assertion failed" "" { target *-*-* } 291 } +// { dg-error "static assertion failed" "" { target *-*-* } 299 } diff --git a/libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc b/libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc index 9788053a9b1..5d75366611c 100644 --- a/libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc @@ -23,4 +23,4 @@ typedef std::tuple_element<1, std::array>::type type; -// { dg-error "static assertion failed" "" { target *-*-* } 322 } +// { dg-error "static assertion failed" "" { target *-*-* } 330 } -- 2.30.2