1 // Test the self-assignemnt detection plugin.
2 // { dg-do compile }
3 // { dg-options "-O" }
4 
5 class Foo {
6  private:
7   int a_;
8 
9  public:
Foo()10   Foo() : a_(a_) {} // { dg-warning "assigned to itself" }
11 
setA(int a)12   void setA(int a) {
13     a_ = a_; // { dg-warning "assigned to itself" }
14   }
15 
16   void operator=(Foo& rhs) {
17     this->a_ = rhs.a_;
18   }
19 };
20 
21 struct Bar {
22   int b_;
23   int c_;
24 };
25 
26 int g = g; // { dg-warning "assigned to itself" }
27 Foo foo = foo; // { dg-warning "assigned to itself" }
28 
func()29 void func()
30 {
31   Bar *bar1, bar2;
32   Foo local_foo;
33   int x = x; // { dg-warning "assigned to itself" }
34   static int y = y; // { dg-warning "assigned to itself" }
35   float *f;
36   Bar bar_array[5];
37   char n;
38   int overflow;
39 
40   *f = *f; // { dg-warning "assigned to itself" }
41   bar1->b_ = bar1->b_; // { dg-warning "assigned to itself" }
42   bar2.c_ = bar2.c_; // { dg-warning "assigned to itself" }
43   local_foo = local_foo; // { dg-warning "assigned to itself" }
44   foo = foo; // { dg-warning "assigned to itself" }
45   foo.setA(5);
46   bar_array[3].c_ = bar_array[3].c_; // { dg-warning "assigned to itself" }
47   bar_array[x+g].b_ = bar_array[x+g].b_; // { dg-warning "self-assignment detected" "" { xfail *-*-* } }
48   y = x;
49   x = y;
50 }
51