[llvm-branch-commits] [clang] [SSAF] Add APIs for resolving bare EntityNames to qualified EntityNames (PR #219033)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Aug 26 13:53:24 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Ziqing Luo (ziqingluo-90)

<details>
<summary>Changes</summary>

Also give Transformation access to SSAFOptions so that it can use link-unit and compilation-unit IDs to resolve bare EntityNames.

first step of
rdar://185840466

---

Patch is 20.23 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/219033.diff


14 Files Affected:

- (modified) clang/include/clang/ScalableStaticAnalysis/Core/ASTEntityMapping.h (+26) 
- (modified) clang/include/clang/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.h (+9) 
- (modified) clang/include/clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h (+7) 
- (modified) clang/include/clang/ScalableStaticAnalysis/SourceTransformation/Transformation.h (+6-3) 
- (modified) clang/include/clang/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.h (+3-3) 
- (modified) clang/lib/ScalableStaticAnalysis/Core/ASTEntityMapping.cpp (+64) 
- (modified) clang/lib/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.cpp (+5-5) 
- (modified) clang/lib/ScalableStaticAnalysis/Core/Model/BuildNamespace.cpp (+8) 
- (modified) clang/lib/ScalableStaticAnalysis/Core/TUSummary/TUSummaryExtractor.cpp (-41) 
- (modified) clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp (+1-1) 
- (modified) clang/lib/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.cpp (+2-2) 
- (modified) clang/unittests/ScalableStaticAnalysis/ASTEntityMappingTest.cpp (+35) 
- (modified) clang/unittests/ScalableStaticAnalysis/SourceTransformation/CppBoundedBuffersTest.cpp (+3-1) 
- (modified) clang/unittests/ScalableStaticAnalysis/SourceTransformation/RegistryTest.cpp (+3-1) 


``````````diff
diff --git a/clang/include/clang/ScalableStaticAnalysis/Core/ASTEntityMapping.h b/clang/include/clang/ScalableStaticAnalysis/Core/ASTEntityMapping.h
index aa8ce469397a0..4b26fb029d77d 100644
--- a/clang/include/clang/ScalableStaticAnalysis/Core/ASTEntityMapping.h
+++ b/clang/include/clang/ScalableStaticAnalysis/Core/ASTEntityMapping.h
@@ -10,6 +10,8 @@
 #define LLVM_CLANG_SCALABLESTATICANALYSIS_CORE_ASTENTITYMAPPING_H
 
 #include "clang/AST/Decl.h"
+#include "clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h"
+#include "clang/ScalableStaticAnalysis/Core/Model/EntityLinkage.h"
 #include "clang/ScalableStaticAnalysis/Core/Model/EntityName.h"
 #include "llvm/ADT/StringRef.h"
 #include <optional>
@@ -42,6 +44,30 @@ std::optional<EntityName> getEntityName(const Decl *D);
 /// \return An EntityName for the function's return entity.
 std::optional<EntityName> getEntityNameForReturn(const FunctionDecl *FD);
 
+/// Computes the SSAF linkage of a declaration.
+///
+/// \param D The declaration to classify. Must not be null.
+EntityLinkageType getLinkageForDecl(const Decl *D);
+
+/// Returns the EntityName qualified with the build namespaces
+/// it would carry after linking into \p LUNamespace.
+///
+/// \param D The declaration to map. Must not be null.
+/// \param TUNamespace The CompilationUnit namespace of a translation unit.
+/// \param LUNamespace The LinkUnit namespace the translation unit links into.
+/// \return The qualified EntityName if the declaration can be mapped,
+/// std::nullopt otherwise.
+std::optional<EntityName>
+getQualifiedEntityName(const Decl *D, const NestedBuildNamespace &TUNamespace,
+                       const NestedBuildNamespace &LUNamespace);
+
+/// Similar to `getQualifiedEntityName`, but for entities of function return
+/// values.
+std::optional<EntityName>
+getQualifiedEntityNameForReturn(const FunctionDecl *FD,
+                                const NestedBuildNamespace &TUNamespace,
+                                const NestedBuildNamespace &LUNamespace);
+
 } // namespace clang::ssaf
 
 #endif // LLVM_CLANG_SCALABLESTATICANALYSIS_CORE_ASTENTITYMAPPING_H
