<div dir="ltr">Merged into the 4.0 branch in r292309.</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 17, 2017 at 4:55 PM, Eric Fiselier <span dir="ltr"><<a href="mailto:eric@efcs.ca" target="_blank">eric@efcs.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">FYI Once the bots finish checking this commit I'm going to merge this into the 4.0 branch.<div><br></div><div>This fixes a very recently introduced regression.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>/Eric</div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 17, 2017 at 4:41 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 17:41:42 2017<br>
New Revision: 292294<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=292294&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=292294&view=rev</a><br>
Log:<br>
Fix type_info's constructor by making it explicit again.<br>
<br>
In recent changes type_info's private constructor was<br>
accidentally made implicit. This patch fixes that.<br>
<br>
Modified:<br>
    libcxx/trunk/include/typeinfo<br>
    libcxx/trunk/test/std/language<wbr>.support/support.rtti/<a href="http://type.info/type_info.pass.cpp" rel="noreferrer" target="_blank">type.<wbr>info/type_info.pass.cpp</a><br>
<br>
Modified: libcxx/trunk/include/typeinfo<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/typeinfo?rev=292294&r1=292293&r2=292294&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/include/typ<wbr>einfo?rev=292294&r1=292293&r2=<wbr>292294&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/include/typeinfo (original)<br>
+++ libcxx/trunk/include/typeinfo Tue Jan 17 17:41:42 2017<br>
@@ -95,12 +95,13 @@ protected:<br>
     uintptr_t __type_name;<br>
<br>
     _LIBCPP_INLINE_VISIBILITY<br>
-    type_info(const char* __n) : __type_name(reinterpret_cast<u<wbr>intptr_t>(__n)) {}<br>
+    explicit type_info(const char* __n)<br>
+      : __type_name(reinterpret_cast<u<wbr>intptr_t>(__n)) {}<br>
 #else<br>
     const char *__type_name;<br>
<br>
     _LIBCPP_INLINE_VISIBILITY<br>
-    type_info(const char* __n) : __type_name(__n) {}<br>
+    explicit type_info(const char* __n) : __type_name(__n) {}<br>
 #endif<br>
<br>
 public:<br>
<br>
Modified: libcxx/trunk/test/std/language<wbr>.support/support.rtti/<a href="http://type.info/type_info.pass.cpp" rel="noreferrer" target="_blank">type.<wbr>info/type_info.pass.cpp</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/language.support/support.rtti/type.info/type_info.pass.cpp?rev=292294&r1=292293&r2=292294&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/la<wbr>nguage.support/support.rtti/ty<wbr>pe.info/type_info.pass.cpp?rev<wbr>=292294&r1=292293&r2=292294&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/language<wbr>.support/support.rtti/<a href="http://type.info/type_info.pass.cpp" rel="noreferrer" target="_blank">type.<wbr>info/type_info.pass.cpp</a> (original)<br>
+++ libcxx/trunk/test/std/language<wbr>.support/support.rtti/<a href="http://type.info/type_info.pass.cpp" rel="noreferrer" target="_blank">type.<wbr>info/type_info.pass.cpp</a> Tue Jan 17 17:41:42 2017<br>
@@ -10,11 +10,16 @@<br>
 // test type_info<br>
<br>
 #include <typeinfo><br>
+#include <string><br>
 #include <cstring><br>
 #include <cassert><br>
<br>
+bool test_constructor_explicit(std:<wbr>:type_info const&) { return false; }<br>
+bool test_constructor_explicit(std:<wbr>:string const&) { return true; }<br>
+<br>
 int main()<br>
 {<br>
+  {<br>
     const std::type_info& t1 = typeid(int);<br>
     const std::type_info& t2 = typeid(int);<br>
     assert(t1 == t2);<br>
@@ -23,4 +28,13 @@ int main()<br>
     assert(!t1.before(t2));<br>
     assert(strcmp(<a href="http://t1.name" rel="noreferrer" target="_blank">t1.name</a>(), <a href="http://t2.name" rel="noreferrer" target="_blank">t2.name</a>()) == 0);<br>
     assert(strcmp(<a href="http://t1.name" rel="noreferrer" target="_blank">t1.name</a>(), <a href="http://t3.name" rel="noreferrer" target="_blank">t3.name</a>()) != 0);<br>
+  }<br>
+  {<br>
+    // type_info has a protected constructor taking a string literal. This<br>
+    // constructor is not intended for users. However it still participates<br>
+    // in overload resolution, so we need to ensure that it is marked explicit<br>
+    // to avoid ambiguous conversions.<br>
+    // See: <a href="https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=216201" rel="noreferrer" target="_blank">https://bugs.freebsd.org/bugzi<wbr>lla/show_bug.cgi?id=216201</a><br>
+    assert(test_constructor_explic<wbr>it("abc"));<br>
+  }<br>
 }<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">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>
</div></div></blockquote></div><br></div>