1 //=- AnalysisBasedWarnings.cpp - Sema warnings based on libAnalysis -*- C++ -*-=//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines analysis_warnings::[Policy,Executor].
11 // Together they are used by Sema to issue warnings based on inexpensive
12 // static analysis algorithms in libAnalysis.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "clang/Sema/AnalysisBasedWarnings.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclObjC.h"
19 #include "clang/AST/EvaluatedExprVisitor.h"
20 #include "clang/AST/ExprCXX.h"
21 #include "clang/AST/ExprObjC.h"
22 #include "clang/AST/ParentMap.h"
23 #include "clang/AST/RecursiveASTVisitor.h"
24 #include "clang/AST/StmtCXX.h"
25 #include "clang/AST/StmtObjC.h"
26 #include "clang/AST/StmtVisitor.h"
27 #include "clang/Analysis/Analyses/CFGReachabilityAnalysis.h"
28 #include "clang/Analysis/Analyses/Consumed.h"
29 #include "clang/Analysis/Analyses/ReachableCode.h"
30 #include "clang/Analysis/Analyses/ThreadSafety.h"
31 #include "clang/Analysis/Analyses/UninitializedValues.h"
32 #include "clang/Analysis/AnalysisDeclContext.h"
33 #include "clang/Analysis/CFG.h"
34 #include "clang/Analysis/CFGStmtMap.h"
35 #include "clang/Basic/SourceLocation.h"
36 #include "clang/Basic/SourceManager.h"
37 #include "clang/Lex/Preprocessor.h"
38 #include "clang/Sema/ScopeInfo.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/BitVector.h"
41 #include "llvm/ADT/MapVector.h"
42 #include "llvm/ADT/SmallString.h"
43 #include "llvm/ADT/SmallVector.h"
44 #include "llvm/ADT/StringRef.h"
45 #include "llvm/Support/Casting.h"
46 #include <algorithm>
47 #include <deque>
48 #include <iterator>
49 
50 using namespace clang;
51 
52 //===----------------------------------------------------------------------===//
53 // Unreachable code analysis.
54 //===----------------------------------------------------------------------===//
55 
56 namespace {
57   class UnreachableCodeHandler : public reachable_code::Callback {
58     Sema &S;
59     SourceRange PreviousSilenceableCondVal;
60 
61   public:
62     UnreachableCodeHandler(Sema &s) : S(s) {}
63 
64     void HandleUnreachable(reachable_code::UnreachableKind UK,
65                            SourceLocation L,
66                            SourceRange SilenceableCondVal,
67                            SourceRange R1,
68                            SourceRange R2) override {
69       // Avoid reporting multiple unreachable code diagnostics that are
70       // triggered by the same conditional value.
71       if (PreviousSilenceableCondVal.isValid() &&
72           SilenceableCondVal.isValid() &&
73           PreviousSilenceableCondVal == SilenceableCondVal)
74         return;
75       PreviousSilenceableCondVal = SilenceableCondVal;
76 
77       unsigned diag = diag::warn_unreachable;
78       switch (UK) {
79         case reachable_code::UK_Break:
80           diag = diag::warn_unreachable_break;
81           break;
82         case reachable_code::UK_Return:
83           diag = diag::warn_unreachable_return;
84           break;
85         case reachable_code::UK_Loop_Increment:
86           diag = diag::warn_unreachable_loop_increment;
87           break;
88         case reachable_code::UK_Other:
89           break;
90       }
91 
92       S.Diag(L, diag) << R1 << R2;
93 
94       SourceLocation Open = SilenceableCondVal.getBegin();
95       if (Open.isValid()) {
96         SourceLocation Close = SilenceableCondVal.getEnd();
97         Close = S.getLocForEndOfToken(Close);
98         if (Close.isValid()) {
99           S.Diag(Open, diag::note_unreachable_silence)
100             << FixItHint::CreateInsertion(Open, "/* DISABLES CODE */ (")
101             << FixItHint::CreateInsertion(Close, ")");
102         }
103       }
104     }
105   };
106 } // anonymous namespace
107 
108 /// CheckUnreachable - Check for unreachable code.
109 static void CheckUnreachable(Sema &S, AnalysisDeclContext &AC) {
110   // As a heuristic prune all diagnostics not in the main file.  Currently
111   // the majority of warnings in headers are false positives.  These
112   // are largely caused by configuration state, e.g. preprocessor
113   // defined code, etc.
114   //
115   // Note that this is also a performance optimization.  Analyzing
116   // headers many times can be expensive.
117   if (!S.getSourceManager().isInMainFile(AC.getDecl()->getLocStart()))
118     return;
119 
120   UnreachableCodeHandler UC(S);
121   reachable_code::FindUnreachableCode(AC, S.getPreprocessor(), UC);
122 }
123 
124 namespace {
125 /// \brief Warn on logical operator errors in CFGBuilder
126 class LogicalErrorHandler : public CFGCallback {
127   Sema &S;
128 
129 public:
130   LogicalErrorHandler(Sema &S) : CFGCallback(), S(S) {}
131 
132   static bool HasMacroID(const Expr *E) {
133     if (E->getExprLoc().isMacroID())
134       return true;
135 
136     // Recurse to children.
137     for (const Stmt *SubStmt : E->children())
138       if (const Expr *SubExpr = dyn_cast_or_null<Expr>(SubStmt))
139         if (HasMacroID(SubExpr))
140           return true;
141 
142     return false;
143   }
144 
145   void compareAlwaysTrue(const BinaryOperator *B, bool isAlwaysTrue) override {
146     if (HasMacroID(B))
147       return;
148 
149     SourceRange DiagRange = B->getSourceRange();
150     S.Diag(B->getExprLoc(), diag::warn_tautological_overlap_comparison)
151         << DiagRange << isAlwaysTrue;
152   }
153 
154   void compareBitwiseEquality(const BinaryOperator *B,
155                               bool isAlwaysTrue) override {
156     if (HasMacroID(B))
157       return;
158 
159     SourceRange DiagRange = B->getSourceRange();
160     S.Diag(B->getExprLoc(), diag::warn_comparison_bitwise_always)
161         << DiagRange << isAlwaysTrue;
162   }
163 };
164 } // anonymous namespace
165 
166 //===----------------------------------------------------------------------===//
167 // Check for infinite self-recursion in functions
168 //===----------------------------------------------------------------------===//
169 
170 // Returns true if the function is called anywhere within the CFGBlock.
171 // For member functions, the additional condition of being call from the
172 // this pointer is required.
173 static bool hasRecursiveCallInPath(const FunctionDecl *FD, CFGBlock &Block) {
174   // Process all the Stmt's in this block to find any calls to FD.
175   for (const auto &B : Block) {
176     if (B.getKind() != CFGElement::Statement)
177       continue;
178 
179     const CallExpr *CE = dyn_cast<CallExpr>(B.getAs<CFGStmt>()->getStmt());
180     if (!CE || !CE->getCalleeDecl() ||
181         CE->getCalleeDecl()->getCanonicalDecl() != FD)
182       continue;
183 
184     // Skip function calls which are qualified with a templated class.
185     if (const DeclRefExpr *DRE =
186             dyn_cast<DeclRefExpr>(CE->getCallee()->IgnoreParenImpCasts())) {
187       if (NestedNameSpecifier *NNS = DRE->getQualifier()) {
188         if (NNS->getKind() == NestedNameSpecifier::TypeSpec &&
189             isa<TemplateSpecializationType>(NNS->getAsType())) {
190           continue;
191         }
192       }
193     }
194 
195     const CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(CE);
196     if (!MCE || isa<CXXThisExpr>(MCE->getImplicitObjectArgument()) ||
197         !MCE->getMethodDecl()->isVirtual())
198       return true;
199   }
200   return false;
201 }
202 
203 // All blocks are in one of three states.  States are ordered so that blocks
204 // can only move to higher states.
205 enum RecursiveState {
206   FoundNoPath,
207   FoundPath,
208   FoundPathWithNoRecursiveCall
209 };
210 
211 // Returns true if there exists a path to the exit block and every path
212 // to the exit block passes through a call to FD.
213 static bool checkForRecursiveFunctionCall(const FunctionDecl *FD, CFG *cfg) {
214 
215   const unsigned ExitID = cfg->getExit().getBlockID();
216 
217   // Mark all nodes as FoundNoPath, then set the status of the entry block.
218   SmallVector<RecursiveState, 16> States(cfg->getNumBlockIDs(), FoundNoPath);
219   States[cfg->getEntry().getBlockID()] = FoundPathWithNoRecursiveCall;
220 
221   // Make the processing stack and seed it with the entry block.
222   SmallVector<CFGBlock *, 16> Stack;
223   Stack.push_back(&cfg->getEntry());
224 
225   while (!Stack.empty()) {
226     CFGBlock *CurBlock = Stack.back();
227     Stack.pop_back();
228 
229     unsigned ID = CurBlock->getBlockID();
230     RecursiveState CurState = States[ID];
231 
232     if (CurState == FoundPathWithNoRecursiveCall) {
233       // Found a path to the exit node without a recursive call.
234       if (ExitID == ID)
235         return false;
236 
237       // Only change state if the block has a recursive call.
238       if (hasRecursiveCallInPath(FD, *CurBlock))
239         CurState = FoundPath;
240     }
241 
242     // Loop over successor blocks and add them to the Stack if their state
243     // changes.
244     for (auto I = CurBlock->succ_begin(), E = CurBlock->succ_end(); I != E; ++I)
245       if (*I) {
246         unsigned next_ID = (*I)->getBlockID();
247         if (States[next_ID] < CurState) {
248           States[next_ID] = CurState;
249           Stack.push_back(*I);
250         }
251       }
252   }
253 
254   // Return true if the exit node is reachable, and only reachable through
255   // a recursive call.
256   return States[ExitID] == FoundPath;
257 }
258 
259 static void checkRecursiveFunction(Sema &S, const FunctionDecl *FD,
260                                    const Stmt *Body, AnalysisDeclContext &AC) {
261   FD = FD->getCanonicalDecl();
262 
263   // Only run on non-templated functions and non-templated members of
264   // templated classes.
265   if (FD->getTemplatedKind() != FunctionDecl::TK_NonTemplate &&
266       FD->getTemplatedKind() != FunctionDecl::TK_MemberSpecialization)
267     return;
268 
269   CFG *cfg = AC.getCFG();
270   if (!cfg) return;
271 
272   // If the exit block is unreachable, skip processing the function.
273   if (cfg->getExit().pred_empty())
274     return;
275 
276   // Emit diagnostic if a recursive function call is detected for all paths.
277   if (checkForRecursiveFunctionCall(FD, cfg))
278     S.Diag(Body->getLocStart(), diag::warn_infinite_recursive_function);
279 }
280 
281 //===----------------------------------------------------------------------===//
282 // Check for throw in a non-throwing function.
283 //===----------------------------------------------------------------------===//
284 enum ThrowState {
285   FoundNoPathForThrow,
286   FoundPathForThrow,
287   FoundPathWithNoThrowOutFunction,
288 };
289 
290 static bool isThrowCaughtByHandlers(Sema &S,
291                                     const CXXThrowExpr *CE,
292                                     const CXXTryStmt *TryStmt) {
293   for (unsigned H = 0, E = TryStmt->getNumHandlers(); H < E; ++H) {
294     QualType Caught = TryStmt->getHandler(H)->getCaughtType();
295     if (Caught.isNull() || // catch (...) catches everything
296         (CE->getSubExpr() && // throw; is only caught by ...
297          S.handlerCanCatch(Caught, CE->getSubExpr()->getType())))
298       return true;
299   }
300   return false;
301 }
302 
303 static bool doesThrowEscapePath(Sema &S, CFGBlock Block,
304                                 SourceLocation &OpLoc) {
305   for (const auto &B : Block) {
306     if (B.getKind() != CFGElement::Statement)
307       continue;
308     const auto *CE = dyn_cast<CXXThrowExpr>(B.getAs<CFGStmt>()->getStmt());
309     if (!CE)
310       continue;
311 
312     OpLoc = CE->getThrowLoc();
313     for (const auto &I : Block.succs()) {
314       if (!I.isReachable())
315         continue;
316       if (const auto *Terminator =
317               dyn_cast_or_null<CXXTryStmt>(I->getTerminator()))
318         if (isThrowCaughtByHandlers(S, CE, Terminator))
319           return false;
320     }
321     return true;
322   }
323   return false;
324 }
325 
326 static bool hasThrowOutNonThrowingFunc(Sema &S, SourceLocation &OpLoc,
327                                        CFG *BodyCFG) {
328   unsigned ExitID = BodyCFG->getExit().getBlockID();
329 
330   SmallVector<ThrowState, 16> States(BodyCFG->getNumBlockIDs(),
331                                      FoundNoPathForThrow);
332   States[BodyCFG->getEntry().getBlockID()] = FoundPathWithNoThrowOutFunction;
333 
334   SmallVector<CFGBlock *, 16> Stack;
335   Stack.push_back(&BodyCFG->getEntry());
336   while (!Stack.empty()) {
337     CFGBlock *CurBlock = Stack.pop_back_val();
338 
339     unsigned ID = CurBlock->getBlockID();
340     ThrowState CurState = States[ID];
341     if (CurState == FoundPathWithNoThrowOutFunction) {
342       if (ExitID == ID)
343         continue;
344 
345       if (doesThrowEscapePath(S, *CurBlock, OpLoc))
346         CurState = FoundPathForThrow;
347     }
348 
349     // Loop over successor blocks and add them to the Stack if their state
350     // changes.
351     for (const auto &I : CurBlock->succs())
352       if (I.isReachable()) {
353         unsigned NextID = I->getBlockID();
354         if (NextID == ExitID && CurState == FoundPathForThrow) {
355           States[NextID] = CurState;
356         } else if (States[NextID] < CurState) {
357           States[NextID] = CurState;
358           Stack.push_back(I);
359         }
360       }
361   }
362   // Return true if the exit node is reachable, and only reachable through
363   // a throw expression.
364   return States[ExitID] == FoundPathForThrow;
365 }
366 
367 static void EmitDiagForCXXThrowInNonThrowingFunc(Sema &S, SourceLocation OpLoc,
368                                                  const FunctionDecl *FD) {
369   if (!S.getSourceManager().isInSystemHeader(OpLoc) &&
370       FD->getTypeSourceInfo()) {
371     S.Diag(OpLoc, diag::warn_throw_in_noexcept_func) << FD;
372     if (S.getLangOpts().CPlusPlus11 &&
373         (isa<CXXDestructorDecl>(FD) ||
374          FD->getDeclName().getCXXOverloadedOperator() == OO_Delete ||
375          FD->getDeclName().getCXXOverloadedOperator() == OO_Array_Delete)) {
376       if (const auto *Ty = FD->getTypeSourceInfo()->getType()->
377                                          getAs<FunctionProtoType>())
378         S.Diag(FD->getLocation(), diag::note_throw_in_dtor)
379             << !isa<CXXDestructorDecl>(FD) << !Ty->hasExceptionSpec()
380             << FD->getExceptionSpecSourceRange();
381     } else
382       S.Diag(FD->getLocation(), diag::note_throw_in_function)
383           << FD->getExceptionSpecSourceRange();
384   }
385 }
386 
387 static void checkThrowInNonThrowingFunc(Sema &S, const FunctionDecl *FD,
388                                         AnalysisDeclContext &AC) {
389   CFG *BodyCFG = AC.getCFG();
390   if (!BodyCFG)
391     return;
392   if (BodyCFG->getExit().pred_empty())
393     return;
394   SourceLocation OpLoc;
395   if (hasThrowOutNonThrowingFunc(S, OpLoc, BodyCFG))
396     EmitDiagForCXXThrowInNonThrowingFunc(S, OpLoc, FD);
397 }
398 
399 static bool isNoexcept(const FunctionDecl *FD) {
400   const auto *FPT = FD->getType()->castAs<FunctionProtoType>();
401   if (FPT->isNothrow(FD->getASTContext()) || FD->hasAttr<NoThrowAttr>())
402     return true;
403   return false;
404 }
405 
406 //===----------------------------------------------------------------------===//
407 // Check for missing return value.
408 //===----------------------------------------------------------------------===//
409 
410 enum ControlFlowKind {
411   UnknownFallThrough,
412   NeverFallThrough,
413   MaybeFallThrough,
414   AlwaysFallThrough,
415   NeverFallThroughOrReturn
416 };
417 
418 /// CheckFallThrough - Check that we don't fall off the end of a
419 /// Statement that should return a value.
420 ///
421 /// \returns AlwaysFallThrough iff we always fall off the end of the statement,
422 /// MaybeFallThrough iff we might or might not fall off the end,
423 /// NeverFallThroughOrReturn iff we never fall off the end of the statement or
424 /// return.  We assume NeverFallThrough iff we never fall off the end of the
425 /// statement but we may return.  We assume that functions not marked noreturn
426 /// will return.
427 static ControlFlowKind CheckFallThrough(AnalysisDeclContext &AC) {
428   CFG *cfg = AC.getCFG();
429   if (!cfg) return UnknownFallThrough;
430 
431   // The CFG leaves in dead things, and we don't want the dead code paths to
432   // confuse us, so we mark all live things first.
433   llvm::BitVector live(cfg->getNumBlockIDs());
434   unsigned count = reachable_code::ScanReachableFromBlock(&cfg->getEntry(),
435                                                           live);
436 
437   bool AddEHEdges = AC.getAddEHEdges();
438   if (!AddEHEdges && count != cfg->getNumBlockIDs())
439     // When there are things remaining dead, and we didn't add EH edges
440     // from CallExprs to the catch clauses, we have to go back and
441     // mark them as live.
442     for (const auto *B : *cfg) {
443       if (!live[B->getBlockID()]) {
444         if (B->pred_begin() == B->pred_end()) {
445           if (B->getTerminator() && isa<CXXTryStmt>(B->getTerminator()))
446             // When not adding EH edges from calls, catch clauses
447             // can otherwise seem dead.  Avoid noting them as dead.
448             count += reachable_code::ScanReachableFromBlock(B, live);
449           continue;
450         }
451       }
452     }
453 
454   // Now we know what is live, we check the live precessors of the exit block
455   // and look for fall through paths, being careful to ignore normal returns,
456   // and exceptional paths.
457   bool HasLiveReturn = false;
458   bool HasFakeEdge = false;
459   bool HasPlainEdge = false;
460   bool HasAbnormalEdge = false;
461 
462   // Ignore default cases that aren't likely to be reachable because all
463   // enums in a switch(X) have explicit case statements.
464   CFGBlock::FilterOptions FO;
465   FO.IgnoreDefaultsWithCoveredEnums = 1;
466 
467   for (CFGBlock::filtered_pred_iterator
468 	 I = cfg->getExit().filtered_pred_start_end(FO); I.hasMore(); ++I) {
469     const CFGBlock& B = **I;
470     if (!live[B.getBlockID()])
471       continue;
472 
473     // Skip blocks which contain an element marked as no-return. They don't
474     // represent actually viable edges into the exit block, so mark them as
475     // abnormal.
476     if (B.hasNoReturnElement()) {
477       HasAbnormalEdge = true;
478       continue;
479     }
480 
481     // Destructors can appear after the 'return' in the CFG.  This is
482     // normal.  We need to look pass the destructors for the return
483     // statement (if it exists).
484     CFGBlock::const_reverse_iterator ri = B.rbegin(), re = B.rend();
485 
486     for ( ; ri != re ; ++ri)
487       if (ri->getAs<CFGStmt>())
488         break;
489 
490     // No more CFGElements in the block?
491     if (ri == re) {
492       if (B.getTerminator() && isa<CXXTryStmt>(B.getTerminator())) {
493         HasAbnormalEdge = true;
494         continue;
495       }
496       // A labeled empty statement, or the entry block...
497       HasPlainEdge = true;
498       continue;
499     }
500 
501     CFGStmt CS = ri->castAs<CFGStmt>();
502     const Stmt *S = CS.getStmt();
503     if (isa<ReturnStmt>(S) || isa<CoreturnStmt>(S)) {
504       HasLiveReturn = true;
505       continue;
506     }
507     if (isa<ObjCAtThrowStmt>(S)) {
508       HasFakeEdge = true;
509       continue;
510     }
511     if (isa<CXXThrowExpr>(S)) {
512       HasFakeEdge = true;
513       continue;
514     }
515     if (isa<MSAsmStmt>(S)) {
516       // TODO: Verify this is correct.
517       HasFakeEdge = true;
518       HasLiveReturn = true;
519       continue;
520     }
521     if (isa<CXXTryStmt>(S)) {
522       HasAbnormalEdge = true;
523       continue;
524     }
525     if (std::find(B.succ_begin(), B.succ_end(), &cfg->getExit())
526         == B.succ_end()) {
527       HasAbnormalEdge = true;
528       continue;
529     }
530 
531     HasPlainEdge = true;
532   }
533   if (!HasPlainEdge) {
534     if (HasLiveReturn)
535       return NeverFallThrough;
536     return NeverFallThroughOrReturn;
537   }
538   if (HasAbnormalEdge || HasFakeEdge || HasLiveReturn)
539     return MaybeFallThrough;
540   // This says AlwaysFallThrough for calls to functions that are not marked
541   // noreturn, that don't return.  If people would like this warning to be more
542   // accurate, such functions should be marked as noreturn.
543   return AlwaysFallThrough;
544 }
545 
546 namespace {
547 
548 struct CheckFallThroughDiagnostics {
549   unsigned diag_MaybeFallThrough_HasNoReturn;
550   unsigned diag_MaybeFallThrough_ReturnsNonVoid;
551   unsigned diag_AlwaysFallThrough_HasNoReturn;
552   unsigned diag_AlwaysFallThrough_ReturnsNonVoid;
553   unsigned diag_NeverFallThroughOrReturn;
554   enum { Function, Block, Lambda, Coroutine } funMode;
555   SourceLocation FuncLoc;
556 
557   static CheckFallThroughDiagnostics MakeForFunction(const Decl *Func) {
558     CheckFallThroughDiagnostics D;
559     D.FuncLoc = Func->getLocation();
560     D.diag_MaybeFallThrough_HasNoReturn =
561       diag::warn_falloff_noreturn_function;
562     D.diag_MaybeFallThrough_ReturnsNonVoid =
563       diag::warn_maybe_falloff_nonvoid_function;
564     D.diag_AlwaysFallThrough_HasNoReturn =
565       diag::warn_falloff_noreturn_function;
566     D.diag_AlwaysFallThrough_ReturnsNonVoid =
567       diag::warn_falloff_nonvoid_function;
568 
569     // Don't suggest that virtual functions be marked "noreturn", since they
570     // might be overridden by non-noreturn functions.
571     bool isVirtualMethod = false;
572     if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Func))
573       isVirtualMethod = Method->isVirtual();
574 
575     // Don't suggest that template instantiations be marked "noreturn"
576     bool isTemplateInstantiation = false;
577     if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(Func))
578       isTemplateInstantiation = Function->isTemplateInstantiation();
579 
580     if (!isVirtualMethod && !isTemplateInstantiation)
581       D.diag_NeverFallThroughOrReturn =
582         diag::warn_suggest_noreturn_function;
583     else
584       D.diag_NeverFallThroughOrReturn = 0;
585 
586     D.funMode = Function;
587     return D;
588   }
589 
590   static CheckFallThroughDiagnostics MakeForCoroutine(const Decl *Func) {
591     CheckFallThroughDiagnostics D;
592     D.FuncLoc = Func->getLocation();
593     D.diag_MaybeFallThrough_HasNoReturn = 0;
594     D.diag_MaybeFallThrough_ReturnsNonVoid =
595         diag::warn_maybe_falloff_nonvoid_coroutine;
596     D.diag_AlwaysFallThrough_HasNoReturn = 0;
597     D.diag_AlwaysFallThrough_ReturnsNonVoid =
598         diag::warn_falloff_nonvoid_coroutine;
599     D.funMode = Coroutine;
600     return D;
601   }
602 
603   static CheckFallThroughDiagnostics MakeForBlock() {
604     CheckFallThroughDiagnostics D;
605     D.diag_MaybeFallThrough_HasNoReturn =
606       diag::err_noreturn_block_has_return_expr;
607     D.diag_MaybeFallThrough_ReturnsNonVoid =
608       diag::err_maybe_falloff_nonvoid_block;
609     D.diag_AlwaysFallThrough_HasNoReturn =
610       diag::err_noreturn_block_has_return_expr;
611     D.diag_AlwaysFallThrough_ReturnsNonVoid =
612       diag::err_falloff_nonvoid_block;
613     D.diag_NeverFallThroughOrReturn = 0;
614     D.funMode = Block;
615     return D;
616   }
617 
618   static CheckFallThroughDiagnostics MakeForLambda() {
619     CheckFallThroughDiagnostics D;
620     D.diag_MaybeFallThrough_HasNoReturn =
621       diag::err_noreturn_lambda_has_return_expr;
622     D.diag_MaybeFallThrough_ReturnsNonVoid =
623       diag::warn_maybe_falloff_nonvoid_lambda;
624     D.diag_AlwaysFallThrough_HasNoReturn =
625       diag::err_noreturn_lambda_has_return_expr;
626     D.diag_AlwaysFallThrough_ReturnsNonVoid =
627       diag::warn_falloff_nonvoid_lambda;
628     D.diag_NeverFallThroughOrReturn = 0;
629     D.funMode = Lambda;
630     return D;
631   }
632 
633   bool checkDiagnostics(DiagnosticsEngine &D, bool ReturnsVoid,
634                         bool HasNoReturn) const {
635     if (funMode == Function) {
636       return (ReturnsVoid ||
637               D.isIgnored(diag::warn_maybe_falloff_nonvoid_function,
638                           FuncLoc)) &&
639              (!HasNoReturn ||
640               D.isIgnored(diag::warn_noreturn_function_has_return_expr,
641                           FuncLoc)) &&
642              (!ReturnsVoid ||
643               D.isIgnored(diag::warn_suggest_noreturn_block, FuncLoc));
644     }
645     if (funMode == Coroutine) {
646       return (ReturnsVoid ||
647               D.isIgnored(diag::warn_maybe_falloff_nonvoid_function, FuncLoc) ||
648               D.isIgnored(diag::warn_maybe_falloff_nonvoid_coroutine,
649                           FuncLoc)) &&
650              (!HasNoReturn);
651     }
652     // For blocks / lambdas.
653     return ReturnsVoid && !HasNoReturn;
654   }
655 };
656 
657 } // anonymous namespace
658 
659 /// CheckFallThroughForFunctionDef - Check that we don't fall off the end of a
660 /// function that should return a value.  Check that we don't fall off the end
661 /// of a noreturn function.  We assume that functions and blocks not marked
662 /// noreturn will return.
663 static void CheckFallThroughForBody(Sema &S, const Decl *D, const Stmt *Body,
664                                     const BlockExpr *blkExpr,
665                                     const CheckFallThroughDiagnostics& CD,
666                                     AnalysisDeclContext &AC) {
667 
668   bool ReturnsVoid = false;
669   bool HasNoReturn = false;
670   bool IsCoroutine = S.getCurFunction() && S.getCurFunction()->isCoroutine();
671 
672   if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
673     if (const auto *CBody = dyn_cast<CoroutineBodyStmt>(Body))
674       ReturnsVoid = CBody->getFallthroughHandler() != nullptr;
675     else
676       ReturnsVoid = FD->getReturnType()->isVoidType();
677     HasNoReturn = FD->isNoReturn();
678   }
679   else if (const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
680     ReturnsVoid = MD->getReturnType()->isVoidType();
681     HasNoReturn = MD->hasAttr<NoReturnAttr>();
682   }
683   else if (isa<BlockDecl>(D)) {
684     QualType BlockTy = blkExpr->getType();
685     if (const FunctionType *FT =
686           BlockTy->getPointeeType()->getAs<FunctionType>()) {
687       if (FT->getReturnType()->isVoidType())
688         ReturnsVoid = true;
689       if (FT->getNoReturnAttr())
690         HasNoReturn = true;
691     }
692   }
693 
694   DiagnosticsEngine &Diags = S.getDiagnostics();
695 
696   // Short circuit for compilation speed.
697   if (CD.checkDiagnostics(Diags, ReturnsVoid, HasNoReturn))
698       return;
699   SourceLocation LBrace = Body->getLocStart(), RBrace = Body->getLocEnd();
700   auto EmitDiag = [&](SourceLocation Loc, unsigned DiagID) {
701     if (IsCoroutine)
702       S.Diag(Loc, DiagID) << S.getCurFunction()->CoroutinePromise->getType();
703     else
704       S.Diag(Loc, DiagID);
705   };
706   // Either in a function body compound statement, or a function-try-block.
707   switch (CheckFallThrough(AC)) {
708     case UnknownFallThrough:
709       break;
710 
711     case MaybeFallThrough:
712       if (HasNoReturn)
713         EmitDiag(RBrace, CD.diag_MaybeFallThrough_HasNoReturn);
714       else if (!ReturnsVoid)
715         EmitDiag(RBrace, CD.diag_MaybeFallThrough_ReturnsNonVoid);
716       break;
717     case AlwaysFallThrough:
718       if (HasNoReturn)
719         EmitDiag(RBrace, CD.diag_AlwaysFallThrough_HasNoReturn);
720       else if (!ReturnsVoid)
721         EmitDiag(RBrace, CD.diag_AlwaysFallThrough_ReturnsNonVoid);
722       break;
723     case NeverFallThroughOrReturn:
724       if (ReturnsVoid && !HasNoReturn && CD.diag_NeverFallThroughOrReturn) {
725         if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
726           S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn) << 0 << FD;
727         } else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
728           S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn) << 1 << MD;
729         } else {
730           S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn);
731         }
732       }
733       break;
734     case NeverFallThrough:
735       break;
736   }
737 }
738 
739 //===----------------------------------------------------------------------===//
740 // -Wuninitialized
741 //===----------------------------------------------------------------------===//
742 
743 namespace {
744 /// ContainsReference - A visitor class to search for references to
745 /// a particular declaration (the needle) within any evaluated component of an
746 /// expression (recursively).
747 class ContainsReference : public ConstEvaluatedExprVisitor<ContainsReference> {
748   bool FoundReference;
749   const DeclRefExpr *Needle;
750 
751 public:
752   typedef ConstEvaluatedExprVisitor<ContainsReference> Inherited;
753 
754   ContainsReference(ASTContext &Context, const DeclRefExpr *Needle)
755     : Inherited(Context), FoundReference(false), Needle(Needle) {}
756 
757   void VisitExpr(const Expr *E) {
758     // Stop evaluating if we already have a reference.
759     if (FoundReference)
760       return;
761 
762     Inherited::VisitExpr(E);
763   }
764 
765   void VisitDeclRefExpr(const DeclRefExpr *E) {
766     if (E == Needle)
767       FoundReference = true;
768     else
769       Inherited::VisitDeclRefExpr(E);
770   }
771 
772   bool doesContainReference() const { return FoundReference; }
773 };
774 } // anonymous namespace
775 
776 static bool SuggestInitializationFixit(Sema &S, const VarDecl *VD) {
777   QualType VariableTy = VD->getType().getCanonicalType();
778   if (VariableTy->isBlockPointerType() &&
779       !VD->hasAttr<BlocksAttr>()) {
780     S.Diag(VD->getLocation(), diag::note_block_var_fixit_add_initialization)
781         << VD->getDeclName()
782         << FixItHint::CreateInsertion(VD->getLocation(), "__block ");
783     return true;
784   }
785 
786   // Don't issue a fixit if there is already an initializer.
787   if (VD->getInit())
788     return false;
789 
790   // Don't suggest a fixit inside macros.
791   if (VD->getLocEnd().isMacroID())
792     return false;
793 
794   SourceLocation Loc = S.getLocForEndOfToken(VD->getLocEnd());
795 
796   // Suggest possible initialization (if any).
797   std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
798   if (Init.empty())
799     return false;
800 
801   S.Diag(Loc, diag::note_var_fixit_add_initialization) << VD->getDeclName()
802     << FixItHint::CreateInsertion(Loc, Init);
803   return true;
804 }
805 
806 /// Create a fixit to remove an if-like statement, on the assumption that its
807 /// condition is CondVal.
808 static void CreateIfFixit(Sema &S, const Stmt *If, const Stmt *Then,
809                           const Stmt *Else, bool CondVal,
810                           FixItHint &Fixit1, FixItHint &Fixit2) {
811   if (CondVal) {
812     // If condition is always true, remove all but the 'then'.
813     Fixit1 = FixItHint::CreateRemoval(
814         CharSourceRange::getCharRange(If->getLocStart(),
815                                       Then->getLocStart()));
816     if (Else) {
817       SourceLocation ElseKwLoc = S.getLocForEndOfToken(Then->getLocEnd());
818       Fixit2 = FixItHint::CreateRemoval(
819           SourceRange(ElseKwLoc, Else->getLocEnd()));
820     }
821   } else {
822     // If condition is always false, remove all but the 'else'.
823     if (Else)
824       Fixit1 = FixItHint::CreateRemoval(
825           CharSourceRange::getCharRange(If->getLocStart(),
826                                         Else->getLocStart()));
827     else
828       Fixit1 = FixItHint::CreateRemoval(If->getSourceRange());
829   }
830 }
831 
832 /// DiagUninitUse -- Helper function to produce a diagnostic for an
833 /// uninitialized use of a variable.
834 static void DiagUninitUse(Sema &S, const VarDecl *VD, const UninitUse &Use,
835                           bool IsCapturedByBlock) {
836   bool Diagnosed = false;
837 
838   switch (Use.getKind()) {
839   case UninitUse::Always:
840     S.Diag(Use.getUser()->getLocStart(), diag::warn_uninit_var)
841         << VD->getDeclName() << IsCapturedByBlock
842         << Use.getUser()->getSourceRange();
843     return;
844 
845   case UninitUse::AfterDecl:
846   case UninitUse::AfterCall:
847     S.Diag(VD->getLocation(), diag::warn_sometimes_uninit_var)
848       << VD->getDeclName() << IsCapturedByBlock
849       << (Use.getKind() == UninitUse::AfterDecl ? 4 : 5)
850       << const_cast<DeclContext*>(VD->getLexicalDeclContext())
851       << VD->getSourceRange();
852     S.Diag(Use.getUser()->getLocStart(), diag::note_uninit_var_use)
853       << IsCapturedByBlock << Use.getUser()->getSourceRange();
854     return;
855 
856   case UninitUse::Maybe:
857   case UninitUse::Sometimes:
858     // Carry on to report sometimes-uninitialized branches, if possible,
859     // or a 'may be used uninitialized' diagnostic otherwise.
860     break;
861   }
862 
863   // Diagnose each branch which leads to a sometimes-uninitialized use.
864   for (UninitUse::branch_iterator I = Use.branch_begin(), E = Use.branch_end();
865        I != E; ++I) {
866     assert(Use.getKind() == UninitUse::Sometimes);
867 
868     const Expr *User = Use.getUser();
869     const Stmt *Term = I->Terminator;
870 
871     // Information used when building the diagnostic.
872     unsigned DiagKind;
873     StringRef Str;
874     SourceRange Range;
875 
876     // FixIts to suppress the diagnostic by removing the dead condition.
877     // For all binary terminators, branch 0 is taken if the condition is true,
878     // and branch 1 is taken if the condition is false.
879     int RemoveDiagKind = -1;
880     const char *FixitStr =
881         S.getLangOpts().CPlusPlus ? (I->Output ? "true" : "false")
882                                   : (I->Output ? "1" : "0");
883     FixItHint Fixit1, Fixit2;
884 
885     switch (Term ? Term->getStmtClass() : Stmt::DeclStmtClass) {
886     default:
887       // Don't know how to report this. Just fall back to 'may be used
888       // uninitialized'. FIXME: Can this happen?
889       continue;
890 
891     // "condition is true / condition is false".
892     case Stmt::IfStmtClass: {
893       const IfStmt *IS = cast<IfStmt>(Term);
894       DiagKind = 0;
895       Str = "if";
896       Range = IS->getCond()->getSourceRange();
897       RemoveDiagKind = 0;
898       CreateIfFixit(S, IS, IS->getThen(), IS->getElse(),
899                     I->Output, Fixit1, Fixit2);
900       break;
901     }
902     case Stmt::ConditionalOperatorClass: {
903       const ConditionalOperator *CO = cast<ConditionalOperator>(Term);
904       DiagKind = 0;
905       Str = "?:";
906       Range = CO->getCond()->getSourceRange();
907       RemoveDiagKind = 0;
908       CreateIfFixit(S, CO, CO->getTrueExpr(), CO->getFalseExpr(),
909                     I->Output, Fixit1, Fixit2);
910       break;
911     }
912     case Stmt::BinaryOperatorClass: {
913       const BinaryOperator *BO = cast<BinaryOperator>(Term);
914       if (!BO->isLogicalOp())
915         continue;
916       DiagKind = 0;
917       Str = BO->getOpcodeStr();
918       Range = BO->getLHS()->getSourceRange();
919       RemoveDiagKind = 0;
920       if ((BO->getOpcode() == BO_LAnd && I->Output) ||
921           (BO->getOpcode() == BO_LOr && !I->Output))
922         // true && y -> y, false || y -> y.
923         Fixit1 = FixItHint::CreateRemoval(SourceRange(BO->getLocStart(),
924                                                       BO->getOperatorLoc()));
925       else
926         // false && y -> false, true || y -> true.
927         Fixit1 = FixItHint::CreateReplacement(BO->getSourceRange(), FixitStr);
928       break;
929     }
930 
931     // "loop is entered / loop is exited".
932     case Stmt::WhileStmtClass:
933       DiagKind = 1;
934       Str = "while";
935       Range = cast<WhileStmt>(Term)->getCond()->getSourceRange();
936       RemoveDiagKind = 1;
937       Fixit1 = FixItHint::CreateReplacement(Range, FixitStr);
938       break;
939     case Stmt::ForStmtClass:
940       DiagKind = 1;
941       Str = "for";
942       Range = cast<ForStmt>(Term)->getCond()->getSourceRange();
943       RemoveDiagKind = 1;
944       if (I->Output)
945         Fixit1 = FixItHint::CreateRemoval(Range);
946       else
947         Fixit1 = FixItHint::CreateReplacement(Range, FixitStr);
948       break;
949     case Stmt::CXXForRangeStmtClass:
950       if (I->Output == 1) {
951         // The use occurs if a range-based for loop's body never executes.
952         // That may be impossible, and there's no syntactic fix for this,
953         // so treat it as a 'may be uninitialized' case.
954         continue;
955       }
956       DiagKind = 1;
957       Str = "for";
958       Range = cast<CXXForRangeStmt>(Term)->getRangeInit()->getSourceRange();
959       break;
960 
961     // "condition is true / loop is exited".
962     case Stmt::DoStmtClass:
963       DiagKind = 2;
964       Str = "do";
965       Range = cast<DoStmt>(Term)->getCond()->getSourceRange();
966       RemoveDiagKind = 1;
967       Fixit1 = FixItHint::CreateReplacement(Range, FixitStr);
968       break;
969 
970     // "switch case is taken".
971     case Stmt::CaseStmtClass:
972       DiagKind = 3;
973       Str = "case";
974       Range = cast<CaseStmt>(Term)->getLHS()->getSourceRange();
975       break;
976     case Stmt::DefaultStmtClass:
977       DiagKind = 3;
978       Str = "default";
979       Range = cast<DefaultStmt>(Term)->getDefaultLoc();
980       break;
981     }
982 
983     S.Diag(Range.getBegin(), diag::warn_sometimes_uninit_var)
984       << VD->getDeclName() << IsCapturedByBlock << DiagKind
985       << Str << I->Output << Range;
986     S.Diag(User->getLocStart(), diag::note_uninit_var_use)
987       << IsCapturedByBlock << User->getSourceRange();
988     if (RemoveDiagKind != -1)
989       S.Diag(Fixit1.RemoveRange.getBegin(), diag::note_uninit_fixit_remove_cond)
990         << RemoveDiagKind << Str << I->Output << Fixit1 << Fixit2;
991 
992     Diagnosed = true;
993   }
994 
995   if (!Diagnosed)
996     S.Diag(Use.getUser()->getLocStart(), diag::warn_maybe_uninit_var)
997         << VD->getDeclName() << IsCapturedByBlock
998         << Use.getUser()->getSourceRange();
999 }
1000 
1001 /// DiagnoseUninitializedUse -- Helper function for diagnosing uses of an
1002 /// uninitialized variable. This manages the different forms of diagnostic
1003 /// emitted for particular types of uses. Returns true if the use was diagnosed
1004 /// as a warning. If a particular use is one we omit warnings for, returns
1005 /// false.
1006 static bool DiagnoseUninitializedUse(Sema &S, const VarDecl *VD,
1007                                      const UninitUse &Use,
1008                                      bool alwaysReportSelfInit = false) {
1009   if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Use.getUser())) {
1010     // Inspect the initializer of the variable declaration which is
1011     // being referenced prior to its initialization. We emit
1012     // specialized diagnostics for self-initialization, and we
1013     // specifically avoid warning about self references which take the
1014     // form of:
1015     //
1016     //   int x = x;
1017     //
1018     // This is used to indicate to GCC that 'x' is intentionally left
1019     // uninitialized. Proven code paths which access 'x' in
1020     // an uninitialized state after this will still warn.
1021     if (const Expr *Initializer = VD->getInit()) {
1022       if (!alwaysReportSelfInit && DRE == Initializer->IgnoreParenImpCasts())
1023         return false;
1024 
1025       ContainsReference CR(S.Context, DRE);
1026       CR.Visit(Initializer);
1027       if (CR.doesContainReference()) {
1028         S.Diag(DRE->getLocStart(),
1029                diag::warn_uninit_self_reference_in_init)
1030           << VD->getDeclName() << VD->getLocation() << DRE->getSourceRange();
1031         return true;
1032       }
1033     }
1034 
1035     DiagUninitUse(S, VD, Use, false);
1036   } else {
1037     const BlockExpr *BE = cast<BlockExpr>(Use.getUser());
1038     if (VD->getType()->isBlockPointerType() && !VD->hasAttr<BlocksAttr>())
1039       S.Diag(BE->getLocStart(),
1040              diag::warn_uninit_byref_blockvar_captured_by_block)
1041         << VD->getDeclName();
1042     else
1043       DiagUninitUse(S, VD, Use, true);
1044   }
1045 
1046   // Report where the variable was declared when the use wasn't within
1047   // the initializer of that declaration & we didn't already suggest
1048   // an initialization fixit.
1049   if (!SuggestInitializationFixit(S, VD))
1050     S.Diag(VD->getLocStart(), diag::note_var_declared_here)
1051       << VD->getDeclName();
1052 
1053   return true;
1054 }
1055 
1056 namespace {
1057   class FallthroughMapper : public RecursiveASTVisitor<FallthroughMapper> {
1058   public:
1059     FallthroughMapper(Sema &S)
1060       : FoundSwitchStatements(false),
1061         S(S) {
1062     }
1063 
1064     bool foundSwitchStatements() const { return FoundSwitchStatements; }
1065 
1066     void markFallthroughVisited(const AttributedStmt *Stmt) {
1067       bool Found = FallthroughStmts.erase(Stmt);
1068       assert(Found);
1069       (void)Found;
1070     }
1071 
1072     typedef llvm::SmallPtrSet<const AttributedStmt*, 8> AttrStmts;
1073 
1074     const AttrStmts &getFallthroughStmts() const {
1075       return FallthroughStmts;
1076     }
1077 
1078     void fillReachableBlocks(CFG *Cfg) {
1079       assert(ReachableBlocks.empty() && "ReachableBlocks already filled");
1080       std::deque<const CFGBlock *> BlockQueue;
1081 
1082       ReachableBlocks.insert(&Cfg->getEntry());
1083       BlockQueue.push_back(&Cfg->getEntry());
1084       // Mark all case blocks reachable to avoid problems with switching on
1085       // constants, covered enums, etc.
1086       // These blocks can contain fall-through annotations, and we don't want to
1087       // issue a warn_fallthrough_attr_unreachable for them.
1088       for (const auto *B : *Cfg) {
1089         const Stmt *L = B->getLabel();
1090         if (L && isa<SwitchCase>(L) && ReachableBlocks.insert(B).second)
1091           BlockQueue.push_back(B);
1092       }
1093 
1094       while (!BlockQueue.empty()) {
1095         const CFGBlock *P = BlockQueue.front();
1096         BlockQueue.pop_front();
1097         for (CFGBlock::const_succ_iterator I = P->succ_begin(),
1098                                            E = P->succ_end();
1099              I != E; ++I) {
1100           if (*I && ReachableBlocks.insert(*I).second)
1101             BlockQueue.push_back(*I);
1102         }
1103       }
1104     }
1105 
1106     bool checkFallThroughIntoBlock(const CFGBlock &B, int &AnnotatedCnt,
1107                                    bool IsTemplateInstantiation) {
1108       assert(!ReachableBlocks.empty() && "ReachableBlocks empty");
1109 
1110       int UnannotatedCnt = 0;
1111       AnnotatedCnt = 0;
1112 
1113       std::deque<const CFGBlock*> BlockQueue(B.pred_begin(), B.pred_end());
1114       while (!BlockQueue.empty()) {
1115         const CFGBlock *P = BlockQueue.front();
1116         BlockQueue.pop_front();
1117         if (!P) continue;
1118 
1119         const Stmt *Term = P->getTerminator();
1120         if (Term && isa<SwitchStmt>(Term))
1121           continue; // Switch statement, good.
1122 
1123         const SwitchCase *SW = dyn_cast_or_null<SwitchCase>(P->getLabel());
1124         if (SW && SW->getSubStmt() == B.getLabel() && P->begin() == P->end())
1125           continue; // Previous case label has no statements, good.
1126 
1127         const LabelStmt *L = dyn_cast_or_null<LabelStmt>(P->getLabel());
1128         if (L && L->getSubStmt() == B.getLabel() && P->begin() == P->end())
1129           continue; // Case label is preceded with a normal label, good.
1130 
1131         if (!ReachableBlocks.count(P)) {
1132           for (CFGBlock::const_reverse_iterator ElemIt = P->rbegin(),
1133                                                 ElemEnd = P->rend();
1134                ElemIt != ElemEnd; ++ElemIt) {
1135             if (Optional<CFGStmt> CS = ElemIt->getAs<CFGStmt>()) {
1136               if (const AttributedStmt *AS = asFallThroughAttr(CS->getStmt())) {
1137                 // Don't issue a warning for an unreachable fallthrough
1138                 // attribute in template instantiations as it may not be
1139                 // unreachable in all instantiations of the template.
1140                 if (!IsTemplateInstantiation)
1141                   S.Diag(AS->getLocStart(),
1142                          diag::warn_fallthrough_attr_unreachable);
1143                 markFallthroughVisited(AS);
1144                 ++AnnotatedCnt;
1145                 break;
1146               }
1147               // Don't care about other unreachable statements.
1148             }
1149           }
1150           // If there are no unreachable statements, this may be a special
1151           // case in CFG:
1152           // case X: {
1153           //    A a;  // A has a destructor.
1154           //    break;
1155           // }
1156           // // <<<< This place is represented by a 'hanging' CFG block.
1157           // case Y:
1158           continue;
1159         }
1160 
1161         const Stmt *LastStmt = getLastStmt(*P);
1162         if (const AttributedStmt *AS = asFallThroughAttr(LastStmt)) {
1163           markFallthroughVisited(AS);
1164           ++AnnotatedCnt;
1165           continue; // Fallthrough annotation, good.
1166         }
1167 
1168         if (!LastStmt) { // This block contains no executable statements.
1169           // Traverse its predecessors.
1170           std::copy(P->pred_begin(), P->pred_end(),
1171                     std::back_inserter(BlockQueue));
1172           continue;
1173         }
1174 
1175         ++UnannotatedCnt;
1176       }
1177       return !!UnannotatedCnt;
1178     }
1179 
1180     // RecursiveASTVisitor setup.
1181     bool shouldWalkTypesOfTypeLocs() const { return false; }
1182 
1183     bool VisitAttributedStmt(AttributedStmt *S) {
1184       if (asFallThroughAttr(S))
1185         FallthroughStmts.insert(S);
1186       return true;
1187     }
1188 
1189     bool VisitSwitchStmt(SwitchStmt *S) {
1190       FoundSwitchStatements = true;
1191       return true;
1192     }
1193 
1194     // We don't want to traverse local type declarations. We analyze their
1195     // methods separately.
1196     bool TraverseDecl(Decl *D) { return true; }
1197 
1198     // We analyze lambda bodies separately. Skip them here.
1199     bool TraverseLambdaBody(LambdaExpr *LE) { return true; }
1200 
1201   private:
1202 
1203     static const AttributedStmt *asFallThroughAttr(const Stmt *S) {
1204       if (const AttributedStmt *AS = dyn_cast_or_null<AttributedStmt>(S)) {
1205         if (hasSpecificAttr<FallThroughAttr>(AS->getAttrs()))
1206           return AS;
1207       }
1208       return nullptr;
1209     }
1210 
1211     static const Stmt *getLastStmt(const CFGBlock &B) {
1212       if (const Stmt *Term = B.getTerminator())
1213         return Term;
1214       for (CFGBlock::const_reverse_iterator ElemIt = B.rbegin(),
1215                                             ElemEnd = B.rend();
1216                                             ElemIt != ElemEnd; ++ElemIt) {
1217         if (Optional<CFGStmt> CS = ElemIt->getAs<CFGStmt>())
1218           return CS->getStmt();
1219       }
1220       // Workaround to detect a statement thrown out by CFGBuilder:
1221       //   case X: {} case Y:
1222       //   case X: ; case Y:
1223       if (const SwitchCase *SW = dyn_cast_or_null<SwitchCase>(B.getLabel()))
1224         if (!isa<SwitchCase>(SW->getSubStmt()))
1225           return SW->getSubStmt();
1226 
1227       return nullptr;
1228     }
1229 
1230     bool FoundSwitchStatements;
1231     AttrStmts FallthroughStmts;
1232     Sema &S;
1233     llvm::SmallPtrSet<const CFGBlock *, 16> ReachableBlocks;
1234   };
1235 } // anonymous namespace
1236 
1237 static StringRef getFallthroughAttrSpelling(Preprocessor &PP,
1238                                             SourceLocation Loc) {
1239   TokenValue FallthroughTokens[] = {
1240     tok::l_square, tok::l_square,
1241     PP.getIdentifierInfo("fallthrough"),
1242     tok::r_square, tok::r_square
1243   };
1244 
1245   TokenValue ClangFallthroughTokens[] = {
1246     tok::l_square, tok::l_square, PP.getIdentifierInfo("clang"),
1247     tok::coloncolon, PP.getIdentifierInfo("fallthrough"),
1248     tok::r_square, tok::r_square
1249   };
1250 
1251   bool PreferClangAttr = !PP.getLangOpts().CPlusPlus17;
1252 
1253   StringRef MacroName;
1254   if (PreferClangAttr)
1255     MacroName = PP.getLastMacroWithSpelling(Loc, ClangFallthroughTokens);
1256   if (MacroName.empty())
1257     MacroName = PP.getLastMacroWithSpelling(Loc, FallthroughTokens);
1258   if (MacroName.empty() && !PreferClangAttr)
1259     MacroName = PP.getLastMacroWithSpelling(Loc, ClangFallthroughTokens);
1260   if (MacroName.empty())
1261     MacroName = PreferClangAttr ? "[[clang::fallthrough]]" : "[[fallthrough]]";
1262   return MacroName;
1263 }
1264 
1265 static void DiagnoseSwitchLabelsFallthrough(Sema &S, AnalysisDeclContext &AC,
1266                                             bool PerFunction) {
1267   // Only perform this analysis when using [[]] attributes. There is no good
1268   // workflow for this warning when not using C++11. There is no good way to
1269   // silence the warning (no attribute is available) unless we are using
1270   // [[]] attributes. One could use pragmas to silence the warning, but as a
1271   // general solution that is gross and not in the spirit of this warning.
1272   //
1273   // NOTE: This an intermediate solution. There are on-going discussions on
1274   // how to properly support this warning outside of C++11 with an annotation.
1275   if (!AC.getASTContext().getLangOpts().DoubleSquareBracketAttributes)
1276     return;
1277 
1278   FallthroughMapper FM(S);
1279   FM.TraverseStmt(AC.getBody());
1280 
1281   if (!FM.foundSwitchStatements())
1282     return;
1283 
1284   if (PerFunction && FM.getFallthroughStmts().empty())
1285     return;
1286 
1287   CFG *Cfg = AC.getCFG();
1288 
1289   if (!Cfg)
1290     return;
1291 
1292   FM.fillReachableBlocks(Cfg);
1293 
1294   for (const CFGBlock *B : llvm::reverse(*Cfg)) {
1295     const Stmt *Label = B->getLabel();
1296 
1297     if (!Label || !isa<SwitchCase>(Label))
1298       continue;
1299 
1300     int AnnotatedCnt;
1301 
1302     bool IsTemplateInstantiation = false;
1303     if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(AC.getDecl()))
1304       IsTemplateInstantiation = Function->isTemplateInstantiation();
1305     if (!FM.checkFallThroughIntoBlock(*B, AnnotatedCnt,
1306                                       IsTemplateInstantiation))
1307       continue;
1308 
1309     S.Diag(Label->getLocStart(),
1310         PerFunction ? diag::warn_unannotated_fallthrough_per_function
1311                     : diag::warn_unannotated_fallthrough);
1312 
1313     if (!AnnotatedCnt) {
1314       SourceLocation L = Label->getLocStart();
1315       if (L.isMacroID())
1316         continue;
1317       if (S.getLangOpts().CPlusPlus11) {
1318         const Stmt *Term = B->getTerminator();
1319         // Skip empty cases.
1320         while (B->empty() && !Term && B->succ_size() == 1) {
1321           B = *B->succ_begin();
1322           Term = B->getTerminator();
1323         }
1324         if (!(B->empty() && Term && isa<BreakStmt>(Term))) {
1325           Preprocessor &PP = S.getPreprocessor();
1326           StringRef AnnotationSpelling = getFallthroughAttrSpelling(PP, L);
1327           SmallString<64> TextToInsert(AnnotationSpelling);
1328           TextToInsert += "; ";
1329           S.Diag(L, diag::note_insert_fallthrough_fixit) <<
1330               AnnotationSpelling <<
1331               FixItHint::CreateInsertion(L, TextToInsert);
1332         }
1333       }
1334       S.Diag(L, diag::note_insert_break_fixit) <<
1335         FixItHint::CreateInsertion(L, "break; ");
1336     }
1337   }
1338 
1339   for (const auto *F : FM.getFallthroughStmts())
1340     S.Diag(F->getLocStart(), diag::err_fallthrough_attr_invalid_placement);
1341 }
1342 
1343 static bool isInLoop(const ASTContext &Ctx, const ParentMap &PM,
1344                      const Stmt *S) {
1345   assert(S);
1346 
1347   do {
1348     switch (S->getStmtClass()) {
1349     case Stmt::ForStmtClass:
1350     case Stmt::WhileStmtClass:
1351     case Stmt::CXXForRangeStmtClass:
1352     case Stmt::ObjCForCollectionStmtClass:
1353       return true;
1354     case Stmt::DoStmtClass: {
1355       const Expr *Cond = cast<DoStmt>(S)->getCond();
1356       llvm::APSInt Val;
1357       if (!Cond->EvaluateAsInt(Val, Ctx))
1358         return true;
1359       return Val.getBoolValue();
1360     }
1361     default:
1362       break;
1363     }
1364   } while ((S = PM.getParent(S)));
1365 
1366   return false;
1367 }
1368 
1369 static void diagnoseRepeatedUseOfWeak(Sema &S,
1370                                       const sema::FunctionScopeInfo *CurFn,
1371                                       const Decl *D,
1372                                       const ParentMap &PM) {
1373   typedef sema::FunctionScopeInfo::WeakObjectProfileTy WeakObjectProfileTy;
1374   typedef sema::FunctionScopeInfo::WeakObjectUseMap WeakObjectUseMap;
1375   typedef sema::FunctionScopeInfo::WeakUseVector WeakUseVector;
1376   typedef std::pair<const Stmt *, WeakObjectUseMap::const_iterator>
1377   StmtUsesPair;
1378 
1379   ASTContext &Ctx = S.getASTContext();
1380 
1381   const WeakObjectUseMap &WeakMap = CurFn->getWeakObjectUses();
1382 
1383   // Extract all weak objects that are referenced more than once.
1384   SmallVector<StmtUsesPair, 8> UsesByStmt;
1385   for (WeakObjectUseMap::const_iterator I = WeakMap.begin(), E = WeakMap.end();
1386        I != E; ++I) {
1387     const WeakUseVector &Uses = I->second;
1388 
1389     // Find the first read of the weak object.
1390     WeakUseVector::const_iterator UI = Uses.begin(), UE = Uses.end();
1391     for ( ; UI != UE; ++UI) {
1392       if (UI->isUnsafe())
1393         break;
1394     }
1395 
1396     // If there were only writes to this object, don't warn.
1397     if (UI == UE)
1398       continue;
1399 
1400     // If there was only one read, followed by any number of writes, and the
1401     // read is not within a loop, don't warn. Additionally, don't warn in a
1402     // loop if the base object is a local variable -- local variables are often
1403     // changed in loops.
1404     if (UI == Uses.begin()) {
1405       WeakUseVector::const_iterator UI2 = UI;
1406       for (++UI2; UI2 != UE; ++UI2)
1407         if (UI2->isUnsafe())
1408           break;
1409 
1410       if (UI2 == UE) {
1411         if (!isInLoop(Ctx, PM, UI->getUseExpr()))
1412           continue;
1413 
1414         const WeakObjectProfileTy &Profile = I->first;
1415         if (!Profile.isExactProfile())
1416           continue;
1417 
1418         const NamedDecl *Base = Profile.getBase();
1419         if (!Base)
1420           Base = Profile.getProperty();
1421         assert(Base && "A profile always has a base or property.");
1422 
1423         if (const VarDecl *BaseVar = dyn_cast<VarDecl>(Base))
1424           if (BaseVar->hasLocalStorage() && !isa<ParmVarDecl>(Base))
1425             continue;
1426       }
1427     }
1428 
1429     UsesByStmt.push_back(StmtUsesPair(UI->getUseExpr(), I));
1430   }
1431 
1432   if (UsesByStmt.empty())
1433     return;
1434 
1435   // Sort by first use so that we emit the warnings in a deterministic order.
1436   SourceManager &SM = S.getSourceManager();
1437   std::sort(UsesByStmt.begin(), UsesByStmt.end(),
1438             [&SM](const StmtUsesPair &LHS, const StmtUsesPair &RHS) {
1439     return SM.isBeforeInTranslationUnit(LHS.first->getLocStart(),
1440                                         RHS.first->getLocStart());
1441   });
1442 
1443   // Classify the current code body for better warning text.
1444   // This enum should stay in sync with the cases in
1445   // warn_arc_repeated_use_of_weak and warn_arc_possible_repeated_use_of_weak.
1446   // FIXME: Should we use a common classification enum and the same set of
1447   // possibilities all throughout Sema?
1448   enum {
1449     Function,
1450     Method,
1451     Block,
1452     Lambda
1453   } FunctionKind;
1454 
1455   if (isa<sema::BlockScopeInfo>(CurFn))
1456     FunctionKind = Block;
1457   else if (isa<sema::LambdaScopeInfo>(CurFn))
1458     FunctionKind = Lambda;
1459   else if (isa<ObjCMethodDecl>(D))
1460     FunctionKind = Method;
1461   else
1462     FunctionKind = Function;
1463 
1464   // Iterate through the sorted problems and emit warnings for each.
1465   for (const auto &P : UsesByStmt) {
1466     const Stmt *FirstRead = P.first;
1467     const WeakObjectProfileTy &Key = P.second->first;
1468     const WeakUseVector &Uses = P.second->second;
1469 
1470     // For complicated expressions like 'a.b.c' and 'x.b.c', WeakObjectProfileTy
1471     // may not contain enough information to determine that these are different
1472     // properties. We can only be 100% sure of a repeated use in certain cases,
1473     // and we adjust the diagnostic kind accordingly so that the less certain
1474     // case can be turned off if it is too noisy.
1475     unsigned DiagKind;
1476     if (Key.isExactProfile())
1477       DiagKind = diag::warn_arc_repeated_use_of_weak;
1478     else
1479       DiagKind = diag::warn_arc_possible_repeated_use_of_weak;
1480 
1481     // Classify the weak object being accessed for better warning text.
1482     // This enum should stay in sync with the cases in
1483     // warn_arc_repeated_use_of_weak and warn_arc_possible_repeated_use_of_weak.
1484     enum {
1485       Variable,
1486       Property,
1487       ImplicitProperty,
1488       Ivar
1489     } ObjectKind;
1490 
1491     const NamedDecl *KeyProp = Key.getProperty();
1492     if (isa<VarDecl>(KeyProp))
1493       ObjectKind = Variable;
1494     else if (isa<ObjCPropertyDecl>(KeyProp))
1495       ObjectKind = Property;
1496     else if (isa<ObjCMethodDecl>(KeyProp))
1497       ObjectKind = ImplicitProperty;
1498     else if (isa<ObjCIvarDecl>(KeyProp))
1499       ObjectKind = Ivar;
1500     else
1501       llvm_unreachable("Unexpected weak object kind!");
1502 
1503     // Do not warn about IBOutlet weak property receivers being set to null
1504     // since they are typically only used from the main thread.
1505     if (const ObjCPropertyDecl *Prop = dyn_cast<ObjCPropertyDecl>(KeyProp))
1506       if (Prop->hasAttr<IBOutletAttr>())
1507         continue;
1508 
1509     // Show the first time the object was read.
1510     S.Diag(FirstRead->getLocStart(), DiagKind)
1511       << int(ObjectKind) << KeyProp << int(FunctionKind)
1512       << FirstRead->getSourceRange();
1513 
1514     // Print all the other accesses as notes.
1515     for (const auto &Use : Uses) {
1516       if (Use.getUseExpr() == FirstRead)
1517         continue;
1518       S.Diag(Use.getUseExpr()->getLocStart(),
1519              diag::note_arc_weak_also_accessed_here)
1520           << Use.getUseExpr()->getSourceRange();
1521     }
1522   }
1523 }
1524 
1525 namespace {
1526 class UninitValsDiagReporter : public UninitVariablesHandler {
1527   Sema &S;
1528   typedef SmallVector<UninitUse, 2> UsesVec;
1529   typedef llvm::PointerIntPair<UsesVec *, 1, bool> MappedType;
1530   // Prefer using MapVector to DenseMap, so that iteration order will be
1531   // the same as insertion order. This is needed to obtain a deterministic
1532   // order of diagnostics when calling flushDiagnostics().
1533   typedef llvm::MapVector<const VarDecl *, MappedType> UsesMap;
1534   UsesMap uses;
1535 
1536 public:
1537   UninitValsDiagReporter(Sema &S) : S(S) {}
1538   ~UninitValsDiagReporter() override { flushDiagnostics(); }
1539 
1540   MappedType &getUses(const VarDecl *vd) {
1541     MappedType &V = uses[vd];
1542     if (!V.getPointer())
1543       V.setPointer(new UsesVec());
1544     return V;
1545   }
1546 
1547   void handleUseOfUninitVariable(const VarDecl *vd,
1548                                  const UninitUse &use) override {
1549     getUses(vd).getPointer()->push_back(use);
1550   }
1551 
1552   void handleSelfInit(const VarDecl *vd) override {
1553     getUses(vd).setInt(true);
1554   }
1555 
1556   void flushDiagnostics() {
1557     for (const auto &P : uses) {
1558       const VarDecl *vd = P.first;
1559       const MappedType &V = P.second;
1560 
1561       UsesVec *vec = V.getPointer();
1562       bool hasSelfInit = V.getInt();
1563 
1564       // Specially handle the case where we have uses of an uninitialized
1565       // variable, but the root cause is an idiomatic self-init.  We want
1566       // to report the diagnostic at the self-init since that is the root cause.
1567       if (!vec->empty() && hasSelfInit && hasAlwaysUninitializedUse(vec))
1568         DiagnoseUninitializedUse(S, vd,
1569                                  UninitUse(vd->getInit()->IgnoreParenCasts(),
1570                                            /* isAlwaysUninit */ true),
1571                                  /* alwaysReportSelfInit */ true);
1572       else {
1573         // Sort the uses by their SourceLocations.  While not strictly
1574         // guaranteed to produce them in line/column order, this will provide
1575         // a stable ordering.
1576         std::sort(vec->begin(), vec->end(),
1577                   [](const UninitUse &a, const UninitUse &b) {
1578           // Prefer a more confident report over a less confident one.
1579           if (a.getKind() != b.getKind())
1580             return a.getKind() > b.getKind();
1581           return a.getUser()->getLocStart() < b.getUser()->getLocStart();
1582         });
1583 
1584         for (const auto &U : *vec) {
1585           // If we have self-init, downgrade all uses to 'may be uninitialized'.
1586           UninitUse Use = hasSelfInit ? UninitUse(U.getUser(), false) : U;
1587 
1588           if (DiagnoseUninitializedUse(S, vd, Use))
1589             // Skip further diagnostics for this variable. We try to warn only
1590             // on the first point at which a variable is used uninitialized.
1591             break;
1592         }
1593       }
1594 
1595       // Release the uses vector.
1596       delete vec;
1597     }
1598 
1599     uses.clear();
1600   }
1601 
1602 private:
1603   static bool hasAlwaysUninitializedUse(const UsesVec* vec) {
1604     return std::any_of(vec->begin(), vec->end(), [](const UninitUse &U) {
1605       return U.getKind() == UninitUse::Always ||
1606              U.getKind() == UninitUse::AfterCall ||
1607              U.getKind() == UninitUse::AfterDecl;
1608     });
1609   }
1610 };
1611 } // anonymous namespace
1612 
1613 namespace clang {
1614 namespace {
1615 typedef SmallVector<PartialDiagnosticAt, 1> OptionalNotes;
1616 typedef std::pair<PartialDiagnosticAt, OptionalNotes> DelayedDiag;
1617 typedef std::list<DelayedDiag> DiagList;
1618 
1619 struct SortDiagBySourceLocation {
1620   SourceManager &SM;
1621   SortDiagBySourceLocation(SourceManager &SM) : SM(SM) {}
1622 
1623   bool operator()(const DelayedDiag &left, const DelayedDiag &right) {
1624     // Although this call will be slow, this is only called when outputting
1625     // multiple warnings.
1626     return SM.isBeforeInTranslationUnit(left.first.first, right.first.first);
1627   }
1628 };
1629 } // anonymous namespace
1630 } // namespace clang
1631 
1632 //===----------------------------------------------------------------------===//
1633 // -Wthread-safety
1634 //===----------------------------------------------------------------------===//
1635 namespace clang {
1636 namespace threadSafety {
1637 namespace {
1638 class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler {
1639   Sema &S;
1640   DiagList Warnings;
1641   SourceLocation FunLocation, FunEndLocation;
1642 
1643   const FunctionDecl *CurrentFunction;
1644   bool Verbose;
1645 
1646   OptionalNotes getNotes() const {
1647     if (Verbose && CurrentFunction) {
1648       PartialDiagnosticAt FNote(CurrentFunction->getBody()->getLocStart(),
1649                                 S.PDiag(diag::note_thread_warning_in_fun)
1650                                     << CurrentFunction->getNameAsString());
1651       return OptionalNotes(1, FNote);
1652     }
1653     return OptionalNotes();
1654   }
1655 
1656   OptionalNotes getNotes(const PartialDiagnosticAt &Note) const {
1657     OptionalNotes ONS(1, Note);
1658     if (Verbose && CurrentFunction) {
1659       PartialDiagnosticAt FNote(CurrentFunction->getBody()->getLocStart(),
1660                                 S.PDiag(diag::note_thread_warning_in_fun)
1661                                     << CurrentFunction->getNameAsString());
1662       ONS.push_back(std::move(FNote));
1663     }
1664     return ONS;
1665   }
1666 
1667   OptionalNotes getNotes(const PartialDiagnosticAt &Note1,
1668                          const PartialDiagnosticAt &Note2) const {
1669     OptionalNotes ONS;
1670     ONS.push_back(Note1);
1671     ONS.push_back(Note2);
1672     if (Verbose && CurrentFunction) {
1673       PartialDiagnosticAt FNote(CurrentFunction->getBody()->getLocStart(),
1674                                 S.PDiag(diag::note_thread_warning_in_fun)
1675                                     << CurrentFunction->getNameAsString());
1676       ONS.push_back(std::move(FNote));
1677     }
1678     return ONS;
1679   }
1680 
1681   // Helper functions
1682   void warnLockMismatch(unsigned DiagID, StringRef Kind, Name LockName,
1683                         SourceLocation Loc) {
1684     // Gracefully handle rare cases when the analysis can't get a more
1685     // precise source location.
1686     if (!Loc.isValid())
1687       Loc = FunLocation;
1688     PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) << Kind << LockName);
1689     Warnings.emplace_back(std::move(Warning), getNotes());
1690   }
1691 
1692  public:
1693   ThreadSafetyReporter(Sema &S, SourceLocation FL, SourceLocation FEL)
1694     : S(S), FunLocation(FL), FunEndLocation(FEL),
1695       CurrentFunction(nullptr), Verbose(false) {}
1696 
1697   void setVerbose(bool b) { Verbose = b; }
1698 
1699   /// \brief Emit all buffered diagnostics in order of sourcelocation.
1700   /// We need to output diagnostics produced while iterating through
1701   /// the lockset in deterministic order, so this function orders diagnostics
1702   /// and outputs them.
1703   void emitDiagnostics() {
1704     Warnings.sort(SortDiagBySourceLocation(S.getSourceManager()));
1705     for (const auto &Diag : Warnings) {
1706       S.Diag(Diag.first.first, Diag.first.second);
1707       for (const auto &Note : Diag.second)
1708         S.Diag(Note.first, Note.second);
1709     }
1710   }
1711 
1712   void handleInvalidLockExp(StringRef Kind, SourceLocation Loc) override {
1713     PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_cannot_resolve_lock)
1714                                          << Loc);
1715     Warnings.emplace_back(std::move(Warning), getNotes());
1716   }
1717 
1718   void handleUnmatchedUnlock(StringRef Kind, Name LockName,
1719                              SourceLocation Loc) override {
1720     warnLockMismatch(diag::warn_unlock_but_no_lock, Kind, LockName, Loc);
1721   }
1722 
1723   void handleIncorrectUnlockKind(StringRef Kind, Name LockName,
1724                                  LockKind Expected, LockKind Received,
1725                                  SourceLocation Loc) override {
1726     if (Loc.isInvalid())
1727       Loc = FunLocation;
1728     PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_unlock_kind_mismatch)
1729                                          << Kind << LockName << Received
1730                                          << Expected);
1731     Warnings.emplace_back(std::move(Warning), getNotes());
1732   }
1733 
1734   void handleDoubleLock(StringRef Kind, Name LockName, SourceLocation Loc) override {
1735     warnLockMismatch(diag::warn_double_lock, Kind, LockName, Loc);
1736   }
1737 
1738   void handleMutexHeldEndOfScope(StringRef Kind, Name LockName,
1739                                  SourceLocation LocLocked,
1740                                  SourceLocation LocEndOfScope,
1741                                  LockErrorKind LEK) override {
1742     unsigned DiagID = 0;
1743     switch (LEK) {
1744       case LEK_LockedSomePredecessors:
1745         DiagID = diag::warn_lock_some_predecessors;
1746         break;
1747       case LEK_LockedSomeLoopIterations:
1748         DiagID = diag::warn_expecting_lock_held_on_loop;
1749         break;
1750       case LEK_LockedAtEndOfFunction:
1751         DiagID = diag::warn_no_unlock;
1752         break;
1753       case LEK_NotLockedAtEndOfFunction:
1754         DiagID = diag::warn_expecting_locked;
1755         break;
1756     }
1757     if (LocEndOfScope.isInvalid())
1758       LocEndOfScope = FunEndLocation;
1759 
1760     PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID) << Kind
1761                                                                << LockName);
1762     if (LocLocked.isValid()) {
1763       PartialDiagnosticAt Note(LocLocked, S.PDiag(diag::note_locked_here)
1764                                               << Kind);
1765       Warnings.emplace_back(std::move(Warning), getNotes(Note));
1766       return;
1767     }
1768     Warnings.emplace_back(std::move(Warning), getNotes());
1769   }
1770 
1771   void handleExclusiveAndShared(StringRef Kind, Name LockName,
1772                                 SourceLocation Loc1,
1773                                 SourceLocation Loc2) override {
1774     PartialDiagnosticAt Warning(Loc1,
1775                                 S.PDiag(diag::warn_lock_exclusive_and_shared)
1776                                     << Kind << LockName);
1777     PartialDiagnosticAt Note(Loc2, S.PDiag(diag::note_lock_exclusive_and_shared)
1778                                        << Kind << LockName);
1779     Warnings.emplace_back(std::move(Warning), getNotes(Note));
1780   }
1781 
1782   void handleNoMutexHeld(StringRef Kind, const NamedDecl *D,
1783                          ProtectedOperationKind POK, AccessKind AK,
1784                          SourceLocation Loc) override {
1785     assert((POK == POK_VarAccess || POK == POK_VarDereference) &&
1786            "Only works for variables");
1787     unsigned DiagID = POK == POK_VarAccess?
1788                         diag::warn_variable_requires_any_lock:
1789                         diag::warn_var_deref_requires_any_lock;
1790     PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID)
1791       << D->getNameAsString() << getLockKindFromAccessKind(AK));
1792     Warnings.emplace_back(std::move(Warning), getNotes());
1793   }
1794 
1795   void handleMutexNotHeld(StringRef Kind, const NamedDecl *D,
1796                           ProtectedOperationKind POK, Name LockName,
1797                           LockKind LK, SourceLocation Loc,
1798                           Name *PossibleMatch) override {
1799     unsigned DiagID = 0;
1800     if (PossibleMatch) {
1801       switch (POK) {
1802         case POK_VarAccess:
1803           DiagID = diag::warn_variable_requires_lock_precise;
1804           break;
1805         case POK_VarDereference:
1806           DiagID = diag::warn_var_deref_requires_lock_precise;
1807           break;
1808         case POK_FunctionCall:
1809           DiagID = diag::warn_fun_requires_lock_precise;
1810           break;
1811         case POK_PassByRef:
1812           DiagID = diag::warn_guarded_pass_by_reference;
1813           break;
1814         case POK_PtPassByRef:
1815           DiagID = diag::warn_pt_guarded_pass_by_reference;
1816           break;
1817       }
1818       PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) << Kind
1819                                                        << D->getNameAsString()
1820                                                        << LockName << LK);
1821       PartialDiagnosticAt Note(Loc, S.PDiag(diag::note_found_mutex_near_match)
1822                                         << *PossibleMatch);
1823       if (Verbose && POK == POK_VarAccess) {
1824         PartialDiagnosticAt VNote(D->getLocation(),
1825                                  S.PDiag(diag::note_guarded_by_declared_here)
1826                                      << D->getNameAsString());
1827         Warnings.emplace_back(std::move(Warning), getNotes(Note, VNote));
1828       } else
1829         Warnings.emplace_back(std::move(Warning), getNotes(Note));
1830     } else {
1831       switch (POK) {
1832         case POK_VarAccess:
1833           DiagID = diag::warn_variable_requires_lock;
1834           break;
1835         case POK_VarDereference:
1836           DiagID = diag::warn_var_deref_requires_lock;
1837           break;
1838         case POK_FunctionCall:
1839           DiagID = diag::warn_fun_requires_lock;
1840           break;
1841         case POK_PassByRef:
1842           DiagID = diag::warn_guarded_pass_by_reference;
1843           break;
1844         case POK_PtPassByRef:
1845           DiagID = diag::warn_pt_guarded_pass_by_reference;
1846           break;
1847       }
1848       PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) << Kind
1849                                                        << D->getNameAsString()
1850                                                        << LockName << LK);
1851       if (Verbose && POK == POK_VarAccess) {
1852         PartialDiagnosticAt Note(D->getLocation(),
1853                                  S.PDiag(diag::note_guarded_by_declared_here)
1854                                      << D->getNameAsString());
1855         Warnings.emplace_back(std::move(Warning), getNotes(Note));
1856       } else
1857         Warnings.emplace_back(std::move(Warning), getNotes());
1858     }
1859   }
1860 
1861   void handleNegativeNotHeld(StringRef Kind, Name LockName, Name Neg,
1862                              SourceLocation Loc) override {
1863     PartialDiagnosticAt Warning(Loc,
1864         S.PDiag(diag::warn_acquire_requires_negative_cap)
1865         << Kind << LockName << Neg);
1866     Warnings.emplace_back(std::move(Warning), getNotes());
1867   }
1868 
1869   void handleFunExcludesLock(StringRef Kind, Name FunName, Name LockName,
1870                              SourceLocation Loc) override {
1871     PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_fun_excludes_mutex)
1872                                          << Kind << FunName << LockName);
1873     Warnings.emplace_back(std::move(Warning), getNotes());
1874   }
1875 
1876   void handleLockAcquiredBefore(StringRef Kind, Name L1Name, Name L2Name,
1877                                 SourceLocation Loc) override {
1878     PartialDiagnosticAt Warning(Loc,
1879       S.PDiag(diag::warn_acquired_before) << Kind << L1Name << L2Name);
1880     Warnings.emplace_back(std::move(Warning), getNotes());
1881   }
1882 
1883   void handleBeforeAfterCycle(Name L1Name, SourceLocation Loc) override {
1884     PartialDiagnosticAt Warning(Loc,
1885       S.PDiag(diag::warn_acquired_before_after_cycle) << L1Name);
1886     Warnings.emplace_back(std::move(Warning), getNotes());
1887   }
1888 
1889   void enterFunction(const FunctionDecl* FD) override {
1890     CurrentFunction = FD;
1891   }
1892 
1893   void leaveFunction(const FunctionDecl* FD) override {
1894     CurrentFunction = nullptr;
1895   }
1896 };
1897 } // anonymous namespace
1898 } // namespace threadSafety
1899 } // namespace clang
1900 
1901 //===----------------------------------------------------------------------===//
1902 // -Wconsumed
1903 //===----------------------------------------------------------------------===//
1904 
1905 namespace clang {
1906 namespace consumed {
1907 namespace {
1908 class ConsumedWarningsHandler : public ConsumedWarningsHandlerBase {
1909 
1910   Sema &S;
1911   DiagList Warnings;
1912 
1913 public:
1914 
1915   ConsumedWarningsHandler(Sema &S) : S(S) {}
1916 
1917   void emitDiagnostics() override {
1918     Warnings.sort(SortDiagBySourceLocation(S.getSourceManager()));
1919     for (const auto &Diag : Warnings) {
1920       S.Diag(Diag.first.first, Diag.first.second);
1921       for (const auto &Note : Diag.second)
1922         S.Diag(Note.first, Note.second);
1923     }
1924   }
1925 
1926   void warnLoopStateMismatch(SourceLocation Loc,
1927                              StringRef VariableName) override {
1928     PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_loop_state_mismatch) <<
1929       VariableName);
1930 
1931     Warnings.emplace_back(std::move(Warning), OptionalNotes());
1932   }
1933 
1934   void warnParamReturnTypestateMismatch(SourceLocation Loc,
1935                                         StringRef VariableName,
1936                                         StringRef ExpectedState,
1937                                         StringRef ObservedState) override {
1938 
1939     PartialDiagnosticAt Warning(Loc, S.PDiag(
1940       diag::warn_param_return_typestate_mismatch) << VariableName <<
1941         ExpectedState << ObservedState);
1942 
1943     Warnings.emplace_back(std::move(Warning), OptionalNotes());
1944   }
1945 
1946   void warnParamTypestateMismatch(SourceLocation Loc, StringRef ExpectedState,
1947                                   StringRef ObservedState) override {
1948 
1949     PartialDiagnosticAt Warning(Loc, S.PDiag(
1950       diag::warn_param_typestate_mismatch) << ExpectedState << ObservedState);
1951 
1952     Warnings.emplace_back(std::move(Warning), OptionalNotes());
1953   }
1954 
1955   void warnReturnTypestateForUnconsumableType(SourceLocation Loc,
1956                                               StringRef TypeName) override {
1957     PartialDiagnosticAt Warning(Loc, S.PDiag(
1958       diag::warn_return_typestate_for_unconsumable_type) << TypeName);
1959 
1960     Warnings.emplace_back(std::move(Warning), OptionalNotes());
1961   }
1962 
1963   void warnReturnTypestateMismatch(SourceLocation Loc, StringRef ExpectedState,
1964                                    StringRef ObservedState) override {
1965 
1966     PartialDiagnosticAt Warning(Loc, S.PDiag(
1967       diag::warn_return_typestate_mismatch) << ExpectedState << ObservedState);
1968 
1969     Warnings.emplace_back(std::move(Warning), OptionalNotes());
1970   }
1971 
1972   void warnUseOfTempInInvalidState(StringRef MethodName, StringRef State,
1973                                    SourceLocation Loc) override {
1974 
1975     PartialDiagnosticAt Warning(Loc, S.PDiag(
1976       diag::warn_use_of_temp_in_invalid_state) << MethodName << State);
1977 
1978     Warnings.emplace_back(std::move(Warning), OptionalNotes());
1979   }
1980 
1981   void warnUseInInvalidState(StringRef MethodName, StringRef VariableName,
1982                              StringRef State, SourceLocation Loc) override {
1983 
1984     PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_use_in_invalid_state) <<
1985                                 MethodName << VariableName << State);
1986 
1987     Warnings.emplace_back(std::move(Warning), OptionalNotes());
1988   }
1989 };
1990 } // anonymous namespace
1991 } // namespace consumed
1992 } // namespace clang
1993 
1994 //===----------------------------------------------------------------------===//
1995 // AnalysisBasedWarnings - Worker object used by Sema to execute analysis-based
1996 //  warnings on a function, method, or block.
1997 //===----------------------------------------------------------------------===//
1998 
1999 clang::sema::AnalysisBasedWarnings::Policy::Policy() {
2000   enableCheckFallThrough = 1;
2001   enableCheckUnreachable = 0;
2002   enableThreadSafetyAnalysis = 0;
2003   enableConsumedAnalysis = 0;
2004 }
2005 
2006 static unsigned isEnabled(DiagnosticsEngine &D, unsigned diag) {
2007   return (unsigned)!D.isIgnored(diag, SourceLocation());
2008 }
2009 
2010 clang::sema::AnalysisBasedWarnings::AnalysisBasedWarnings(Sema &s)
2011   : S(s),
2012     NumFunctionsAnalyzed(0),
2013     NumFunctionsWithBadCFGs(0),
2014     NumCFGBlocks(0),
2015     MaxCFGBlocksPerFunction(0),
2016     NumUninitAnalysisFunctions(0),
2017     NumUninitAnalysisVariables(0),
2018     MaxUninitAnalysisVariablesPerFunction(0),
2019     NumUninitAnalysisBlockVisits(0),
2020     MaxUninitAnalysisBlockVisitsPerFunction(0) {
2021 
2022   using namespace diag;
2023   DiagnosticsEngine &D = S.getDiagnostics();
2024 
2025   DefaultPolicy.enableCheckUnreachable =
2026     isEnabled(D, warn_unreachable) ||
2027     isEnabled(D, warn_unreachable_break) ||
2028     isEnabled(D, warn_unreachable_return) ||
2029     isEnabled(D, warn_unreachable_loop_increment);
2030 
2031   DefaultPolicy.enableThreadSafetyAnalysis =
2032     isEnabled(D, warn_double_lock);
2033 
2034   DefaultPolicy.enableConsumedAnalysis =
2035     isEnabled(D, warn_use_in_invalid_state);
2036 }
2037 
2038 static void flushDiagnostics(Sema &S, const sema::FunctionScopeInfo *fscope) {
2039   for (const auto &D : fscope->PossiblyUnreachableDiags)
2040     S.Diag(D.Loc, D.PD);
2041 }
2042 
2043 void clang::sema::
2044 AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
2045                                      sema::FunctionScopeInfo *fscope,
2046                                      const Decl *D, const BlockExpr *blkExpr) {
2047 
2048   // We avoid doing analysis-based warnings when there are errors for
2049   // two reasons:
2050   // (1) The CFGs often can't be constructed (if the body is invalid), so
2051   //     don't bother trying.
2052   // (2) The code already has problems; running the analysis just takes more
2053   //     time.
2054   DiagnosticsEngine &Diags = S.getDiagnostics();
2055 
2056   // Do not do any analysis if we are going to just ignore them.
2057   if (Diags.getIgnoreAllWarnings() ||
2058       (Diags.getSuppressSystemWarnings() &&
2059        S.SourceMgr.isInSystemHeader(D->getLocation())))
2060     return;
2061 
2062   // For code in dependent contexts, we'll do this at instantiation time.
2063   if (cast<DeclContext>(D)->isDependentContext())
2064     return;
2065 
2066   if (Diags.hasUncompilableErrorOccurred()) {
2067     // Flush out any possibly unreachable diagnostics.
2068     flushDiagnostics(S, fscope);
2069     return;
2070   }
2071 
2072   const Stmt *Body = D->getBody();
2073   assert(Body);
2074 
2075   // Construct the analysis context with the specified CFG build options.
2076   AnalysisDeclContext AC(/* AnalysisDeclContextManager */ nullptr, D);
2077 
2078   // Don't generate EH edges for CallExprs as we'd like to avoid the n^2
2079   // explosion for destructors that can result and the compile time hit.
2080   AC.getCFGBuildOptions().PruneTriviallyFalseEdges = true;
2081   AC.getCFGBuildOptions().AddEHEdges = false;
2082   AC.getCFGBuildOptions().AddInitializers = true;
2083   AC.getCFGBuildOptions().AddImplicitDtors = true;
2084   AC.getCFGBuildOptions().AddTemporaryDtors = true;
2085   AC.getCFGBuildOptions().AddCXXNewAllocator = false;
2086   AC.getCFGBuildOptions().AddCXXDefaultInitExprInCtors = true;
2087 
2088   // Force that certain expressions appear as CFGElements in the CFG.  This
2089   // is used to speed up various analyses.
2090   // FIXME: This isn't the right factoring.  This is here for initial
2091   // prototyping, but we need a way for analyses to say what expressions they
2092   // expect to always be CFGElements and then fill in the BuildOptions
2093   // appropriately.  This is essentially a layering violation.
2094   if (P.enableCheckUnreachable || P.enableThreadSafetyAnalysis ||
2095       P.enableConsumedAnalysis) {
2096     // Unreachable code analysis and thread safety require a linearized CFG.
2097     AC.getCFGBuildOptions().setAllAlwaysAdd();
2098   }
2099   else {
2100     AC.getCFGBuildOptions()
2101       .setAlwaysAdd(Stmt::BinaryOperatorClass)
2102       .setAlwaysAdd(Stmt::CompoundAssignOperatorClass)
2103       .setAlwaysAdd(Stmt::BlockExprClass)
2104       .setAlwaysAdd(Stmt::CStyleCastExprClass)
2105       .setAlwaysAdd(Stmt::DeclRefExprClass)
2106       .setAlwaysAdd(Stmt::ImplicitCastExprClass)
2107       .setAlwaysAdd(Stmt::UnaryOperatorClass)
2108       .setAlwaysAdd(Stmt::AttributedStmtClass);
2109   }
2110 
2111   // Install the logical handler for -Wtautological-overlap-compare
2112   std::unique_ptr<LogicalErrorHandler> LEH;
2113   if (!Diags.isIgnored(diag::warn_tautological_overlap_comparison,
2114                        D->getLocStart())) {
2115     LEH.reset(new LogicalErrorHandler(S));
2116     AC.getCFGBuildOptions().Observer = LEH.get();
2117   }
2118 
2119   // Emit delayed diagnostics.
2120   if (!fscope->PossiblyUnreachableDiags.empty()) {
2121     bool analyzed = false;
2122 
2123     // Register the expressions with the CFGBuilder.
2124     for (const auto &D : fscope->PossiblyUnreachableDiags) {
2125       if (D.stmt)
2126         AC.registerForcedBlockExpression(D.stmt);
2127     }
2128 
2129     if (AC.getCFG()) {
2130       analyzed = true;
2131       for (const auto &D : fscope->PossiblyUnreachableDiags) {
2132         bool processed = false;
2133         if (D.stmt) {
2134           const CFGBlock *block = AC.getBlockForRegisteredExpression(D.stmt);
2135           CFGReverseBlockReachabilityAnalysis *cra =
2136               AC.getCFGReachablityAnalysis();
2137           // FIXME: We should be able to assert that block is non-null, but
2138           // the CFG analysis can skip potentially-evaluated expressions in
2139           // edge cases; see test/Sema/vla-2.c.
2140           if (block && cra) {
2141             // Can this block be reached from the entrance?
2142             if (cra->isReachable(&AC.getCFG()->getEntry(), block))
2143               S.Diag(D.Loc, D.PD);
2144             processed = true;
2145           }
2146         }
2147         if (!processed) {
2148           // Emit the warning anyway if we cannot map to a basic block.
2149           S.Diag(D.Loc, D.PD);
2150         }
2151       }
2152     }
2153 
2154     if (!analyzed)
2155       flushDiagnostics(S, fscope);
2156   }
2157 
2158   // Warning: check missing 'return'
2159   if (P.enableCheckFallThrough) {
2160     const CheckFallThroughDiagnostics &CD =
2161         (isa<BlockDecl>(D)
2162              ? CheckFallThroughDiagnostics::MakeForBlock()
2163              : (isa<CXXMethodDecl>(D) &&
2164                 cast<CXXMethodDecl>(D)->getOverloadedOperator() == OO_Call &&
2165                 cast<CXXMethodDecl>(D)->getParent()->isLambda())
2166                    ? CheckFallThroughDiagnostics::MakeForLambda()
2167                    : (fscope->isCoroutine()
2168                           ? CheckFallThroughDiagnostics::MakeForCoroutine(D)
2169                           : CheckFallThroughDiagnostics::MakeForFunction(D)));
2170     CheckFallThroughForBody(S, D, Body, blkExpr, CD, AC);
2171   }
2172 
2173   // Warning: check for unreachable code
2174   if (P.enableCheckUnreachable) {
2175     // Only check for unreachable code on non-template instantiations.
2176     // Different template instantiations can effectively change the control-flow
2177     // and it is very difficult to prove that a snippet of code in a template
2178     // is unreachable for all instantiations.
2179     bool isTemplateInstantiation = false;
2180     if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D))
2181       isTemplateInstantiation = Function->isTemplateInstantiation();
2182     if (!isTemplateInstantiation)
2183       CheckUnreachable(S, AC);
2184   }
2185 
2186   // Check for thread safety violations
2187   if (P.enableThreadSafetyAnalysis) {
2188     SourceLocation FL = AC.getDecl()->getLocation();
2189     SourceLocation FEL = AC.getDecl()->getLocEnd();
2190     threadSafety::ThreadSafetyReporter Reporter(S, FL, FEL);
2191     if (!Diags.isIgnored(diag::warn_thread_safety_beta, D->getLocStart()))
2192       Reporter.setIssueBetaWarnings(true);
2193     if (!Diags.isIgnored(diag::warn_thread_safety_verbose, D->getLocStart()))
2194       Reporter.setVerbose(true);
2195 
2196     threadSafety::runThreadSafetyAnalysis(AC, Reporter,
2197                                           &S.ThreadSafetyDeclCache);
2198     Reporter.emitDiagnostics();
2199   }
2200 
2201   // Check for violations of consumed properties.
2202   if (P.enableConsumedAnalysis) {
2203     consumed::ConsumedWarningsHandler WarningHandler(S);
2204     consumed::ConsumedAnalyzer Analyzer(WarningHandler);
2205     Analyzer.run(AC);
2206   }
2207 
2208   if (!Diags.isIgnored(diag::warn_uninit_var, D->getLocStart()) ||
2209       !Diags.isIgnored(diag::warn_sometimes_uninit_var, D->getLocStart()) ||
2210       !Diags.isIgnored(diag::warn_maybe_uninit_var, D->getLocStart())) {
2211     if (CFG *cfg = AC.getCFG()) {
2212       UninitValsDiagReporter reporter(S);
2213       UninitVariablesAnalysisStats stats;
2214       std::memset(&stats, 0, sizeof(UninitVariablesAnalysisStats));
2215       runUninitializedVariablesAnalysis(*cast<DeclContext>(D), *cfg, AC,
2216                                         reporter, stats);
2217 
2218       if (S.CollectStats && stats.NumVariablesAnalyzed > 0) {
2219         ++NumUninitAnalysisFunctions;
2220         NumUninitAnalysisVariables += stats.NumVariablesAnalyzed;
2221         NumUninitAnalysisBlockVisits += stats.NumBlockVisits;
2222         MaxUninitAnalysisVariablesPerFunction =
2223             std::max(MaxUninitAnalysisVariablesPerFunction,
2224                      stats.NumVariablesAnalyzed);
2225         MaxUninitAnalysisBlockVisitsPerFunction =
2226             std::max(MaxUninitAnalysisBlockVisitsPerFunction,
2227                      stats.NumBlockVisits);
2228       }
2229     }
2230   }
2231 
2232   bool FallThroughDiagFull =
2233       !Diags.isIgnored(diag::warn_unannotated_fallthrough, D->getLocStart());
2234   bool FallThroughDiagPerFunction = !Diags.isIgnored(
2235       diag::warn_unannotated_fallthrough_per_function, D->getLocStart());
2236   if (FallThroughDiagFull || FallThroughDiagPerFunction ||
2237       fscope->HasFallthroughStmt) {
2238     DiagnoseSwitchLabelsFallthrough(S, AC, !FallThroughDiagFull);
2239   }
2240 
2241   if (S.getLangOpts().ObjCWeak &&
2242       !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, D->getLocStart()))
2243     diagnoseRepeatedUseOfWeak(S, fscope, D, AC.getParentMap());
2244 
2245 
2246   // Check for infinite self-recursion in functions
2247   if (!Diags.isIgnored(diag::warn_infinite_recursive_function,
2248                        D->getLocStart())) {
2249     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2250       checkRecursiveFunction(S, FD, Body, AC);
2251     }
2252   }
2253 
2254   // Check for throw out of non-throwing function.
2255   if (!Diags.isIgnored(diag::warn_throw_in_noexcept_func, D->getLocStart()))
2256     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
2257       if (S.getLangOpts().CPlusPlus && isNoexcept(FD))
2258         checkThrowInNonThrowingFunc(S, FD, AC);
2259 
2260   // If none of the previous checks caused a CFG build, trigger one here
2261   // for -Wtautological-overlap-compare
2262   if (!Diags.isIgnored(diag::warn_tautological_overlap_comparison,
2263                                D->getLocStart())) {
2264     AC.getCFG();
2265   }
2266 
2267   // Collect statistics about the CFG if it was built.
2268   if (S.CollectStats && AC.isCFGBuilt()) {
2269     ++NumFunctionsAnalyzed;
2270     if (CFG *cfg = AC.getCFG()) {
2271       // If we successfully built a CFG for this context, record some more
2272       // detail information about it.
2273       NumCFGBlocks += cfg->getNumBlockIDs();
2274       MaxCFGBlocksPerFunction = std::max(MaxCFGBlocksPerFunction,
2275                                          cfg->getNumBlockIDs());
2276     } else {
2277       ++NumFunctionsWithBadCFGs;
2278     }
2279   }
2280 }
2281 
2282 void clang::sema::AnalysisBasedWarnings::PrintStats() const {
2283   llvm::errs() << "\n*** Analysis Based Warnings Stats:\n";
2284 
2285   unsigned NumCFGsBuilt = NumFunctionsAnalyzed - NumFunctionsWithBadCFGs;
2286   unsigned AvgCFGBlocksPerFunction =
2287       !NumCFGsBuilt ? 0 : NumCFGBlocks/NumCFGsBuilt;
2288   llvm::errs() << NumFunctionsAnalyzed << " functions analyzed ("
2289                << NumFunctionsWithBadCFGs << " w/o CFGs).\n"
2290                << "  " << NumCFGBlocks << " CFG blocks built.\n"
2291                << "  " << AvgCFGBlocksPerFunction
2292                << " average CFG blocks per function.\n"
2293                << "  " << MaxCFGBlocksPerFunction
2294                << " max CFG blocks per function.\n";
2295 
2296   unsigned AvgUninitVariablesPerFunction = !NumUninitAnalysisFunctions ? 0
2297       : NumUninitAnalysisVariables/NumUninitAnalysisFunctions;
2298   unsigned AvgUninitBlockVisitsPerFunction = !NumUninitAnalysisFunctions ? 0
2299       : NumUninitAnalysisBlockVisits/NumUninitAnalysisFunctions;
2300   llvm::errs() << NumUninitAnalysisFunctions
2301                << " functions analyzed for uninitialiazed variables\n"
2302                << "  " << NumUninitAnalysisVariables << " variables analyzed.\n"
2303                << "  " << AvgUninitVariablesPerFunction
2304                << " average variables per function.\n"
2305                << "  " << MaxUninitAnalysisVariablesPerFunction
2306                << " max variables per function.\n"
2307                << "  " << NumUninitAnalysisBlockVisits << " block visits.\n"
2308                << "  " << AvgUninitBlockVisitsPerFunction
2309                << " average block visits per function.\n"
2310                << "  " << MaxUninitAnalysisBlockVisitsPerFunction
2311                << " max block visits per function.\n";
2312 }
2313