[clang] [Clang] Consider reachability for file-scope warnings on initializers (PR #163885)
Yanzuo Liu via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 17 07:53:44 PDT 2025
================
@@ -2724,6 +2724,80 @@ static void flushDiagnostics(Sema &S, const sema::FunctionScopeInfo *fscope) {
S.Diag(D.Loc, D.PD);
}
+void sema::AnalysisBasedWarnings::FlushDiagnostics(
+ const SmallVector<clang::sema::PossiblyUnreachableDiag, 4> PUDs) {
+ for (const auto &D : PUDs)
+ S.Diag(D.Loc, D.PD);
+}
+
+void sema::AnalysisBasedWarnings::EmitPossiblyUnreachableDiags(
+ AnalysisDeclContext &AC,
+ SmallVector<clang::sema::PossiblyUnreachableDiag, 4> PUDs) {
+
+ if (PUDs.empty()) {
+ return;
+ }
+
+ bool Analyzed = false;
+
+ for (const auto &D : PUDs) {
+ for (const Stmt *S : D.Stmts)
+ AC.registerForcedBlockExpression(S);
+ }
+
+ if (AC.getCFG()) {
+ Analyzed = true;
+ for (const auto &D : PUDs) {
+ bool AllReachable = true;
+ for (const Stmt *St : D.Stmts) {
+ const CFGBlock *block = AC.getBlockForRegisteredExpression(St);
+ CFGReverseBlockReachabilityAnalysis *cra =
+ AC.getCFGReachablityAnalysis();
+ if (block && cra) {
+ // Can this block be reached from the entrance?
+ if (!cra->isReachable(&AC.getCFG()->getEntry(), block)) {
+ AllReachable = false;
+ break;
+ }
+ }
+ // If we cannot map to a basic block, assume the statement is
+ // reachable.
+ }
+
+ if (AllReachable)
+ S.Diag(D.Loc, D.PD);
+ }
+ }
+
+ if (!Analyzed)
+ FlushDiagnostics(PUDs);
+}
+
+void sema::AnalysisBasedWarnings::RegisterVarDeclWarning(
+ VarDecl *VD, clang::sema::PossiblyUnreachableDiag PUD) {
+ VarDeclPossiblyUnreachableDiags[VD].emplace_back(PUD);
+}
+
+void sema::AnalysisBasedWarnings::IssueWarningsForRegisteredVarDecl(
+ VarDecl *VD) {
+ if (VarDeclPossiblyUnreachableDiags.find(VD) ==
+ VarDeclPossiblyUnreachableDiags.end()) {
+ return;
+ }
----------------
zwuis wrote:
```cpp
if (...)
return;
```
Can we use `llvm::is_contained`?
https://github.com/llvm/llvm-project/pull/163885
More information about the cfe-commits
mailing list