Implement LWG#2761: 'basic_string should require that charT match traits::char_type'. Tests for string_view, too
llvm-svn: 297872
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 4069c2bc483b31ba78075a42d939d97d9256e2fb
diff --git a/include/string b/include/string
index e1c64fa..714ff84 100644
--- a/include/string
+++ b/include/string
@@ -637,7 +637,7 @@
typedef basic_string __self;
typedef basic_string_view<_CharT, _Traits> __self_view;
typedef _Traits traits_type;
- typedef typename traits_type::char_type value_type;
+ typedef _CharT value_type;
typedef _Allocator allocator_type;
typedef allocator_traits<allocator_type> __alloc_traits;
typedef typename __alloc_traits::size_type size_type;
@@ -648,7 +648,7 @@
typedef typename __alloc_traits::const_pointer const_pointer;
static_assert(is_pod<value_type>::value, "Character type of basic_string must be a POD");
- static_assert((is_same<_CharT, value_type>::value),
+ static_assert((is_same<_CharT, typename traits_type::char_type>::value),
"traits_type::char_type must be the same type as CharT");
static_assert((is_same<typename allocator_type::value_type, value_type>::value),
"Allocator::value_type must be same type as value_type");
diff --git a/include/string_view b/include/string_view
index 8be6132..5c42b36 100644
--- a/include/string_view
+++ b/include/string_view
@@ -199,6 +199,10 @@
typedef ptrdiff_t difference_type;
static _LIBCPP_CONSTEXPR const size_type npos = -1; // size_type(-1);
+ static_assert(is_pod<value_type>::value, "Character type of basic_string_view must be a POD");
+ static_assert((is_same<_CharT, typename traits_type::char_type>::value),
+ "traits_type::char_type must be the same type as CharT");
+
// [string.view.cons], construct/copy
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
basic_string_view() _NOEXCEPT : __data (nullptr), __size(0) {}
diff --git a/test/std/strings/string.view/nothing_to_do.pass.cpp b/test/std/strings/basic.string/traits_mismatch.fail.cpp
similarity index 66%
copy from test/std/strings/string.view/nothing_to_do.pass.cpp
copy to test/std/strings/basic.string/traits_mismatch.fail.cpp
index 353dd98..1d54238 100644
--- a/test/std/strings/string.view/nothing_to_do.pass.cpp
+++ b/test/std/strings/basic.string/traits_mismatch.fail.cpp
@@ -7,6 +7,12 @@
//
//===----------------------------------------------------------------------===//
-#include <string_view>
+// <string>
+// The strings's value type must be the same as the traits's char_type
-int main () {}
+#include <string>
+
+int main()
+{
+ std::basic_string<char, std::char_traits<wchar_t>> s;
+}
diff --git a/test/std/strings/string.view/nothing_to_do.pass.cpp b/test/std/strings/string.view/traits_mismatch.fail.cpp
similarity index 68%
rename from test/std/strings/string.view/nothing_to_do.pass.cpp
rename to test/std/strings/string.view/traits_mismatch.fail.cpp
index 353dd98..6cd15e6 100644
--- a/test/std/strings/string.view/nothing_to_do.pass.cpp
+++ b/test/std/strings/string.view/traits_mismatch.fail.cpp
@@ -7,6 +7,12 @@
//
//===----------------------------------------------------------------------===//
+// <string_view>
+// The string_views's value type must be the same as the traits's char_type
+
#include <string_view>
-int main () {}
+int main()
+{
+ std::basic_string_view<char, std::char_traits<wchar_t>> s;
+}
diff --git a/www/cxx1z_status.html b/www/cxx1z_status.html
index cb6da83..8a2939a 100644
--- a/www/cxx1z_status.html
+++ b/www/cxx1z_status.html
@@ -463,7 +463,7 @@
<tr><td><a href="http://wg21.link/LWG2853">2853</a></td><td>Possible inconsistency in specification of erase in [vector.modifiers]</td><td>Kona</td><td></td></tr>
<tr><td><a href="http://wg21.link/LWG2855">2855</a></td><td>std::throw_with_nested("string_literal")</td><td>Kona</td><td></td></tr>
<tr><td><a href="http://wg21.link/LWG2857">2857</a></td><td>{variant,optional,any}::emplace should return the constructed value</td><td>Kona</td><td></td></tr>
- <tr><td><a href="http://wg21.link/LWG2861">2861</a></td><td>basic_string should require that charT match traits::char_type</td><td>Kona</td><td></td></tr>
+ <tr><td><a href="http://wg21.link/LWG2861">2861</a></td><td>basic_string should require that charT match traits::char_type</td><td>Kona</td><td>Clow</td></tr>
<tr><td><a href="http://wg21.link/LWG2866">2866</a></td><td>Incorrect derived classes constraints</td><td>Kona</td><td></td></tr>
<tr><td><a href="http://wg21.link/LWG2868">2868</a></td><td>Missing specification of bad_any_cast::what()</td><td>Kona</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2872">2872</a></td><td>Add definition for direct-non-list-initialization</td><td>Kona</td><td>Complete</td></tr>