diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index e043806eadd6a..71440e6d08a1c 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -414,7 +414,8 @@ class TrivialFunctionAnalysisVisitor Name == "isMainThreadOrGCThread" || Name == "isMainRunLoop" || Name == "isWebThread" || Name == "isUIThread" || Name == "mayBeGCThread" || Name == "compilerFenceForCrash" || - Name == "bitwise_cast" || Name.find("__builtin") == 0) + Name == "bitwise_cast" || Name.find("__builtin") == 0 || + Name == "__libcpp_verbose_abort") return true; return IsFunctionTrivial(Callee); diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg-std-array.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg-std-array.cpp new file mode 100644 index 0000000000000..ed28a64bba059 --- /dev/null +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg-std-array.cpp @@ -0,0 +1,39 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedCallArgsChecker -verify %s +// expected-no-diagnostics + +#include "mock-types.h" + +void __libcpp_verbose_abort(const char *__format, ...); + +using size_t = __typeof(sizeof(int)); +namespace std{ +template +class array { + T elements[N]; + + public: + T& operator[](unsigned i) { + if (i >= N) { + __libcpp_verbose_abort("%s", "aborting"); + } + return elements[i]; + } +}; +} + +class ArrayClass { +public: + void ref() const; + void deref() const; + typedef std::array, 4> Matrix; + double e() { return matrix[3][0]; } + Matrix matrix; +}; + +class AnotherClass { + RefPtr matrix; + void test() { + double val = { matrix->e()}; + } +}; + diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp index 10da776f81575..e1dacdd9e25b6 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp @@ -238,6 +238,8 @@ class SomeType : public BaseType { using BaseType::BaseType; }; +void __libcpp_verbose_abort(const char *__format, ...); + class RefCounted { public: void ref() const; @@ -361,6 +363,9 @@ class RefCounted { void trivial62() { WTFReportBacktrace(); } SomeType trivial63() { return SomeType(0); } SomeType trivial64() { return SomeType(); } + void trivial65() { + __libcpp_verbose_abort("%s", "aborting"); + } static RefCounted& singleton() { static RefCounted s_RefCounted; @@ -544,6 +549,7 @@ class UnrelatedClass { getFieldTrivial().trivial62(); // no-warning getFieldTrivial().trivial63(); // no-warning getFieldTrivial().trivial64(); // no-warning + getFieldTrivial().trivial65(); // no-warning RefCounted::singleton().trivial18(); // no-warning RefCounted::singleton().someFunction(); // no-warning