diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index 9b1d7ae3e6a32..c1f180f31338c 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -186,8 +186,7 @@ bool isPtrConversion(const FunctionDecl *F) { // FIXME: check # of params == 1 const auto FunctionName = safeGetName(F); if (FunctionName == "getPtr" || FunctionName == "WeakPtr" || - FunctionName == "makeWeakPtr" - + FunctionName == "dynamicDowncast" || FunctionName == "downcast" || FunctionName == "bitwise_cast") return true; diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp index 4ae8c442fa707..407b6ba7a7642 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp @@ -149,7 +149,7 @@ class UncountedCallArgsChecker auto name = safeGetName(Callee); if (name == "adoptRef" || name == "getPtr" || name == "WeakPtr" || - name == "makeWeakPtr" || name == "downcast" || name == "bitwise_cast" || + name == "dynamicDowncast" || name == "downcast" || name == "bitwise_cast" || name == "is" || name == "equal" || name == "hash" || name == "isType" // FIXME: Most/all of these should be implemented via attributes. diff --git a/clang/test/Analysis/Checkers/WebKit/call-args-dynamic-downcast.cpp b/clang/test/Analysis/Checkers/WebKit/call-args-dynamic-downcast.cpp new file mode 100644 index 0000000000000..28156623d9a0f --- /dev/null +++ b/clang/test/Analysis/Checkers/WebKit/call-args-dynamic-downcast.cpp @@ -0,0 +1,35 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedCallArgsChecker -verify %s +// expected-no-diagnostics + +class Base { +public: + inline void ref(); + inline void deref(); +}; + +class Derived : public Base { +public: + virtual ~Derived(); + + void ref() const; + void deref() const; +}; + +class SubDerived final : public Derived { +}; + +class OtherObject { +public: + Derived* obj(); +}; + +template +inline Target* dynamicDowncast(Source* source) +{ + return static_cast(source); +} + +void foo(OtherObject* other) +{ + dynamicDowncast(other->obj()); +} diff --git a/clang/test/Analysis/Checkers/WebKit/call-args.cpp b/clang/test/Analysis/Checkers/WebKit/call-args.cpp index a56c4222adb51..716219836e6b4 100644 --- a/clang/test/Analysis/Checkers/WebKit/call-args.cpp +++ b/clang/test/Analysis/Checkers/WebKit/call-args.cpp @@ -262,22 +262,6 @@ namespace param_forwarding_method { } } -namespace make_ref { - void makeRef(RefCountable*) {} - void makeRefPtr(RefCountable*) {} - void makeWeakPtr(RefCountable*) {} - void makeWeakPtr(RefCountable&) {} - - void foo() { - makeRef(provide()); - makeRefPtr(provide()); - RefPtr a(provide()); - Ref b(provide()); - makeWeakPtr(provide()); - makeWeakPtr(*provide()); - } -} - namespace downcast { void consume_ref_countable(RefCountable*) {} RefCountable* downcast(RefCountable*) { return nullptr; }