diff --git a/clang/include/clang/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.h b/clang/include/clang/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.h
index 2df3ad1c9cf3c..4997e439873c8 100644
--- a/clang/include/clang/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.h
+++ b/clang/include/clang/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.h
@@ -17,6 +17,7 @@
 #define LLVM_CLANG_SCALABLESTATICANALYSIS_CORE_ENTITYLINKER_ENTITYLINKER_H
 
 #include "clang/ScalableStaticAnalysis/Core/EntityLinker/LUSummaryEncoding.h"
+#include "clang/ScalableStaticAnalysis/Core/Model/EntityLinkage.h"
 #include "llvm/Support/Error.h"
 #include "llvm/TargetParser/Triple.h"
 #include <cstddef>
@@ -31,6 +32,14 @@ class MultiArchStaticLibrary;
 class StaticLibrary;
 class TUSummaryEncoding;
 
+/// Computes the build namespace an entity should carry after linking, given its
+/// linkage.
+NestedBuildNamespace
+resolveNamespace(const NestedBuildNamespace &LUNamespace,
+                 const NestedBuildNamespace &TUNamespace,
+                 const NestedBuildNamespace &EntityNamespace,
+                 EntityLinkageType Linkage);
+
 class EntityLinker {
   LUSummaryEncoding Output;
 
diff --git a/clang/include/clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h b/clang/include/clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h
index 4e4368a06ed89..e29af3bfa26f9 100644
--- a/clang/include/clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h
+++ b/clang/include/clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h
@@ -105,6 +105,13 @@ class NestedBuildNamespace {
   static NestedBuildNamespace
   makeCompilationUnit(llvm::StringRef CompilationId);
 
+  /// Creates a NestedBuildNamespace representing a link unit.
+  ///
+  /// \param LinkUnitId The unique identifier for the link unit.
+  /// \returns A NestedBuildNamespace containing a single LinkUnit
+  ///          BuildNamespace.
+  static NestedBuildNamespace makeLinkUnit(llvm::StringRef LinkUnitId);
+
   /// Creates a new NestedBuildNamespace by appending additional namespace.
   ///
   /// \param Namespace The namespace to append.
diff --git a/clang/include/clang/ScalableStaticAnalysis/SourceTransformation/Transformation.h b/clang/include/clang/ScalableStaticAnalysis/SourceTransformation/Transformation.h
index fae222cda0e84..5416facab0dd4 100644
--- a/clang/include/clang/ScalableStaticAnalysis/SourceTransformation/Transformation.h
+++ b/clang/include/clang/ScalableStaticAnalysis/SourceTransformation/Transformation.h
@@ -21,14 +21,17 @@
 
 namespace clang::ssaf {
 
+class SSAFOptions;
+
 class Transformation : public clang::ASTConsumer {
 public:
-  Transformation(const WPASuite &Suite, SourceEditEmitter &Edits,
-                 TransformationReportEmitter &Report)
-      : Suite(Suite), Edits(Edits), Report(Report) {}
+  Transformation(const WPASuite &Suite, const SSAFOptions &Opts,
+                 SourceEditEmitter &Edits, TransformationReportEmitter &Report)
+      : Suite(Suite), Opts(Opts), Edits(Edits), Report(Report) {}
 
 protected:
   const WPASuite &Suite;
+  const SSAFOptions &Opts;
   SourceEditEmitter &Edits;
   TransformationReportEmitter &Report;
 };
diff --git a/clang/include/clang/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.h b/clang/include/clang/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.h
index eefb841af4fe3..2663d42481338 100644
--- a/clang/include/clang/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.h
+++ b/clang/include/clang/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.h
@@ -48,7 +48,7 @@ bool isTransformationRegistered(llvm::StringRef Name);
 /// It's a fatal error if there is no transformation registered with the name.
 std::unique_ptr<Transformation>
 makeTransformation(llvm::StringRef Name, const WPASuite &Suite,
-                   SourceEditEmitter &Edits,
+                   const SSAFOptions &Opts, SourceEditEmitter &Edits,
                    TransformationReportEmitter &Report);
 
 /// Print the list of available Transformations.
@@ -56,8 +56,8 @@ void printAvailableTransformations(llvm::raw_ostream &OS);
 
 // Registry for adding new Transformation implementations.
 using TransformationRegistry =
-    llvm::Registry<Transformation, const WPASuite &, SourceEditEmitter &,
-                   TransformationReportEmitter &>;
+    llvm::Registry<Transformation, const WPASuite &, const SSAFOptions &,
+                   SourceEditEmitter &, TransformationReportEmitter &>;
 
 } // namespace clang::ssaf
 
diff --git a/clang/lib/ScalableStaticAnalysis/Core/ASTEntityMapping.cpp b/clang/lib/ScalableStaticAnalysis/Core/ASTEntityMapping.cpp
index 1f4bf0da274ed..6bbb4ef6f18e0 100644
--- a/clang/lib/ScalableStaticAnalysis/Core/ASTEntityMapping.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Core/ASTEntityMapping.cpp
@@ -12,9 +12,11 @@
 
 #include "clang/ScalableStaticAnalysis/Core/ASTEntityMapping.h"
 #include "clang/AST/Decl.h"
+#include "clang/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.h"
 #include "clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h"
 #include "clang/UnifiedSymbolResolution/USRGeneration.h"
 #include "llvm/ADT/SmallString.h"
+#include "llvm/Support/ErrorHandling.h"
 
 namespace clang::ssaf {
 
@@ -80,4 +82,66 @@ std::optional<EntityName> getEntityNameForReturn(const FunctionDecl *FD) {
   return EntityName(USRBuf.str(), /*Suffix=*/"0", /*Namespace=*/{});
 }
 
+EntityLinkageType getLinkageForDecl(const Decl *D) {
+  const auto *ND = dyn_cast<NamedDecl>(D);
+  if (!ND)
+    return EntityLinkageType::None;
+
+  // Parameters have no linkage in C++, but SSAF needs them to inherit
+  // the external linkage from their parent functions.
+  // Here is why:
+  //   SSAF treats parameters as entities and may not always associate them back
+  //   to their parent functions. Therefore, it needs to identify parameters of
+  //   functions with external linkage across different TUs. Treating them as
+  //   having no linkage (as in C++) causes the same parameter in different TUs
+  //   to be assigned different EntityIDs. As a result, the behavior of the
+  //   parameter across multiple TUs cannot be correlated.
+  if (const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
+    if (const auto *FD = llvm::dyn_cast_or_null<FunctionDecl>(
+            PVD->getParentFunctionOrMethod())) {
+      return getLinkageForDecl(FD);
+    }
+  }
+
+  switch (ND->getFormalLinkage()) {
+  case Linkage::Invalid: {
+    llvm_unreachable("Shouldn't be invalid");
+  }
+  case Linkage::None:
+    return EntityLinkageType::None;
+  case Linkage::Internal:
+    return EntityLinkageType::Internal;
+  case Linkage::UniqueExternal:
+    return EntityLinkageType::Internal;
+  case Linkage::VisibleNone:
+    return EntityLinkageType::Internal;
+  case Linkage::Module:
+    return EntityLinkageType::External;
+  case Linkage::External:
+    return EntityLinkageType::External;
+  }
+  llvm_unreachable("Unhandled clang::Linkage kind");
+}
+
+std::optional<EntityName>
+getQualifiedEntityName(const Decl *D, const NestedBuildNamespace &TUNamespace,
+                       const NestedBuildNamespace &LUNamespace) {
+  std::optional<EntityName> Name = getEntityName(D);
+  if (!Name)
+    return std::nullopt;
+  return Name->makeQualified(resolveNamespace(
+      LUNamespace, TUNamespace, /*EntityNamespace=*/{}, getLinkageForDecl(D)));
+}
+
+std::optional<EntityName>
+getQualifiedEntityNameForReturn(const FunctionDecl *FD,
+                                const NestedBuildNamespace &TUNamespace,
+                                const NestedBuildNamespace &LUNamespace) {
+  std::optional<EntityName> Name = getEntityNameForReturn(FD);
+  if (!Name)
+    return std::nullopt;
+  return Name->makeQualified(resolveNamespace(
+      LUNamespace, TUNamespace, /*EntityNamespace=*/{}, getLinkageForDecl(FD)));
+}
+
 } // namespace clang::ssaf
diff --git a/clang/lib/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.cpp b/clang/lib/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.cpp
index b703efd8324fb..ff171f33310ab 100644
--- a/clang/lib/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Core/EntityLinker/EntityLinker.cpp
@@ -60,11 +60,11 @@ static constexpr const char *NoMemberForTargetTriple =
 
 } // namespace ErrorMessages
 
-static NestedBuildNamespace
-resolveNamespace(const NestedBuildNamespace &LUNamespace,
-                 const NestedBuildNamespace &TUNamespace,
-                 const NestedBuildNamespace &EntityNamespace,
-                 EntityLinkageType Linkage) {
+NestedBuildNamespace
+clang::ssaf::resolveNamespace(const NestedBuildNamespace &LUNamespace,
+                              const NestedBuildNamespace &TUNamespace,
+                              const NestedBuildNamespace &EntityNamespace,
+                              EntityLinkageType Linkage) {
   switch (Linkage) {
   case EntityLinkageType::None:
   case EntityLinkageType::Internal:
diff --git a/clang/lib/ScalableStaticAnalysis/Core/Model/BuildNamespace.cpp b/clang/lib/ScalableStaticAnalysis/Core/Model/BuildNamespace.cpp
index 345f375788014..a8fa90e509091 100644
--- a/clang/lib/ScalableStaticAnalysis/Core/Model/BuildNamespace.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Core/Model/BuildNamespace.cpp
@@ -44,6 +44,14 @@ NestedBuildNamespace::makeCompilationUnit(llvm::StringRef CompilationId) {
   return Result;
 }
 
+NestedBuildNamespace
+NestedBuildNamespace::makeLinkUnit(llvm::StringRef LinkUnitId) {
+  NestedBuildNamespace Result;
+  Result.Namespaces.push_back(
+      BuildNamespace(BuildNamespaceKind::LinkUnit, LinkUnitId));
+  return Result;
+}
+
 bool NestedBuildNamespace::empty() const { return Namespaces.empty(); }
 
 bool NestedBuildNamespace::operator==(const NestedBuildNamespace &Other) const {
diff --git a/clang/lib/ScalableStaticAnalysis/Core/TUSummary/TUSummaryExtractor.cpp b/clang/lib/ScalableStaticAnalysis/Core/TUSummary/TUSummaryExtractor.cpp
index 40205b90a4eb6..0bce1a1aebf45 100644
--- a/clang/lib/ScalableStaticAnalysis/Core/TUSummary/TUSummaryExtractor.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Core/TUSummary/TUSummaryExtractor.cpp
@@ -19,47 +19,6 @@
 using namespace clang;
 using namespace ssaf;
 
-static EntityLinkageType getLinkageForDecl(const Decl *D) {
-  const auto *ND = dyn_cast<NamedDecl>(D);
-  if (!ND)
-    return EntityLinkageType::None;
-
-  // Parameters have no linkage in C++, but SSAF needs them to inherit
-  // the external linkage from their parent functions.
-  // Here is why:
-  //   SSAF treats parameters as entities and may not always associate them back
-  //   to their parent functions. Therefore, it needs to identify parameters of
-  //   functions with external linkage across different TUs. Treating them as
-  //   having no linkage (as in C++) causes the same parameter in different TUs
-  //   to be assigned different EntityIDs. As a result, the behavior of the
-  //   parameter across multiple TUs cannot be correlated.
-  if (const auto *PVD = dyn_cast<ParmVarDecl>(D)) {
-    if (const auto *FD = llvm::dyn_cast_or_null<FunctionDecl>(
-            PVD->getParentFunctionOrMethod())) {
-      return getLinkageForDecl(FD);
-    }
-  }
-
-  switch (ND->getFormalLinkage()) {
-  case Linkage::Invalid: {
-    llvm_unreachable("Shouldn't be invalid");
-  }
-  case Linkage::None:
-    return EntityLinkageType::None;
-  case Linkage::Internal:
-    return EntityLinkageType::Internal;
-  case Linkage::UniqueExternal:
-    return EntityLinkageType::Internal;
-  case Linkage::VisibleNone:
-    return EntityLinkageType::Internal;
-  case Linkage::Module:
-    return EntityLinkageType::External;
-  case Linkage::External:
-    return EntityLinkageType::External;
-  }
-  llvm_unreachable("Unhandled clang::Linkage kind");
-}
-
 std::optional<EntityId> TUSummaryExtractor::addEntity(const NamedDecl *D) {
   auto Name = getEntityName(D);
   if (!Name)
diff --git a/clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp b/clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp
index 4983d5e241e0f..ed8725b6aea24 100644
--- a/clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp
@@ -206,7 +206,7 @@ SourceTransformationRunner::SourceTransformationRunner(WPASuite Suite,
   // their lifetimes — those references are captured in its base ctor.
   std::vector<std::unique_ptr<ASTConsumer>> Consumers;
   Consumers.push_back(makeTransformation(Opts.SourceTransformation, this->Suite,
-                                         Edits, Report));
+                                         Opts, Edits, Report));
   assert(Consumers.front());
   MultiplexConsumer::Consumers = std::move(Consumers);
 }
diff --git a/clang/lib/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.cpp b/clang/lib/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.cpp
index 6be42cc75b4d8..b5faa4fb59fa4 100644
--- a/clang/lib/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.cpp
+++ b/clang/lib/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.cpp
@@ -28,11 +28,11 @@ bool ssaf::isTransformationRegistered(llvm::StringRef Name) {
 
 std::unique_ptr<Transformation>
 ssaf::makeTransformation(llvm::StringRef Name, const WPASuite &Suite,
-                         SourceEditEmitter &Edits,
+                         const SSAFOptions &Opts, SourceEditEmitter &Edits,
                          TransformationReportEmitter &Report) {
   for (const auto &Entry : TransformationRegistry::entries())
     if (Entry.getName() == Name)
-      return Entry.instantiate(Suite, Edits, Report);
+      return Entry.instantiate(Suite, Opts, Edits, Report);
   assert(false && "Unknown Transformation name");
   return nullptr;
 }
diff --git a/clang/unittests/ScalableStaticAnalysis/ASTEntityMappingTest.cpp b/clang/unittests/ScalableStaticAnalysis/ASTEntityMappingTest.cpp
index c34e92cb9fa5d..7553e4283d163 100644
--- a/clang/unittests/ScalableStaticAnalysis/ASTEntityMappingTest.cpp
+++ b/clang/unittests/ScalableStaticAnalysis/ASTEntityMappingTest.cpp
@@ -13,6 +13,7 @@
 #include "clang/AST/DeclCXX.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h"
 #include "clang/Tooling/Tooling.h"
 #include "gtest/gtest.h"
 
@@ -337,5 +338,39 @@ TEST(ASTEntityMappingTest, FunctionReturnRedeclaration) {
   }
 }
 
+// getQualifiedEntityName / getQualifiedEntityNameForReturn tests
+
+TEST(ASTEntityMappingTest, QualifiedNameFollowsLinkage) {
+  auto AST = tooling::buildASTFromCode(R"cpp(
+    void ext() {}
+    static void internal() {}
+  )cpp");
+  auto &Ctx = AST->getASTContext();
+
+  const auto *Ext = findFnByName("ext", Ctx);
+  const auto *Internal = findFnByName("internal", Ctx);
+  ASSERT_TRUE(Ext);
+  ASSERT_TRUE(Internal);
+
+  auto TUNamespace = NestedBuildNamespace::makeCompilationUnit("tu1.cpp");
+  auto LUNamespace = NestedBuildNamespace::makeLinkUnit("lu1");
+  auto BareExt = getEntityName(Ext);
+  auto BareInternal = getEntityName(Internal);
+  auto BareExtReturn = getEntityNameForReturn(Ext);
+  ASSERT_TRUE(BareExt && BareInternal && BareExtReturn);
+
+  // External linkage is qualified with the LU namespace only, not the TU's.
+  ASSERT_TRUE(getQualifiedEntityName(Ext, TUNamespace, LUNamespace) ==
+              BareExt->makeQualified(LUNamespace));
+  // Internal linkage is qualified with the TU namespace first, then the LU's.
+  ASSERT_TRUE(
+      getQualifiedEntityName(Internal, TUNamespace, LUNamespace) ==
+      BareInternal->makeQualified(TUNamespace).makeQualified(LUNamespace));
+  // getQualifiedEntityNameForReturn follows the same linkage-based rule.
+  ASSERT_TRUE(
+      getQualifiedEntityNameForReturn(Ext, TUNamespace, LUNamespace) ==
+      BareExtReturn->makeQualified(LUNamespace));
+}
+
 } // namespace
 } // namespace clang::ssaf
diff --git a/clang/unittests/ScalableStaticAnalysis/SourceTransformation/CppBoundedBuffersTest.cpp b/clang/unittests/ScalableStaticAnalysis/SourceTransformation/CppBoundedBuffersTest.cpp
index a04070c50270a..5f44260612404 100644
--- a/clang/unittests/ScalableStaticAnalysis/SourceTransformation/CppBoundedBuffersTest.cpp
+++ b/clang/unittests/ScalableStaticAnalysis/SourceTransformation/CppBoundedBuffersTest.cpp
@@ -12,6 +12,7 @@
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/Decl.h"
 #include "clang/Basic/Sarif.h"
+#include "clang/Frontend/SSAFOptions.h"
 #include "clang/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.h"
 #include "clang/ScalableStaticAnalysis/Analyses/UnsafeBufferUsage/UnsafeBufferUsageAnalysis.h"
 #include "clang/ScalableStaticAnalysis/Core/ASTEntityMapping.h"
@@ -120,7 +121,8 @@ class CppBoundedBuffersTest : public TestFixture {
 
     RecordingEditEmitter Edits;
     RecordingReportEmitter Report;
-    CppBoundedBuffers(Suite, Edits, Report).HandleTranslationUnit(Ctx);
+    SSAFOptions Opts;
+    CppBoundedBuffers(Suite, Opts, Edits, Report).HandleTranslationUnit(Ctx);
 
     tooling::Replacements Replacements;
     for (const tooling::Replacement &R : Edits.Replacements)
diff --git a/clang/unittests/ScalableStaticAnalysis/SourceTransformation/RegistryTest.cpp b/clang/unittests/ScalableStaticAnalysis/SourceTransformation/RegistryTest.cpp
index 3fa24920c20a4..c8b45ca890cea 100644
--- a/clang/unittests/ScalableStaticAnalysis/SourceTransformation/RegistryTest.cpp
+++ b/clang/unittests/ScalableStaticAnalysis/SourceTransformation/RegistryTest.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "TestFixture.h"
+#include "clang/Frontend/SSAFOptions.h"
 #include "clang/ScalableStaticAnalysis/SourceTransformation/Transformation.h"
 #include "clang/ScalableStaticAnalysis/SourceTransformation/TransformationRegistry.h"
 #include "llvm/ADT/STLExtras.h"
@@ -52,10 +53,11 @@ TEST_F(TransformationRegistryTest, isTransformationRegistered) {
 
 TEST_F(TransformationRegistryTest, makeTransformation) {
   WPASuite Suite = makeWPASuite();
+  SSAFOptions Opts;
   StubEditEmitter Edits;
   StubReport...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/219033


More information about the llvm-branch-commits mailing list