1 // RUN: %check_clang_tidy -std=c++17 %s readability-isolate-declaration %t
2 
3 template <typename T1, typename T2>
4 struct pair {
5   T1 first;
6   T2 second;
pairpair7   pair(T1 v1, T2 v2) : first(v1), second(v2) {}
8 
9   template <int N>
getpair10   decltype(auto) get() const {
11     if constexpr (N == 0)
12       return first;
13     else if constexpr (N == 1)
14       return second;
15   }
16 };
17 
forbidden_transformations()18 void forbidden_transformations() {
19   if (int i = 42, j = i; i == j)
20     ;
21   switch (int i = 12, j = 14; i)
22     ;
23 
24   auto [i, j] = pair<int, int>(42, 42);
25 }
26 
27 struct SomeClass {
28   SomeClass() = default;
29   SomeClass(int value);
30 };
31 
32 namespace std {
33 template <typename T>
34 class initializer_list {};
35 
36 template <typename T>
37 class vector {
38 public:
39   vector() = default;
vector(initializer_list<T> init)40   vector(initializer_list<T> init) {}
41 };
42 
43 class string {
44 public:
45   string() = default;
string(const char *)46   string(const char *) {}
47 };
48 
49 namespace string_literals {
operator ""s(const char *,decltype(sizeof (int)))50 string operator""s(const char *, decltype(sizeof(int))) {
51   return string();
52 }
53 } // namespace string_literals
54 } // namespace std
55 
56 namespace Types {
57 typedef int MyType;
58 } // namespace Types
59 
60 int touch1, touch2;
61 
modern()62 void modern() {
63   auto autoInt1 = 3, autoInt2 = 4;
64   // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability
65   // CHECK-FIXES: auto autoInt1 = 3;
66   // CHECK-FIXES: {{^  }}auto autoInt2 = 4;
67 
68   decltype(int()) declnottouch = 4;
69   decltype(int()) declint1 = 5, declint2 = 3;
70   // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability
71   // CHECK-FIXES: decltype(int()) declint1 = 5;
72   // CHECK-FIXES: {{^  }}decltype(int()) declint2 = 3;
73 
74   std::vector<int> vectorA = {1, 2}, vectorB = {1, 2, 3}, vectorC({1, 1, 1});
75   // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability
76   // CHECK-FIXES: std::vector<int> vectorA = {1, 2};
77   // CHECK-FIXES: {{^  }}std::vector<int> vectorB = {1, 2, 3};
78   // CHECK-FIXES: {{^  }}std::vector<int> vectorC({1, 1, 1});
79 
80   using uType = int;
81   uType utype1, utype2;
82   // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability
83   // CHECK-FIXES: uType utype1;
84   // CHECK-FIXES: {{^  }}uType utype2;
85 
86   Types::MyType mytype1, mytype2, mytype3 = 3;
87   // CHECK-MESSAGES: [[@LINE-1]]:3: warning: multiple declarations in a single statement reduces readability
88   // CHECK-FIXES: Types::MyType mytype1;
89   // CHECK-FIXES: {{^  }}Types::MyType mytype2;
90   // CHECK-FIXES: {{^  }}Types::MyType mytype3 = 3;
91 
92   {
93     using namespace std::string_literals;
94 
95     std::vector<std::string> s{"foo"s, "bar"s}, t{"foo"s}, u, a({"hey", "you"}), bb = {"h", "a"};
96     // CHECK-MESSAGES: [[@LINE-1]]:5: warning: multiple declarations in a single statement reduces readability
97     // CHECK-FIXES: std::vector<std::string> s{"foo"s, "bar"s};
98     // CHECK-FIXES: {{^    }}std::vector<std::string> t{"foo"s};
99     // CHECK-FIXES: {{^    }}std::vector<std::string> u;
100     // CHECK-FIXES: {{^    }}std::vector<std::string> a({"hey", "you"});
101     // CHECK-FIXES: {{^    }}std::vector<std::string> bb = {"h", "a"};
102   }
103 }
104