summaryrefslogtreecommitdiffstats
path: root/build/clang-plugin/tests/TestKungFuDeathGrip.cpp
blob: 0b94d8a885b76699c2fa91b81d2d2e32df73789d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#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);