https://github.com/vabridgers updated https://github.com/llvm/llvm-project/pull/119543
>From 952b30598c7583f3f5508e5fda59d91d64d5d163 Mon Sep 17 00:00:00 2001 From: Vince Bridgers <vince.a.bridg...@gmail.com> Date: Wed, 11 Dec 2024 12:11:31 +0100 Subject: [PATCH 1/3] [analyzer] Split alpha core Identical Expression tests Split the remnant test from PR #114715, "Remove alpha.core.IdenticalExpr Checker" into seperate tests for misc-redundant-expression and bugprone-branch-clone per review comment requests. --- .../bugprone/bugprone-branch-clone.cpp | 772 ++++++++++++++++++ .../misc-redundant-expression.cpp} | 416 ---------- 2 files changed, 772 insertions(+), 416 deletions(-) create mode 100644 clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp rename clang-tools-extra/test/clang-tidy/checkers/{bugprone/alpha-core-identicalexpr.cpp => misc/misc-redundant-expression.cpp} (69%) diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp new file mode 100644 index 00000000000000..fa19037cc437e3 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp @@ -0,0 +1,772 @@ +// RUN: clang-tidy %s -checks="-*,bugprone-branch-clone" -- 2>&1 | FileCheck %s --check-prefix=CHECK-MESSAGES-BUGPRONEBRANCH + +/* Only one expected warning per function allowed at the very end. */ + +int func(void) +{ + return 0; +} + +int func2(void) +{ + return 0; +} + +int funcParam(int a) +{ + return 0; +} + +/* '!=' operator*/ + + +/* '!=' with int pointer */ + +int checkNotEqualIntPointerLiteralCompare1(void) { + int* p = 0; + return (p != 0); // no warning +} + +int checkNotEqualIntPointerLiteralCompare2(void) { + return (6 != 7); // no warning +} + +int checkNotEqualIntPointerDeclCompare1(void) { + int k = 3; + int* f = &k; + int* g = &k; + return (f != g); // no warning +} + +int checkNotEqualCastIntPointerDeclCompare11(void) { + int k = 7; + int* f = &k; + return ((int*)f != (int*)f); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:19: warning: both sides of operator are equivalent [misc-redundant-expression] +} +int checkNotEqualCastIntPointerDeclCompare12(void) { + int k = 7; + int* f = &k; + return ((int*)((char*)f) != (int*)f); // no warning +} +int checkNotEqualBinaryOpIntPointerCompare1(void) { + int k = 7; + int res; + int* f= &k; + res = (f + 4 != f + 4); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:16: warning: both sides of operator are equivalent [misc-redundant-expression] + return (0); +} +int checkNotEqualBinaryOpIntPointerCompare2(void) { + int k = 7; + int* f = &k; + int* g = &k; + return (f + 4 != g + 4); // no warning +} + + +int checkNotEqualBinaryOpIntPointerCompare3(void) { + int k = 7; + int res; + int* f= &k; + res = ((int*)f + 4 != (int*)f + 4); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:22: warning: both sides of operator are equivalent [misc-redundant-expression] + return (0); +} +int checkNotEqualBinaryOpIntPointerCompare4(void) { + int k = 7; + int res; + int* f= &k; + res = ((int*)f + 4 != (int*)((char*)f) + 4); // no warning + return (0); +} + +int checkNotEqualNestedBinaryOpIntPointerCompare1(void) { + int res; + int k = 7; + int t= 1; + int* u= &k+2; + int* f= &k+3; + res = ((f + (3)*t) != (f + (3)*t)); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:22: warning: both sides of operator are equivalent [misc-redundant-expression] + return (0); +} + +int checkNotEqualNestedBinaryOpIntPointerCompare2(void) { + int res; + int k = 7; + int t= 1; + int* u= &k+2; + int* f= &k+3; + res = (((3)*t + f) != (f + (3)*t)); // no warning + return (0); +} +/* end '!=' int* */ + +/* '!=' with function*/ + +int checkNotEqualSameFunction() { + unsigned a = 0; + unsigned b = 1; + int res = (a+func() != a+func()); // no warning + return (0); +} + +int checkNotEqualDifferentFunction() { + unsigned a = 0; + unsigned b = 1; + int res = (a+func() != a+func2()); // no warning + return (0); +} + +int checkNotEqualSameFunctionSameParam() { + unsigned a = 0; + unsigned b = 1; + int res = (a+funcParam(a) != a+funcParam(a)); // no warning + return (0); +} + +int checkNotEqualSameFunctionDifferentParam() { + unsigned a = 0; + unsigned b = 1; + int res = (a+funcParam(a) != a+funcParam(b)); // no warning + return (0); +} + +/* end '!=' with function*/ + +/* end '!=' */ + + +/* Checking use of identical expressions in conditional operator*/ + +unsigned test_unsigned(unsigned a) { + unsigned b = 1; + a = a > 5 ? b : b; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] + return a; +} + +void test_signed() { + int a = 0; + a = a > 5 ? a : a; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_bool(bool a) { + a = a > 0 ? a : a; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_float() { + float a = 0; + float b = 0; + a = a > 5 ? a : a; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +const char *test_string() { + float a = 0; + return a > 5 ? "abc" : "abc"; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:16: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_unsigned_expr() { + unsigned a = 0; + unsigned b = 0; + a = a > 5 ? a+b : a+b; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_signed_expr() { + int a = 0; + int b = 1; + a = a > 5 ? a+b : a+b; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_bool_expr(bool a) { + bool b = 0; + a = a > 0 ? a&&b : a&&b; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_unsigned_expr_negative() { + unsigned a = 0; + unsigned b = 0; + a = a > 5 ? a+b : b+a; // no warning +} + +void test_signed_expr_negative() { + int a = 0; + int b = 1; + a = a > 5 ? b+a : a+b; // no warning +} + +void test_bool_expr_negative(bool a) { + bool b = 0; + a = a > 0 ? a&&b : b&&a; // no warning +} + +void test_float_expr_positive() { + float a = 0; + float b = 0; + a = a > 5 ? a+b : a+b; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_expr_positive_func() { + unsigned a = 0; + unsigned b = 1; + a = a > 5 ? a+func() : a+func(); +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_expr_negative_func() { + unsigned a = 0; + unsigned b = 1; + a = a > 5 ? a+func() : a+func2(); // no warning +} + +void test_expr_positive_funcParam() { + unsigned a = 0; + unsigned b = 1; + a = a > 5 ? a+funcParam(b) : a+funcParam(b); +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_expr_negative_funcParam() { + unsigned a = 0; + unsigned b = 1; + a = a > 5 ? a+funcParam(a) : a+funcParam(b); // no warning +} + +void test_expr_positive_inc() { + unsigned a = 0; + unsigned b = 1; + a = a > 5 ? a++ : a++; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_expr_negative_inc() { + unsigned a = 0; + unsigned b = 1; + a = a > 5 ? a++ : b++; // no warning +} + +void test_expr_positive_assign() { + unsigned a = 0; + unsigned b = 1; + a = a > 5 ? a=1 : a=1; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_expr_negative_assign() { + unsigned a = 0; + unsigned b = 1; + a = a > 5 ? a=1 : a=2; // no warning +} + +void test_signed_nested_expr() { + int a = 0; + int b = 1; + int c = 3; + a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(c+a)); +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_signed_nested_expr_negative() { + int a = 0; + int b = 1; + int c = 3; + a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(a+c)); // no warning +} + +void test_signed_nested_cond_expr_negative() { + int a = 0; + int b = 1; + int c = 3; + a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 2 : 4); // no warning +} + +void test_signed_nested_cond_expr() { + int a = 0; + int b = 1; + int c = 3; + a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 4 : 4); +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:40: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} + +void test_identical_branches1(bool b) { + int i = 0; + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + ++i; + } else { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + ++i; + } +} + +void test_identical_branches2(bool b) { + int i = 0; + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + ++i; + } else +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + ++i; +} + +void test_identical_branches3(bool b) { + int i = 0; + if (b) { // no warning + ++i; + } else { + i++; + } +} + +void test_identical_branches4(bool b) { + int i = 0; + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + } else { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + } +} + +void test_identical_branches_break(bool b) { + while (true) { + if (b) +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] + break; + else +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + break; + } +} + +void test_identical_branches_continue(bool b) { + while (true) { + if (b) +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] + continue; + else +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + continue; + } +} + +void test_identical_branches_func(bool b) { + if (b) +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + func(); + else +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: note: else branch starts here + func(); +} + +void test_identical_branches_func_arguments(bool b) { + if (b) // no-warning + funcParam(1); + else + funcParam(2); +} + +void test_identical_branches_cast1(bool b) { + long v = -7; + if (b) // no-warning + v = (signed int) v; + else + v = (unsigned int) v; +} + +void test_identical_branches_cast2(bool b) { + long v = -7; + if (b) +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + v = (signed int) v; + else +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: note: else branch starts here + v = (signed int) v; +} + +int test_identical_branches_return_int(bool b) { + int i = 0; + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + i++; + return i; + } else { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + i++; + return i; + } +} + +int test_identical_branches_return_func(bool b) { + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + return func(); + } else { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + return func(); + } +} + +void test_identical_branches_for(bool b) { + int i; + int j; + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + for (i = 0, j = 0; i < 10; i++) + j += 4; + } else { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + for (i = 0, j = 0; i < 10; i++) + j += 4; + } +} + +void test_identical_branches_while(bool b) { + int i = 10; + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + while (func()) + i--; + } else { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + while (func()) + i--; + } +} + +void test_identical_branches_while_2(bool b) { + int i = 10; + if (b) { // no-warning + while (func()) + i--; + } else { + while (func()) + i++; + } +} + +void test_identical_branches_do_while(bool b) { + int i = 10; + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + do { + i--; + } while (func()); + } else { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + do { + i--; + } while (func()); + } +} + +void test_identical_branches_if(bool b, int i) { + if (b) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] + if (i < 5) + i += 10; + } else { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here + if (i < 5) + i += 10; + } +} + +void test_identical_bitwise1() { + int a = 5 | 5; // no-warning +} + +void test_identical_bitwise2() { + int a = 5; + int b = a | a; // no-warning +} + +void test_identical_bitwise3() { + int a = 5; + int b = (a | a); // no-warning +} + +void test_identical_bitwise4() { + int a = 4; + int b = a | 4; // no-warning +} + +void test_identical_bitwise5() { + int a = 4; + int b = 4; + int c = a | b; // no-warning +} + +void test_identical_bitwise6() { + int a = 5; + int b = a | 4 | a; +} + +void test_identical_bitwise7() { + int a = 5; + int b = func() | func(); +} + +void test_identical_logical1(int a) { + if (a == 4 && a == 4) + ; +} + +void test_identical_logical2(int a) { + if (a == 4 || a == 5 || a == 4) + ; +} + +void test_identical_logical3(int a) { + if (a == 4 || a == 5 || a == 6) // no-warning + ; +} + +void test_identical_logical4(int a) { + if (a == func() || a == func()) // no-warning + ; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wlogical-op-parentheses" +void test_identical_logical5(int x, int y) { + if (x == 4 && y == 5 || x == 4 && y == 6) // no-warning + ; +} + +void test_identical_logical6(int x, int y) { + if (x == 4 && y == 5 || x == 4 && y == 5) + ; +} + +void test_identical_logical7(int x, int y) { + // FIXME: We should warn here + if (x == 4 && y == 5 || x == 4) + ; +} + +void test_identical_logical8(int x, int y) { + // FIXME: We should warn here + if (x == 4 || y == 5 && x == 4) + ; +} + +void test_identical_logical9(int x, int y) { + // FIXME: We should warn here + if (x == 4 || x == 4 && y == 5) + ; +} +#pragma clang diagnostic pop + +void test_warn_chained_if_stmts_1(int x) { + if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +} + +void test_warn_chained_if_stmts_2(int x) { + if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here + else if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +} + +void test_warn_chained_if_stmts_3(int x) { + if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x == 2) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here + else if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +} + +void test_warn_chained_if_stmts_4(int x) { + if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (func()) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here + else if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +} + +void test_warn_chained_if_stmts_5(int x) { + if (x & 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x & 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +} + +void test_warn_chained_if_stmts_6(int x) { + if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x == 2) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here + else if (x == 2) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here + else if (x == 3) + ; +} + +void test_warn_chained_if_stmts_7(int x) { + if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x == 2) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here + else if (x == 3) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here + else if (x == 2) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 3 starts here + else if (x == 5) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 4 starts here +} + +void test_warn_chained_if_stmts_8(int x) { + if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x == 2) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here + else if (x == 3) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here + else if (x == 2) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 3 starts here + else if (x == 5) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 4 starts here + else if (x == 3) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 5 starts here + else if (x == 7) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 6 starts here +} + +void test_nowarn_chained_if_stmts_1(int x) { + if (func()) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (func()) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +} + +void test_nowarn_chained_if_stmts_2(int x) { + if (func()) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x == 1) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here + else if (func()) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +} + +void test_nowarn_chained_if_stmts_3(int x) { + if (x++) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original + else if (x++) + ; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +} + +void test_warn_wchar() { + const wchar_t * a = 0 ? L"Warning" : L"Warning"; +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:25: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +} +void test_nowarn_wchar() { + const wchar_t * a = 0 ? L"No" : L"Warning"; +} + +void test_nowarn_long() { + int a = 0, b = 0; + long c; + if (0) { + b -= a; + c = 0; + } else { + b -= a; + c = 0LL; + } +} + +// Identical inner conditions + +void test_warn_inner_if_1(int x) { + if (x == 1) { +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical inner if statement [bugprone-branch-clone] + if (x == 1) +// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: inner if starts here + ; + } + + // FIXME: Should warn here. The warning is currently not emitted because there + // is code between the conditions. + if (x == 1) { + int y = x; + if (x == 1) + ; + } +} + +void test_nowarn_inner_if_1(int x) { + // Don't warn when condition has side effects. + if (x++ == 1) { + if (x++ == 1) + ; + } + + // Don't warn when x is changed before inner condition. + if (x < 10) { + x++; + if (x < 10) + ; + } +} diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/alpha-core-identicalexpr.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp similarity index 69% rename from clang-tools-extra/test/clang-tidy/checkers/bugprone/alpha-core-identicalexpr.cpp rename to clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp index 8eff3ebc948dea..db07118c8c9cfa 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/alpha-core-identicalexpr.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp @@ -1,5 +1,4 @@ // RUN: clang-tidy %s -checks="-*,misc-redundant-expression" -- 2>&1 | FileCheck %s --check-prefix=CHECK-MESSAGES-IDENTEXPR -// RUN: clang-tidy %s -checks="-*,bugprone-branch-clone" -- 2>&1 | FileCheck %s --check-prefix=CHECK-MESSAGES-BUGPRONEBRANCH /* Only one expected warning per function allowed at the very end. */ @@ -1066,7 +1065,6 @@ unsigned test_unsigned(unsigned a) { unsigned b = 1; a = a > 5 ? b : b; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:17: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] return a; } @@ -1074,13 +1072,11 @@ void test_signed() { int a = 0; a = a > 5 ? a : a; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:17: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_bool(bool a) { a = a > 0 ? a : a; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:17: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_float() { @@ -1088,14 +1084,12 @@ void test_float() { float b = 0; a = a > 5 ? a : a; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:17: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } const char *test_string() { float a = 0; return a > 5 ? "abc" : "abc"; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:24: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:16: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_unsigned_expr() { @@ -1103,7 +1097,6 @@ void test_unsigned_expr() { unsigned b = 0; a = a > 5 ? a+b : a+b; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:19: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_signed_expr() { @@ -1111,14 +1104,12 @@ void test_signed_expr() { int b = 1; a = a > 5 ? a+b : a+b; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:19: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_bool_expr(bool a) { bool b = 0; a = a > 0 ? a&&b : a&&b; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:20: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_unsigned_expr_negative() { @@ -1143,7 +1134,6 @@ void test_float_expr_positive() { float b = 0; a = a > 5 ? a+b : a+b; // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:19: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_expr_positive_func() { @@ -1151,7 +1141,6 @@ void test_expr_positive_func() { unsigned b = 1; a = a > 5 ? a+func() : a+func(); // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:24: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_expr_negative_func() { @@ -1165,7 +1154,6 @@ void test_expr_positive_funcParam() { unsigned b = 1; a = a > 5 ? a+funcParam(b) : a+funcParam(b); // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:30: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_expr_negative_funcParam() { @@ -1174,26 +1162,12 @@ void test_expr_negative_funcParam() { a = a > 5 ? a+funcParam(a) : a+funcParam(b); // no warning } -void test_expr_positive_inc() { - unsigned a = 0; - unsigned b = 1; - a = a > 5 ? a++ : a++; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] -} - void test_expr_negative_inc() { unsigned a = 0; unsigned b = 1; a = a > 5 ? a++ : b++; // no warning } -void test_expr_positive_assign() { - unsigned a = 0; - unsigned b = 1; - a = a > 5 ? a=1 : a=1; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] -} - void test_expr_negative_assign() { unsigned a = 0; unsigned b = 1; @@ -1206,7 +1180,6 @@ void test_signed_nested_expr() { int c = 3; a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(c+a)); // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:39: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_signed_nested_expr_negative() { @@ -1229,190 +1202,6 @@ void test_signed_nested_cond_expr() { int c = 3; a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 4 : 4); // CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:44: warning: 'true' and 'false' expressions are equivalent [misc-redundant-expression] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:40: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] -} - -void test_identical_branches1(bool b) { - int i = 0; - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - ++i; - } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - ++i; - } -} - -void test_identical_branches2(bool b) { - int i = 0; - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - ++i; - } else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - ++i; -} - -void test_identical_branches3(bool b) { - int i = 0; - if (b) { // no warning - ++i; - } else { - i++; - } -} - -void test_identical_branches4(bool b) { - int i = 0; - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - } -} - -void test_identical_branches_break(bool b) { - while (true) { - if (b) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] - break; - else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - break; - } -} - -void test_identical_branches_continue(bool b) { - while (true) { - if (b) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] - continue; - else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - continue; - } -} - -void test_identical_branches_func(bool b) { - if (b) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - func(); - else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: note: else branch starts here - func(); -} - -void test_identical_branches_func_arguments(bool b) { - if (b) // no-warning - funcParam(1); - else - funcParam(2); -} - -void test_identical_branches_cast1(bool b) { - long v = -7; - if (b) // no-warning - v = (signed int) v; - else - v = (unsigned int) v; -} - -void test_identical_branches_cast2(bool b) { - long v = -7; - if (b) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - v = (signed int) v; - else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: note: else branch starts here - v = (signed int) v; -} - -int test_identical_branches_return_int(bool b) { - int i = 0; - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - i++; - return i; - } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - i++; - return i; - } -} - -int test_identical_branches_return_func(bool b) { - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - return func(); - } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - return func(); - } -} - -void test_identical_branches_for(bool b) { - int i; - int j; - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - for (i = 0, j = 0; i < 10; i++) - j += 4; - } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - for (i = 0, j = 0; i < 10; i++) - j += 4; - } -} - -void test_identical_branches_while(bool b) { - int i = 10; - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - while (func()) - i--; - } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - while (func()) - i--; - } -} - -void test_identical_branches_while_2(bool b) { - int i = 10; - if (b) { // no-warning - while (func()) - i--; - } else { - while (func()) - i++; - } -} - -void test_identical_branches_do_while(bool b) { - int i = 10; - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - do { - i--; - } while (func()); - } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - do { - i--; - } while (func()); - } -} - -void test_identical_branches_if(bool b, int i) { - if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] - if (i < 5) - i += 10; - } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here - if (i < 5) - i += 10; - } } void test_identical_bitwise1() { @@ -1508,208 +1297,3 @@ void test_identical_logical9(int x, int y) { ; } #pragma clang diagnostic pop - -void test_warn_chained_if_stmts_1(int x) { - if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here -} - -void test_warn_chained_if_stmts_2(int x) { - if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here - else if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here -} - -void test_warn_chained_if_stmts_3(int x) { - if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x == 2) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here - else if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here -} - -void test_warn_chained_if_stmts_4(int x) { - if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (func()) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here - else if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here -} - -void test_warn_chained_if_stmts_5(int x) { - if (x & 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x & 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here -} - -void test_warn_chained_if_stmts_6(int x) { - if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x == 2) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here - else if (x == 2) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here - else if (x == 3) - ; -} - -void test_warn_chained_if_stmts_7(int x) { - if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x == 2) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here - else if (x == 3) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here - else if (x == 2) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 3 starts here - else if (x == 5) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 4 starts here -} - -void test_warn_chained_if_stmts_8(int x) { - if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x == 2) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here - else if (x == 3) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here - else if (x == 2) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 3 starts here - else if (x == 5) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 4 starts here - else if (x == 3) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 5 starts here - else if (x == 7) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 6 starts here -} - -void test_nowarn_chained_if_stmts_1(int x) { - if (func()) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (func()) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here -} - -void test_nowarn_chained_if_stmts_2(int x) { - if (func()) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x == 1) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here - else if (func()) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here -} - -void test_nowarn_chained_if_stmts_3(int x) { - if (x++) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original - else if (x++) - ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here -} - -void test_warn_wchar() { - const wchar_t * a = 0 ? L"Warning" : L"Warning"; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:25: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] -} -void test_nowarn_wchar() { - const wchar_t * a = 0 ? L"No" : L"Warning"; -} - -void test_nowarn_long() { - int a = 0, b = 0; - long c; - if (0) { - b -= a; - c = 0; - } else { - b -= a; - c = 0LL; - } -} - -// Identical inner conditions - -void test_warn_inner_if_1(int x) { - if (x == 1) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical inner if statement [bugprone-branch-clone] - if (x == 1) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: inner if starts here - ; - } - - // FIXME: Should warn here. The warning is currently not emitted because there - // is code between the conditions. - if (x == 1) { - int y = x; - if (x == 1) - ; - } -} - -void test_nowarn_inner_if_1(int x) { - // Don't warn when condition has side effects. - if (x++ == 1) { - if (x++ == 1) - ; - } - - // Don't warn when x is changed before inner condition. - if (x < 10) { - x++; - if (x < 10) - ; - } -} >From 2baa1b90623a7d2a94b3e054fa999cb7e62fd64f Mon Sep 17 00:00:00 2001 From: einvbri <vince.a.bridg...@ericsson.com> Date: Thu, 12 Dec 2024 01:45:58 +0100 Subject: [PATCH 2/3] [analyzer] Split alpha core Identical Expression tests * change the run lines to use check_clang_tidy * remove BUGPRONEBRANCH suffix * add needed check message lines --- .../bugprone/bugprone-branch-clone.cpp | 186 +++++++++--------- .../misc/misc-redundant-expression.cpp | 59 +++--- 2 files changed, 127 insertions(+), 118 deletions(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp index fa19037cc437e3..b91ac6a550c5a7 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp @@ -1,4 +1,4 @@ -// RUN: clang-tidy %s -checks="-*,bugprone-branch-clone" -- 2>&1 | FileCheck %s --check-prefix=CHECK-MESSAGES-BUGPRONEBRANCH +// RUN: %check_clang_tidy %s bugprone-branch-clone %t -- /* Only one expected warning per function allowed at the very end. */ @@ -42,7 +42,6 @@ int checkNotEqualCastIntPointerDeclCompare11(void) { int k = 7; int* f = &k; return ((int*)f != (int*)f); -// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:19: warning: both sides of operator are equivalent [misc-redundant-expression] } int checkNotEqualCastIntPointerDeclCompare12(void) { int k = 7; @@ -54,7 +53,6 @@ int checkNotEqualBinaryOpIntPointerCompare1(void) { int res; int* f= &k; res = (f + 4 != f + 4); -// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:16: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkNotEqualBinaryOpIntPointerCompare2(void) { @@ -70,7 +68,6 @@ int checkNotEqualBinaryOpIntPointerCompare3(void) { int res; int* f= &k; res = ((int*)f + 4 != (int*)f + 4); -// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:22: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkNotEqualBinaryOpIntPointerCompare4(void) { @@ -88,7 +85,6 @@ int checkNotEqualNestedBinaryOpIntPointerCompare1(void) { int* u= &k+2; int* f= &k+3; res = ((f + (3)*t) != (f + (3)*t)); -// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:22: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -143,52 +139,52 @@ int checkNotEqualSameFunctionDifferentParam() { unsigned test_unsigned(unsigned a) { unsigned b = 1; a = a > 5 ? b : b; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] return a; } void test_signed() { int a = 0; a = a > 5 ? a : a; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_bool(bool a) { a = a > 0 ? a : a; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_float() { float a = 0; float b = 0; a = a > 5 ? a : a; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } const char *test_string() { float a = 0; return a > 5 ? "abc" : "abc"; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:16: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_unsigned_expr() { unsigned a = 0; unsigned b = 0; a = a > 5 ? a+b : a+b; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_signed_expr() { int a = 0; int b = 1; a = a > 5 ? a+b : a+b; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_bool_expr(bool a) { bool b = 0; a = a > 0 ? a&&b : a&&b; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_unsigned_expr_negative() { @@ -212,14 +208,14 @@ void test_float_expr_positive() { float a = 0; float b = 0; a = a > 5 ? a+b : a+b; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_expr_positive_func() { unsigned a = 0; unsigned b = 1; a = a > 5 ? a+func() : a+func(); -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_expr_negative_func() { @@ -232,7 +228,7 @@ void test_expr_positive_funcParam() { unsigned a = 0; unsigned b = 1; a = a > 5 ? a+funcParam(b) : a+funcParam(b); -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_expr_negative_funcParam() { @@ -245,7 +241,7 @@ void test_expr_positive_inc() { unsigned a = 0; unsigned b = 1; a = a > 5 ? a++ : a++; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_expr_negative_inc() { @@ -258,7 +254,7 @@ void test_expr_positive_assign() { unsigned a = 0; unsigned b = 1; a = a > 5 ? a=1 : a=1; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_expr_negative_assign() { @@ -272,7 +268,7 @@ void test_signed_nested_expr() { int b = 1; int c = 3; a = a > 5 ? a+b+(c+a)*(a + b*(c+a)) : a+b+(c+a)*(a + b*(c+a)); -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_signed_nested_expr_negative() { @@ -294,16 +290,16 @@ void test_signed_nested_cond_expr() { int b = 1; int c = 3; a = a > 5 ? (b > 5 ? 1 : 4) : (b > 5 ? 4 : 4); -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:40: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:40: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_identical_branches1(bool b) { int i = 0; if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] ++i; } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here ++i; } } @@ -311,10 +307,10 @@ void test_identical_branches1(bool b) { void test_identical_branches2(bool b) { int i = 0; if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] ++i; } else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here ++i; } @@ -330,19 +326,19 @@ void test_identical_branches3(bool b) { void test_identical_branches4(bool b) { int i = 0; if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here } } void test_identical_branches_break(bool b) { while (true) { if (b) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] break; else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here break; } } @@ -350,20 +346,20 @@ void test_identical_branches_break(bool b) { void test_identical_branches_continue(bool b) { while (true) { if (b) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: if with identical then and else branches [bugprone-branch-clone] continue; else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here continue; } } void test_identical_branches_func(bool b) { if (b) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] func(); else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:3: note: else branch starts here func(); } @@ -385,21 +381,21 @@ void test_identical_branches_cast1(bool b) { void test_identical_branches_cast2(bool b) { long v = -7; if (b) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] v = (signed int) v; else -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:3: note: else branch starts here v = (signed int) v; } int test_identical_branches_return_int(bool b) { int i = 0; if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] i++; return i; } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here i++; return i; } @@ -407,10 +403,10 @@ int test_identical_branches_return_int(bool b) { int test_identical_branches_return_func(bool b) { if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] return func(); } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here return func(); } } @@ -419,11 +415,11 @@ void test_identical_branches_for(bool b) { int i; int j; if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] for (i = 0, j = 0; i < 10; i++) j += 4; } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here for (i = 0, j = 0; i < 10; i++) j += 4; } @@ -432,11 +428,11 @@ void test_identical_branches_for(bool b) { void test_identical_branches_while(bool b) { int i = 10; if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] while (func()) i--; } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here while (func()) i--; } @@ -456,12 +452,12 @@ void test_identical_branches_while_2(bool b) { void test_identical_branches_do_while(bool b) { int i = 10; if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] do { i--; } while (func()); } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here do { i--; } while (func()); @@ -470,11 +466,11 @@ void test_identical_branches_do_while(bool b) { void test_identical_branches_if(bool b, int i) { if (b) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else branches [bugprone-branch-clone] if (i < 5) i += 10; } else { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: else branch starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here if (i < 5) i += 10; } @@ -569,73 +565,73 @@ void test_identical_logical9(int x, int y) { void test_warn_chained_if_stmts_1(int x) { if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here } void test_warn_chained_if_stmts_2(int x) { if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here else if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here } void test_warn_chained_if_stmts_3(int x) { if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x == 2) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here else if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here } void test_warn_chained_if_stmts_4(int x) { if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (func()) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here else if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here } void test_warn_chained_if_stmts_5(int x) { if (x & 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x & 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here } void test_warn_chained_if_stmts_6(int x) { if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x == 2) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here else if (x == 2) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here else if (x == 3) ; } @@ -643,83 +639,83 @@ void test_warn_chained_if_stmts_6(int x) { void test_warn_chained_if_stmts_7(int x) { if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x == 2) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here else if (x == 3) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here else if (x == 2) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 3 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 3 starts here else if (x == 5) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 4 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 4 starts here } void test_warn_chained_if_stmts_8(int x) { if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x == 2) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here else if (x == 3) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here else if (x == 2) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 3 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 3 starts here else if (x == 5) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 4 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 4 starts here else if (x == 3) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 5 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 5 starts here else if (x == 7) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 6 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 6 starts here } void test_nowarn_chained_if_stmts_1(int x) { if (func()) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (func()) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here } void test_nowarn_chained_if_stmts_2(int x) { if (func()) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x == 1) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here else if (func()) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 2 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 2 starts here } void test_nowarn_chained_if_stmts_3(int x) { if (x++) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-2]]:6: note: end of the original +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: repeated branch body in conditional chain [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-2]]:6: note: end of the original else if (x++) ; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: clone 1 starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: clone 1 starts here } void test_warn_wchar() { const wchar_t * a = 0 ? L"Warning" : L"Warning"; -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:25: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: conditional operator with identical true and false expressions [bugprone-branch-clone] } void test_nowarn_wchar() { const wchar_t * a = 0 ? L"No" : L"Warning"; @@ -741,9 +737,9 @@ void test_nowarn_long() { void test_warn_inner_if_1(int x) { if (x == 1) { -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:3: warning: if with identical inner if statement [bugprone-branch-clone] +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical inner if statement [bugprone-branch-clone] if (x == 1) -// CHECK-MESSAGES-BUGPRONEBRANCH: :[[@LINE-1]]:5: note: inner if starts here +// CHECK-MESSAGES: :[[@LINE-1]]:5: note: inner if starts here ; } diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp index db07118c8c9cfa..8dcef30a4e7544 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp @@ -1,4 +1,4 @@ -// RUN: clang-tidy %s -checks="-*,misc-redundant-expression" -- 2>&1 | FileCheck %s --check-prefix=CHECK-MESSAGES-IDENTEXPR +// RUN: %check_clang_tidy %s misc-redundant-expression -check-suffix=IDENTEXPR %t /* Only one expected warning per function allowed at the very end. */ @@ -76,6 +76,7 @@ int checkNotEqualBinaryOpFloatCompare1(void) { int res; float f= 3.14F; res = (f + 3.14F != f + 3.14F); // no warning +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:20: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkNotEqualBinaryOpFloatCompare2(void) { @@ -87,6 +88,7 @@ int checkNotEqualBinaryOpFloatCompare3(void) { int res; float f= 3.14F; res = ((int)f + 3.14F != (int)f + 3.14F); // no warning +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:25: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkNotEqualBinaryOpFloatCompare4(void) { @@ -102,6 +104,7 @@ int checkNotEqualNestedBinaryOpFloatCompare1(void) { int u= 2; float f= 3.14F; res = (((int)f + (3.14F - u)*t) != ((int)f + (3.14F - u)*t)); // no warning +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:35: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -120,12 +123,11 @@ int checkNotEqualNestedBinaryOpFloatCompare3(void) { int u= 2; float f= 3.14F; res = (((int)f + (u - 3.14F)*t) != ((int)f + (3.14F - u)*(f + t != f + t))); // no warning +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:67: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } - - /* end '!=' with float*/ /* '!=' with int*/ @@ -237,8 +239,6 @@ int checkNotEqualNestedBinaryOpIntCompare3(void) { /* end '!=' int */ - - /* '!=' with int pointer */ int checkNotEqualIntPointerLiteralCompare1(void) { @@ -328,6 +328,7 @@ int checkNotEqualSameFunction() { unsigned a = 0; unsigned b = 1; int res = (a+func() != a+func()); // no warning +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:23: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -342,6 +343,7 @@ int checkNotEqualSameFunctionSameParam() { unsigned a = 0; unsigned b = 1; int res = (a+funcParam(a) != a+funcParam(a)); // no warning +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:29: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -433,7 +435,8 @@ int checkEqualCastFloatDeclCompare12(void) { int checkEqualBinaryOpFloatCompare1(void) { int res; float f= 3.14F; - res = (f + 3.14F == f + 3.14F); // no warning + res = (f + 3.14F == f + 3.14F); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:20: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkEqualBinaryOpFloatCompare2(void) { @@ -444,7 +447,8 @@ int checkEqualBinaryOpFloatCompare2(void) { int checkEqualBinaryOpFloatCompare3(void) { int res; float f= 3.14F; - res = ((int)f + 3.14F == (int)f + 3.14F); // no warning + res = ((int)f + 3.14F == (int)f + 3.14F); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:25: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkEqualBinaryOpFloatCompare4(void) { @@ -459,7 +463,8 @@ int checkEqualNestedBinaryOpFloatCompare1(void) { int t= 1; int u= 2; float f= 3.14F; - res = (((int)f + (3.14F - u)*t) == ((int)f + (3.14F - u)*t)); // no warning + res = (((int)f + (3.14F - u)*t) == ((int)f + (3.14F - u)*t)); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:35: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -477,14 +482,11 @@ int checkEqualNestedBinaryOpFloatCompare3(void) { int t= 1; int u= 2; float f= 3.14F; - res = (((int)f + (u - 3.14F)*t) == ((int)f + (3.14F - u)*(f + t == f + t))); // no warning + res = (((int)f + (u - 3.14F)*t) == ((int)f + (3.14F - u)*(f + t == f + t))); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:67: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } - - - - /* Equal with int*/ int checkEqualIntLiteralCompare1(void) { @@ -599,7 +601,8 @@ int checkEqualNestedBinaryOpIntCompare3(void) { int checkEqualSameFunction() { unsigned a = 0; unsigned b = 1; - int res = (a+func() == a+func()); // no warning + int res = (a+func() == a+func()); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:23: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -613,7 +616,8 @@ int checkEqualDifferentFunction() { int checkEqualSameFunctionSameParam() { unsigned a = 0; unsigned b = 1; - int res = (a+funcParam(a) == a+funcParam(a)); // no warning + int res = (a+funcParam(a) == a+funcParam(a)); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:29: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -691,7 +695,8 @@ int checkLessThanCastFloatDeclCompare12(void) { int checkLessThanBinaryOpFloatCompare1(void) { int res; float f= 3.14F; - res = (f + 3.14F < f + 3.14F); // no warning + res = (f + 3.14F < f + 3.14F); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:20: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkLessThanBinaryOpFloatCompare2(void) { @@ -702,7 +707,8 @@ int checkLessThanBinaryOpFloatCompare2(void) { int checkLessThanBinaryOpFloatCompare3(void) { int res; float f= 3.14F; - res = ((int)f + 3.14F < (int)f + 3.14F); // no warning + res = ((int)f + 3.14F < (int)f + 3.14F); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:25: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkLessThanBinaryOpFloatCompare4(void) { @@ -717,7 +723,8 @@ int checkLessThanNestedBinaryOpFloatCompare1(void) { int t= 1; int u= 2; float f= 3.14F; - res = (((int)f + (3.14F - u)*t) < ((int)f + (3.14F - u)*t)); // no warning + res = (((int)f + (3.14F - u)*t) < ((int)f + (3.14F - u)*t)); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:35: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -735,7 +742,8 @@ int checkLessThanNestedBinaryOpFloatCompare3(void) { int t= 1; int u= 2; float f= 3.14F; - res = (((int)f + (u - 3.14F)*t) < ((int)f + (3.14F - u)*(f + t < f + t))); // no warning + res = (((int)f + (u - 3.14F)*t) < ((int)f + (3.14F - u)*(f + t < f + t))); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:66: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -911,7 +919,8 @@ int checkGreaterThanCastFloatDeclCompare12(void) { int checkGreaterThanBinaryOpFloatCompare1(void) { int res; float f= 3.14F; - res = (f + 3.14F > f + 3.14F); // no warning + res = (f + 3.14F > f + 3.14F); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:20: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkGreaterThanBinaryOpFloatCompare2(void) { @@ -922,7 +931,8 @@ int checkGreaterThanBinaryOpFloatCompare2(void) { int checkGreaterThanBinaryOpFloatCompare3(void) { int res; float f= 3.14F; - res = ((int)f + 3.14F > (int)f + 3.14F); // no warning + res = ((int)f + 3.14F > (int)f + 3.14F); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:25: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } int checkGreaterThanBinaryOpFloatCompare4(void) { @@ -937,7 +947,8 @@ int checkGreaterThanNestedBinaryOpFloatCompare1(void) { int t= 1; int u= 2; float f= 3.14F; - res = (((int)f + (3.14F - u)*t) > ((int)f + (3.14F - u)*t)); // no warning + res = (((int)f + (3.14F - u)*t) > ((int)f + (3.14F - u)*t)); +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:35: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -956,6 +967,7 @@ int checkGreaterThanNestedBinaryOpFloatCompare3(void) { int u= 2; float f= 3.14F; res = (((int)f + (u - 3.14F)*t) > ((int)f + (3.14F - u)*(f + t > f + t))); // no warning +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:66: warning: both sides of operator are equivalent [misc-redundant-expression] return (0); } @@ -1262,7 +1274,8 @@ void test_identical_logical3(int a) { } void test_identical_logical4(int a) { - if (a == func() || a == func()) // no-warning + if (a == func() || a == func()) +// CHECK-MESSAGES-IDENTEXPR: :[[@LINE-1]]:19: warning: both sides of operator are equivalent [misc-redundant-expression] ; } >From 476e09556f3a7984de31fc14df02cec6afc66fab Mon Sep 17 00:00:00 2001 From: einvbri <vince.a.bridg...@ericsson.com> Date: Fri, 20 Dec 2024 01:51:18 +0100 Subject: [PATCH 3/3] [analyzer] Split alpha core Identical Expression tests * Change new test filenames to <checker-name>-2.cpp per comments * Checker names need to follow naming convention * Additional checks should not result in too large test case --- .../bugprone/{bugprone-branch-clone.cpp => branch-clone-2.cpp} | 0 .../{misc-redundant-expression.cpp => redundant-expression-2.cpp} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename clang-tools-extra/test/clang-tidy/checkers/bugprone/{bugprone-branch-clone.cpp => branch-clone-2.cpp} (100%) rename clang-tools-extra/test/clang-tidy/checkers/misc/{misc-redundant-expression.cpp => redundant-expression-2.cpp} (100%) diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-2.cpp similarity index 100% rename from clang-tools-extra/test/clang-tidy/checkers/bugprone/bugprone-branch-clone.cpp rename to clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-2.cpp diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/redundant-expression-2.cpp similarity index 100% rename from clang-tools-extra/test/clang-tidy/checkers/misc/misc-redundant-expression.cpp rename to clang-tools-extra/test/clang-tidy/checkers/misc/redundant-expression-2.cpp _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits