<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>