Skip to content

Commit c6ec954

Browse files
committed
use multimap over MapVector
Signed-off-by: Justin Stitt <[email protected]>
1 parent 845da1d commit c6ec954

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
@@ -2724,23 +2724,24 @@ static void flushDiagnostics(Sema &S, const sema::FunctionScopeInfo *fscope) {
27242724
S.Diag(D.Loc, D.PD);
27252725
}
27262726

2727+
template <typename Iterator>
27272728
void sema::AnalysisBasedWarnings::EmitPossiblyUnreachableDiags(
2728-
AnalysisDeclContext &AC,
2729-
SmallVector<clang::sema::PossiblyUnreachableDiag, 4> PUDs) {
2729+
AnalysisDeclContext &AC, std::pair<Iterator, Iterator> PUDs) {
27302730

2731-
if (PUDs.empty())
2731+
if (PUDs.first == PUDs.second)
27322732
return;
27332733

2734-
for (const auto &D : PUDs) {
2735-
for (const Stmt *S : D.Stmts)
2734+
for (auto I = PUDs.first; I != PUDs.second; ++I) {
2735+
for (const Stmt *S : I->Stmts)
27362736
AC.registerForcedBlockExpression(S);
27372737
}
27382738

27392739
if (AC.getCFG()) {
27402740
CFGReverseBlockReachabilityAnalysis *Analysis =
27412741
AC.getCFGReachablityAnalysis();
27422742

2743-
for (const auto &D : PUDs) {
2743+
for (auto I = PUDs.first; I != PUDs.second; ++I) {
2744+
const auto &D = *I;
27442745
if (llvm::all_of(D.Stmts, [&](const Stmt *St) {
27452746
const CFGBlock *Block = AC.getBlockForRegisteredExpression(St);
27462747
if (Block && Analysis)
@@ -2752,14 +2753,14 @@ void sema::AnalysisBasedWarnings::EmitPossiblyUnreachableDiags(
27522753
}
27532754
}
27542755
} else {
2755-
for (const auto &D : PUDs)
2756-
S.Diag(D.Loc, D.PD);
2756+
for (auto I = PUDs.first; I != PUDs.second; ++I)
2757+
S.Diag(I->Loc, I->PD);
27572758
}
27582759
}
27592760

27602761
void sema::AnalysisBasedWarnings::RegisterVarDeclWarning(
27612762
VarDecl *VD, clang::sema::PossiblyUnreachableDiag PUD) {
2762-
VarDeclPossiblyUnreachableDiags[VD].emplace_back(PUD);
2763+
VarDeclPossiblyUnreachableDiags.emplace(VD, PUD);
27632764
}
27642765

27652766
void sema::AnalysisBasedWarnings::IssueWarningsForRegisteredVarDecl(
@@ -2777,7 +2778,11 @@ void sema::AnalysisBasedWarnings::IssueWarningsForRegisteredVarDecl(
27772778
AC.getCFGBuildOptions().AddCXXNewAllocator = false;
27782779
AC.getCFGBuildOptions().AddCXXDefaultInitExprInCtors = true;
27792780

2780-
EmitPossiblyUnreachableDiags(AC, VarDeclPossiblyUnreachableDiags[VD]);
2781+
auto Range = VarDeclPossiblyUnreachableDiags.equal_range(VD);
2782+
auto SecondRange =
2783+
llvm::make_second_range(llvm::make_range(Range.first, Range.second));
2784+
EmitPossiblyUnreachableDiags(
2785+
AC, std::make_pair(SecondRange.begin(), SecondRange.end()));
27812786
}
27822787

27832788
// An AST Visitor that calls a callback function on each callable DEFINITION
@@ -2991,7 +2996,8 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
29912996
}
29922997

29932998
// Emit delayed diagnostics.
2994-
EmitPossiblyUnreachableDiags(AC, fscope->PossiblyUnreachableDiags);
2999+
auto &PUDs = fscope->PossiblyUnreachableDiags;
3000+
EmitPossiblyUnreachableDiags(AC, std::make_pair(PUDs.begin(), PUDs.end()));
29953001

29963002
// Warning: check missing 'return'
29973003
if (P.enableCheckFallThrough) {

0 commit comments

Comments
 (0)