1 // RUN: %check_clang_tidy -std=c++11-or-later %s portability-std-allocator-const %t -- -- -fno-delayed-template-parsing
2
3 namespace std {
4 typedef unsigned size_t;
5
6 template <class T>
7 class allocator {};
8 template <class T>
9 class hash {};
10 template <class T>
11 class equal_to {};
12 template <class T>
13 class less {};
14
15 template <class T, class A = std::allocator<T>>
16 class deque {};
17 template <class T, class A = std::allocator<T>>
18 class forward_list {};
19 template <class T, class A = std::allocator<T>>
20 class list {};
21 template <class T, class A = std::allocator<T>>
22 class vector {};
23
24 template <class K, class C = std::less<K>, class A = std::allocator<K>>
25 class multiset {};
26 template <class K, class C = std::less<K>, class A = std::allocator<K>>
27 class set {};
28 template <class K, class H = std::hash<K>, class Eq = std::equal_to<K>, class A = std::allocator<K>>
29 class unordered_multiset {};
30 template <class K, class H = std::hash<K>, class Eq = std::equal_to<K>, class A = std::allocator<K>>
31 class unordered_set {};
32
33 template <class T, class C = std::deque<T>>
34 class stack {};
35 } // namespace std
36
37 namespace absl {
38 template <class K, class H = std::hash<K>, class Eq = std::equal_to<K>, class A = std::allocator<K>>
39 class flat_hash_set {};
40 } // namespace absl
41
42 template <class T>
43 class allocator {};
44
simple(const std::vector<const char> & v,std::deque<const short> * d)45 void simple(const std::vector<const char> &v, std::deque<const short> *d) {
46 // CHECK-MESSAGES: [[#@LINE-1]]:24: warning: container using std::allocator<const T> is a deprecated libc++ extension; remove const for compatibility with other standard libraries
47 // CHECK-MESSAGES: [[#@LINE-2]]:52: warning: container
48 std::list<const long> l;
49 // CHECK-MESSAGES: [[#@LINE-1]]:8: warning: container
50
51 std::multiset<int *const> ms;
52 // CHECK-MESSAGES: [[#@LINE-1]]:8: warning: container
53 std::set<const std::hash<int>> s;
54 // CHECK-MESSAGES: [[#@LINE-1]]:8: warning: container
55 std::unordered_multiset<int *const> ums;
56 // CHECK-MESSAGES: [[#@LINE-1]]:8: warning: container
57 std::unordered_set<const int> us;
58 // CHECK-MESSAGES: [[#@LINE-1]]:8: warning: container
59
60 absl::flat_hash_set<const int> fhs;
61 // CHECK-MESSAGES: [[#@LINE-1]]:9: warning: container
62
63 using my_vector = std::vector<const int>;
64 // CHECK-MESSAGES: [[#@LINE-1]]:26: warning: container
65 my_vector v1;
66 using my_vector2 = my_vector;
67
68 std::vector<int> neg1;
69 std::vector<const int *> neg2; // not const T
70 std::vector<const int, allocator<const int>> neg3; // not use std::allocator<const T>
71 std::allocator<const int> a; // not caught, but rare
72 std::forward_list<const int> forward; // not caught, but rare
73 std::stack<const int> stack; // not caught, but rare
74 }
75
76 template <class T>
temp1()77 void temp1() {
78 std::vector<const T> v;
79 // CHECK-MESSAGES: [[#@LINE-1]]:8: warning: container
80
81 std::vector<T> neg1;
82 std::forward_list<const T> neg2;
83 }
use_temp1()84 void use_temp1() { temp1<int>(); }
85
86 template <class T>
temp2()87 void temp2() {
88 // Match std::vector<const dependent> for the uninstantiated temp2.
89 std::vector<const T> v;
90 // CHECK-MESSAGES: [[#@LINE-1]]:8: warning: container
91
92 std::vector<T> neg1;
93 std::forward_list<const T> neg2;
94 }
95