Skip to content

Commit 6cb0362

Browse files
committed
use multimap over MapVector
Signed-off-by: Justin Stitt <[email protected]>
1 parent 6216177 commit 6cb0362

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

clang/include/clang/Sema/AnalysisBasedWarnings.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class AnalysisBasedWarnings {
6161

6262
enum VisitFlag { NotVisited = 0, Visited = 1, Pending = 2 };
6363
llvm::DenseMap<const FunctionDecl*, VisitFlag> VisitedFD;
64-
llvm::MapVector<VarDecl *, SmallVector<PossiblyUnreachableDiag, 4>>
64+
std::multimap<VarDecl *, PossiblyUnreachableDiag>
6565
VarDeclPossiblyUnreachableDiags;
6666

6767
Policy PolicyOverrides;
@@ -127,9 +127,9 @@ class AnalysisBasedWarnings {
127127

128128
void PrintStats() const;
129129

130-
void
131-
EmitPossiblyUnreachableDiags(AnalysisDeclContext &AC,
132-
SmallVector<PossiblyUnreachableDiag, 4> PUDs);
130+
template <typename Iterator>
131+
void EmitPossiblyUnreachableDiags(AnalysisDeclContext &AC,
132+
std::pair<Iterator, Iterator> PUDs);
133133
};
134134

135135
} // namespace sema

clang/lib/Sema/AnalysisBasedWarnings.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2734,23 +2734,24 @@ static void flushDiagnostics(Sema &S, const sema::FunctionScopeInfo *fscope) {
27342734
S.Diag(D.Loc, D.PD);
27352735
}
27362736

2737+
template <typename Iterator>
27372738
void sema::AnalysisBasedWarnings::EmitPossiblyUnreachableDiags(
2738-
AnalysisDeclContext &AC,
2739-
SmallVector<clang::sema::PossiblyUnreachableDiag, 4> PUDs) {
2739+
AnalysisDeclContext &AC, std::pair<Iterator, Iterator> PUDs) {
27402740

2741-
if (PUDs.empty())
2741+
if (PUDs.first == PUDs.second)
27422742
return;
27432743

2744-
for (const auto &D : PUDs) {
2745-
for (const Stmt *S : D.Stmts)
2744+
for (auto I = PUDs.first; I != PUDs.second; ++I) {
2745+
for (const Stmt *S : I->Stmts)
27462746
AC.registerForcedBlockExpression(S);
27472747
}
27482748

27492749
if (AC.getCFG()) {
27502750
CFGReverseBlockReachabilityAnalysis *Analysis =
27512751
AC.getCFGReachablityAnalysis();
27522752

2753-
for (const auto &D : PUDs) {
2753+
for (auto I = PUDs.first; I != PUDs.second; ++I) {
2754+
const auto &D = *I;
27542755
if (llvm::all_of(D.Stmts, [&](const Stmt *St) {
27552756
const CFGBlock *Block = AC.getBlockForRegisteredExpression(St);
27562757
if (Block && Analysis)
@@ -2762,14 +2763,14 @@ void sema::AnalysisBasedWarnings::EmitPossiblyUnreachableDiags(
27622763
}
27632764
}
27642765
} else {
2765-
for (const auto &D : PUDs)
2766-
S.Diag(D.Loc, D.PD);
2766+
for (auto I = PUDs.first; I != PUDs.second; ++I)
2767+
S.Diag(I->Loc, I->PD);
27672768
}
27682769
}
27692770

27702771
void sema::AnalysisBasedWarnings::RegisterVarDeclWarning(
27712772
VarDecl *VD, clang::sema::PossiblyUnreachableDiag PUD) {
2772-
VarDeclPossiblyUnreachableDiags[VD].emplace_back(PUD);
2773+
VarDeclPossiblyUnreachableDiags.emplace(VD, PUD);
27732774
}
27742775

27752776
void sema::AnalysisBasedWarnings::IssueWarningsForRegisteredVarDecl(
@@ -2787,7 +2788,11 @@ void sema::AnalysisBasedWarnings::IssueWarningsForRegisteredVarDecl(
27872788
AC.getCFGBuildOptions().AddCXXNewAllocator = false;
27882789
AC.getCFGBuildOptions().AddCXXDefaultInitExprInCtors = true;
27892790

2790-
EmitPossiblyUnreachableDiags(AC, VarDeclPossiblyUnreachableDiags[VD]);
2791+
auto Range = VarDeclPossiblyUnreachableDiags.equal_range(VD);
2792+
auto SecondRange =
2793+
llvm::make_second_range(llvm::make_range(Range.first, Range.second));
2794+
EmitPossiblyUnreachableDiags(
2795+
AC, std::make_pair(SecondRange.begin(), SecondRange.end()));
27912796
}
27922797

27932798
// An AST Visitor that calls a callback function on each callable DEFINITION
@@ -3001,7 +3006,8 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
30013006
}
30023007

30033008
// Emit delayed diagnostics.
3004-
EmitPossiblyUnreachableDiags(AC, fscope->PossiblyUnreachableDiags);
3009+
auto &PUDs = fscope->PossiblyUnreachableDiags;
3010+
EmitPossiblyUnreachableDiags(AC, std::make_pair(PUDs.begin(), PUDs.end()));
30053011

30063012
// Warning: check missing 'return'
30073013
if (P.enableCheckFallThrough) {

0 commit comments

Comments
 (0)