================
@@ -0,0 +1,194 @@
+// RUN: %check_clang_tidy %s misc-scope-reduction %t -- --
+
+// Test case 1: Variable can be moved to smaller scope (if-block)
+void test_if_scope() {
+ int x = 42;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'x' can be declared in
a smaller scope
+ if (true) {
+ int y = x + 1;
+ }
+}
+
+// Test case 2: Variable used across multiple scopes - should NOT warn
+int test_multiple_scopes(int v) {
+ int y = 0; // Should NOT warn - used in if-block and return
+ if (v) {
+ y = 10;
+ }
+ return y;
+}
+
+// Test case 3: Variable can be moved to nested if-block
+void test_nested_if() {
+ int a = 5;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'a' can be declared in
a smaller scope
+ if (true) {
+ if (true) {
+ int b = a * 2;
+ }
+ }
+}
+
+// Test case 4: Variable used in same scope - should NOT warn
+void test_same_scope() {
+ int x = 10; // Should NOT warn - used in same scope
+ int y = x + 5;
+}
+
+// Test case 5: Variable can be moved to while loop body
+// TODO: This is a false positive. Correcting this will require
+// loop semantic comprehension and var lifetime analysis.
+void test_while_loop() {
+ int counter = 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'counter' can be
declared in a smaller scope
+ while (true) {
+ counter++;
+ if (counter > 10) break;
+ }
+}
+
+// Test case 6: Variable used in multiple branches of same if-statement
+void test_if_branches(bool condition) {
+ int value = 100; // Should NOT warn - used in both branches
+ if (condition) {
+ value *= 2;
+ } else {
+ value /= 2;
+ }
+}
+
+// Test case 7: Variable can be moved to for-loop body
+void test_for_loop_body() {
+ int temp = 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'temp' can be declared
in a smaller scope
+ for (int i = 0; i < 10; i++) {
+ temp = i * i;
+ }
+}
+
+// Test case 8: Variable used in for-loop expressions - should NOT warn
(current limitation)
+void test_for_loop_expressions() {
+ int i;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'i' can be declared in
for-loop initialization
+ for (i = 0; i < 5; i++) {
+ // loop body
+ }
+}
+
+// Test case 9: Variable can be moved to switch case
+void test_switch_case(int value) {
+ int result = 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'result' can be
declared in a smaller scope
+ switch (value) {
+ case 1:
+ result = 10;
+ break;
+ default:
+ break;
+ }
+}
+
+// Test case 10: Variable used across multiple switch cases - should NOT warn
+void test_switch_multiple_cases(int value) {
+ int accumulator = 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'accumulator' can be
declared in a smaller scope
+ switch (value) {
+ case 1:
+ accumulator += 10;
+ break;
+ case 2:
+ accumulator += 20;
+ break;
+ }
+}
+
+// Test case 11: Variable with complex initialization can be moved
+void test_complex_init() {
+ int complex = (5 + 3) * 2;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'complex' can be
declared in a smaller scope
+ if (true) {
+ int doubled = complex * 2;
+ }
+}
----------------
firewave wrote:
`complex` is a keyword so better use a different name.
https://github.com/llvm/llvm-project/pull/175429
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits