2012-07-25 15:26:32 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -Wno-objc-root-class -verify %s
|
2012-06-29 07:53:12 +08:00
|
|
|
|
|
|
|
class S {
|
|
|
|
public:
|
|
|
|
int a_;
|
|
|
|
void s(int a) {
|
2012-07-03 10:03:06 +08:00
|
|
|
a_ = a_; // expected-warning {{assigning field to itself}}
|
2012-06-29 07:53:12 +08:00
|
|
|
|
|
|
|
// Don't really care about this one either way.
|
2012-07-03 10:03:06 +08:00
|
|
|
this->a_ = a_; // expected-warning {{assigning field to itself}}
|
2012-06-29 07:53:12 +08:00
|
|
|
|
|
|
|
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
|