1 | // RUN: %clang_cc1 -fsyntax-only -Wno-objc-root-class -verify %s |
2 | |
3 | class S { |
4 | public: |
5 | int a_; |
6 | void s(int a) { |
7 | a_ = a_; // expected-warning {{assigning field to itself}} |
8 | |
9 | // Don't really care about this one either way. |
10 | this->a_ = a_; // expected-warning {{assigning field to itself}} |
11 | |
12 | a_ += a_; // Shouldn't warn. |
13 | } |
14 | }; |
15 | |
16 | void f0(S* s) { |
17 | // Would be nice to have, but not important. |
18 | s->a_ = s->a_; |
19 | } |
20 | |
21 | void f1(S* s, S* t) { |
22 | // Shouldn't warn. |
23 | t->a_ = s->a_; |
24 | } |
25 | |
26 | struct T { |
27 | S* s_; |
28 | }; |
29 | |
30 | void f2(T* t) { |
31 | // Would be nice to have, but even less important. |
32 | t->s_->a_ = t->s_->a_; |
33 | } |
34 | |
35 | void f3(T* t, T* t2) { |
36 | // Shouldn't warn. |
37 | t2->s_->a_ = t->s_->a_; |
38 | } |
39 | |
40 | void f4(int i) { |
41 | // This is a common pattern to silence "parameter unused". Shouldn't warn. |
42 | i = i; |
43 | |
44 | int j = 0; |
45 | j = j; // Likewise. |
46 | } |
47 | |
48 | @interface I { |
49 | int a_; |
50 | } |
51 | @end |
52 | |
53 | @implementation I |
54 | - (void)setA:(int)a { |
55 | a_ = a_; // expected-warning {{assigning instance variable to itself}} |
56 | } |
57 | |
58 | - (void)foo:(I*)i { |
59 | // Don't care much about this warning. |
60 | i->a_ = i->a_; // expected-warning {{assigning instance variable to itself}} |
61 | |
62 | // Shouldn't warn. |
63 | a_ = i->a_; |
64 | i->a_ = a_; |
65 | } |
66 | @end |
67 | |