Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/812651/?format=api
{ "id": 812651, "url": "http://patchwork.ozlabs.org/api/patches/812651/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/20170911214846.GA8159@redhat.com/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170911214846.GA8159@redhat.com>", "list_archive_url": null, "date": "2017-09-11T21:48:46", "name": "PR libstdc++/70483 make std::string_view fully constexpr", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "d262431d8e6b946e9135f1e5ae605801ebc01fbb", "submitter": { "id": 48004, "url": "http://patchwork.ozlabs.org/api/people/48004/?format=api", "name": "Jonathan Wakely", "email": "jwakely@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/20170911214846.GA8159@redhat.com/mbox/", "series": [ { "id": 2588, "url": "http://patchwork.ozlabs.org/api/series/2588/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=2588", "date": "2017-09-11T21:48:46", "name": "PR libstdc++/70483 make std::string_view fully constexpr", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/2588/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/812651/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/812651/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-return-461872-incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "mailing list gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org\n\t(client-ip=209.132.180.131; helo=sourceware.org;\n\tenvelope-from=gcc-patches-return-461872-incoming=patchwork.ozlabs.org@gcc.gnu.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org\n\theader.b=\"FZ/szBG0\"; dkim-atps=neutral", "sourceware.org; auth=none", "ext-mx07.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com", "ext-mx07.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=jwakely@redhat.com" ], "Received": [ "from sourceware.org (server1.sourceware.org [209.132.180.131])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xrhQc6Plcz9s7F\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 12 Sep 2017 07:49:12 +1000 (AEST)", "(qmail 25647 invoked by alias); 11 Sep 2017 21:48:59 -0000", "(qmail 25489 invoked by uid 89); 11 Sep 2017 21:48:57 -0000", "from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by\n\tsourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP;\n\tMon, 11 Sep 2017 21:48:49 +0000", "from smtp.corp.redhat.com\n\t(int-mx01.intmail.prod.int.phx2.redhat.com\n\t[10.5.11.11])\t(using TLSv1.2 with cipher AECDH-AES256-SHA\n\t(256/256 bits))\t(No client certificate requested)\tby\n\tmx1.redhat.com (Postfix) with ESMTPS id C5EE8C0272D3;\n\tMon, 11 Sep 2017 21:48:47 +0000 (UTC)", "from localhost (unknown [10.33.36.109])\tby smtp.corp.redhat.com\n\t(Postfix) with ESMTP id 0F92F60317;\n\tMon, 11 Sep 2017 21:48:46 +0000 (UTC)" ], "DomainKey-Signature": "a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender:date\n\t:from:to:subject:message-id:mime-version:content-type; q=dns; s=\n\tdefault; b=nM9/mQfgVzlwck5l5j4HXLARfa5ISWSVKWgOg5RfUn/wRttWQ5yHD\n\tfiQD3AAVQ/V+lHjrzD25X+ERImAh8Uq/juimXQU7iZwegpFSY0wPffY7QIKOF9LZ\n\tTux3qQ1papDgpMzuX/SUz5DfBijzmP2kr+32weXhnSSnXNRQexC55c=", "DKIM-Signature": "v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender:date\n\t:from:to:subject:message-id:mime-version:content-type; s=\n\tdefault; bh=tsTWzbg772umnwExUI59QQ2Ntow=; b=FZ/szBG0J3wQMhW1qcOj\n\tWbTa6oyKFwtsZ9EGNK96qSCdhcHzNP0sD8Prd8uiIRufU4j0hTKAe3VLLSWkE16E\n\tPXeK6eWqFPfr0xgBqytG9zorDX99UcgaZGPqgyXJL1mVSwm6bU6wK3nlCYOtT7QS\n\tFgDUL+QgJlqDUlaMMBzGMlM=", "Mailing-List": "contact gcc-patches-help@gcc.gnu.org; run by ezmlm", "Precedence": "bulk", "List-Id": "<gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<mailto:gcc-patches-unsubscribe-incoming=patchwork.ozlabs.org@gcc.gnu.org>", "List-Archive": "<http://gcc.gnu.org/ml/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-help@gcc.gnu.org>", "Sender": "gcc-patches-owner@gcc.gnu.org", "X-Virus-Found": "No", "X-Spam-SWARE-Status": "No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0,\n\tGIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD,\n\tSPF_HELO_PASS autolearn=ham version=3.3.2 spammy=rica, lone,\n\tcruz, ux", "X-Spam-User": "qpsmtpd, 2 recipients", "X-HELO": "mx1.redhat.com", "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com C5EE8C0272D3", "Date": "Mon, 11 Sep 2017 22:48:46 +0100", "From": "Jonathan Wakely <jwakely@redhat.com>", "To": "libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org", "Subject": "[PATCH] PR libstdc++/70483 make std::string_view fully constexpr", "Message-ID": "<20170911214846.GA8159@redhat.com>", "MIME-Version": "1.0", "Content-Type": "multipart/mixed; boundary=\"k1lZvvs/B4yU6o8G\"", "Content-Disposition": "inline", "X-Clacks-Overhead": "GNU Terry Pratchett", "User-Agent": "Mutt/1.8.3 (2017-05-23)" }, "content": "This adds 'constexpr' everywhere it's missing from\nstd::basic_string_view.\n\n\tPR libstdc++/70483\n\t* include/bits/string_view.tcc (basic_string_view::find)\n\t(basic_string_view::rfind, basic_string_view::find_first_of)\n\t(basic_string_view::find_last_of, basic_string_view::find_first_not_of)\n\t(basic_string_view::find_last_not_of): Add constexpr specifier.\n\t* include/std/string_view (basic_string_view::operator=)\n\t(basic_string_view::rbegin, basic_string_view::rend)\n\t(basic_string_view::crbegin, basic_string_view::crend)\n\t(basic_string_view::remove_prefix, basic_string_view::remove_suffix)\n\t(basic_string_view::swap, basic_string_view::compare)\n\t(basic_string_view::find, basic_string_view::rfind)\n\t(basic_string_view::find_first_of, basic_string_view::find_last_of)\n\t(basic_string_view::find_first_not_of)\n\t(basic_string_view::find_last_not_of, basic_string_view::_M_check)\n\t(basic_string_view::_M_limit, operator==, operator!=, operator<)\n\t(operator>, operator<=, operator>=): Likewise.\n\t* testsuite/21_strings/basic_string_view/modifiers/remove_prefix/\n\tchar/1.cc: Repeat tests in constexpr context.\n\t* testsuite/21_strings/basic_string_view/modifiers/remove_prefix/\n\twchar_t/1.cc: Likewise.\n\t* testsuite/21_strings/basic_string_view/modifiers/remove_suffix/\n\tchar/1.cc: Likewise.\n\t* testsuite/21_strings/basic_string_view/modifiers/remove_suffix/\n\twchar_t/1.cc: Likewise.\n\t* testsuite/21_strings/basic_string_view/operations/find/char/1.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/operations/find/char/2.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/operations/find/char/3.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/operations/find/wchar_t/1.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/operations/find/wchar_t/2.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/operations/find/wchar_t/3.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/operators/char/2.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/operators/wchar_t/2.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/range_access/char/1.cc: Test\n\tcbegin, cend, rbegin, rend, crbegin and crend.\n\t* testsuite/21_strings/basic_string_view/range_access/wchar_t/1.cc:\n\tLikewise.\n\t* testsuite/21_strings/basic_string_view/operations/compare/char/1.cc:\n\tRemove trailing whitespace.\n\t* testsuite/21_strings/basic_string_view/operations/compare/wchar_t/\n\t1.cc: Likewise.\n\t* testsuite/21_strings/basic_string_view/modifiers/swap/char/1.cc:\n\tNew.\n\t* testsuite/21_strings/basic_string_view/modifiers/swap/wchar_t/1.cc:\n\tNew.\n\t* testsuite/21_strings/basic_string_view/operations/compare/char/2.cc:\n\tNew.\n\t* testsuite/21_strings/basic_string_view/operations/compare/wchar_t/\n\t2.cc: New.\n\nTested powerpc64le-linux, committed to trunk.\ncommit 280c8e2870fc50a27a174a1b0fdb9d2a4d0a8d28\nAuthor: Jonathan Wakely <jwakely@redhat.com>\nDate: Mon Sep 11 22:03:23 2017 +0100\n\n PR libstdc++/70483 make std::string_view fully constexpr\n \n PR libstdc++/70483\n * include/bits/string_view.tcc (basic_string_view::find)\n (basic_string_view::rfind, basic_string_view::find_first_of)\n (basic_string_view::find_last_of, basic_string_view::find_first_not_of)\n (basic_string_view::find_last_not_of): Add constexpr specifier.\n * include/std/string_view (basic_string_view::operator=)\n (basic_string_view::rbegin, basic_string_view::rend)\n (basic_string_view::crbegin, basic_string_view::crend)\n (basic_string_view::remove_prefix, basic_string_view::remove_suffix)\n (basic_string_view::swap, basic_string_view::compare)\n (basic_string_view::find, basic_string_view::rfind)\n (basic_string_view::find_first_of, basic_string_view::find_last_of)\n (basic_string_view::find_first_not_of)\n (basic_string_view::find_last_not_of, basic_string_view::_M_check)\n (basic_string_view::_M_limit, operator==, operator!=, operator<)\n (operator>, operator<=, operator>=): Likewise.\n * testsuite/21_strings/basic_string_view/modifiers/remove_prefix/\n char/1.cc: Repeat tests in constexpr context.\n * testsuite/21_strings/basic_string_view/modifiers/remove_prefix/\n wchar_t/1.cc: Likewise.\n * testsuite/21_strings/basic_string_view/modifiers/remove_suffix/\n char/1.cc: Likewise.\n * testsuite/21_strings/basic_string_view/modifiers/remove_suffix/\n wchar_t/1.cc: Likewise.\n * testsuite/21_strings/basic_string_view/operations/find/char/1.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/operations/find/char/2.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/operations/find/char/3.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/operations/find/wchar_t/1.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/operations/find/wchar_t/2.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/operations/find/wchar_t/3.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/operators/char/2.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/operators/wchar_t/2.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/range_access/char/1.cc: Test\n cbegin, cend, rbegin, rend, crbegin and crend.\n * testsuite/21_strings/basic_string_view/range_access/wchar_t/1.cc:\n Likewise.\n * testsuite/21_strings/basic_string_view/operations/compare/char/1.cc:\n Remove trailing whitespace.\n * testsuite/21_strings/basic_string_view/operations/compare/wchar_t/\n 1.cc: Likewise.\n * testsuite/21_strings/basic_string_view/modifiers/swap/char/1.cc:\n New.\n * testsuite/21_strings/basic_string_view/modifiers/swap/wchar_t/1.cc:\n New.\n * testsuite/21_strings/basic_string_view/operations/compare/char/2.cc:\n New.\n * testsuite/21_strings/basic_string_view/operations/compare/wchar_t/\n 2.cc: New.", "diff": "diff --git a/libstdc++-v3/include/bits/string_view.tcc b/libstdc++-v3/include/bits/string_view.tcc\nindex f4bd50fd4a0..b8ab78cedf1 100644\n--- a/libstdc++-v3/include/bits/string_view.tcc\n+++ b/libstdc++-v3/include/bits/string_view.tcc\n@@ -45,7 +45,7 @@ namespace std _GLIBCXX_VISIBILITY(default)\n _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n find(const _CharT* __str, size_type __pos, size_type __n) const noexcept\n {\n@@ -66,7 +66,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n find(_CharT __c, size_type __pos) const noexcept\n {\n@@ -82,7 +82,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept\n {\n@@ -102,7 +102,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n rfind(_CharT __c, size_type __pos) const noexcept\n {\n@@ -119,7 +119,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n find_first_of(const _CharT* __str, size_type __pos, size_type __n) const\n {\n@@ -135,7 +135,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n find_last_of(const _CharT* __str, size_type __pos, size_type __n) const\n {\n@@ -156,7 +156,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n find_first_not_of(const _CharT* __str, size_type __pos, size_type __n) const\n {\n@@ -168,7 +168,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n find_first_not_of(_CharT __c, size_type __pos) const noexcept\n {\n@@ -179,7 +179,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n find_last_not_of(const _CharT* __str, size_type __pos, size_type __n) const\n {\n@@ -200,7 +200,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- typename basic_string_view<_CharT, _Traits>::size_type\n+ constexpr typename basic_string_view<_CharT, _Traits>::size_type\n basic_string_view<_CharT, _Traits>::\n find_last_not_of(_CharT __c, size_type __pos) const noexcept\n {\ndiff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view\nindex 88a7686618c..d766b75f9a7 100644\n--- a/libstdc++-v3/include/std/string_view\n+++ b/libstdc++-v3/include/std/string_view\n@@ -106,7 +106,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n _M_str{__str}\n { }\n \n- basic_string_view&\n+ constexpr basic_string_view&\n operator=(const basic_string_view&) noexcept = default;\n \n // [string.view.iterators], iterators\n@@ -127,19 +127,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n cend() const noexcept\n { return this->_M_str + this->_M_len; }\n \n- const_reverse_iterator\n+ constexpr const_reverse_iterator\n rbegin() const noexcept\n { return const_reverse_iterator(this->end()); }\n \n- const_reverse_iterator\n+ constexpr const_reverse_iterator\n rend() const noexcept\n { return const_reverse_iterator(this->begin()); }\n \n- const_reverse_iterator\n+ constexpr const_reverse_iterator\n crbegin() const noexcept\n { return const_reverse_iterator(this->end()); }\n \n- const_reverse_iterator\n+ constexpr const_reverse_iterator\n crend() const noexcept\n { return const_reverse_iterator(this->begin()); }\n \n@@ -208,7 +208,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \n // [string.view.modifiers], modifiers:\n \n- void\n+ constexpr void\n remove_prefix(size_type __n)\n {\n \t__glibcxx_assert(this->_M_len >= __n);\n@@ -216,15 +216,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \tthis->_M_len -= __n;\n }\n \n- void\n+ constexpr void\n remove_suffix(size_type __n)\n { this->_M_len -= __n; }\n \n- void\n+ constexpr void\n swap(basic_string_view& __sv) noexcept\n {\n-\tstd::swap(this->_M_len, __sv._M_len);\n-\tstd::swap(this->_M_str, __sv._M_str);\n+\tauto __tmp = *this;\n+\t*this = __sv;\n+\t__sv = __tmp;\n }\n \n \n@@ -261,7 +262,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t\t\t\t __pos, this->size()), basic_string_view{});\n }\n \n- int\n+ constexpr int\n compare(basic_string_view __str) const noexcept\n {\n \tint __ret = traits_type::compare(this->_M_str, __str._M_str,\n@@ -271,24 +272,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \treturn __ret;\n }\n \n- int\n+ constexpr int\n compare(size_type __pos1, size_type __n1, basic_string_view __str) const\n { return this->substr(__pos1, __n1).compare(__str); }\n \n- int\n+ constexpr int\n compare(size_type __pos1, size_type __n1,\n \t basic_string_view __str, size_type __pos2, size_type __n2) const\n { return this->substr(__pos1, __n1).compare(__str.substr(__pos2, __n2)); }\n \n- int\n+ constexpr int\n compare(const _CharT* __str) const noexcept\n { return this->compare(basic_string_view{__str}); }\n \n- int\n+ constexpr int\n compare(size_type __pos1, size_type __n1, const _CharT* __str) const\n { return this->substr(__pos1, __n1).compare(basic_string_view{__str}); }\n \n- int\n+ constexpr int\n compare(size_type __pos1, size_type __n1,\n \t const _CharT* __str, size_type __n2) const\n {\n@@ -296,97 +297,97 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t\t .compare(basic_string_view(__str, __n2));\n }\n \n- size_type\n+ constexpr size_type\n find(basic_string_view __str, size_type __pos = 0) const noexcept\n { return this->find(__str._M_str, __pos, __str._M_len); }\n \n- size_type\n+ constexpr size_type\n find(_CharT __c, size_type __pos=0) const noexcept;\n \n- size_type\n+ constexpr size_type\n find(const _CharT* __str, size_type __pos, size_type __n) const noexcept;\n \n- size_type\n+ constexpr size_type\n find(const _CharT* __str, size_type __pos=0) const noexcept\n { return this->find(__str, __pos, traits_type::length(__str)); }\n \n- size_type\n+ constexpr size_type\n rfind(basic_string_view __str, size_type __pos = npos) const noexcept\n { return this->rfind(__str._M_str, __pos, __str._M_len); }\n \n- size_type\n+ constexpr size_type\n rfind(_CharT __c, size_type __pos = npos) const noexcept;\n \n- size_type\n+ constexpr size_type\n rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept;\n \n- size_type\n+ constexpr size_type\n rfind(const _CharT* __str, size_type __pos = npos) const noexcept\n { return this->rfind(__str, __pos, traits_type::length(__str)); }\n \n- size_type\n+ constexpr size_type\n find_first_of(basic_string_view __str, size_type __pos = 0) const noexcept\n { return this->find_first_of(__str._M_str, __pos, __str._M_len); }\n \n- size_type\n+ constexpr size_type\n find_first_of(_CharT __c, size_type __pos = 0) const noexcept\n { return this->find(__c, __pos); }\n \n- size_type\n+ constexpr size_type\n find_first_of(const _CharT* __str, size_type __pos, size_type __n) const;\n \n- size_type\n+ constexpr size_type\n find_first_of(const _CharT* __str, size_type __pos = 0) const noexcept\n { return this->find_first_of(__str, __pos, traits_type::length(__str)); }\n \n- size_type\n+ constexpr size_type\n find_last_of(basic_string_view __str,\n \t\t size_type __pos = npos) const noexcept\n { return this->find_last_of(__str._M_str, __pos, __str._M_len); }\n \n- size_type\n+ constexpr size_type\n find_last_of(_CharT __c, size_type __pos=npos) const noexcept\n { return this->rfind(__c, __pos); }\n \n- size_type\n+ constexpr size_type\n find_last_of(const _CharT* __str, size_type __pos, size_type __n) const;\n \n- size_type\n+ constexpr size_type\n find_last_of(const _CharT* __str, size_type __pos = npos) const noexcept\n { return this->find_last_of(__str, __pos, traits_type::length(__str)); }\n \n- size_type\n+ constexpr size_type\n find_first_not_of(basic_string_view __str,\n \t\t\tsize_type __pos = 0) const noexcept\n { return this->find_first_not_of(__str._M_str, __pos, __str._M_len); }\n \n- size_type\n+ constexpr size_type\n find_first_not_of(_CharT __c, size_type __pos = 0) const noexcept;\n \n- size_type\n+ constexpr size_type\n find_first_not_of(const _CharT* __str,\n \t\t\tsize_type __pos, size_type __n) const;\n \n- size_type\n+ constexpr size_type\n find_first_not_of(const _CharT* __str, size_type __pos = 0) const noexcept\n {\n \treturn this->find_first_not_of(__str, __pos,\n \t\t\t\t traits_type::length(__str));\n }\n \n- size_type\n+ constexpr size_type\n find_last_not_of(basic_string_view __str,\n \t\t size_type __pos = npos) const noexcept\n { return this->find_last_not_of(__str._M_str, __pos, __str._M_len); }\n \n- size_type\n+ constexpr size_type\n find_last_not_of(_CharT __c, size_type __pos = npos) const noexcept;\n \n- size_type\n+ constexpr size_type\n find_last_not_of(const _CharT* __str,\n \t\t size_type __pos, size_type __n) const;\n \n- size_type\n+ constexpr size_type\n find_last_not_of(const _CharT* __str,\n \t\t size_type __pos = npos) const noexcept\n {\n@@ -394,7 +395,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t\t\t\t traits_type::length(__str));\n }\n \n- size_type\n+ constexpr size_type\n _M_check(size_type __pos, const char* __s) const\n {\n \tif (__pos > this->size())\n@@ -405,7 +406,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n // NB: _M_limit doesn't check for a bad __pos value.\n- size_type\n+ constexpr size_type\n _M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT\n {\n \tconst bool __testoff = __off < this->size() - __pos;\n@@ -440,109 +441,109 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator==(basic_string_view<_CharT, _Traits> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.size() == __y.size() && __x.compare(__y) == 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator==(basic_string_view<_CharT, _Traits> __x,\n __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept\n { return __x.size() == __y.size() && __x.compare(__y) == 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator==(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.size() == __y.size() && __x.compare(__y) == 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator!=(basic_string_view<_CharT, _Traits> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return !(__x == __y); }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator!=(basic_string_view<_CharT, _Traits> __x,\n __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept\n { return !(__x == __y); }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator!=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return !(__x == __y); }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator< (basic_string_view<_CharT, _Traits> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.compare(__y) < 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator< (basic_string_view<_CharT, _Traits> __x,\n __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept\n { return __x.compare(__y) < 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator< (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.compare(__y) < 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator> (basic_string_view<_CharT, _Traits> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.compare(__y) > 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator> (basic_string_view<_CharT, _Traits> __x,\n __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept\n { return __x.compare(__y) > 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator> (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.compare(__y) > 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator<=(basic_string_view<_CharT, _Traits> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.compare(__y) <= 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator<=(basic_string_view<_CharT, _Traits> __x,\n __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept\n { return __x.compare(__y) <= 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator<=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.compare(__y) <= 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator>=(basic_string_view<_CharT, _Traits> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.compare(__y) >= 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator>=(basic_string_view<_CharT, _Traits> __x,\n __detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept\n { return __x.compare(__y) >= 0; }\n \n template<typename _CharT, typename _Traits>\n- inline bool\n+ constexpr bool\n operator>=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,\n basic_string_view<_CharT, _Traits> __y) noexcept\n { return __x.compare(__y) >= 0; }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_prefix/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_prefix/char/1.cc\nindex da5558da91f..2ce3824d260 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_prefix/char/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_prefix/char/1.cc\n@@ -33,10 +33,29 @@ test01()\n VERIFY( str0 == string_view{\"pus mons\"} );\n }\n \n+constexpr bool\n+test02()\n+{\n+ using std::string_view;\n+\n+ string_view str0{\"olympus mons\"};\n+ string_view::pointer p = str0.data();\n+ str0.remove_prefix(4);\n+ if ( str0.data() != p + 4)\n+ return false;\n+ if ( str0.length() != 8 )\n+ return false;\n+ if ( str0 != string_view{\"pus mons\"} )\n+ return false;\n+\n+ return true;\n+}\n+\n int\n main()\n { \n test01();\n+ static_assert( test02() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc\nindex db38ab3c616..5c74837dde5 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc\n@@ -33,10 +33,29 @@ test01()\n VERIFY( str0 == wstring_view{L\"pus mons\"} );\n }\n \n+constexpr bool\n+test02()\n+{\n+ using std::wstring_view;\n+\n+ wstring_view str0{L\"olympus mons\"};\n+ wstring_view::pointer p = str0.data();\n+ str0.remove_prefix(4);\n+ if ( str0.data() != p + 4)\n+ return false;\n+ if ( str0.length() != 8 )\n+ return false;\n+ if ( str0 != wstring_view{L\"pus mons\"} )\n+ return false;\n+\n+ return true;\n+}\n+\n int\n main()\n { \n test01();\n+ static_assert( test02() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_suffix/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_suffix/char/1.cc\nindex 042f9bbce6b..4014fc590e2 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_suffix/char/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_suffix/char/1.cc\n@@ -33,10 +33,29 @@ test01()\n VERIFY( str0 == string_view{\"olympus mo\"} );\n }\n \n+constexpr bool\n+test02()\n+{\n+ using std::string_view;\n+\n+ string_view str0{\"olympus mons\"};\n+ string_view::pointer p = str0.data();\n+ str0.remove_suffix(2);\n+ if ( str0.data() != p)\n+ return false;\n+ if ( str0.length() != 10 )\n+ return false;\n+ if ( str0 != string_view{\"olympus mo\"} )\n+ return false;\n+\n+ return true;\n+}\n+\n int\n main()\n { \n test01();\n+ static_assert( test02() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc\nindex 05c90d8c32a..f0423bc01aa 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc\n@@ -33,10 +33,29 @@ test01()\n VERIFY( str0 == wstring_view{L\"olympus mo\"} );\n }\n \n+constexpr bool\n+test02()\n+{\n+ using std::wstring_view;\n+\n+ wstring_view str0{L\"olympus mons\"};\n+ wstring_view::pointer p = str0.data();\n+ str0.remove_suffix(2);\n+ if ( str0.data() != p)\n+ return false;\n+ if ( str0.length() != 10 )\n+ return false;\n+ if ( str0 != wstring_view{L\"olympus mo\"} )\n+ return false;\n+\n+ return true;\n+}\n+\n int\n main()\n { \n test01();\n+ static_assert( test02() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/swap/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/swap/char/1.cc\nnew file mode 100644\nindex 00000000000..0cb4c79861b\n--- /dev/null\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/swap/char/1.cc\n@@ -0,0 +1,35 @@\n+// Copyright (C) 2017 Free Software Foundation, Inc.\n+//\n+// This file is part of the GNU ISO C++ Library. This library is free\n+// software; you can redistribute it and/or modify it under the\n+// terms of the GNU General Public License as published by the\n+// Free Software Foundation; either version 3, or (at your option)\n+// any later version.\n+\n+// This library is distributed in the hope that it will be useful,\n+// but WITHOUT ANY WARRANTY; without even the implied warranty of\n+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+// GNU General Public License for more details.\n+\n+// You should have received a copy of the GNU General Public License along\n+// with this library; see the file COPYING3. If not see\n+// <http://www.gnu.org/licenses/>.\n+\n+// { dg-options \"-std=gnu++17\" }\n+// { dg-do compile { target c++1z } }\n+\n+#include <string_view>\n+\n+constexpr bool\n+test01()\n+{\n+ using std::string_view;\n+\n+ string_view s1{\"last\"};\n+ string_view s2{\"first\"};\n+\n+ s1.swap(s2);\n+ return s1 == \"first\" && s2 == \"last\";\n+}\n+\n+static_assert( test01() );\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/swap/wchar_t/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/swap/wchar_t/1.cc\nnew file mode 100644\nindex 00000000000..d8322a8b274\n--- /dev/null\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/modifiers/swap/wchar_t/1.cc\n@@ -0,0 +1,35 @@\n+// Copyright (C) 2017 Free Software Foundation, Inc.\n+//\n+// This file is part of the GNU ISO C++ Library. This library is free\n+// software; you can redistribute it and/or modify it under the\n+// terms of the GNU General Public License as published by the\n+// Free Software Foundation; either version 3, or (at your option)\n+// any later version.\n+\n+// This library is distributed in the hope that it will be useful,\n+// but WITHOUT ANY WARRANTY; without even the implied warranty of\n+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+// GNU General Public License for more details.\n+\n+// You should have received a copy of the GNU General Public License along\n+// with this library; see the file COPYING3. If not see\n+// <http://www.gnu.org/licenses/>.\n+\n+// { dg-options \"-std=gnu++17\" }\n+// { dg-do compile { target c++1z } }\n+\n+#include <string_view>\n+\n+constexpr bool\n+test01()\n+{\n+ using std::wstring_view;\n+\n+ wstring_view s1{L\"last\"};\n+ wstring_view s2{L\"first\"};\n+\n+ s1.swap(s2);\n+ return s1 == L\"first\" && s2 == L\"last\";\n+}\n+\n+static_assert( test01() );\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/1.cc\nindex e4e41f70a47..26e51b88a4e 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/1.cc\n@@ -62,9 +62,8 @@ test_value(int result, want_value expected)\n VERIFY(pass);\n return 0;\n }\n- \n \n-int \n+int\n test01()\n {\n using std::string_view;\n@@ -74,7 +73,7 @@ test01()\n string_view \tstr_2;\n \n //sanity check\n- test_value(strcmp(\"costa marbella\", \"costa rica\"), lt); \n+ test_value(strcmp(\"costa marbella\", \"costa rica\"), lt);\n test_value(strcmp(\"costa rica\", \"costa rica\"), z);\n test_value(strcmp(str_1.data(), str_0.data()), lt);\n test_value(strcmp(str_0.data(), str_1.data()), gt);\n@@ -100,8 +99,8 @@ test01()\n test_value(str_1.compare(0, 4, str_2), z);\n test_value(str_1.compare(0, 5, str_2), gt);\n \n- // int compare(size_type pos1, size_type n1, const basic_string_view& str, \n- //\t\t size_type pos2, size_type n2) const;\t\n+ // int compare(size_type pos1, size_type n1, const basic_string_view& str,\n+ //\t\t size_type pos2, size_type n2) const;\n test_value(str_1.compare(0, 6, str_0, 0, 6), z);\n test_value(str_1.compare(0, 7, str_0, 0, 7), lt);\n test_value(str_0.compare(0, 7, str_1, 0, 7), gt);\n@@ -111,21 +110,21 @@ test01()\n test_value(str_1.compare(\"costa rica\"), lt);\n str_2 = str_0;\n test_value(str_2.compare(\"costa rica\"), z);\n- test_value(str_2.compare(\"cost\"), gt);\t\t\t\n- test_value(str_2.compare(\"costa ricans\"), lt);\t \n+ test_value(str_2.compare(\"cost\"), gt);\n+ test_value(str_2.compare(\"costa ricans\"), lt);\n \n // int compare(size_type pos, size_type n1, const charT* str,\n // size_type n2 = npos) const;\n- test_value(str_1.compare(0, 6, \"costa rica\", 0, 6), z); \n- test_value(str_1.compare(0, 7, \"costa rica\", 0, 7), lt); \n- test_value(str_0.compare(0, 7, \"costa marbella\", 0, 7), gt); \n+ test_value(str_1.compare(0, 6, \"costa rica\", 0, 6), z);\n+ test_value(str_1.compare(0, 7, \"costa rica\", 0, 7), lt);\n+ test_value(str_0.compare(0, 7, \"costa marbella\", 0, 7), gt);\n \n return 0;\n }\n \n \n-int \n-main() \n+int\n+main()\n {\n test01();\n \ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/2.cc\nnew file mode 100644\nindex 00000000000..8118b97468b\n--- /dev/null\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/2.cc\n@@ -0,0 +1,30 @@\n+// Copyright (C) 2017 Free Software Foundation, Inc.\n+//\n+// This file is part of the GNU ISO C++ Library. This library is free\n+// software; you can redistribute it and/or modify it under the\n+// terms of the GNU General Public License as published by the\n+// Free Software Foundation; either version 3, or (at your option)\n+// any later version.\n+\n+// This library is distributed in the hope that it will be useful,\n+// but WITHOUT ANY WARRANTY; without even the implied warranty of\n+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+// GNU General Public License for more details.\n+\n+// You should have received a copy of the GNU General Public License along\n+// with this library; see the file COPYING3. If not see\n+// <http://www.gnu.org/licenses/>.\n+\n+// { dg-options \"-std=gnu++17\" }\n+// { dg-do compile { target c++1z } }\n+\n+#include <string_view>\n+\n+constexpr char c1[] = \"one\";\n+constexpr char c2[] = \"two\";\n+\n+constexpr std::string_view s1{c1};\n+constexpr std::string_view s2{c2};\n+\n+constexpr int n1 = s1.compare(s1);\n+constexpr int n2 = s1.compare(s2);\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/70483.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/70483.cc\nnew file mode 100644\nindex 00000000000..27b6def1b05\n--- /dev/null\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/char/70483.cc\n@@ -0,0 +1,89 @@\n+// Copyright (C) 2017 Free Software Foundation, Inc.\n+//\n+// This file is part of the GNU ISO C++ Library. This library is free\n+// software; you can redistribute it and/or modify it under the\n+// terms of the GNU General Public License as published by the\n+// Free Software Foundation; either version 3, or (at your option)\n+// any later version.\n+\n+// This library is distributed in the hope that it will be useful,\n+// but WITHOUT ANY WARRANTY; without even the implied warranty of\n+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+// GNU General Public License for more details.\n+\n+// You should have received a copy of the GNU General Public License along\n+// with this library; see the file COPYING3. If not see\n+// <http://www.gnu.org/licenses/>.\n+\n+// { dg-options \"-std=gnu++17\" }\n+// { dg-do compile { target c++1z } }\n+\n+#include <string_view>\n+\n+struct constexpr_char_traits : std::char_traits<char>\n+{\n+ static constexpr size_t\n+ length(const char* val)\n+ {\n+ size_t res = 0;\n+ for (; val[res] != '\\0'; ++res)\n+ ;\n+ return res;\n+ }\n+\n+ static constexpr int\n+ compare(const char* lhs, const char* rhs, std::size_t count)\n+ {\n+ for (size_t pos = 0; pos < count; ++pos)\n+ {\n+ if (lhs[pos] != rhs[pos])\n+ return lhs[pos] - rhs[pos];\n+ }\n+ return 0;\n+ }\n+};\n+\n+using string_view = std::basic_string_view<char, constexpr_char_traits>;\n+\n+constexpr\n+string_view get()\n+{\n+ string_view res = \"x::\";\n+ string_view start_pattern = \"x\";\n+ res = res.substr(res.find(start_pattern) + start_pattern.size());\n+ res = res.substr(0, res.find_first_of(\";]\"));\n+ res = res.substr(res.rfind(\"::\"));\n+ return res;\n+}\n+\n+static_assert( get() == get() );\n+\n+using std::u16string_view;\n+\n+constexpr\n+u16string_view get16()\n+{\n+ u16string_view res = u\"x::\";\n+ u16string_view start_pattern = u\"x\";\n+ res = res.substr(res.find(start_pattern) + start_pattern.size());\n+ res = res.substr(0, res.find_first_of(u\";]\"));\n+ res = res.substr(res.rfind(u\"::\"));\n+ return res;\n+}\n+\n+static_assert( get16() == get16() );\n+\n+using std::u32string_view;\n+\n+constexpr\n+u32string_view get32()\n+{\n+ u32string_view res = U\"x::\";\n+ u32string_view start_pattern = U\"x\";\n+ res = res.substr(res.find(start_pattern) + start_pattern.size());\n+ res = res.substr(0, res.find_first_of(U\";]\"));\n+ res = res.substr(res.rfind(U\"::\"));\n+ return res;\n+}\n+\n+static_assert( get32() == get32() );\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/wchar_t/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/wchar_t/1.cc\nindex 47b36c6cb01..60f5bcf0e36 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/wchar_t/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/wchar_t/1.cc\n@@ -62,9 +62,9 @@ test_value(int result, want_value expected)\n VERIFY(pass);\n return 0;\n }\n- \n \n-int \n+\n+int\n test01()\n {\n using std::wstring_view;\n@@ -74,7 +74,7 @@ test01()\n wstring_view \tstr_2;\n \n //sanity check\n- test_value(wcscmp(L\"costa marbella\", L\"costa rica\"), lt); \n+ test_value(wcscmp(L\"costa marbella\", L\"costa rica\"), lt);\n test_value(wcscmp(L\"costa rica\", L\"costa rica\"), z);\n test_value(wcscmp(str_1.data(), str_0.data()), lt);\n test_value(wcscmp(str_0.data(), str_1.data()), gt);\n@@ -100,8 +100,8 @@ test01()\n test_value(str_1.compare(0, 4, str_2), z);\n test_value(str_1.compare(0, 5, str_2), gt);\n \n- // int compare(size_type pos1, size_type n1, const basic_string_view& str, \n- //\t\t size_type pos2, size_type n2) const;\t\n+ // int compare(size_type pos1, size_type n1, const basic_string_view& str,\n+ //\t\t size_type pos2, size_type n2) const;\n test_value(str_1.compare(0, 6, str_0, 0, 6), z);\n test_value(str_1.compare(0, 7, str_0, 0, 7), lt);\n test_value(str_0.compare(0, 7, str_1, 0, 7), gt);\n@@ -111,21 +111,21 @@ test01()\n test_value(str_1.compare(L\"costa rica\"), lt);\n str_2 = str_0;\n test_value(str_2.compare(L\"costa rica\"), z);\n- test_value(str_2.compare(L\"cost\"), gt);\t\t\t\n- test_value(str_2.compare(L\"costa ricans\"), lt);\t \n+ test_value(str_2.compare(L\"cost\"), gt);\n+ test_value(str_2.compare(L\"costa ricans\"), lt);\n \n // int compare(size_type pos, size_type n1, const charT* str,\n // size_type n2 = npos) const;\n- test_value(str_1.compare(0, 6, L\"costa rica\", 0, 6), z); \n- test_value(str_1.compare(0, 7, L\"costa rica\", 0, 7), lt); \n- test_value(str_0.compare(0, 7, L\"costa marbella\", 0, 7), gt); \n+ test_value(str_1.compare(0, 6, L\"costa rica\", 0, 6), z);\n+ test_value(str_1.compare(0, 7, L\"costa rica\", 0, 7), lt);\n+ test_value(str_0.compare(0, 7, L\"costa marbella\", 0, 7), gt);\n \n return 0;\n }\n \n \n-int \n-main() \n+int\n+main()\n {\n test01();\n \ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/wchar_t/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/wchar_t/2.cc\nnew file mode 100644\nindex 00000000000..0049ae3ca0c\n--- /dev/null\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/compare/wchar_t/2.cc\n@@ -0,0 +1,30 @@\n+// Copyright (C) 2017 Free Software Foundation, Inc.\n+//\n+// This file is part of the GNU ISO C++ Library. This library is free\n+// software; you can redistribute it and/or modify it under the\n+// terms of the GNU General Public License as published by the\n+// Free Software Foundation; either version 3, or (at your option)\n+// any later version.\n+\n+// This library is distributed in the hope that it will be useful,\n+// but WITHOUT ANY WARRANTY; without even the implied warranty of\n+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+// GNU General Public License for more details.\n+\n+// You should have received a copy of the GNU General Public License along\n+// with this library; see the file COPYING3. If not see\n+// <http://www.gnu.org/licenses/>.\n+\n+// { dg-options \"-std=gnu++17\" }\n+// { dg-do compile { target c++1z } }\n+\n+#include <string_view>\n+\n+constexpr wchar_t c1[] = L\"one\";\n+constexpr wchar_t c2[] = L\"two\";\n+\n+constexpr std::wstring_view s1{c1};\n+constexpr std::wstring_view s2{c2};\n+\n+constexpr int n1 = s1.compare(s1);\n+constexpr int n2 = s1.compare(s2);\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/1.cc\nindex cc56ddba91e..d00bcdf1459 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/1.cc\n@@ -61,10 +61,10 @@ test01()\n csz01 = str01.find(str04, 5);\n VERIFY( csz01 == 5 );\n csz01 = str01.find(str04, str01.size());\n- VERIFY( csz01 == str01.size() ); \n+ VERIFY( csz01 == str01.size() );\n csz01 = str01.find(str04, str01.size()+1);\n- VERIFY( csz01 == npos ); \n- \n+ VERIFY( csz01 == npos );\n+\n // size_type find(const char* s, size_type pos, size_type n) const;\n csz01 = str01.find(str_lit01, 0, 3);\n VERIFY( csz01 == 0 );\n@@ -85,10 +85,80 @@ test01()\n VERIFY( csz01 == npos );\n }\n \n+constexpr bool\n+test02()\n+{\n+ typedef std::string_view::size_type csize_type;\n+ typedef std::string_view::const_reference cref;\n+ typedef std::string_view::reference ref;\n+ csize_type npos = std::string_view::npos;\n+ csize_type csz01 = 0, csz02 = 0;\n+\n+ const char str_lit01[] = \"mave\";\n+ const std::string_view str01(\"mavericks, santa cruz\");\n+ std::string_view str02(str_lit01);\n+ std::string_view str03(\"s, s\");\n+ std::string_view str04;\n+\n+#undef VERIFY\n+#define VERIFY(x) if(!(x)) return false\n+\n+ // size_type find(const string_view&, size_type pos = 0) const;\n+ csz01 = str01.find(str01);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str01, 4);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find(str02, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str02, 3);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find(str03, 0);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find(str03, 3);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find(str03, 12);\n+ VERIFY( csz01 == npos );\n+\n+ // An empty string_view consists of no characters\n+ // therefore it should be found at every point in a string_view,\n+ // except beyond the end\n+ csz01 = str01.find(str04, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str04, 5);\n+ VERIFY( csz01 == 5 );\n+ csz01 = str01.find(str04, str01.size());\n+ VERIFY( csz01 == str01.size() );\n+ csz01 = str01.find(str04, str01.size()+1);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find(const char* s, size_type pos, size_type n) const;\n+ csz01 = str01.find(str_lit01, 0, 3);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str_lit01, 3, 0);\n+ VERIFY( csz01 == 3 );\n+\n+ // size_type find(const char* s, size_type pos = 0) const;\n+ csz01 = str01.find(str_lit01);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str_lit01, 3);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find(char c, size_type pos = 0) const;\n+ csz01 = str01.find('z');\n+ csz02 = str01.size() - 1;\n+ VERIFY( csz01 == csz02 );\n+ csz01 = str01.find('/');\n+ VERIFY( csz01 == npos );\n+\n+ return true;\n+}\n+\n+\n int\n main()\n-{ \n+{\n test01();\n+ static_assert( test02() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/2.cc\nindex 2420cb98073..59fa0766a22 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/2.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/2.cc\n@@ -59,13 +59,13 @@ test02()\n // An empty string_view consists of no characters\n // therefore it should be found at every point in a string_view,\n // except beyond the end\n- // However, str1.find_first_of(str2,pos) finds the first character in \n+ // However, str1.find_first_of(str2,pos) finds the first character in\n // str1 (starting at pos) that exists in str2, which is none for empty str2\n csz01 = str01.find_first_of(str04, 0);\n VERIFY( csz01 == npos );\n csz01 = str01.find_first_of(str04, 5);\n VERIFY( csz01 == npos );\n- \n+\n // size_type find_first_of(const char* s, size_type pos, size_type n) const;\n csz01 = str01.find_first_of(str_lit01, 0, 3);\n VERIFY( csz01 == 0 );\n@@ -84,10 +84,78 @@ test02()\n VERIFY( csz01 == csz02 );\n }\n \n+constexpr bool\n+test03()\n+{\n+ typedef std::string_view::size_type csize_type;\n+ csize_type npos = std::string_view::npos;\n+ csize_type csz01 = 0, csz02 = 0;\n+\n+ const char str_lit01[] = \"mave\";\n+ const std::string_view str01(\"mavericks, santa cruz\");\n+ std::string_view str02(str_lit01);\n+ std::string_view str03(\"s, s\");\n+ std::string_view str04;\n+\n+#undef VERIFY\n+#define VERIFY(x) if(!(x)) return false\n+\n+ // size_type find_first_of(const string_view&, size_type pos = 0) const;\n+ std::string_view str05(\"xena rulez\");\n+ csz01 = str01.find_first_of(str01);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_of(str01, 4);\n+ VERIFY( csz01 == 4 );\n+ csz01 = str01.find_first_of(str02, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_of(str02, 3);\n+ VERIFY( csz01 == 3 );\n+ csz01 = str01.find_first_of(str03, 0);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find_first_of(str03, 3);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find_first_of(str03, 12);\n+ VERIFY( csz01 == 16 );\n+ csz01 = str01.find_first_of(str05, 0);\n+ VERIFY( csz01 == 1 );\n+ csz01 = str01.find_first_of(str05, 4);\n+ VERIFY( csz01 == 4 );\n+\n+ // An empty string_view consists of no characters\n+ // therefore it should be found at every point in a string_view,\n+ // except beyond the end\n+ // However, str1.find_first_of(str2,pos) finds the first character in\n+ // str1 (starting at pos) that exists in str2, which is none for empty str2\n+ csz01 = str01.find_first_of(str04, 0);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find_first_of(str04, 5);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find_first_of(const char* s, size_type pos, size_type n) const;\n+ csz01 = str01.find_first_of(str_lit01, 0, 3);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_of(str_lit01, 3, 0);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find_first_of(const char* s, size_type pos = 0) const;\n+ csz01 = str01.find_first_of(str_lit01);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_of(str_lit01, 3);\n+ VERIFY( csz01 == 3 );\n+\n+ // size_type find_first_of(char c, size_type pos = 0) const;\n+ csz01 = str01.find_first_of('z');\n+ csz02 = str01.size() - 1;\n+ VERIFY( csz01 == csz02 );\n+\n+ return true;\n+}\n+\n int\n main()\n-{ \n+{\n test02();\n+ static_assert( test03() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/3.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/3.cc\nindex 9c9a49123f8..edbe8df1c65 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/3.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/char/3.cc\n@@ -84,10 +84,78 @@ test03()\n VERIFY( csz01 == npos );\n }\n \n+constexpr bool\n+test04()\n+{\n+ typedef std::string_view::size_type csize_type;\n+ csize_type npos = std::string_view::npos;\n+ csize_type csz01 = 0;\n+\n+ const std::string_view str01(\"Bob Rock, per me\");\n+ const char str_lit01[] = \"Bob Rock\";\n+ std::string_view str02(\"ovvero Trivi\");\n+ std::string_view str03(str_lit01);\n+ std::string_view str04;\n+\n+#undef VERIFY\n+#define VERIFY(x) if(!(x)) return false\n+\n+ // size_type find_first_not_of(const string_view&, size_type pos = 0) const;\n+ csz01 = str01.find_first_not_of(str01);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find_first_not_of(str02, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_not_of(str02, 10);\n+ VERIFY( csz01 == 10 );\n+ csz01 = str01.find_first_not_of(str02, 12);\n+ VERIFY( csz01 == 14 );\n+ csz01 = str01.find_first_not_of(str03, 0);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find_first_not_of(str03, 15);\n+ VERIFY( csz01 == 15 );\n+ csz01 = str01.find_first_not_of(str03, 16);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find_first_not_of(str04, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_not_of(str04, 12);\n+ VERIFY( csz01 == 12 );\n+ csz01 = str03.find_first_not_of(str01, 0);\n+ VERIFY( csz01 == npos );\n+ csz01 = str04.find_first_not_of(str02, 0);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find_first_not_of(const char* s, size_type pos, size_type n) const;\n+ csz01 = str01.find_first_not_of(str_lit01, 0, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_not_of(str_lit01, 0, 8);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find_first_not_of(str_lit01, 10, 0);\n+ VERIFY( csz01 == 10 );\n+\n+ // size_type find_first_not_of(const char* s, size_type pos = 0) const;\n+ csz01 = str01.find_first_not_of(str_lit01);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str02.find_first_not_of(str_lit01, 2);\n+ VERIFY( csz01 == 2 );\n+\n+ // size_type find_first_not_of(char c, size_type pos = 0) const;\n+ csz01 = str01.find_first_not_of('B');\n+ VERIFY( csz01 == 1 );\n+ csz01 = str01.find_first_not_of('o', 1);\n+ VERIFY( csz01 == 2 );\n+ csz01 = str02.find_first_not_of('z');\n+ VERIFY( csz01 == 0 );\n+ csz01 = str04.find_first_not_of('S');\n+ VERIFY( csz01 == npos );\n+\n+ return true;\n+}\n+\n int\n main()\n-{ \n+{\n test03();\n+ static_assert( test04() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/1.cc\nindex f0affe23639..401ef6fa9ad 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/1.cc\n@@ -61,10 +61,10 @@ test01()\n csz01 = str01.find(str04, 5);\n VERIFY( csz01 == 5 );\n csz01 = str01.find(str04, str01.size());\n- VERIFY( csz01 == str01.size() ); \n+ VERIFY( csz01 == str01.size() );\n csz01 = str01.find(str04, str01.size()+1);\n- VERIFY( csz01 == npos ); \n- \n+ VERIFY( csz01 == npos );\n+\n // size_type find(const wchar_t* s, size_type pos, size_type n) const;\n csz01 = str01.find(str_lit01, 0, 3);\n VERIFY( csz01 == 0 );\n@@ -85,10 +85,79 @@ test01()\n VERIFY( csz01 == npos );\n }\n \n+constexpr bool\n+test02()\n+{\n+ typedef std::wstring_view::size_type csize_type;\n+ typedef std::wstring_view::const_reference cref;\n+ typedef std::wstring_view::reference ref;\n+ csize_type npos = std::wstring_view::npos;\n+ csize_type csz01 = 0, csz02 = 0;\n+\n+ const wchar_t str_lit01[] = L\"mave\";\n+ const std::wstring_view str01(L\"mavericks, santa cruz\");\n+ std::wstring_view str02(str_lit01);\n+ std::wstring_view str03(L\"s, s\");\n+ std::wstring_view str04;\n+\n+#undef VERIFY\n+#define VERIFY(x) if(!(x)) return false\n+\n+ // size_type find(const wstring_view&, size_type pos = 0) const;\n+ csz01 = str01.find(str01);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str01, 4);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find(str02, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str02, 3);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find(str03, 0);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find(str03, 3);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find(str03, 12);\n+ VERIFY( csz01 == npos );\n+\n+ // An empty string_view consists of no characters\n+ // therefore it should be found at every point in a string_view,\n+ // except beyond the end\n+ csz01 = str01.find(str04, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str04, 5);\n+ VERIFY( csz01 == 5 );\n+ csz01 = str01.find(str04, str01.size());\n+ VERIFY( csz01 == str01.size() );\n+ csz01 = str01.find(str04, str01.size()+1);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find(const wchar_t* s, size_type pos, size_type n) const;\n+ csz01 = str01.find(str_lit01, 0, 3);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str_lit01, 3, 0);\n+ VERIFY( csz01 == 3 );\n+\n+ // size_type find(const wchar_t* s, size_type pos = 0) const;\n+ csz01 = str01.find(str_lit01);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find(str_lit01, 3);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find(wchar_t c, size_type pos = 0) const;\n+ csz01 = str01.find(L'z');\n+ csz02 = str01.size() - 1;\n+ VERIFY( csz01 == csz02 );\n+ csz01 = str01.find(L'/');\n+ VERIFY( csz01 == npos );\n+\n+ return true;\n+}\n+\n int\n main()\n-{ \n+{\n test01();\n+ static_assert( test02() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/2.cc\nindex 13434de844e..a74f72f8767 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/2.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/2.cc\n@@ -59,13 +59,13 @@ test02()\n // An empty string_view consists of no characters\n // therefore it should be found at every point in a string_view,\n // except beyond the end\n- // However, str1.find_first_of(str2,pos) finds the first character in \n+ // However, str1.find_first_of(str2,pos) finds the first character in\n // str1 (starting at pos) that exists in str2, which is none for empty str2\n csz01 = str01.find_first_of(str04, 0);\n VERIFY( csz01 == npos );\n csz01 = str01.find_first_of(str04, 5);\n VERIFY( csz01 == npos );\n- \n+\n // size_type find_first_of(const wchar_t* s, size_type pos, size_type n) const;\n csz01 = str01.find_first_of(str_lit01, 0, 3);\n VERIFY( csz01 == 0 );\n@@ -84,10 +84,78 @@ test02()\n VERIFY( csz01 == csz02 );\n }\n \n+constexpr bool\n+test04()\n+{\n+ typedef std::wstring_view::size_type csize_type;\n+ csize_type npos = std::wstring_view::npos;\n+ csize_type csz01 = 0, csz02 = 0;\n+\n+ const wchar_t str_lit01[] = L\"mave\";\n+ const std::wstring_view str01(L\"mavericks, santa cruz\");\n+ std::wstring_view str02(str_lit01);\n+ std::wstring_view str03(L\"s, s\");\n+ std::wstring_view str04;\n+\n+#undef VERIFY\n+#define VERIFY(x) if(!(x)) return false\n+\n+ // size_type find_first_of(const wstring_view&, size_type pos = 0) const;\n+ std::wstring_view str05(L\"xena rulez\");\n+ csz01 = str01.find_first_of(str01);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_of(str01, 4);\n+ VERIFY( csz01 == 4 );\n+ csz01 = str01.find_first_of(str02, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_of(str02, 3);\n+ VERIFY( csz01 == 3 );\n+ csz01 = str01.find_first_of(str03, 0);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find_first_of(str03, 3);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find_first_of(str03, 12);\n+ VERIFY( csz01 == 16 );\n+ csz01 = str01.find_first_of(str05, 0);\n+ VERIFY( csz01 == 1 );\n+ csz01 = str01.find_first_of(str05, 4);\n+ VERIFY( csz01 == 4 );\n+\n+ // An empty string_view consists of no characters\n+ // therefore it should be found at every point in a string_view,\n+ // except beyond the end\n+ // However, str1.find_first_of(str2,pos) finds the first character in\n+ // str1 (starting at pos) that exists in str2, which is none for empty str2\n+ csz01 = str01.find_first_of(str04, 0);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find_first_of(str04, 5);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find_first_of(const wchar_t* s, size_type pos, size_type n) const;\n+ csz01 = str01.find_first_of(str_lit01, 0, 3);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_of(str_lit01, 3, 0);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find_first_of(const wchar_t* s, size_type pos = 0) const;\n+ csz01 = str01.find_first_of(str_lit01);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_of(str_lit01, 3);\n+ VERIFY( csz01 == 3 );\n+\n+ // size_type find_first_of(wchar_t c, size_type pos = 0) const;\n+ csz01 = str01.find_first_of(L'z');\n+ csz02 = str01.size() - 1;\n+ VERIFY( csz01 == csz02 );\n+\n+ return true;\n+}\n+\n int\n main()\n-{ \n+{\n test02();\n+ static_assert( test04() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/3.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/3.cc\nindex 8c2c81b27f2..901c780b108 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/3.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/find/wchar_t/3.cc\n@@ -84,10 +84,78 @@ test03()\n VERIFY( csz01 == npos );\n }\n \n+constexpr bool\n+test04()\n+{\n+ typedef std::wstring_view::size_type csize_type;\n+ csize_type npos = std::wstring_view::npos;\n+ csize_type csz01 = 0;\n+\n+ const std::wstring_view str01(L\"Bob Rock, per me\");\n+ const wchar_t str_lit01[] = L\"Bob Rock\";\n+ std::wstring_view str02(L\"ovvero Trivi\");\n+ std::wstring_view str03(str_lit01);\n+ std::wstring_view str04;\n+\n+#undef VERIFY\n+#define VERIFY(x) if(!(x)) return false\n+\n+ // size_type find_first_not_of(const string_view&, size_type pos = 0) const;\n+ csz01 = str01.find_first_not_of(str01);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find_first_not_of(str02, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_not_of(str02, 10);\n+ VERIFY( csz01 == 10 );\n+ csz01 = str01.find_first_not_of(str02, 12);\n+ VERIFY( csz01 == 14 );\n+ csz01 = str01.find_first_not_of(str03, 0);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find_first_not_of(str03, 15);\n+ VERIFY( csz01 == 15 );\n+ csz01 = str01.find_first_not_of(str03, 16);\n+ VERIFY( csz01 == npos );\n+ csz01 = str01.find_first_not_of(str04, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_not_of(str04, 12);\n+ VERIFY( csz01 == 12 );\n+ csz01 = str03.find_first_not_of(str01, 0);\n+ VERIFY( csz01 == npos );\n+ csz01 = str04.find_first_not_of(str02, 0);\n+ VERIFY( csz01 == npos );\n+\n+ // size_type find_first_not_of(const char* s, size_type pos, size_type n) const;\n+ csz01 = str01.find_first_not_of(str_lit01, 0, 0);\n+ VERIFY( csz01 == 0 );\n+ csz01 = str01.find_first_not_of(str_lit01, 0, 8);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str01.find_first_not_of(str_lit01, 10, 0);\n+ VERIFY( csz01 == 10 );\n+\n+ // size_type find_first_not_of(const char* s, size_type pos = 0) const;\n+ csz01 = str01.find_first_not_of(str_lit01);\n+ VERIFY( csz01 == 8 );\n+ csz01 = str02.find_first_not_of(str_lit01, 2);\n+ VERIFY( csz01 == 2 );\n+\n+ // size_type find_first_not_of(char c, size_type pos = 0) const;\n+ csz01 = str01.find_first_not_of(L'B');\n+ VERIFY( csz01 == 1 );\n+ csz01 = str01.find_first_not_of(L'o', 1);\n+ VERIFY( csz01 == 2 );\n+ csz01 = str02.find_first_not_of(L'z');\n+ VERIFY( csz01 == 0 );\n+ csz01 = str04.find_first_not_of(L'S');\n+ VERIFY( csz01 == npos );\n+\n+ return true;\n+}\n+\n int\n main()\n-{ \n+{\n test03();\n+ static_assert( test04() );\n \n return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operators/char/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operators/char/2.cc\nindex 89130b8363b..93533b38875 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operators/char/2.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operators/char/2.cc\n@@ -112,7 +112,7 @@ template<class charT, class traits, class Allocator>\n #include <string_view>\n #include <testsuite_hooks.h>\n \n-int\n+void\n test01()\n {\n std::string_view \tstr_0(\"costa rica\");\n@@ -120,7 +120,7 @@ test01()\n std::string_view \tstr_2(\"cost\");\n std::string_view\tstr_3(\"costa ricans\");\n std::string_view str_4;\n- \n+\n str_4 = str_0;\n //comparisons between string objects\n VERIFY( !(str_0 == str_1) );\n@@ -140,7 +140,131 @@ test01()\n VERIFY( str_3 != str_0 );\n VERIFY( !(str_0 != str_4) );\n VERIFY( !(str_4 != str_0) );\n- \n+\n+ VERIFY( str_0 > str_1 ); //true cuz r>m\n+ VERIFY( str_0 > str_2 );\n+ VERIFY( !(str_0 > str_3) );\n+ VERIFY( !(str_1 > str_0) ); //false cuz m<r\n+ VERIFY( !(str_2 > str_0) );\n+ VERIFY( str_3 > str_0 );\n+ VERIFY( !(str_0 > str_4) );\n+ VERIFY( !(str_4 > str_0) );\n+\n+ VERIFY( !(str_0 < str_1) ); //false cuz r>m\n+ VERIFY( !(str_0 < str_2) );\n+ VERIFY( str_0 < str_3 );\n+ VERIFY( str_1 < str_0 ); //true cuz m<r\n+ VERIFY( str_2 < str_0 );\n+ VERIFY( !(str_3 < str_0) );\n+ VERIFY( !(str_0 < str_4) );\n+ VERIFY( !(str_4 < str_0) );\n+\n+ VERIFY( str_0 >= str_1 ); //true cuz r>m\n+ VERIFY( str_0 >= str_2 );\n+ VERIFY( !(str_0 >= str_3) );\n+ VERIFY( !(str_1 >= str_0) );//false cuz m<r\n+ VERIFY( !(str_2 >= str_0) );\n+ VERIFY( str_3 >= str_0 );\n+ VERIFY( str_0 >= str_4 );\n+ VERIFY( str_4 >= str_0 );\n+\n+ VERIFY( !(str_0 <= str_1) );//false cuz r>m\n+ VERIFY( !(str_0 <= str_2) );\n+ VERIFY( str_0 <= str_3 );\n+ VERIFY( str_1 <= str_0 );//true cuz m<r\n+ VERIFY( str_2 <= str_0 );\n+ VERIFY( !(str_3 <= str_0) );\n+ VERIFY( str_0 <= str_4 );\n+ VERIFY( str_4 <= str_0 );\n+\n+ //comparisons between string object and string literal\n+ VERIFY( !(str_0 == \"costa marbella\") );\n+ VERIFY( !(str_0 == \"cost\") );\n+ VERIFY( !(str_0 == \"costa ricans\") );\n+ VERIFY( !(\"costa marbella\" == str_0) );\n+ VERIFY( !(\"cost\" == str_0) );\n+ VERIFY( !(\"costa ricans\" == str_0) );\n+ VERIFY( \"costa rica\" == str_0 );\n+ VERIFY( str_0 == \"costa rica\" );\n+\n+ VERIFY( str_0 != \"costa marbella\" );\n+ VERIFY( str_0 != \"cost\" );\n+ VERIFY( str_0 != \"costa ricans\" );\n+ VERIFY( \"costa marbella\" != str_0 );\n+ VERIFY( \"cost\" != str_0 );\n+ VERIFY( \"costa ricans\" != str_0 );\n+ VERIFY( !(\"costa rica\" != str_0) );\n+ VERIFY( !(str_0 != \"costa rica\") );\n+\n+ VERIFY( str_0 > \"costa marbella\" ); //true cuz r>m\n+ VERIFY( str_0 > \"cost\" );\n+ VERIFY( !(str_0 > \"costa ricans\") );\n+ VERIFY( !(\"costa marbella\" > str_0) );//false cuz m<r\n+ VERIFY( !(\"cost\" > str_0) );\n+ VERIFY( \"costa ricans\" > str_0 );\n+ VERIFY( !(\"costa rica\" > str_0) );\n+ VERIFY( !(str_0 > \"costa rica\") );\n+\n+ VERIFY( !(str_0 < \"costa marbella\") );//false cuz r>m\n+ VERIFY( !(str_0 < \"cost\") );\n+ VERIFY( str_0 < \"costa ricans\" );\n+ VERIFY( \"costa marbella\" < str_0 );//true cuz m<r\n+ VERIFY( \"cost\" < str_0 );\n+ VERIFY( !(\"costa ricans\" < str_0) );\n+ VERIFY( !(\"costa rica\" < str_0) );\n+ VERIFY( !(str_0 < \"costa rica\") );\n+\n+ VERIFY( str_0 >= \"costa marbella\" );//true cuz r>m\n+ VERIFY( str_0 >= \"cost\" );\n+ VERIFY( !(str_0 >= \"costa ricans\") );\n+ VERIFY( !(\"costa marbella\" >= str_0) );//false cuz m<r\n+ VERIFY( !(\"cost\" >= str_0) );\n+ VERIFY( \"costa ricans\" >= str_0 );\n+ VERIFY( \"costa rica\" >= str_0 );\n+ VERIFY( str_0 >= \"costa rica\" );\n+\n+ VERIFY( !(str_0 <= \"costa marbella\") );//false cuz r>m\n+ VERIFY( !(str_0 <= \"cost\") );\n+ VERIFY( str_0 <= \"costa ricans\" );\n+ VERIFY( \"costa marbella\" <= str_0 );//true cuz m<r\n+ VERIFY( \"cost\" <= str_0 );\n+ VERIFY( !(\"costa ricans\" <= str_0) );\n+ VERIFY( \"costa rica\" <= str_0 );\n+ VERIFY( str_0 <= \"costa rica\" );\n+}\n+\n+constexpr bool\n+test02()\n+{\n+ std::string_view \tstr_0(\"costa rica\");\n+ std::string_view \tstr_1(\"costa marbella\");\n+ std::string_view \tstr_2(\"cost\");\n+ std::string_view\tstr_3(\"costa ricans\");\n+ std::string_view str_4;\n+\n+#undef VERIFY\n+#define VERIFY(x) if (!(x)) return false\n+\n+ str_4 = str_0;\n+ //comparisons between string objects\n+ VERIFY( !(str_0 == str_1) );\n+ VERIFY( !(str_0 == str_2) );\n+ VERIFY( !(str_0 == str_3) );\n+ VERIFY( !(str_1 == str_0) );\n+ VERIFY( !(str_2 == str_0) );\n+ VERIFY( !(str_3 == str_0) );\n+ VERIFY( str_4 == str_0 );\n+ VERIFY( str_0 == str_4 );\n+\n+ VERIFY( str_0 != str_1 );\n+ VERIFY( str_0 != str_2 );\n+ VERIFY( str_0 != str_3 );\n+ VERIFY( str_1 != str_0 );\n+ VERIFY( str_2 != str_0 );\n+ VERIFY( str_3 != str_0 );\n+ VERIFY( !(str_0 != str_4) );\n+ VERIFY( !(str_4 != str_0) );\n+\n VERIFY( str_0 > str_1 ); //true cuz r>m\n VERIFY( str_0 > str_2 );\n VERIFY( !(str_0 > str_3) );\n@@ -232,13 +356,12 @@ test01()\n VERIFY( \"costa rica\" <= str_0 );\n VERIFY( str_0 <= \"costa rica\" );\n \n- return 0;\n+ return true;\n }\n \n int\n-main() \n+main()\n {\n test01();\n-\n- return 0;\n+ static_assert( test02() );\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operators/wchar_t/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operators/wchar_t/2.cc\nindex dce819469cd..916dce9c9ad 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/operators/wchar_t/2.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operators/wchar_t/2.cc\n@@ -45,7 +45,7 @@ template<class charT, class traits, class Allocator>\n const basic_string_view<charT,traits,Allocator>& rhs);\n \n template<class charT, class traits, class Allocator>\n- bool operator!=(const basic_string_view<charT,traits,Allocator>& lhs, \n+ bool operator!=(const basic_string_view<charT,traits,Allocator>& lhs,\n const charT* rhs);\n */\n \n@@ -60,7 +60,7 @@ template<class charT, class traits, class Allocator>\n const charT* rhs);\n \n template<class charT, class traits, class Allocator>\n- bool operator< (const charT* lhs, \n+ bool operator< (const charT* lhs,\n const basic_string_view<charT,traits,Allocator>& rhs);\n */\n \n@@ -112,7 +112,7 @@ template<class charT, class traits, class Allocator>\n #include <string_view>\n #include <testsuite_hooks.h>\n \n-int\n+void\n test01()\n {\n std::wstring_view \tstr_0(L\"costa rica\");\n@@ -120,7 +120,7 @@ test01()\n std::wstring_view \tstr_2(L\"cost\");\n std::wstring_view\tstr_3(L\"costa ricans\");\n std::wstring_view str_4;\n- \n+\n str_4 = str_0;\n //comparisons between string_view objects\n VERIFY( !(str_0 == str_1) );\n@@ -140,7 +140,131 @@ test01()\n VERIFY( str_3 != str_0 );\n VERIFY( !(str_0 != str_4) );\n VERIFY( !(str_4 != str_0) );\n- \n+\n+ VERIFY( str_0 > str_1 ); //true cuz r>m\n+ VERIFY( str_0 > str_2 );\n+ VERIFY( !(str_0 > str_3) );\n+ VERIFY( !(str_1 > str_0) ); //false cuz m<r\n+ VERIFY( !(str_2 > str_0) );\n+ VERIFY( str_3 > str_0 );\n+ VERIFY( !(str_0 > str_4) );\n+ VERIFY( !(str_4 > str_0) );\n+\n+ VERIFY( !(str_0 < str_1) ); //false cuz r>m\n+ VERIFY( !(str_0 < str_2) );\n+ VERIFY( str_0 < str_3 );\n+ VERIFY( str_1 < str_0 ); //true cuz m<r\n+ VERIFY( str_2 < str_0 );\n+ VERIFY( !(str_3 < str_0) );\n+ VERIFY( !(str_0 < str_4) );\n+ VERIFY( !(str_4 < str_0) );\n+\n+ VERIFY( str_0 >= str_1 ); //true cuz r>m\n+ VERIFY( str_0 >= str_2 );\n+ VERIFY( !(str_0 >= str_3) );\n+ VERIFY( !(str_1 >= str_0) );//false cuz m<r\n+ VERIFY( !(str_2 >= str_0) );\n+ VERIFY( str_3 >= str_0 );\n+ VERIFY( str_0 >= str_4 );\n+ VERIFY( str_4 >= str_0 );\n+\n+ VERIFY( !(str_0 <= str_1) );//false cuz r>m\n+ VERIFY( !(str_0 <= str_2) );\n+ VERIFY( str_0 <= str_3 );\n+ VERIFY( str_1 <= str_0 );//true cuz m<r\n+ VERIFY( str_2 <= str_0 );\n+ VERIFY( !(str_3 <= str_0) );\n+ VERIFY( str_0 <= str_4 );\n+ VERIFY( str_4 <= str_0 );\n+\n+ //comparisons between string_view object and string_view literal\n+ VERIFY( !(str_0 == L\"costa marbella\") );\n+ VERIFY( !(str_0 == L\"cost\") );\n+ VERIFY( !(str_0 == L\"costa ricans\") );\n+ VERIFY( !(L\"costa marbella\" == str_0) );\n+ VERIFY( !(L\"cost\" == str_0) );\n+ VERIFY( !(L\"costa ricans\" == str_0) );\n+ VERIFY( L\"costa rica\" == str_0 );\n+ VERIFY( str_0 == L\"costa rica\" );\n+\n+ VERIFY( str_0 != L\"costa marbella\" );\n+ VERIFY( str_0 != L\"cost\" );\n+ VERIFY( str_0 != L\"costa ricans\" );\n+ VERIFY( L\"costa marbella\" != str_0 );\n+ VERIFY( L\"cost\" != str_0 );\n+ VERIFY( L\"costa ricans\" != str_0 );\n+ VERIFY( !(L\"costa rica\" != str_0) );\n+ VERIFY( !(str_0 != L\"costa rica\") );\n+\n+ VERIFY( str_0 > L\"costa marbella\" ); //true cuz r>m\n+ VERIFY( str_0 > L\"cost\" );\n+ VERIFY( !(str_0 > L\"costa ricans\") );\n+ VERIFY( !(L\"costa marbella\" > str_0) );//false cuz m<r\n+ VERIFY( !(L\"cost\" > str_0) );\n+ VERIFY( L\"costa ricans\" > str_0 );\n+ VERIFY( !(L\"costa rica\" > str_0) );\n+ VERIFY( !(str_0 > L\"costa rica\") );\n+\n+ VERIFY( !(str_0 < L\"costa marbella\") );//false cuz r>m\n+ VERIFY( !(str_0 < L\"cost\") );\n+ VERIFY( str_0 < L\"costa ricans\" );\n+ VERIFY( L\"costa marbella\" < str_0 );//true cuz m<r\n+ VERIFY( L\"cost\" < str_0 );\n+ VERIFY( !(L\"costa ricans\" < str_0) );\n+ VERIFY( !(L\"costa rica\" < str_0) );\n+ VERIFY( !(str_0 < L\"costa rica\") );\n+\n+ VERIFY( str_0 >= L\"costa marbella\" );//true cuz r>m\n+ VERIFY( str_0 >= L\"cost\" );\n+ VERIFY( !(str_0 >= L\"costa ricans\") );\n+ VERIFY( !(L\"costa marbella\" >= str_0) );//false cuz m<r\n+ VERIFY( !(L\"cost\" >= str_0) );\n+ VERIFY( L\"costa ricans\" >= str_0 );\n+ VERIFY( L\"costa rica\" >= str_0 );\n+ VERIFY( str_0 >= L\"costa rica\" );\n+\n+ VERIFY( !(str_0 <= L\"costa marbella\") );//false cuz r>m\n+ VERIFY( !(str_0 <= L\"cost\") );\n+ VERIFY( str_0 <= L\"costa ricans\" );\n+ VERIFY( L\"costa marbella\" <= str_0 );//true cuz m<r\n+ VERIFY( L\"cost\" <= str_0 );\n+ VERIFY( !(L\"costa ricans\" <= str_0) );\n+ VERIFY( L\"costa rica\" <= str_0 );\n+ VERIFY( str_0 <= L\"costa rica\" );\n+}\n+\n+constexpr bool\n+test02()\n+{\n+ std::wstring_view \tstr_0(L\"costa rica\");\n+ std::wstring_view \tstr_1(L\"costa marbella\");\n+ std::wstring_view \tstr_2(L\"cost\");\n+ std::wstring_view\tstr_3(L\"costa ricans\");\n+ std::wstring_view str_4;\n+\n+#undef VERIFY\n+#define VERIFY(x) if (!(x)) return false\n+\n+ str_4 = str_0;\n+ //comparisons between string_view objects\n+ VERIFY( !(str_0 == str_1) );\n+ VERIFY( !(str_0 == str_2) );\n+ VERIFY( !(str_0 == str_3) );\n+ VERIFY( !(str_1 == str_0) );\n+ VERIFY( !(str_2 == str_0) );\n+ VERIFY( !(str_3 == str_0) );\n+ VERIFY( str_4 == str_0 );\n+ VERIFY( str_0 == str_4 );\n+\n+ VERIFY( str_0 != str_1 );\n+ VERIFY( str_0 != str_2 );\n+ VERIFY( str_0 != str_3 );\n+ VERIFY( str_1 != str_0 );\n+ VERIFY( str_2 != str_0 );\n+ VERIFY( str_3 != str_0 );\n+ VERIFY( !(str_0 != str_4) );\n+ VERIFY( !(str_4 != str_0) );\n+\n VERIFY( str_0 > str_1 ); //true cuz r>m\n VERIFY( str_0 > str_2 );\n VERIFY( !(str_0 > str_3) );\n@@ -232,13 +356,12 @@ test01()\n VERIFY( L\"costa rica\" <= str_0 );\n VERIFY( str_0 <= L\"costa rica\" );\n \n- return 0;\n+ return true;\n }\n \n int\n-main() \n+main()\n {\n test01();\n-\n- return 0;\n+ static_assert( test02() );\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/range_access/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/range_access/char/1.cc\nindex e46d7eda2ba..5b65aa79dec 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/range_access/char/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/range_access/char/1.cc\n@@ -18,7 +18,7 @@\n // with this library; see the file COPYING3. If not see\n // <http://www.gnu.org/licenses/>.\n \n-// 24.6.5, range access [iterator.range]\n+// C++17 27.7, range access [iterator.range]\n \n #include <string_view>\n \n@@ -28,4 +28,20 @@ test01()\n std::string_view s(\"Hello, World!\");\n std::begin(s);\n std::end(s);\n+ std::rbegin(s);\n+ std::rend(s);\n+}\n+\n+void\n+test02()\n+{\n+ constexpr std::string_view s(\"Hello, World!\");\n+ [[maybe_unused]] constexpr auto b = std::begin(s);\n+ [[maybe_unused]] constexpr auto e = std::end(s);\n+ [[maybe_unused]] constexpr auto cb = std::cbegin(s);\n+ [[maybe_unused]] constexpr auto ce = std::cend(s);\n+ [[maybe_unused]] constexpr auto rb = std::rbegin(s);\n+ [[maybe_unused]] constexpr auto re = std::rend(s);\n+ [[maybe_unused]] constexpr auto crb = std::crbegin(s);\n+ [[maybe_unused]] constexpr auto cre = std::crend(s);\n }\ndiff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/range_access/wchar_t/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/range_access/wchar_t/1.cc\nindex 9c0370c20b7..84086615bb0 100644\n--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/range_access/wchar_t/1.cc\n+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/range_access/wchar_t/1.cc\n@@ -18,16 +18,30 @@\n // with this library; see the file COPYING3. If not see\n // <http://www.gnu.org/licenses/>.\n \n-// 24.6.5, range access [iterator.range]\n+// C++17 27.7, range access [iterator.range]\n \n #include <string_view>\n \n void\n test01()\n {\n-#ifdef _GLIBCXX_USE_WCHAR_T\n std::wstring_view ws(L\"Hello, World!\");\n std::begin(ws);\n std::end(ws);\n-#endif\n+ std::rbegin(ws);\n+ std::rend(ws);\n+}\n+\n+void\n+test02()\n+{\n+ constexpr std::wstring_view ws(L\"Hello, World!\");\n+ [[maybe_unused]] constexpr auto b = std::begin(ws);\n+ [[maybe_unused]] constexpr auto e = std::end(ws);\n+ [[maybe_unused]] constexpr auto cb = std::cbegin(ws);\n+ [[maybe_unused]] constexpr auto ce = std::cend(ws);\n+ [[maybe_unused]] constexpr auto rb = std::rbegin(ws);\n+ [[maybe_unused]] constexpr auto re = std::rend(ws);\n+ [[maybe_unused]] constexpr auto crb = std::crbegin(ws);\n+ [[maybe_unused]] constexpr auto cre = std::crend(ws);\n }\n", "prefixes": [] }