xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/assignment-in-if-condition.cpp (revision 32d88239ae654239f16b516ee81ee9ff88b0ce07)
169c20a1fSNathan James // RUN: %check_clang_tidy %s bugprone-assignment-in-if-condition %t
269c20a1fSNathan James 
f(int arg)369c20a1fSNathan James void 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 James void 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 James void 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 James void 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 James void 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 James void 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 James void 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 James void 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 James void 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 James template <typename Func> bool exec(Func F) { return F(); }
1066bd98b4fSNathan James 
lambda_if()1076bd98b4fSNathan James void 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