169c20a1fSNathan James // RUN: %check_clang_tidy %s bugprone-assignment-in-if-condition %t 269c20a1fSNathan James f(int arg)369c20a1fSNathan Jamesvoid f(int arg) { 469c20a1fSNathan James int f = 3; 569c20a1fSNathan James if ((f = arg) || (f == (arg + 1))) 6*32d88239SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] 769c20a1fSNathan James { 869c20a1fSNathan James f = 5; 969c20a1fSNathan James } 1069c20a1fSNathan James } 1169c20a1fSNathan James f1(int arg)1269c20a1fSNathan Jamesvoid f1(int arg) { 1369c20a1fSNathan James int f = 3; 1469c20a1fSNathan James if ((f == arg) || (f = (arg + 1))) 15*32d88239SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] 1669c20a1fSNathan James { 1769c20a1fSNathan James f = 5; 1869c20a1fSNathan James } 1969c20a1fSNathan James } 2069c20a1fSNathan James f2(int arg)2169c20a1fSNathan Jamesvoid f2(int arg) { 2269c20a1fSNathan James int f = 3; 2369c20a1fSNathan James if (f = arg) 24*32d88239SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] 2569c20a1fSNathan James { 2669c20a1fSNathan James f = 5; 2769c20a1fSNathan James } 2869c20a1fSNathan James } 2969c20a1fSNathan James 3069c20a1fSNathan James volatile int v = 32; 3169c20a1fSNathan James f3(int arg)3269c20a1fSNathan Jamesvoid f3(int arg) { 3369c20a1fSNathan James int f = 3; 3469c20a1fSNathan James if ((f == arg) || ((arg + 6 < f) && (f = v))) 35*32d88239SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] 3669c20a1fSNathan James { 3769c20a1fSNathan James f = 5; 3869c20a1fSNathan James } 3969c20a1fSNathan James } 4069c20a1fSNathan James f4(int arg)4169c20a1fSNathan Jamesvoid f4(int arg) { 4269c20a1fSNathan James int f = 3; 4369c20a1fSNathan James if ((f == arg) || ((arg + 6 < f) && ((f = v) || (f < 8)))) 44*32d88239SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] 4569c20a1fSNathan James { 4669c20a1fSNathan James f = 5; 4769c20a1fSNathan James } else if ((arg + 8 < f) && ((f = v) || (f < 8))) 48*32d88239SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] 4969c20a1fSNathan James { 5069c20a1fSNathan James f = 6; 5169c20a1fSNathan James } 5269c20a1fSNathan James } 5369c20a1fSNathan James 5469c20a1fSNathan James class BrokenOperator { 5569c20a1fSNathan James public: 5669c20a1fSNathan James int d = 0; operator =(const int & val)5769c20a1fSNathan James int operator=(const int &val) { 5869c20a1fSNathan James d = val + 1; 5969c20a1fSNathan James return d; 6069c20a1fSNathan James } 6169c20a1fSNathan James }; 6269c20a1fSNathan James f5(int arg)6369c20a1fSNathan Jamesvoid f5(int arg) { 6469c20a1fSNathan James BrokenOperator bo; 6569c20a1fSNathan James int f = 3; 6669c20a1fSNathan James bo = f; 6769c20a1fSNathan James if (bo.d == 3) { 6869c20a1fSNathan James f = 6; 6969c20a1fSNathan James } 7069c20a1fSNathan James if (bo = 3) 71*32d88239SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] 7269c20a1fSNathan James { 7369c20a1fSNathan James f = 7; 7469c20a1fSNathan James } 7569c20a1fSNathan James if ((arg == 3) || (bo = 6)) 76*32d88239SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: an assignment within an 'if' condition is bug-prone [bugprone-assignment-in-if-condition] 7769c20a1fSNathan James { 7869c20a1fSNathan James f = 8; 7969c20a1fSNathan James } 8069c20a1fSNathan James v = f; 8169c20a1fSNathan James } 8269c20a1fSNathan James 8369c20a1fSNathan James // Tests that shouldn't trigger warnings. awesome_f2(int arg)8469c20a1fSNathan Jamesvoid awesome_f2(int arg) { 8569c20a1fSNathan James int f = 3; 8669c20a1fSNathan James if ((f == arg) || (f == (arg + 1))) { 8769c20a1fSNathan James f = 5; 8869c20a1fSNathan James } 8969c20a1fSNathan James } 9069c20a1fSNathan James awesome_f3(int arg)9169c20a1fSNathan Jamesvoid awesome_f3(int arg) { 9269c20a1fSNathan James int f = 3; 9369c20a1fSNathan James if (f == arg) { 9469c20a1fSNathan James f = 5; 9569c20a1fSNathan James } 9669c20a1fSNathan James } 9769c20a1fSNathan James awesome_f4(int arg)9869c20a1fSNathan Jamesvoid awesome_f4(int arg) { 9969c20a1fSNathan James int f = 3; 10069c20a1fSNathan James if ((f == arg) || ((arg + 6 < f) && ((f == v) || (f < 8)))) { 10169c20a1fSNathan James f = 5; 10269c20a1fSNathan James } 10369c20a1fSNathan James } 1046bd98b4fSNathan James exec(Func F)1056bd98b4fSNathan Jamestemplate <typename Func> bool exec(Func F) { return F(); } 1066bd98b4fSNathan James lambda_if()1076bd98b4fSNathan Jamesvoid lambda_if() { 1086bd98b4fSNathan James int X; 1096bd98b4fSNathan James if ([&X] { 1106bd98b4fSNathan James X = 5; 1116bd98b4fSNathan James return true; 1126bd98b4fSNathan James }()) { 1136bd98b4fSNathan James } 1146bd98b4fSNathan James 1156bd98b4fSNathan James if (exec([&] { 1166bd98b4fSNathan James X = 5; 1176bd98b4fSNathan James return true; 1186bd98b4fSNathan James })) { 1196bd98b4fSNathan James } 1206bd98b4fSNathan James } 121