================
@@ -1011,6 +979,30 @@ void SExprBuilder::exitCFG(const CFGBlock *Last) {
   IncompleteArgs.clear();
 }
 
+static CapabilityExpr makeCapabilityExpr(const til::SExpr *E, QualType VDT,
+                                         bool Neg) {
+  // We need to look at the declaration of the type of the value to determine
+  // which it is. The type should either be a record or a typedef, or a pointer
+  // or reference thereof.
+  if (const auto *RT = VDT->getAs<RecordType>()) {
+    if (const auto *RD = RT->getDecl())
+      if (const auto *CA = RD->getAttr<CapabilityAttr>())
+        return CapabilityExpr(E, CA->getName(), Neg,
+                              RD->hasAttr<ReentrantCapabilityAttr>());
+  } else if (const auto *TT = VDT->getAs<TypedefType>()) {
+    if (const auto *TD = TT->getDecl())
+      if (const auto *CA = TD->getAttr<CapabilityAttr>())
+        return CapabilityExpr(E, CA->getName(), Neg,
+                              TD->hasAttr<ReentrantCapabilityAttr>());
+  } else if (VDT->isPointerOrReferenceType())
+    return makeCapabilityExpr(E, VDT->getPointeeType(), Neg);
+
+  return CapabilityExpr(E, StringRef("mutex"), Neg, false);
+}
----------------
melver wrote:

I'll rework this, trying to improve readability here as well.

https://github.com/llvm/llvm-project/pull/137133
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to