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