aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Sema/Overload.h11
-rw-r--r--lib/Sema/SemaOverload.cpp7
2 files changed, 11 insertions, 7 deletions
diff --git a/include/clang/Sema/Overload.h b/include/clang/Sema/Overload.h
index 3efbddc871..24adce8f35 100644
--- a/include/clang/Sema/Overload.h
+++ b/include/clang/Sema/Overload.h
@@ -691,8 +691,7 @@ namespace clang {
// Allocator for OverloadCandidate::Conversions. We store the first few
// elements inline to avoid allocation for small sets.
- llvm::SpecificBumpPtrAllocator<ImplicitConversionSequence>
- ConversionSequenceAllocator;
+ llvm::BumpPtrAllocator ConversionSequenceAllocator;
SourceLocation Loc;
@@ -704,6 +703,11 @@ namespace clang {
public:
OverloadCandidateSet(SourceLocation Loc) : Loc(Loc), NumInlineSequences(0){}
+ ~OverloadCandidateSet() {
+ for (iterator i = begin(), e = end(); i != e; ++i)
+ for (unsigned ii = 0, ie = i->NumConversions; ii != ie; ++ii)
+ i->Conversions[ii].~ImplicitConversionSequence();
+ }
SourceLocation getLocation() const { return Loc; }
@@ -738,7 +742,8 @@ namespace clang {
NumInlineSequences += NumConversions;
} else {
// Otherwise get memory from the allocator.
- C.Conversions = ConversionSequenceAllocator.Allocate(NumConversions);
+ C.Conversions = ConversionSequenceAllocator
+ .Allocate<ImplicitConversionSequence>(NumConversions);
}
// Construct the new objects.
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 2706aeaf1d..5044f1c1df 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -541,11 +541,10 @@ OverloadCandidate::DeductionFailureInfo::getSecondArg() {
}
void OverloadCandidateSet::clear() {
- for (unsigned i = 0, e = NumInlineSequences; i != e; ++i)
- reinterpret_cast<ImplicitConversionSequence*>(InlineSpace)[i]
- .~ImplicitConversionSequence();
+ for (iterator i = begin(), e = end(); i != e; ++i)
+ for (unsigned ii = 0, ie = i->NumConversions; ii != ie; ++ii)
+ i->Conversions[ii].~ImplicitConversionSequence();
NumInlineSequences = 0;
- ConversionSequenceAllocator.DestroyAll();
Candidates.clear();
Functions.clear();
}