<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p><br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 2018-03-10 4:40 PM, Richard Smith
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAOfiQqkcGyZgktBr3kYP1zZ6mSq6WsJkKETvgS4wGdu_Ogr=Pw@mail.gmail.com">
      <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"
                moz-do-not-send="true">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"
                  moz-do-not-send="true">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"
                  moz-do-not-send="true">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"
                  moz-do-not-send="true">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>
    </blockquote>
    I suppose not, that printing is just as informative and less
    verbose. Fixed this in r327228, thanks for the review!<br>
    <blockquote type="cite"
cite="mid:CAOfiQqkcGyZgktBr3kYP1zZ6mSq6WsJkKETvgS4wGdu_Ogr=Pw@mail.gmail.com">
      <div dir="auto">
        <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"
                  moz-do-not-send="true">cfe-commits@lists.llvm.org</a><br>
                <a
                  href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits"
                  rel="noreferrer" target="_blank"
                  moz-do-not-send="true">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
              </blockquote>
            </div>
            <br>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>