Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -Wself-assign -verify %s
      2 
      3 void f() {
      4   int a = 42, b = 42;
      5   a = a; // expected-warning{{explicitly assigning}}
      6   b = b; // expected-warning{{explicitly assigning}}
      7   a = b;
      8   b = a = b;
      9   a = a = a; // expected-warning{{explicitly assigning}}
     10   a = b = b = a;
     11 }
     12 
     13 // Dummy type.
     14 struct S {};
     15 
     16 void false_positives() {
     17 #define OP =
     18 #define LHS a
     19 #define RHS a
     20   int a = 42;
     21   // These shouldn't warn due to the use of the preprocessor.
     22   a OP a;
     23   LHS = a;
     24   a = RHS;
     25   LHS OP RHS;
     26 #undef OP
     27 #undef LHS
     28 #undef RHS
     29 
     30   S s;
     31   s = s; // Not a builtin assignment operator, no warning.
     32 
     33   // Volatile stores aren't side-effect free.
     34   volatile int vol_a;
     35   vol_a = vol_a;
     36   volatile int &vol_a_ref = vol_a;
     37   vol_a_ref = vol_a_ref;
     38 }
     39 
     40 template <typename T> void g() {
     41   T a;
     42   a = a; // May or may not be a builtin assignment operator, no warning.
     43 }
     44 void instantiate() {
     45   g<int>();
     46   g<S>();
     47 }
     48