From: Jonathan Wakely Date: Thu, 5 Sep 2019 13:48:33 +0000 (+0100) Subject: Improve precondition checks for std::span X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b5c433ce11a140e2221b8acc7dee21abc2a80c90;p=gcc.git Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 8a8ec142e57..2ea0fe4ec40 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,42 @@ +2019-09-05 Jonathan Wakely + + * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and + P1024R3. Remove entry for P0920R2. + * include/std/span (__cpp_lib_span): Change value. + (__extent_storage, __extent_storage): Remove default + constructor. + (span): Replace __extent_storage base class with data member. + (span::_S_subspan_extent): New function. + (span::empty()): Add nodiscard attribute. + (span::front, span::back, span::operator[]): Check preconditions. + (span::first, span::last, span::subspan): Add noexcept. Improve + precondition checks (LWG 3103). + (get): Remove redundant condition from static_assert. + (tuple_element>): Fix static_assert message and simplify. + (as_writable_bytes): Add inline specifier. + * include/std/version (__cpp_lib_span): Change value. + * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. + * testsuite/23_containers/span/front_neg.cc: Likewise. + * testsuite/23_containers/span/index_op_neg.cc: Likewise. + * testsuite/23_containers/span/last_neg.cc: Improve test. + * testsuite/23_containers/span/subspan_neg.cc: Likewise. + * testsuite/23_containers/span/1.cc: New test. + * testsuite/23_containers/span/2.cc: New test. + * testsuite/23_containers/span/back_assert_neg.cc: New test. + * testsuite/23_containers/span/first_2_assert_neg.cc: New test. + * testsuite/23_containers/span/first_assert_neg.cc: New test. + * testsuite/23_containers/span/first_neg.cc: New test. + * testsuite/23_containers/span/front_assert_neg.cc: New test. + * testsuite/23_containers/span/index_op_assert_neg.cc: New test. + * testsuite/23_containers/span/last_2_assert_neg.cc: New test. + * testsuite/23_containers/span/last_assert_neg.cc: New test. + * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. + * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. + * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. + * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. + * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. + * testsuite/23_containers/span/subspan_assert_neg.cc: New test. + 2019-09-05 JeanHeyd Meneide * include/Makefile.am: Add header. diff --git a/libstdc++-v3/doc/html/manual/status.html b/libstdc++-v3/doc/html/manual/status.html index 617d7d2bb38..06269a71455 100644 --- a/libstdc++-v3/doc/html/manual/status.html +++ b/libstdc++-v3/doc/html/manual/status.html @@ -1109,11 +1109,11 @@ Feature-testing recommendations for C++. P0777R1 - 9.1   <span> + 9.1   <span> P0122R7 -   Extending chrono to Calendars and Time Zones + 10.1 __cpp_lib_span >= 201803L Extending chrono to Calendars and Time Zones P0355R7 @@ -1430,17 +1430,13 @@ Feature-testing recommendations for C++. P1252R2 -   +   Usability Enhancements for std::span P1024R3 -   Precalculated hash values in lookup - - P0920R2 - -   Traits for [Un]bounded Arrays + 10.1 __cpp_lib_span >= 201902L Traits for [Un]bounded Arrays P1357R1 diff --git a/libstdc++-v3/doc/xml/manual/status_cxx2020.xml b/libstdc++-v3/doc/xml/manual/status_cxx2020.xml index 3a5de38ad22..ffd73aefc96 100644 --- a/libstdc++-v3/doc/xml/manual/status_cxx2020.xml +++ b/libstdc++-v3/doc/xml/manual/status_cxx2020.xml @@ -237,15 +237,14 @@ Feature-testing recommendations for C++. - <span> P0122R7 - - + 10.1 + __cpp_lib_span >= 201803L @@ -1111,7 +1110,6 @@ Feature-testing recommendations for C++. - Usability Enhancements for std::span @@ -1120,20 +1118,8 @@ Feature-testing recommendations for C++. P1024R3 - - - - - - - Precalculated hash values in lookup - - - P0920R2 - - - - + 10.1 + __cpp_lib_span >= 201902L diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span index 4ce2f31a131..95d778b104b 100644 --- a/libstdc++-v3/include/std/span +++ b/libstdc++-v3/include/std/span @@ -49,9 +49,7 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION -// FIXME: they forgot this feature test macro -// get on someone's back about it in Belfast!!! -#define __cpp_lib_span 201911 +#define __cpp_lib_span 201902L inline constexpr size_t dynamic_extent = static_cast(-1); @@ -78,9 +76,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class __extent_storage { public: - constexpr - __extent_storage() noexcept = default; - constexpr __extent_storage(size_t) noexcept { } @@ -91,13 +86,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION }; template<> - class __extent_storage(-1)> + class __extent_storage { public: - constexpr - __extent_storage() noexcept : _M_extent_value(0) - { }; - constexpr __extent_storage(size_t __extent) noexcept : _M_extent_value(__extent) @@ -114,8 +105,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } // namespace __detail template - class span : private __detail::__extent_storage<_Extent> + class span { + template + static constexpr size_t + _S_subspan_extent() + { + if constexpr (_Count != dynamic_extent) + return _Count; + else if constexpr (extent != dynamic_extent) + return _Extent - _Offset; + else + return dynamic_extent; + } + public: // member types using value_type = remove_cv_t<_Type>; @@ -138,17 +141,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // member constants static inline constexpr size_t extent = _Extent; - private: - using __base_t = __detail::__extent_storage; - - public: // constructors template && (_Extent == dynamic_extent || _Extent == 0)>* = nullptr> constexpr - span() noexcept : __base_t(0), _M_ptr(nullptr) + span() noexcept : _M_extent(0), _M_ptr(nullptr) { } constexpr @@ -234,7 +233,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr span(_ContiguousIterator __first, index_type __count) noexcept(noexcept(::std::__adl_to_address(__first))) - : __base_t(__count), _M_ptr(::std::__adl_to_address(__first)) + : _M_extent(__count), _M_ptr(::std::__adl_to_address(__first)) { __glibcxx_assert(_Extent == dynamic_extent || __count == _Extent); } #else @@ -276,7 +275,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr span(pointer __first, index_type __count) noexcept - : __base_t(__count), _M_ptr(static_cast(__first)) + : _M_extent(__count), _M_ptr(static_cast(__first)) { __glibcxx_assert(_Extent == dynamic_extent || __count == _Extent); } constexpr @@ -290,41 +289,52 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr span& operator=(const span&) noexcept = default; - // observers: element access + // observers + + constexpr index_type + size() const noexcept + { return this->_M_extent._M_extent(); } + + constexpr index_type + size_bytes() const noexcept + { return this->_M_extent._M_extent() * sizeof(element_type); } + + [[nodiscard]] constexpr bool + empty() const noexcept + { return size() == 0; } + + // element access constexpr reference front() const noexcept - { return *this->begin(); } + { + static_assert(extent != 0); + __glibcxx_assert(!empty()); + return *this->_M_ptr; + } constexpr reference back() const noexcept { - iterator __it = this->end(); - --__it; - return *__it; + static_assert(extent != 0); + __glibcxx_assert(!empty()); + return *(this->_M_ptr + (size() - 1)); } constexpr reference operator[](index_type __idx) const noexcept - { return *(this->_M_ptr + __idx); } + { + static_assert(extent != 0); + __glibcxx_assert(__idx < size()); + return *(this->_M_ptr + __idx); + } constexpr pointer data() const noexcept { return this->_M_ptr; } - constexpr index_type - size() const noexcept - { return this->__base_t::_M_extent(); } + // iterator support - constexpr index_type - size_bytes() const noexcept - { return this->__base_t::_M_extent() * sizeof(element_type); } - - constexpr bool - empty() const noexcept - { return size() == 0; } - - // observers: iterator support constexpr iterator begin() const noexcept { return iterator(this->_M_ptr); } @@ -357,70 +367,85 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION crend() const noexcept { return const_reverse_iterator(this->cbegin()); } - // observers: subranges + // subviews + template constexpr span - first() const + first() const noexcept { - __glibcxx_assert(_Count < size()); + if constexpr (_Extent == dynamic_extent) + __glibcxx_assert(_Count <= size()); + else + static_assert(_Count <= extent); return { this->data(), _Count }; } constexpr span - first(index_type __count) const + first(index_type __count) const noexcept { - __glibcxx_assert(__count < size()); + __glibcxx_assert(__count <= size()); return { this->data(), __count }; } template constexpr span - last() const + last() const noexcept { - static_assert(_Count == dynamic_extent || - _Extent == dynamic_extent || _Count <= _Extent, - "Count or Extent are dynamic, " - "or the Count is less than the static extent"); - __glibcxx_assert(_Count <= size()); + if constexpr (_Extent == dynamic_extent) + __glibcxx_assert(_Count <= size()); + else + static_assert(_Count <= extent); return { this->data() + (this->size() - _Count), _Count }; } constexpr span - last(index_type __count) const + last(index_type __count) const noexcept { - __glibcxx_assert(__count < size()); - index_type __offset = (this->size() - __count); - return { this->data() + __offset, __count }; + __glibcxx_assert(__count <= size()); + return { this->data() + (this->size() - __count), __count }; } template constexpr auto - subspan() const + subspan() const noexcept + -> span()> { - static_assert(_Count == dynamic_extent || - _Extent == dynamic_extent || - (_Offset + _Count) <= _Extent, - "Count or Extent are dynamic, " - "or the Count + Offset is less than the static extent"); - constexpr size_t __span_extent = - (_Count != dynamic_extent - ? _Count - : (_Extent != dynamic_extent ? _Extent - _Offset - : dynamic_extent)); - using __span_t = span; - if constexpr(_Count != dynamic_extent) + if constexpr (_Extent == dynamic_extent) + __glibcxx_assert(_Offset <= size()); + else + static_assert(_Offset <= extent); + + if constexpr (_Count == dynamic_extent) + return { this->data() + _Offset, this->size() - _Offset }; + else { - __glibcxx_assert((_Offset + _Count) < size()); + if constexpr (_Extent == dynamic_extent) + { + __glibcxx_assert(_Count <= size()); + __glibcxx_assert(_Count <= (size() - _Offset)); + } + else + { + static_assert(_Count <= extent); + static_assert(_Count <= (extent - _Offset)); + } + return { this->data() + _Offset, _Count }; } - return __span_t(this->data() + _Offset, - (_Count == dynamic_extent ? this->size() - _Offset : _Count)); } constexpr span subspan(index_type __offset, index_type __count = dynamic_extent) const + noexcept { - return {this->data() + __offset, - __count == dynamic_extent ? this->size() - __offset : __count}; + __glibcxx_assert(__offset <= size()); + if (__count == dynamic_extent) + __count = this->size() - __offset; + else + { + __glibcxx_assert(__count <= size()); + __glibcxx_assert(__offset + __count <= size()); + } + return {this->data() + __offset, __count}; } // observers: range helpers @@ -434,51 +459,54 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __sp.end(); } private: + [[no_unique_address]] __detail::__extent_storage _M_extent; pointer _M_ptr; }; // deduction guides template - span(_Type(&)[_ArrayExtent])->span<_Type, _ArrayExtent>; + span(_Type(&)[_ArrayExtent]) -> span<_Type, _ArrayExtent>; template - span(array<_Type, _ArrayExtent>&)->span<_Type, _ArrayExtent>; + span(array<_Type, _ArrayExtent>&) -> span<_Type, _ArrayExtent>; template span(const array<_Type, _ArrayExtent>&) - ->span; + -> span; #if defined(_GLIBCXX_P1394) && _GLIBCXX_P1394 template span(_ContiguousIterator, _Sentinel) - ->span span::reference>>; template span(_Range &&) - ->span()))>::reference>>; + -> span()))>::reference>>; #else template - span(_Container&)->span; + span(_Container&) -> span; template - span(const _Container&)->span; + span(const _Container&) -> span; #endif // P1394 template + inline span - inline as_bytes(span<_Type, _Extent> __sp) noexcept + as_bytes(span<_Type, _Extent> __sp) noexcept { return {reinterpret_cast(__sp.data()), __sp.size_bytes()}; } template + inline span as_writable_bytes(span<_Type, _Extent> __sp) noexcept @@ -491,9 +519,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr _Type& get(span<_Type, _Extent> __sp) noexcept { - static_assert(_Extent != dynamic_extent - && (_Extent > 0) && (_Index < _Extent), - "std::get can only be used with a span of non-dynamic (fixed) extent"); + static_assert(_Extent != dynamic_extent && _Index < _Extent, + "get can only be used with a span of non-dynamic (fixed) extent"); return __sp[_Index]; } @@ -508,10 +535,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct tuple_element<_Index, span<_Type, _Extent>> { - static_assert(_Extent != dynamic_extent, "tuple_size can only " + static_assert(_Extent != dynamic_extent, "tuple_element can only " "be used with a span of non-dynamic (fixed) extent"); static_assert(_Index < _Extent, "Index is less than Extent"); - using type = typename span<_Type, _Extent>::element_type; + using type = _Type; }; _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/include/std/version b/libstdc++-v3/include/std/version index 4341c9f0c1b..7625d397a0d 100644 --- a/libstdc++-v3/include/std/version +++ b/libstdc++-v3/include/std/version @@ -166,10 +166,8 @@ #endif #define __cpp_lib_list_remove_return_type 201806L #define __cpp_lib_math_constants 201907L +#define __cpp_lib_span 201902L #define __cpp_lib_to_array 201907L -// FIXME: they forgot this feature test macro -// get on someone's back about it in Belfast!!! -#define __cpp_lib_span 201911 #endif // C++2a #endif // C++17 #endif // C++14 diff --git a/libstdc++-v3/testsuite/23_containers/span/1.cc b/libstdc++-v3/testsuite/23_containers/span/1.cc new file mode 100644 index 00000000000..c31d8d400ce --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/1.cc @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +#ifndef __cpp_lib_span +# error "Feature-test macro for span missing in " +#elif __cpp_lib_span != 201902L +# error "Feature-test macro for span has wrong value in " +#endif diff --git a/libstdc++-v3/testsuite/23_containers/span/2.cc b/libstdc++-v3/testsuite/23_containers/span/2.cc new file mode 100644 index 00000000000..1870ba16973 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/2.cc @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +#ifndef __cpp_lib_span +# error "Feature-test macro for span missing in " +#elif __cpp_lib_span != 201902L +# error "Feature-test macro for span has wrong value in " +#endif diff --git a/libstdc++-v3/testsuite/23_containers/span/back_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/back_assert_neg.cc new file mode 100644 index 00000000000..0b8fc672a20 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/back_assert_neg.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + std::span s; + s.back(); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/back_neg.cc b/libstdc++-v3/testsuite/23_containers/span/back_neg.cc new file mode 100644 index 00000000000..b1bb10f40d1 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/back_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +void +test01() +{ + std::span s; + s.back(); // { dg-error "here" } +} +// { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/23_containers/span/first_2_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/first_2_assert_neg.cc new file mode 100644 index 00000000000..fd9c9204d1e --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/first_2_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.first(5); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/first_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/first_assert_neg.cc new file mode 100644 index 00000000000..94f1f03a64a --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/first_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.first<5>(); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/first_neg.cc b/libstdc++-v3/testsuite/23_containers/span/first_neg.cc new file mode 100644 index 00000000000..42729347d33 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/first_neg.cc @@ -0,0 +1,30 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +void +test01() +{ + int a[4]; + std::span s(a); + s.first<5>(); // { dg-error "here" } +} +// { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/23_containers/span/front_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/front_assert_neg.cc new file mode 100644 index 00000000000..516bf2a2dcb --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/front_assert_neg.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + std::span s; + s.front(); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/front_neg.cc b/libstdc++-v3/testsuite/23_containers/span/front_neg.cc new file mode 100644 index 00000000000..4c2b6e39c70 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/front_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +void +test01() +{ + std::span s; + s.front(); // { dg-error "here" } +} +// { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/23_containers/span/index_op_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/index_op_assert_neg.cc new file mode 100644 index 00000000000..4109c4cdc7a --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/index_op_assert_neg.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + std::span s; + s[99]; +} diff --git a/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc b/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc new file mode 100644 index 00000000000..5bd1e11dda0 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +void +test01() +{ + std::span s; + s[99]; // { dg-error "here" } +} +// { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/23_containers/span/last_2_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/last_2_assert_neg.cc new file mode 100644 index 00000000000..1cc060f4735 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/last_2_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.last(5); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/last_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/last_assert_neg.cc new file mode 100644 index 00000000000..31b6cc0816f --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/last_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.last<5>(); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/last_neg.cc b/libstdc++-v3/testsuite/23_containers/span/last_neg.cc index 8f0145f7012..ac77dbe4438 100644 --- a/libstdc++-v3/testsuite/23_containers/span/last_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/span/last_neg.cc @@ -15,15 +15,16 @@ // with this library; see the file COPYING3. If not see // . -// { dg-options "-std=c++2a" } +// { dg-options "-std=gnu++2a" } // { dg-do compile { target c++2a } } #include -int -main() +void +test01() { - std::span myspan(nullptr, 2); - myspan.last<3>(); // { dg-error "here" } + int a[2]; + std::span s(a); + s.last<3>(); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/23_containers/span/subspan_2_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/subspan_2_assert_neg.cc new file mode 100644 index 00000000000..355a71c9d9d --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/subspan_2_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.subspan<2, 5>(); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/subspan_3_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/subspan_3_assert_neg.cc new file mode 100644 index 00000000000..bdf4abad2c6 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/subspan_3_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.subspan<2, 3>(); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/subspan_4_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/subspan_4_assert_neg.cc new file mode 100644 index 00000000000..37ebed038fa --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/subspan_4_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.subspan(5, 0); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/subspan_5_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/subspan_5_assert_neg.cc new file mode 100644 index 00000000000..615ea0ba559 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/subspan_5_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.subspan(2, 5); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/subspan_6_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/subspan_6_assert_neg.cc new file mode 100644 index 00000000000..db5f427b35f --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/subspan_6_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.subspan(2, 3); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/subspan_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/subspan_assert_neg.cc new file mode 100644 index 00000000000..d120d436c23 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/subspan_assert_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { xfail c++2a } } + +#define _GLIBCXX_ASSERTIONS +#include + +int main() +{ + int a[4]; + std::span s(a); + s.subspan<5, 0>(); +} diff --git a/libstdc++-v3/testsuite/23_containers/span/subspan_neg.cc b/libstdc++-v3/testsuite/23_containers/span/subspan_neg.cc index 5ecbff937cc..70fcda6e91a 100644 --- a/libstdc++-v3/testsuite/23_containers/span/subspan_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/span/subspan_neg.cc @@ -15,15 +15,33 @@ // with this library; see the file COPYING3. If not see // . -// { dg-options "-std=c++2a" } +// { dg-options "-std=gnu++2a" } // { dg-do compile { target c++2a } } #include -int -main() +void +test01() { - std::span myspan(nullptr, 2); - myspan.subspan<3, 1>(); // { dg-error "here" } + int a[4]; + std::span s(a); + s.subspan<5, 0>(); // { dg-error "here" } } + +void +test02() +{ + int a[4]; + std::span s(a); + s.subspan<3, 5>(); // { dg-error "here" } +} + +void +test03() +{ + int a[4]; + std::span s(a); + s.subspan<3, 2>(); // { dg-error "here" } +} + // { dg-error "static assertion failed" "" { target *-*-* } 0 }