Author: Daniel Grumberg Date: 2022-03-19T00:49:37Z New Revision: fc3537697db7724834d8071cfee10cacceb9fc2a
URL: https://github.com/llvm/llvm-project/commit/fc3537697db7724834d8071cfee10cacceb9fc2a DIFF: https://github.com/llvm/llvm-project/commit/fc3537697db7724834d8071cfee10cacceb9fc2a.diff LOG: Ensure that APIRecords get destroyed correctly. Implements an APISet specific unique ptr type that has a custom deleter that just calls the underlying APIRecord subclass destructor. Added: Modified: clang/include/clang/SymbolGraph/API.h clang/lib/SymbolGraph/API.cpp clang/test/SymbolGraph/global_record.c Removed: ################################################################################ diff --git a/clang/include/clang/SymbolGraph/API.h b/clang/include/clang/SymbolGraph/API.h index 541673f36b223..ffcc03758f4d2 100644 --- a/clang/include/clang/SymbolGraph/API.h +++ b/clang/include/clang/SymbolGraph/API.h @@ -24,6 +24,7 @@ #include "llvm/ADT/Triple.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Casting.h" +#include <memory> namespace clang { namespace symbolgraph { @@ -120,7 +121,25 @@ class APISet { StringRef copyString(StringRef String, llvm::BumpPtrAllocator &Allocator); StringRef copyString(StringRef String); - using GlobalRecordMap = llvm::MapVector<StringRef, GlobalRecord *>; +private: + /// \brief A custom deleter used for ``std::unique_ptr`` to APIRecords stored + /// in the BumpPtrAllocator. + /// + /// \tparam T the exact type of the APIRecord subclass. + template <typename T> struct UniquePtrBumpPtrAllocatorDeleter { + void operator()(T *Instance) { Instance->~T(); } + }; + +public: + /// A unique pointer to an APIRecord stored in the BumpPtrAllocator. + /// + /// \tparam T the exact type of the APIRecord subclass. + template <typename T> + using APIRecordUniquePtr = + std::unique_ptr<T, UniquePtrBumpPtrAllocatorDeleter<T>>; + + using GlobalRecordMap = + llvm::MapVector<StringRef, APIRecordUniquePtr<GlobalRecord>>; const GlobalRecordMap &getGlobals() const { return Globals; } diff --git a/clang/lib/SymbolGraph/API.cpp b/clang/lib/SymbolGraph/API.cpp index 4066428c97fc9..69e7469425c98 100644 --- a/clang/lib/SymbolGraph/API.cpp +++ b/clang/lib/SymbolGraph/API.cpp @@ -32,12 +32,12 @@ GlobalRecord *APISet::addGlobal(GVKind Kind, StringRef Name, StringRef USR, FunctionSignature Signature) { auto Result = Globals.insert({Name, nullptr}); if (Result.second) { - GlobalRecord *Record = new (Allocator) - GlobalRecord{Kind, Name, USR, Loc, Availability, - Linkage, Comment, Fragments, SubHeading, Signature}; - Result.first->second = Record; + auto Record = APIRecordUniquePtr<GlobalRecord>(new (Allocator) GlobalRecord{ + Kind, Name, USR, Loc, Availability, Linkage, Comment, Fragments, + SubHeading, Signature}); + Result.first->second = std::move(Record); } - return Result.first->second; + return Result.first->second.get(); } GlobalRecord * diff --git a/clang/test/SymbolGraph/global_record.c b/clang/test/SymbolGraph/global_record.c index c1baaf260fd10..fa577ee29b17d 100644 --- a/clang/test/SymbolGraph/global_record.c +++ b/clang/test/SymbolGraph/global_record.c @@ -1,5 +1,3 @@ -// FIXME: disable the test to unblock build bots -// UNSUPPORTED: true // RUN: rm -rf %t // RUN: split-file %s %t // RUN: sed -e "s@INPUT_DIR@%/t@g" %t/reference.output.json.in >> \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits