https://github.com/bjosv updated https://github.com/llvm/llvm-project/pull/178392
From ba814aa2be4f6edfc08d08d5b7276e3d35b78d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Svensson?= <[email protected]> Date: Tue, 27 Jan 2026 13:15:13 +0100 Subject: [PATCH 1/4] [clang-tidy] Add copy of testcase simplify-boolean-exp but for C23 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Björn Svensson <[email protected]> --- .../readability/simplify-boolean-expr-c23.c | 799 ++++++++++++++++++ 1 file changed, 799 insertions(+) create mode 100644 clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c b/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c new file mode 100644 index 0000000000000..1911c33f21d7c --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c @@ -0,0 +1,799 @@ +// RUN: %check_clang_tidy -std=c23-or-later %s readability-simplify-boolean-expr %t + +bool a1 = false; + +void if_with_bool_literal_condition() { + int i = 0; + if (false) { + i = 1; + } else { + i = 2; + } + i = 3; + // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition + // CHECK-FIXES: {{^ int i = 0;$}} + // CHECK-FIXES-NEXT: {{^ {$}} + // CHECK-FIXES-NEXT: {{^ i = 2;$}} + // CHECK-FIXES-NEXT: {{^ }$}} + // CHECK-FIXES-NEXT: {{^ i = 3;$}} + + i = 4; + if (true) { + i = 5; + } else { + i = 6; + } + i = 7; + // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition + // CHECK-FIXES: {{^ i = 4;$}} + // CHECK-FIXES-NEXT: {{^ {$}} + // CHECK-FIXES-NEXT: {{^ i = 5;$}} + // CHECK-FIXES-NEXT: {{^ }$}} + // CHECK-FIXES-NEXT: {{^ i = 7;$}} + + i = 8; + if (false) { + i = 9; + } + i = 11; + // CHECK-MESSAGES: :[[@LINE-4]]:7: warning: {{.*}} in if statement condition + // CHECK-FIXES: {{^ i = 8;$}} + // CHECK-FIXES-NEXT: {{^ $}} + // CHECK-FIXES-NEXT: {{^ i = 11;$}} +} + +void if_with_negated_bool_condition() { + int i = 10; + if (!true) { + i = 11; + } else { + i = 12; + } + i = 13; + // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition + // CHECK-FIXES: {{^ int i = 10;$}} + // CHECK-FIXES-NEXT: {{^ {$}} + // CHECK-FIXES-NEXT: {{^ i = 12;$}} + // CHECK-FIXES-NEXT: {{^ }$}} + // CHECK-FIXES-NEXT: {{^ i = 13;$}} + + i = 14; + if (!false) { + i = 15; + } else { + i = 16; + } + i = 17; + // CHECK-MESSAGES: :[[@LINE-6]]:7: warning: {{.*}} in if statement condition + // CHECK-FIXES: {{^ i = 14;$}} + // CHECK-FIXES-NEXT: {{^ {$}} + // CHECK-FIXES-NEXT: {{^ i = 15;$}} + // CHECK-FIXES-NEXT: {{^ }$}} + // CHECK-FIXES-NEXT: {{^ i = 17;$}} + + i = 18; + if (!true) { + i = 19; + } + i = 20; + // CHECK-MESSAGES: :[[@LINE-4]]:7: warning: {{.*}} in if statement condition + // CHECK-FIXES: {{^ i = 18;$}} + // CHECK-FIXES-NEXT: {{^ $}} + // CHECK-FIXES-NEXT: {{^ i = 20;$}} +} + +void operator_equals() { + int i = 0; + bool b1 = (i > 2); + if (b1 == true) { + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(b1\) {$}} + i = 5; + } else { + i = 6; + } + bool b2 = (i > 4); + if (b2 == false) { + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(!b2\) {$}} + i = 7; + } else { + i = 9; + } + bool b3 = (i > 6); + if (true == b3) { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(b3\) {$}} + i = 10; + } else { + i = 11; + } + bool b4 = (i > 8); + if (false == b4) { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(!b4\) {$}} + i = 12; + } else { + i = 13; + } +} + +void operator_or() { + int i = 0; + bool b5 = (i > 10); + if (b5 || false) { + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(b5\) {$}} + i = 14; + } else { + i = 15; + } + bool b6 = (i > 10); + if (b6 || true) { + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(true\) {$}} + i = 16; + } else { + i = 17; + } + bool b7 = (i > 10); + if (false || b7) { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(b7\) {$}} + i = 18; + } else { + i = 19; + } + bool b8 = (i > 10); + if (true || b8) { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(true\) {$}} + i = 20; + } else { + i = 21; + } +} + +void operator_and() { + int i = 0; + bool b9 = (i > 20); + if (b9 && false) { + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(false\) {$}} + i = 22; + } else { + i = 23; + } + bool ba = (i > 20); + if (ba && true) { + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(ba\) {$}} + i = 24; + } else { + i = 25; + } + bool bb = (i > 20); + if (false && bb) { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(false\) {$}} + i = 26; + } else { + i = 27; + } + bool bc = (i > 20); + if (true && bc) { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(bc\) {$}} + i = 28; + } else { + i = 29; + } +} + +void ternary_operator() { + int i = 0; + bool bd = (i > 20) ? true : false; + // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result + // CHECK-FIXES: {{^ bool bd = i > 20;$}} + + bool be = (i > 20) ? false : true; + // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result + // CHECK-FIXES: {{^ bool be = i <= 20;$}} + + bool bf = ((i > 20)) ? false : true; + // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: {{.*}} in ternary expression result + // CHECK-FIXES: {{^ bool bf = i <= 20;$}} +} + +void operator_not_equal() { + int i = 0; + bool bf = (i > 20); + if (false != bf) { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(bf\) {$}} + i = 30; + } else { + i = 31; + } + bool bg = (i > 20); + if (true != bg) { + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(!bg\) {$}} + i = 32; + } else { + i = 33; + } + bool bh = (i > 20); + if (bh != false) { + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(bh\) {$}} + i = 34; + } else { + i = 35; + } + bool bi = (i > 20); + if (bi != true) { + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(!bi\) {$}} + i = 36; + } else { + i = 37; + } +} + +void nested_booleans() { + if (false || (true || false)) { + // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(false \|\| \(true\)\) {$}} + } + if (true && (true || false)) { + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(true && \(true\)\) {$}} + } + if (false || (true && false)) { + // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(false \|\| \(false\)\) {$}} + } + if (true && (true && false)) { + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} to boolean operator + // CHECK-FIXES: {{^ if \(true && \(false\)\) {$}} + } +} + +#define HAS_XYZ_FEATURE true +#define M1(what) M2(true, what) +#define M2(condition, what) if (condition) what + +void macros() { + int i = 0; + bool b = (i == 1); + i = 2; + if (b && HAS_XYZ_FEATURE) { + // leave this alone; if you want it simplified, then you should + // inline the macro first. + i = 3; + } + if (HAS_XYZ_FEATURE) { + i = 5; + } + i = 4; + M1(i = 7); +} + +#undef HAS_XYZ_FEATURE + +bool conditional_return_statements(int i) { + if (i == 0) return true; else return false; +} +// CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement +// CHECK-FIXES: {{^}} return i == 0;{{$}} +// CHECK-FIXES-NEXT: {{^}$}} + +bool conditional_return_statements_no_fix_1(int i) { + if (i == 0) return true; + // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: {{.*}} in conditional return statement + // CHECK-MESSAGES: :[[@LINE-2]]:7: note: conditions that can be simplified + // comment + return false; + // CHECK-MESSAGES: :[[@LINE-1]]:3: note: return statement that can be simplified +} + +bool conditional_return_statements_no_fix_2(int i) { + if (i == 0) return true; + // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: {{.*}} in conditional return statement + // CHECK-MESSAGES: :[[@LINE-2]]:7: note: conditions that can be simplified + // comment + else return false; +} + +bool conditional_return_statements_then_expr(int i, int j) { + if (i == j) return (i == 0); else return false; +} + +bool conditional_return_statements_else_expr(int i, int j) { + if (i == j) return true; else return (i == 0); +} + +bool negated_conditional_return_statements(int i) { + if (i == 0) return false; else return true; +} +// CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement +// CHECK-FIXES: {{^}} return i != 0;{{$}} +// CHECK-FIXES-NEXT: {{^}$}} + +bool negative_condition_conditional_return_statement(int i) { + if (!(i == 0)) return false; else return true; +} +// CHECK-MESSAGES: :[[@LINE-2]]:25: warning: {{.*}} in conditional return statement +// CHECK-FIXES: {{^}} return i == 0;{{$}} +// CHECK-FIXES-NEXT: {{^}$}} + +bool conditional_compound_return_statements(int i) { + if (i == 1) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement +// CHECK-FIXES: {{^}}bool conditional_compound_return_statements(int i) {{{$}} +// CHECK-FIXES-NEXT: {{^}} return i == 1;{{$}} +// CHECK-FIXES-NEXT: {{^}$}} + +bool negated_conditional_compound_return_statements(int i) { + if (i == 1) { + return false; + } else { + return true; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement +// CHECK-FIXES: {{^}}bool negated_conditional_compound_return_statements(int i) {{{$}} +// CHECK-FIXES-NEXT: {{^}} return i != 1;{{$}} +// CHECK-FIXES-NEXT: {{^}$}} + +bool conditional_return_statements_side_effects_then(int i) { + if (i == 2) { + macros(); + return true; + } else + return false; +} + +bool negated_conditional_return_statements_side_effects_then(int i) { + if (i == 2) { + macros(); + return false; + } else + return true; +} + +bool conditional_return_statements_side_effects_else(int i) { + if (i == 2) + return true; + else { + macros(); + return false; + } +} + +bool negated_conditional_return_statements_side_effects_else(int i) { + if (i == 2) + return false; + else { + macros(); + return true; + } +} + +void simple_conditional_assignment_statements(int i) { + bool b; + if (i > 10) + b = true; + else + b = false; + bool bb = false; + // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment + // CHECK-FIXES: bool b; + // CHECK-FIXES: {{^ }}b = i > 10;{{$}} + // CHECK-FIXES: bool bb = false; + + bool c; + if (i > 20) + c = false; + else + c = true; + bool c2 = false; + // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment + // CHECK-FIXES: bool c; + // CHECK-FIXES: {{^ }}c = i <= 20;{{$}} + // CHECK-FIXES: bool c2 = false; + + // Unchanged: different variables. + bool b2; + if (i > 12) + b = true; + else + b2 = false; + + // Unchanged: no else statement. + bool b3; + if (i > 15) + b3 = true; + + // Unchanged: not boolean assignment. + int j; + if (i > 17) + j = 10; + else + j = 20; + + // Unchanged: different variables assigned. + int k = 0; + bool b4 = false; + if (i > 10) + b4 = true; + else + k = 10; +} + +void complex_conditional_assignment_statements(int i) { + bool d; + if (i > 30) { + d = true; + } else { + d = false; + } + d = false; + // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment + // CHECK-FIXES: bool d; + // CHECK-FIXES: {{^ }}d = i > 30;{{$}} + // CHECK-FIXES: d = false; + + bool e; + if (i > 40) { + e = false; + } else { + e = true; + } + e = false; + // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment + // CHECK-FIXES: bool e; + // CHECK-FIXES: {{^ }}e = i <= 40;{{$}} + // CHECK-FIXES: e = false; + + // Unchanged: no else statement. + bool b3; + if (i > 15) { + b3 = true; + } + + // Unchanged: not a boolean assignment. + int j; + if (i > 17) { + j = 10; + } else { + j = 20; + } + + // Unchanged: multiple statements. + bool f; + if (j > 10) { + j = 10; + f = true; + } else { + j = 20; + f = false; + } + + // Unchanged: multiple statements. + bool g; + if (j > 10) + g = true; + else { + j = 20; + g = false; + } + + // Unchanged: multiple statements. + bool h; + if (j > 10) { + j = 10; + h = true; + } else + h = false; +} + +// Unchanged: chained return statements, but ChainedConditionalReturn not set. +bool chained_conditional_compound_return(int i) { + if (i < 0) { + return true; + } else if (i < 10) { + return false; + } else if (i > 20) { + return true; + } else { + return false; + } +} + +// Unchanged: chained return statements, but ChainedConditionalReturn not set. +bool chained_conditional_return(int i) { + if (i < 0) + return true; + else if (i < 10) + return false; + else if (i > 20) + return true; + else + return false; +} + +// Unchanged: chained assignments, but ChainedConditionalAssignment not set. +void chained_conditional_compound_assignment(int i) { + bool b; + if (i < 0) { + b = true; + } else if (i < 10) { + b = false; + } else if (i > 20) { + b = true; + } else { + b = false; + } +} + +// Unchanged: chained return statements, but ChainedConditionalReturn not set. +void chained_conditional_assignment(int i) { + bool b; + if (i < 0) + b = true; + else if (i < 10) + b = false; + else if (i > 20) + b = true; + else + b = false; +} + +// Unchanged: chained return statements, but ChainedConditionalReturn not set. +bool chained_simple_if_return_negated(int i) { + if (i < 5) + return false; + if (i > 10) + return false; + return true; +} + +// Unchanged: chained return statements, but ChainedConditionalReturn not set. +bool complex_chained_if_return_return(int i) { + if (i < 5) { + return true; + } + if (i > 10) { + return true; + } + return false; +} + +// Unchanged: chained return statements, but ChainedConditionalReturn not set. +bool complex_chained_if_return_return_negated(int i) { + if (i < 5) { + return false; + } + if (i > 10) { + return false; + } + return true; +} + +// Unchanged: chained return statements, but ChainedConditionalReturn not set. +bool chained_simple_if_return(int i) { + if (i < 5) + return true; + if (i > 10) + return true; + return false; +} + +bool simple_if_return_return(int i) { + if (i > 10) + return true; + return false; +} +// CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}}bool simple_if_return_return(int i) {{{$}} +// CHECK-FIXES: {{^ return i > 10;$}} +// CHECK-FIXES: {{^}$}} + +bool simple_if_return_return_negated(int i) { + if (i > 10) + return false; + return true; +} +// CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}}bool simple_if_return_return_negated(int i) {{{$}} +// CHECK-FIXES: {{^ return i <= 10;$}} +// CHECK-FIXES: {{^}$}} + +bool complex_if_return_return(int i) { + if (i > 10) { + return true; + } + return false; +} +// CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}}bool complex_if_return_return(int i) {{{$}} +// CHECK-FIXES: {{^ return i > 10;$}} +// CHECK-FIXES: {{^}$}} + +bool complex_if_return_return_negated(int i) { + if (i > 10) { + return false; + } + return true; +} +// CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}}bool complex_if_return_return_negated(int i) {{{$}} +// CHECK-FIXES: {{^ return i <= 10;$}} +// CHECK-FIXES: {{^}$}} + +bool if_implicit_bool_expr(int i) { + if (i & 1) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return (i & 1) != 0;{{$}} + +bool negated_if_implicit_bool_expr(int i) { + if (i - 1) { + return false; + } else { + return true; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return (i - 1) == 0;{{$}} + +bool implicit_int(int i) { + if (i) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return i != 0;{{$}} + +bool explicit_bool(bool b) { + if (b) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return b;{{$}} + +bool negated_explicit_bool(bool b) { + if (!b) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return !b;{{$}} + +bool bitwise_complement_conversion(int i) { + if (~i) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return ~i != 0;{{$}} + +bool logical_or(bool a, bool b) { + if (a || b) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return a || b;{{$}} + +bool logical_and(bool a, bool b) { + if (a && b) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return a && b;{{$}} + +void ternary_integer_condition(int i) { + bool b = i ? true : false; +} +// CHECK-MESSAGES: :[[@LINE-2]]:16: warning: {{.*}} in ternary expression result +// CHECK-FIXES: bool b = i != 0;{{$}} + +bool non_null_pointer_condition(int *p1) { + if (p1) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: return p1 != nullptr;{{$}} + +bool null_pointer_condition(int *p2) { + if (!p2) { + return true; + } else { + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: return p2 == nullptr;{{$}} + +bool negated_non_null_pointer_condition(int *p3) { + if (p3) { + return false; + } else { + return true; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: return p3 == nullptr;{{$}} + +bool negated_null_pointer_condition(int *p4) { + if (!p4) { + return false; + } else { + return true; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: return p4 != nullptr;{{$}} + +bool comments_in_the_middle(bool b) { + if (b) { + return true; + } else { + // something wicked this way comes + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} if (b) { +// CHECK-FIXES: // something wicked this way comes{{$}} + +bool preprocessor_in_the_middle(bool b) { + if (b) { + return true; + } else { +#define SOMETHING_WICKED false + return false; + } +} +// CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} if (b) { +// CHECK-FIXES: {{^}}#define SOMETHING_WICKED false + +bool integer_not_zero(int i) { + if (i) { + return false; + } else { + return true; + } +} +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return +// CHECK-FIXES: {{^}} return i == 0;{{$}} From d50b1aab7c2116a610ece7791cad9675f3cc3ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Svensson?= <[email protected]> Date: Wed, 28 Jan 2026 09:00:08 +0100 Subject: [PATCH 2/4] [clang-tidy] Update testcase simplify-boolean-expr for C23 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Björn Svensson <[email protected]> --- .../readability/simplify-boolean-expr-c23.c | 65 +++++++++---------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c b/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c index 1911c33f21d7c..d41c5be2c9b68 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c @@ -194,15 +194,15 @@ void ternary_operator() { int i = 0; bool bd = (i > 20) ? true : false; // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result - // CHECK-FIXES: {{^ bool bd = i > 20;$}} + // CHECK-FIXES: {{^ bool bd = static_cast<bool>\(i > 20\);$}} bool be = (i > 20) ? false : true; // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result - // CHECK-FIXES: {{^ bool be = i <= 20;$}} + // CHECK-FIXES: {{^ bool be = static_cast<bool>\(i <= 20\);$}} bool bf = ((i > 20)) ? false : true; // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: {{.*}} in ternary expression result - // CHECK-FIXES: {{^ bool bf = i <= 20;$}} + // CHECK-FIXES: {{^ bool bf = static_cast<bool>\(i <= 20\);$}} } void operator_not_equal() { @@ -286,8 +286,7 @@ bool conditional_return_statements(int i) { if (i == 0) return true; else return false; } // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^}} return i == 0;{{$}} -// CHECK-FIXES-NEXT: {{^}$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i == 0\);$}} bool conditional_return_statements_no_fix_1(int i) { if (i == 0) return true; @@ -318,15 +317,13 @@ bool negated_conditional_return_statements(int i) { if (i == 0) return false; else return true; } // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^}} return i != 0;{{$}} -// CHECK-FIXES-NEXT: {{^}$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i != 0\);$}} bool negative_condition_conditional_return_statement(int i) { if (!(i == 0)) return false; else return true; } // CHECK-MESSAGES: :[[@LINE-2]]:25: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^}} return i == 0;{{$}} -// CHECK-FIXES-NEXT: {{^}$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i == 0\);$}} bool conditional_compound_return_statements(int i) { if (i == 1) { @@ -336,9 +333,7 @@ bool conditional_compound_return_statements(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^}}bool conditional_compound_return_statements(int i) {{{$}} -// CHECK-FIXES-NEXT: {{^}} return i == 1;{{$}} -// CHECK-FIXES-NEXT: {{^}$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i == 1\);$}} bool negated_conditional_compound_return_statements(int i) { if (i == 1) { @@ -348,9 +343,7 @@ bool negated_conditional_compound_return_statements(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^}}bool negated_conditional_compound_return_statements(int i) {{{$}} -// CHECK-FIXES-NEXT: {{^}} return i != 1;{{$}} -// CHECK-FIXES-NEXT: {{^}$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i != 1\);$}} bool conditional_return_statements_side_effects_then(int i) { if (i == 2) { @@ -395,7 +388,7 @@ void simple_conditional_assignment_statements(int i) { bool bb = false; // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment // CHECK-FIXES: bool b; - // CHECK-FIXES: {{^ }}b = i > 10;{{$}} + // CHECK-FIXES: {{^ b = static_cast<bool>\(i > 10\);$}} // CHECK-FIXES: bool bb = false; bool c; @@ -406,7 +399,7 @@ void simple_conditional_assignment_statements(int i) { bool c2 = false; // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment // CHECK-FIXES: bool c; - // CHECK-FIXES: {{^ }}c = i <= 20;{{$}} + // CHECK-FIXES: {{^ c = static_cast<bool>\(i <= 20\);$}} // CHECK-FIXES: bool c2 = false; // Unchanged: different variables. @@ -447,7 +440,7 @@ void complex_conditional_assignment_statements(int i) { d = false; // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment // CHECK-FIXES: bool d; - // CHECK-FIXES: {{^ }}d = i > 30;{{$}} + // CHECK-FIXES: {{^ d = static_cast<bool>\(i > 30\);$}} // CHECK-FIXES: d = false; bool e; @@ -459,7 +452,7 @@ void complex_conditional_assignment_statements(int i) { e = false; // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment // CHECK-FIXES: bool e; - // CHECK-FIXES: {{^ }}e = i <= 40;{{$}} + // CHECK-FIXES: {{^ e = static_cast<bool>\(i <= 40\);$}} // CHECK-FIXES: e = false; // Unchanged: no else statement. @@ -603,7 +596,7 @@ bool simple_if_return_return(int i) { } // CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return // CHECK-FIXES: {{^}}bool simple_if_return_return(int i) {{{$}} -// CHECK-FIXES: {{^ return i > 10;$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i > 10\);$}} // CHECK-FIXES: {{^}$}} bool simple_if_return_return_negated(int i) { @@ -613,7 +606,7 @@ bool simple_if_return_return_negated(int i) { } // CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return // CHECK-FIXES: {{^}}bool simple_if_return_return_negated(int i) {{{$}} -// CHECK-FIXES: {{^ return i <= 10;$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i <= 10\);$}} // CHECK-FIXES: {{^}$}} bool complex_if_return_return(int i) { @@ -624,7 +617,7 @@ bool complex_if_return_return(int i) { } // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return // CHECK-FIXES: {{^}}bool complex_if_return_return(int i) {{{$}} -// CHECK-FIXES: {{^ return i > 10;$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i > 10\);$}} // CHECK-FIXES: {{^}$}} bool complex_if_return_return_negated(int i) { @@ -635,7 +628,7 @@ bool complex_if_return_return_negated(int i) { } // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return // CHECK-FIXES: {{^}}bool complex_if_return_return_negated(int i) {{{$}} -// CHECK-FIXES: {{^ return i <= 10;$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i <= 10\);$}} // CHECK-FIXES: {{^}$}} bool if_implicit_bool_expr(int i) { @@ -646,7 +639,7 @@ bool if_implicit_bool_expr(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^}} return (i & 1) != 0;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i & 1\);$}} bool negated_if_implicit_bool_expr(int i) { if (i - 1) { @@ -656,7 +649,7 @@ bool negated_if_implicit_bool_expr(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^}} return (i - 1) == 0;{{$}} +// CHECK-FIXES: {{^ return !static_cast<bool>\(i - 1\);$}} bool implicit_int(int i) { if (i) { @@ -666,7 +659,7 @@ bool implicit_int(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^}} return i != 0;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(i\);$}} bool explicit_bool(bool b) { if (b) { @@ -686,7 +679,7 @@ bool negated_explicit_bool(bool b) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^}} return !b;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(!b\);$}} bool bitwise_complement_conversion(int i) { if (~i) { @@ -696,7 +689,7 @@ bool bitwise_complement_conversion(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^}} return ~i != 0;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(~i\);$}} bool logical_or(bool a, bool b) { if (a || b) { @@ -706,7 +699,7 @@ bool logical_or(bool a, bool b) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^}} return a || b;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(a \|\| b\);$}} bool logical_and(bool a, bool b) { if (a && b) { @@ -716,13 +709,13 @@ bool logical_and(bool a, bool b) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^}} return a && b;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(a && b\);$}} void ternary_integer_condition(int i) { bool b = i ? true : false; } // CHECK-MESSAGES: :[[@LINE-2]]:16: warning: {{.*}} in ternary expression result -// CHECK-FIXES: bool b = i != 0;{{$}} +// CHECK-FIXES: {{^ bool b = static_cast<bool>\(i\);$}} bool non_null_pointer_condition(int *p1) { if (p1) { @@ -732,7 +725,7 @@ bool non_null_pointer_condition(int *p1) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: return p1 != nullptr;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(p1\);$}} bool null_pointer_condition(int *p2) { if (!p2) { @@ -742,7 +735,7 @@ bool null_pointer_condition(int *p2) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: return p2 == nullptr;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(!p2\);$}} bool negated_non_null_pointer_condition(int *p3) { if (p3) { @@ -752,7 +745,7 @@ bool negated_non_null_pointer_condition(int *p3) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: return p3 == nullptr;{{$}} +// CHECK-FIXES: {{^ return !static_cast<bool>\(p3\);$}} bool negated_null_pointer_condition(int *p4) { if (!p4) { @@ -762,7 +755,7 @@ bool negated_null_pointer_condition(int *p4) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: return p4 != nullptr;{{$}} +// CHECK-FIXES: {{^ return static_cast<bool>\(p4\);$}} bool comments_in_the_middle(bool b) { if (b) { @@ -796,4 +789,4 @@ bool integer_not_zero(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^}} return i == 0;{{$}} +// CHECK-FIXES: {{^ return !static_cast<bool>\(i\);$}} From e8f2645463dba57a951c88065408626704540847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Svensson?= <[email protected]> Date: Wed, 28 Jan 2026 09:26:23 +0100 Subject: [PATCH 3/4] [clang-tidy] Correcting fix suggestion in readability-simplify-boolean-expr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When checker readability-simplify-boolean-expr is used on C23 code, where the bool type is provide but not static_cast, the fixer suggests faulty code. Lets skip the use of static_cast for C code where a cast is not needed anyway. Signed-off-by: Björn Svensson <[email protected]> --- .../readability/SimplifyBooleanExprCheck.cpp | 3 +- clang-tools-extra/docs/ReleaseNotes.rst | 4 ++ .../readability/simplify-boolean-expr-c23.c | 58 +++++++++---------- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp b/clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp index 4469e564e83f9..40b309d023701 100644 --- a/clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp @@ -162,7 +162,8 @@ static std::string replacementExpression(const ASTContext &Context, if (const auto *EC = dyn_cast<ExprWithCleanups>(E)) E = EC->getSubExpr(); - const bool NeedsStaticCast = needsStaticCast(E); + const bool NeedsStaticCast = + (Context.getLangOpts().CPlusPlus) ? needsStaticCast(E) : false; if (Negated) { if (const auto *UnOp = dyn_cast<UnaryOperator>(E)) { if (UnOp->getOpcode() == UO_LNot) { diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 1a056890e66c3..3899fb2cd66d9 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -164,6 +164,10 @@ Changes in existing checks now uses separate note diagnostics for each uninitialized enumerator, making it easier to see which specific enumerators need explicit initialization. +- Improved :doc:`readability-simplify-boolean-expr + <clang-tidy/checks/readability/simplify-boolean-expr>` check to provide valid + fix suggestions for C23 and later by not using ``static_cast``. + Removed checks ^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c b/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c index d41c5be2c9b68..6d587a3ea289a 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-boolean-expr-c23.c @@ -194,15 +194,15 @@ void ternary_operator() { int i = 0; bool bd = (i > 20) ? true : false; // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result - // CHECK-FIXES: {{^ bool bd = static_cast<bool>\(i > 20\);$}} + // CHECK-FIXES: {{^ bool bd = i > 20;$}} bool be = (i > 20) ? false : true; // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in ternary expression result - // CHECK-FIXES: {{^ bool be = static_cast<bool>\(i <= 20\);$}} + // CHECK-FIXES: {{^ bool be = i <= 20;$}} bool bf = ((i > 20)) ? false : true; // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: {{.*}} in ternary expression result - // CHECK-FIXES: {{^ bool bf = static_cast<bool>\(i <= 20\);$}} + // CHECK-FIXES: {{^ bool bf = i <= 20;$}} } void operator_not_equal() { @@ -286,7 +286,7 @@ bool conditional_return_statements(int i) { if (i == 0) return true; else return false; } // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^ return static_cast<bool>\(i == 0\);$}} +// CHECK-FIXES: {{^ return i == 0;$}} bool conditional_return_statements_no_fix_1(int i) { if (i == 0) return true; @@ -317,13 +317,13 @@ bool negated_conditional_return_statements(int i) { if (i == 0) return false; else return true; } // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^ return static_cast<bool>\(i != 0\);$}} +// CHECK-FIXES: {{^ return i != 0;$}} bool negative_condition_conditional_return_statement(int i) { if (!(i == 0)) return false; else return true; } // CHECK-MESSAGES: :[[@LINE-2]]:25: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^ return static_cast<bool>\(i == 0\);$}} +// CHECK-FIXES: {{^ return i == 0;$}} bool conditional_compound_return_statements(int i) { if (i == 1) { @@ -333,7 +333,7 @@ bool conditional_compound_return_statements(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^ return static_cast<bool>\(i == 1\);$}} +// CHECK-FIXES: {{^ return i == 1;$}} bool negated_conditional_compound_return_statements(int i) { if (i == 1) { @@ -343,7 +343,7 @@ bool negated_conditional_compound_return_statements(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return statement -// CHECK-FIXES: {{^ return static_cast<bool>\(i != 1\);$}} +// CHECK-FIXES: {{^ return i != 1;$}} bool conditional_return_statements_side_effects_then(int i) { if (i == 2) { @@ -388,7 +388,7 @@ void simple_conditional_assignment_statements(int i) { bool bb = false; // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment // CHECK-FIXES: bool b; - // CHECK-FIXES: {{^ b = static_cast<bool>\(i > 10\);$}} + // CHECK-FIXES: {{^ b = i > 10;$}} // CHECK-FIXES: bool bb = false; bool c; @@ -399,7 +399,7 @@ void simple_conditional_assignment_statements(int i) { bool c2 = false; // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: {{.*}} in conditional assignment // CHECK-FIXES: bool c; - // CHECK-FIXES: {{^ c = static_cast<bool>\(i <= 20\);$}} + // CHECK-FIXES: {{^ c = i <= 20;$}} // CHECK-FIXES: bool c2 = false; // Unchanged: different variables. @@ -440,7 +440,7 @@ void complex_conditional_assignment_statements(int i) { d = false; // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment // CHECK-FIXES: bool d; - // CHECK-FIXES: {{^ d = static_cast<bool>\(i > 30\);$}} + // CHECK-FIXES: {{^ d = i > 30;$}} // CHECK-FIXES: d = false; bool e; @@ -452,7 +452,7 @@ void complex_conditional_assignment_statements(int i) { e = false; // CHECK-MESSAGES: :[[@LINE-5]]:9: warning: {{.*}} in conditional assignment // CHECK-FIXES: bool e; - // CHECK-FIXES: {{^ e = static_cast<bool>\(i <= 40\);$}} + // CHECK-FIXES: {{^ e = i <= 40;$}} // CHECK-FIXES: e = false; // Unchanged: no else statement. @@ -596,7 +596,7 @@ bool simple_if_return_return(int i) { } // CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return // CHECK-FIXES: {{^}}bool simple_if_return_return(int i) {{{$}} -// CHECK-FIXES: {{^ return static_cast<bool>\(i > 10\);$}} +// CHECK-FIXES: {{^ return i > 10;$}} // CHECK-FIXES: {{^}$}} bool simple_if_return_return_negated(int i) { @@ -606,7 +606,7 @@ bool simple_if_return_return_negated(int i) { } // CHECK-MESSAGES: :[[@LINE-3]]:12: warning: {{.*}} in conditional return // CHECK-FIXES: {{^}}bool simple_if_return_return_negated(int i) {{{$}} -// CHECK-FIXES: {{^ return static_cast<bool>\(i <= 10\);$}} +// CHECK-FIXES: {{^ return i <= 10;$}} // CHECK-FIXES: {{^}$}} bool complex_if_return_return(int i) { @@ -617,7 +617,7 @@ bool complex_if_return_return(int i) { } // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return // CHECK-FIXES: {{^}}bool complex_if_return_return(int i) {{{$}} -// CHECK-FIXES: {{^ return static_cast<bool>\(i > 10\);$}} +// CHECK-FIXES: {{^ return i > 10;$}} // CHECK-FIXES: {{^}$}} bool complex_if_return_return_negated(int i) { @@ -628,7 +628,7 @@ bool complex_if_return_return_negated(int i) { } // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: {{.*}} in conditional return // CHECK-FIXES: {{^}}bool complex_if_return_return_negated(int i) {{{$}} -// CHECK-FIXES: {{^ return static_cast<bool>\(i <= 10\);$}} +// CHECK-FIXES: {{^ return i <= 10;$}} // CHECK-FIXES: {{^}$}} bool if_implicit_bool_expr(int i) { @@ -639,7 +639,7 @@ bool if_implicit_bool_expr(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(i & 1\);$}} +// CHECK-FIXES: {{^ return i & 1;$}} bool negated_if_implicit_bool_expr(int i) { if (i - 1) { @@ -649,7 +649,7 @@ bool negated_if_implicit_bool_expr(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return !static_cast<bool>\(i - 1\);$}} +// CHECK-FIXES: {{^ return !\(i - 1\);$}} bool implicit_int(int i) { if (i) { @@ -659,7 +659,7 @@ bool implicit_int(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(i\);$}} +// CHECK-FIXES: {{^}} return i;{{$}} bool explicit_bool(bool b) { if (b) { @@ -679,7 +679,7 @@ bool negated_explicit_bool(bool b) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(!b\);$}} +// CHECK-FIXES: {{^ return !b;$}} bool bitwise_complement_conversion(int i) { if (~i) { @@ -689,7 +689,7 @@ bool bitwise_complement_conversion(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(~i\);$}} +// CHECK-FIXES: {{^ return ~i;$}} bool logical_or(bool a, bool b) { if (a || b) { @@ -699,7 +699,7 @@ bool logical_or(bool a, bool b) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(a \|\| b\);$}} +// CHECK-FIXES: {{^ return a \|\| b;$}} bool logical_and(bool a, bool b) { if (a && b) { @@ -709,13 +709,13 @@ bool logical_and(bool a, bool b) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(a && b\);$}} +// CHECK-FIXES: {{^ return a && b;$}} void ternary_integer_condition(int i) { bool b = i ? true : false; } // CHECK-MESSAGES: :[[@LINE-2]]:16: warning: {{.*}} in ternary expression result -// CHECK-FIXES: {{^ bool b = static_cast<bool>\(i\);$}} +// CHECK-FIXES: {{^ bool b = i;$}} bool non_null_pointer_condition(int *p1) { if (p1) { @@ -725,7 +725,7 @@ bool non_null_pointer_condition(int *p1) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(p1\);$}} +// CHECK-FIXES: {{^ return p1;$}} bool null_pointer_condition(int *p2) { if (!p2) { @@ -735,7 +735,7 @@ bool null_pointer_condition(int *p2) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(!p2\);$}} +// CHECK-FIXES: {{^ return !p2;$}} bool negated_non_null_pointer_condition(int *p3) { if (p3) { @@ -745,7 +745,7 @@ bool negated_non_null_pointer_condition(int *p3) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return !static_cast<bool>\(p3\);$}} +// CHECK-FIXES: {{^ return !p3;$}} bool negated_null_pointer_condition(int *p4) { if (!p4) { @@ -755,7 +755,7 @@ bool negated_null_pointer_condition(int *p4) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return static_cast<bool>\(p4\);$}} +// CHECK-FIXES: {{^ return p4;$}} bool comments_in_the_middle(bool b) { if (b) { @@ -789,4 +789,4 @@ bool integer_not_zero(int i) { } } // CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return -// CHECK-FIXES: {{^ return !static_cast<bool>\(i\);$}} +// CHECK-FIXES: {{^ return !i;$}} From 6cadeea7642308990e4a67536069c87e06cdac0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Svensson?= <[email protected]> Date: Wed, 28 Jan 2026 15:29:44 +0100 Subject: [PATCH 4/4] fixup: replace ternary operator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Björn Svensson <[email protected]> --- .../clang-tidy/readability/SimplifyBooleanExprCheck.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp b/clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp index 40b309d023701..040f6fb8c843c 100644 --- a/clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp @@ -163,7 +163,7 @@ static std::string replacementExpression(const ASTContext &Context, E = EC->getSubExpr(); const bool NeedsStaticCast = - (Context.getLangOpts().CPlusPlus) ? needsStaticCast(E) : false; + Context.getLangOpts().CPlusPlus && needsStaticCast(E); if (Negated) { if (const auto *UnOp = dyn_cast<UnaryOperator>(E)) { if (UnOp->getOpcode() == UO_LNot) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
