<div dir="auto"><div><div class="gmail_extra"><div class="gmail_quote">On 10 Mar 2018 13:33, "Erik Pilkington via cfe-commits" <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: epilk<br>
Date: Sat Mar 10 13:31:15 2018<br>
New Revision: 327226<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=327226&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=327226&view=rev</a><br>
Log:<br>
[demangler] Support for structured bindings.<br>
<br>
Modified:<br>
    libcxxabi/trunk/src/cxa_<wbr>demangle.cpp<br>
    libcxxabi/trunk/test/test_<wbr>demangle.pass.cpp<br>
<br>
Modified: libcxxabi/trunk/src/cxa_<wbr>demangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=327226&r1=327225&r2=327226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxxabi/trunk/src/<wbr>cxa_demangle.cpp?rev=327226&<wbr>r1=327225&r2=327226&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxxabi/trunk/src/cxa_<wbr>demangle.cpp (original)<br>
+++ libcxxabi/trunk/src/cxa_<wbr>demangle.cpp Sat Mar 10 13:31:15 2018<br>
@@ -197,6 +197,7 @@ public:<br>
     KDtorName,<br>
     KUnnamedTypeName,<br>
     KClosureTypeName,<br>
+    KStructuredBindingName,<br>
     KExpr,<br>
     KBracedExpr,<br>
     KBracedRangeExpr,<br>
@@ -1337,6 +1338,19 @@ public:<br>
   }<br>
 };<br>
<br>
+class StructuredBindingName : public Node {<br>
+  NodeArray Bindings;<br>
+public:<br>
+  StructuredBindingName(<wbr>NodeArray Bindings_)<br>
+      : Node(KStructuredBindingName), Bindings(Bindings_) {}<br>
+<br>
+  void printLeft(OutputStream &S) const override {<br>
+    S += "'structured-binding'[";<br>
+    Bindings.printWithComma(S);<br>
+    S += ']';<br>
+  }<br>
+};<br>
+<br>
 // -- Expression Nodes --<br>
<br>
 struct Expr : public Node {<br>
@@ -2217,7 +2231,7 @@ Node *Db::parseUnscopedName(<wbr>NameState *S<br>
 //                    ::= <ctor-dtor-name><br>
 //                    ::= <source-name><br>
 //                    ::= <unnamed-type-name><br>
-// FIXME:             ::= DC <source-name>+ E      # structured binding declaration<br>
+//                    ::= DC <source-name>+ E      # structured binding declaration<br>
 Node *Db::parseUnqualifiedName(<wbr>NameState *State) {<br>
  // <ctor-dtor-name>s are special-cased in parseNestedName().<br>
  Node *Result;<br>
@@ -2225,7 +2239,16 @@ Node *Db::parseUnqualifiedName(<wbr>NameState<br>
    Result = parseUnnamedTypeName(State);<br>
  else if (look() >= '1' && look() <= '9')<br>
    Result = parseSourceName(State);<br>
- else<br>
+ else if (consumeIf("DC")) {<br>
+   size_t BindingsBegin = Names.size();<br>
+   do {<br>
+     Node *Binding = parseSourceName(State);<br>
+     if (Binding == nullptr)<br>
+       return nullptr;<br>
+     Names.push_back(Binding);<br>
+   } while (!consumeIf('E'));<br>
+   Result = make<StructuredBindingName>(<wbr>popTrailingNodeArray(<wbr>BindingsBegin));<br>
+ } else<br>
    Result = parseOperatorName(State);<br>
  if (Result != nullptr)<br>
    Result = parseAbiTags(Result);<br>
@@ -2689,7 +2712,7 @@ Node *Db::parseNestedName(NameState *Sta<br>
     }<br>
<br>
     // Parse an <unqualified-name> thats actually a <ctor-dtor-name>.<br>
-    if (look() == 'C' || look() == 'D') {<br>
+    if (look() == 'C' || (look() == 'D' && look(1) != 'C')) {<br>
       if (SoFar == nullptr)<br>
         return nullptr;<br>
       Node *CtorDtor = parseCtorDtorName(SoFar, State);<br>
<br>
Modified: libcxxabi/trunk/test/test_<wbr>demangle.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.pass.cpp?rev=327226&r1=327225&r2=327226&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxxabi/trunk/test/<wbr>test_demangle.pass.cpp?rev=<wbr>327226&r1=327225&r2=327226&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxxabi/trunk/test/test_<wbr>demangle.pass.cpp (original)<br>
+++ libcxxabi/trunk/test/test_<wbr>demangle.pass.cpp Sat Mar 10 13:31:15 2018<br>
@@ -29718,6 +29718,10 @@ const char* cases[][2] =<br>
     {"_Z1fSsB1XS_", "f(std::string[abi:X], std::string[abi:X])"},<br>
<br>
     {"___Z10blocksNRVOv_block_<wbr>invoke", "invocation function for block in blocksNRVO()"},<br>
+<br>
+    // Structured bindings:<br>
+    {"_ZDC2a12a2E", "'structured-binding'[a1, a2]"},<br>
+    {"_ZN2NSDC1x1yEE", "NS::'structured-binding'[x, y]"},<br></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">Do we really need the prefix here? In the front-end we just use "NS::[x,y]" for this.<br></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 };<br>
<br>
 const unsigned N = sizeof(cases) / sizeof(cases[0]);<br>
@@ -29848,7 +29852,6 @@ void test_invalid_cases()<br>
<br>
 const char *xfail_cases[] = {<br>
     "_Z1fUa9enable_ifIXLi1EEEv", // enable_if attribute<br>
-    "_ZDC2a12a2E", // decomposition decl<br>
     "_ZW6FooBarE2f3v", // C++ modules TS<br>
<br>
     // FIXME: Why does clang generate the "cp" expr?<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></div></div>