1 // RUN: %check_clang_tidy %s google-build-explicit-make-pair %t
2 
3 namespace std {
4 template <class T1, class T2>
5 struct pair {
pairstd::pair6   pair(T1 x, T2 y) {}
7 };
8 
9 template <class T1, class T2>
make_pair(T1 x,T2 y)10 pair<T1, T2> make_pair(T1 x, T2 y) {
11   return pair<T1, T2>(x, y);
12 }
13 }
14 
15 template <typename T>
templ(T a,T b)16 void templ(T a, T b) {
17   std::make_pair<T, unsigned>(a, b);
18   std::make_pair<int, int>(1, 2);
19 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: for C++11-compatibility, omit template arguments from make_pair
20 // CHECK-FIXES: std::make_pair(1, 2)
21 }
22 
23 template <typename T>
24 int t();
25 
test(int i)26 void test(int i) {
27   std::make_pair<int, int>(i, i);
28 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: for C++11-compatibility, omit template arguments from make_pair
29 // CHECK-FIXES: std::make_pair(i, i)
30 
31   std::make_pair<unsigned, int>(i, i);
32 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: for C++11-compatibility, use pair directly
33 // CHECK-FIXES: std::pair<unsigned, int>(i, i)
34 
35   std::make_pair<int, unsigned>(i, i);
36 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: for C++11-compatibility, use pair directly
37 // CHECK-FIXES: std::pair<int, unsigned>(i, i)
38 
39 #define M std::make_pair<int, unsigned>(i, i);
40 M
41 // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: for C++11-compatibility, use pair directly
42 // Can't fix in macros.
43 // CHECK-FIXES: #define M std::make_pair<int, unsigned>(i, i);
44 // CHECK-FIXES-NEXT: M
45 
46   templ(i, i);
47   templ(1U, 2U);
48 
49   std::make_pair(i, 1); // no-warning
50   std::make_pair(t<int>, 1);
51 }
52