@@ -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>
27272728void  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
27602761void  sema::AnalysisBasedWarnings::RegisterVarDeclWarning (
27612762    VarDecl *VD, clang::sema::PossiblyUnreachableDiag PUD) {
2762-   VarDeclPossiblyUnreachableDiags[VD]. emplace_back ( PUD);
2763+   VarDeclPossiblyUnreachableDiags. emplace (VD,  PUD);
27632764}
27642765
27652766void  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