Mypal/build/clang-plugin/tests/TestKungFuDeathGrip.cpp
2019-03-11 13:26:37 +03:00

108 lines
4.4 KiB
C++

#define MOZ_IMPLICIT __attribute__((annotate("moz_implicit")))
template <typename T>
class already_AddRefed {
public:
already_AddRefed();
T* mPtr;
};
template <typename T>
class RefPtr {
public:
RefPtr();
MOZ_IMPLICIT RefPtr(T* aIn);
MOZ_IMPLICIT RefPtr(already_AddRefed<T> aIn);
~RefPtr();
T* mPtr;
};
template <typename T>
class nsCOMPtr {
public:
nsCOMPtr();
MOZ_IMPLICIT nsCOMPtr(T* aIn);
MOZ_IMPLICIT nsCOMPtr(already_AddRefed<T> aIn);
~nsCOMPtr();
T* mPtr;
};
class Type {
public:
static nsCOMPtr<Type> someStaticCOMPtr;
void f(nsCOMPtr<Type> ignoredArgument, Type *param) {
nsCOMPtr<Type> never_referenced;
nsCOMPtr<Type> kfdg_t1(this);
nsCOMPtr<Type> kfdg_t2 = this;
nsCOMPtr<Type> kfdg_m1(p); // expected-error {{Unused "kungFuDeathGrip" 'nsCOMPtr<Type>' objects constructed from members are prohibited}} expected-note {{Please switch all accesses to this member to go through 'kfdg_m1', or explicitly pass 'kfdg_m1' to `mozilla::Unused`}}
nsCOMPtr<Type> kfdg_m2 = p; // expected-error {{Unused "kungFuDeathGrip" 'nsCOMPtr<Type>' objects constructed from members are prohibited}} expected-note {{Please switch all accesses to this member to go through 'kfdg_m2', or explicitly pass 'kfdg_m2' to `mozilla::Unused`}}
nsCOMPtr<Type> kfdg_m3(p);
kfdg_m3.mPtr->f(nullptr, nullptr);
nsCOMPtr<Type> kfdg_m4 = p;
kfdg_m4.mPtr->f(nullptr, nullptr);
nsCOMPtr<Type> kfdg_a1((already_AddRefed<Type>()));
nsCOMPtr<Type> kfdg_a2 = already_AddRefed<Type>();
nsCOMPtr<Type> kfdg_p1(param);
nsCOMPtr<Type> kfdg_p2 = param;
RefPtr<Type> never_referenced2;
RefPtr<Type> kfdg_t3(this);
RefPtr<Type> kfdg_t4 = this;
RefPtr<Type> kfdg_m5(p); // expected-error {{Unused "kungFuDeathGrip" 'RefPtr<Type>' objects constructed from members are prohibited}} expected-note {{Please switch all accesses to this member to go through 'kfdg_m5', or explicitly pass 'kfdg_m5' to `mozilla::Unused`}}
RefPtr<Type> kfdg_m6 = p; // expected-error {{Unused "kungFuDeathGrip" 'RefPtr<Type>' objects constructed from members are prohibited}} expected-note {{Please switch all accesses to this member to go through 'kfdg_m6', or explicitly pass 'kfdg_m6' to `mozilla::Unused`}}
RefPtr<Type> kfdg_m7(p);
kfdg_m7.mPtr->f(nullptr, nullptr);
RefPtr<Type> kfdg_m8 = p;
kfdg_m8.mPtr->f(nullptr, nullptr);
RefPtr<Type> kfdg_a3((already_AddRefed<Type>()));
RefPtr<Type> kfdg_a4 = already_AddRefed<Type>();
RefPtr<Type> kfdg_p3(param);
RefPtr<Type> kfdg_p4 = param;
}
Type *p;
};
void f(nsCOMPtr<Type> ignoredArgument, Type *param) {
nsCOMPtr<Type> never_referenced;
Type t;
// Type *p = nullptr;
nsCOMPtr<Type> kfdg_m1(t.p); // expected-error {{Unused "kungFuDeathGrip" 'nsCOMPtr<Type>' objects constructed from members are prohibited}} expected-note {{Please switch all accesses to this member to go through 'kfdg_m1', or explicitly pass 'kfdg_m1' to `mozilla::Unused`}}
nsCOMPtr<Type> kfdg_m2 = t.p; // expected-error {{Unused "kungFuDeathGrip" 'nsCOMPtr<Type>' objects constructed from members are prohibited}} expected-note {{Please switch all accesses to this member to go through 'kfdg_m2', or explicitly pass 'kfdg_m2' to `mozilla::Unused`}}
nsCOMPtr<Type> kfdg_m3(t.p);
kfdg_m3.mPtr->f(nullptr, nullptr);
nsCOMPtr<Type> kfdg_m4 = t.p;
kfdg_m4.mPtr->f(nullptr, nullptr);
nsCOMPtr<Type> kfdg_a1((already_AddRefed<Type>()));
nsCOMPtr<Type> kfdg_a2 = already_AddRefed<Type>();
nsCOMPtr<Type> kfdg_p1(param);
nsCOMPtr<Type> kfdg_p2 = param;
RefPtr<Type> never_referenced2;
RefPtr<Type> kfdg_m5(t.p); // expected-error {{Unused "kungFuDeathGrip" 'RefPtr<Type>' objects constructed from members are prohibited}} expected-note {{Please switch all accesses to this member to go through 'kfdg_m5', or explicitly pass 'kfdg_m5' to `mozilla::Unused`}}
RefPtr<Type> kfdg_m6 = t.p; // expected-error {{Unused "kungFuDeathGrip" 'RefPtr<Type>' objects constructed from members are prohibited}} expected-note {{Please switch all accesses to this member to go through 'kfdg_m6', or explicitly pass 'kfdg_m6' to `mozilla::Unused`}}
RefPtr<Type> kfdg_m7(t.p);
kfdg_m7.mPtr->f(nullptr, nullptr);
RefPtr<Type> kfdg_m8 = t.p;
kfdg_m8.mPtr->f(nullptr, nullptr);
RefPtr<Type> kfdg_a3((already_AddRefed<Type>()));
RefPtr<Type> kfdg_a4 = already_AddRefed<Type>();
RefPtr<Type> kfdg_p3(param);
RefPtr<Type> kfdg_p4 = param;
}
nsCOMPtr<Type> Type::someStaticCOMPtr(nullptr);