summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2019-01-22 22:01:13 +0000
committerMarshall Clow <mclow.lists@gmail.com>2019-01-22 22:01:13 +0000
commit8f302e62220c6e73afc7e28d9fac53a1c747bef9 (patch)
treef3177fb6310af1df220034fc6de8eab8a3a8dd66
parent4c5e8f51e77b925cc1476b9fd6f584ee0c2845da (diff)
downloadbcm5719-llvm-8f302e62220c6e73afc7e28d9fac53a1c747bef9.tar.gz
bcm5719-llvm-8f302e62220c6e73afc7e28d9fac53a1c747bef9.zip
While reviewing D57058, Louis had some questions about the existing span constructor tests. They were not testing the stuff that they said they were. Updated the tests to test what they should have been doing
llvm-svn: 351887
-rw-r--r--libcxx/test/std/containers/views/span.cons/container.fail.cpp80
-rw-r--r--libcxx/test/std/containers/views/span.cons/container.pass.cpp25
2 files changed, 69 insertions, 36 deletions
diff --git a/libcxx/test/std/containers/views/span.cons/container.fail.cpp b/libcxx/test/std/containers/views/span.cons/container.fail.cpp
index 202e6848c10..cfffa57a1e3 100644
--- a/libcxx/test/std/containers/views/span.cons/container.fail.cpp
+++ b/libcxx/test/std/containers/views/span.cons/container.fail.cpp
@@ -26,9 +26,10 @@
#include <span>
#include <cassert>
-#include <list>
-#include <forward_list>
#include <deque>
+#include <forward_list>
+#include <list>
+#include <vector>
#include "test_macros.h"
@@ -65,52 +66,67 @@ private:
int main ()
{
-// Missing size and/or data
+// Making non-const spans from const sources (a temporary binds to `const &`)
{
std::span<int> s1{IsAContainer<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span<int, 0> s2{IsAContainer<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
- std::span<int> s3{NotAContainerNoData<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span<int, 0> s4{NotAContainerNoData<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
- std::span<int> s5{NotAContainerNoSize<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span<int, 0> s6{NotAContainerNoSize<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
- std::span<int> s7{NotAContainerPrivate<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span<int, 0> s8{NotAContainerPrivate<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
+ std::span<int, 0> s2{IsAContainer<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
+ std::span<int> s3{std::vector<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
+ std::span<int, 0> s4{std::vector<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
+ }
+
+// Missing size and/or data
+ {
+ std::span<const int> s1{NotAContainerNoData<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
+ std::span<const int, 0> s2{NotAContainerNoData<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 0>'}}
+ std::span<const int> s3{NotAContainerNoSize<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
+ std::span<const int, 0> s4{NotAContainerNoSize<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 0>'}}
+ std::span<const int> s5{NotAContainerPrivate<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
+ std::span<const int, 0> s6{NotAContainerPrivate<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 0>'}}
// Again with the standard containers
- std::span<int> s11{std::deque<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span<int, 0> s12{std::deque<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
- std::span<int> s13{std::list<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span<int, 0> s14{std::list<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
- std::span<int> s15{std::forward_list<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span<int, 0> s16{std::forward_list<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 0>'}}
+ std::span<const int> s11{std::deque<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
+ std::span<const int, 0> s12{std::deque<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 0>'}}
+ std::span<const int> s13{std::list<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
+ std::span<const int, 0> s14{std::list<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 0>'}}
+ std::span<const int> s15{std::forward_list<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
+ std::span<const int, 0> s16{std::forward_list<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 0>'}}
}
// Not the same type
{
- std::span<float> s1{IsAContainer<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<float>'}}
- std::span<float, 0> s2{IsAContainer<int>()}; // expected-error {{no matching constructor for initialization of 'std::span<float, 0>'}}
+ IsAContainer<int> c;
+ std::span<float> s1{c}; // expected-error {{no matching constructor for initialization of 'std::span<float>'}}
+ std::span<float, 0> s2{c}; // expected-error {{no matching constructor for initialization of 'std::span<float, 0>'}}
}
// CV wrong (dynamically sized)
{
- std::span< int> s1{IsAContainer<const int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span< int> s2{IsAContainer< volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span< int> s3{IsAContainer<const volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
- std::span<const int> s4{IsAContainer< volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
- std::span<const int> s5{IsAContainer<const volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
- std::span< volatile int> s6{IsAContainer<const int>()}; // expected-error {{no matching constructor for initialization of 'std::span<volatile int>'}}
- std::span< volatile int> s7{IsAContainer<const volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<volatile int>'}}
+ IsAContainer<const int> c;
+ IsAContainer<const volatile int> cv;
+ IsAContainer< volatile int> v;
+
+ std::span< int> s1{c}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
+ std::span< int> s2{v}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
+ std::span< int> s3{cv}; // expected-error {{no matching constructor for initialization of 'std::span<int>'}}
+ std::span<const int> s4{v}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
+ std::span<const int> s5{cv}; // expected-error {{no matching constructor for initialization of 'std::span<const int>'}}
+ std::span< volatile int> s6{c}; // expected-error {{no matching constructor for initialization of 'std::span<volatile int>'}}
+ std::span< volatile int> s7{cv}; // expected-error {{no matching constructor for initialization of 'std::span<volatile int>'}}
}
// CV wrong (statically sized)
{
- std::span< int,1> s1{IsAContainer<const int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 1>'}}
- std::span< int,1> s2{IsAContainer< volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 1>'}}
- std::span< int,1> s3{IsAContainer<const volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<int, 1>'}}
- std::span<const int,1> s4{IsAContainer< volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 1>'}}
- std::span<const int,1> s5{IsAContainer<const volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 1>'}}
- std::span< volatile int,1> s6{IsAContainer<const int>()}; // expected-error {{no matching constructor for initialization of 'std::span<volatile int, 1>'}}
- std::span< volatile int,1> s7{IsAContainer<const volatile int>()}; // expected-error {{no matching constructor for initialization of 'std::span<volatile int, 1>'}}
+ IsAContainer<const int> c;
+ IsAContainer<const volatile int> cv;
+ IsAContainer< volatile int> v;
+
+ std::span< int,1> s1{c}; // expected-error {{no matching constructor for initialization of 'std::span<int, 1>'}}
+ std::span< int,1> s2{v}; // expected-error {{no matching constructor for initialization of 'std::span<int, 1>'}}
+ std::span< int,1> s3{cv}; // expected-error {{no matching constructor for initialization of 'std::span<int, 1>'}}
+ std::span<const int,1> s4{v}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 1>'}}
+ std::span<const int,1> s5{cv}; // expected-error {{no matching constructor for initialization of 'std::span<const int, 1>'}}
+ std::span< volatile int,1> s6{c}; // expected-error {{no matching constructor for initialization of 'std::span<volatile int, 1>'}}
+ std::span< volatile int,1> s7{cv}; // expected-error {{no matching constructor for initialization of 'std::span<volatile int, 1>'}}
}
}
diff --git a/libcxx/test/std/containers/views/span.cons/container.pass.cpp b/libcxx/test/std/containers/views/span.cons/container.pass.cpp
index 8bd5f613d53..4e9001bff8d 100644
--- a/libcxx/test/std/containers/views/span.cons/container.pass.cpp
+++ b/libcxx/test/std/containers/views/span.cons/container.pass.cpp
@@ -73,6 +73,18 @@ void checkCV()
std::span< volatile int,3> s3{v}; // a span< volatile int> pointing at const int.
std::span<const volatile int,3> s4{v}; // a span<const volatile int> pointing at int.
}
+
+// Constructing a const view from a temporary
+ {
+ std::span<const int> s1{IsAContainer<int>()};
+ std::span<const int, 0> s2{IsAContainer<int>()};
+ std::span<const int> s3{std::vector<int>()};
+ std::span<const int, 0> s4{std::vector<int>()};
+ (void) s1;
+ (void) s2;
+ (void) s3;
+ (void) s4;
+ }
}
@@ -92,10 +104,15 @@ template <typename T>
void testRuntimeSpan()
{
IsAContainer<T> val{};
- std::span<const T> s1{val};
- std::span<const T, 1> s2{val};
- assert(s1.data() == val.getV() && s1.size() == 1);
- assert(s2.data() == val.getV() && s2.size() == 1);
+ const IsAContainer<T> cVal;
+ std::span<T> s1{val};
+ std::span<const T> s2{cVal};
+ std::span<T, 1> s3{val};
+ std::span<const T, 1> s4{cVal};
+ assert(s1.data() == val.getV() && s1.size() == 1);
+ assert(s2.data() == cVal.getV() && s2.size() == 1);
+ assert(s3.data() == val.getV() && s3.size() == 1);
+ assert(s4.data() == cVal.getV() && s4.size() == 1);
}
struct A{};
OpenPOWER on IntegriCloud