+2018-04-09 Simon Marchi <simon.marchi@polymtl.ca>
+
+ * Makefile.in (SUBDIR_UNITTESTS_SRCS): Add
+ string_view-selftests.c.
+ * unittests/basic_string_view/capacity/1.cc: Adapt to GDB
+ testsuite.
+ * unittests/basic_string_view/cons/char/1.cc: Likewise.
+ * unittests/basic_string_view/cons/char/2.cc: Likewise.
+ * unittests/basic_string_view/cons/char/3.cc: Likewise.
+ * unittests/basic_string_view/element_access/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/element_access/char/empty.cc:
+ Likewise.
+ * unittests/basic_string_view/element_access/char/front_back.cc:
+ Likewise.
+ * unittests/basic_string_view/inserters/char/2.cc: Likewise.
+ * unittests/basic_string_view/modifiers/remove_prefix/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/modifiers/remove_suffix/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/modifiers/swap/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/compare/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/compare/char/13650.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/copy/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/data/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/find/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/find/char/2.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/find/char/3.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/find/char/4.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/rfind/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/rfind/char/2.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/rfind/char/3.cc:
+ Likewise.
+ * unittests/basic_string_view/operations/substr/char/1.cc:
+ Likewise.
+ * unittests/basic_string_view/operators/char/2.cc: Likewise.
+ * unittests/string_view-selftests.c: New file.
+
2018-04-09 Simon Marchi <simon.marchi@polymtl.ca>
* unittests/basic_string_view/capacity/1.cc: New file.
unittests/scoped_fd-selftests.c \
unittests/scoped_mmap-selftests.c \
unittests/scoped_restore-selftests.c \
+ unittests/string_view-selftests.c \
unittests/tracepoint-selftests.c \
unittests/unpack-selftests.c \
unittests/utils-selftests.c \
// string_view size, length
-#include <string_view>
-#include <cstring>
-#include <testsuite_hooks.h>
+namespace capacity_1 {
template<typename T>
struct A { };
struct B { };
+} // namespace capacity_1
+} // namespace string_view
+} // namespace selftests
+
// char_traits specialization
namespace std
{
template<>
- struct char_traits<A<B> >
+ struct char_traits<selftests::string_view::capacity_1::A<
+ selftests::string_view::capacity_1::B> >
{
- typedef A<B> char_type;
+ typedef selftests::string_view::capacity_1::A<
+ selftests::string_view::capacity_1::B> char_type;
// Unsigned as wint_t in unsigned.
typedef unsigned long int_type;
typedef streampos pos_type;
};
} // namespace std
+namespace selftests {
+namespace string_view {
+namespace capacity_1 {
+
void
test01()
{
- std::basic_string_view<A<B>> str02;
- typedef std::basic_string_view< A<B> >::size_type size_type_o;
+ gdb::basic_string_view<A<B>> str02;
+ typedef gdb::basic_string_view< A<B> >::size_type size_type_o;
size_type_o sz03;
size_type_o sz04;
return 0;
}
+
+} // namespace capacity_1
// basic_string_view constructors.
-#include <string_view>
-#include <string>
-#include <cstring>
-#include <testsuite_hooks.h>
+namespace cons_1 {
void
test01()
{
- typedef std::string_view::size_type csize_type;
+ typedef gdb::string_view::size_type csize_type;
// basic_string_view()
- const std::string_view str00{};
+ const gdb::string_view str00{};
VERIFY( str00.length() == 0 );
VERIFY( str00.data() == nullptr );
// basic_string_view(const char*)
const char str_lit01[] = "rodeo beach, marin";
- const std::string_view str01{str_lit01};
+ const gdb::string_view str01{str_lit01};
VERIFY( str01.length() == 18 );
VERIFY( str01.data() == str_lit01 );
- const std::string_view str02{"baker beach, san francisco"};
+ const gdb::string_view str02{"baker beach, san francisco"};
VERIFY( str02.length() == 26 );
// basic_string_view(const string_view&)
- std::string_view str04{str01};
+ gdb::string_view str04{str01};
VERIFY( str04.length() == str01.length() );
VERIFY( str04.data() == str01.data() );
// basic_string_view(const char* s)
csize_type len_lit01 = strlen(str_lit01);
- std::string_view str05{str_lit01, len_lit01};
+ gdb::string_view str05{str_lit01, len_lit01};
VERIFY( str05.length() == len_lit01 );
VERIFY( str05.data() == str_lit01 );
// basic_string_view(basic_string& s)
std::string istr07(10, 'z');
- std::string_view str07{istr07};
+ gdb::string_view str07{istr07};
VERIFY( str07.length() == 10 );
}
return 0;
}
+
+} // namespace cons_1
// basic_string_view constructors.
-#include <new>
-#include <string_view>
-#include <stdexcept>
-#include <testsuite_hooks.h>
+namespace cons_2 {
void
test03()
// These are tests to see how basic_string_view handles data with NUL
// bytes. Obviously basic_string_view(char*) will halt at the first one, but
// nothing else should.
- std::string_view s1(with_nulls, 28);
+ gdb::string_view s1(with_nulls, 28);
VERIFY( s1.size() == 28 );
- std::string_view s2(s1);
+ gdb::string_view s2(s1);
VERIFY( s2.size() == 28 );
}
return 0;
}
+
+} // namespace cons_2
// basic_string_view constructors.
-#include <string_view>
-#include <vector>
-#include <testsuite_hooks.h>
+namespace cons_3 {
void
test05()
{
char const * s = 0;
- std::string_view zero_length_built_with_NULL(s, 0);
+ gdb::string_view zero_length_built_with_NULL(s, 0);
}
int
return 0;
}
+
+} // namespace cons_3
// basic_string element access
-#include <string_view>
-#include <stdexcept>
-#include <testsuite_hooks.h>
+namespace element_access_1 {
void
test01()
{
- typedef std::string_view::size_type csize_type;
- typedef std::string_view::const_reference cref;
- typedef std::string_view::reference ref;
+ typedef gdb::string_view::size_type csize_type;
+ typedef gdb::string_view::const_reference cref;
+ typedef gdb::string_view::reference ref;
csize_type csz01, csz02;
- const std::string_view str01("tamarindo, costa rica");
- std::string_view str02("41st street beach, capitola, california");
- std::string_view str03;
+ const gdb::string_view str01("tamarindo, costa rica");
+ gdb::string_view str02("41st street beach, capitola, california");
+ gdb::string_view str03;
// const_reference operator[] (size_type pos) const;
csz01 = str01.size();
str01.at(csz01);
VERIFY( false ); // Should not get here, as exception thrown.
}
- catch (std::out_of_range& fail)
+ catch (gdb_exception& fail)
{
VERIFY( true );
}
test01();
return 0;
}
+
+} // namespace element_access_1
// <http://www.gnu.org/licenses/>.
//
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace element_access_empty {
int
main()
{
{
- std::string_view empty;
+ gdb::string_view empty;
VERIFY( empty.empty() );
}
{
- const std::string_view empty;
+ const gdb::string_view empty;
VERIFY( empty.empty() );
}
return 0;
}
+
+} // namespace element_access_empty
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace element_access_front_back {
void
test01()
{
- std::string_view str("ramifications");
- const std::string_view cstr("melodien");
+ gdb::string_view str("ramifications");
+ const gdb::string_view cstr("melodien");
VERIFY( str.front() == 'r' );
VERIFY( str.back() == 's' );
return 0;
}
+
+} // namespace element_access_front_back
// { dg-options "-std=gnu++17" }
// { dg-require-fileio "" }
-#include <string_view>
-#include <string>
-#include <fstream>
-#include <iostream>
-#include <testsuite_hooks.h>
+namespace inserters_2 {
// testing basic_filebuf::xsputn via stress testing with large string_views
// based on a bug report libstdc++ 9
void
test05(std::size_t size)
{
- bool test = true;
+ bool test ATTRIBUTE_UNUSED = true;
const char filename[] = "inserters_extractors-2.txt";
const char fillc = 'f';
std::ofstream ofs(filename);
std::string str(size, fillc);
- std::string_view strv{str};
+ gdb::string_view strv{str};
// sanity checks
VERIFY( str.size() == size );
return 0;
}
+
+} // namespace inserters_2
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace modifiers_remove_prefix {
void
test01()
{
- using std::string_view;
+ using gdb::string_view;
string_view str0{"olympus mons"};
string_view::pointer p = str0.data();
VERIFY( str0 == string_view{"pus mons"} );
}
+#ifndef GDB_STRING_VIEW
constexpr bool
test02()
{
return true;
}
+#endif
int
main()
{
test01();
+#ifndef GDB_STRING_VIEW
static_assert( test02() );
+#endif
return 0;
}
+
+} // namespace modifiers_remove_prefix
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace modifiers_remove_suffix {
void
test01()
{
- using std::string_view;
+ using gdb::string_view;
string_view str0{"olympus mons"};
string_view::pointer p = str0.data();
VERIFY( str0 == string_view{"olympus mo"} );
}
+#ifndef GDB_STRING_VIEW
constexpr bool
test02()
{
return true;
}
+#endif
int
main()
{
test01();
+#ifndef GDB_STRING_VIEW
static_assert( test02() );
+#endif
return 0;
}
+
+} // namespace modifiers_remove_suffix
// { dg-options "-std=gnu++17" }
// { dg-do compile { target c++17 } }
-#include <string_view>
+namespace modifiers_swap {
-constexpr bool
+void
test01()
{
- using std::string_view;
+ using gdb::string_view;
string_view s1{"last"};
string_view s2{"first"};
s1.swap(s2);
- return s1 == "first" && s2 == "last";
+ VERIFY( s1 == "first" );
+ VERIFY( s2 == "last" );
}
-static_assert( test01() );
+} // namespace modifiers_swap
// NB compare should be thought of as a lexographical compare, ie how
// things would be sorted in a dictionary.
-#include <string_view>
-#include <cstring>
-#include <testsuite_hooks.h>
+namespace operations_compare_1 {
enum want_value {lt=0, z=1, gt=2};
int
test01()
{
- using std::string_view;
+ using gdb::string_view;
string_view str_0("costa rica");
string_view str_1("costa marbella");
return 0;
}
+
+} // namespace operations_compare_1
// basic_string_view::compare [lib.string_view::compare]
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_compare_13650 {
// libstdc++/13650
void
test01()
{
- using std::string_view;
+ using gdb::string_view;
const char lit_01[]{ 'w', 'e', '\0', 'r', 'd' };
const char lit_02[]{ 'w', 'e', 'i', '\0', 'd' };
return 0;
}
+
+} // namespace operations_compare_13650
// basic_string_view::copy
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_copy_1 {
void
test01()
{
- typedef std::string_view::size_type csize_type;
+ typedef gdb::string_view::size_type csize_type;
const char str_lit01[] = "123456789A";
- const std::string_view str01(str_lit01);
+ const gdb::string_view str01(str_lit01);
char buffer[4] = { 0 };
csize_type len = str01.copy(buffer, sizeof(buffer), 8);
return 0;
}
+
+} // namespace operations_copy_1
// string_view operations
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_data_1 {
int
test01()
{
- std::string_view empty;
+ gdb::string_view empty;
VERIFY( empty.size() == 0 );
- const std::string_view::value_type* p = empty.data();
+ const gdb::string_view::value_type* p = empty.data();
VERIFY( p == nullptr );
return 0;
return 0;
}
+
+} // namespace operations_data_1
// basic_string_view find
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_find_1 {
void
test01()
{
- typedef std::string_view::size_type csize_type;
- typedef std::string_view::const_reference cref;
- typedef std::string_view::reference ref;
- csize_type npos = std::string_view::npos;
+ typedef gdb::string_view::size_type csize_type;
+ typedef gdb::string_view::const_reference cref;
+ typedef gdb::string_view::reference ref;
+ csize_type npos = gdb::string_view::npos;
csize_type csz01, csz02;
const char str_lit01[] = "mave";
- const std::string_view str01("mavericks, santa cruz");
- std::string_view str02(str_lit01);
- std::string_view str03("s, s");
- std::string_view str04;
+ const gdb::string_view str01("mavericks, santa cruz");
+ gdb::string_view str02(str_lit01);
+ gdb::string_view str03("s, s");
+ gdb::string_view str04;
// size_type find(const string_view&, size_type pos = 0) const;
csz01 = str01.find(str01);
VERIFY( csz01 == npos );
}
+#ifndef GDB_STRING_VIEW
constexpr bool
test02()
{
return true;
}
-
+#endif
int
main()
{
test01();
+#ifndef GDB_STRING_VIEW
static_assert( test02() );
+#endif
return 0;
}
+
+} // namespace operations_find_1
// basic_string_view find_first_of
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_find_2 {
void
test02()
{
- typedef std::string_view::size_type csize_type;
- csize_type npos = std::string_view::npos;
+ typedef gdb::string_view::size_type csize_type;
+ csize_type npos = gdb::string_view::npos;
csize_type csz01, csz02;
const char str_lit01[] = "mave";
- const std::string_view str01("mavericks, santa cruz");
- std::string_view str02(str_lit01);
- std::string_view str03("s, s");
- std::string_view str04;
+ const gdb::string_view str01("mavericks, santa cruz");
+ gdb::string_view str02(str_lit01);
+ gdb::string_view str03("s, s");
+ gdb::string_view str04;
// size_type find_first_of(const string_view&, size_type pos = 0) const;
- std::string_view str05("xena rulez");
+ gdb::string_view str05("xena rulez");
csz01 = str01.find_first_of(str01);
VERIFY( csz01 == 0 );
csz01 = str01.find_first_of(str01, 4);
VERIFY( csz01 == csz02 );
}
+#ifndef GDB_STRING_VIEW
constexpr bool
test03()
{
return true;
}
+#endif
int
main()
{
test02();
+#ifndef GDB_STRING_VIEW
static_assert( test03() );
+#endif
return 0;
}
+
+} // namespace operations_find_2 {
// basic_string_view find_first_not_of
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_find_3 {
void
test03()
{
- typedef std::string_view::size_type csize_type;
- csize_type npos = std::string_view::npos;
+ typedef gdb::string_view::size_type csize_type;
+ csize_type npos = gdb::string_view::npos;
csize_type csz01;
- const std::string_view str01("Bob Rock, per me");
+ const gdb::string_view str01("Bob Rock, per me");
const char str_lit01[] = "Bob Rock";
- std::string_view str02("ovvero Trivi");
- std::string_view str03(str_lit01);
- std::string_view str04;
+ gdb::string_view str02("ovvero Trivi");
+ gdb::string_view str03(str_lit01);
+ gdb::string_view str04;
// size_type find_first_not_of(const string_view&, size_type pos = 0) const;
csz01 = str01.find_first_not_of(str01);
VERIFY( csz01 == npos );
}
+#ifndef GDB_STRING_VIEW
constexpr bool
test04()
{
return true;
}
+#endif
int
main()
{
test03();
+#ifndef GDB_STRING_VIEW
static_assert( test04() );
+#endif
return 0;
}
+
+} // namespace operations_find_3
// basic_string_view find
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_find_4 {
// libstdc++/31401
void
test01()
{
- typedef std::string_view::size_type csize_type;
- csize_type npos = std::string_view::npos;
+ typedef gdb::string_view::size_type csize_type;
+ csize_type npos = gdb::string_view::npos;
- std::string_view use = "anu";
+ gdb::string_view use = "anu";
csize_type pos1 = use.find("a", npos);
VERIFY( pos1 == npos );
return 0;
}
+
+} // namespace operations_find_4
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_rfind_1 {
// basic_string_view rfind
void
test01()
{
- typedef std::string_view::size_type csize_type;
- typedef std::string_view::const_reference cref;
- typedef std::string_view::reference ref;
- csize_type npos = std::string_view::npos;
+ typedef gdb::string_view::size_type csize_type;
+ typedef gdb::string_view::const_reference cref;
+ typedef gdb::string_view::reference ref;
+ csize_type npos = gdb::string_view::npos;
csize_type csz01, csz02;
const char str_lit01[] = "mave";
- const std::string_view str01("mavericks, santa cruz");
- std::string_view str02(str_lit01);
- std::string_view str03("s, s");
- std::string_view str04;
+ const gdb::string_view str01("mavericks, santa cruz");
+ gdb::string_view str02(str_lit01);
+ gdb::string_view str03("s, s");
+ gdb::string_view str04;
// size_type rfind(const string_view&, size_type pos = 0) const;
csz01 = str01.rfind(str01);
return 0;
}
+
+} // namespace operations_rfind_1
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_rfind_2 {
// basic_string_view::find_last_of
void
test02()
{
- std::string_view z("ab");
- std::string_view::size_type pos;
+ gdb::string_view z("ab");
+ gdb::string_view::size_type pos;
pos = z.find_last_of("ab");
VERIFY( pos == 1 );
pos = z.find_last_of("Xa");
pos = z.find_last_of("Xb");
VERIFY( pos == 1 );
pos = z.find_last_of("XYZ");
- VERIFY( pos == std::string_view::npos );
+ VERIFY( pos == gdb::string_view::npos );
pos = z.find_last_of('a');
VERIFY( pos == 0 );
pos = z.find_last_of('b');
VERIFY( pos == 1 );
pos = z.find_last_of('X');
- VERIFY( pos == std::string_view::npos );
+ VERIFY( pos == gdb::string_view::npos );
}
int
return 0;
}
+
+} // namespace operations_rfind_2
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operations_rfind_3 {
// basic_string_view::find_last_not_of
void
test03()
{
- typedef std::string_view::size_type csize_type;
- std::string_view::size_type pos;
- csize_type npos = std::string_view::npos;
+ typedef gdb::string_view::size_type csize_type;
+ gdb::string_view::size_type pos;
+ csize_type npos = gdb::string_view::npos;
- std::string_view x;
+ gdb::string_view x;
pos = x.find_last_not_of('X');
VERIFY( pos == npos );
pos = x.find_last_not_of("XYZ");
VERIFY( pos == npos );
- std::string_view y("a");
+ gdb::string_view y("a");
pos = y.find_last_not_of('X');
VERIFY( pos == 0 );
pos = y.find_last_not_of('a');
pos = y.find_last_not_of("a");
VERIFY( pos == npos );
- std::string_view z("ab");
+ gdb::string_view z("ab");
pos = z.find_last_not_of('X');
VERIFY( pos == 1 );
pos = z.find_last_not_of("XYZ");
return 0;
}
+
+} // namespace operations_rfind_3
// basic_string_view::substr
-#include <string_view>
-#include <stdexcept>
-#include <testsuite_hooks.h>
+namespace operations_substr_1 {
void
test01()
{
- typedef std::string_view::size_type csize_type;
- typedef std::string_view::const_reference cref;
- typedef std::string_view::reference ref;
+ typedef gdb::string_view::size_type csize_type;
+ typedef gdb::string_view::const_reference cref;
+ typedef gdb::string_view::reference ref;
csize_type csz01;
const char str_lit01[] = "rockaway, pacifica";
- const std::string_view str01(str_lit01);
- std::string_view str02;
+ const gdb::string_view str01(str_lit01);
+ gdb::string_view str02;
// basic_string_view<charT, _Traits, _Alloc>
// substr(size_type pos = 0, size_type n = npos) const;
str02 = str01.substr(csz01 + 1);
VERIFY( false );
}
- catch(std::out_of_range& fail)
+ catch(gdb_exception& fail)
{
VERIFY( true );
}
return 0;
}
+
+} // namespace operations_substr_1
const basic_string<charT,traits,Allocator>& rhs);
*/
-#include <string_view>
-#include <testsuite_hooks.h>
+namespace operators_2 {
void
test01()
{
- std::string_view str_0("costa rica");
- std::string_view str_1("costa marbella");
- std::string_view str_2("cost");
- std::string_view str_3("costa ricans");
- std::string_view str_4;
+ gdb::string_view str_0("costa rica");
+ gdb::string_view str_1("costa marbella");
+ gdb::string_view str_2("cost");
+ gdb::string_view str_3("costa ricans");
+ gdb::string_view str_4;
str_4 = str_0;
//comparisons between string objects
VERIFY( str_0 <= "costa rica" );
}
+#ifndef GDB_STRING_VIEW
constexpr bool
test02()
{
return true;
}
+#endif
int
main()
{
test01();
+#ifndef GDB_STRING_VIEW
static_assert( test02() );
+#endif
+ return 0;
}
+
+} // namespace operators_2
--- /dev/null
+/* Self tests for string_view for GDB, the GNU debugger.
+
+ Copyright (C) 2018 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program 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 of the License, or
+ (at your option) any later version.
+
+ This program 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 program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* No need to test string_view if we're using C++17, since we're going to use
+ the "real" version. */
+#if __cplusplus < 201703L
+
+#include "defs.h"
+#include "selftest.h"
+#include "common/gdb_string_view.h"
+
+/* Used by the included .cc files below. Included here because the
+ included test files are wrapped in a namespace. */
+#include <string>
+#include <sstream>
+#include <fstream>
+#include <iostream>
+
+/* libstdc++'s testsuite uses VERIFY. */
+#define VERIFY SELF_CHECK
+
+/* Used to disable testing features not supported by
+ gdb::string_view. */
+#define GDB_STRING_VIEW
+
+namespace selftests {
+namespace string_view {
+
+/* The actual tests live in separate files, which were originally
+ copied over from libstdc++'s testsuite. To preserve the structure
+ and help with comparison with the original tests, the file names
+ have been preserved, and only minimal modification was done to have
+ them compile against gdb::string_view instead of std::string_view:
+
+ - std::string_view->gdb::string_view, etc.
+ - ATTRIBUTE_UNUSED in a few places
+ - wrap each file in a namespace so they can all be compiled as a
+ single unit.
+ - libstdc++'s license and formatting style was preserved.
+*/
+
+#include "basic_string_view/capacity/1.cc"
+#include "basic_string_view/cons/char/1.cc"
+#include "basic_string_view/cons/char/2.cc"
+#include "basic_string_view/cons/char/3.cc"
+#include "basic_string_view/element_access/char/1.cc"
+#include "basic_string_view/element_access/char/empty.cc"
+#include "basic_string_view/element_access/char/front_back.cc"
+#include "basic_string_view/inserters/char/2.cc"
+#include "basic_string_view/modifiers/remove_prefix/char/1.cc"
+#include "basic_string_view/modifiers/remove_suffix/char/1.cc"
+#include "basic_string_view/modifiers/swap/char/1.cc"
+#include "basic_string_view/operations/compare/char/1.cc"
+#include "basic_string_view/operations/compare/char/13650.cc"
+#include "basic_string_view/operations/copy/char/1.cc"
+#include "basic_string_view/operations/data/char/1.cc"
+#include "basic_string_view/operations/find/char/1.cc"
+#include "basic_string_view/operations/find/char/2.cc"
+#include "basic_string_view/operations/find/char/3.cc"
+#include "basic_string_view/operations/find/char/4.cc"
+#include "basic_string_view/operations/rfind/char/1.cc"
+#include "basic_string_view/operations/rfind/char/2.cc"
+#include "basic_string_view/operations/rfind/char/3.cc"
+#include "basic_string_view/operations/substr/char/1.cc"
+#include "basic_string_view/operators/char/2.cc"
+
+static void
+run_tests ()
+{
+ capacity_1::main ();
+ cons_1::main ();
+ cons_2::main ();
+ cons_3::main ();
+ element_access_1::main ();
+ element_access_empty::main ();
+ element_access_front_back::main ();
+ inserters_2::main ();
+ modifiers_remove_prefix::main ();
+ modifiers_remove_suffix::main ();
+ modifiers_swap::test01 ();
+ operations_compare_1::main ();
+ operations_compare_13650::main ();
+ operations_copy_1::main ();
+ operations_data_1::main ();
+ operations_find_1::main ();
+ operations_find_2::main ();
+ operations_find_3::main ();
+ operations_find_4::main ();
+ operations_rfind_1::main ();
+ operations_rfind_2::main ();
+ operations_rfind_3::main ();
+ operations_substr_1::main ();
+ operators_2::main ();
+
+ constexpr gdb::string_view sv_empty;
+ SELF_CHECK (sv_empty.empty ());
+
+ std::string std_string = "fika";
+ gdb::string_view sv1 (std_string);
+ SELF_CHECK (sv1 == "fika");
+
+ constexpr const char *fika = "fika";
+ gdb::string_view sv2 (fika);
+ SELF_CHECK (sv2 == "fika");
+
+ constexpr gdb::string_view sv3 (fika, 3);
+ SELF_CHECK (sv3 == "fik");
+
+ constexpr gdb::string_view sv4 (sv3);
+ SELF_CHECK (sv4 == "fik");
+
+ constexpr gdb::string_view::iterator it_begin = sv4.begin ();
+ static_assert (*it_begin == 'f', "");
+
+ constexpr gdb::string_view::iterator it_end = sv4.end ();
+ static_assert (*it_end == 'a', "");
+
+ const gdb::string_view::reverse_iterator it_rbegin = sv4.rbegin ();
+ SELF_CHECK (*it_rbegin == 'k');
+
+ const gdb::string_view::reverse_iterator it_rend = sv4.rend ();
+ SELF_CHECK (*(it_rend - 1) == 'f');
+
+ constexpr gdb::string_view::size_type size = sv4.size ();
+ static_assert (size == 3, "");
+
+ constexpr gdb::string_view::size_type length = sv4.length ();
+ static_assert (length == 3, "");
+
+ constexpr gdb::string_view::size_type max_size = sv4.max_size ();
+ static_assert (max_size > 0, "");
+
+ constexpr bool empty = sv4.empty ();
+ static_assert (!empty, "");
+
+ constexpr char c1 = sv4[1];
+ static_assert (c1 == 'i', "");
+
+ constexpr char c2 = sv4.at (2);
+ static_assert (c2 == 'k', "");
+
+ constexpr char front = sv4.front ();
+ static_assert (front == 'f', "");
+
+ constexpr char back = sv4.back ();
+ static_assert (back == 'k', "");
+
+ constexpr const char *data = sv4.data ();
+ static_assert (data == fika, "");
+}
+
+} /* namespace string_view */
+} /* namespace selftests */
+
+void
+_initialize_string_view_selftests ()
+{
+ selftests::register_test ("string_view", selftests::string_view::run_tests);
+}
+
+#endif /* __cplusplus < 201703L */