================
@@ -355,6 +368,59 @@ Expected<EntityPointerLevel> 
clang::ssaf::createEntityPointerLevel(
   return Translator.translate(ND, IsFunRet);
 }
 
+DeclPointerLevels
+clang::ssaf::elaborateHigherDeclPointerLevels(const DeclPointerLevel &DPL) {
+  DeclPointerLevels Result{DPL};
+  QualType T;
+
+  if (DPL.IsReturn) {
+    if (const auto *FD = dyn_cast<FunctionDecl>(DPL.Decl))
+      T = FD->getReturnType().getNonReferenceType();
+  } else if (const auto *VD = dyn_cast<ValueDecl>(DPL.Decl)) {
+    T = VD->getType().getNonReferenceType();
+  }
+  if (T.isNull())
+    return Result;
+
+  // Count the max pointer/array levels of `T`:
+  unsigned MaxLevel = 0;
+  for (T = T.getCanonicalType();; ++MaxLevel) {
+    if (const auto *PT = dyn_cast<PointerType>(T))
+      T = PT->getPointeeType().getCanonicalType();
+    else if (const auto *AT = dyn_cast<ArrayType>(T))
+      T = AT->getElementType().getCanonicalType();
+    else
+      break;
+  }
+
+  for (unsigned Level = DPL.PointerLevel + 1; Level <= MaxLevel; ++Level)
----------------
steakhal wrote:

We should reserve if we know how many push_backs we will call.

https://github.com/llvm/llvm-project/pull/218196
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to