diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2018-03-25 22:49:16 +0000 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2018-03-25 22:49:16 +0000 |
commit | c728786b1d5353738c319234696c31ce29aa73ef (patch) | |
tree | 205a7d10df60345344feba012e1fd57f45c88ff8 /llvm/lib/Demangle/ItaniumDemangle.cpp | |
parent | 93e64dd9a1e2ed5e31881994cdde5e6ef94ddc79 (diff) | |
download | bcm5719-llvm-c728786b1d5353738c319234696c31ce29aa73ef.tar.gz bcm5719-llvm-c728786b1d5353738c319234696c31ce29aa73ef.zip |
[demangler] Support for clang's enable_if attribute.
Fixes PR33569.
llvm-svn: 328462
Diffstat (limited to 'llvm/lib/Demangle/ItaniumDemangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/ItaniumDemangle.cpp | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/llvm/lib/Demangle/ItaniumDemangle.cpp b/llvm/lib/Demangle/ItaniumDemangle.cpp index 7b118dd06aa..2596cffd07e 100644 --- a/llvm/lib/Demangle/ItaniumDemangle.cpp +++ b/llvm/lib/Demangle/ItaniumDemangle.cpp @@ -9,7 +9,6 @@ // FIXME: (possibly) incomplete list of features that clang mangles that this // file does not yet support: -// - enable_if attribute // - C++ modules TS // - All C++14 and C++17 features @@ -160,6 +159,7 @@ public: KElaboratedTypeSpefType, KNameType, KAbiTagAttr, + KEnableIfAttr, KObjCProtoName, KPointerType, KLValueReferenceType, @@ -478,6 +478,19 @@ public: } }; +class EnableIfAttr : public Node { + NodeArray Conditions; +public: + EnableIfAttr(NodeArray Conditions_) + : Node(KEnableIfAttr), Conditions(Conditions_) {} + + void printLeft(OutputStream &S) const override { + S += " [enable_if:"; + Conditions.printWithComma(S); + S += ']'; + } +}; + class ObjCProtoName : public Node { Node *Ty; StringView Protocol; @@ -804,17 +817,18 @@ class FunctionEncoding final : public Node { const Node *Ret; const Node *Name; NodeArray Params; + Node *Attrs; Qualifiers CVQuals; FunctionRefQual RefQual; public: FunctionEncoding(Node *Ret_, Node *Name_, NodeArray Params_, - Qualifiers CVQuals_, FunctionRefQual RefQual_) + Node *Attrs_, Qualifiers CVQuals_, FunctionRefQual RefQual_) : Node(KFunctionEncoding, NoParameterPack, /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, /*FunctionCache=*/Cache::Yes), - Ret(Ret_), Name(Name_), Params(Params_), CVQuals(CVQuals_), - RefQual(RefQual_) { + Ret(Ret_), Name(Name_), Params(Params_), Attrs(Attrs_), + CVQuals(CVQuals_), RefQual(RefQual_) { for (Node *P : Params) ParameterPackSize = std::min(ParameterPackSize, P->ParameterPackSize); if (Ret) @@ -853,6 +867,9 @@ public: S += " &"; else if (RefQual == FrefQualRValue) S += " &&"; + + if (Attrs != nullptr) + Attrs->print(S); } }; @@ -4472,6 +4489,18 @@ Node *Db::parseEncoding() { TagTemplates = false; + Node *Attrs = nullptr; + if (consumeIf("Ua9enable_ifI")) { + size_t BeforeArgs = Names.size(); + while (!consumeIf('E')) { + Node *Arg = parseTemplateArg(); + if (Arg == nullptr) + return nullptr; + Names.push_back(Arg); + } + Attrs = make<EnableIfAttr>(popTrailingNodeArray(BeforeArgs)); + } + Node *ReturnType = nullptr; if (!NameInfo.CtorDtorConversion && NameInfo.EndsWithTemplateArgs) { ReturnType = parseType(); @@ -4481,7 +4510,7 @@ Node *Db::parseEncoding() { if (consumeIf('v')) return make<FunctionEncoding>(ReturnType, Name, NodeArray(), - NameInfo.CVQualifiers, + Attrs, NameInfo.CVQualifiers, NameInfo.ReferenceQualifier); size_t ParamsBegin = Names.size(); @@ -4494,7 +4523,7 @@ Node *Db::parseEncoding() { return make<FunctionEncoding>(ReturnType, Name, popTrailingNodeArray(ParamsBegin), - NameInfo.CVQualifiers, + Attrs, NameInfo.CVQualifiers, NameInfo.ReferenceQualifier); } |