| void foo(); void foobar(); |
| |
| void simpleCompoundBodyIf(int x) { |
| foo(); |
| |
| if (x == 2) { |
| int y = x; |
| } else if (x == 3) { |
| foo(); |
| } else { |
| foobar(); |
| } |
| |
| foobar(); |
| } |
| |
| // RUN: clang-refactor-test list-actions -at=%s:6:3 %s | FileCheck --check-prefix=CHECK-ACTION %s |
| // CHECK-ACTION: Convert to Switch |
| |
| // Ensure the the action can be initiated around the ifs: |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:6:3-15 -in=%s:8:3-22 -in=%s:10:3-10 %s | FileCheck --check-prefix=CHECK1 %s |
| // CHECK1: Initiated the 'if-switch-conversion' action at 6:3 |
| |
| // Ensure that the action can't be initiated when not around the ifs: |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:1:1-10 -in=%s:3:1-18 -in=%s:4:1-9 -in=%s:6:1-2 -in=%s:14:1-12 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| // CHECK-NO: Failed to initiate the refactoring action |
| // CHECK-NO-NOT: Initiated the 'if-switch-conversion' action |
| |
| // Ensure that the action can't be initiated inside the ifs: |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:7:1-15 -in=%s:9:1-11 -in=%s:11:1-14 -in=%s:12:1-4 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| |
| void nestedIf(int x) { |
| if (x == 2) { |
| if (x == 3) { |
| foo(); |
| } else { |
| foo(); |
| } |
| } else { |
| foobar(); |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:35:3-15 -in=%s:35:3-10 %s | FileCheck --check-prefix=CHECK2 %s |
| // CHECK2: Initiated the 'if-switch-conversion' action at 35:3 |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:36:5-17 -in=%s:38:5-12 %s | FileCheck --check-prefix=CHECK3 %s |
| // CHECK3: Initiated the 'if-switch-conversion' action at 36:5 |
| |
| |
| |
| |
| |
| void simpleFlatBodyIfs(int x) { |
| if (x == 2) |
| foo(); |
| else if (x == 3) |
| foo(); |
| |
| else if (x == 4) foobar(); |
| |
| else foo(); |
| |
| if (x == 2) foobar(); |
| else |
| //comment |
| foo(); |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:57:3-14 -in=%s:59:3-19 -in=%s:62:3-19 -in=%s:64:3-7 %s | FileCheck --check-prefix=CHECK4 %s |
| // CHECK4: Initiated the 'if-switch-conversion' action at 57:3 |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:57:1-2 -in=%s:58:1-11 -in=%s:59:1-2 -in=%s:60:1-11 -in=%s:61:1-1 -in=%s:62:1-2 -in=%s:62:20-29 -in=%s:63:1-1 -in=%s:64:1-2 -in=%s:64:8-14 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:66:3-15 -in=%s:67:3-7 -in=%s:68:1-14 %s | FileCheck --check-prefix=CHECK5 %s |
| // CHECK5: Initiated the 'if-switch-conversion' action at 66:3 |
| |
| void differentLineCompoundIf(int x) { |
| if (x == 2) |
| { |
| foo(); |
| } |
| |
| else if (x == 3) |
| |
| { |
| foo(); |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:81:3-14 -in=%s:86:3-19 -in=%s:87:1-1 %s | FileCheck --check-prefix=CHECK6 %s |
| // CHECK6: Initiated the 'if-switch-conversion' action at 81:3 |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:81:1-2 -in=%s:82:1-4 -in=%s:84:1-4 -in=%s:85:1-1 -in=%s:86:1-2 -in=%s:88:1-4 -in=%s:90:1-4 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| |
| void simpleEmptyIf(int x) { |
| if (x == 1) ; |
| else if (x == 2) ; |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:99:3-14 -in=%s:100:3-19 %s | FileCheck --check-prefix=CHECK7 %s |
| // CHECK7: Initiated the 'if-switch-conversion' action at 99:3 |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:99:15-16 -in=%s:100:20-21 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| |
| void sameLineIfElse(int x) { |
| if (x == 1) foo(); else foo(); |
| if (x == 2) { foo(); } else if (x == 3) { foo(); } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:109:3-14 -in=%s:109:22-26 %s | FileCheck --check-prefix=CHECK8 %s |
| // CHECK8: Initiated the 'if-switch-conversion' action at 109:3 |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:109:15-21 -in=%s:109:27-33 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -in=%s:110:3-15 -in=%s:110:24-43 %s | FileCheck --check-prefix=CHECK9 %s |
| // CHECK9: Initiated the 'if-switch-conversion' action at 110:3 |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:110:16-23 -in=%s:110:44-53 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| |
| void noIfsWithoutElses(int x) { |
| if (x == 1) { |
| foo(); |
| } |
| if (x == 2) ; |
| } |
| |
| // Ifs without any elses shouldn't be allowed: |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:124:1-16 -in=%s:127:1-16 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| |
| void noFancyIfs(const int *p) { |
| if (const int *x = p) { |
| } |
| else if (const int *y = p) { |
| } |
| |
| if (const int *x = p; *x == 2) { |
| } else if (const int *y = p; *y == 3) { |
| } |
| } |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:134:1-26 -in=%s:136:1-31 %s 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -in=%s:139:1-35 -in=%s:140:1-42 %s -std=c++1z 2>&1 | FileCheck --check-prefix=CHECK-NO %s |
| |
| void prohibitBreaksCasesDefaults(int x) { |
| while (x != 0) { |
| break; |
| // Allowed: |
| if (x == 1) foo(); |
| else foo(); |
| // Not allowed: |
| if (x == 2) break; |
| else foo(); |
| if (x == 2) { foo(); } |
| else { break; } |
| if (x == 2) { foo(); } |
| else if (x == 1) { if (x == 2) { break; } } |
| } |
| switch (x) { |
| case 1: |
| // Allowed: |
| if (x == 1) foo(); |
| else foo(); |
| // Not allowed: |
| if (x == 2) foo(); |
| else if (x == 3) { |
| case 2: |
| foo(); |
| } |
| if (x == 3) foo(); |
| else { |
| default: |
| foo(); |
| } |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:151:5 %s | FileCheck --check-prefix=CHECK10 %s |
| // CHECK10: Initiated the 'if-switch-conversion' action at 151:5 |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:154:5 -at=%s:156:5 -at=%s:158:5 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-STATEMENTS %s |
| // CHECK-INVALID-STATEMENTS: Failed to initiate the refactoring action (if's body contains a 'break'/'default'/'case' statement) |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:164:5 %s | FileCheck --check-prefix=CHECK11 %s |
| // CHECK11: Initiated the 'if-switch-conversion' action at 164:5 |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:167:5 -at=%s:172:5 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-STATEMENTS %s |
| |
| #ifdef DISALLOWED |
| #define DISALLOW(x) x |
| #else |
| #define DISALLOW(x) |
| #endif |
| |
| void allowBreaksInNestedLoops(int x) { |
| DISALLOW(while (true)) { |
| // Allowed: |
| if (x == 1) { |
| foo(); |
| } else if (x == 2) { |
| while (x != 0) { |
| break; |
| } |
| DISALLOW(break;) |
| } |
| |
| if (x == 1) { |
| foo(); |
| } else { |
| for (int y = 0; y < x; ++y) { |
| break; |
| } |
| DISALLOW(break;) |
| } |
| |
| if (x == 1) { |
| do { |
| break; |
| } while (x < 10); |
| DISALLOW(break;) |
| } else { |
| foo(); |
| } |
| |
| if (x == 1) { |
| do { |
| // nested loop. |
| while (true) { |
| } |
| break; |
| } while (x < 10); |
| DISALLOW(break;) |
| } else { |
| foo(); |
| } |
| |
| } |
| |
| // Still care about cases and defaults in loops: |
| switch (x) { |
| case 0: |
| if (x == 1) { |
| while (true) { |
| case 1: |
| } |
| } else { |
| foo(); |
| } |
| break; |
| } |
| |
| switch (x) { |
| case 0: |
| if (x == 1) { |
| while (true) { |
| default: |
| } |
| } else { |
| foo(); |
| } |
| break; |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:200:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // CHECK-YES: Initiated the 'if-switch-conversion' action |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:209:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:218:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:227:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:200:3 -at=%s:209:3 -at=%s:218:3 -at=%s:227:3 -at=%s:244:5 -at=%s:256:5 %s 2>&1 -D DISALLOWED | FileCheck --check-prefix=CHECK-INVALID-STATEMENTS %s |
| |
| void allowBreakDefaultCaseInNestedSwitches(int x) { |
| DISALLOW(switch (x)) { |
| // Allowed: |
| if (x == 1) { |
| foo(); |
| } else if (x == 2) { |
| switch (x) { |
| case 0: |
| foo(); |
| } |
| DISALLOW(case 0: ;) |
| } |
| |
| if (x == 1) { |
| foo(); |
| } else { |
| switch (x) { |
| default: |
| foo(); |
| } |
| DISALLOW(default: ;) |
| } |
| |
| if (x == 1) { |
| switch (x) { |
| break; |
| } |
| DISALLOW(break;) |
| } else { |
| foo(); |
| } |
| |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:279:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:289:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:299:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:279:3 -at=%s:289:3 -at=%s:299:3 %s 2>&1 -D DISALLOWED | FileCheck --check-prefix=CHECK-INVALID-STATEMENTS %s |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| bool isTrue(); |
| |
| void allowOnlyEqualsOp(int x) { |
| if (x != 1) { |
| } else { |
| } |
| |
| if (x == 1) { |
| } else if (x > 2) { |
| } |
| |
| if (x == 3) { |
| } else if (x) { |
| } |
| |
| if (isTrue()) { |
| } else { |
| } |
| } |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:335:3 -at=%s:339:3 -at=%s:343:3 -at=%s:347:3 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-COND %s |
| // CHECK-INVALID-COND: Failed to initiate the refactoring action (unsupported conditional expression)! |
| |
| void allowEqualsOpInParens(int x) { |
| if ((x == 1)) { |
| } else { |
| } |
| |
| if (x == 1) { |
| } else if (((x == 2))) { |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:356:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -at=%s:360:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| |
| enum Switchable { |
| A, B |
| }; |
| |
| struct Struct { |
| }; |
| |
| bool operator == (const Struct &, int); |
| |
| void allowSwitchableTypes(int x, bool b, long l, char c, Switchable e, |
| float f, double d, Struct s, int *ip) { |
| // Allowed: |
| if (b == true) { |
| } else { |
| } |
| |
| if (1 == 1) { |
| } else { |
| } |
| |
| if (l == 4) { |
| } else { |
| } |
| |
| if (e == A) { |
| } else { |
| } |
| |
| if (x == A) { |
| } else { |
| } |
| |
| if (c == 'x') { |
| } else { |
| } |
| |
| // Disallowed: |
| if (f == 0) { |
| } else { |
| } |
| |
| if (d == 0) { |
| } else { |
| } |
| |
| if (x == 0) { |
| } else if (x == 0.0) { |
| } |
| |
| if (s == 0) { |
| } else { |
| } |
| |
| if (ip == 0) { |
| } else { |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -location-agnostic -at=%s:380:3 -at=%s:384:3 -at=%s:388:3 -at=%s:392:3 -at=%s:396:3 -at=%s:400:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:405:3 -at=%s:409:3 -at=%s:413:3 -at=%s:417:3 -at=%s:421:3 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-COND %s |
| |
| template<typename T> |
| void prohibitDependentOperators(T x) { |
| if (x == 0) { |
| } else { |
| } |
| } |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:431:3 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-COND %s |
| |
| int integerFunction(); |
| |
| void checkLHSSame(int x, int y) { |
| // Allowed: |
| if (integerFunction() == 1) { |
| } else if (integerFunction() == 2) { |
| } |
| |
| // Disallowed: |
| if (x == 1) { |
| } else if (y == 2) { |
| } |
| |
| if (x == 1) { |
| } else if (2 == 2) { |
| } |
| |
| if (integerFunction() == 1) { |
| } else if (x == 2) { |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -location-agnostic -at=%s:442:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:447:3 -at=%s:451:3 -at=%s:455:3 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-COND %s |
| |
| void checkRHSConstant(int x, int y, Switchable e) { |
| // Allowed: |
| if (x == (int)A) { |
| } else { |
| } |
| |
| if (e == (Switchable)1) { |
| } else { |
| } |
| |
| // Disallowed: |
| if (x == y) { |
| } else { |
| } |
| |
| if (x == 1) { |
| } else if (x == integerFunction()) { |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -location-agnostic -at=%s:465:3 -at=%s:469:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:474:3 -at=%s:478:3 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-COND %s |
| |
| void checkRHSUnique(int x, int y, Switchable e) { |
| // Disallowed: |
| if (x == 0) { |
| } else if (x == 0) { |
| } |
| |
| if (e == A) { |
| } else if (e == (Switchable)0) { |
| } |
| } |
| |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:474:3 -at=%s:478:3 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-COND %s |
| |
| void allowLHSParens(int x) { |
| if ((x) == 0) { |
| } else { |
| } |
| } |
| |
| void allowRHSParens(int x) { |
| if (x == (0)) { |
| } else { |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -location-agnostic -at=%s:500:3 -at=%s:506:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| |
| void allowLogicalOr(int x, int y) { |
| // Allowed: |
| if (x == 0 || x == 1) { |
| } else { |
| } |
| |
| if (x == 0) { |
| } else if (x == 1 || x == 2) { |
| } |
| |
| if (x == (0) || (x == 1)) { |
| } else { |
| } |
| |
| if (x == 0) { |
| } else if ((x == 1 || x == 2)) { |
| } |
| |
| // Disallowed: |
| if (x == 0 && x == 1) { |
| } else { |
| } |
| |
| if (x == 0 | x == 1) { |
| } else { |
| } |
| |
| if (x == 0 || isTrue()) { |
| } else if (y == 2) { |
| } |
| |
| if (x == 0 || x == 1) { |
| } else if (y == 2) { |
| } |
| |
| if (x == 0) { |
| } else if (x == 1 || x == integerFunction()) { |
| } |
| |
| if (x == 1) { |
| } else if (x == 2 || x == 1) { |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -location-agnostic -at=%s:515:3 -at=%s:519:3 -at=%s:523:3 -at=%s:527:3 %s | FileCheck --check-prefix=CHECK-YES %s |
| // RUN: not clang-refactor-test initiate -action if-switch-conversion -at=%s:532:3 -at=%s:536:3 -at=%s:540:3 -at=%s:544:3 -at=%s:548:3 -at=%s:552:3 %s 2>&1 | FileCheck --check-prefix=CHECK-INVALID-COND %s |
| |
| void parenImpCastsLHSEquivalence(int x) { |
| if ((x) == 1) { |
| } else if (x == 2) { |
| } |
| } |
| |
| // RUN: clang-refactor-test initiate -action if-switch-conversion -location-agnostic -at=%s:561:3 %s | FileCheck --check-prefix=CHECK-YES %s |