<div dir="ltr">Hi Marshall,<div><br></div><div>We should merge this fix into the 4.0 release.</div><div>It fixes a regression which was reported by the FreeBSD maintainers here: <a href="https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=216177">https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=216177</a></div><div><br></div><div>Am I OK to merge this?</div><div><br></div><div>/Eric</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 17, 2017 at 3:10 PM, Eric Fiselier via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ericwf<br>
Date: Tue Jan 17 16:10:32 2017<br>
New Revision: 292276<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=292276&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=292276&view=rev</a><br>
Log:<br>
Fix std::string assignment ambiguity from braced initializer lists.<br>
<br>
When support for `basic_string_view` was added to string it also<br>
added new assignment operators from `basic_string_view`. These caused<br>
ambiguity when assigning from a braced initializer. This patch fixes<br>
that regression by making the basic_string_view assignment operator<br>
rank lower in overload resolution by making it a template.<br>
<br>
Added:<br>
    libcxx/trunk/test/std/strings/<wbr>basic.string/string.cons/<wbr>brace_assignment.pass.cpp<br>
Modified:<br>
    libcxx/trunk/include/string<br>
    libcxx/trunk/test/std/strings/<wbr>basic.string/string.cons/<wbr>string_view.pass.cpp<br>
<br>
Modified: libcxx/trunk/include/string<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/string?rev=292276&r1=292275&r2=292276&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/include/<wbr>string?rev=292276&r1=292275&<wbr>r2=292276&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/include/string (original)<br>
+++ libcxx/trunk/include/string Tue Jan 17 16:10:32 2017<br>
@@ -818,6 +818,7 @@ public:<br>
     operator __self_view() const _NOEXCEPT { return __self_view(data(), size()); }<br>
<br>
     basic_string& operator=(const basic_string& __str);<br>
+    template <class = void><br>
     _LIBCPP_INLINE_VISIBILITY<br>
     basic_string& operator=(__self_view __sv)  {return assign(__sv);}<br>
 #ifndef _LIBCPP_HAS_NO_RVALUE_<wbr>REFERENCES<br>
<br>
Added: libcxx/trunk/test/std/strings/<wbr>basic.string/string.cons/<wbr>brace_assignment.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/basic.string/string.cons/brace_assignment.pass.cpp?rev=292276&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/test/std/<wbr>strings/basic.string/string.<wbr>cons/brace_assignment.pass.<wbr>cpp?rev=292276&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/strings/<wbr>basic.string/string.cons/<wbr>brace_assignment.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/strings/<wbr>basic.string/string.cons/<wbr>brace_assignment.pass.cpp Tue Jan 17 16:10:32 2017<br>
@@ -0,0 +1,36 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03<br>
+<br>
+// <string><br>
+<br>
+// basic_string<charT,traits,<wbr>Allocator>&<br>
+//   operator=(basic_string<charT,<wbr>traits,Allocator>&& str);<br>
+<br>
+#include <string><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+int main()<br>
+{<br>
+  // Test that assignment from {} and {ptr, len} are allowed and are not<br>
+  // ambiguous.<br>
+  {<br>
+    std::string s = "hello world";<br>
+    s = {};<br>
+    assert(s.empty());<br>
+  }<br>
+  {<br>
+    std::string s = "hello world";<br>
+    s = {"abc", 2};<br>
+    assert(s == "ab");<br>
+  }<br>
+}<br>
<br>
Modified: libcxx/trunk/test/std/strings/<wbr>basic.string/string.cons/<wbr>string_view.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/basic.string/string.cons/string_view.pass.cpp?rev=292276&r1=292275&r2=292276&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/test/std/<wbr>strings/basic.string/string.<wbr>cons/string_view.pass.cpp?rev=<wbr>292276&r1=292275&r2=292276&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/strings/<wbr>basic.string/string.cons/<wbr>string_view.pass.cpp (original)<br>
+++ libcxx/trunk/test/std/strings/<wbr>basic.string/string.cons/<wbr>string_view.pass.cpp Tue Jan 17 16:10:32 2017<br>
@@ -28,12 +28,23 @@ test(std::basic_string_view<<wbr>charT> sv)<br>
     typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S;<br>
     typedef typename S::traits_type T;<br>
     typedef typename S::allocator_type A;<br>
+  {<br>
     S s2(sv);<br>
     LIBCPP_ASSERT(s2.__invariants(<wbr>));<br>
     assert(s2.size() == sv.size());<br>
     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);<br>
     assert(s2.get_allocator() == A());<br>
     assert(s2.capacity() >= s2.size());<br>
+  }<br>
+  {<br>
+    S s2;<br>
+    s2 = sv;<br>
+    LIBCPP_ASSERT(s2.__invariants(<wbr>));<br>
+    assert(s2.size() == sv.size());<br>
+    assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);<br>
+    assert(s2.get_allocator() == A());<br>
+    assert(s2.capacity() >= s2.size());<br>
+  }<br>
 }<br>
<br>
 template <class charT, class A><br>
@@ -42,12 +53,23 @@ test(std::basic_string_view<<wbr>charT> sv, c<br>
 {<br>
     typedef std::basic_string<charT, std::char_traits<charT>, A> S;<br>
     typedef typename S::traits_type T;<br>
+  {<br>
     S s2(sv, a);<br>
     LIBCPP_ASSERT(s2.__invariants(<wbr>));<br>
     assert(s2.size() == sv.size());<br>
     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);<br>
     assert(s2.get_allocator() == a);<br>
     assert(s2.capacity() >= s2.size());<br>
+  }<br>
+  {<br>
+    S s2(a);<br>
+    s2 = sv;<br>
+    LIBCPP_ASSERT(s2.__invariants(<wbr>));<br>
+    assert(s2.size() == sv.size());<br>
+    assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);<br>
+    assert(s2.get_allocator() == a);<br>
+    assert(s2.capacity() >= s2.size());<br>
+  }<br>
 }<br>
<br>
 int main()<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>