Skip to content

Commit

Permalink
[clang-tidy][NFC] Make abseil-redundant-strcat-calls checker use <str…
Browse files Browse the repository at this point in the history
…ing> header

Remove duplication in abseil-redundant-strcat-calls check tests,
by using dummy <string> header file string.

Depends on D145310

Reviewed By: PiotrZSL

Differential Revision: https://reviews.llvm.org/D145311
  • Loading branch information
mikecrowe authored and PiotrZSL committed Mar 11, 2023
1 parent f1e2469 commit 9883558
Showing 1 changed file with 22 additions and 106 deletions.
Original file line number Diff line number Diff line change
@@ -1,92 +1,8 @@
// RUN: %check_clang_tidy %s abseil-redundant-strcat-calls %t
// RUN: %check_clang_tidy %s abseil-redundant-strcat-calls %t -- -- -isystem %clang_tidy_headers
#include <string>

int strlen(const char *);

// Here we mimic the hierarchy of ::string.
// We need to do so because we are matching on the fully qualified name of the
// methods.
struct __sso_string_base {};
namespace __gnu_cxx {
template <typename A, typename B, typename C, typename D = __sso_string_base>
class __versa_string {
public:
const char *c_str() const;
const char *data() const;
int size() const;
int capacity() const;
int length() const;
bool empty() const;
char &operator[](int);
void clear();
void resize(int);
int compare(const __versa_string &) const;
};
} // namespace __gnu_cxx

namespace std {
template <typename T>
class char_traits {};
template <typename T>
class allocator {};
} // namespace std

template <typename A, typename B = std::char_traits<A>,
typename C = std::allocator<A>>
class basic_string : public __gnu_cxx::__versa_string<A, B, C> {
public:
basic_string();
basic_string(const basic_string &);
basic_string(const char *, C = C());
basic_string(const char *, int, C = C());
basic_string(const basic_string &, int, int, C = C());
~basic_string();

basic_string &operator+=(const basic_string &);
};

template <typename A, typename B, typename C>
basic_string<A, B, C> operator+(const basic_string<A, B, C> &,
const basic_string<A, B, C> &);
template <typename A, typename B, typename C>
basic_string<A, B, C> operator+(const basic_string<A, B, C> &, const char *);

typedef basic_string<char> string;

bool operator==(const string &, const string &);
bool operator==(const string &, const char *);
bool operator==(const char *, const string &);

bool operator!=(const string &, const string &);
bool operator<(const string &, const string &);
bool operator>(const string &, const string &);
bool operator<=(const string &, const string &);
bool operator>=(const string &, const string &);

namespace std {
template <typename _CharT, typename _Traits = char_traits<_CharT>,
typename _Alloc = allocator<_CharT>>
class basic_string;

template <typename _CharT, typename _Traits, typename _Alloc>
class basic_string {
public:
basic_string();
basic_string(const basic_string &);
basic_string(const char *, const _Alloc & = _Alloc());
basic_string(const char *, int, const _Alloc & = _Alloc());
basic_string(const basic_string &, int, int, const _Alloc & = _Alloc());
~basic_string();

basic_string &operator+=(const basic_string &);

unsigned size() const;
unsigned length() const;
bool empty() const;
};

typedef basic_string<char> string;
} // namespace std

namespace absl {

class string_view {
Expand All @@ -95,12 +11,12 @@ class string_view {

string_view();
string_view(const char *);
string_view(const string &);
string_view(const std::string &);
string_view(const char *, int);
string_view(string_view, int);

template <typename A>
explicit operator ::basic_string<char, traits_type, A>() const;
explicit operator std::basic_string<char, traits_type, A>() const;

const char *data() const;
int size() const;
Expand All @@ -113,36 +29,36 @@ struct AlphaNum {
AlphaNum(int i);
AlphaNum(double f);
AlphaNum(const char *c_str);
AlphaNum(const string &str);
AlphaNum(const std::string &str);
AlphaNum(const string_view &pc);

private:
AlphaNum(const AlphaNum &);
AlphaNum &operator=(const AlphaNum &);
};

string StrCat();
string StrCat(const AlphaNum &A);
string StrCat(const AlphaNum &A, const AlphaNum &B);
string StrCat(const AlphaNum &A, const AlphaNum &B, const AlphaNum &C);
string StrCat(const AlphaNum &A, const AlphaNum &B, const AlphaNum &C,
const AlphaNum &D);
std::string StrCat();
std::string StrCat(const AlphaNum &A);
std::string StrCat(const AlphaNum &A, const AlphaNum &B);
std::string StrCat(const AlphaNum &A, const AlphaNum &B, const AlphaNum &C);
std::string StrCat(const AlphaNum &A, const AlphaNum &B, const AlphaNum &C,
const AlphaNum &D);

// Support 5 or more arguments
template <typename... AV>
string StrCat(const AlphaNum &A, const AlphaNum &B, const AlphaNum &C,
std::string StrCat(const AlphaNum &A, const AlphaNum &B, const AlphaNum &C,
const AlphaNum &D, const AlphaNum &E, const AV &... args);

void StrAppend(string *Dest, const AlphaNum &A);
void StrAppend(string *Dest, const AlphaNum &A, const AlphaNum &B);
void StrAppend(string *Dest, const AlphaNum &A, const AlphaNum &B,
const AlphaNum &C);
void StrAppend(string *Dest, const AlphaNum &A, const AlphaNum &B,
const AlphaNum &C, const AlphaNum &D);
void StrAppend(std::string *Dest, const AlphaNum &A);
void StrAppend(std::string *Dest, const AlphaNum &A, const AlphaNum &B);
void StrAppend(std::string *Dest, const AlphaNum &A, const AlphaNum &B,
const AlphaNum &C);
void StrAppend(std::string *Dest, const AlphaNum &A, const AlphaNum &B,
const AlphaNum &C, const AlphaNum &D);

// Support 5 or more arguments
template <typename... AV>
void StrAppend(string *Dest, const AlphaNum &A, const AlphaNum &B,
void StrAppend(std::string *Dest, const AlphaNum &A, const AlphaNum &B,
const AlphaNum &C, const AlphaNum &D, const AlphaNum &E,
const AV &... args);

Expand All @@ -153,8 +69,8 @@ using absl::StrAppend;
using absl::StrCat;

void Positives() {
string S = StrCat(1, StrCat("A", StrCat(1.1)));
// CHECK-MESSAGES: [[@LINE-1]]:14: warning: multiple calls to 'absl::StrCat' can be flattened into a single call
std::string S = StrCat(1, StrCat("A", StrCat(1.1)));
// CHECK-MESSAGES: [[@LINE-1]]:19: warning: multiple calls to 'absl::StrCat' can be flattened into a single call
// CHECK-FIXES: string S = StrCat(1, "A", 1.1);

S = StrCat(StrCat(StrCat(StrCat(StrCat(1)))));
Expand Down Expand Up @@ -190,7 +106,7 @@ void Positives() {

void Negatives() {
// One arg. It is used for conversion. Ignore.
string S = StrCat(1);
std::string S = StrCat(1);

#define A_MACRO(x, y, z) StrCat(x, y, z)
S = A_MACRO(1, 2, StrCat("A", "B"));
Expand Down

0 comments on commit 9883558

Please sign in to comment.