From patchwork Sat Apr 7 13:26:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 26636 Received: (qmail 118724 invoked by alias); 7 Apr 2018 13:37:13 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 118710 invoked by uid 89); 7 Apr 2018 13:37:13 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-20.8 required=5.0 tests=GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SEM_URI, SEM_URIRED, SPF_SOFTFAIL, TIME_LIMIT_EXCEEDED autolearn=unavailable version=3.3.2 spammy=miles, world!, li, UD:width X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 07 Apr 2018 13:37:02 +0000 X-ASG-Debug-ID: 1523107592-0c856e618a8a9f10001-fS2M51 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id TTs0QvdYoj7IJ0Lv (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 07 Apr 2018 09:26:32 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@polymtl.ca X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from simark.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id 6E9FD441D66; Sat, 7 Apr 2018 09:26:31 -0400 (EDT) From: Simon Marchi X-Barracuda-Effective-Source-IP: 192-222-164-54.qc.cable.ebox.net[192.222.164.54] X-Barracuda-Apparent-Source-IP: 192.222.164.54 X-Barracuda-RBL-IP: 192.222.164.54 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH v3 4/5] Copy string_view tests from libstdc++ Date: Sat, 7 Apr 2018 09:26:28 -0400 X-ASG-Orig-Subj: [PATCH v3 4/5] Copy string_view tests from libstdc++ Message-Id: <20180407132629.3787-4-simon.marchi@polymtl.ca> In-Reply-To: <20180407132629.3787-1-simon.marchi@polymtl.ca> References: <20180407132629.3787-1-simon.marchi@polymtl.ca> X-Barracuda-Connect: smtp.electronicbox.net[96.127.255.82] X-Barracuda-Start-Time: 1523107592 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 201645 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 X-IsSubscribed: yes This patch copies the string_view tests from the gcc repository (commit 02a4441f002c). ${gcc}/libstdc++-v3/testsuite/21_strings/basic_string_view -> ${binutils-gdb}/gdb/unittests/basic_string_view The local modifications are done in the following patch, so that it's easier to review them. gdb/ChangeLog: * unittests/basic_string_view/capacity/1.cc: New file. * unittests/basic_string_view/capacity/empty_neg.cc: New file. * unittests/basic_string_view/cons/char/1.cc: New file. * unittests/basic_string_view/cons/char/2.cc: New file. * unittests/basic_string_view/cons/char/3.cc: New file. * unittests/basic_string_view/cons/wchar_t/1.cc: New file. * unittests/basic_string_view/cons/wchar_t/2.cc: New file. * unittests/basic_string_view/cons/wchar_t/3.cc: New file. * unittests/basic_string_view/element_access/char/1.cc: New file. * unittests/basic_string_view/element_access/char/2.cc: New file. * unittests/basic_string_view/element_access/char/empty.cc: New file. * unittests/basic_string_view/element_access/char/front_back.cc: New file. * unittests/basic_string_view/element_access/wchar_t/1.cc: New file. * unittests/basic_string_view/element_access/wchar_t/2.cc: New file. * unittests/basic_string_view/element_access/wchar_t/empty.cc: New file. * unittests/basic_string_view/element_access/wchar_t/front_back.cc: New file. * unittests/basic_string_view/include.cc: New file. * unittests/basic_string_view/inserters/char/1.cc: New file. * unittests/basic_string_view/inserters/char/2.cc: New file. * unittests/basic_string_view/inserters/char/3.cc: New file. * unittests/basic_string_view/inserters/pod/10081-out.cc: New file. * unittests/basic_string_view/inserters/wchar_t/1.cc: New file. * unittests/basic_string_view/inserters/wchar_t/2.cc: New file. * unittests/basic_string_view/inserters/wchar_t/3.cc: New file. * unittests/basic_string_view/literals/types.cc: New file. * unittests/basic_string_view/literals/values.cc: New file. * unittests/basic_string_view/modifiers/remove_prefix/char/1.cc: New file. * unittests/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc: New file. * unittests/basic_string_view/modifiers/remove_suffix/char/1.cc: New file. * unittests/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc: New file. * unittests/basic_string_view/modifiers/swap/char/1.cc: New file. * unittests/basic_string_view/modifiers/swap/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/compare/char/1.cc: New file. * unittests/basic_string_view/operations/compare/char/13650.cc: New file. * unittests/basic_string_view/operations/compare/char/2.cc: New file. * unittests/basic_string_view/operations/compare/char/70483.cc: New file. * unittests/basic_string_view/operations/compare/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/compare/wchar_t/13650.cc: New file. * unittests/basic_string_view/operations/compare/wchar_t/2.cc: New file. * unittests/basic_string_view/operations/copy/char/1.cc: New file. * unittests/basic_string_view/operations/copy/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/data/char/1.cc: New file. * unittests/basic_string_view/operations/data/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/find/char/1.cc: New file. * unittests/basic_string_view/operations/find/char/2.cc: New file. * unittests/basic_string_view/operations/find/char/3.cc: New file. * unittests/basic_string_view/operations/find/char/4.cc: New file. * unittests/basic_string_view/operations/find/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/find/wchar_t/2.cc: New file. * unittests/basic_string_view/operations/find/wchar_t/3.cc: New file. * unittests/basic_string_view/operations/find/wchar_t/4.cc: New file. * unittests/basic_string_view/operations/rfind/char/1.cc: New file. * unittests/basic_string_view/operations/rfind/char/2.cc: New file. * unittests/basic_string_view/operations/rfind/char/3.cc: New file. * unittests/basic_string_view/operations/rfind/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/rfind/wchar_t/2.cc: New file. * unittests/basic_string_view/operations/rfind/wchar_t/3.cc: New file. * unittests/basic_string_view/operations/string_conversion/1.cc: New file. * unittests/basic_string_view/operations/substr/char/1.cc: New file. * unittests/basic_string_view/operations/substr/wchar_t/1.cc: New file. * unittests/basic_string_view/operators/char/2.cc: New file. * unittests/basic_string_view/operators/wchar_t/2.cc: New file. * unittests/basic_string_view/range_access/char/1.cc: New file. * unittests/basic_string_view/range_access/wchar_t/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/char/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/char16_t/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/char32_t/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/wchar_t/1.cc: New file. * unittests/basic_string_view/requirements/typedefs.cc: New file. * unittests/basic_string_view/typedefs.cc: New file. * unittests/basic_string_view/types/1.cc: New file. --- gdb/unittests/basic_string_view/capacity/1.cc | 162 +++++++++ .../basic_string_view/capacity/empty_neg.cc | 28 ++ gdb/unittests/basic_string_view/cons/char/1.cc | 68 ++++ gdb/unittests/basic_string_view/cons/char/2.cc | 47 +++ gdb/unittests/basic_string_view/cons/char/3.cc | 39 +++ gdb/unittests/basic_string_view/cons/wchar_t/1.cc | 68 ++++ gdb/unittests/basic_string_view/cons/wchar_t/2.cc | 45 +++ gdb/unittests/basic_string_view/cons/wchar_t/3.cc | 38 +++ .../basic_string_view/element_access/char/1.cc | 70 ++++ .../basic_string_view/element_access/char/2.cc | 30 ++ .../basic_string_view/element_access/char/empty.cc | 38 +++ .../element_access/char/front_back.cc | 42 +++ .../basic_string_view/element_access/wchar_t/1.cc | 71 ++++ .../basic_string_view/element_access/wchar_t/2.cc | 32 ++ .../element_access/wchar_t/empty.cc | 38 +++ .../element_access/wchar_t/front_back.cc | 42 +++ gdb/unittests/basic_string_view/include.cc | 25 ++ .../basic_string_view/inserters/char/1.cc | 65 ++++ .../basic_string_view/inserters/char/2.cc | 93 ++++++ .../basic_string_view/inserters/char/3.cc | 54 +++ .../basic_string_view/inserters/pod/10081-out.cc | 75 +++++ .../basic_string_view/inserters/wchar_t/1.cc | 70 ++++ .../basic_string_view/inserters/wchar_t/2.cc | 91 +++++ .../basic_string_view/inserters/wchar_t/3.cc | 53 +++ gdb/unittests/basic_string_view/literals/types.cc | 45 +++ gdb/unittests/basic_string_view/literals/values.cc | 72 ++++ .../modifiers/remove_prefix/char/1.cc | 61 ++++ .../modifiers/remove_prefix/wchar_t/1.cc | 61 ++++ .../modifiers/remove_suffix/char/1.cc | 61 ++++ .../modifiers/remove_suffix/wchar_t/1.cc | 61 ++++ .../basic_string_view/modifiers/swap/char/1.cc | 35 ++ .../basic_string_view/modifiers/swap/wchar_t/1.cc | 35 ++ .../basic_string_view/operations/compare/char/1.cc | 132 ++++++++ .../operations/compare/char/13650.cc | 49 +++ .../basic_string_view/operations/compare/char/2.cc | 30 ++ .../operations/compare/char/70483.cc | 89 +++++ .../operations/compare/wchar_t/1.cc | 133 ++++++++ .../operations/compare/wchar_t/13650.cc | 49 +++ .../operations/compare/wchar_t/2.cc | 30 ++ .../basic_string_view/operations/copy/char/1.cc | 45 +++ .../basic_string_view/operations/copy/wchar_t/1.cc | 46 +++ .../basic_string_view/operations/data/char/1.cc | 43 +++ .../basic_string_view/operations/data/wchar_t/1.cc | 43 +++ .../basic_string_view/operations/find/char/1.cc | 164 +++++++++ .../basic_string_view/operations/find/char/2.cc | 161 +++++++++ .../basic_string_view/operations/find/char/3.cc | 161 +++++++++ .../basic_string_view/operations/find/char/4.cc | 44 +++ .../basic_string_view/operations/find/wchar_t/1.cc | 163 +++++++++ .../basic_string_view/operations/find/wchar_t/2.cc | 161 +++++++++ .../basic_string_view/operations/find/wchar_t/3.cc | 161 +++++++++ .../basic_string_view/operations/find/wchar_t/4.cc | 44 +++ .../basic_string_view/operations/rfind/char/1.cc | 94 ++++++ .../basic_string_view/operations/rfind/char/2.cc | 52 +++ .../basic_string_view/operations/rfind/char/3.cc | 66 ++++ .../operations/rfind/wchar_t/1.cc | 94 ++++++ .../operations/rfind/wchar_t/2.cc | 52 +++ .../operations/rfind/wchar_t/3.cc | 66 ++++ .../operations/string_conversion/1.cc | 51 +++ .../basic_string_view/operations/substr/char/1.cc | 79 +++++ .../operations/substr/wchar_t/1.cc | 79 +++++ .../basic_string_view/operators/char/2.cc | 367 +++++++++++++++++++++ .../basic_string_view/operators/wchar_t/2.cc | 367 +++++++++++++++++++++ .../basic_string_view/range_access/char/1.cc | 47 +++ .../basic_string_view/range_access/wchar_t/1.cc | 47 +++ .../requirements/explicit_instantiation/1.cc | 26 ++ .../requirements/explicit_instantiation/char/1.cc | 23 ++ .../explicit_instantiation/char16_t/1.cc | 24 ++ .../explicit_instantiation/char32_t/1.cc | 24 ++ .../explicit_instantiation/wchar_t/1.cc | 23 ++ .../basic_string_view/requirements/typedefs.cc | 47 +++ gdb/unittests/basic_string_view/typedefs.cc | 36 ++ gdb/unittests/basic_string_view/types/1.cc | 43 +++ 72 files changed, 5270 insertions(+) create mode 100644 gdb/unittests/basic_string_view/capacity/1.cc create mode 100644 gdb/unittests/basic_string_view/capacity/empty_neg.cc create mode 100644 gdb/unittests/basic_string_view/cons/char/1.cc create mode 100644 gdb/unittests/basic_string_view/cons/char/2.cc create mode 100644 gdb/unittests/basic_string_view/cons/char/3.cc create mode 100644 gdb/unittests/basic_string_view/cons/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/cons/wchar_t/2.cc create mode 100644 gdb/unittests/basic_string_view/cons/wchar_t/3.cc create mode 100644 gdb/unittests/basic_string_view/element_access/char/1.cc create mode 100644 gdb/unittests/basic_string_view/element_access/char/2.cc create mode 100644 gdb/unittests/basic_string_view/element_access/char/empty.cc create mode 100644 gdb/unittests/basic_string_view/element_access/char/front_back.cc create mode 100644 gdb/unittests/basic_string_view/element_access/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/element_access/wchar_t/2.cc create mode 100644 gdb/unittests/basic_string_view/element_access/wchar_t/empty.cc create mode 100644 gdb/unittests/basic_string_view/element_access/wchar_t/front_back.cc create mode 100644 gdb/unittests/basic_string_view/include.cc create mode 100644 gdb/unittests/basic_string_view/inserters/char/1.cc create mode 100644 gdb/unittests/basic_string_view/inserters/char/2.cc create mode 100644 gdb/unittests/basic_string_view/inserters/char/3.cc create mode 100644 gdb/unittests/basic_string_view/inserters/pod/10081-out.cc create mode 100644 gdb/unittests/basic_string_view/inserters/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/inserters/wchar_t/2.cc create mode 100644 gdb/unittests/basic_string_view/inserters/wchar_t/3.cc create mode 100644 gdb/unittests/basic_string_view/literals/types.cc create mode 100644 gdb/unittests/basic_string_view/literals/values.cc create mode 100644 gdb/unittests/basic_string_view/modifiers/remove_prefix/char/1.cc create mode 100644 gdb/unittests/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/modifiers/remove_suffix/char/1.cc create mode 100644 gdb/unittests/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/modifiers/swap/char/1.cc create mode 100644 gdb/unittests/basic_string_view/modifiers/swap/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/compare/char/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/compare/char/13650.cc create mode 100644 gdb/unittests/basic_string_view/operations/compare/char/2.cc create mode 100644 gdb/unittests/basic_string_view/operations/compare/char/70483.cc create mode 100644 gdb/unittests/basic_string_view/operations/compare/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/compare/wchar_t/13650.cc create mode 100644 gdb/unittests/basic_string_view/operations/compare/wchar_t/2.cc create mode 100644 gdb/unittests/basic_string_view/operations/copy/char/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/copy/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/data/char/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/data/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/find/char/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/find/char/2.cc create mode 100644 gdb/unittests/basic_string_view/operations/find/char/3.cc create mode 100644 gdb/unittests/basic_string_view/operations/find/char/4.cc create mode 100644 gdb/unittests/basic_string_view/operations/find/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/find/wchar_t/2.cc create mode 100644 gdb/unittests/basic_string_view/operations/find/wchar_t/3.cc create mode 100644 gdb/unittests/basic_string_view/operations/find/wchar_t/4.cc create mode 100644 gdb/unittests/basic_string_view/operations/rfind/char/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/rfind/char/2.cc create mode 100644 gdb/unittests/basic_string_view/operations/rfind/char/3.cc create mode 100644 gdb/unittests/basic_string_view/operations/rfind/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/rfind/wchar_t/2.cc create mode 100644 gdb/unittests/basic_string_view/operations/rfind/wchar_t/3.cc create mode 100644 gdb/unittests/basic_string_view/operations/string_conversion/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/substr/char/1.cc create mode 100644 gdb/unittests/basic_string_view/operations/substr/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/operators/char/2.cc create mode 100644 gdb/unittests/basic_string_view/operators/wchar_t/2.cc create mode 100644 gdb/unittests/basic_string_view/range_access/char/1.cc create mode 100644 gdb/unittests/basic_string_view/range_access/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/requirements/explicit_instantiation/1.cc create mode 100644 gdb/unittests/basic_string_view/requirements/explicit_instantiation/char/1.cc create mode 100644 gdb/unittests/basic_string_view/requirements/explicit_instantiation/char16_t/1.cc create mode 100644 gdb/unittests/basic_string_view/requirements/explicit_instantiation/char32_t/1.cc create mode 100644 gdb/unittests/basic_string_view/requirements/explicit_instantiation/wchar_t/1.cc create mode 100644 gdb/unittests/basic_string_view/requirements/typedefs.cc create mode 100644 gdb/unittests/basic_string_view/typedefs.cc create mode 100644 gdb/unittests/basic_string_view/types/1.cc diff --git a/gdb/unittests/basic_string_view/capacity/1.cc b/gdb/unittests/basic_string_view/capacity/1.cc new file mode 100644 index 000000000000..d49ecbd9dd53 --- /dev/null +++ b/gdb/unittests/basic_string_view/capacity/1.cc @@ -0,0 +1,162 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// string_view size, length + +#include +#include +#include + +template + struct A { }; + +template + bool + operator==(const A&, const A&) { return true; } + +template + bool + operator<(const A&, const A&) { return true; } + +struct B { }; + +// char_traits specialization +namespace std +{ + template<> + struct char_traits > + { + typedef A char_type; + // Unsigned as wint_t in unsigned. + typedef unsigned long int_type; + typedef streampos pos_type; + typedef streamoff off_type; + typedef mbstate_t state_type; + + static void + assign(char_type& __c1, const char_type& __c2) + { __c1 = __c2; } + + static bool + eq(const char_type& __c1, const char_type& __c2) + { return __c1 == __c2; } + + static bool + lt(const char_type& __c1, const char_type& __c2) + { return __c1 < __c2; } + + static int + compare(const char_type* __s1, const char_type* __s2, size_t __n) + { + for (size_t __i = 0; __i < __n; ++__i) + if (!eq(__s1[__i], __s2[__i])) + return lt(__s1[__i], __s2[__i]) ? -1 : 1; + return 0; + } + + static size_t + length(const char_type* __s) + { + const char_type* __p = __s; + while (__p) + ++__p; + return (__p - __s); + } + + static const char_type* + find(const char_type* __s, size_t __n, const char_type& __a) + { + for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p) + if (*__p == __a) return __p; + return 0; + } + + static char_type* + move(char_type* __s1, const char_type* __s2, size_t __n) + { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); } + + static char_type* + copy(char_type* __s1, const char_type* __s2, size_t __n) + { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); } + + static char_type* + assign(char_type* __s, size_t __n, char_type __a) + { + for (char_type* __p = __s; __p < __s + __n; ++__p) + assign(*__p, __a); + return __s; + } + + static char_type + to_char_type(const int_type&) + { return char_type(); } + + static int_type + to_int_type(const char_type&) { return int_type(); } + + static bool + eq_int_type(const int_type& __c1, const int_type& __c2) + { return __c1 == __c2; } + + static int_type + eof() { return static_cast(-1); } + + static int_type + not_eof(const int_type& __c) + { return eq_int_type(__c, eof()) ? int_type(0) : __c; } + }; +} // namespace std + +void +test01() +{ + std::basic_string_view> str02; + typedef std::basic_string_view< A >::size_type size_type_o; + size_type_o sz03; + size_type_o sz04; + + // non-POD types: size, length, max_size, empty() + bool b01 = str02.empty(); + VERIFY( b01 == true ); + sz03 = str02.size(); + sz04 = str02.length(); + VERIFY( sz03 == sz04 ); + str02.data(); + sz03 = str02.size(); + sz04 = str02.length(); + VERIFY( sz03 == sz04 ); + + sz03 = str02.max_size(); + VERIFY( sz03 >= sz04 ); + + sz03 = str02.size(); + str02 = {}; + b01 = str02.empty(); + VERIFY( b01 == true ); + sz04 = str02.size(); + VERIFY( sz03 >= sz04 ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/capacity/empty_neg.cc b/gdb/unittests/basic_string_view/capacity/empty_neg.cc new file mode 100644 index 000000000000..4ea506365c03 --- /dev/null +++ b/gdb/unittests/basic_string_view/capacity/empty_neg.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2017-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +void +test01() +{ + std::string_view s; + s.empty(); // { dg-warning "ignoring return value" } +} diff --git a/gdb/unittests/basic_string_view/cons/char/1.cc b/gdb/unittests/basic_string_view/cons/char/1.cc new file mode 100644 index 000000000000..f80ae92f2f80 --- /dev/null +++ b/gdb/unittests/basic_string_view/cons/char/1.cc @@ -0,0 +1,68 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view constructors. + +#include +#include +#include +#include + +void +test01() +{ + typedef std::string_view::size_type csize_type; + + // basic_string_view() + const std::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}; + VERIFY( str01.length() == 18 ); + VERIFY( str01.data() == str_lit01 ); + const std::string_view str02{"baker beach, san francisco"}; + VERIFY( str02.length() == 26 ); + + // basic_string_view(const string_view&) + std::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}; + 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}; + VERIFY( str07.length() == 10 ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/cons/char/2.cc b/gdb/unittests/basic_string_view/cons/char/2.cc new file mode 100644 index 000000000000..8dbca7a621e7 --- /dev/null +++ b/gdb/unittests/basic_string_view/cons/char/2.cc @@ -0,0 +1,47 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view constructors. + +#include +#include +#include +#include + +void +test03() +{ + const char* with_nulls = "This contains \0 a zero byte."; + + // 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); + VERIFY( s1.size() == 28 ); + std::string_view s2(s1); + VERIFY( s2.size() == 28 ); +} + +int +main() +{ + test03(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/cons/char/3.cc b/gdb/unittests/basic_string_view/cons/char/3.cc new file mode 100644 index 000000000000..c892cbc62720 --- /dev/null +++ b/gdb/unittests/basic_string_view/cons/char/3.cc @@ -0,0 +1,39 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view constructors. + +#include +#include +#include + +void +test05() +{ + char const * s = 0; + std::string_view zero_length_built_with_NULL(s, 0); +} + +int +main() +{ + test05(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/cons/wchar_t/1.cc b/gdb/unittests/basic_string_view/cons/wchar_t/1.cc new file mode 100644 index 000000000000..4f935d57e469 --- /dev/null +++ b/gdb/unittests/basic_string_view/cons/wchar_t/1.cc @@ -0,0 +1,68 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view constructors. + +#include +#include +#include +#include + +void +test01() +{ + typedef std::wstring_view::size_type csize_type; + + // basic_string_view() + const std::wstring_view str00{}; + VERIFY( str00.length() == 0 ); + VERIFY( str00.data() == nullptr ); + + // basic_string_view(const char*) + const wchar_t str_lit01[] = L"rodeo beach, marin"; + const std::wstring_view str01{str_lit01}; + VERIFY( str01.length() == 18 ); + VERIFY( str01.data() == str_lit01 ); + const std::wstring_view str02{L"baker beach, san francisco"}; + VERIFY( str02.length() == 26 ); + + // basic_string_view(const string_view&) + std::wstring_view str04{str01}; + VERIFY( str04.length() == str01.length() ); + VERIFY( str04.data() == str01.data() ); + + // basic_string_view(const char* s) + csize_type len_lit01 = wcslen(str_lit01); + std::wstring_view str05{str_lit01, len_lit01}; + VERIFY( str05.length() == len_lit01 ); + VERIFY( str05.data() == str_lit01 ); + + // basic_string_view(basic_string& s) + std::wstring istr07(10, L'z'); + std::wstring_view str07{istr07}; + VERIFY( str07.length() == 10 ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/cons/wchar_t/2.cc b/gdb/unittests/basic_string_view/cons/wchar_t/2.cc new file mode 100644 index 000000000000..3134ec0781e9 --- /dev/null +++ b/gdb/unittests/basic_string_view/cons/wchar_t/2.cc @@ -0,0 +1,45 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view constructors. + +#include +#include + +void +test03() +{ + const wchar_t* with_nulls = L"This contains \0 a zero byte."; + + // 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::wstring_view s1 (with_nulls, 28); + VERIFY( s1.size() == 28 ); + std::wstring_view s2 (s1); + VERIFY( s2.size() == 28 ); +} + +int +main() +{ + test03(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/cons/wchar_t/3.cc b/gdb/unittests/basic_string_view/cons/wchar_t/3.cc new file mode 100644 index 000000000000..c49dc2579868 --- /dev/null +++ b/gdb/unittests/basic_string_view/cons/wchar_t/3.cc @@ -0,0 +1,38 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view constructors. + +#include +#include + +void +test05() +{ + wchar_t const * s = 0; + std::wstring_view zero_length_built_with_NULL(s, 0); +} + +int +main() +{ + test05(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/element_access/char/1.cc b/gdb/unittests/basic_string_view/element_access/char/1.cc new file mode 100644 index 000000000000..03c588efb0d7 --- /dev/null +++ b/gdb/unittests/basic_string_view/element_access/char/1.cc @@ -0,0 +1,70 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string element access + +#include +#include +#include + +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 csz01, csz02; + + const std::string_view str01("tamarindo, costa rica"); + std::string_view str02("41st street beach, capitola, california"); + std::string_view str03; + + // const_reference operator[] (size_type pos) const; + csz01 = str01.size(); + cref cref1 = str01[csz01 - 1]; + VERIFY( cref1 == 'a' ); + // Undefined behavior at size(). + //cref cref2 = str01[csz01]; + //VERIFY( cref2 == char() ); + + // const_reference at(size_type pos) const; + csz01 = str01.size(); + cref cref3 = str01.at(csz01 - 1); + VERIFY( cref3 == 'a' ); + try + { + str01.at(csz01); + VERIFY( false ); // Should not get here, as exception thrown. + } + catch (std::out_of_range& fail) + { + VERIFY( true ); + } + catch (...) + { + VERIFY( false ); + } +} + +int +main() +{ + test01(); + return 0; +} diff --git a/gdb/unittests/basic_string_view/element_access/char/2.cc b/gdb/unittests/basic_string_view/element_access/char/2.cc new file mode 100644 index 000000000000..4ee2b64a0bba --- /dev/null +++ b/gdb/unittests/basic_string_view/element_access/char/2.cc @@ -0,0 +1,30 @@ +// { dg-do run { xfail *-*-* } } +// { dg-options "-std=gnu++17 -O0" } +// { dg-require-debug-mode "" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include + +int +main() +{ + typedef std::string_view string_view_type; + string_view_type s; + s[0]; // abort +} diff --git a/gdb/unittests/basic_string_view/element_access/char/empty.cc b/gdb/unittests/basic_string_view/element_access/char/empty.cc new file mode 100644 index 000000000000..fad5eb798ba6 --- /dev/null +++ b/gdb/unittests/basic_string_view/element_access/char/empty.cc @@ -0,0 +1,38 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 3 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . +// + +#include +#include + +int +main() +{ + { + std::string_view empty; + VERIFY( empty.empty() ); + } + + { + const std::string_view empty; + VERIFY( empty.empty() ); + } + + return 0; +} diff --git a/gdb/unittests/basic_string_view/element_access/char/front_back.cc b/gdb/unittests/basic_string_view/element_access/char/front_back.cc new file mode 100644 index 000000000000..efff787e365e --- /dev/null +++ b/gdb/unittests/basic_string_view/element_access/char/front_back.cc @@ -0,0 +1,42 @@ +// { dg-options "-std=gnu++17" } +// { dg-require-string-conversions "" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +void +test01() +{ + std::string_view str("ramifications"); + const std::string_view cstr("melodien"); + + VERIFY( str.front() == 'r' ); + VERIFY( str.back() == 's' ); + VERIFY( cstr.front() == 'm' ); + VERIFY( cstr.back() == 'n' ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/element_access/wchar_t/1.cc b/gdb/unittests/basic_string_view/element_access/wchar_t/1.cc new file mode 100644 index 000000000000..b74ee29f316d --- /dev/null +++ b/gdb/unittests/basic_string_view/element_access/wchar_t/1.cc @@ -0,0 +1,71 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view element access + +#include +#include +#include + +void +test01() +{ + typedef std::wstring_view::size_type csize_type; + typedef std::wstring_view::const_reference cref; + typedef std::wstring_view::reference ref; + csize_type csz01, csz02; + + const std::wstring_view str01(L"tamarindo, costa rica"); + std::wstring_view str02(L"41st street beach, capitola, california"); + std::wstring_view str03; + + // const_reference operator[] (size_type pos) const; + csz01 = str01.size(); + cref cref1 = str01[csz01 - 1]; + VERIFY( cref1 == L'a' ); + // Undefined behavior at size(). + //cref cref2 = str01[csz01]; + //VERIFY( cref2 == wchar_t() ); + + // const_reference at(size_type pos) const; + csz01 = str01.size(); + cref cref3 = str01.at(csz01 - 1); + VERIFY( cref3 == L'a' ); + try + { + str01.at(csz01); + VERIFY( false ); // Should not get here, as exception thrown. + } + catch (std::out_of_range& fail) + { + VERIFY( true ); + } + catch (...) + { + VERIFY( false ); + } +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/element_access/wchar_t/2.cc b/gdb/unittests/basic_string_view/element_access/wchar_t/2.cc new file mode 100644 index 000000000000..5b7421f2f304 --- /dev/null +++ b/gdb/unittests/basic_string_view/element_access/wchar_t/2.cc @@ -0,0 +1,32 @@ +// { dg-do run { xfail *-*-* } } +// { dg-options "-std=gnu++17 -O0" } +// { dg-require-debug-mode "" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include + +// libstdc++/21674 +// NB: Should work without any inlining or optimizations (ie. -O0). +int +main() +{ + typedef std::wstring_view string_view_type; + string_view_type s; + s[0]; // abort +} diff --git a/gdb/unittests/basic_string_view/element_access/wchar_t/empty.cc b/gdb/unittests/basic_string_view/element_access/wchar_t/empty.cc new file mode 100644 index 000000000000..b1ac051b91dd --- /dev/null +++ b/gdb/unittests/basic_string_view/element_access/wchar_t/empty.cc @@ -0,0 +1,38 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . +// + +#include +#include + +int +main() +{ + { + std::wstring_view empty; + VERIFY( empty.empty() ); + } + + { + const std::wstring_view empty; + VERIFY( empty.empty() ); + } + + return 0; +} diff --git a/gdb/unittests/basic_string_view/element_access/wchar_t/front_back.cc b/gdb/unittests/basic_string_view/element_access/wchar_t/front_back.cc new file mode 100644 index 000000000000..a7c8483f6fc7 --- /dev/null +++ b/gdb/unittests/basic_string_view/element_access/wchar_t/front_back.cc @@ -0,0 +1,42 @@ +// { dg-options "-std=gnu++17" } +// { dg-require-string-conversions "" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +void +test01() +{ + std::wstring_view str(L"ramifications"); + const std::wstring_view cstr(L"melodien"); + + VERIFY( str.front() == L'r' ); + VERIFY( str.back() == L's' ); + VERIFY( cstr.front() == L'm' ); + VERIFY( cstr.back() == L'n' ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/include.cc b/gdb/unittests/basic_string_view/include.cc new file mode 100644 index 000000000000..59dc47dc3226 --- /dev/null +++ b/gdb/unittests/basic_string_view/include.cc @@ -0,0 +1,25 @@ +// -*- C++ -*- + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// NB: This issue affected only debug-mode. + +// { dg-options "-std=gnu++17 -fno-rtti" } +// { dg-do compile } + +#include diff --git a/gdb/unittests/basic_string_view/inserters/char/1.cc b/gdb/unittests/basic_string_view/inserters/char/1.cc new file mode 100644 index 000000000000..26bd0fdc918d --- /dev/null +++ b/gdb/unittests/basic_string_view/inserters/char/1.cc @@ -0,0 +1,65 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// inserters + +// NB: This file is predicated on sstreams, istreams, and ostreams +// working, not to mention other major details like char_traits, and +// all of the string_view class. + +#include +#include +#include +#include +#include +#include + +void +test01() +{ + typedef std::string_view::size_type csize_type; + typedef std::string_view::const_reference cref; + typedef std::string_view::reference ref; + + const std::string_view str01("sailing grand traverse bay\n" + "\t\t\t from Elk Rapids to the point reminds me of miles"); + + // ostream& operator<<(ostream&, const basic_string_view&) + std::ostringstream ostrs01; + try + { + ostrs01 << str01; + VERIFY( ostrs01.str() == str01 ); + } + catch(std::exception& fail) + { + VERIFY( false ); + } + + std::string_view hello_world; + std::cout << hello_world; +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/inserters/char/2.cc b/gdb/unittests/basic_string_view/inserters/char/2.cc new file mode 100644 index 000000000000..6562d58615df --- /dev/null +++ b/gdb/unittests/basic_string_view/inserters/char/2.cc @@ -0,0 +1,93 @@ + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// inserters + +// NB: This file is predicated on sstreams, ostreams +// working, not to mention other major details like char_traits, and +// all of the string_view class. + +// { dg-options "-std=gnu++17" } +// { dg-require-fileio "" } + +#include +#include +#include +#include +#include + +// testing basic_filebuf::xsputn via stress testing with large string_views +// based on a bug report libstdc++ 9 +// mode == out +void +test05(std::size_t size) +{ + bool test = 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}; + + // sanity checks + VERIFY( str.size() == size ); + VERIFY( ofs.good() ); + + // stress test + ofs << str << std::endl; + if (!ofs.good()) + test = false; + + ofs << str << std::endl; + if (!ofs.good()) + test = false; + + VERIFY( str.size() == size ); + VERIFY( ofs.good() ); + + ofs.close(); + + // sanity check on the written file + std::ifstream ifs(filename); + std::size_t count = 0; + char c; + while (count <= (2 * size) + 4) + { + ifs >> c; + if (ifs.good() && c == fillc) + { + ++count; + c = '0'; + } + else + break; + } + + VERIFY( count == 2 * size ); +} + +int +main() +{ + test05(1); + test05(1000); + test05(10000); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/inserters/char/3.cc b/gdb/unittests/basic_string_view/inserters/char/3.cc new file mode 100644 index 000000000000..7905661396da --- /dev/null +++ b/gdb/unittests/basic_string_view/inserters/char/3.cc @@ -0,0 +1,54 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// inserters + +// NB: This file is predicated on sstreams, and ostreams +// working, not to mention other major details like char_traits, and +// all of the string_view class. + +#include +#include +#include +#include + +// libstdc++/2830 +void +test09() +{ + std::string_view foo{"peace\0\0\0& love"}; + + std::ostringstream oss1; + oss1 << foo; + VERIFY( oss1.str() == foo ); + + std::ostringstream oss2; + oss2.width(20); + oss2 << foo; + VERIFY( oss2.str() != foo ); + VERIFY( oss2.str().size() == 20 ); +} + +int +main() +{ + test09(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/inserters/pod/10081-out.cc b/gdb/unittests/basic_string_view/inserters/pod/10081-out.cc new file mode 100644 index 000000000000..15538a45386c --- /dev/null +++ b/gdb/unittests/basic_string_view/inserters/pod/10081-out.cc @@ -0,0 +1,75 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// class basic_istream::sentry + +#include +#include +#include +#include +#include +#include +#include + +void +test01() +{ + using namespace std; + + using __gnu_test::pod_ushort; + typedef basic_string_view string_type; + typedef basic_stringbuf stringbuf_type; + typedef basic_ostream ostream_type; + + string_type str; + stringbuf_type strbuf01; + ostream_type stream(&strbuf01); + + try + { + stream << str; + } + catch (std::bad_cast& obj) + { + // Ok, throws bad_cast because locale has no ctype facet. + } + catch (...) + { + VERIFY( false ); + } + + const std::locale loc(std::locale::classic(), new std::ctype); + stream.imbue(loc); + try + { + stream << str; + } + catch (...) + { + VERIFY( false ); + } +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/inserters/wchar_t/1.cc b/gdb/unittests/basic_string_view/inserters/wchar_t/1.cc new file mode 100644 index 000000000000..c5cbdba25640 --- /dev/null +++ b/gdb/unittests/basic_string_view/inserters/wchar_t/1.cc @@ -0,0 +1,70 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// inserters + +// NB: This file is predicated on sstreams, and ostreams +// working, not to mention other major details like char_traits, and +// all of the string_view class. + +#include +#include +#include +#include +#include +#include + +void +test01() +{ + typedef std::wstring_view::size_type csize_type; + typedef std::wstring_view::const_reference cref; + typedef std::wstring_view::reference ref; + + const std::wstring_view str01(L"sailing grand traverse bay\n" + L"\t\t\t from Elk Rapids to the point reminds me of miles"); + const std::wstring_view str02(L"sailing"); + const std::wstring_view str03(L"grand"); + const std::wstring_view str04(L"traverse"); + const std::wstring_view str05; + std::wstring_view str10; + + // ostream& operator<<(ostream&, const basic_string_view&) + std::wostringstream ostrs01; + try + { + ostrs01 << str01; + VERIFY( ostrs01.str() == str01 ); + } + catch(std::exception& fail) + { + VERIFY( false ); + } + + std::wstring_view hello_world; + std::wcout << hello_world; +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/inserters/wchar_t/2.cc b/gdb/unittests/basic_string_view/inserters/wchar_t/2.cc new file mode 100644 index 000000000000..ebb275213258 --- /dev/null +++ b/gdb/unittests/basic_string_view/inserters/wchar_t/2.cc @@ -0,0 +1,91 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// inserters + +// NB: This file is predicated on sstreams, istreams, and ostreams +// working, not to mention other major details like char_traits, and +// all of the string_view class. + +#include +#include +#include +#include +#include + +// testing basic_filebuf::xsputn via stress testing with large string_views +// based on a bug report libstdc++ 9 +// mode == out +void +test05(std::size_t size) +{ + bool test = true; + + const char filename[] = "inserters_extractors-2.txt"; + const wchar_t fillc = L'f'; + std::wofstream ofs(filename); + std::wstring str(size, fillc); + std::wstring_view strv(str); + + // sanity checks + VERIFY( str.size() == size ); + VERIFY( ofs.good() ); + + // stress test + ofs << str << std::endl; + if (!ofs.good()) + test = false; + + ofs << str << std::endl; + if (!ofs.good()) + test = false; + + VERIFY( str.size() == size ); + VERIFY( ofs.good() ); + + ofs.close(); + + // sanity check on the written file + std::wifstream ifs(filename); + std::size_t count = 0; + wchar_t c; + while (count <= (2 * size) + 4) + { + ifs >> c; + if (ifs.good() && c == fillc) + { + ++count; + c = '0'; + } + else + break; + } + + VERIFY( count == 2 * size ); +} + +int +main() +{ + test05(1); + test05(1000); + test05(10000); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/inserters/wchar_t/3.cc b/gdb/unittests/basic_string_view/inserters/wchar_t/3.cc new file mode 100644 index 000000000000..569c4213a7fa --- /dev/null +++ b/gdb/unittests/basic_string_view/inserters/wchar_t/3.cc @@ -0,0 +1,53 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// inserters + +// NB: This file is predicated on sstreams, istreams, and ostreams +// working, not to mention other major details like char_traits, and +// all of the string_view class. + +#include +#include +#include +#include + +void +test09() +{ + std::wstring_view foo{L"peace\0\0\0& love"}; + + std::wostringstream oss1; + oss1 << foo; + VERIFY( oss1.str() == foo ); + + std::wostringstream oss2; + oss2.width(20); + oss2 << foo; + VERIFY( oss2.str() != foo ); + VERIFY( oss2.str().size() == 20 ); +} + +int +main() +{ + test09(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/literals/types.cc b/gdb/unittests/basic_string_view/literals/types.cc new file mode 100644 index 000000000000..8b3b467efc43 --- /dev/null +++ b/gdb/unittests/basic_string_view/literals/types.cc @@ -0,0 +1,45 @@ +// { dg-options "-std=gnu++17" } +// { dg-do compile } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +void +test01() +{ + using namespace std::literals::string_view_literals; + + static_assert(std::is_same::value, + "\"Hello\"s is std::string_view"); + + static_assert(std::is_same::value, + "u8\"Hello\"s is std::string_view"); + +#ifdef _GLIBCXX_USE_WCHAR_T + static_assert(std::is_same::value, + "L\"Hello\"s is std::wstring_view"); +#endif + + static_assert(std::is_same::value, + "u\"Hello\"s is std::u16string_view"); + + static_assert(std::is_same::value, + "U\"Hello\"s is std::u32string_view"); +} diff --git a/gdb/unittests/basic_string_view/literals/values.cc b/gdb/unittests/basic_string_view/literals/values.cc new file mode 100644 index 000000000000..b2897a136b8b --- /dev/null +++ b/gdb/unittests/basic_string_view/literals/values.cc @@ -0,0 +1,72 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +void +test01() +{ + using namespace std::literals::string_view_literals; + + std::string_view planet = "Mercury"sv; +#ifdef _GLIBCXX_USE_WCHAR_T + std::wstring_view wplanet = L"Venus"sv; +#endif + std::string_view u8planet = u8"Mars"sv; + std::u16string_view u16planet = u"Jupiter"sv; + std::u32string_view u32planet = U"Saturn"sv; + + VERIFY( planet == std::string_view("Mercury") ); +#ifdef _GLIBCXX_USE_WCHAR_T + VERIFY( wplanet == std::wstring_view(L"Venus") ); +#endif + VERIFY( u8planet == std::string_view(u8"Mars") ); + VERIFY( u16planet == std::u16string_view(u"Jupiter") ); + VERIFY( u32planet == std::u32string_view(U"Saturn") ); +} + +void +test02() +{ + using namespace std::literals::string_view_literals; + + std::string_view planet_cratered = "Mercury\0cratered"sv; +#ifdef _GLIBCXX_USE_WCHAR_T + std::wstring_view wplanet_cratered = L"Venus\0cratered"sv; +#endif + std::string_view u8planet_cratered = u8"Mars\0cratered"sv; + std::u16string_view u16planet_cratered = u"Jupiter\0cratered"sv; + std::u32string_view u32planet_cratered = U"Saturn\0cratered"sv; + + VERIFY( planet_cratered == std::string_view("Mercury\0cratered", 16) ); +#ifdef _GLIBCXX_USE_WCHAR_T + VERIFY( wplanet_cratered == std::wstring_view(L"Venus\0cratered", 14) ); +#endif + VERIFY( u8planet_cratered == std::string_view(u8"Mars\0cratered", 13) ); + VERIFY( u16planet_cratered == std::u16string_view(u"Jupiter\0cratered", 16) ); + VERIFY( u32planet_cratered == std::u32string_view(U"Saturn\0cratered", 15) ); +} + +int +main() +{ + test01(); + test02(); +} diff --git a/gdb/unittests/basic_string_view/modifiers/remove_prefix/char/1.cc b/gdb/unittests/basic_string_view/modifiers/remove_prefix/char/1.cc new file mode 100644 index 000000000000..ba08a98eeaec --- /dev/null +++ b/gdb/unittests/basic_string_view/modifiers/remove_prefix/char/1.cc @@ -0,0 +1,61 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +void +test01() +{ + using std::string_view; + + string_view str0{"olympus mons"}; + string_view::pointer p = str0.data(); + str0.remove_prefix(4); + VERIFY( str0.data() == p + 4); + VERIFY( str0.length() == 8 ); + VERIFY( str0 == string_view{"pus mons"} ); +} + +constexpr bool +test02() +{ + using std::string_view; + + string_view str0{"olympus mons"}; + string_view::pointer p = str0.data(); + str0.remove_prefix(4); + if ( str0.data() != p + 4) + return false; + if ( str0.length() != 8 ) + return false; + if ( str0 != string_view{"pus mons"} ) + return false; + + return true; +} + +int +main() +{ + test01(); + static_assert( test02() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc b/gdb/unittests/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc new file mode 100644 index 000000000000..3c6911824c6a --- /dev/null +++ b/gdb/unittests/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc @@ -0,0 +1,61 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +void +test01() +{ + using std::wstring_view; + + wstring_view str0{L"olympus mons"}; + wstring_view::pointer p = str0.data(); + str0.remove_prefix(4); + VERIFY( str0.data() == p + 4); + VERIFY( str0.length() == 8 ); + VERIFY( str0 == wstring_view{L"pus mons"} ); +} + +constexpr bool +test02() +{ + using std::wstring_view; + + wstring_view str0{L"olympus mons"}; + wstring_view::pointer p = str0.data(); + str0.remove_prefix(4); + if ( str0.data() != p + 4) + return false; + if ( str0.length() != 8 ) + return false; + if ( str0 != wstring_view{L"pus mons"} ) + return false; + + return true; +} + +int +main() +{ + test01(); + static_assert( test02() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/modifiers/remove_suffix/char/1.cc b/gdb/unittests/basic_string_view/modifiers/remove_suffix/char/1.cc new file mode 100644 index 000000000000..1b71ee936e8c --- /dev/null +++ b/gdb/unittests/basic_string_view/modifiers/remove_suffix/char/1.cc @@ -0,0 +1,61 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +void +test01() +{ + using std::string_view; + + string_view str0{"olympus mons"}; + string_view::pointer p = str0.data(); + str0.remove_suffix(2); + VERIFY( str0.data() == p); + VERIFY( str0.length() == 10 ); + VERIFY( str0 == string_view{"olympus mo"} ); +} + +constexpr bool +test02() +{ + using std::string_view; + + string_view str0{"olympus mons"}; + string_view::pointer p = str0.data(); + str0.remove_suffix(2); + if ( str0.data() != p) + return false; + if ( str0.length() != 10 ) + return false; + if ( str0 != string_view{"olympus mo"} ) + return false; + + return true; +} + +int +main() +{ + test01(); + static_assert( test02() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc b/gdb/unittests/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc new file mode 100644 index 000000000000..0f94a092ad69 --- /dev/null +++ b/gdb/unittests/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc @@ -0,0 +1,61 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +void +test01() +{ + using std::wstring_view; + + wstring_view str0{L"olympus mons"}; + wstring_view::pointer p = str0.data(); + str0.remove_suffix(2); + VERIFY( str0.data() == p); + VERIFY( str0.length() == 10 ); + VERIFY( str0 == wstring_view{L"olympus mo"} ); +} + +constexpr bool +test02() +{ + using std::wstring_view; + + wstring_view str0{L"olympus mons"}; + wstring_view::pointer p = str0.data(); + str0.remove_suffix(2); + if ( str0.data() != p) + return false; + if ( str0.length() != 10 ) + return false; + if ( str0 != wstring_view{L"olympus mo"} ) + return false; + + return true; +} + +int +main() +{ + test01(); + static_assert( test02() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/modifiers/swap/char/1.cc b/gdb/unittests/basic_string_view/modifiers/swap/char/1.cc new file mode 100644 index 000000000000..90d26692599c --- /dev/null +++ b/gdb/unittests/basic_string_view/modifiers/swap/char/1.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2017-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +constexpr bool +test01() +{ + using std::string_view; + + string_view s1{"last"}; + string_view s2{"first"}; + + s1.swap(s2); + return s1 == "first" && s2 == "last"; +} + +static_assert( test01() ); diff --git a/gdb/unittests/basic_string_view/modifiers/swap/wchar_t/1.cc b/gdb/unittests/basic_string_view/modifiers/swap/wchar_t/1.cc new file mode 100644 index 000000000000..bd757ecfaa93 --- /dev/null +++ b/gdb/unittests/basic_string_view/modifiers/swap/wchar_t/1.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2017-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +constexpr bool +test01() +{ + using std::wstring_view; + + wstring_view s1{L"last"}; + wstring_view s2{L"first"}; + + s1.swap(s2); + return s1 == L"first" && s2 == L"last"; +} + +static_assert( test01() ); diff --git a/gdb/unittests/basic_string_view/operations/compare/char/1.cc b/gdb/unittests/basic_string_view/operations/compare/char/1.cc new file mode 100644 index 000000000000..46691ebd52a1 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/compare/char/1.cc @@ -0,0 +1,132 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view::compare +// int compare(const basic_string_view& str) const; +// int compare(size_type pos1, size_type n1, const basic_string_view& str) const; +// int compare(size_type pos1, size_type n1, const basic_string_view& str, +// size_type pos2, size_type n2) const; +// int compare(const charT* s) const; +// int compare(size_type pos1, size_type n1, +// const charT* s, size_type n2 = npos) const; + +// NB compare should be thought of as a lexographical compare, ie how +// things would be sorted in a dictionary. + +#include +#include +#include + +enum want_value {lt=0, z=1, gt=2}; + +int +test_value(int result, want_value expected); + +int +test_value(int result, want_value expected) +{ + bool pass = false; + + switch (expected) { + case lt: + if (result < 0) + pass = true; + break; + case z: + if (!result) + pass = true; + break; + case gt: + if (result > 0) + pass = true; + break; + default: + pass = false; //should not get here + } + VERIFY(pass); + return 0; +} + +int +test01() +{ + using std::string_view; + + string_view str_0("costa rica"); + string_view str_1("costa marbella"); + string_view str_2; + + //sanity check + test_value(strcmp("costa marbella", "costa rica"), lt); + test_value(strcmp("costa rica", "costa rica"), z); + test_value(strcmp(str_1.data(), str_0.data()), lt); + test_value(strcmp(str_0.data(), str_1.data()), gt); + test_value(strncmp(str_1.data(), str_0.data(), 6), z); + test_value(strncmp(str_1.data(), str_0.data(), 14), lt); + test_value(memcmp(str_1.data(), str_0.data(), 6), z); + test_value(memcmp(str_1.data(), str_0.data(), 10), lt); + test_value(memcmp("costa marbella", "costa rica", 10), lt); + + // int compare(const basic_string_view& str) const; + test_value(str_0.compare(str_1), gt); //because r>m + test_value(str_1.compare(str_0), lt); //because m. + +// basic_string_view::compare [lib.string_view::compare] + +#include +#include + +// libstdc++/13650 +void +test01() +{ + using std::string_view; + + const char lit_01[]{ 'w', 'e', '\0', 'r', 'd' }; + const char lit_02[]{ 'w', 'e', 'i', '\0', 'd' }; + + const char lit_ref_a[]{ 'w', 'e', '\0', 'q', 'd' }; + const string_view str_a(lit_ref_a, 5); + VERIFY( str_a.compare(0, 5, lit_01, 5) < 0 ); + + const char lit_ref_b[]{ 'w', 'e', 'i' }; + const string_view str_b(lit_ref_b, 3); + VERIFY( str_b.compare(0, 3, lit_02, 5) < 0 ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/compare/char/2.cc b/gdb/unittests/basic_string_view/operations/compare/char/2.cc new file mode 100644 index 000000000000..ad9945a4dc10 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/compare/char/2.cc @@ -0,0 +1,30 @@ +// Copyright (C) 2017-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +constexpr char c1[] = "one"; +constexpr char c2[] = "two"; + +constexpr std::string_view s1{c1}; +constexpr std::string_view s2{c2}; + +constexpr int n1 = s1.compare(s1); +constexpr int n2 = s1.compare(s2); diff --git a/gdb/unittests/basic_string_view/operations/compare/char/70483.cc b/gdb/unittests/basic_string_view/operations/compare/char/70483.cc new file mode 100644 index 000000000000..5954d570fdc4 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/compare/char/70483.cc @@ -0,0 +1,89 @@ +// Copyright (C) 2017-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +struct constexpr_char_traits : std::char_traits +{ + static constexpr size_t + length(const char* val) + { + size_t res = 0; + for (; val[res] != '\0'; ++res) + ; + return res; + } + + static constexpr int + compare(const char* lhs, const char* rhs, std::size_t count) + { + for (size_t pos = 0; pos < count; ++pos) + { + if (lhs[pos] != rhs[pos]) + return lhs[pos] - rhs[pos]; + } + return 0; + } +}; + +using string_view = std::basic_string_view; + +constexpr +string_view get() +{ + string_view res = "x::"; + string_view start_pattern = "x"; + res = res.substr(res.find(start_pattern) + start_pattern.size()); + res = res.substr(0, res.find_first_of(";]")); + res = res.substr(res.rfind("::")); + return res; +} + +static_assert( get() == get() ); + +using std::u16string_view; + +constexpr +u16string_view get16() +{ + u16string_view res = u"x::"; + u16string_view start_pattern = u"x"; + res = res.substr(res.find(start_pattern) + start_pattern.size()); + res = res.substr(0, res.find_first_of(u";]")); + res = res.substr(res.rfind(u"::")); + return res; +} + +static_assert( get16() == get16() ); + +using std::u32string_view; + +constexpr +u32string_view get32() +{ + u32string_view res = U"x::"; + u32string_view start_pattern = U"x"; + res = res.substr(res.find(start_pattern) + start_pattern.size()); + res = res.substr(0, res.find_first_of(U";]")); + res = res.substr(res.rfind(U"::")); + return res; +} + +static_assert( get32() == get32() ); diff --git a/gdb/unittests/basic_string_view/operations/compare/wchar_t/1.cc b/gdb/unittests/basic_string_view/operations/compare/wchar_t/1.cc new file mode 100644 index 000000000000..15de7ccca646 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/compare/wchar_t/1.cc @@ -0,0 +1,133 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view::compare +// int compare(const basic_string_view& str) const; +// int compare(size_type pos1, size_type n1, const basic_string_view& str) const; +// int compare(size_type pos1, size_type n1, const basic_string_view& str, +// size_type pos2, size_type n2) const; +// int compare(const charT* s) const; +// int compare(size_type pos1, size_type n1, +// const charT* s, size_type n2 = npos) const; + +// NB compare should be thought of as a lexographical compare, ie how +// things would be sorted in a dictionary. + +#include +#include + +enum want_value {lt=0, z=1, gt=2}; + +int +test_value(int result, want_value expected); + +int +test_value(int result, want_value expected) +{ + bool pass = false; + + switch (expected) { + case lt: + if (result < 0) + pass = true; + break; + case z: + if (!result) + pass = true; + break; + case gt: + if (result > 0) + pass = true; + break; + default: + pass = false; //should not get here + } + + VERIFY(pass); + return 0; +} + + +int +test01() +{ + using std::wstring_view; + + wstring_view str_0(L"costa rica"); + wstring_view str_1(L"costa marbella"); + wstring_view str_2; + + //sanity check + test_value(wcscmp(L"costa marbella", L"costa rica"), lt); + test_value(wcscmp(L"costa rica", L"costa rica"), z); + test_value(wcscmp(str_1.data(), str_0.data()), lt); + test_value(wcscmp(str_0.data(), str_1.data()), gt); + test_value(wcsncmp(str_1.data(), str_0.data(), 6), z); + test_value(wcsncmp(str_1.data(), str_0.data(), 14), lt); + test_value(wmemcmp(str_1.data(), str_0.data(), 6), z); + test_value(wmemcmp(str_1.data(), str_0.data(), 14), lt); + test_value(wmemcmp(L"costa marbella", L"costa rica", 14), lt); + + // int compare(const basic_string_view& str) const; + test_value(str_0.compare(str_1), gt); //because r>m + test_value(str_1.compare(str_0), lt); //because m. + +// basic_string_view::compare [lib.string_view::compare] + +#include +#include + +// libstdc++/13650 +void +test01() +{ + using std::wstring_view; + + const wchar_t lit_01[] = { L'w', L'e', L'\0', L'r', L'd' }; + const wchar_t lit_02[] = { L'w', L'e', L'i', L'\0', L'd' }; + + const wchar_t lit_ref_a[] = { L'w', L'e', L'\0', L'q', L'd' }; + const wstring_view str_a(lit_ref_a, 5); + VERIFY( str_a.compare(0, 5, lit_01, 5) < 0 ); + + const wchar_t lit_ref_b[] = { L'w', L'e', L'i' }; + const wstring_view str_b(lit_ref_b, 3); + VERIFY( str_b.compare(0, 3, lit_02, 5) < 0 ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/compare/wchar_t/2.cc b/gdb/unittests/basic_string_view/operations/compare/wchar_t/2.cc new file mode 100644 index 000000000000..250129c6c67a --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/compare/wchar_t/2.cc @@ -0,0 +1,30 @@ +// Copyright (C) 2017-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +constexpr wchar_t c1[] = L"one"; +constexpr wchar_t c2[] = L"two"; + +constexpr std::wstring_view s1{c1}; +constexpr std::wstring_view s2{c2}; + +constexpr int n1 = s1.compare(s1); +constexpr int n2 = s1.compare(s2); diff --git a/gdb/unittests/basic_string_view/operations/copy/char/1.cc b/gdb/unittests/basic_string_view/operations/copy/char/1.cc new file mode 100644 index 000000000000..6caf0e1507a6 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/copy/char/1.cc @@ -0,0 +1,45 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view::copy + +#include +#include + +void +test01() +{ + typedef std::string_view::size_type csize_type; + + const char str_lit01[] = "123456789A"; + const std::string_view str01(str_lit01); + char buffer[4] = { 0 }; + + csize_type len = str01.copy(buffer, sizeof(buffer), 8); + VERIFY( 2 == len ); + VERIFY( '9' == buffer[0] ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/copy/wchar_t/1.cc b/gdb/unittests/basic_string_view/operations/copy/wchar_t/1.cc new file mode 100644 index 000000000000..84f3208add62 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/copy/wchar_t/1.cc @@ -0,0 +1,46 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view::copy + +#include +#include + +void +test01() +{ + typedef std::wstring_view::size_type csize_type; + csize_type csz01; + + const wchar_t str_lit01[] = L"123456789A"; + const std::wstring_view str01(str_lit01); + wchar_t buffer[4] = { 0 }; + + csize_type len = str01.copy(buffer, sizeof(buffer), 8); + VERIFY( 2 == len ); + VERIFY( L'9' == buffer[0] ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/data/char/1.cc b/gdb/unittests/basic_string_view/operations/data/char/1.cc new file mode 100644 index 000000000000..18fc9f5fe888 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/data/char/1.cc @@ -0,0 +1,43 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// string_view operations + +#include +#include + +int +test01() +{ + std::string_view empty; + + VERIFY( empty.size() == 0 ); + const std::string_view::value_type* p = empty.data(); + VERIFY( p == nullptr ); + + return 0; +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/data/wchar_t/1.cc b/gdb/unittests/basic_string_view/operations/data/wchar_t/1.cc new file mode 100644 index 000000000000..6596db528996 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/data/wchar_t/1.cc @@ -0,0 +1,43 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// string_view operations + +#include +#include + +int +test01() +{ + std::wstring_view empty; + + VERIFY( empty.size() == 0 ); + const std::wstring_view::value_type* p = empty.data(); + VERIFY( p == nullptr ); + + return 0; +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/find/char/1.cc b/gdb/unittests/basic_string_view/operations/find/char/1.cc new file mode 100644 index 000000000000..d7d2f37706eb --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/find/char/1.cc @@ -0,0 +1,164 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view find + +#include +#include + +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; + 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; + + // size_type find(const string_view&, size_type pos = 0) const; + csz01 = str01.find(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str01, 4); + VERIFY( csz01 == npos ); + csz01 = str01.find(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str02, 3); + VERIFY( csz01 == npos ); + csz01 = str01.find(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find(str03, 3); + VERIFY( csz01 == 8 ); + csz01 = str01.find(str03, 12); + VERIFY( csz01 == npos ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + csz01 = str01.find(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str04, 5); + VERIFY( csz01 == 5 ); + csz01 = str01.find(str04, str01.size()); + VERIFY( csz01 == str01.size() ); + csz01 = str01.find(str04, str01.size()+1); + VERIFY( csz01 == npos ); + + // size_type find(const char* s, size_type pos, size_type n) const; + csz01 = str01.find(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str_lit01, 3, 0); + VERIFY( csz01 == 3 ); + + // size_type find(const char* s, size_type pos = 0) const; + csz01 = str01.find(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str_lit01, 3); + VERIFY( csz01 == npos ); + + // size_type find(char c, size_type pos = 0) const; + csz01 = str01.find('z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); + csz01 = str01.find('/'); + VERIFY( csz01 == npos ); +} + +constexpr bool +test02() +{ + 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; + csize_type csz01 = 0, csz02 = 0; + + 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; + +#undef VERIFY +#define VERIFY(x) if(!(x)) return false + + // size_type find(const string_view&, size_type pos = 0) const; + csz01 = str01.find(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str01, 4); + VERIFY( csz01 == npos ); + csz01 = str01.find(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str02, 3); + VERIFY( csz01 == npos ); + csz01 = str01.find(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find(str03, 3); + VERIFY( csz01 == 8 ); + csz01 = str01.find(str03, 12); + VERIFY( csz01 == npos ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + csz01 = str01.find(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str04, 5); + VERIFY( csz01 == 5 ); + csz01 = str01.find(str04, str01.size()); + VERIFY( csz01 == str01.size() ); + csz01 = str01.find(str04, str01.size()+1); + VERIFY( csz01 == npos ); + + // size_type find(const char* s, size_type pos, size_type n) const; + csz01 = str01.find(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str_lit01, 3, 0); + VERIFY( csz01 == 3 ); + + // size_type find(const char* s, size_type pos = 0) const; + csz01 = str01.find(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str_lit01, 3); + VERIFY( csz01 == npos ); + + // size_type find(char c, size_type pos = 0) const; + csz01 = str01.find('z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); + csz01 = str01.find('/'); + VERIFY( csz01 == npos ); + + return true; +} + + +int +main() +{ + test01(); + static_assert( test02() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/find/char/2.cc b/gdb/unittests/basic_string_view/operations/find/char/2.cc new file mode 100644 index 000000000000..af8a526d12c7 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/find/char/2.cc @@ -0,0 +1,161 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view find_first_of + +#include +#include + +void +test02() +{ + typedef std::string_view::size_type csize_type; + csize_type npos = std::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; + + // size_type find_first_of(const string_view&, size_type pos = 0) const; + std::string_view str05("xena rulez"); + csz01 = str01.find_first_of(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str01, 4); + VERIFY( csz01 == 4 ); + csz01 = str01.find_first_of(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str02, 3); + VERIFY( csz01 == 3 ); + csz01 = str01.find_first_of(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_of(str03, 3); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_of(str03, 12); + VERIFY( csz01 == 16 ); + csz01 = str01.find_first_of(str05, 0); + VERIFY( csz01 == 1 ); + csz01 = str01.find_first_of(str05, 4); + VERIFY( csz01 == 4 ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + // However, str1.find_first_of(str2,pos) finds the first character in + // str1 (starting at pos) that exists in str2, which is none for empty str2 + csz01 = str01.find_first_of(str04, 0); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_of(str04, 5); + VERIFY( csz01 == npos ); + + // size_type find_first_of(const char* s, size_type pos, size_type n) const; + csz01 = str01.find_first_of(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str_lit01, 3, 0); + VERIFY( csz01 == npos ); + + // size_type find_first_of(const char* s, size_type pos = 0) const; + csz01 = str01.find_first_of(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str_lit01, 3); + VERIFY( csz01 == 3 ); + + // size_type find_first_of(char c, size_type pos = 0) const; + csz01 = str01.find_first_of('z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); +} + +constexpr bool +test03() +{ + typedef std::string_view::size_type csize_type; + csize_type npos = std::string_view::npos; + csize_type csz01 = 0, csz02 = 0; + + 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; + +#undef VERIFY +#define VERIFY(x) if(!(x)) return false + + // size_type find_first_of(const string_view&, size_type pos = 0) const; + std::string_view str05("xena rulez"); + csz01 = str01.find_first_of(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str01, 4); + VERIFY( csz01 == 4 ); + csz01 = str01.find_first_of(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str02, 3); + VERIFY( csz01 == 3 ); + csz01 = str01.find_first_of(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_of(str03, 3); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_of(str03, 12); + VERIFY( csz01 == 16 ); + csz01 = str01.find_first_of(str05, 0); + VERIFY( csz01 == 1 ); + csz01 = str01.find_first_of(str05, 4); + VERIFY( csz01 == 4 ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + // However, str1.find_first_of(str2,pos) finds the first character in + // str1 (starting at pos) that exists in str2, which is none for empty str2 + csz01 = str01.find_first_of(str04, 0); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_of(str04, 5); + VERIFY( csz01 == npos ); + + // size_type find_first_of(const char* s, size_type pos, size_type n) const; + csz01 = str01.find_first_of(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str_lit01, 3, 0); + VERIFY( csz01 == npos ); + + // size_type find_first_of(const char* s, size_type pos = 0) const; + csz01 = str01.find_first_of(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str_lit01, 3); + VERIFY( csz01 == 3 ); + + // size_type find_first_of(char c, size_type pos = 0) const; + csz01 = str01.find_first_of('z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); + + return true; +} + +int +main() +{ + test02(); + static_assert( test03() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/find/char/3.cc b/gdb/unittests/basic_string_view/operations/find/char/3.cc new file mode 100644 index 000000000000..5ec651ef3f93 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/find/char/3.cc @@ -0,0 +1,161 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view find_first_not_of + +#include +#include + +void +test03() +{ + typedef std::string_view::size_type csize_type; + csize_type npos = std::string_view::npos; + csize_type csz01; + + const std::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; + + // size_type find_first_not_of(const string_view&, size_type pos = 0) const; + csz01 = str01.find_first_not_of(str01); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_not_of(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str02, 10); + VERIFY( csz01 == 10 ); + csz01 = str01.find_first_not_of(str02, 12); + VERIFY( csz01 == 14 ); + csz01 = str01.find_first_not_of(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_not_of(str03, 15); + VERIFY( csz01 == 15 ); + csz01 = str01.find_first_not_of(str03, 16); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_not_of(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str04, 12); + VERIFY( csz01 == 12 ); + csz01 = str03.find_first_not_of(str01, 0); + VERIFY( csz01 == npos ); + csz01 = str04.find_first_not_of(str02, 0); + VERIFY( csz01 == npos ); + + // size_type find_first_not_of(const char* s, size_type pos, size_type n) const; + csz01 = str01.find_first_not_of(str_lit01, 0, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str_lit01, 0, 8); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_not_of(str_lit01, 10, 0); + VERIFY( csz01 == 10 ); + + // size_type find_first_not_of(const char* s, size_type pos = 0) const; + csz01 = str01.find_first_not_of(str_lit01); + VERIFY( csz01 == 8 ); + csz01 = str02.find_first_not_of(str_lit01, 2); + VERIFY( csz01 == 2 ); + + // size_type find_first_not_of(char c, size_type pos = 0) const; + csz01 = str01.find_first_not_of('B'); + VERIFY( csz01 == 1 ); + csz01 = str01.find_first_not_of('o', 1); + VERIFY( csz01 == 2 ); + csz01 = str02.find_first_not_of('z'); + VERIFY( csz01 == 0 ); + csz01 = str04.find_first_not_of('S'); + VERIFY( csz01 == npos ); +} + +constexpr bool +test04() +{ + typedef std::string_view::size_type csize_type; + csize_type npos = std::string_view::npos; + csize_type csz01 = 0; + + const std::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; + +#undef VERIFY +#define VERIFY(x) if(!(x)) return false + + // size_type find_first_not_of(const string_view&, size_type pos = 0) const; + csz01 = str01.find_first_not_of(str01); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_not_of(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str02, 10); + VERIFY( csz01 == 10 ); + csz01 = str01.find_first_not_of(str02, 12); + VERIFY( csz01 == 14 ); + csz01 = str01.find_first_not_of(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_not_of(str03, 15); + VERIFY( csz01 == 15 ); + csz01 = str01.find_first_not_of(str03, 16); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_not_of(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str04, 12); + VERIFY( csz01 == 12 ); + csz01 = str03.find_first_not_of(str01, 0); + VERIFY( csz01 == npos ); + csz01 = str04.find_first_not_of(str02, 0); + VERIFY( csz01 == npos ); + + // size_type find_first_not_of(const char* s, size_type pos, size_type n) const; + csz01 = str01.find_first_not_of(str_lit01, 0, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str_lit01, 0, 8); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_not_of(str_lit01, 10, 0); + VERIFY( csz01 == 10 ); + + // size_type find_first_not_of(const char* s, size_type pos = 0) const; + csz01 = str01.find_first_not_of(str_lit01); + VERIFY( csz01 == 8 ); + csz01 = str02.find_first_not_of(str_lit01, 2); + VERIFY( csz01 == 2 ); + + // size_type find_first_not_of(char c, size_type pos = 0) const; + csz01 = str01.find_first_not_of('B'); + VERIFY( csz01 == 1 ); + csz01 = str01.find_first_not_of('o', 1); + VERIFY( csz01 == 2 ); + csz01 = str02.find_first_not_of('z'); + VERIFY( csz01 == 0 ); + csz01 = str04.find_first_not_of('S'); + VERIFY( csz01 == npos ); + + return true; +} + +int +main() +{ + test03(); + static_assert( test04() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/find/char/4.cc b/gdb/unittests/basic_string_view/operations/find/char/4.cc new file mode 100644 index 000000000000..ca4b1f17db42 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/find/char/4.cc @@ -0,0 +1,44 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view find + +#include +#include + +// libstdc++/31401 +void +test01() +{ + typedef std::string_view::size_type csize_type; + csize_type npos = std::string_view::npos; + + std::string_view use = "anu"; + csize_type pos1 = use.find("a", npos); + + VERIFY( pos1 == npos ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/find/wchar_t/1.cc b/gdb/unittests/basic_string_view/operations/find/wchar_t/1.cc new file mode 100644 index 000000000000..535b2d5e383a --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/find/wchar_t/1.cc @@ -0,0 +1,163 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view find + +#include +#include + +void +test01() +{ + typedef std::wstring_view::size_type csize_type; + typedef std::wstring_view::const_reference cref; + typedef std::wstring_view::reference ref; + csize_type npos = std::wstring_view::npos; + csize_type csz01, csz02; + + const wchar_t str_lit01[] = L"mave"; + const std::wstring_view str01(L"mavericks, santa cruz"); + std::wstring_view str02(str_lit01); + std::wstring_view str03(L"s, s"); + std::wstring_view str04; + + // size_type find(const wstring_view&, size_type pos = 0) const; + csz01 = str01.find(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str01, 4); + VERIFY( csz01 == npos ); + csz01 = str01.find(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str02, 3); + VERIFY( csz01 == npos ); + csz01 = str01.find(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find(str03, 3); + VERIFY( csz01 == 8 ); + csz01 = str01.find(str03, 12); + VERIFY( csz01 == npos ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + csz01 = str01.find(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str04, 5); + VERIFY( csz01 == 5 ); + csz01 = str01.find(str04, str01.size()); + VERIFY( csz01 == str01.size() ); + csz01 = str01.find(str04, str01.size()+1); + VERIFY( csz01 == npos ); + + // size_type find(const wchar_t* s, size_type pos, size_type n) const; + csz01 = str01.find(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str_lit01, 3, 0); + VERIFY( csz01 == 3 ); + + // size_type find(const wchar_t* s, size_type pos = 0) const; + csz01 = str01.find(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str_lit01, 3); + VERIFY( csz01 == npos ); + + // size_type find(wchar_t c, size_type pos = 0) const; + csz01 = str01.find(L'z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); + csz01 = str01.find(L'/'); + VERIFY( csz01 == npos ); +} + +constexpr bool +test02() +{ + typedef std::wstring_view::size_type csize_type; + typedef std::wstring_view::const_reference cref; + typedef std::wstring_view::reference ref; + csize_type npos = std::wstring_view::npos; + csize_type csz01 = 0, csz02 = 0; + + const wchar_t str_lit01[] = L"mave"; + const std::wstring_view str01(L"mavericks, santa cruz"); + std::wstring_view str02(str_lit01); + std::wstring_view str03(L"s, s"); + std::wstring_view str04; + +#undef VERIFY +#define VERIFY(x) if(!(x)) return false + + // size_type find(const wstring_view&, size_type pos = 0) const; + csz01 = str01.find(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str01, 4); + VERIFY( csz01 == npos ); + csz01 = str01.find(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str02, 3); + VERIFY( csz01 == npos ); + csz01 = str01.find(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find(str03, 3); + VERIFY( csz01 == 8 ); + csz01 = str01.find(str03, 12); + VERIFY( csz01 == npos ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + csz01 = str01.find(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str04, 5); + VERIFY( csz01 == 5 ); + csz01 = str01.find(str04, str01.size()); + VERIFY( csz01 == str01.size() ); + csz01 = str01.find(str04, str01.size()+1); + VERIFY( csz01 == npos ); + + // size_type find(const wchar_t* s, size_type pos, size_type n) const; + csz01 = str01.find(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str_lit01, 3, 0); + VERIFY( csz01 == 3 ); + + // size_type find(const wchar_t* s, size_type pos = 0) const; + csz01 = str01.find(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.find(str_lit01, 3); + VERIFY( csz01 == npos ); + + // size_type find(wchar_t c, size_type pos = 0) const; + csz01 = str01.find(L'z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); + csz01 = str01.find(L'/'); + VERIFY( csz01 == npos ); + + return true; +} + +int +main() +{ + test01(); + static_assert( test02() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/find/wchar_t/2.cc b/gdb/unittests/basic_string_view/operations/find/wchar_t/2.cc new file mode 100644 index 000000000000..2802bf4442cb --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/find/wchar_t/2.cc @@ -0,0 +1,161 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view find_first_of + +#include +#include + +void +test02() +{ + typedef std::wstring_view::size_type csize_type; + csize_type npos = std::wstring_view::npos; + csize_type csz01, csz02; + + const wchar_t str_lit01[] = L"mave"; + const std::wstring_view str01(L"mavericks, santa cruz"); + std::wstring_view str02(str_lit01); + std::wstring_view str03(L"s, s"); + std::wstring_view str04; + + // size_type find_first_of(const wstring_view&, size_type pos = 0) const; + std::wstring_view str05(L"xena rulez"); + csz01 = str01.find_first_of(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str01, 4); + VERIFY( csz01 == 4 ); + csz01 = str01.find_first_of(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str02, 3); + VERIFY( csz01 == 3 ); + csz01 = str01.find_first_of(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_of(str03, 3); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_of(str03, 12); + VERIFY( csz01 == 16 ); + csz01 = str01.find_first_of(str05, 0); + VERIFY( csz01 == 1 ); + csz01 = str01.find_first_of(str05, 4); + VERIFY( csz01 == 4 ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + // However, str1.find_first_of(str2,pos) finds the first character in + // str1 (starting at pos) that exists in str2, which is none for empty str2 + csz01 = str01.find_first_of(str04, 0); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_of(str04, 5); + VERIFY( csz01 == npos ); + + // size_type find_first_of(const wchar_t* s, size_type pos, size_type n) const; + csz01 = str01.find_first_of(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str_lit01, 3, 0); + VERIFY( csz01 == npos ); + + // size_type find_first_of(const wchar_t* s, size_type pos = 0) const; + csz01 = str01.find_first_of(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str_lit01, 3); + VERIFY( csz01 == 3 ); + + // size_type find_first_of(wchar_t c, size_type pos = 0) const; + csz01 = str01.find_first_of(L'z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); +} + +constexpr bool +test04() +{ + typedef std::wstring_view::size_type csize_type; + csize_type npos = std::wstring_view::npos; + csize_type csz01 = 0, csz02 = 0; + + const wchar_t str_lit01[] = L"mave"; + const std::wstring_view str01(L"mavericks, santa cruz"); + std::wstring_view str02(str_lit01); + std::wstring_view str03(L"s, s"); + std::wstring_view str04; + +#undef VERIFY +#define VERIFY(x) if(!(x)) return false + + // size_type find_first_of(const wstring_view&, size_type pos = 0) const; + std::wstring_view str05(L"xena rulez"); + csz01 = str01.find_first_of(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str01, 4); + VERIFY( csz01 == 4 ); + csz01 = str01.find_first_of(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str02, 3); + VERIFY( csz01 == 3 ); + csz01 = str01.find_first_of(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_of(str03, 3); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_of(str03, 12); + VERIFY( csz01 == 16 ); + csz01 = str01.find_first_of(str05, 0); + VERIFY( csz01 == 1 ); + csz01 = str01.find_first_of(str05, 4); + VERIFY( csz01 == 4 ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + // However, str1.find_first_of(str2,pos) finds the first character in + // str1 (starting at pos) that exists in str2, which is none for empty str2 + csz01 = str01.find_first_of(str04, 0); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_of(str04, 5); + VERIFY( csz01 == npos ); + + // size_type find_first_of(const wchar_t* s, size_type pos, size_type n) const; + csz01 = str01.find_first_of(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str_lit01, 3, 0); + VERIFY( csz01 == npos ); + + // size_type find_first_of(const wchar_t* s, size_type pos = 0) const; + csz01 = str01.find_first_of(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_of(str_lit01, 3); + VERIFY( csz01 == 3 ); + + // size_type find_first_of(wchar_t c, size_type pos = 0) const; + csz01 = str01.find_first_of(L'z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); + + return true; +} + +int +main() +{ + test02(); + static_assert( test04() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/find/wchar_t/3.cc b/gdb/unittests/basic_string_view/operations/find/wchar_t/3.cc new file mode 100644 index 000000000000..6623bbdfc39f --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/find/wchar_t/3.cc @@ -0,0 +1,161 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view find_first_not_of + +#include +#include + +void +test03() +{ + typedef std::wstring_view::size_type csize_type; + csize_type npos = std::wstring_view::npos; + csize_type csz01; + + const std::wstring_view str01(L"Bob Rock, per me"); + const wchar_t str_lit01[] = L"Bob Rock"; + std::wstring_view str02(L"ovvero Trivi"); + std::wstring_view str03(str_lit01); + std::wstring_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 ); + csz01 = str01.find_first_not_of(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str02, 10); + VERIFY( csz01 == 10 ); + csz01 = str01.find_first_not_of(str02, 12); + VERIFY( csz01 == 14 ); + csz01 = str01.find_first_not_of(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_not_of(str03, 15); + VERIFY( csz01 == 15 ); + csz01 = str01.find_first_not_of(str03, 16); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_not_of(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str04, 12); + VERIFY( csz01 == 12 ); + csz01 = str03.find_first_not_of(str01, 0); + VERIFY( csz01 == npos ); + csz01 = str04.find_first_not_of(str02, 0); + VERIFY( csz01 == npos ); + + // size_type find_first_not_of(const char* s, size_type pos, size_type n) const; + csz01 = str01.find_first_not_of(str_lit01, 0, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str_lit01, 0, 8); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_not_of(str_lit01, 10, 0); + VERIFY( csz01 == 10 ); + + // size_type find_first_not_of(const char* s, size_type pos = 0) const; + csz01 = str01.find_first_not_of(str_lit01); + VERIFY( csz01 == 8 ); + csz01 = str02.find_first_not_of(str_lit01, 2); + VERIFY( csz01 == 2 ); + + // size_type find_first_not_of(char c, size_type pos = 0) const; + csz01 = str01.find_first_not_of(L'B'); + VERIFY( csz01 == 1 ); + csz01 = str01.find_first_not_of(L'o', 1); + VERIFY( csz01 == 2 ); + csz01 = str02.find_first_not_of(L'z'); + VERIFY( csz01 == 0 ); + csz01 = str04.find_first_not_of(L'S'); + VERIFY( csz01 == npos ); +} + +constexpr bool +test04() +{ + typedef std::wstring_view::size_type csize_type; + csize_type npos = std::wstring_view::npos; + csize_type csz01 = 0; + + const std::wstring_view str01(L"Bob Rock, per me"); + const wchar_t str_lit01[] = L"Bob Rock"; + std::wstring_view str02(L"ovvero Trivi"); + std::wstring_view str03(str_lit01); + std::wstring_view str04; + +#undef VERIFY +#define VERIFY(x) if(!(x)) return false + + // size_type find_first_not_of(const string_view&, size_type pos = 0) const; + csz01 = str01.find_first_not_of(str01); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_not_of(str02, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str02, 10); + VERIFY( csz01 == 10 ); + csz01 = str01.find_first_not_of(str02, 12); + VERIFY( csz01 == 14 ); + csz01 = str01.find_first_not_of(str03, 0); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_not_of(str03, 15); + VERIFY( csz01 == 15 ); + csz01 = str01.find_first_not_of(str03, 16); + VERIFY( csz01 == npos ); + csz01 = str01.find_first_not_of(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str04, 12); + VERIFY( csz01 == 12 ); + csz01 = str03.find_first_not_of(str01, 0); + VERIFY( csz01 == npos ); + csz01 = str04.find_first_not_of(str02, 0); + VERIFY( csz01 == npos ); + + // size_type find_first_not_of(const char* s, size_type pos, size_type n) const; + csz01 = str01.find_first_not_of(str_lit01, 0, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.find_first_not_of(str_lit01, 0, 8); + VERIFY( csz01 == 8 ); + csz01 = str01.find_first_not_of(str_lit01, 10, 0); + VERIFY( csz01 == 10 ); + + // size_type find_first_not_of(const char* s, size_type pos = 0) const; + csz01 = str01.find_first_not_of(str_lit01); + VERIFY( csz01 == 8 ); + csz01 = str02.find_first_not_of(str_lit01, 2); + VERIFY( csz01 == 2 ); + + // size_type find_first_not_of(char c, size_type pos = 0) const; + csz01 = str01.find_first_not_of(L'B'); + VERIFY( csz01 == 1 ); + csz01 = str01.find_first_not_of(L'o', 1); + VERIFY( csz01 == 2 ); + csz01 = str02.find_first_not_of(L'z'); + VERIFY( csz01 == 0 ); + csz01 = str04.find_first_not_of(L'S'); + VERIFY( csz01 == npos ); + + return true; +} + +int +main() +{ + test03(); + static_assert( test04() ); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/find/wchar_t/4.cc b/gdb/unittests/basic_string_view/operations/find/wchar_t/4.cc new file mode 100644 index 000000000000..213bf78cf937 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/find/wchar_t/4.cc @@ -0,0 +1,44 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view find + +#include +#include + +// libstdc++/31401 +void +test01() +{ + typedef std::wstring_view::size_type csize_type; + csize_type npos = std::wstring_view::npos; + + std::wstring_view use = L"anu"; + csize_type pos1 = use.find(L"a", npos); + + VERIFY( pos1 == npos ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/rfind/char/1.cc b/gdb/unittests/basic_string_view/operations/rfind/char/1.cc new file mode 100644 index 000000000000..ef26688fd761 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/rfind/char/1.cc @@ -0,0 +1,94 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +// 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; + 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; + + // size_type rfind(const string_view&, size_type pos = 0) const; + csz01 = str01.rfind(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str01, 4); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str02,3); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str02); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str03); + VERIFY( csz01 == 8 ); + csz01 = str01.rfind(str03, 3); + VERIFY( csz01 == npos ); + csz01 = str01.rfind(str03, 12); + VERIFY( csz01 == 8 ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + csz01 = str01.rfind(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str04, 5); + VERIFY( csz01 == 5 ); + csz01 = str01.rfind(str04, str01.size()); + VERIFY( csz01 == str01.size() ); + csz01 = str01.rfind(str04, str01.size()+1); + VERIFY( csz01 == str01.size() ); + + // size_type rfind(const char* s, size_type pos, size_type n) const; + csz01 = str01.rfind(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str_lit01, 3, 0); + VERIFY( csz01 == 3 ); + + // size_type rfind(const char* s, size_type pos = 0) const; + csz01 = str01.rfind(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str_lit01, 3); + VERIFY( csz01 == 0 ); + + // size_type rfind(char c, size_type pos = 0) const; + csz01 = str01.rfind('z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); + csz01 = str01.rfind('/'); + VERIFY( csz01 == npos ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/rfind/char/2.cc b/gdb/unittests/basic_string_view/operations/rfind/char/2.cc new file mode 100644 index 000000000000..df37f8c7745b --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/rfind/char/2.cc @@ -0,0 +1,52 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +// basic_string_view::find_last_of + +void +test02() +{ + std::string_view z("ab"); + std::string_view::size_type pos; + pos = z.find_last_of("ab"); + VERIFY( pos == 1 ); + pos = z.find_last_of("Xa"); + VERIFY( pos == 0 ); + pos = z.find_last_of("Xb"); + VERIFY( pos == 1 ); + pos = z.find_last_of("XYZ"); + VERIFY( pos == std::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 ); +} + +int +main() +{ + test02(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/rfind/char/3.cc b/gdb/unittests/basic_string_view/operations/rfind/char/3.cc new file mode 100644 index 000000000000..37f01a28af7f --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/rfind/char/3.cc @@ -0,0 +1,66 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +// 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; + + std::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"); + pos = y.find_last_not_of('X'); + VERIFY( pos == 0 ); + pos = y.find_last_not_of('a'); + VERIFY( pos == npos ); + pos = y.find_last_not_of("XYZ"); + VERIFY( pos == 0 ); + pos = y.find_last_not_of("a"); + VERIFY( pos == npos ); + + std::string_view z("ab"); + pos = z.find_last_not_of('X'); + VERIFY( pos == 1 ); + pos = z.find_last_not_of("XYZ"); + VERIFY( pos == 1 ); + pos = z.find_last_not_of('b'); + VERIFY( pos == 0 ); + pos = z.find_last_not_of("Xb"); + VERIFY( pos == 0 ); + pos = z.find_last_not_of("Xa"); + VERIFY( pos == 1 ); +} +int +main() +{ + test03(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/rfind/wchar_t/1.cc b/gdb/unittests/basic_string_view/operations/rfind/wchar_t/1.cc new file mode 100644 index 000000000000..197515f9b6cc --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/rfind/wchar_t/1.cc @@ -0,0 +1,94 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +// basic_string_view rfind + +void +test01() +{ + typedef std::wstring_view::size_type csize_type; + typedef std::wstring_view::const_reference cref; + typedef std::wstring_view::reference ref; + csize_type npos = std::wstring_view::npos; + csize_type csz01, csz02; + + const wchar_t str_lit01[] = L"mave"; + const std::wstring_view str01(L"mavericks, santa cruz"); + std::wstring_view str02(str_lit01); + std::wstring_view str03(L"s, s"); + std::wstring_view str04; + + // size_type rfind(const wstring_view&, size_type pos = 0) const; + csz01 = str01.rfind(str01); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str01, 4); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str02,3); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str02); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str03); + VERIFY( csz01 == 8 ); + csz01 = str01.rfind(str03, 3); + VERIFY( csz01 == npos ); + csz01 = str01.rfind(str03, 12); + VERIFY( csz01 == 8 ); + + // An empty string_view consists of no characters + // therefore it should be found at every point in a string_view, + // except beyond the end + csz01 = str01.rfind(str04, 0); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str04, 5); + VERIFY( csz01 == 5 ); + csz01 = str01.rfind(str04, str01.size()); + VERIFY( csz01 == str01.size() ); + csz01 = str01.rfind(str04, str01.size()+1); + VERIFY( csz01 == str01.size() ); + + // size_type rfind(const wchar_t* s, size_type pos, size_type n) const; + csz01 = str01.rfind(str_lit01, 0, 3); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str_lit01, 3, 0); + VERIFY( csz01 == 3 ); + + // size_type rfind(const wchar_t* s, size_type pos = 0) const; + csz01 = str01.rfind(str_lit01); + VERIFY( csz01 == 0 ); + csz01 = str01.rfind(str_lit01, 3); + VERIFY( csz01 == 0 ); + + // size_type rfind(wchar_t c, size_type pos = 0) const; + csz01 = str01.rfind(L'z'); + csz02 = str01.size() - 1; + VERIFY( csz01 == csz02 ); + csz01 = str01.rfind(L'/'); + VERIFY( csz01 == npos ); +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/rfind/wchar_t/2.cc b/gdb/unittests/basic_string_view/operations/rfind/wchar_t/2.cc new file mode 100644 index 000000000000..7fb7c6c328bb --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/rfind/wchar_t/2.cc @@ -0,0 +1,52 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +// basic_string_view::find_last_of + +void +test02() +{ + std::wstring_view::size_type pos; + std::wstring_view z(L"ab"); + pos = z.find_last_of(L"ab"); + VERIFY( pos == 1 ); + pos = z.find_last_of(L"Xa"); + VERIFY( pos == 0 ); + pos = z.find_last_of(L"Xb"); + VERIFY( pos == 1 ); + pos = z.find_last_of(L"XYZ"); + VERIFY( pos == std::wstring_view::npos ); + pos = z.find_last_of(L'a'); + VERIFY( pos == 0 ); + pos = z.find_last_of(L'b'); + VERIFY( pos == 1 ); + pos = z.find_last_of(L'X'); + VERIFY( pos == std::wstring_view::npos ); +} + +int +main() +{ + test02(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/rfind/wchar_t/3.cc b/gdb/unittests/basic_string_view/operations/rfind/wchar_t/3.cc new file mode 100644 index 000000000000..ad34cd3df7cf --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/rfind/wchar_t/3.cc @@ -0,0 +1,66 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +// basic_string_view::find_last_not_of + +void +test03() +{ + typedef std::wstring_view::size_type csize_type; + std::wstring_view::size_type pos; + csize_type npos = std::wstring_view::npos; + + std::wstring_view x; + pos = x.find_last_not_of(L'X'); + VERIFY( pos == npos ); + pos = x.find_last_not_of(L"XYZ"); + VERIFY( pos == npos ); + + std::wstring_view y(L"a"); + pos = y.find_last_not_of(L'X'); + VERIFY( pos == 0 ); + pos = y.find_last_not_of(L'a'); + VERIFY( pos == npos ); + pos = y.find_last_not_of(L"XYZ"); + VERIFY( pos == 0 ); + pos = y.find_last_not_of(L"a"); + VERIFY( pos == npos ); + + std::wstring_view z(L"ab"); + pos = z.find_last_not_of(L'X'); + VERIFY( pos == 1 ); + pos = z.find_last_not_of(L"XYZ"); + VERIFY( pos == 1 ); + pos = z.find_last_not_of(L'b'); + VERIFY( pos == 0 ); + pos = z.find_last_not_of(L"Xb"); + VERIFY( pos == 0 ); + pos = z.find_last_not_of(L"Xa"); + VERIFY( pos == 1 ); +} +int +main() +{ + test03(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/string_conversion/1.cc b/gdb/unittests/basic_string_view/operations/string_conversion/1.cc new file mode 100644 index 000000000000..c6bfa0b79fe2 --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/string_conversion/1.cc @@ -0,0 +1,51 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2014-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view::to_string + +#include +#include +#include +#include +#include + +void +test01() +{ + const char str_lit[] = "123456789A"; + const std::string_view sv(str_lit); + char buffer[4] = { 0 }; + + std::string s1{sv}; + VERIFY( s1 == str_lit ); + using test_alloc = __gnu_test::tracker_allocator; + std::basic_string, test_alloc> + s2{sv, test_alloc{}}; + static_assert( std::is_same::value, + "to_string() uses custom allocator" ); + VERIFY( std::equal(s1.begin(), s1.end(), s2.begin(), s2.end()) ); + auto s3 = static_cast(sv); + VERIFY( s3 == s1 ); +} + +int +main() +{ + test01(); +} diff --git a/gdb/unittests/basic_string_view/operations/substr/char/1.cc b/gdb/unittests/basic_string_view/operations/substr/char/1.cc new file mode 100644 index 000000000000..ac65c23c54be --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/substr/char/1.cc @@ -0,0 +1,79 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view::substr + +#include +#include +#include + +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 csz01; + + const char str_lit01[] = "rockaway, pacifica"; + const std::string_view str01(str_lit01); + std::string_view str02; + + // basic_string_view + // substr(size_type pos = 0, size_type n = npos) const; + csz01 = str01.size(); + str02 = str01.substr(0, 1); + VERIFY( str02 == "r" ); + str02 = str01.substr(10); + VERIFY( str02 == "pacifica" ); + + try + { + str02 = str01.substr(csz01 + 1); + VERIFY( false ); + } + catch(std::out_of_range& fail) + { + VERIFY( true ); + } + catch(...) + { + VERIFY( false ); + } + + try + { + str02 = str01.substr(csz01); + VERIFY( str02.size() == 0 ); + VERIFY( str02.begin() == str01.end() ); + VERIFY( true ); + } + catch(...) + { + VERIFY( false ); + } +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operations/substr/wchar_t/1.cc b/gdb/unittests/basic_string_view/operations/substr/wchar_t/1.cc new file mode 100644 index 000000000000..eb19ece2e79a --- /dev/null +++ b/gdb/unittests/basic_string_view/operations/substr/wchar_t/1.cc @@ -0,0 +1,79 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string_view::substr + +#include +#include +#include + +void +test01() +{ + typedef std::wstring_view::size_type csize_type; + typedef std::wstring_view::const_reference cref; + typedef std::wstring_view::reference ref; + csize_type csz01; + + const wchar_t str_lit01[] = L"rockaway, pacifica"; + const std::wstring_view str01(str_lit01); + std::wstring_view str02; + + // basic_string_view + // substr(size_type pos = 0, size_type n = npos) const; + csz01 = str01.size(); + str02 = str01.substr(0, 1); + VERIFY( str02 == L"r" ); + str02 = str01.substr(10); + VERIFY( str02 == L"pacifica" ); + + try + { + str02 = str01.substr(csz01 + 1); + VERIFY( false ); + } + catch(std::out_of_range& fail) + { + VERIFY( true ); + } + catch(...) + { + VERIFY( false ); + } + + try + { + str02 = str01.substr(csz01); + VERIFY( str02.size() == 0 ); + VERIFY( str02.begin() == str01.end() ); + VERIFY( true ); + } + catch(...) + { + VERIFY( false ); + } +} + +int +main() +{ + test01(); + + return 0; +} diff --git a/gdb/unittests/basic_string_view/operators/char/2.cc b/gdb/unittests/basic_string_view/operators/char/2.cc new file mode 100644 index 000000000000..4be652daafb2 --- /dev/null +++ b/gdb/unittests/basic_string_view/operators/char/2.cc @@ -0,0 +1,367 @@ +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// basic_string non-member functions + +// operator== +/* +template + bool operator==(const basic_string& lhs, + const basic_string& rhs); + +template + bool operator==(const charT* lhs, + const basic_string& rhs); + +template + bool operator==(const basic_string& lhs, + const charT* rhs); +*/ + +// operator!= +/* +template + bool operator!=(const basic_string& lhs, + const basic_string& rhs); + +template + bool operator!=(const charT* lhs, + const basic_string& rhs); + +template + bool operator!=(const basic_string& lhs, + const charT* rhs); +*/ + +// operator< +/* +template + bool operator< (const basic_string& lhs, + const basic_string& rhs); + +template + bool operator< (const basic_string& lhs, + const charT* rhs); + +template + bool operator< (const charT* lhs, + const basic_string& rhs); +*/ + +// operator> +/* +template + bool operator> (const basic_string& lhs, + const basic_string& rhs); + +template + bool operator> (const basic_string& lhs, + const charT* rhs); + +template + bool operator> (const charT* lhs, + const basic_string& rhs); +*/ + +// operator<= +/* +template + bool operator<=(const basic_string& lhs, + const basic_string& rhs); + +template + bool operator<=(const basic_string& lhs, + const charT* rhs); + +template + bool operator<=(const charT* lhs, + const basic_string& rhs); +*/ + +// operator>= +/* +template + bool operator>=(const basic_string& lhs, + const basic_string& rhs); + +template + bool operator>=(const basic_string& lhs, + const charT* rhs); + +template + bool operator>=(const charT* lhs, + const basic_string& rhs); +*/ + +#include +#include + +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; + + str_4 = str_0; + //comparisons between string objects + VERIFY( !(str_0 == str_1) ); + VERIFY( !(str_0 == str_2) ); + VERIFY( !(str_0 == str_3) ); + VERIFY( !(str_1 == str_0) ); + VERIFY( !(str_2 == str_0) ); + VERIFY( !(str_3 == str_0) ); + VERIFY( str_4 == str_0 ); + VERIFY( str_0 == str_4 ); + + VERIFY( str_0 != str_1 ); + VERIFY( str_0 != str_2 ); + VERIFY( str_0 != str_3 ); + VERIFY( str_1 != str_0 ); + VERIFY( str_2 != str_0 ); + VERIFY( str_3 != str_0 ); + VERIFY( !(str_0 != str_4) ); + VERIFY( !(str_4 != str_0) ); + + VERIFY( str_0 > str_1 ); //true cuz r>m + VERIFY( str_0 > str_2 ); + VERIFY( !(str_0 > str_3) ); + VERIFY( !(str_1 > str_0) ); //false cuz m str_0) ); + VERIFY( str_3 > str_0 ); + VERIFY( !(str_0 > str_4) ); + VERIFY( !(str_4 > str_0) ); + + VERIFY( !(str_0 < str_1) ); //false cuz r>m + VERIFY( !(str_0 < str_2) ); + VERIFY( str_0 < str_3 ); + VERIFY( str_1 < str_0 ); //true cuz m= str_1 ); //true cuz r>m + VERIFY( str_0 >= str_2 ); + VERIFY( !(str_0 >= str_3) ); + VERIFY( !(str_1 >= str_0) );//false cuz m= str_0) ); + VERIFY( str_3 >= str_0 ); + VERIFY( str_0 >= str_4 ); + VERIFY( str_4 >= str_0 ); + + VERIFY( !(str_0 <= str_1) );//false cuz r>m + VERIFY( !(str_0 <= str_2) ); + VERIFY( str_0 <= str_3 ); + VERIFY( str_1 <= str_0 );//true cuz m "costa marbella" ); //true cuz r>m + VERIFY( str_0 > "cost" ); + VERIFY( !(str_0 > "costa ricans") ); + VERIFY( !("costa marbella" > str_0) );//false cuz m str_0) ); + VERIFY( "costa ricans" > str_0 ); + VERIFY( !("costa rica" > str_0) ); + VERIFY( !(str_0 > "costa rica") ); + + VERIFY( !(str_0 < "costa marbella") );//false cuz r>m + VERIFY( !(str_0 < "cost") ); + VERIFY( str_0 < "costa ricans" ); + VERIFY( "costa marbella" < str_0 );//true cuz m= "costa marbella" );//true cuz r>m + VERIFY( str_0 >= "cost" ); + VERIFY( !(str_0 >= "costa ricans") ); + VERIFY( !("costa marbella" >= str_0) );//false cuz m= str_0) ); + VERIFY( "costa ricans" >= str_0 ); + VERIFY( "costa rica" >= str_0 ); + VERIFY( str_0 >= "costa rica" ); + + VERIFY( !(str_0 <= "costa marbella") );//false cuz r>m + VERIFY( !(str_0 <= "cost") ); + VERIFY( str_0 <= "costa ricans" ); + VERIFY( "costa marbella" <= str_0 );//true cuz m str_1 ); //true cuz r>m + VERIFY( str_0 > str_2 ); + VERIFY( !(str_0 > str_3) ); + VERIFY( !(str_1 > str_0) ); //false cuz m str_0) ); + VERIFY( str_3 > str_0 ); + VERIFY( !(str_0 > str_4) ); + VERIFY( !(str_4 > str_0) ); + + VERIFY( !(str_0 < str_1) ); //false cuz r>m + VERIFY( !(str_0 < str_2) ); + VERIFY( str_0 < str_3 ); + VERIFY( str_1 < str_0 ); //true cuz m= str_1 ); //true cuz r>m + VERIFY( str_0 >= str_2 ); + VERIFY( !(str_0 >= str_3) ); + VERIFY( !(str_1 >= str_0) );//false cuz m= str_0) ); + VERIFY( str_3 >= str_0 ); + VERIFY( str_0 >= str_4 ); + VERIFY( str_4 >= str_0 ); + + VERIFY( !(str_0 <= str_1) );//false cuz r>m + VERIFY( !(str_0 <= str_2) ); + VERIFY( str_0 <= str_3 ); + VERIFY( str_1 <= str_0 );//true cuz m "costa marbella" ); //true cuz r>m + VERIFY( str_0 > "cost" ); + VERIFY( !(str_0 > "costa ricans") ); + VERIFY( !("costa marbella" > str_0) );//false cuz m str_0) ); + VERIFY( "costa ricans" > str_0 ); + VERIFY( !("costa rica" > str_0) ); + VERIFY( !(str_0 > "costa rica") ); + + VERIFY( !(str_0 < "costa marbella") );//false cuz r>m + VERIFY( !(str_0 < "cost") ); + VERIFY( str_0 < "costa ricans" ); + VERIFY( "costa marbella" < str_0 );//true cuz m= "costa marbella" );//true cuz r>m + VERIFY( str_0 >= "cost" ); + VERIFY( !(str_0 >= "costa ricans") ); + VERIFY( !("costa marbella" >= str_0) );//false cuz m= str_0) ); + VERIFY( "costa ricans" >= str_0 ); + VERIFY( "costa rica" >= str_0 ); + VERIFY( str_0 >= "costa rica" ); + + VERIFY( !(str_0 <= "costa marbella") );//false cuz r>m + VERIFY( !(str_0 <= "cost") ); + VERIFY( str_0 <= "costa ricans" ); + VERIFY( "costa marbella" <= str_0 );//true cuz m. + +// basic_string_view non-member functions + +// operator== +/* +template + bool operator==(const basic_string_view& lhs, + const basic_string_view& rhs); + +template + bool operator==(const charT* lhs, + const basic_string_view& rhs); + +template + bool operator==(const basic_string_view& lhs, + const charT* rhs); +*/ + +// operator!= +/* +template + bool operator!=(const basic_string_view& lhs, + const basic_string_view& rhs); + +template + bool operator!=(const charT* lhs, + const basic_string_view& rhs); + +template + bool operator!=(const basic_string_view& lhs, + const charT* rhs); +*/ + +// operator< +/* +template + bool operator< (const basic_string_view& lhs, + const basic_string_view& rhs); + +template + bool operator< (const basic_string_view& lhs, + const charT* rhs); + +template + bool operator< (const charT* lhs, + const basic_string_view& rhs); +*/ + +// operator> +/* +template + bool operator> (const basic_string_view& lhs, + const basic_string_view& rhs); + +template + bool operator> (const basic_string_view& lhs, + const charT* rhs); + +template + bool operator> (const charT* lhs, + const basic_string_view& rhs); +*/ + +// operator<= +/* +template + bool operator<=(const basic_string_view& lhs, + const basic_string_view& rhs); + +template + bool operator<=(const basic_string_view& lhs, + const charT* rhs); + +template + bool operator<=(const charT* lhs, + const basic_string_view& rhs); +*/ + +// operator>= +/* +template + bool operator>=(const basic_string_view& lhs, + const basic_string_view& rhs); + +template + bool operator>=(const basic_string_view& lhs, + const charT* rhs); + +template + bool operator>=(const charT* lhs, + const basic_string_view& rhs); +*/ + +#include +#include + +void +test01() +{ + std::wstring_view str_0(L"costa rica"); + std::wstring_view str_1(L"costa marbella"); + std::wstring_view str_2(L"cost"); + std::wstring_view str_3(L"costa ricans"); + std::wstring_view str_4; + + str_4 = str_0; + //comparisons between string_view objects + VERIFY( !(str_0 == str_1) ); + VERIFY( !(str_0 == str_2) ); + VERIFY( !(str_0 == str_3) ); + VERIFY( !(str_1 == str_0) ); + VERIFY( !(str_2 == str_0) ); + VERIFY( !(str_3 == str_0) ); + VERIFY( str_4 == str_0 ); + VERIFY( str_0 == str_4 ); + + VERIFY( str_0 != str_1 ); + VERIFY( str_0 != str_2 ); + VERIFY( str_0 != str_3 ); + VERIFY( str_1 != str_0 ); + VERIFY( str_2 != str_0 ); + VERIFY( str_3 != str_0 ); + VERIFY( !(str_0 != str_4) ); + VERIFY( !(str_4 != str_0) ); + + VERIFY( str_0 > str_1 ); //true cuz r>m + VERIFY( str_0 > str_2 ); + VERIFY( !(str_0 > str_3) ); + VERIFY( !(str_1 > str_0) ); //false cuz m str_0) ); + VERIFY( str_3 > str_0 ); + VERIFY( !(str_0 > str_4) ); + VERIFY( !(str_4 > str_0) ); + + VERIFY( !(str_0 < str_1) ); //false cuz r>m + VERIFY( !(str_0 < str_2) ); + VERIFY( str_0 < str_3 ); + VERIFY( str_1 < str_0 ); //true cuz m= str_1 ); //true cuz r>m + VERIFY( str_0 >= str_2 ); + VERIFY( !(str_0 >= str_3) ); + VERIFY( !(str_1 >= str_0) );//false cuz m= str_0) ); + VERIFY( str_3 >= str_0 ); + VERIFY( str_0 >= str_4 ); + VERIFY( str_4 >= str_0 ); + + VERIFY( !(str_0 <= str_1) );//false cuz r>m + VERIFY( !(str_0 <= str_2) ); + VERIFY( str_0 <= str_3 ); + VERIFY( str_1 <= str_0 );//true cuz m L"costa marbella" ); //true cuz r>m + VERIFY( str_0 > L"cost" ); + VERIFY( !(str_0 > L"costa ricans") ); + VERIFY( !(L"costa marbella" > str_0) );//false cuz m str_0) ); + VERIFY( L"costa ricans" > str_0 ); + VERIFY( !(L"costa rica" > str_0) ); + VERIFY( !(str_0 > L"costa rica") ); + + VERIFY( !(str_0 < L"costa marbella") );//false cuz r>m + VERIFY( !(str_0 < L"cost") ); + VERIFY( str_0 < L"costa ricans" ); + VERIFY( L"costa marbella" < str_0 );//true cuz m= L"costa marbella" );//true cuz r>m + VERIFY( str_0 >= L"cost" ); + VERIFY( !(str_0 >= L"costa ricans") ); + VERIFY( !(L"costa marbella" >= str_0) );//false cuz m= str_0) ); + VERIFY( L"costa ricans" >= str_0 ); + VERIFY( L"costa rica" >= str_0 ); + VERIFY( str_0 >= L"costa rica" ); + + VERIFY( !(str_0 <= L"costa marbella") );//false cuz r>m + VERIFY( !(str_0 <= L"cost") ); + VERIFY( str_0 <= L"costa ricans" ); + VERIFY( L"costa marbella" <= str_0 );//true cuz m str_1 ); //true cuz r>m + VERIFY( str_0 > str_2 ); + VERIFY( !(str_0 > str_3) ); + VERIFY( !(str_1 > str_0) ); //false cuz m str_0) ); + VERIFY( str_3 > str_0 ); + VERIFY( !(str_0 > str_4) ); + VERIFY( !(str_4 > str_0) ); + + VERIFY( !(str_0 < str_1) ); //false cuz r>m + VERIFY( !(str_0 < str_2) ); + VERIFY( str_0 < str_3 ); + VERIFY( str_1 < str_0 ); //true cuz m= str_1 ); //true cuz r>m + VERIFY( str_0 >= str_2 ); + VERIFY( !(str_0 >= str_3) ); + VERIFY( !(str_1 >= str_0) );//false cuz m= str_0) ); + VERIFY( str_3 >= str_0 ); + VERIFY( str_0 >= str_4 ); + VERIFY( str_4 >= str_0 ); + + VERIFY( !(str_0 <= str_1) );//false cuz r>m + VERIFY( !(str_0 <= str_2) ); + VERIFY( str_0 <= str_3 ); + VERIFY( str_1 <= str_0 );//true cuz m L"costa marbella" ); //true cuz r>m + VERIFY( str_0 > L"cost" ); + VERIFY( !(str_0 > L"costa ricans") ); + VERIFY( !(L"costa marbella" > str_0) );//false cuz m str_0) ); + VERIFY( L"costa ricans" > str_0 ); + VERIFY( !(L"costa rica" > str_0) ); + VERIFY( !(str_0 > L"costa rica") ); + + VERIFY( !(str_0 < L"costa marbella") );//false cuz r>m + VERIFY( !(str_0 < L"cost") ); + VERIFY( str_0 < L"costa ricans" ); + VERIFY( L"costa marbella" < str_0 );//true cuz m= L"costa marbella" );//true cuz r>m + VERIFY( str_0 >= L"cost" ); + VERIFY( !(str_0 >= L"costa ricans") ); + VERIFY( !(L"costa marbella" >= str_0) );//false cuz m= str_0) ); + VERIFY( L"costa ricans" >= str_0 ); + VERIFY( L"costa rica" >= str_0 ); + VERIFY( str_0 >= L"costa rica" ); + + VERIFY( !(str_0 <= L"costa marbella") );//false cuz r>m + VERIFY( !(str_0 <= L"cost") ); + VERIFY( str_0 <= L"costa ricans" ); + VERIFY( L"costa marbella" <= str_0 );//true cuz m. + +// C++17 27.7, range access [iterator.range] + +#include + +void +test01() +{ + std::string_view s("Hello, World!"); + std::begin(s); + std::end(s); + std::rbegin(s); + std::rend(s); +} + +void +test02() +{ + constexpr std::string_view s("Hello, World!"); + [[maybe_unused]] constexpr auto b = std::begin(s); + [[maybe_unused]] constexpr auto e = std::end(s); + [[maybe_unused]] constexpr auto cb = std::cbegin(s); + [[maybe_unused]] constexpr auto ce = std::cend(s); + [[maybe_unused]] constexpr auto rb = std::rbegin(s); + [[maybe_unused]] constexpr auto re = std::rend(s); + [[maybe_unused]] constexpr auto crb = std::crbegin(s); + [[maybe_unused]] constexpr auto cre = std::crend(s); +} diff --git a/gdb/unittests/basic_string_view/range_access/wchar_t/1.cc b/gdb/unittests/basic_string_view/range_access/wchar_t/1.cc new file mode 100644 index 000000000000..6584d253fea8 --- /dev/null +++ b/gdb/unittests/basic_string_view/range_access/wchar_t/1.cc @@ -0,0 +1,47 @@ +// { dg-do compile } +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// C++17 27.7, range access [iterator.range] + +#include + +void +test01() +{ + std::wstring_view ws(L"Hello, World!"); + std::begin(ws); + std::end(ws); + std::rbegin(ws); + std::rend(ws); +} + +void +test02() +{ + constexpr std::wstring_view ws(L"Hello, World!"); + [[maybe_unused]] constexpr auto b = std::begin(ws); + [[maybe_unused]] constexpr auto e = std::end(ws); + [[maybe_unused]] constexpr auto cb = std::cbegin(ws); + [[maybe_unused]] constexpr auto ce = std::cend(ws); + [[maybe_unused]] constexpr auto rb = std::rbegin(ws); + [[maybe_unused]] constexpr auto re = std::rend(ws); + [[maybe_unused]] constexpr auto crb = std::crbegin(ws); + [[maybe_unused]] constexpr auto cre = std::crend(ws); +} diff --git a/gdb/unittests/basic_string_view/requirements/explicit_instantiation/1.cc b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/1.cc new file mode 100644 index 000000000000..a29d6beb7d2a --- /dev/null +++ b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/1.cc @@ -0,0 +1,26 @@ +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + + +// This file tests explicit instantiation of basic_string + +#include + +// { dg-do compile } +// { dg-options "-std=gnu++17" } + +template class std::basic_string_view>; diff --git a/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char/1.cc b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char/1.cc new file mode 100644 index 000000000000..6f3fca9286d6 --- /dev/null +++ b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char/1.cc @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING3. If not see +// . + +#include + +template class std::basic_string_view; diff --git a/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char16_t/1.cc b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char16_t/1.cc new file mode 100644 index 000000000000..46e8e15130d4 --- /dev/null +++ b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char16_t/1.cc @@ -0,0 +1,24 @@ +// { dg-do compile } +// { dg-options "-std=gnu++17" } +// { dg-require-cstdint "" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING3. If not see +// . + +#include + +template class std::basic_string_view; diff --git a/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char32_t/1.cc b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char32_t/1.cc new file mode 100644 index 000000000000..031fd4c8ecf1 --- /dev/null +++ b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/char32_t/1.cc @@ -0,0 +1,24 @@ +// { dg-do compile } +// { dg-options "-std=gnu++17" } +// { dg-require-cstdint "" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING3. If not see +// . + +#include + +template class std::basic_string_view; diff --git a/gdb/unittests/basic_string_view/requirements/explicit_instantiation/wchar_t/1.cc b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/wchar_t/1.cc new file mode 100644 index 000000000000..8c9ef863a673 --- /dev/null +++ b/gdb/unittests/basic_string_view/requirements/explicit_instantiation/wchar_t/1.cc @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-std=gnu++17" } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING3. If not see +// . + +#include + +template class std::basic_string_view; diff --git a/gdb/unittests/basic_string_view/requirements/typedefs.cc b/gdb/unittests/basic_string_view/requirements/typedefs.cc new file mode 100644 index 000000000000..bdbcfa10ce86 --- /dev/null +++ b/gdb/unittests/basic_string_view/requirements/typedefs.cc @@ -0,0 +1,47 @@ + +// { dg-options "-std=gnu++17" } +// { dg-do compile } + +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +namespace __gnu_test +{ + template + struct traits> : public traits_base + { + typedef std::true_type is_container; + typedef std::true_type is_reversible; + }; +} + +#include + +// Check container for required typedefs. + +__gnu_test::basic_types t1b; +__gnu_test::reversible_types t1r; +typedef typename std::string_view::traits_type traits_type1; + +#ifdef _GLIBCXX_USE_WCHAR_T +__gnu_test::basic_types t2b; +__gnu_test::reversible_types t2r; +typedef typename std::wstring_view::traits_type traits_type2; +#endif diff --git a/gdb/unittests/basic_string_view/typedefs.cc b/gdb/unittests/basic_string_view/typedefs.cc new file mode 100644 index 000000000000..d1269db2b762 --- /dev/null +++ b/gdb/unittests/basic_string_view/typedefs.cc @@ -0,0 +1,36 @@ +// { dg-options "-std=gnu++17" } +// { dg-do compile } + +// Copyright (C) 2014-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include + +template + using check1_t = std::basic_string_view; + +using check2_t = std::string_view; + +#ifdef _GLIBCXX_USE_C99_STDINT_TR1 +using check3_t = std::u16string_view; +using check4_t = std::u32string_view; +#endif + +#ifdef _GLIBCXX_USE_WCHAR_T +using check5_t = std::wstring_view; +#endif + diff --git a/gdb/unittests/basic_string_view/types/1.cc b/gdb/unittests/basic_string_view/types/1.cc new file mode 100644 index 000000000000..3914053311f4 --- /dev/null +++ b/gdb/unittests/basic_string_view/types/1.cc @@ -0,0 +1,43 @@ +// +// Copyright (C) 2013-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . +// + +// { dg-options "-std=gnu++17" } +// { dg-do compile } + +#include + +struct T +{ + typedef std::string_view String_view; + typedef String_view::iterator iterator; + typedef String_view::const_iterator const_iterator; + + char t(iterator f) { return *f; } + char t(const_iterator f) const { return *f; } +}; + +void +f() +{ + std::string_view s; + T t; + T::const_iterator i = s.begin(); + + t.t(i); +}