https://github.com/tarun-t updated 
https://github.com/llvm/llvm-project/pull/184183

>From fc65de11aba774f70327841a3852539227f82000 Mon Sep 17 00:00:00 2001
From: tarun <[email protected]>
Date: Mon, 2 Mar 2026 22:55:40 +0530
Subject: [PATCH 1/3] [analyzer] Suppress VirtualCall warnings in system
 headers

The optin.cplusplus.VirtualCall checker reports warnings for virtual
method calls during construction/destruction even when the call site
is in a system header (included via -isystem). Users cannot fix such
code and must resort to NOLINT suppressions.

Add a system header check in checkPreCall before emitting the report,
consistent with how other checkers (e.g. MallocChecker) handle this.
---
 .../StaticAnalyzer/Checkers/VirtualCallChecker.cpp    |  5 +++++
 .../test/Analysis/Inputs/virtualcall-system-header.h  | 11 +++++++++++
 clang/test/Analysis/virtualcall.cpp                   |  6 ++++++
 3 files changed, 22 insertions(+)
 create mode 100644 clang/test/Analysis/Inputs/virtualcall-system-header.h

diff --git a/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
index 6c27f58d308aa..160fc2596e485 100644
--- a/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
@@ -118,6 +118,11 @@ void VirtualCallChecker::checkPreCall(const CallEvent 
&Call,
   if (!isVirtualCall(CE))
     return;
 
+  // Don't warn about virtual calls in system headers (e.g. libraries included
+  // via -isystem), as the user has no control over such code.
+  if (C.getSourceManager().isInSystemHeader(CE->getBeginLoc()))
+    return;
+
   const MemRegion *Reg = MC->getCXXThisVal().getAsRegion();
   const ObjectState *ObState = State->get<CtorDtorMap>(Reg);
   if (!ObState)
diff --git a/clang/test/Analysis/Inputs/virtualcall-system-header.h 
b/clang/test/Analysis/Inputs/virtualcall-system-header.h
new file mode 100644
index 0000000000000..2cdde63677364
--- /dev/null
+++ b/clang/test/Analysis/Inputs/virtualcall-system-header.h
@@ -0,0 +1,11 @@
+#pragma clang system_header
+
+struct SysBase {
+  virtual void shutdown() = 0;
+  virtual ~SysBase() = default;
+};
+
+struct SysService : SysBase {
+  void shutdown() override {}
+  ~SysService() override { shutdown(); } // no-warning
+};
diff --git a/clang/test/Analysis/virtualcall.cpp 
b/clang/test/Analysis/virtualcall.cpp
index 82285b6d12844..e403d6ddfc181 100644
--- a/clang/test/Analysis/virtualcall.cpp
+++ b/clang/test/Analysis/virtualcall.cpp
@@ -11,7 +11,13 @@
 // RUN:                    -analyzer-checker=debug.ExprInspection \
 // RUN:                    -std=c++11 -verify=pure,impure -std=c++11 %s
 
+// Verify no warnings for virtual calls in system headers.
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.VirtualCall \
+// RUN:                    -std=c++11 -verify=system %s
+// system-no-diagnostics
+
 #include "virtualcall.h"
+#include "Inputs/virtualcall-system-header.h"
 
 void clang_analyzer_warnIfReached();
 

>From ebb260e2a6ec8d9fdbf4bf5100ca1e28f22dc3ad Mon Sep 17 00:00:00 2001
From: tarun <[email protected]>
Date: Wed, 4 Mar 2026 17:19:49 +0530
Subject: [PATCH 2/3] fix: add impure verify prefix to system header test RUN
 line

The 4th RUN line enables optin.cplusplus.VirtualCall but only
recognizes the 'system' verify prefix. The checker still fires on
non-system-header code annotated with 'impure-warning', causing
11 unexpected diagnostic errors. Adding 'impure' to the verify
prefix list lets those annotations match.
---
 clang/test/Analysis/virtualcall.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/Analysis/virtualcall.cpp 
b/clang/test/Analysis/virtualcall.cpp
index e403d6ddfc181..bb0ebe56de1c4 100644
--- a/clang/test/Analysis/virtualcall.cpp
+++ b/clang/test/Analysis/virtualcall.cpp
@@ -13,7 +13,7 @@
 
 // Verify no warnings for virtual calls in system headers.
 // RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.VirtualCall \
-// RUN:                    -std=c++11 -verify=system %s
+// RUN:                    -std=c++11 -verify=system,impure %s
 // system-no-diagnostics
 
 #include "virtualcall.h"

>From 20bffaa9d82f05d05db919cf6aef0c2b555e25e7 Mon Sep 17 00:00:00 2001
From: tarun <[email protected]>
Date: Wed, 4 Mar 2026 18:00:04 +0530
Subject: [PATCH 3/3] fix: remove system-no-diagnostics conflicting with
 impure-warning directives

---
 clang/test/Analysis/virtualcall.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang/test/Analysis/virtualcall.cpp 
b/clang/test/Analysis/virtualcall.cpp
index bb0ebe56de1c4..ebbfe3c1f9d90 100644
--- a/clang/test/Analysis/virtualcall.cpp
+++ b/clang/test/Analysis/virtualcall.cpp
@@ -14,7 +14,6 @@
 // Verify no warnings for virtual calls in system headers.
 // RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.VirtualCall \
 // RUN:                    -std=c++11 -verify=system,impure %s
-// system-no-diagnostics
 
 #include "virtualcall.h"
 #include "Inputs/virtualcall-system-header.h"

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to