<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jan 6, 2014 at 3:05 PM, Howard Hinnant <span dir="ltr"><<a href="mailto:hhinnant@apple.com" target="_blank">hhinnant@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: hhinnant<br>
Date: Mon Jan  6 17:05:04 2014<br>
New Revision: 198643<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=198643&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=198643&view=rev</a><br>
Log:<br>
Implement demangling for user-defined operators.<br>
<br>
Modified:<br>
    libcxxabi/trunk/src/cxa_demangle.cpp<br>
    libcxxabi/trunk/test/test_demangle.cpp<br>
<br>
Modified: libcxxabi/trunk/src/cxa_demangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=198643&r1=198642&r2=198643&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=198643&r1=198642&r2=198643&view=diff</a><br>

==============================================================================<br>
--- libcxxabi/trunk/src/cxa_demangle.cpp (original)<br>
+++ libcxxabi/trunk/src/cxa_demangle.cpp Mon Jan  6 17:05:04 2014<br>
@@ -2277,6 +2277,7 @@ parse_type(const char* first, const char<br>
 //                   ::= gt    # ><br>
 //                   ::= ix    # []<br>
 //                   ::= le    # <=<br>
+//                   ::= li <source-name>  # operator ""<br>
 //                   ::= ls    # <<<br>
 //                   ::= lS    # <<=<br>
 //                   ::= lt    # <<br>
@@ -2438,6 +2439,18 @@ parse_operator_name(const char* first, c<br>
                 db.names.push_back("operator<=");<br>
                 first += 2;<br>
                 break;<br>
+            case 'i':<br>
+                {<br>
+                    const char* t = parse_source_name(first+2, last, db);<br>
+                    if (t != first+2)<br>
+                    {<br>
+                        if (db.names.empty())<br>
+                            return first;<br>
+                        db.names.back().first.insert(0, "operator\"\" ");<br></blockquote><div><br></div><div>It would be more correct to use "operator\"\"" here (without the trailing space). This will generate an incorrect unmangled name for operator""if, which can only be written without the space.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+                        first = t;<br>
+                    }<br>
+                }<br>
+                break;<br>
             case 's':<br>
                 db.names.push_back("operator<<");<br>
                 first += 2;<br>
<br>
Modified: libcxxabi/trunk/test/test_demangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.cpp?rev=198643&r1=198642&r2=198643&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.cpp?rev=198643&r1=198642&r2=198643&view=diff</a><br>

==============================================================================<br>
--- libcxxabi/trunk/test/test_demangle.cpp (original)<br>
+++ libcxxabi/trunk/test/test_demangle.cpp Mon Jan  6 17:05:04 2014<br>
@@ -29584,6 +29584,7 @@ const char* cases[][2] =<br>
     {"_Z1fPKU11objcproto1A7NSArray", "f(NSArray<A> const*)"},<br>
     {"_ZNK1AIJ1Z1Y1XEEcv1BIJDpPT_EEIJS2_S1_S0_EEEv", "A<Z, Y, X>::operator B<X*, Y*, Z*><X, Y, Z>() const"},<br>
     {"_ZNK3Ncr6Silver7Utility6detail12CallOnThreadIZ53-[DeploymentSetupController handleManualServerEntry:]E3$_5EclIJEEEDTclclL_ZNS2_4getTIS4_EERT_vEEspclsr3stdE7forwardIT_Efp_EEEDpOSA_", "decltype(-[DeploymentSetupController handleManualServerEntry:]::$_5& Ncr::Silver::Utility::detail::getT<-[DeploymentSetupController handleManualServerEntry:]::$_5>()()(std::forward<-[DeploymentSetupController handleManualServerEntry:]::$_5>(fp))) Ncr::Silver::Utility::detail::CallOnThread<-[DeploymentSetupController handleManualServerEntry:]::$_5>::operator()<>(-[DeploymentSetupController handleManualServerEntry:]::$_5&&) const"},<br>

+    {"_Zli2_xy", "operator\"\" _x(unsigned long long)"},<br>
 };<br>
<br>
 const unsigned N = sizeof(cases) / sizeof(cases[0]);<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>