@@ -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>
27372738void 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
27702771void sema::AnalysisBasedWarnings::RegisterVarDeclWarning (
27712772 VarDecl *VD, clang::sema::PossiblyUnreachableDiag PUD) {
2772- VarDeclPossiblyUnreachableDiags[VD]. emplace_back ( PUD);
2773+ VarDeclPossiblyUnreachableDiags. emplace (VD, PUD);
27732774}
27742775
27752776void 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