Files
clang-p2996/clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp
Ryosuke Niwa bb0cc69487 [webkit.NoUncountedMemberChecker] Fix a regression that every class is treated as if it's ref countable. (#131249)
This PR fixes a regression that webkit.NoUncountedMemberChecker and
alpha.webkit.NoUncheckedMemberChecker emits warnings for every class as
if they supported ref counting and checked ptr because we were
erroneously coercing the return value of isRefCountable and
isCheckedPtrCapable, which is std::optional<bool>, to boolean values.
2025-03-18 15:43:43 -07:00

70 lines
1.5 KiB
C++

// RUN: %clang_analyze_cc1 -analyzer-checker=webkit.NoUncountedMemberChecker -verify %s
#include "mock-types.h"
#include "mock-system-header.h"
namespace members {
struct Foo {
private:
RefCountable* a = nullptr;
// expected-warning@-1{{Member variable 'a' in 'members::Foo' is a raw pointer to ref-countable type 'RefCountable'}}
[[clang::suppress]]
RefCountable* a_suppressed = nullptr;
protected:
RefPtr<RefCountable> b;
public:
RefCountable silenceWarningAboutInit;
RefCountable& c = silenceWarningAboutInit;
// expected-warning@-1{{Member variable 'c' in 'members::Foo' is a reference to ref-countable type 'RefCountable'}}
Ref<RefCountable> d;
};
template<class T>
struct FooTmpl {
T* a;
// expected-warning@-1{{Member variable 'a' in 'members::FooTmpl<RefCountable>' is a raw pointer to ref-countable type 'RefCountable'}}
};
void forceTmplToInstantiate(FooTmpl<RefCountable>) {}
struct [[clang::suppress]] FooSuppressed {
private:
RefCountable* a = nullptr;
};
}
namespace ignore_unions {
union Foo {
RefCountable* a;
RefPtr<RefCountable> b;
Ref<RefCountable> c;
};
template<class T>
union RefPtr {
T* a;
};
void forceTmplToInstantiate(RefPtr<RefCountable>) {}
}
namespace ignore_system_header {
void foo(RefCountable* t) {
MemberVariable<RefCountable> var { t };
var.obj->method();
}
} // ignore_system_header
namespace ignore_non_ref_countable {
struct Foo {
};
struct Bar {
Foo* foo;
};
}