<div dir="ltr">Are you planning to use this for anything aside from D47249 which was abandoned?<div><br></div><div>Peter</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 24, 2018 at 12:02 AM, Fangrui Song via Phabricator <span dir="ltr"><<a href="mailto:reviews@reviews.llvm.org" target="_blank">reviews@reviews.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This revision was automatically updated to reflect the committed changes.<br>
Closed by commit rL333159: [demangler] Add ItaniumPartialDemangler::<wbr>isCtorOrDtor (authored by MaskRay, committed by ).<br>
<span class=""><br>
Repository:<br>
  rL LLVM<br>
<br>
<a href="https://reviews.llvm.org/D47248" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D47248</a><br>
<br>
Files:<br>
</span>  llvm/trunk/include/llvm/<wbr>Demangle/Demangle.h<br>
  llvm/trunk/lib/Demangle/<wbr>ItaniumDemangle.cpp<br>
  llvm/trunk/unittests/Demangle/<wbr>PartialDemangleTest.cpp<br>
<br>
<br>
Index: llvm/trunk/lib/Demangle/<wbr>ItaniumDemangle.cpp<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/trunk/lib/Demangle/<wbr>ItaniumDemangle.cpp<br>
+++ llvm/trunk/lib/Demangle/<wbr>ItaniumDemangle.cpp<br>
<div><div class="h5">@@ -5264,6 +5264,38 @@<br>
   return E->getCVQuals() != QualNone || E->getRefQual() != FrefQualNone;<br>
 }<br>
<br>
+bool ItaniumPartialDemangler::<wbr>isCtorOrDtor() const {<br>
+  Node *N = static_cast<Node *>(RootNode);<br>
+  while (N) {<br>
+    switch (N->getKind()) {<br>
+    default:<br>
+      return false;<br>
+    case Node::KCtorDtorName:<br>
+      return true;<br>
+<br>
+    case Node::KAbiTagAttr:<br>
+      N = static_cast<AbiTagAttr *>(N)->Base;<br>
+      break;<br>
+    case Node::KFunctionEncoding:<br>
+      N = static_cast<FunctionEncoding *>(N)->getName();<br>
+      break;<br>
+    case Node::KLocalName:<br>
+      N = static_cast<LocalName *>(N)->Entity;<br>
+      break;<br>
+    case Node::KNameWithTemplateArgs:<br>
+      N = static_cast<<wbr>NameWithTemplateArgs *>(N)->Name;<br>
+      break;<br>
+    case Node::KNestedName:<br>
+      N = static_cast<NestedName *>(N)->Name;<br>
+      break;<br>
+    case Node::KStdQualifiedName:<br>
+      N = static_cast<StdQualifiedName *>(N)->Child;<br>
+      break;<br>
+    }<br>
+  }<br>
+  return false;<br>
+}<br>
+<br>
 bool ItaniumPartialDemangler::<wbr>isFunction() const {<br>
   assert(RootNode != nullptr && "must call partialDemangle()");<br>
   return static_cast<Node *>(RootNode)->getKind() == Node::KFunctionEncoding;<br>
</div></div>Index: llvm/trunk/unittests/Demangle/<wbr>PartialDemangleTest.cpp<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/trunk/unittests/Demangle/<wbr>PartialDemangleTest.cpp<br>
+++ llvm/trunk/unittests/Demangle/<wbr>PartialDemangleTest.cpp<br>
<div><div class="h5">@@ -109,6 +109,32 @@<br>
   EXPECT_TRUE(Demangler.isData()<wbr>);<br>
 }<br>
<br>
+TEST(PartialDemanglerTest, TestCtorOrDtor) {<br>
+  static const char *Pos[] = {<br>
+      "_ZN1AC1Ev",        // A::A()<br>
+      "_ZN1AC1IiEET_",    // A::A<int>(int)<br>
+      "_ZN1AD2Ev",        // A::~A()<br>
+      "_ZN1BIiEC1IcEET_", // B<int>::B<char>(char)<br>
+      "_ZN1AC1B1TEv",     // A::A[abi:T]()<br>
+      "_ZNSt1AD2Ev",      // std::A::~A()<br>
+      "_ZN2ns1AD1Ev",      // ns::A::~A()<br>
+  };<br>
+  static const char *Neg[] = {<br>
+      "_Z1fv",<br>
+      "_ZN1A1gIiEEvT_", // void A::g<int>(int)<br>
+  };<br>
+<br>
+  llvm::ItaniumPartialDemangler D;<br>
+  for (const char *N : Pos) {<br>
+    EXPECT_FALSE(D.<wbr>partialDemangle(N));<br>
+    EXPECT_TRUE(D.isCtorOrDtor());<br>
+  }<br>
+  for (const char *N : Neg) {<br>
+    EXPECT_FALSE(D.<wbr>partialDemangle(N));<br>
+    EXPECT_FALSE(D.isCtorOrDtor())<wbr>;<br>
+  }<br>
+}<br>
+<br>
 TEST(PartialDemanglerTest, TestMisc) {<br>
   llvm::ItaniumPartialDemangler D1, D2;<br>
<br>
</div></div>Index: llvm/trunk/include/llvm/<wbr>Demangle/Demangle.h<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/trunk/include/llvm/<wbr>Demangle/Demangle.h<br>
+++ llvm/trunk/include/llvm/<wbr>Demangle/Demangle.h<br>
<div class="HOEnZb"><div class="h5">@@ -63,6 +63,9 @@<br>
   /// the function is a non-static member function.<br>
   bool hasFunctionQualifiers() const;<br>
<br>
+  /// If this symbol describes a constructor or destructor.<br>
+  bool isCtorOrDtor() const;<br>
+<br>
   /// If this symbol describes a function.<br>
   bool isFunction() const;<br>
<br>
<br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">-- <div>Peter</div></div></div>
</div>