warn-self-assign-field.mm
1.15 KB
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
// RUN: %clang_cc1 -fsyntax-only -Wno-objc-root-class -verify %s
class S {
public:
int a_;
void s(int a) {
a_ = a_; // expected-warning {{assigning field to itself}}
// Don't really care about this one either way.
this->a_ = a_; // expected-warning {{assigning field to itself}}
a_ += a_; // Shouldn't warn.
}
};
void f0(S* s) {
// Would be nice to have, but not important.
s->a_ = s->a_;
}
void f1(S* s, S* t) {
// Shouldn't warn.
t->a_ = s->a_;
}
struct T {
S* s_;
};
void f2(T* t) {
// Would be nice to have, but even less important.
t->s_->a_ = t->s_->a_;
}
void f3(T* t, T* t2) {
// Shouldn't warn.
t2->s_->a_ = t->s_->a_;
}
void f4(int i) {
// This is a common pattern to silence "parameter unused". Shouldn't warn.
i = i;
int j = 0;
j = j; // Likewise.
}
@interface I {
int a_;
}
@end
@implementation I
- (void)setA:(int)a {
a_ = a_; // expected-warning {{assigning instance variable to itself}}
}
- (void)foo:(I*)i {
// Don't care much about this warning.
i->a_ = i->a_; // expected-warning {{assigning instance variable to itself}}
// Shouldn't warn.
a_ = i->a_;
i->a_ = a_;
}
@end