From d8e78022c63b9fc9af6260eef667231c929e9cee Mon Sep 17 00:00:00 2001 From: Clement Courbet Date: Mon, 25 Mar 2019 08:18:00 +0000 Subject: [clang-tidy] Fix more false positives for bugprone-string-integer-assignment Summary: And add various tests gleaned for our codebase. See PR27723. Reviewers: JonasToth, alexfh, xazax.hun Subscribers: rnkovacs, jdoerfert, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D59360 llvm-svn: 356871 --- .../bugprone-string-integer-assignment.cpp | 42 +++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'clang-tools-extra/test/clang-tidy/bugprone-string-integer-assignment.cpp') diff --git a/clang-tools-extra/test/clang-tidy/bugprone-string-integer-assignment.cpp b/clang-tools-extra/test/clang-tidy/bugprone-string-integer-assignment.cpp index dbf3a5c5e60..18fe5ef4e5c 100644 --- a/clang-tools-extra/test/clang-tidy/bugprone-string-integer-assignment.cpp +++ b/clang-tools-extra/test/clang-tidy/bugprone-string-integer-assignment.cpp @@ -7,6 +7,8 @@ struct basic_string { basic_string& operator=(basic_string); basic_string& operator+=(T); basic_string& operator+=(basic_string); + const T &operator[](int i) const; + T &operator[](int i); }; typedef basic_string string; @@ -21,10 +23,13 @@ int toupper(int i); typedef int MyArcaneChar; +constexpr char kCharConstant = 'a'; + int main() { std::string s; std::wstring ws; int x = 5; + const char c = 'c'; s = 6; // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: an integer is interpreted as a character code when assigning {{.*}} [bugprone-string-integer-assignment] @@ -58,12 +63,47 @@ int main() { s += toupper(x); s += tolower(x); - s += std::tolower(x); + s += (std::tolower(x)); + + s += c & s[1]; + s += c ^ s[1]; + s += c | s[1]; + + s[x] += 1; + s += s[x]; + as += as[x]; // Likely character expressions. s += x & 0xff; s += 0xff & x; + s += x % 26; + s += 26 % x; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: an integer is interpreted as a chara + // CHECK-FIXES: {{^}} s += std::to_string(26 % x);{{$}} + s += c | 0x80; + s += c | 0x8000; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: an integer is interpreted as a chara + // CHECK-FIXES: {{^}} s += std::to_string(c | 0x8000);{{$}} + as += c | 0x8000; s += 'a' + (x % 26); + s += kCharConstant + (x % 26); + s += 'a' + (s[x] & 0xf); s += (x % 10) + 'b'; + + s += x > 255 ? c : x; + s += x > 255 ? 12 : x; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: an integer is interpreted as a chara + // CHECK-FIXES: {{^}} s += std::to_string(x > 255 ? 12 : x);{{$}} +} + +namespace instantiation_dependent_exprs { +template +struct S { + static constexpr T t = 0x8000; + std::string s; + void f(char c) { s += c | static_cast(t); } +}; + +template S; } -- cgit v1.2.3