summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Demangle/ItaniumDemangle.cpp
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2018-03-25 22:49:16 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2018-03-25 22:49:16 +0000
commitc728786b1d5353738c319234696c31ce29aa73ef (patch)
tree205a7d10df60345344feba012e1fd57f45c88ff8 /llvm/lib/Demangle/ItaniumDemangle.cpp
parent93e64dd9a1e2ed5e31881994cdde5e6ef94ddc79 (diff)
downloadbcm5719-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.cpp41
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);
}
OpenPOWER on IntegriCloud