================
@@ -1,4 +1,27 @@
-// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify 
%s
+
+void clang_analyzer_warnIfReached();
+
+struct Clazz {
+  template <typename T>
+  static void templated_memfn();
+};
+
+// This must come before the 'templated_memfn' is defined!
+static void instantiate() {
+  Clazz::templated_memfn<int>();
+}
+
+template <typename T>
+void Clazz::templated_memfn() {
+  // When we report a bug in a function, we traverse the lexical decl context
+  // of it while looking for suppression attributes to record what source
----------------
haoNoQ wrote:

Yeah that's correct.

FWIW it's quite valuable to have a \*variant\* of the suppress attribute that 
\*would\* work when applied at call site. This is particularly useful when the 
warning is positioned in a system header. Eg. you dereference a null smart 
pointer, and the warning is in the implementation of the overloaded dereference 
operator, so it'd make a lot of sense to put suppression at the call site of 
the dereference operator, so that you could keep getting warnings about the 
rest of null dereferences through that operator.

But we probably shouldn't handle such cases by default. That's too coarse as it 
allows you to accidentally suppress bug reports across thousands of lines of 
code that you didn't even know were invoked from inside that source range. So 
we only want such a behavior under very specific circumstances.

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

Reply via email to