[{"id":1767036,"web_url":"http://patchwork.ozlabs.org/comment/1767036/","msgid":"<20170912133115.GR4582@redhat.com>","list_archive_url":null,"date":"2017-09-12T13:31:15","subject":"Re: [PATCH] PR libstdc++/70483 make std::string_view fully constexpr","submitter":{"id":48004,"url":"http://patchwork.ozlabs.org/api/people/48004/","name":"Jonathan Wakely","email":"jwakely@redhat.com"},"content":"On 11/09/17 22:48 +0100, Jonathan Wakely wrote:\n>This adds 'constexpr' everywhere it's missing from\n>std::basic_string_view.\n\nAnd this does it for std::experimental::basic_string_view, fixing the\nbug as reported.\n\nTested powerpc64le-linux, committed to trunk.\ncommit d1cb3e5ac0bf7b07a06d4b8bbdd4f6752be112ae\nAuthor: Jonathan Wakely <jwakely@redhat.com>\nDate:   Tue Sep 12 10:44:38 2017 +0100\n\n    PR libstdc++/70483 make std::experimental::string_view fully constexpr\n    \n            PR libstdc++/70483\n            * include/experimental/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/experimental/string_view (basic_string_view::remove_prefix)\n            (basic_string_view::remove_suffix, basic_string_view::swap)\n            (basic_string_view::compare, 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, operator==, operator!=)\n            (operator<, operator>, operator<=, operator>=): Likewise.\n            * testsuite/experimental/string_view/operations/compare/char/70483.cc:\n            New.\n\ndiff --git a/libstdc++-v3/include/experimental/bits/string_view.tcc b/libstdc++-v3/include/experimental/bits/string_view.tcc\nindex e66932d1ac0..450a43c7876 100644\n--- a/libstdc++-v3/include/experimental/bits/string_view.tcc\n+++ b/libstdc++-v3/include/experimental/bits/string_view.tcc\n@@ -49,7 +49,7 @@ namespace experimental\n inline namespace fundamentals_v1\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@@ -70,7 +70,7 @@ inline namespace fundamentals_v1\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@@ -86,7 +86,7 @@ inline namespace fundamentals_v1\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@@ -106,7 +106,7 @@ inline namespace fundamentals_v1\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@@ -123,7 +123,7 @@ inline namespace fundamentals_v1\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@@ -139,7 +139,7 @@ inline namespace fundamentals_v1\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@@ -160,7 +160,7 @@ inline namespace fundamentals_v1\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@@ -172,7 +172,7 @@ inline namespace fundamentals_v1\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@@ -183,7 +183,7 @@ inline namespace fundamentals_v1\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@@ -204,7 +204,7 @@ inline namespace fundamentals_v1\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/experimental/string_view b/libstdc++-v3/include/experimental/string_view\nindex 5cec5597744..2e8e7cda62d 100644\n--- a/libstdc++-v3/include/experimental/string_view\n+++ b/libstdc++-v3/include/experimental/string_view\n@@ -219,7 +219,7 @@ inline namespace fundamentals_v1\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@@ -227,15 +227,16 @@ inline namespace fundamentals_v1\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@@ -285,7 +286,7 @@ inline namespace fundamentals_v1\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@@ -295,24 +296,24 @@ inline namespace fundamentals_v1\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@@ -320,97 +321,97 @@ inline namespace fundamentals_v1\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@@ -446,109 +447,109 @@ inline namespace fundamentals_v1\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/experimental/string_view/operations/compare/char/70483.cc b/libstdc++-v3/testsuite/experimental/string_view/operations/compare/char/70483.cc\nnew file mode 100644\nindex 00000000000..3bfb59c046b\n--- /dev/null\n+++ b/libstdc++-v3/testsuite/experimental/string_view/operations/compare/char/70483.cc\n@@ -0,0 +1,68 @@\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-do compile { target c++14 } }\n+\n+#include <experimental/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+  static constexpr const char*\n+  find(const char* p, std::size_t n, char c)\n+  {\n+    for (size_t pos = 0; pos < n; ++pos)\n+      if (p[pos] == c)\n+\treturn p + pos;\n+    return nullptr;\n+  }\n+};\n+\n+using string_view\n+  = std::experimental::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() );","headers":{"Return-Path":"<gcc-patches-return-461919-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-461919-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=\"UpIaJ6Yp\"; dkim-atps=neutral","sourceware.org; auth=none","ext-mx08.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx08.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 3xs5L41RZPz9s4s\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 12 Sep 2017 23:31:39 +1000 (AEST)","(qmail 25052 invoked by alias); 12 Sep 2017 13:31:29 -0000","(qmail 24380 invoked by uid 89); 12 Sep 2017 13:31:28 -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\tTue, 12 Sep 2017 13:31:18 +0000","from smtp.corp.redhat.com\n\t(int-mx06.intmail.prod.int.phx2.redhat.com\n\t[10.5.11.16])\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 D5A9AC0587EE;\n\tTue, 12 Sep 2017 13:31:16 +0000 (UTC)","from localhost (unknown [10.33.36.37])\tby smtp.corp.redhat.com\n\t(Postfix) with ESMTP id 665A366857;\n\tTue, 12 Sep 2017 13:31:16 +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:references:mime-version:content-type\n\t:in-reply-to; q=dns; s=default; b=CkdgTQJ6kYvsWBv5eRy03GiFZ9sEfC\n\tLNdMnYrM7hOFkQOmQi2CANRZvI7hXYtrSnwnnUuQNE6+qdTrhzqdWIV2VYKsgsjl\n\tqiQkjrLqZkFhLoMC4nh6GNGj273eQTQP9TG7cAYO70SHGGy+8k5wyadA42cVBUWD\n\t3kITEQBnnPFCk=","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:references:mime-version:content-type\n\t:in-reply-to; s=default; bh=ol1V3dM3KCM+SgfKu+tFpdYxcG0=; b=UpIa\n\tJ6Yp5XhOs557PVKiHtj45fgwfRbGs3mO12sI1yN4xDloObpr7AxEsf+/XhWM5VxD\n\tfkaVV1pN2tBaplpa66ZYZ8toqV+B2QW+TlnPcz8jhwbs4cLmy0pB98WNkef+Lkmj\n\tBp+DR1ptS7LXDfIpJtH/Atwwr2ueEF01iuqdIso=","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=","X-Spam-User":"qpsmtpd, 2 recipients","X-HELO":"mx1.redhat.com","DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com D5A9AC0587EE","Date":"Tue, 12 Sep 2017 14:31:15 +0100","From":"Jonathan Wakely <jwakely@redhat.com>","To":"libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org","Subject":"Re: [PATCH] PR libstdc++/70483 make std::string_view fully constexpr","Message-ID":"<20170912133115.GR4582@redhat.com>","References":"<20170911214846.GA8159@redhat.com>","MIME-Version":"1.0","Content-Type":"multipart/mixed; boundary=\"k+G3HLlWI7eRTl+h\"","Content-Disposition":"inline","In-Reply-To":"<20170911214846.GA8159@redhat.com>","X-Clacks-Overhead":"GNU Terry Pratchett","User-Agent":"Mutt/1.8.3 (2017-05-23)"}}]