Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,14 @@ bool tryToFindPtrOrigin(
bool isASafeCallArg(const Expr *E) {
assert(E);
if (auto *Ref = dyn_cast<DeclRefExpr>(E)) {
if (auto *D = dyn_cast_or_null<VarDecl>(Ref->getFoundDecl())) {
auto *FoundDecl = Ref->getFoundDecl();
if (auto *D = dyn_cast_or_null<VarDecl>(FoundDecl)) {
if (isa<ParmVarDecl>(D) || D->isLocalVarDecl())
return true;
} else if (auto *BD = dyn_cast_or_null<BindingDecl>(FoundDecl)) {
VarDecl *VD = BD->getHoldingVar();
if (VD && (isa<ParmVarDecl>(VD) || VD->isLocalVarDecl()))
return true;
}
}
if (isConstOwnerPtrMemberExpr(E))
Expand Down
34 changes: 34 additions & 0 deletions clang/test/Analysis/Checkers/WebKit/binding-to-refptr.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedCallArgsChecker -verify %s -std=c++2c
// expected-no-diagnostics

#include "mock-types.h"

class Node {
public:
Node* nextSibling() const;

void ref() const;
void deref() const;
};

template <class A, class B> struct pair {
A a;
B b;
template <unsigned I> requires ( I == 0 ) A& get();
template <unsigned I> requires ( I == 1 ) B& get();
};

namespace std {
template <class> struct tuple_size;
template <unsigned, class> struct tuple_element;
template <class A, class B> struct tuple_size<::pair<A, B>> { static constexpr int value = 2; };
template <class A, class B> struct tuple_element<0, ::pair<A, B>> { using type = A; };
template <class A, class B> struct tuple_element<1, ::pair<A, B>> { using type = B; };
}

pair<RefPtr<Node>, RefPtr<Node>> &getPair();

static void testUnpackedAssignment() {
auto [a, b] = getPair();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we also add a test for local vars checker as well?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added

a->nextSibling();
}