From 5a03fc9c613523eb2166854c30608916d608c5d1 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Fri, 10 May 2024 08:31:14 -0700 Subject: [PATCH 1/9] Remove some extra 'noexcept's in span; add tests to ensure that they're all correct now --- groups/bsl/bslstl/bslstl_span.h | 65 +++--- groups/bsl/bslstl/bslstl_span.t.cpp | 320 ++++++++++++++++++++++++---- 2 files changed, 309 insertions(+), 76 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.h b/groups/bsl/bslstl/bslstl_span.h index 465acfb5d8..6244f62def 100644 --- a/groups/bsl/bslstl/bslstl_span.h +++ b/groups/bsl/bslstl/bslstl_span.h @@ -409,7 +409,7 @@ class span { // Destroy this object. // ACCESSORS - BSLS_KEYWORD_CONSTEXPR_CPP14 reference back() const BSLS_KEYWORD_NOEXCEPT + BSLS_KEYWORD_CONSTEXPR_CPP14 reference back() const // Return a reference to the last element of this span. The behavior // is undefined if this span is empty. { @@ -427,19 +427,19 @@ class span { template BSLS_KEYWORD_CONSTEXPR_CPP14 - span first() const BSLS_KEYWORD_NOEXCEPT; + span first() const; // Return a statically-sized span consisting of the first 'COUNT' // elements of this span. The behavior is undefined unless // 'COUNT <= size()'. BSLS_KEYWORD_CONSTEXPR_CPP14 span - first(size_type count) const BSLS_KEYWORD_NOEXCEPT; + first(size_type count) const; // Return a dynamically-sized span consisting of the first (specified) // 'count' elements of this span. The behavior is undefined unless // 'count <= size()'. - BSLS_KEYWORD_CONSTEXPR_CPP14 reference front() const BSLS_KEYWORD_NOEXCEPT + BSLS_KEYWORD_CONSTEXPR_CPP14 reference front() const // Return a reference to the first element of this span. The behavior // is undefined if this span is empty. { @@ -450,14 +450,14 @@ class span { template BSLS_KEYWORD_CONSTEXPR_CPP14 - span last() const BSLS_KEYWORD_NOEXCEPT; + span last() const; // Return a statically-sized span consisting of the last 'COUNT' // elements of this span. The behavior is undefined unless // 'COUNT <= size()'. BSLS_KEYWORD_CONSTEXPR_CPP14 span - last(size_type count) const BSLS_KEYWORD_NOEXCEPT; + last(size_type count) const; // Return a dynamically-sized span consisting of the last (specified) // 'count' elements of this span. The behavior is undefined unless // 'count <= size()'. @@ -480,7 +480,7 @@ class span { #endif BSLS_KEYWORD_CONSTEXPR_CPP14 typename Span_Utility::SubspanReturnType::type - subspan() const BSLS_KEYWORD_NOEXCEPT + subspan() const // If the template parameter 'COUNT' is 'dynamic_extent', return a // dynamically-sized span consisting consisting of the elements of this // span in the half-open range '[OFFSET, EXTENT)'. Otherwise, return a @@ -501,8 +501,7 @@ class span { BSLS_KEYWORD_CONSTEXPR_CPP14 span - subspan(size_type offset, size_type count = dynamic_extent) - const BSLS_KEYWORD_NOEXCEPT; + subspan(size_type offset, size_type count = dynamic_extent) const; // Return a dynamically-sized span starting at the specified 'offset'. // If the optionally specified 'count' is 'dynamic_extent', the span // will consist of the half-open range '[offset, size () - offset)' and @@ -511,7 +510,7 @@ class span { // behavior is undefined if 'offset + count > size()'. BSLS_KEYWORD_CONSTEXPR_CPP14 - reference operator[](size_type index) const BSLS_KEYWORD_NOEXCEPT + reference operator[](size_type index) const // Return a reference to the element at the specified 'index'. The // behavior is undefined unless 'index < size()'. { @@ -736,7 +735,7 @@ class span { // Destroy this object. // ACCESSORS - BSLS_KEYWORD_CONSTEXPR_CPP14 reference back() const BSLS_KEYWORD_NOEXCEPT; + BSLS_KEYWORD_CONSTEXPR_CPP14 reference back() const; // Return a reference to the last element of this span. The behavior // is undefined if this span is empty. @@ -748,32 +747,32 @@ class span { template BSLS_KEYWORD_CONSTEXPR_CPP14 - span first() const BSLS_KEYWORD_NOEXCEPT; + span first() const; // Return a statically-sized span consisting of the first 'COUNT' // elements of this span. The behavior is undefined unless // 'COUNT <= size()'. BSLS_KEYWORD_CONSTEXPR_CPP14 span - first(size_type count) const BSLS_KEYWORD_NOEXCEPT; + first(size_type count) const; // Return a dynamically-sized span consisting of the first (specified) // 'count' elements of this span. The behavior is undefined unless // 'count <= size()'. - BSLS_KEYWORD_CONSTEXPR_CPP14 reference front() const BSLS_KEYWORD_NOEXCEPT; + BSLS_KEYWORD_CONSTEXPR_CPP14 reference front() const; // Return a reference to the first element of this span. The behavior // is undefined if this span is empty. template BSLS_KEYWORD_CONSTEXPR_CPP14 - span last() const BSLS_KEYWORD_NOEXCEPT; + span last() const; // Return a statically-sized span consisting of the last 'COUNT' // elements of this span. The behavior is undefined unless // 'COUNT <= size()'. BSLS_KEYWORD_CONSTEXPR_CPP14 span - last(size_type count) const BSLS_KEYWORD_NOEXCEPT; + last(size_type count) const; // Return a dynamically-sized span consisting of the last (specified) // 'count' elements of this span. The behavior is undefined unless // 'count <= size()'. @@ -791,14 +790,13 @@ class span { size_t COUNT> #endif BSLS_KEYWORD_CONSTEXPR_CPP14 - span subspan() const BSLS_KEYWORD_NOEXCEPT; + span subspan() const; // Return a dynamically-sized span consisting of the 'COUNT' elements // of this span starting at 'OFFSET'. The behavior is undefined unless // 'COUNT + OFFSET <= size()'. BSLS_KEYWORD_CONSTEXPR_CPP14 span - subspan(size_type offset, size_type count = dynamic_extent) - const BSLS_KEYWORD_NOEXCEPT; + subspan(size_type offset, size_type count = dynamic_extent) const; // Return a dynamically-sized span starting at the specified 'offset'. // If the optionally specified 'count' is 'dynamic_extent', the span // will consist of the half-open range '[offset, size () - offset)' and @@ -807,7 +805,7 @@ class span { // behavior is undefined unless 'offset + count <= size()'. BSLS_KEYWORD_CONSTEXPR_CPP14 - reference operator[](size_type index) const BSLS_KEYWORD_NOEXCEPT; + reference operator[](size_type index) const; // Return a reference to the element at the specified 'index'. The // behavior is undefined unless 'index < size()'. @@ -1084,7 +1082,7 @@ template template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span -bsl::span::first() const BSLS_KEYWORD_NOEXCEPT +bsl::span::first() const { typedef bsl::span ReturnType; BSLMF_ASSERT(COUNT <= EXTENT); @@ -1094,7 +1092,7 @@ bsl::span::first() const BSLS_KEYWORD_NOEXCEPT template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span -bsl::span::first(size_type count) const BSLS_KEYWORD_NOEXCEPT +bsl::span::first(size_type count) const { typedef bsl::span ReturnType; BSLS_ASSERT(count <= size()); @@ -1105,7 +1103,7 @@ template template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span -bsl::span::last() const BSLS_KEYWORD_NOEXCEPT +bsl::span::last() const { typedef bsl::span ReturnType; BSLMF_ASSERT(COUNT <= EXTENT); @@ -1115,7 +1113,7 @@ bsl::span::last() const BSLS_KEYWORD_NOEXCEPT template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span -bsl::span::last(size_type count) const BSLS_KEYWORD_NOEXCEPT +bsl::span::last(size_type count) const { typedef bsl::span ReturnType; BSLS_ASSERT(count <= size()); @@ -1134,7 +1132,6 @@ template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span bsl::span::subspan(size_type offset, size_type count) const - BSLS_KEYWORD_NOEXCEPT { typedef bsl::span ReturnType; BSLS_ASSERT(offset <= size()); @@ -1384,7 +1381,7 @@ bsl::span::span( template BSLS_KEYWORD_CONSTEXPR_CPP14 inline typename bsl::span::reference -bsl::span::back() const BSLS_KEYWORD_NOEXCEPT +bsl::span::back() const { BSLS_ASSERT(size() > 0); return d_data_p[size() - 1]; @@ -1410,7 +1407,7 @@ template template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span -bsl::span::first() const BSLS_KEYWORD_NOEXCEPT +bsl::span::first() const { typedef bsl::span ReturnType; BSLS_ASSERT(COUNT <= size()); @@ -1421,7 +1418,6 @@ template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span bsl::span::first(size_type count) const - BSLS_KEYWORD_NOEXCEPT { typedef bsl::span ReturnType; BSLS_ASSERT(count <= size()); @@ -1431,7 +1427,7 @@ bsl::span::first(size_type count) const template BSLS_KEYWORD_CONSTEXPR_CPP14 inline typename bsl::span::reference -bsl::span::front() const BSLS_KEYWORD_NOEXCEPT +bsl::span::front() const { BSLS_ASSERT(size() > 0); return d_data_p[0]; @@ -1441,7 +1437,7 @@ template template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span -bsl::span::last() const BSLS_KEYWORD_NOEXCEPT +bsl::span::last() const { typedef bsl::span ReturnType; BSLS_ASSERT(COUNT <= size()); @@ -1452,7 +1448,6 @@ template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span bsl::span::last(size_type count) const - BSLS_KEYWORD_NOEXCEPT { typedef bsl::span ReturnType; BSLS_ASSERT(count <= size()); @@ -1480,7 +1475,7 @@ template template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span -bsl::span::subspan() const BSLS_KEYWORD_NOEXCEPT +bsl::span::subspan() const { typedef bsl::span ReturnType; BSLS_ASSERT(OFFSET <= size()); @@ -1492,9 +1487,8 @@ bsl::span::subspan() const BSLS_KEYWORD_NOEXCEPT template BSLS_KEYWORD_CONSTEXPR_CPP14 inline bsl::span -bsl::span::subspan( - size_type offset, - size_type count) const BSLS_KEYWORD_NOEXCEPT +bsl::span::subspan(size_type offset, + size_type count) const { typedef bsl::span ReturnType; BSLS_ASSERT(offset <= size()); @@ -1510,7 +1504,6 @@ template BSLS_KEYWORD_CONSTEXPR_CPP14 inline typename bsl::span::reference bsl::span::operator[](size_type index) const - BSLS_KEYWORD_NOEXCEPT { BSLS_ASSERT(index < size()); return d_data_p[index]; diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index e5db23d90e..e64f00d5ad 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -23,40 +23,40 @@ // TEST PLAN //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -// [ 2] span(); +// [ 2] span() noexcept; // [ 2] span(pointer, size_type); // [ 2] span(pointer, pointer); -// [ 2] span(element_type (&arr)[SIZE]); -// [ 2] span(const span &); -// [ 2] span(span); -// [ 2] operator=(const span &); -// [ 3] span(array&); -// [ 3] span(const array&); -// [ 3] span(std::array&); -// [ 3] span(const std::array&); +// [ 2] span(element_type (&arr)[SIZE]) noexcept; +// [ 2] span(const span &) noexcept; +// [ 2] span(span) noexcept; +// [ 2] operator=(const span &) noexcept; +// [ 3] span(array&) noexcept; +// [ 3] span(const array&) noexcept; +// [ 3] span(std::array&) noexcept; +// [ 3] span(const std::array&) noexcept; // [ 3] span(CONTAINER& c); // [ 3] span(const CONTAINER& c); // [ 4] reference front(); // [ 4] reference back(); // [ 4] reference operator[](size_type); -// [ 4] bool empty(); +// [ 4] bool empty() noexcept; // [ 4] size_type extent; -// [ 4] size_type size(); -// [ 4] size_type size_bytes(); -// [ 4] pointer data(); +// [ 4] size_type size() noexcept; +// [ 4] size_type size_bytes() noexcept; +// [ 4] pointer data() noexcept; // [ 5] template first(); // [ 5] template last(); // [ 5] first(size_t count); // [ 5] last(size_t count); // [ 5] template subspan(); // [ 5] subspan(size_t count, size_t offset); -// [ 6] iterator begin(); -// [ 6] iterator end(); -// [ 6] reverse_iterator rbegin(); -// [ 6] reverse_iterator rend(); -// [ 7] void swap(span a, span b); -// [ 7] span as_bytes(span); -// [ 7] span as_writable_bytes(span); +// [ 6] iterator begin() noexcept; +// [ 6] iterator end() noexcept; +// [ 6] reverse_iterator rbegin() noexcept; +// [ 6] reverse_iterator rend() noexcept; +// [ 7] void swap(span a, span b) noexcept; +// [ 7] span as_bytes(span) noexcept; +// [ 7] span as_writable_bytes(span) noexcept; // ---------------------------------------------------------------------------- // [ 1] BREATHING TEST // [ 8] CLASS TEMPLATE DEDUCTION GUIDES @@ -164,6 +164,12 @@ void TestBasicConstructors() { bsl::span defS; bsl::span defD; + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::span())); + ASSERT( noexcept(bsl::span())); +#endif + ASSERT(NULL == defS.data()); ASSERT(0 == defS.size()); ASSERT(NULL == defD.data()); @@ -174,6 +180,12 @@ void TestBasicConstructors() { bsl::span psS(&arr[5], 5); bsl::span psD(&arr[3], 3); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept(bsl::span(&arr[5], 5))); + ASSERT(!noexcept(bsl::span(&arr[5], 5))); +#endif + ASSERT(&arr[5] == psS.data()); ASSERT(5 == psS.size()); ASSERT(&arr[3] == psD.data()); @@ -184,6 +196,11 @@ void TestBasicConstructors() { bsl::span ppS(&arr[5], &arr[10]); bsl::span ppD(&arr[3], &arr[6]); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept(bsl::span(&arr[5], &arr[10]))); + ASSERT(!noexcept(bsl::span(&arr[3], &arr[6]))); +#endif ASSERT(&arr[5] == ppS.data()); ASSERT(5 == ppS.size()); ASSERT(&arr[3] == ppD.data()); @@ -194,6 +211,12 @@ void TestBasicConstructors() { bsl::span arrS(arr); bsl::span arrD(arr); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::span(arr))); + ASSERT( noexcept(bsl::span(arr))); +#endif + ASSERT(&arr[0] == arrS.data()); ASSERT(10 == arrS.size()); ASSERT(&arr[0] == arrD.data()); @@ -209,6 +232,13 @@ void TestBasicConstructors() bsl::span sD1b(sS); bsl::span sS2a(sD); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::span(sS))); + ASSERT( noexcept(bsl::span(sS))); + ASSERT( noexcept(bsl::span(sD))); + ASSERT( noexcept(bsl::span(sD))); +#endif + ASSERT(&arr[5] == sS1.data()); ASSERT(5 == sS1.size()); ASSERT(&arr[3] == sD1a.data()); @@ -227,6 +257,12 @@ void TestBasicConstructors() bsl::span psD1a(psD); bsl::span psD1b(psS); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::span(psS))); + ASSERT( noexcept(bsl::span(psS))); + ASSERT( noexcept(bsl::span(psD))); +#endif + ASSERT(&arr[5] == psS1.data()); ASSERT(5 == psS1.size()); ASSERT(&arr[3] == psD1a.data()); @@ -242,6 +278,17 @@ void TestBasicConstructors() psD2a = psD; psD2b = psS; +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(psS2 = psS)); + ASSERT( noexcept(psD2a = psD)); + ASSERT( noexcept(psD2b = psS)); + + ASSERT( noexcept(bsl::span(psS))); + ASSERT( noexcept(bsl::span(psD))); + ASSERT( noexcept(bsl::span(psS))); + ASSERT( noexcept(bsl::span(psD))); +#endif + ASSERT(&arr[5] == psS2.data()); ASSERT(5 == psS2.size()); ASSERT(&arr[3] == psD2a.data()); @@ -267,6 +314,12 @@ void TestContainerConstructors() { bsl::span arrS(arr); bsl::span arrD(arr); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::span(arr))); + ASSERT( noexcept(bsl::span (arr))); +#endif + ASSERT(arr.data() == arrS.data()); ASSERT(10 == arrS.size()); ASSERT(arr.data() == arrD.data()); @@ -277,6 +330,12 @@ void TestContainerConstructors() { bsl::span carrS(cArr); bsl::span carrD(cArr); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::span(cArr))); + ASSERT( noexcept(bsl::span (cArr))); +#endif + ASSERT(cArr.data() == carrS.data()); ASSERT(10 == carrS.size()); ASSERT(cArr.data() == carrD.data()); @@ -296,6 +355,12 @@ void TestContainerConstructors() { bsl::span arrS(sArr); bsl::span arrD(sArr); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::span(sArr))); + ASSERT( noexcept(bsl::span (sArr))); +#endif + ASSERT(sArr.data() == arrS.data()); ASSERT(10 == arrS.size()); ASSERT(sArr.data() == arrD.data()); @@ -306,6 +371,12 @@ void TestContainerConstructors() { bsl::span carrS(cSArr); bsl::span carrD(cSArr); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::span(cSArr))); + ASSERT( noexcept(bsl::span (cSArr))); +#endif + ASSERT(cSArr.data() == carrS.data()); ASSERT(10 == carrS.size()); ASSERT(cSArr.data() == carrD.data()); @@ -320,6 +391,11 @@ void TestContainerConstructors() // from a bsl::vector (dynamic span only) { bsl::span arrD(vec); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept(bsl::span(vec))); +#endif + ASSERT(vec.data() == arrD.data()); ASSERT(30 == arrD.size()); } @@ -327,6 +403,11 @@ void TestContainerConstructors() // from a const bsl::vector (dynamic span only) { bsl::span carrD(cVec); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept(bsl::span(cVec))); +#endif + ASSERT(cVec.data() == carrD.data()); ASSERT(30 == carrD.size()); } @@ -336,6 +417,11 @@ void TestContainerConstructors() // from a bsl::string (dynamic span only) { bsl::span strD(str); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept(bsl::span(str))); +#endif + ASSERT(str.data() == strD.data()); ASSERT(5 == strD.size()); @@ -347,6 +433,10 @@ void TestContainerConstructors() // from a const bsl::string (dynamic span only) { bsl::span cstrD(cStr); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept(bsl::span(cStr))); +#endif ASSERT(str.data() == cstrD.data()); ASSERT(5 == cstrD.size()); } @@ -355,6 +445,11 @@ void TestContainerConstructors() // from a string_view (dynamic span only) { bsl::span cstrD(sv); + +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept(bsl::span(sv))); +#endif + ASSERT(sv.data() == cstrD.data()); ASSERT(5 == cstrD.size()); } @@ -385,6 +480,15 @@ void TestAccessors() ASSERT(bsl::dynamic_extent == zdSpan.extent); // size +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept( sSpan.size())); + ASSERT( noexcept(csSpan.size())); + ASSERT( noexcept( dSpan.size())); + ASSERT( noexcept(cdSpan.size())); + ASSERT( noexcept(zsSpan.size())); + ASSERT( noexcept(zdSpan.size())); +#endif + ASSERT(10 == sSpan.size()); ASSERT(4 == csSpan.size()); ASSERT(10 == dSpan.size()); @@ -393,6 +497,15 @@ void TestAccessors() ASSERT(0 == zdSpan.size()); // size_bytes +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept( sSpan.size_bytes())); + ASSERT( noexcept(csSpan.size_bytes())); + ASSERT( noexcept( dSpan.size_bytes())); + ASSERT( noexcept(cdSpan.size_bytes())); + ASSERT( noexcept(zsSpan.size_bytes())); + ASSERT( noexcept(zdSpan.size_bytes())); +#endif + ASSERT(10 * sizeof(int) == sSpan.size_bytes()); ASSERT(4 * sizeof(int) == csSpan.size_bytes()); ASSERT(10 * sizeof(int) == dSpan.size_bytes()); @@ -401,6 +514,15 @@ void TestAccessors() ASSERT(0 * sizeof(int) == zdSpan.size_bytes()); // empty +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept( sSpan.empty())); + ASSERT( noexcept(csSpan.empty())); + ASSERT( noexcept( dSpan.empty())); + ASSERT( noexcept(cdSpan.empty())); + ASSERT( noexcept(zsSpan.empty())); + ASSERT( noexcept(zdSpan.empty())); +#endif + ASSERT(! sSpan.empty()); ASSERT(!csSpan.empty()); ASSERT(! dSpan.empty()); @@ -409,24 +531,54 @@ void TestAccessors() ASSERT( zdSpan.empty()); // data +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept( sSpan.data())); + ASSERT( noexcept(csSpan.data())); + ASSERT( noexcept( dSpan.data())); + ASSERT( noexcept(cdSpan.data())); + ASSERT( noexcept(zsSpan.data())); + ASSERT( noexcept(zdSpan.data())); +#endif + ASSERT(&arr[0] == sSpan.data()); ASSERT(&arr[5] == csSpan.data()); ASSERT(&arr[0] == dSpan.data()); ASSERT(&arr[5] == cdSpan.data()); // front +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.front())); + ASSERT(!noexcept(csSpan.front())); + ASSERT(!noexcept( dSpan.front())); + ASSERT(!noexcept(cdSpan.front())); +#endif + ASSERT(0 == sSpan.front()); ASSERT(5 == csSpan.front()); ASSERT(0 == dSpan.front()); ASSERT(5 == cdSpan.front()); // back +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.back())); + ASSERT(!noexcept(csSpan.back())); + ASSERT(!noexcept( dSpan.back())); + ASSERT(!noexcept(cdSpan.back())); +#endif + ASSERT(9 == sSpan.back()); ASSERT(8 == csSpan.back()); ASSERT(9 == dSpan.back()); ASSERT(8 == cdSpan.back()); // operator[] +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan[0])); + ASSERT(!noexcept(csSpan[0])); + ASSERT(!noexcept( dSpan[0])); + ASSERT(!noexcept(cdSpan[0])); +#endif + ASSERT(7 == sSpan[7]); ASSERT(6 == csSpan[1]); ASSERT(7 == dSpan[7]); @@ -455,6 +607,13 @@ void TestSubspan() bsl::span dFirstA = dSpan.first<4>(); bsl::span cdFirstA = cdSpan.first<2>(); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.first<4>())); + ASSERT(!noexcept(csSpan.first<2>())); + ASSERT(!noexcept( dSpan.first<4>())); + ASSERT(!noexcept(cdSpan.first<2>())); +#endif + ASSERT(4 == sFirstA.size()); ASSERT(2 == csFirstA.size()); ASSERT(4 == dFirstA.size()); @@ -470,6 +629,13 @@ void TestSubspan() bsl::span dFirstB = dSpan.first(4); bsl::span cdFirstB = cdSpan.first(2); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.first(4))); + ASSERT(!noexcept(csSpan.first(2))); + ASSERT(!noexcept( dSpan.first(4))); + ASSERT(!noexcept(cdSpan.first(2))); +#endif + ASSERT(4 == sFirstB.size()); ASSERT(2 == csFirstB.size()); ASSERT(4 == dFirstB.size()); @@ -486,6 +652,13 @@ void TestSubspan() bsl::span dLastA = dSpan.last<4>(); bsl::span cdLastA = cdSpan.last<2>(); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.last<4>())); + ASSERT(!noexcept(csSpan.last<2>())); + ASSERT(!noexcept( dSpan.last<4>())); + ASSERT(!noexcept(cdSpan.last<2>())); +#endif + ASSERT(4 == sLastA.size()); ASSERT(2 == csLastA.size()); ASSERT(4 == dLastA.size()); @@ -501,6 +674,13 @@ void TestSubspan() bsl::span dLastB = dSpan.last(4); bsl::span cdLastB = cdSpan.last(2); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.last(4))); + ASSERT(!noexcept(csSpan.last(2))); + ASSERT(!noexcept( dSpan.last(4))); + ASSERT(!noexcept(cdSpan.last(2))); +#endif + ASSERT(4 == sLastB.size()); ASSERT(2 == csLastB.size()); ASSERT(4 == dLastB.size()); @@ -522,6 +702,18 @@ void TestSubspan() bsl::span dSubA2 = sSpan.subspan<4, DYN>(); bsl::span cdSubA2 = cdSpan.subspan<2, DYN>(); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.subspan<2, 4>())); + ASSERT(!noexcept(csSpan.subspan<1, 2>())); + ASSERT(!noexcept( dSpan.subspan<2, 4>())); + ASSERT(!noexcept(cdSpan.subspan<1, 2>())); + + ASSERT(!noexcept( sSpan.subspan<2, DYN>())); + ASSERT(!noexcept(csSpan.subspan<1, DYN>())); + ASSERT(!noexcept( dSpan.subspan<2, DYN>())); + ASSERT(!noexcept(cdSpan.subspan<1, DYN>())); +#endif + ASSERT(4 == sSubA1.size()); ASSERT(2 == csSubA1.size()); ASSERT(4 == dSubA1.size()); @@ -547,6 +739,13 @@ void TestSubspan() bsl::span dSubB1 = dSpan.subspan(2, 4); bsl::span cdSubB1 = cdSpan.subspan(1, 2); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.subspan(2, 4))); + ASSERT(!noexcept(csSpan.subspan(1, 2))); + ASSERT(!noexcept( dSpan.subspan(2, 4))); + ASSERT(!noexcept(cdSpan.subspan(1, 2))); +#endif + ASSERT(4 == sSubB1.size()); ASSERT(2 == csSubB1.size()); ASSERT(4 == dSubB1.size()); @@ -562,6 +761,13 @@ void TestSubspan() bsl::span dSubB2 = dSpan.subspan(4, DYN); bsl::span cdSubB2 = cdSpan.subspan(3, DYN); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT(!noexcept( sSpan.subspan(4, DYN))); + ASSERT(!noexcept(csSpan.subspan(3, DYN))); + ASSERT(!noexcept( dSpan.subspan(4, DYN))); + ASSERT(!noexcept(cdSpan.subspan(3, DYN))); +#endif + ASSERT(6 == sSubB2.size()); ASSERT(1 == csSubB2.size()); ASSERT(6 == dSubB2.size()); @@ -603,6 +809,28 @@ void TestIterators() bsl::span< int> dSpan (&arr[0], 10); bsl::span cdSpan(&arr[5], 4); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept( sSpan.begin())); + ASSERT( noexcept(csSpan.begin())); + ASSERT( noexcept( dSpan.begin())); + ASSERT( noexcept(cdSpan.begin())); + + ASSERT( noexcept( sSpan.end())); + ASSERT( noexcept(csSpan.end())); + ASSERT( noexcept( dSpan.end())); + ASSERT( noexcept(cdSpan.end())); + + ASSERT( noexcept( sSpan.rbegin())); + ASSERT( noexcept(csSpan.rbegin())); + ASSERT( noexcept( dSpan.rbegin())); + ASSERT( noexcept(cdSpan.rbegin())); + + ASSERT( noexcept( sSpan.rend())); + ASSERT( noexcept(csSpan.rend())); + ASSERT( noexcept( dSpan.rend())); + ASSERT( noexcept(cdSpan.rend())); +#endif + // Forward iterators idx = 0; for (bsl::span::iterator iter = sSpan.begin(); @@ -734,6 +962,13 @@ void TestFreeFunctions () auto dBytes1 = bsl::as_bytes(dSpan1); auto dBytes2 = bsl::as_writable_bytes(dSpan2); +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT + ASSERT( noexcept(bsl::as_bytes(sSpan1))); + ASSERT( noexcept(bsl::as_writable_bytes(sSpan2))); + ASSERT( noexcept(bsl::as_bytes(dSpan1))); + ASSERT( noexcept(bsl::as_writable_bytes(dSpan2))); +#endif + BSLMF_ASSERT((bsl::is_same_v>)); BSLMF_ASSERT((bsl::is_same_v as_bytes(span); - // span as_writable_bytes(span); + // void swap(span a, span b) noexcept; + // span as_bytes(span) noexcept; + // span as_writable_bytes(span) noexcept; // -------------------------------------------------------------------- if (verbose) printf("\nFREE FUNCTIONS" @@ -1048,10 +1288,10 @@ int main(int argc, char *argv[]) //: referred to by the span. // // Testing: - // iterator begin(); - // iterator end(); - // reverse_iterator rbegin(); - // reverse_iterator rend(); + // iterator begin() noexcept; + // iterator end() noexcept; + // reverse_iterator rbegin() noexcept; + // reverse_iterator rend() noexcept; // -------------------------------------------------------------------- if (verbose) printf("\nITERATORS" @@ -1113,11 +1353,11 @@ int main(int argc, char *argv[]) // reference front(); // reference back(); // reference operator[](size_type); - // bool empty(); + // bool empty() noexcept; // size_type extent; - // size_type size(); - // size_type size_bytes(); - // pointer data(); + // size_type size() noexcept; + // size_type size_bytes() noexcept; + // pointer data() noexcept; // -------------------------------------------------------------------- if (verbose) printf("\nACCESSORS" @@ -1142,10 +1382,10 @@ int main(int argc, char *argv[]) //: container that they were created from. // // Testing: - // span(array&); - // span(const array&); - // span(std::array&); - // span(const std::array&); + // span(array&) noexcept; + // span(const array&) noexcept; + // span(std::array&) noexcept; + // span(const std::array&) noexcept; // span(CONTAINER& c); // span(const CONTAINER& c); // -------------------------------------------------------------------- @@ -1172,13 +1412,13 @@ int main(int argc, char *argv[]) //: the paramaters passed to the constructor. // // Testing: - // span(); + // span() noexcept; // span(pointer, size_type); // span(pointer, pointer); - // span(element_type (&arr)[SIZE]); - // span(const span &); - // span(span); - // operator=(const span &); + // span(element_type (&arr)[SIZE]) noexcept; + // span(const span &) noexcept; + // span(span) noexcept; + // operator=(const span &) noexcept; // -------------------------------------------------------------------- if (verbose) printf("\nBASIC CONSTRUCTORS" From b8487547a87293493419c2c05646fcea4da39fbd Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Fri, 10 May 2024 09:32:03 -0700 Subject: [PATCH 2/9] Don't test for noexcept when we're aliasing std::span --- groups/bsl/bslstl/bslstl_span.t.cpp | 74 ++++++++++++++++------------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index e64f00d5ad..8aa172494b 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -117,6 +117,14 @@ void aSsErT(bool condition, const char *message, int line) #define ASSERT_OPT_PASS(EXPR) BSLS_ASSERTTEST_ASSERT_OPT_PASS(EXPR) #define ASSERT_OPT_FAIL(EXPR) BSLS_ASSERTTEST_ASSERT_OPT_FAIL(EXPR) +// We want to test the 'noexcept'-ness of the functions in span, but only if +// (a) we can test them, and (b) we're not using 'std::span'. +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +# ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY +# define TEST_SPAN_NOEXCEPT +# endif +#endif + //============================================================================= // USAGE EXAMPLE //----------------------------------------------------------------------------- @@ -165,7 +173,7 @@ void TestBasicConstructors() bsl::span defS; bsl::span defD; -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::span())); ASSERT( noexcept(bsl::span())); #endif @@ -181,7 +189,7 @@ void TestBasicConstructors() bsl::span psS(&arr[5], 5); bsl::span psD(&arr[3], 3); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept(bsl::span(&arr[5], 5))); ASSERT(!noexcept(bsl::span(&arr[5], 5))); #endif @@ -197,7 +205,7 @@ void TestBasicConstructors() bsl::span ppS(&arr[5], &arr[10]); bsl::span ppD(&arr[3], &arr[6]); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept(bsl::span(&arr[5], &arr[10]))); ASSERT(!noexcept(bsl::span(&arr[3], &arr[6]))); #endif @@ -212,7 +220,7 @@ void TestBasicConstructors() bsl::span arrS(arr); bsl::span arrD(arr); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::span(arr))); ASSERT( noexcept(bsl::span(arr))); #endif @@ -232,7 +240,7 @@ void TestBasicConstructors() bsl::span sD1b(sS); bsl::span sS2a(sD); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::span(sS))); ASSERT( noexcept(bsl::span(sS))); ASSERT( noexcept(bsl::span(sD))); @@ -257,7 +265,7 @@ void TestBasicConstructors() bsl::span psD1a(psD); bsl::span psD1b(psS); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::span(psS))); ASSERT( noexcept(bsl::span(psS))); ASSERT( noexcept(bsl::span(psD))); @@ -278,7 +286,7 @@ void TestBasicConstructors() psD2a = psD; psD2b = psS; -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(psS2 = psS)); ASSERT( noexcept(psD2a = psD)); ASSERT( noexcept(psD2b = psS)); @@ -315,7 +323,7 @@ void TestContainerConstructors() bsl::span arrS(arr); bsl::span arrD(arr); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::span(arr))); ASSERT( noexcept(bsl::span (arr))); #endif @@ -331,7 +339,7 @@ void TestContainerConstructors() bsl::span carrS(cArr); bsl::span carrD(cArr); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::span(cArr))); ASSERT( noexcept(bsl::span (cArr))); #endif @@ -356,7 +364,7 @@ void TestContainerConstructors() bsl::span arrS(sArr); bsl::span arrD(sArr); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::span(sArr))); ASSERT( noexcept(bsl::span (sArr))); #endif @@ -372,7 +380,7 @@ void TestContainerConstructors() bsl::span carrS(cSArr); bsl::span carrD(cSArr); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::span(cSArr))); ASSERT( noexcept(bsl::span (cSArr))); #endif @@ -392,7 +400,7 @@ void TestContainerConstructors() { bsl::span arrD(vec); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept(bsl::span(vec))); #endif @@ -404,7 +412,7 @@ void TestContainerConstructors() { bsl::span carrD(cVec); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept(bsl::span(cVec))); #endif @@ -418,7 +426,7 @@ void TestContainerConstructors() { bsl::span strD(str); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept(bsl::span(str))); #endif @@ -434,7 +442,7 @@ void TestContainerConstructors() { bsl::span cstrD(cStr); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept(bsl::span(cStr))); #endif ASSERT(str.data() == cstrD.data()); @@ -446,7 +454,7 @@ void TestContainerConstructors() { bsl::span cstrD(sv); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept(bsl::span(sv))); #endif @@ -480,7 +488,7 @@ void TestAccessors() ASSERT(bsl::dynamic_extent == zdSpan.extent); // size -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept( sSpan.size())); ASSERT( noexcept(csSpan.size())); ASSERT( noexcept( dSpan.size())); @@ -497,7 +505,7 @@ void TestAccessors() ASSERT(0 == zdSpan.size()); // size_bytes -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept( sSpan.size_bytes())); ASSERT( noexcept(csSpan.size_bytes())); ASSERT( noexcept( dSpan.size_bytes())); @@ -514,7 +522,7 @@ void TestAccessors() ASSERT(0 * sizeof(int) == zdSpan.size_bytes()); // empty -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept( sSpan.empty())); ASSERT( noexcept(csSpan.empty())); ASSERT( noexcept( dSpan.empty())); @@ -531,7 +539,7 @@ void TestAccessors() ASSERT( zdSpan.empty()); // data -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept( sSpan.data())); ASSERT( noexcept(csSpan.data())); ASSERT( noexcept( dSpan.data())); @@ -546,7 +554,7 @@ void TestAccessors() ASSERT(&arr[5] == cdSpan.data()); // front -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.front())); ASSERT(!noexcept(csSpan.front())); ASSERT(!noexcept( dSpan.front())); @@ -559,7 +567,7 @@ void TestAccessors() ASSERT(5 == cdSpan.front()); // back -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.back())); ASSERT(!noexcept(csSpan.back())); ASSERT(!noexcept( dSpan.back())); @@ -572,7 +580,7 @@ void TestAccessors() ASSERT(8 == cdSpan.back()); // operator[] -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan[0])); ASSERT(!noexcept(csSpan[0])); ASSERT(!noexcept( dSpan[0])); @@ -607,7 +615,7 @@ void TestSubspan() bsl::span dFirstA = dSpan.first<4>(); bsl::span cdFirstA = cdSpan.first<2>(); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.first<4>())); ASSERT(!noexcept(csSpan.first<2>())); ASSERT(!noexcept( dSpan.first<4>())); @@ -629,7 +637,7 @@ void TestSubspan() bsl::span dFirstB = dSpan.first(4); bsl::span cdFirstB = cdSpan.first(2); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.first(4))); ASSERT(!noexcept(csSpan.first(2))); ASSERT(!noexcept( dSpan.first(4))); @@ -652,7 +660,7 @@ void TestSubspan() bsl::span dLastA = dSpan.last<4>(); bsl::span cdLastA = cdSpan.last<2>(); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.last<4>())); ASSERT(!noexcept(csSpan.last<2>())); ASSERT(!noexcept( dSpan.last<4>())); @@ -674,7 +682,7 @@ void TestSubspan() bsl::span dLastB = dSpan.last(4); bsl::span cdLastB = cdSpan.last(2); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.last(4))); ASSERT(!noexcept(csSpan.last(2))); ASSERT(!noexcept( dSpan.last(4))); @@ -702,7 +710,7 @@ void TestSubspan() bsl::span dSubA2 = sSpan.subspan<4, DYN>(); bsl::span cdSubA2 = cdSpan.subspan<2, DYN>(); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.subspan<2, 4>())); ASSERT(!noexcept(csSpan.subspan<1, 2>())); ASSERT(!noexcept( dSpan.subspan<2, 4>())); @@ -739,7 +747,7 @@ void TestSubspan() bsl::span dSubB1 = dSpan.subspan(2, 4); bsl::span cdSubB1 = cdSpan.subspan(1, 2); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.subspan(2, 4))); ASSERT(!noexcept(csSpan.subspan(1, 2))); ASSERT(!noexcept( dSpan.subspan(2, 4))); @@ -761,7 +769,7 @@ void TestSubspan() bsl::span dSubB2 = dSpan.subspan(4, DYN); bsl::span cdSubB2 = cdSpan.subspan(3, DYN); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT(!noexcept( sSpan.subspan(4, DYN))); ASSERT(!noexcept(csSpan.subspan(3, DYN))); ASSERT(!noexcept( dSpan.subspan(4, DYN))); @@ -809,7 +817,7 @@ void TestIterators() bsl::span< int> dSpan (&arr[0], 10); bsl::span cdSpan(&arr[5], 4); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept( sSpan.begin())); ASSERT( noexcept(csSpan.begin())); ASSERT( noexcept( dSpan.begin())); @@ -962,7 +970,7 @@ void TestFreeFunctions () auto dBytes1 = bsl::as_bytes(dSpan1); auto dBytes2 = bsl::as_writable_bytes(dSpan2); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(bsl::as_bytes(sSpan1))); ASSERT( noexcept(bsl::as_writable_bytes(sSpan2))); ASSERT( noexcept(bsl::as_bytes(dSpan1))); @@ -999,7 +1007,7 @@ void TestFreeFunctions () bsl::swap(sSpan1, sSpan2); bsl::swap(dSpan1, dSpan2); -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT +#ifdef TEST_SPAN_NOEXCEPT ASSERT( noexcept(swap(sSpan1, sSpan2))); ASSERT( noexcept(swap(dSpan1, dSpan2))); #endif From 8d4c0263166844ab82625c4704fce43cdc695a71 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Fri, 10 May 2024 10:57:39 -0700 Subject: [PATCH 3/9] Disable a couple of noexcept tests on MSVC --- groups/bsl/bslstl/bslstl_span.t.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index 8aa172494b..2154ab5397 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -189,7 +189,9 @@ void TestBasicConstructors() bsl::span psS(&arr[5], 5); bsl::span psD(&arr[3], 3); -#ifdef TEST_SPAN_NOEXCEPT +// MSVC erroneously reports these constructors as noexcept. The trigger +// appears to be declaring them as 'constexpr'. +#if defined(TEST_SPAN_NOEXCEPT) && !defined(BSLS_PLATFORM_CMP_MSVC) ASSERT(!noexcept(bsl::span(&arr[5], 5))); ASSERT(!noexcept(bsl::span(&arr[5], 5))); #endif @@ -205,10 +207,13 @@ void TestBasicConstructors() bsl::span ppS(&arr[5], &arr[10]); bsl::span ppD(&arr[3], &arr[6]); -#ifdef TEST_SPAN_NOEXCEPT +// MSVC erroneously reports these constructors as noexcept. The trigger +// appears to be declaring them as 'constexpr'. +#if defined(TEST_SPAN_NOEXCEPT) && !defined(BSLS_PLATFORM_CMP_MSVC) ASSERT(!noexcept(bsl::span(&arr[5], &arr[10]))); ASSERT(!noexcept(bsl::span(&arr[3], &arr[6]))); #endif + ASSERT(&arr[5] == ppS.data()); ASSERT(5 == ppS.size()); ASSERT(&arr[3] == ppD.data()); From e85a6798ef7293583220797686f9b975aa3e048d Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Mon, 13 May 2024 07:40:03 -0700 Subject: [PATCH 4/9] Predicate MSVC check on a future version of MSVC --- groups/bsl/bslstl/bslstl_span.t.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index 2154ab5397..7de5d484d6 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -190,8 +191,10 @@ void TestBasicConstructors() bsl::span psD(&arr[3], 3); // MSVC erroneously reports these constructors as noexcept. The trigger -// appears to be declaring them as 'constexpr'. -#if defined(TEST_SPAN_NOEXCEPT) && !defined(BSLS_PLATFORM_CMP_MSVC) +// appears to be declaring them as 'constexpr'. Hopefully this will be fixed +// someday. Reported to MS 10-May-2024. +#if defined(TEST_SPAN_NOEXCEPT) && \ + !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1939)) ASSERT(!noexcept(bsl::span(&arr[5], 5))); ASSERT(!noexcept(bsl::span(&arr[5], 5))); #endif @@ -208,8 +211,10 @@ void TestBasicConstructors() bsl::span ppD(&arr[3], &arr[6]); // MSVC erroneously reports these constructors as noexcept. The trigger -// appears to be declaring them as 'constexpr'. -#if defined(TEST_SPAN_NOEXCEPT) && !defined(BSLS_PLATFORM_CMP_MSVC) +// appears to be declaring them as 'constexpr'. Hopefully this will be fixed +// someday. Reported to MS 10-May-2024. +#if defined(TEST_SPAN_NOEXCEPT) && \ + !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1939)) ASSERT(!noexcept(bsl::span(&arr[5], &arr[10]))); ASSERT(!noexcept(bsl::span(&arr[3], &arr[6]))); #endif From 42d5bfff421286b53c9fc55db541bcc4498f813c Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Mon, 13 May 2024 09:24:42 -0700 Subject: [PATCH 5/9] refactor noexcept testing --- groups/bsl/bslstl/bslstl_span.t.cpp | 283 +++++++++++++--------------- 1 file changed, 130 insertions(+), 153 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index 7de5d484d6..23a767b94e 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -119,13 +119,18 @@ void aSsErT(bool condition, const char *message, int line) #define ASSERT_OPT_FAIL(EXPR) BSLS_ASSERTTEST_ASSERT_OPT_FAIL(EXPR) // We want to test the 'noexcept'-ness of the functions in span, but only if -// (a) we can test them, and (b) we're not using 'std::span'. +// (a) we can test them, and (b) we're not using 'std::span', because all three +// implementations of std::span add 'noexcept' to 'front', 'back', 'first', +// 'last', and 'subspan'. #ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT # ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY # define TEST_SPAN_NOEXCEPT # endif #endif +#define ASSERT_NOEXCEPT(...) BSLS_ASSERT( noexcept(__VA_ARGS__)) +#define ASSERT_NOT_NOEXCEPT(...) BSLS_ASSERT(!noexcept(__VA_ARGS__)) + //============================================================================= // USAGE EXAMPLE //----------------------------------------------------------------------------- @@ -174,10 +179,8 @@ void TestBasicConstructors() bsl::span defS; bsl::span defD; -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::span())); - ASSERT( noexcept(bsl::span())); -#endif + ASSERT_NOEXCEPT(bsl::span()); + ASSERT_NOEXCEPT(bsl::span()); ASSERT(NULL == defS.data()); ASSERT(0 == defS.size()); @@ -195,8 +198,8 @@ void TestBasicConstructors() // someday. Reported to MS 10-May-2024. #if defined(TEST_SPAN_NOEXCEPT) && \ !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1939)) - ASSERT(!noexcept(bsl::span(&arr[5], 5))); - ASSERT(!noexcept(bsl::span(&arr[5], 5))); + ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], 5)); + ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], 5)); #endif ASSERT(&arr[5] == psS.data()); @@ -215,8 +218,8 @@ void TestBasicConstructors() // someday. Reported to MS 10-May-2024. #if defined(TEST_SPAN_NOEXCEPT) && \ !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1939)) - ASSERT(!noexcept(bsl::span(&arr[5], &arr[10]))); - ASSERT(!noexcept(bsl::span(&arr[3], &arr[6]))); + ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], &arr[10])); + ASSERT_NOT_NOEXCEPT(bsl::span(&arr[3], &arr[ 6])); #endif ASSERT(&arr[5] == ppS.data()); @@ -230,10 +233,8 @@ void TestBasicConstructors() bsl::span arrS(arr); bsl::span arrD(arr); -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::span(arr))); - ASSERT( noexcept(bsl::span(arr))); -#endif + ASSERT_NOEXCEPT(bsl::span(arr)); + ASSERT_NOEXCEPT(bsl::span(arr)); ASSERT(&arr[0] == arrS.data()); ASSERT(10 == arrS.size()); @@ -250,12 +251,10 @@ void TestBasicConstructors() bsl::span sD1b(sS); bsl::span sS2a(sD); -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::span(sS))); - ASSERT( noexcept(bsl::span(sS))); - ASSERT( noexcept(bsl::span(sD))); - ASSERT( noexcept(bsl::span(sD))); -#endif + ASSERT_NOEXCEPT(bsl::span(sS)); + ASSERT_NOEXCEPT(bsl::span(sS)); + ASSERT_NOEXCEPT(bsl::span(sD)); + ASSERT_NOEXCEPT(bsl::span(sD)); ASSERT(&arr[5] == sS1.data()); ASSERT(5 == sS1.size()); @@ -275,11 +274,9 @@ void TestBasicConstructors() bsl::span psD1a(psD); bsl::span psD1b(psS); -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::span(psS))); - ASSERT( noexcept(bsl::span(psS))); - ASSERT( noexcept(bsl::span(psD))); -#endif + ASSERT_NOEXCEPT(bsl::span(psS)); + ASSERT_NOEXCEPT(bsl::span(psS)); + ASSERT_NOEXCEPT(bsl::span(psD)); ASSERT(&arr[5] == psS1.data()); ASSERT(5 == psS1.size()); @@ -296,16 +293,14 @@ void TestBasicConstructors() psD2a = psD; psD2b = psS; -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(psS2 = psS)); - ASSERT( noexcept(psD2a = psD)); - ASSERT( noexcept(psD2b = psS)); - - ASSERT( noexcept(bsl::span(psS))); - ASSERT( noexcept(bsl::span(psD))); - ASSERT( noexcept(bsl::span(psS))); - ASSERT( noexcept(bsl::span(psD))); -#endif + ASSERT_NOEXCEPT(psS2 = psS); + ASSERT_NOEXCEPT(psD2a = psD); + ASSERT_NOEXCEPT(psD2b = psS); + + ASSERT_NOEXCEPT(bsl::span(psS)); + ASSERT_NOEXCEPT(bsl::span(psD)); + ASSERT_NOEXCEPT(bsl::span(psS)); + ASSERT_NOEXCEPT(bsl::span(psD)); ASSERT(&arr[5] == psS2.data()); ASSERT(5 == psS2.size()); @@ -333,10 +328,8 @@ void TestContainerConstructors() bsl::span arrS(arr); bsl::span arrD(arr); -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::span(arr))); - ASSERT( noexcept(bsl::span (arr))); -#endif + ASSERT_NOEXCEPT(bsl::span(arr)); + ASSERT_NOEXCEPT(bsl::span (arr)); ASSERT(arr.data() == arrS.data()); ASSERT(10 == arrS.size()); @@ -349,10 +342,8 @@ void TestContainerConstructors() bsl::span carrS(cArr); bsl::span carrD(cArr); -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::span(cArr))); - ASSERT( noexcept(bsl::span (cArr))); -#endif + ASSERT_NOEXCEPT(bsl::span(cArr)); + ASSERT_NOEXCEPT(bsl::span (cArr)); ASSERT(cArr.data() == carrS.data()); ASSERT(10 == carrS.size()); @@ -374,10 +365,8 @@ void TestContainerConstructors() bsl::span arrS(sArr); bsl::span arrD(sArr); -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::span(sArr))); - ASSERT( noexcept(bsl::span (sArr))); -#endif + ASSERT_NOEXCEPT(bsl::span(sArr)); + ASSERT_NOEXCEPT(bsl::span (sArr)); ASSERT(sArr.data() == arrS.data()); ASSERT(10 == arrS.size()); @@ -390,10 +379,8 @@ void TestContainerConstructors() bsl::span carrS(cSArr); bsl::span carrD(cSArr); -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::span(cSArr))); - ASSERT( noexcept(bsl::span (cSArr))); -#endif + ASSERT_NOEXCEPT(bsl::span(cSArr)); + ASSERT_NOEXCEPT(bsl::span (cSArr)); ASSERT(cSArr.data() == carrS.data()); ASSERT(10 == carrS.size()); @@ -411,7 +398,7 @@ void TestContainerConstructors() bsl::span arrD(vec); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept(bsl::span(vec))); + ASSERT_NOT_NOEXCEPT(bsl::span(vec)); #endif ASSERT(vec.data() == arrD.data()); @@ -423,7 +410,7 @@ void TestContainerConstructors() bsl::span carrD(cVec); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept(bsl::span(cVec))); + ASSERT_NOT_NOEXCEPT(bsl::span(cVec)); #endif ASSERT(cVec.data() == carrD.data()); @@ -437,7 +424,7 @@ void TestContainerConstructors() bsl::span strD(str); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept(bsl::span(str))); + ASSERT_NOT_NOEXCEPT(bsl::span(str)); #endif ASSERT(str.data() == strD.data()); @@ -453,7 +440,7 @@ void TestContainerConstructors() bsl::span cstrD(cStr); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept(bsl::span(cStr))); + ASSERT_NOT_NOEXCEPT(bsl::span(cStr)); #endif ASSERT(str.data() == cstrD.data()); ASSERT(5 == cstrD.size()); @@ -465,7 +452,7 @@ void TestContainerConstructors() bsl::span cstrD(sv); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept(bsl::span(sv))); + ASSERT_NOT_NOEXCEPT(bsl::span(sv)); #endif ASSERT(sv.data() == cstrD.data()); @@ -498,14 +485,12 @@ void TestAccessors() ASSERT(bsl::dynamic_extent == zdSpan.extent); // size -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept( sSpan.size())); - ASSERT( noexcept(csSpan.size())); - ASSERT( noexcept( dSpan.size())); - ASSERT( noexcept(cdSpan.size())); - ASSERT( noexcept(zsSpan.size())); - ASSERT( noexcept(zdSpan.size())); -#endif + ASSERT_NOEXCEPT( sSpan.size()); + ASSERT_NOEXCEPT(csSpan.size()); + ASSERT_NOEXCEPT( dSpan.size()); + ASSERT_NOEXCEPT(cdSpan.size()); + ASSERT_NOEXCEPT(zsSpan.size()); + ASSERT_NOEXCEPT(zdSpan.size()); ASSERT(10 == sSpan.size()); ASSERT(4 == csSpan.size()); @@ -515,14 +500,12 @@ void TestAccessors() ASSERT(0 == zdSpan.size()); // size_bytes -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept( sSpan.size_bytes())); - ASSERT( noexcept(csSpan.size_bytes())); - ASSERT( noexcept( dSpan.size_bytes())); - ASSERT( noexcept(cdSpan.size_bytes())); - ASSERT( noexcept(zsSpan.size_bytes())); - ASSERT( noexcept(zdSpan.size_bytes())); -#endif + ASSERT_NOEXCEPT( sSpan.size_bytes()); + ASSERT_NOEXCEPT(csSpan.size_bytes()); + ASSERT_NOEXCEPT( dSpan.size_bytes()); + ASSERT_NOEXCEPT(cdSpan.size_bytes()); + ASSERT_NOEXCEPT(zsSpan.size_bytes()); + ASSERT_NOEXCEPT(zdSpan.size_bytes()); ASSERT(10 * sizeof(int) == sSpan.size_bytes()); ASSERT(4 * sizeof(int) == csSpan.size_bytes()); @@ -532,14 +515,12 @@ void TestAccessors() ASSERT(0 * sizeof(int) == zdSpan.size_bytes()); // empty -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept( sSpan.empty())); - ASSERT( noexcept(csSpan.empty())); - ASSERT( noexcept( dSpan.empty())); - ASSERT( noexcept(cdSpan.empty())); - ASSERT( noexcept(zsSpan.empty())); - ASSERT( noexcept(zdSpan.empty())); -#endif + ASSERT_NOEXCEPT( sSpan.empty()); + ASSERT_NOEXCEPT(csSpan.empty()); + ASSERT_NOEXCEPT( dSpan.empty()); + ASSERT_NOEXCEPT(cdSpan.empty()); + ASSERT_NOEXCEPT(zsSpan.empty()); + ASSERT_NOEXCEPT(zdSpan.empty()); ASSERT(! sSpan.empty()); ASSERT(!csSpan.empty()); @@ -549,14 +530,12 @@ void TestAccessors() ASSERT( zdSpan.empty()); // data -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept( sSpan.data())); - ASSERT( noexcept(csSpan.data())); - ASSERT( noexcept( dSpan.data())); - ASSERT( noexcept(cdSpan.data())); - ASSERT( noexcept(zsSpan.data())); - ASSERT( noexcept(zdSpan.data())); -#endif + ASSERT_NOEXCEPT( sSpan.data()); + ASSERT_NOEXCEPT(csSpan.data()); + ASSERT_NOEXCEPT( dSpan.data()); + ASSERT_NOEXCEPT(cdSpan.data()); + ASSERT_NOEXCEPT(zsSpan.data()); + ASSERT_NOEXCEPT(zdSpan.data()); ASSERT(&arr[0] == sSpan.data()); ASSERT(&arr[5] == csSpan.data()); @@ -565,10 +544,10 @@ void TestAccessors() // front #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.front())); - ASSERT(!noexcept(csSpan.front())); - ASSERT(!noexcept( dSpan.front())); - ASSERT(!noexcept(cdSpan.front())); + ASSERT_NOT_NOEXCEPT( sSpan.front()); + ASSERT_NOT_NOEXCEPT(csSpan.front()); + ASSERT_NOT_NOEXCEPT( dSpan.front()); + ASSERT_NOT_NOEXCEPT(cdSpan.front()); #endif ASSERT(0 == sSpan.front()); @@ -578,10 +557,10 @@ void TestAccessors() // back #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.back())); - ASSERT(!noexcept(csSpan.back())); - ASSERT(!noexcept( dSpan.back())); - ASSERT(!noexcept(cdSpan.back())); + ASSERT_NOT_NOEXCEPT( sSpan.back()); + ASSERT_NOT_NOEXCEPT(csSpan.back()); + ASSERT_NOT_NOEXCEPT( dSpan.back()); + ASSERT_NOT_NOEXCEPT(cdSpan.back()); #endif ASSERT(9 == sSpan.back()); @@ -591,10 +570,10 @@ void TestAccessors() // operator[] #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan[0])); - ASSERT(!noexcept(csSpan[0])); - ASSERT(!noexcept( dSpan[0])); - ASSERT(!noexcept(cdSpan[0])); + ASSERT_NOT_NOEXCEPT( sSpan[0]); + ASSERT_NOT_NOEXCEPT(csSpan[0]); + ASSERT_NOT_NOEXCEPT( dSpan[0]); + ASSERT_NOT_NOEXCEPT(cdSpan[0]); #endif ASSERT(7 == sSpan[7]); @@ -626,10 +605,10 @@ void TestSubspan() bsl::span cdFirstA = cdSpan.first<2>(); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.first<4>())); - ASSERT(!noexcept(csSpan.first<2>())); - ASSERT(!noexcept( dSpan.first<4>())); - ASSERT(!noexcept(cdSpan.first<2>())); + ASSERT_NOT_NOEXCEPT( sSpan.first<4>()); + ASSERT_NOT_NOEXCEPT(csSpan.first<2>()); + ASSERT_NOT_NOEXCEPT( dSpan.first<4>()); + ASSERT_NOT_NOEXCEPT(cdSpan.first<2>()); #endif ASSERT(4 == sFirstA.size()); @@ -648,10 +627,10 @@ void TestSubspan() bsl::span cdFirstB = cdSpan.first(2); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.first(4))); - ASSERT(!noexcept(csSpan.first(2))); - ASSERT(!noexcept( dSpan.first(4))); - ASSERT(!noexcept(cdSpan.first(2))); + ASSERT_NOT_NOEXCEPT( sSpan.first(4)); + ASSERT_NOT_NOEXCEPT(csSpan.first(2)); + ASSERT_NOT_NOEXCEPT( dSpan.first(4)); + ASSERT_NOT_NOEXCEPT(cdSpan.first(2)); #endif ASSERT(4 == sFirstB.size()); @@ -671,10 +650,10 @@ void TestSubspan() bsl::span cdLastA = cdSpan.last<2>(); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.last<4>())); - ASSERT(!noexcept(csSpan.last<2>())); - ASSERT(!noexcept( dSpan.last<4>())); - ASSERT(!noexcept(cdSpan.last<2>())); + ASSERT_NOT_NOEXCEPT( sSpan.last<4>()); + ASSERT_NOT_NOEXCEPT(csSpan.last<2>()); + ASSERT_NOT_NOEXCEPT( dSpan.last<4>()); + ASSERT_NOT_NOEXCEPT(cdSpan.last<2>()); #endif ASSERT(4 == sLastA.size()); @@ -693,10 +672,10 @@ void TestSubspan() bsl::span cdLastB = cdSpan.last(2); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.last(4))); - ASSERT(!noexcept(csSpan.last(2))); - ASSERT(!noexcept( dSpan.last(4))); - ASSERT(!noexcept(cdSpan.last(2))); + ASSERT_NOT_NOEXCEPT( sSpan.last(4)); + ASSERT_NOT_NOEXCEPT(csSpan.last(2)); + ASSERT_NOT_NOEXCEPT( dSpan.last(4)); + ASSERT_NOT_NOEXCEPT(cdSpan.last(2)); #endif ASSERT(4 == sLastB.size()); @@ -721,15 +700,15 @@ void TestSubspan() bsl::span cdSubA2 = cdSpan.subspan<2, DYN>(); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.subspan<2, 4>())); - ASSERT(!noexcept(csSpan.subspan<1, 2>())); - ASSERT(!noexcept( dSpan.subspan<2, 4>())); - ASSERT(!noexcept(cdSpan.subspan<1, 2>())); - - ASSERT(!noexcept( sSpan.subspan<2, DYN>())); - ASSERT(!noexcept(csSpan.subspan<1, DYN>())); - ASSERT(!noexcept( dSpan.subspan<2, DYN>())); - ASSERT(!noexcept(cdSpan.subspan<1, DYN>())); + ASSERT_NOT_NOEXCEPT( sSpan.subspan<2, 4>()); + ASSERT_NOT_NOEXCEPT(csSpan.subspan<1, 2>()); + ASSERT_NOT_NOEXCEPT( dSpan.subspan<2, 4>()); + ASSERT_NOT_NOEXCEPT(cdSpan.subspan<1, 2>()); + + ASSERT_NOT_NOEXCEPT( sSpan.subspan<2, DYN>()); + ASSERT_NOT_NOEXCEPT(csSpan.subspan<1, DYN>()); + ASSERT_NOT_NOEXCEPT( dSpan.subspan<2, DYN>()); + ASSERT_NOT_NOEXCEPT(cdSpan.subspan<1, DYN>()); #endif ASSERT(4 == sSubA1.size()); @@ -758,10 +737,10 @@ void TestSubspan() bsl::span cdSubB1 = cdSpan.subspan(1, 2); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.subspan(2, 4))); - ASSERT(!noexcept(csSpan.subspan(1, 2))); - ASSERT(!noexcept( dSpan.subspan(2, 4))); - ASSERT(!noexcept(cdSpan.subspan(1, 2))); + ASSERT_NOT_NOEXCEPT( sSpan.subspan(2, 4)); + ASSERT_NOT_NOEXCEPT(csSpan.subspan(1, 2)); + ASSERT_NOT_NOEXCEPT( dSpan.subspan(2, 4)); + ASSERT_NOT_NOEXCEPT(cdSpan.subspan(1, 2)); #endif ASSERT(4 == sSubB1.size()); @@ -780,10 +759,10 @@ void TestSubspan() bsl::span cdSubB2 = cdSpan.subspan(3, DYN); #ifdef TEST_SPAN_NOEXCEPT - ASSERT(!noexcept( sSpan.subspan(4, DYN))); - ASSERT(!noexcept(csSpan.subspan(3, DYN))); - ASSERT(!noexcept( dSpan.subspan(4, DYN))); - ASSERT(!noexcept(cdSpan.subspan(3, DYN))); + ASSERT_NOT_NOEXCEPT( sSpan.subspan(4, DYN)); + ASSERT_NOT_NOEXCEPT(csSpan.subspan(3, DYN)); + ASSERT_NOT_NOEXCEPT( dSpan.subspan(4, DYN)); + ASSERT_NOT_NOEXCEPT(cdSpan.subspan(3, DYN)); #endif ASSERT(6 == sSubB2.size()); @@ -827,27 +806,25 @@ void TestIterators() bsl::span< int> dSpan (&arr[0], 10); bsl::span cdSpan(&arr[5], 4); -#ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept( sSpan.begin())); - ASSERT( noexcept(csSpan.begin())); - ASSERT( noexcept( dSpan.begin())); - ASSERT( noexcept(cdSpan.begin())); - - ASSERT( noexcept( sSpan.end())); - ASSERT( noexcept(csSpan.end())); - ASSERT( noexcept( dSpan.end())); - ASSERT( noexcept(cdSpan.end())); - - ASSERT( noexcept( sSpan.rbegin())); - ASSERT( noexcept(csSpan.rbegin())); - ASSERT( noexcept( dSpan.rbegin())); - ASSERT( noexcept(cdSpan.rbegin())); - - ASSERT( noexcept( sSpan.rend())); - ASSERT( noexcept(csSpan.rend())); - ASSERT( noexcept( dSpan.rend())); - ASSERT( noexcept(cdSpan.rend())); -#endif + ASSERT_NOEXCEPT( sSpan.begin()); + ASSERT_NOEXCEPT(csSpan.begin()); + ASSERT_NOEXCEPT( dSpan.begin()); + ASSERT_NOEXCEPT(cdSpan.begin()); + + ASSERT_NOEXCEPT( sSpan.end()); + ASSERT_NOEXCEPT(csSpan.end()); + ASSERT_NOEXCEPT( dSpan.end()); + ASSERT_NOEXCEPT(cdSpan.end()); + + ASSERT_NOEXCEPT( sSpan.rbegin()); + ASSERT_NOEXCEPT(csSpan.rbegin()); + ASSERT_NOEXCEPT( dSpan.rbegin()); + ASSERT_NOEXCEPT(cdSpan.rbegin()); + + ASSERT_NOEXCEPT( sSpan.rend()); + ASSERT_NOEXCEPT(csSpan.rend()); + ASSERT_NOEXCEPT( dSpan.rend()); + ASSERT_NOEXCEPT(cdSpan.rend()); // Forward iterators idx = 0; From d3a8e68f7b469d4669473e81e8ce446024c2a83f Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Mon, 13 May 2024 10:04:15 -0700 Subject: [PATCH 6/9] Fix some 03 tests --- groups/bsl/bslstl/bslstl_span.h | 10 +++---- groups/bsl/bslstl/bslstl_span.t.cpp | 42 +++++++++++++---------------- 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.h b/groups/bsl/bslstl/bslstl_span.h index 6244f62def..309b825a90 100644 --- a/groups/bsl/bslstl/bslstl_span.h +++ b/groups/bsl/bslstl/bslstl_span.h @@ -1309,7 +1309,7 @@ inline bsl::span::span( bsl::vector& v, typename bsl::enable_if::value, - void *>::type) + void *>::type) BSLS_KEYWORD_NOEXCEPT : d_data_p(v.data()) , d_size(v.size()) { @@ -1321,7 +1321,7 @@ inline bsl::span::span( const bsl::vector& v, typename bsl::enable_if::value, - void *>::type) + void *>::type) BSLS_KEYWORD_NOEXCEPT : d_data_p(v.data()) , d_size(v.size()) { @@ -1333,7 +1333,7 @@ inline bsl::span::span( bsl::basic_string& s, typename bsl::enable_if::value, - void *>::type) + void *>::type) BSLS_KEYWORD_NOEXCEPT : d_data_p(s.data()) , d_size(s.size()) { @@ -1345,7 +1345,7 @@ inline bsl::span::span( const bsl::basic_string& s, typename bsl::enable_if::value, - void *>::type) + void *>::type) BSLS_KEYWORD_NOEXCEPT : d_data_p(s.data()) , d_size(s.size()) { @@ -1357,7 +1357,7 @@ inline bsl::span::span( const bsl::basic_string_view& sv, typename bsl::enable_if::value, - void *>::type) + void *>::type) BSLS_KEYWORD_NOEXCEPT : d_data_p(sv.data()) , d_size(sv.size()) { diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index 23a767b94e..a3b7a4f462 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -118,18 +118,21 @@ void aSsErT(bool condition, const char *message, int line) #define ASSERT_OPT_PASS(EXPR) BSLS_ASSERTTEST_ASSERT_OPT_PASS(EXPR) #define ASSERT_OPT_FAIL(EXPR) BSLS_ASSERTTEST_ASSERT_OPT_FAIL(EXPR) -// We want to test the 'noexcept'-ness of the functions in span, but only if -// (a) we can test them, and (b) we're not using 'std::span', because all three -// implementations of std::span add 'noexcept' to 'front', 'back', 'first', -// 'last', and 'subspan'. -#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT -# ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY -# define TEST_SPAN_NOEXCEPT -# endif +// We want to test the negative 'noexcept'-ness of some functions in span, but +// only if we're not using 'std::span', because all three implementations of +// std::span add 'noexcept' to 'front', 'back', 'first', 'last', and 'subspan'. +#ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY + #define TEST_SPAN_NOEXCEPT 1 #endif +#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT #define ASSERT_NOEXCEPT(...) BSLS_ASSERT( noexcept(__VA_ARGS__)) #define ASSERT_NOT_NOEXCEPT(...) BSLS_ASSERT(!noexcept(__VA_ARGS__)) +#else +#define ASSERT_NOEXCEPT(...) BSLS_ASSERT(true) +#define ASSERT_NOT_NOEXCEPT(...) BSLS_ASSERT(true) +#endif + //============================================================================= // USAGE EXAMPLE @@ -397,9 +400,7 @@ void TestContainerConstructors() { bsl::span arrD(vec); -#ifdef TEST_SPAN_NOEXCEPT ASSERT_NOT_NOEXCEPT(bsl::span(vec)); -#endif ASSERT(vec.data() == arrD.data()); ASSERT(30 == arrD.size()); @@ -409,9 +410,7 @@ void TestContainerConstructors() { bsl::span carrD(cVec); -#ifdef TEST_SPAN_NOEXCEPT ASSERT_NOT_NOEXCEPT(bsl::span(cVec)); -#endif ASSERT(cVec.data() == carrD.data()); ASSERT(30 == carrD.size()); @@ -423,9 +422,7 @@ void TestContainerConstructors() { bsl::span strD(str); -#ifdef TEST_SPAN_NOEXCEPT ASSERT_NOT_NOEXCEPT(bsl::span(str)); -#endif ASSERT(str.data() == strD.data()); ASSERT(5 == strD.size()); @@ -439,9 +436,8 @@ void TestContainerConstructors() { bsl::span cstrD(cStr); -#ifdef TEST_SPAN_NOEXCEPT ASSERT_NOT_NOEXCEPT(bsl::span(cStr)); -#endif + ASSERT(str.data() == cstrD.data()); ASSERT(5 == cstrD.size()); } @@ -451,9 +447,7 @@ void TestContainerConstructors() { bsl::span cstrD(sv); -#ifdef TEST_SPAN_NOEXCEPT ASSERT_NOT_NOEXCEPT(bsl::span(sv)); -#endif ASSERT(sv.data() == cstrD.data()); ASSERT(5 == cstrD.size()); @@ -958,10 +952,10 @@ void TestFreeFunctions () auto dBytes2 = bsl::as_writable_bytes(dSpan2); #ifdef TEST_SPAN_NOEXCEPT - ASSERT( noexcept(bsl::as_bytes(sSpan1))); - ASSERT( noexcept(bsl::as_writable_bytes(sSpan2))); - ASSERT( noexcept(bsl::as_bytes(dSpan1))); - ASSERT( noexcept(bsl::as_writable_bytes(dSpan2))); + ASSERT_NOEXCEPT(bsl::as_bytes(sSpan1)); + ASSERT_NOEXCEPT(bsl::as_writable_bytes(sSpan2)); + ASSERT_NOEXCEPT(bsl::as_bytes(dSpan1)); + ASSERT_NOEXCEPT(bsl::as_writable_bytes(dSpan2)); #endif BSLMF_ASSERT((bsl::is_same_v Date: Mon, 13 May 2024 11:23:29 -0700 Subject: [PATCH 7/9] More noexcept weirdness --- groups/bsl/bslstl/bslstl_span.t.cpp | 43 ++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index a3b7a4f462..5cb0734847 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -197,10 +197,16 @@ void TestBasicConstructors() bsl::span psD(&arr[3], 3); // MSVC erroneously reports these constructors as noexcept. The trigger -// appears to be declaring them as 'constexpr'. Hopefully this will be fixed -// someday. Reported to MS 10-May-2024. -#if defined(TEST_SPAN_NOEXCEPT) && \ - !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1939)) +// appears to be declaring them as 'constexpr'. I reported to MS 10-May-2024. +// They replied (on 13-May): +// +// The short answer is: compile with /permissive-. +// +// The longer answer: MSVC in permissive mode has an extension that allows the +// compiler to adhere to a language rule prior to DR +// https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1351 and we +// can't change it due to back-compat. +#if !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1999)) ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], 5)); ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], 5)); #endif @@ -217,10 +223,16 @@ void TestBasicConstructors() bsl::span ppD(&arr[3], &arr[6]); // MSVC erroneously reports these constructors as noexcept. The trigger -// appears to be declaring them as 'constexpr'. Hopefully this will be fixed -// someday. Reported to MS 10-May-2024. -#if defined(TEST_SPAN_NOEXCEPT) && \ - !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1939)) +// appears to be declaring them as 'constexpr'. I reported to MS 10-May-2024. +// They replied (on 13-May): +// +// The short answer is: compile with /permissive-. +// +// The longer answer: MSVC in permissive mode has an extension that allows the +// compiler to adhere to a language rule prior to DR +// https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1351 and we +// can't change it due to back-compat. +#if !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1999)) ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], &arr[10])); ASSERT_NOT_NOEXCEPT(bsl::span(&arr[3], &arr[ 6])); #endif @@ -400,7 +412,9 @@ void TestContainerConstructors() { bsl::span arrD(vec); +#if defined(TEST_SPAN_NOEXCEPT) ASSERT_NOT_NOEXCEPT(bsl::span(vec)); +#endif ASSERT(vec.data() == arrD.data()); ASSERT(30 == arrD.size()); @@ -410,7 +424,9 @@ void TestContainerConstructors() { bsl::span carrD(cVec); +#if defined(TEST_SPAN_NOEXCEPT) ASSERT_NOT_NOEXCEPT(bsl::span(cVec)); +#endif ASSERT(cVec.data() == carrD.data()); ASSERT(30 == carrD.size()); @@ -422,7 +438,10 @@ void TestContainerConstructors() { bsl::span strD(str); - ASSERT_NOT_NOEXCEPT(bsl::span(str)); +#if defined(TEST_SPAN_NOEXCEPT) + ASSERT_NOT_NOEXCEPT(bsl::span(str)); + ASSERT_NOT_NOEXCEPT(bsl::span(str)); +#endif ASSERT(str.data() == strD.data()); ASSERT(5 == strD.size()); @@ -436,8 +455,10 @@ void TestContainerConstructors() { bsl::span cstrD(cStr); +#if defined(TEST_SPAN_NOEXCEPT) ASSERT_NOT_NOEXCEPT(bsl::span(cStr)); - +#endif + ASSERT(str.data() == cstrD.data()); ASSERT(5 == cstrD.size()); } @@ -447,7 +468,9 @@ void TestContainerConstructors() { bsl::span cstrD(sv); +#if defined(TEST_SPAN_NOEXCEPT) ASSERT_NOT_NOEXCEPT(bsl::span(sv)); +#endif ASSERT(sv.data() == cstrD.data()); ASSERT(5 == cstrD.size()); From 527f1f795d557f054b1ecebec2fee1516c463e2e Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Mon, 13 May 2024 12:02:39 -0700 Subject: [PATCH 8/9] Fix native span constructor tests --- groups/bsl/bslstl/bslstl_span.t.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index 5cb0734847..ca8465fb41 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -120,7 +120,8 @@ void aSsErT(bool condition, const char *message, int line) // We want to test the negative 'noexcept'-ness of some functions in span, but // only if we're not using 'std::span', because all three implementations of -// std::span add 'noexcept' to 'front', 'back', 'first', 'last', and 'subspan'. +// std::span add 'noexcept' to 'front', 'back', 'first', 'last', and 'subspan', +// as well as the '(pointer, pointer)' and '(pointer, size)' constructors. #ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY #define TEST_SPAN_NOEXCEPT 1 #endif @@ -206,7 +207,8 @@ void TestBasicConstructors() // compiler to adhere to a language rule prior to DR // https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1351 and we // can't change it due to back-compat. -#if !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1999)) +#if defined(TEST_SPAN_NOEXCEPT) && \ + !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1999)) ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], 5)); ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], 5)); #endif @@ -232,7 +234,8 @@ void TestBasicConstructors() // compiler to adhere to a language rule prior to DR // https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1351 and we // can't change it due to back-compat. -#if !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1999)) +#if defined(TEST_SPAN_NOEXCEPT) && \ + !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1999)) ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], &arr[10])); ASSERT_NOT_NOEXCEPT(bsl::span(&arr[3], &arr[ 6])); #endif From ca5932483db355be02e3c2e6ff3753bff31a9e4f Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Mon, 13 May 2024 12:50:51 -0700 Subject: [PATCH 9/9] bikeshedding defines --- groups/bsl/bslstl/bslstl_span.t.cpp | 68 ++++++++++++----------------- 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/groups/bsl/bslstl/bslstl_span.t.cpp b/groups/bsl/bslstl/bslstl_span.t.cpp index ca8465fb41..0ac6b3bef6 100644 --- a/groups/bsl/bslstl/bslstl_span.t.cpp +++ b/groups/bsl/bslstl/bslstl_span.t.cpp @@ -123,7 +123,7 @@ void aSsErT(bool condition, const char *message, int line) // std::span add 'noexcept' to 'front', 'back', 'first', 'last', and 'subspan', // as well as the '(pointer, pointer)' and '(pointer, size)' constructors. #ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY - #define TEST_SPAN_NOEXCEPT 1 + #define NOEXCEPT_TEST_ONLY_BSL_SPAN 1 #endif #ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT @@ -134,7 +134,6 @@ void aSsErT(bool condition, const char *message, int line) #define ASSERT_NOT_NOEXCEPT(...) BSLS_ASSERT(true) #endif - //============================================================================= // USAGE EXAMPLE //----------------------------------------------------------------------------- @@ -192,14 +191,9 @@ void TestBasicConstructors() ASSERT(0 == defD.size()); } - // pointer, size - { - bsl::span psS(&arr[5], 5); - bsl::span psD(&arr[3], 3); - -// MSVC erroneously reports these constructors as noexcept. The trigger -// appears to be declaring them as 'constexpr'. I reported to MS 10-May-2024. -// They replied (on 13-May): +// MSVC erroneously reports the two constructors (pointer, size) and (pointer, +// pointer) as noexcept. The trigger appears to be declaring them as +// 'constexpr'. I reported to MS on 10-May-2024. They replied (on 13-May): // // The short answer is: compile with /permissive-. // @@ -207,7 +201,13 @@ void TestBasicConstructors() // compiler to adhere to a language rule prior to DR // https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1351 and we // can't change it due to back-compat. -#if defined(TEST_SPAN_NOEXCEPT) && \ + + // pointer, size + { + bsl::span psS(&arr[5], 5); + bsl::span psD(&arr[3], 3); + +#if defined(NOEXCEPT_TEST_ONLY_BSL_SPAN) && \ !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1999)) ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], 5)); ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], 5)); @@ -224,17 +224,7 @@ void TestBasicConstructors() bsl::span ppS(&arr[5], &arr[10]); bsl::span ppD(&arr[3], &arr[6]); -// MSVC erroneously reports these constructors as noexcept. The trigger -// appears to be declaring them as 'constexpr'. I reported to MS 10-May-2024. -// They replied (on 13-May): -// -// The short answer is: compile with /permissive-. -// -// The longer answer: MSVC in permissive mode has an extension that allows the -// compiler to adhere to a language rule prior to DR -// https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1351 and we -// can't change it due to back-compat. -#if defined(TEST_SPAN_NOEXCEPT) && \ +#if defined(NOEXCEPT_TEST_ONLY_BSL_SPAN) && \ !(defined(BSLS_PLATFORM_CMP_MSVC) && (BSLS_PLATFORM_CMP_VERSION <= 1999)) ASSERT_NOT_NOEXCEPT(bsl::span(&arr[5], &arr[10])); ASSERT_NOT_NOEXCEPT(bsl::span(&arr[3], &arr[ 6])); @@ -415,7 +405,7 @@ void TestContainerConstructors() { bsl::span arrD(vec); -#if defined(TEST_SPAN_NOEXCEPT) +#if defined(NOEXCEPT_TEST_ONLY_BSL_SPAN) ASSERT_NOT_NOEXCEPT(bsl::span(vec)); #endif @@ -427,7 +417,7 @@ void TestContainerConstructors() { bsl::span carrD(cVec); -#if defined(TEST_SPAN_NOEXCEPT) +#if defined(NOEXCEPT_TEST_ONLY_BSL_SPAN) ASSERT_NOT_NOEXCEPT(bsl::span(cVec)); #endif @@ -441,7 +431,7 @@ void TestContainerConstructors() { bsl::span strD(str); -#if defined(TEST_SPAN_NOEXCEPT) +#if defined(NOEXCEPT_TEST_ONLY_BSL_SPAN) ASSERT_NOT_NOEXCEPT(bsl::span(str)); ASSERT_NOT_NOEXCEPT(bsl::span(str)); #endif @@ -458,7 +448,7 @@ void TestContainerConstructors() { bsl::span cstrD(cStr); -#if defined(TEST_SPAN_NOEXCEPT) +#if defined(NOEXCEPT_TEST_ONLY_BSL_SPAN) ASSERT_NOT_NOEXCEPT(bsl::span(cStr)); #endif @@ -471,7 +461,7 @@ void TestContainerConstructors() { bsl::span cstrD(sv); -#if defined(TEST_SPAN_NOEXCEPT) +#if defined(NOEXCEPT_TEST_ONLY_BSL_SPAN) ASSERT_NOT_NOEXCEPT(bsl::span(sv)); #endif @@ -563,7 +553,7 @@ void TestAccessors() ASSERT(&arr[5] == cdSpan.data()); // front -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.front()); ASSERT_NOT_NOEXCEPT(csSpan.front()); ASSERT_NOT_NOEXCEPT( dSpan.front()); @@ -576,7 +566,7 @@ void TestAccessors() ASSERT(5 == cdSpan.front()); // back -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.back()); ASSERT_NOT_NOEXCEPT(csSpan.back()); ASSERT_NOT_NOEXCEPT( dSpan.back()); @@ -589,7 +579,7 @@ void TestAccessors() ASSERT(8 == cdSpan.back()); // operator[] -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan[0]); ASSERT_NOT_NOEXCEPT(csSpan[0]); ASSERT_NOT_NOEXCEPT( dSpan[0]); @@ -624,7 +614,7 @@ void TestSubspan() bsl::span dFirstA = dSpan.first<4>(); bsl::span cdFirstA = cdSpan.first<2>(); -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.first<4>()); ASSERT_NOT_NOEXCEPT(csSpan.first<2>()); ASSERT_NOT_NOEXCEPT( dSpan.first<4>()); @@ -646,7 +636,7 @@ void TestSubspan() bsl::span dFirstB = dSpan.first(4); bsl::span cdFirstB = cdSpan.first(2); -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.first(4)); ASSERT_NOT_NOEXCEPT(csSpan.first(2)); ASSERT_NOT_NOEXCEPT( dSpan.first(4)); @@ -669,7 +659,7 @@ void TestSubspan() bsl::span dLastA = dSpan.last<4>(); bsl::span cdLastA = cdSpan.last<2>(); -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.last<4>()); ASSERT_NOT_NOEXCEPT(csSpan.last<2>()); ASSERT_NOT_NOEXCEPT( dSpan.last<4>()); @@ -691,7 +681,7 @@ void TestSubspan() bsl::span dLastB = dSpan.last(4); bsl::span cdLastB = cdSpan.last(2); -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.last(4)); ASSERT_NOT_NOEXCEPT(csSpan.last(2)); ASSERT_NOT_NOEXCEPT( dSpan.last(4)); @@ -719,7 +709,7 @@ void TestSubspan() bsl::span dSubA2 = sSpan.subspan<4, DYN>(); bsl::span cdSubA2 = cdSpan.subspan<2, DYN>(); -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.subspan<2, 4>()); ASSERT_NOT_NOEXCEPT(csSpan.subspan<1, 2>()); ASSERT_NOT_NOEXCEPT( dSpan.subspan<2, 4>()); @@ -756,7 +746,7 @@ void TestSubspan() bsl::span dSubB1 = dSpan.subspan(2, 4); bsl::span cdSubB1 = cdSpan.subspan(1, 2); -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.subspan(2, 4)); ASSERT_NOT_NOEXCEPT(csSpan.subspan(1, 2)); ASSERT_NOT_NOEXCEPT( dSpan.subspan(2, 4)); @@ -778,7 +768,7 @@ void TestSubspan() bsl::span dSubB2 = dSpan.subspan(4, DYN); bsl::span cdSubB2 = cdSpan.subspan(3, DYN); -#ifdef TEST_SPAN_NOEXCEPT +#ifdef NOEXCEPT_TEST_ONLY_BSL_SPAN ASSERT_NOT_NOEXCEPT( sSpan.subspan(4, DYN)); ASSERT_NOT_NOEXCEPT(csSpan.subspan(3, DYN)); ASSERT_NOT_NOEXCEPT( dSpan.subspan(4, DYN)); @@ -977,12 +967,10 @@ void TestFreeFunctions () auto dBytes1 = bsl::as_bytes(dSpan1); auto dBytes2 = bsl::as_writable_bytes(dSpan2); -#ifdef TEST_SPAN_NOEXCEPT ASSERT_NOEXCEPT(bsl::as_bytes(sSpan1)); ASSERT_NOEXCEPT(bsl::as_writable_bytes(sSpan2)); ASSERT_NOEXCEPT(bsl::as_bytes(dSpan1)); ASSERT_NOEXCEPT(bsl::as_writable_bytes(dSpan2)); -#endif BSLMF_ASSERT((bsl::is_same_v>)); @@ -1014,10 +1002,8 @@ void TestFreeFunctions () bsl::swap(sSpan1, sSpan2); bsl::swap(dSpan1, dSpan2); -#ifdef TEST_SPAN_NOEXCEPT ASSERT_NOEXCEPT(swap(sSpan1, sSpan2)); ASSERT_NOEXCEPT(swap(dSpan1, dSpan2)); -#endif ASSERT(&arr[1] == sSpan1.data()); ASSERT(5 == sSpan1.size());