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