mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-10-10 12:55:00 +00:00
[demangler] Support for structured bindings.
llvm-svn: 327226
This commit is contained in:
parent
d88204fe1b
commit
b1a7f3c741
@ -197,6 +197,7 @@ public:
|
||||
KDtorName,
|
||||
KUnnamedTypeName,
|
||||
KClosureTypeName,
|
||||
KStructuredBindingName,
|
||||
KExpr,
|
||||
KBracedExpr,
|
||||
KBracedRangeExpr,
|
||||
@ -1337,6 +1338,19 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class StructuredBindingName : public Node {
|
||||
NodeArray Bindings;
|
||||
public:
|
||||
StructuredBindingName(NodeArray Bindings_)
|
||||
: Node(KStructuredBindingName), Bindings(Bindings_) {}
|
||||
|
||||
void printLeft(OutputStream &S) const override {
|
||||
S += "'structured-binding'[";
|
||||
Bindings.printWithComma(S);
|
||||
S += ']';
|
||||
}
|
||||
};
|
||||
|
||||
// -- Expression Nodes --
|
||||
|
||||
struct Expr : public Node {
|
||||
@ -2217,7 +2231,7 @@ Node *Db::parseUnscopedName(NameState *State) {
|
||||
// ::= <ctor-dtor-name>
|
||||
// ::= <source-name>
|
||||
// ::= <unnamed-type-name>
|
||||
// FIXME: ::= DC <source-name>+ E # structured binding declaration
|
||||
// ::= DC <source-name>+ E # structured binding declaration
|
||||
Node *Db::parseUnqualifiedName(NameState *State) {
|
||||
// <ctor-dtor-name>s are special-cased in parseNestedName().
|
||||
Node *Result;
|
||||
@ -2225,7 +2239,16 @@ Node *Db::parseUnqualifiedName(NameState *State) {
|
||||
Result = parseUnnamedTypeName(State);
|
||||
else if (look() >= '1' && look() <= '9')
|
||||
Result = parseSourceName(State);
|
||||
else
|
||||
else if (consumeIf("DC")) {
|
||||
size_t BindingsBegin = Names.size();
|
||||
do {
|
||||
Node *Binding = parseSourceName(State);
|
||||
if (Binding == nullptr)
|
||||
return nullptr;
|
||||
Names.push_back(Binding);
|
||||
} while (!consumeIf('E'));
|
||||
Result = make<StructuredBindingName>(popTrailingNodeArray(BindingsBegin));
|
||||
} else
|
||||
Result = parseOperatorName(State);
|
||||
if (Result != nullptr)
|
||||
Result = parseAbiTags(Result);
|
||||
@ -2689,7 +2712,7 @@ Node *Db::parseNestedName(NameState *State) {
|
||||
}
|
||||
|
||||
// Parse an <unqualified-name> thats actually a <ctor-dtor-name>.
|
||||
if (look() == 'C' || look() == 'D') {
|
||||
if (look() == 'C' || (look() == 'D' && look(1) != 'C')) {
|
||||
if (SoFar == nullptr)
|
||||
return nullptr;
|
||||
Node *CtorDtor = parseCtorDtorName(SoFar, State);
|
||||
|
@ -29718,6 +29718,10 @@ const char* cases[][2] =
|
||||
{"_Z1fSsB1XS_", "f(std::string[abi:X], std::string[abi:X])"},
|
||||
|
||||
{"___Z10blocksNRVOv_block_invoke", "invocation function for block in blocksNRVO()"},
|
||||
|
||||
// Structured bindings:
|
||||
{"_ZDC2a12a2E", "'structured-binding'[a1, a2]"},
|
||||
{"_ZN2NSDC1x1yEE", "NS::'structured-binding'[x, y]"},
|
||||
};
|
||||
|
||||
const unsigned N = sizeof(cases) / sizeof(cases[0]);
|
||||
@ -29848,7 +29852,6 @@ void test_invalid_cases()
|
||||
|
||||
const char *xfail_cases[] = {
|
||||
"_Z1fUa9enable_ifIXLi1EEEv", // enable_if attribute
|
||||
"_ZDC2a12a2E", // decomposition decl
|
||||
"_ZW6FooBarE2f3v", // C++ modules TS
|
||||
|
||||
// FIXME: Why does clang generate the "cp" expr?
|
||||
|
Loading…
Reference in New Issue
Block a user