19f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth// RUN: %clang_cc1 -fsyntax-only -Wself-assign -verify %s 29f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth 39f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruthvoid f() { 49f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth int a = 42, b = 42; 59f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth a = a; // expected-warning{{explicitly assigning}} 69f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth b = b; // expected-warning{{explicitly assigning}} 79f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth a = b; 89f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth b = a = b; 99f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth a = a = a; // expected-warning{{explicitly assigning}} 109f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth a = b = b = a; 119f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth} 129f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth 139f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth// Dummy type. 149f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruthstruct S {}; 159f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth 169f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruthvoid false_positives() { 179f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth#define OP = 189f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth#define LHS a 199f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth#define RHS a 209f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth int a = 42; 219f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth // These shouldn't warn due to the use of the preprocessor. 229f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth a OP a; 239f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth LHS = a; 249f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth a = RHS; 259f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth LHS OP RHS; 269f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth#undef OP 279f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth#undef LHS 289f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth#undef RHS 299f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth 309f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth S s; 319f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth s = s; // Not a builtin assignment operator, no warning. 329f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth 339f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth // Volatile stores aren't side-effect free. 349f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth volatile int vol_a; 359f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth vol_a = vol_a; 369f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth volatile int &vol_a_ref = vol_a; 379f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth vol_a_ref = vol_a_ref; 389f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth} 399f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth 409f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruthtemplate <typename T> void g() { 419f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth T a; 429f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth a = a; // May or may not be a builtin assignment operator, no warning. 439f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth} 449f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruthvoid instantiate() { 459f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth g<int>(); 469f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth g<S>(); 479f7a6eeee441bcbb1b17208cb3abd65a0017525aChandler Carruth} 48