diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp index f81db0e67d835c..be07cf51eefb3d 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp @@ -28,6 +28,13 @@ bool tryToFindPtrOrigin( E = tempExpr->getSubExpr(); continue; } + if (auto *tempExpr = dyn_cast(E)) { + if (auto *C = tempExpr->getConstructor()) { + if (auto *Class = C->getParent(); Class && isRefCounted(Class)) + return callback(E, true); + break; + } + } if (auto *tempExpr = dyn_cast(E)) { E = tempExpr->getSubExpr(); continue; diff --git a/clang/test/Analysis/Checkers/WebKit/call-args.cpp b/clang/test/Analysis/Checkers/WebKit/call-args.cpp index e1bee8a23a250a..94efddeaf66cd8 100644 --- a/clang/test/Analysis/Checkers/WebKit/call-args.cpp +++ b/clang/test/Analysis/Checkers/WebKit/call-args.cpp @@ -358,3 +358,10 @@ namespace call_with_ptr_on_ref { // expected-warning@-1{{Call argument for parameter 'bad' is uncounted and unsafe}} } } + +namespace call_with_explicit_temporary_obj { + void foo() { + Ref { *provide() }->method(); + RefPtr { provide() }->method(); + } +}