| // RUN: %check_clang_tidy -std=c++17 %s readability-isolate-declaration %t |
| |
| template <typename T1, typename T2> |
| struct pair { |
| T1 first; |
| T2 second; |
| pair(T1 v1, T2 v2) : first(v1), second(v2) {} |
| |
| template <int N> |
| decltype(auto) get() const { |
| if constexpr (N == 0) |
| return first; |
| else if constexpr (N == 1) |
| return second; |
| } |
| }; |
| |
| void forbidden_transformations() { |
| if (int i = 42, j = i; i == j) |
| ; |
| switch (int i = 12, j = 14; i) |
| ; |
| |
| auto [i, j] = pair<int, int>(42, 42); |
| } |
| |
| struct SomeClass { |
| SomeClass() = default; |
| SomeClass(int value); |
| }; |
| |
| namespace std { |
| template <typename T> |
| class initializer_list {}; |
| |
| template <typename T> |
| class vector { |
| public: |
| vector() = default; |
| vector(initializer_list<T> init) {} |
| }; |
| |
| class string { |
| public: |
| string() = default; |
| string(const char *) {} |
| }; |
| |
| namespace string_literals { |
| string operator""s(const char *, decltype(sizeof(int))) { |
| return string(); |
| } |
| } // namespace string_literals |
| } // namespace std |
| |
| namespace Types { |
| typedef int MyType; |
| } // namespace Types |
| |
| int touch1, touch2; |
| |
| void modern() { |
| auto autoInt1 = 3, autoInt2 = 4; |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability |
| // CHECK-FIXES: auto autoInt1 = 3; |
| // CHECK-FIXES: {{^ }}auto autoInt2 = 4; |
| |
| decltype(int()) declnottouch = 4; |
| decltype(int()) declint1 = 5, declint2 = 3; |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability |
| // CHECK-FIXES: decltype(int()) declint1 = 5; |
| // CHECK-FIXES: {{^ }}decltype(int()) declint2 = 3; |
| |
| std::vector<int> vectorA = {1, 2}, vectorB = {1, 2, 3}, vectorC({1, 1, 1}); |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability |
| // CHECK-FIXES: std::vector<int> vectorA = {1, 2}; |
| // CHECK-FIXES: {{^ }}std::vector<int> vectorB = {1, 2, 3}; |
| // CHECK-FIXES: {{^ }}std::vector<int> vectorC({1, 1, 1}); |
| |
| using uType = int; |
| uType utype1, utype2; |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability |
| // CHECK-FIXES: uType utype1; |
| // CHECK-FIXES: {{^ }}uType utype2; |
| |
| Types::MyType mytype1, mytype2, mytype3 = 3; |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability |
| // CHECK-FIXES: Types::MyType mytype1; |
| // CHECK-FIXES: {{^ }}Types::MyType mytype2; |
| // CHECK-FIXES: {{^ }}Types::MyType mytype3 = 3; |
| |
| { |
| using namespace std::string_literals; |
| |
| std::vector<std::string> s{"foo"s, "bar"s}, t{"foo"s}, u, a({"hey", "you"}), bb = {"h", "a"}; |
| // CHECK-MESSAGES: [[@LINE-1]]:5: warning: multiple declarations in a single statement reduces readability |
| // CHECK-FIXES: std::vector<std::string> s{"foo"s, "bar"s}; |
| // CHECK-FIXES: {{^ }}std::vector<std::string> t{"foo"s}; |
| // CHECK-FIXES: {{^ }}std::vector<std::string> u; |
| // CHECK-FIXES: {{^ }}std::vector<std::string> a({"hey", "you"}); |
| // CHECK-FIXES: {{^ }}std::vector<std::string> bb = {"h", "a"}; |
| } |
| } |