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