123 lines · cpp
1// RUN: %check_clang_tidy %s readability-string-compare %t -- -- -isystem %clang_tidy_headers2#include <string>3 4void func(bool b);5 6std::string comp() {7 std::string str("a", 1);8 return str;9}10 11void Test() {12 std::string str1("a", 1);13 std::string str2("b", 1);14 15 if (str1.compare(str2)) {16 }17 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings; use the string equality operator instead [readability-string-compare]18 if (!str1.compare(str2)) {19 }20 // CHECK-MESSAGES: [[@LINE-2]]:8: warning: do not use 'compare' to test equality of strings; use the string equality operator instead [readability-string-compare]21 if (str1.compare(str2) == 0) {22 }23 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;24 // CHECK-FIXES: if (str1 == str2) {25 if (str1.compare(str2) != 0) {26 }27 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;28 // CHECK-FIXES: if (str1 != str2) {29 if (str1.compare("foo") == 0) {30 }31 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;32 // CHECK-FIXES: if (str1 == "foo") {33 if (0 == str1.compare(str2)) {34 }35 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;36 // CHECK-FIXES: if (str2 == str1) {37 if (0 != str1.compare(str2)) {38 }39 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;40 // CHECK-FIXES: if (str2 != str1) {41 func(str1.compare(str2));42 // CHECK-MESSAGES: [[@LINE-1]]:8: warning: do not use 'compare' to test equality of strings;43 if (str2.empty() || str1.compare(str2) != 0) {44 }45 // CHECK-MESSAGES: [[@LINE-2]]:23: warning: do not use 'compare' to test equality of strings;46 // CHECK-FIXES: if (str2.empty() || str1 != str2) {47 std::string *str3 = &str1;48 if (str3->compare(str2)) {49 }50 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;51 if (str3->compare(str2) == 0) {52 }53 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;54 // CHECK-FIXES: if (*str3 == str2) {55 if (str2.compare(*str3) == 0) {56 }57 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;58 // CHECK-FIXES: if (str2 == *str3) {59 if (comp().compare(str1) == 0) {60 }61 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;62 // CHECK-FIXES: if (comp() == str1) {63 if (str1.compare(comp()) == 0) {64 }65 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;66 // CHECK-FIXES: if (str1 == comp()) {67 if (str1.compare(comp())) {68 }69 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings;70 71 std::string_view sv1("a");72 std::string_view sv2("b");73 if (sv1.compare(sv2)) {74 }75 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings; use the string equality operator instead [readability-string-compare]76}77 78struct DerivedFromStdString : std::string {};79 80void TestDerivedClass() {81 DerivedFromStdString derived;82 if (derived.compare(derived)) {83 }84 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: do not use 'compare' to test equality of strings; use the string equality operator instead [readability-string-compare]85}86 87void Valid() {88 std::string str1("a", 1);89 std::string str2("b", 1);90 91 if (str1 == str2) {92 }93 if (str1 != str2) {94 }95 if (str1.compare(str2) == str1.compare(str2)) {96 }97 if (0 == 0) {98 }99 if (str1.compare(str2) > 0) {100 }101 if (str1.compare(1, 3, str2)) {102 }103 if (str1.compare(str2) > 0) {104 }105 if (str1.compare(str2) < 0) {106 }107 if (str1.compare(str2) == 2) {108 }109 if (str1.compare(str2) == -3) {110 }111 if (str1.compare(str2) == 1) {112 }113 if (str1.compare(str2) == -1) {114 }115 116 std::string_view sv1("a");117 std::string_view sv2("b");118 if (sv1 == sv2) {119 }120 if (sv1.compare(sv2) > 0) {121 }122}123