189a1d03eSRichard // RUN: %check_clang_tidy %s modernize-use-emplace %t -- \
289a1d03eSRichard // RUN: -config="{CheckOptions: \
3e8a3ddafSNathan James // RUN: {modernize-use-emplace.ContainersWithPushBack: \
4e8a3ddafSNathan James // RUN: '::std::vector; ::std::list; ::std::deque; llvm::LikeASmallVector', \
5e8a3ddafSNathan James // RUN: modernize-use-emplace.TupleTypes: \
6e8a3ddafSNathan James // RUN: '::std::pair; std::tuple; ::test::Single', \
7e8a3ddafSNathan James // RUN: modernize-use-emplace.TupleMakeFunctions: \
8e8a3ddafSNathan James // RUN: '::std::make_pair; ::std::make_tuple; ::test::MakeSingle'}}"
989a1d03eSRichard
1089a1d03eSRichard namespace std {
11*482c41e9SMital Ashok template <typename E>
1289a1d03eSRichard class initializer_list {
1389a1d03eSRichard public:
14*482c41e9SMital Ashok const E *a, *b;
initializer_list()1589a1d03eSRichard initializer_list() noexcept {}
1689a1d03eSRichard };
1789a1d03eSRichard
1889a1d03eSRichard template <typename T1, typename T2>
1989a1d03eSRichard class pair {
2089a1d03eSRichard public:
2189a1d03eSRichard pair() = default;
2289a1d03eSRichard pair(const pair &) = default;
2389a1d03eSRichard pair(pair &&) = default;
2489a1d03eSRichard
pair(const T1 &,const T2 &)2589a1d03eSRichard pair(const T1 &, const T2 &) {}
pair(T1 &&,T2 &&)2689a1d03eSRichard pair(T1 &&, T2 &&) {}
2789a1d03eSRichard
2889a1d03eSRichard template <typename U1, typename U2>
pair(const pair<U1,U2> &)2989a1d03eSRichard pair(const pair<U1, U2> &){};
3089a1d03eSRichard template <typename U1, typename U2>
pair(pair<U1,U2> &&)3189a1d03eSRichard pair(pair<U1, U2> &&){};
3289a1d03eSRichard };
3389a1d03eSRichard
3489a1d03eSRichard template <typename T>
3589a1d03eSRichard class vector {
3689a1d03eSRichard public:
3789a1d03eSRichard using value_type = T;
3889a1d03eSRichard
3989a1d03eSRichard class iterator {};
4089a1d03eSRichard class const_iterator {};
begin()4189a1d03eSRichard const_iterator begin() { return const_iterator{}; }
4289a1d03eSRichard
4389a1d03eSRichard vector() = default;
vector(initializer_list<T>)4489a1d03eSRichard vector(initializer_list<T>) {}
4589a1d03eSRichard
push_back(const T &)4689a1d03eSRichard void push_back(const T &) {}
push_back(T &&)4789a1d03eSRichard void push_back(T &&) {}
4889a1d03eSRichard
4989a1d03eSRichard template <typename... Args>
emplace_back(Args &&...args)5089a1d03eSRichard void emplace_back(Args &&... args){};
5189a1d03eSRichard template <typename... Args>
emplace(const_iterator pos,Args &&...args)5289a1d03eSRichard iterator emplace(const_iterator pos, Args &&...args){};
5389a1d03eSRichard ~vector();
5489a1d03eSRichard };
5589a1d03eSRichard
5689a1d03eSRichard template <typename T>
5789a1d03eSRichard class list {
5889a1d03eSRichard public:
5989a1d03eSRichard using value_type = T;
6089a1d03eSRichard
6189a1d03eSRichard class iterator {};
6289a1d03eSRichard class const_iterator {};
begin()6389a1d03eSRichard const_iterator begin() { return const_iterator{}; }
6489a1d03eSRichard
push_front(const T &)65b8655f7fSJoey Watts void push_front(const T &) {}
push_front(T &&)66b8655f7fSJoey Watts void push_front(T &&) {}
67b8655f7fSJoey Watts
push_back(const T &)6889a1d03eSRichard void push_back(const T &) {}
push_back(T &&)6989a1d03eSRichard void push_back(T &&) {}
7089a1d03eSRichard
7189a1d03eSRichard template <typename... Args>
emplace(const_iterator pos,Args &&...args)7289a1d03eSRichard iterator emplace(const_iterator pos, Args &&...args){};
7389a1d03eSRichard template <typename... Args>
emplace_back(Args &&...args)7489a1d03eSRichard void emplace_back(Args &&... args){};
7589a1d03eSRichard template <typename... Args>
emplace_front(Args &&...args)7689a1d03eSRichard void emplace_front(Args &&...args){};
7789a1d03eSRichard ~list();
7889a1d03eSRichard };
7989a1d03eSRichard
8089a1d03eSRichard template <typename T>
8189a1d03eSRichard class deque {
8289a1d03eSRichard public:
8389a1d03eSRichard using value_type = T;
8489a1d03eSRichard
8589a1d03eSRichard class iterator {};
8689a1d03eSRichard class const_iterator {};
begin()8789a1d03eSRichard const_iterator begin() { return const_iterator{}; }
8889a1d03eSRichard
push_back(const T &)8989a1d03eSRichard void push_back(const T &) {}
push_back(T &&)9089a1d03eSRichard void push_back(T &&) {}
9189a1d03eSRichard
push_front(const T &)92b8655f7fSJoey Watts void push_front(const T &) {}
push_front(T &&)93b8655f7fSJoey Watts void push_front(T &&) {}
94b8655f7fSJoey Watts
9589a1d03eSRichard template <typename... Args>
emplace(const_iterator pos,Args &&...args)9689a1d03eSRichard iterator emplace(const_iterator pos, Args &&...args){};
9789a1d03eSRichard template <typename... Args>
emplace_back(Args &&...args)9889a1d03eSRichard void emplace_back(Args &&... args){};
9989a1d03eSRichard template <typename... Args>
emplace_front(Args &&...args)10089a1d03eSRichard void emplace_front(Args &&...args){};
10189a1d03eSRichard ~deque();
10289a1d03eSRichard };
10389a1d03eSRichard
10489a1d03eSRichard template <typename T>
10589a1d03eSRichard class forward_list {
10689a1d03eSRichard public:
10789a1d03eSRichard using value_type = T;
10889a1d03eSRichard
10989a1d03eSRichard class iterator {};
11089a1d03eSRichard class const_iterator {};
begin()11189a1d03eSRichard const_iterator begin() { return const_iterator{}; }
11289a1d03eSRichard
push_front(const T &)113b8655f7fSJoey Watts void push_front(const T &) {}
push_front(T &&)114b8655f7fSJoey Watts void push_front(T &&) {}
115b8655f7fSJoey Watts
11689a1d03eSRichard template <typename... Args>
emplace_front(Args &&...args)11789a1d03eSRichard void emplace_front(Args &&...args){};
11889a1d03eSRichard template <typename... Args>
emplace_after(const_iterator pos,Args &&...args)11989a1d03eSRichard iterator emplace_after(const_iterator pos, Args &&...args){};
12089a1d03eSRichard };
12189a1d03eSRichard
12289a1d03eSRichard template <typename T>
12389a1d03eSRichard class set {
12489a1d03eSRichard public:
12589a1d03eSRichard using value_type = T;
12689a1d03eSRichard
12789a1d03eSRichard class iterator {};
12889a1d03eSRichard class const_iterator {};
begin()12989a1d03eSRichard const_iterator begin() { return const_iterator{}; }
13089a1d03eSRichard
13189a1d03eSRichard template <typename... Args>
emplace(Args &&...args)13289a1d03eSRichard void emplace(Args &&...args){};
13389a1d03eSRichard template <typename... Args>
emplace_hint(const_iterator pos,Args &&...args)13489a1d03eSRichard iterator emplace_hint(const_iterator pos, Args &&...args){};
13589a1d03eSRichard };
13689a1d03eSRichard
13789a1d03eSRichard template <typename Key, typename T>
13889a1d03eSRichard class map {
13989a1d03eSRichard public:
14089a1d03eSRichard using value_type = std::pair<Key, T>;
14189a1d03eSRichard
14289a1d03eSRichard class iterator {};
14389a1d03eSRichard class const_iterator {};
begin()14489a1d03eSRichard const_iterator begin() { return const_iterator{}; }
14589a1d03eSRichard
14689a1d03eSRichard template <typename... Args>
emplace(Args &&...args)14789a1d03eSRichard void emplace(Args &&...args){};
14889a1d03eSRichard template <typename... Args>
emplace_hint(const_iterator pos,Args &&...args)14989a1d03eSRichard iterator emplace_hint(const_iterator pos, Args &&...args){};
15089a1d03eSRichard };
15189a1d03eSRichard
15289a1d03eSRichard template <typename T>
15389a1d03eSRichard class multiset {
15489a1d03eSRichard public:
15589a1d03eSRichard using value_type = T;
15689a1d03eSRichard
15789a1d03eSRichard class iterator {};
15889a1d03eSRichard class const_iterator {};
begin()15989a1d03eSRichard const_iterator begin() { return const_iterator{}; }
16089a1d03eSRichard
16189a1d03eSRichard template <typename... Args>
emplace(Args &&...args)16289a1d03eSRichard void emplace(Args &&...args){};
16389a1d03eSRichard template <typename... Args>
emplace_hint(const_iterator pos,Args &&...args)16489a1d03eSRichard iterator emplace_hint(const_iterator pos, Args &&...args){};
16589a1d03eSRichard };
16689a1d03eSRichard
16789a1d03eSRichard template <typename Key, typename T>
16889a1d03eSRichard class multimap {
16989a1d03eSRichard public:
17089a1d03eSRichard using value_type = std::pair<Key, T>;
17189a1d03eSRichard
17289a1d03eSRichard class iterator {};
17389a1d03eSRichard class const_iterator {};
begin()17489a1d03eSRichard const_iterator begin() { return const_iterator{}; }
17589a1d03eSRichard
17689a1d03eSRichard template <typename... Args>
emplace(Args &&...args)17789a1d03eSRichard void emplace(Args &&...args){};
17889a1d03eSRichard template <typename... Args>
emplace_hint(const_iterator pos,Args &&...args)17989a1d03eSRichard iterator emplace_hint(const_iterator pos, Args &&...args){};
18089a1d03eSRichard };
18189a1d03eSRichard
18289a1d03eSRichard template <typename T>
18389a1d03eSRichard class unordered_set {
18489a1d03eSRichard public:
18589a1d03eSRichard using value_type = T;
18689a1d03eSRichard
18789a1d03eSRichard class iterator {};
18889a1d03eSRichard class const_iterator {};
begin()18989a1d03eSRichard const_iterator begin() { return const_iterator{}; }
19089a1d03eSRichard
19189a1d03eSRichard template <typename... Args>
emplace(Args &&...args)19289a1d03eSRichard void emplace(Args &&...args){};
19389a1d03eSRichard template <typename... Args>
emplace_hint(const_iterator pos,Args &&...args)19489a1d03eSRichard iterator emplace_hint(const_iterator pos, Args &&...args){};
19589a1d03eSRichard };
19689a1d03eSRichard
19789a1d03eSRichard template <typename Key, typename T>
19889a1d03eSRichard class unordered_map {
19989a1d03eSRichard public:
20089a1d03eSRichard using value_type = std::pair<Key, T>;
20189a1d03eSRichard
20289a1d03eSRichard class iterator {};
20389a1d03eSRichard class const_iterator {};
begin()20489a1d03eSRichard const_iterator begin() { return const_iterator{}; }
20589a1d03eSRichard
20689a1d03eSRichard template <typename... Args>
emplace(Args &&...args)20789a1d03eSRichard void emplace(Args &&...args){};
20889a1d03eSRichard template <typename... Args>
emplace_hint(const_iterator pos,Args &&...args)20989a1d03eSRichard iterator emplace_hint(const_iterator pos, Args &&...args){};
21089a1d03eSRichard };
21189a1d03eSRichard
21289a1d03eSRichard template <typename T>
21389a1d03eSRichard class unordered_multiset {
21489a1d03eSRichard public:
21589a1d03eSRichard using value_type = T;
21689a1d03eSRichard
21789a1d03eSRichard class iterator {};
21889a1d03eSRichard class const_iterator {};
begin()21989a1d03eSRichard const_iterator begin() { return const_iterator{}; }
22089a1d03eSRichard
22189a1d03eSRichard template <typename... Args>
emplace(Args &&...args)22289a1d03eSRichard void emplace(Args &&...args){};
22389a1d03eSRichard template <typename... Args>
emplace_hint(const_iterator pos,Args &&...args)22489a1d03eSRichard iterator emplace_hint(const_iterator pos, Args &&...args){};
22589a1d03eSRichard };
22689a1d03eSRichard
22789a1d03eSRichard template <typename Key, typename T>
22889a1d03eSRichard class unordered_multimap {
22989a1d03eSRichard public:
23089a1d03eSRichard using value_type = std::pair<Key, T>;
23189a1d03eSRichard
23289a1d03eSRichard class iterator {};
23389a1d03eSRichard class const_iterator {};
begin()23489a1d03eSRichard const_iterator begin() { return const_iterator{}; }
23589a1d03eSRichard
23689a1d03eSRichard template <typename... Args>
emplace(Args &&...args)23789a1d03eSRichard void emplace(Args &&...args){};
23889a1d03eSRichard template <typename... Args>
emplace_hint(const_iterator pos,Args &&...args)23989a1d03eSRichard iterator emplace_hint(const_iterator pos, Args &&...args){};
24089a1d03eSRichard };
24189a1d03eSRichard
24289a1d03eSRichard template <typename T>
24389a1d03eSRichard class stack {
24489a1d03eSRichard public:
24589a1d03eSRichard using value_type = T;
24689a1d03eSRichard
push(const T &)247b8655f7fSJoey Watts void push(const T &) {}
push(T &&)248b8655f7fSJoey Watts void push(T &&) {}
249b8655f7fSJoey Watts
25089a1d03eSRichard template <typename... Args>
emplace(Args &&...args)25189a1d03eSRichard void emplace(Args &&...args){};
25289a1d03eSRichard };
25389a1d03eSRichard
25489a1d03eSRichard template <typename T>
25589a1d03eSRichard class queue {
25689a1d03eSRichard public:
25789a1d03eSRichard using value_type = T;
25889a1d03eSRichard
push(const T &)259b8655f7fSJoey Watts void push(const T &) {}
push(T &&)260b8655f7fSJoey Watts void push(T &&) {}
261b8655f7fSJoey Watts
26289a1d03eSRichard template <typename... Args>
emplace(Args &&...args)26389a1d03eSRichard void emplace(Args &&...args){};
26489a1d03eSRichard };
26589a1d03eSRichard
26689a1d03eSRichard template <typename T>
26789a1d03eSRichard class priority_queue {
26889a1d03eSRichard public:
26989a1d03eSRichard using value_type = T;
27089a1d03eSRichard
push(const T &)271b8655f7fSJoey Watts void push(const T &) {}
push(T &&)272b8655f7fSJoey Watts void push(T &&) {}
273b8655f7fSJoey Watts
27489a1d03eSRichard template <typename... Args>
emplace(Args &&...args)27589a1d03eSRichard void emplace(Args &&...args){};
27689a1d03eSRichard };
27789a1d03eSRichard
27889a1d03eSRichard template <typename T>
27989a1d03eSRichard struct remove_reference { using type = T; };
28089a1d03eSRichard template <typename T>
28189a1d03eSRichard struct remove_reference<T &> { using type = T; };
28289a1d03eSRichard template <typename T>
28389a1d03eSRichard struct remove_reference<T &&> { using type = T; };
28489a1d03eSRichard
28589a1d03eSRichard template <typename T1, typename T2>
28689a1d03eSRichard pair<typename remove_reference<T1>::type, typename remove_reference<T2>::type>
make_pair(T1 &&,T2 &&)28789a1d03eSRichard make_pair(T1 &&, T2 &&) {
28889a1d03eSRichard return {};
28989a1d03eSRichard };
29089a1d03eSRichard
29189a1d03eSRichard template <typename... Ts>
29289a1d03eSRichard class tuple {
29389a1d03eSRichard public:
29489a1d03eSRichard tuple() = default;
29589a1d03eSRichard tuple(const tuple &) = default;
29689a1d03eSRichard tuple(tuple &&) = default;
29789a1d03eSRichard
tuple(const Ts &...)29889a1d03eSRichard tuple(const Ts &...) {}
tuple(Ts &&...)29989a1d03eSRichard tuple(Ts &&...) {}
30089a1d03eSRichard
30189a1d03eSRichard template <typename... Us>
tuple(const tuple<Us...> &)30289a1d03eSRichard tuple(const tuple<Us...> &){};
30389a1d03eSRichard template <typename... Us>
tuple(tuple<Us...> &&)30489a1d03eSRichard tuple(tuple<Us...> &&) {}
30589a1d03eSRichard
30689a1d03eSRichard template <typename U1, typename U2>
tuple(const pair<U1,U2> &)30789a1d03eSRichard tuple(const pair<U1, U2> &) {
30889a1d03eSRichard static_assert(sizeof...(Ts) == 2, "Wrong tuple size");
30989a1d03eSRichard };
31089a1d03eSRichard template <typename U1, typename U2>
tuple(pair<U1,U2> &&)31189a1d03eSRichard tuple(pair<U1, U2> &&) {
31289a1d03eSRichard static_assert(sizeof...(Ts) == 2, "Wrong tuple size");
31389a1d03eSRichard };
31489a1d03eSRichard };
31589a1d03eSRichard
31689a1d03eSRichard template <typename... Ts>
make_tuple(Ts &&...)31789a1d03eSRichard tuple<typename remove_reference<Ts>::type...> make_tuple(Ts &&...) {
31889a1d03eSRichard return {};
31989a1d03eSRichard }
32089a1d03eSRichard
32189a1d03eSRichard template <typename T>
32289a1d03eSRichard class unique_ptr {
32389a1d03eSRichard public:
unique_ptr(T *)32489a1d03eSRichard explicit unique_ptr(T *) {}
32589a1d03eSRichard ~unique_ptr();
32689a1d03eSRichard };
32789a1d03eSRichard } // namespace std
32889a1d03eSRichard
32989a1d03eSRichard namespace llvm {
33089a1d03eSRichard template <typename T>
33189a1d03eSRichard class LikeASmallVector {
33289a1d03eSRichard public:
push_back(const T &)33389a1d03eSRichard void push_back(const T &) {}
push_back(T &&)33489a1d03eSRichard void push_back(T &&) {}
33589a1d03eSRichard
33689a1d03eSRichard template <typename... Args>
emplace_back(Args &&...args)33789a1d03eSRichard void emplace_back(Args &&... args){};
33889a1d03eSRichard };
33989a1d03eSRichard
34089a1d03eSRichard } // namespace llvm
34189a1d03eSRichard
testInts()34289a1d03eSRichard void testInts() {
34389a1d03eSRichard std::vector<int> v;
34489a1d03eSRichard v.push_back(42);
34589a1d03eSRichard v.push_back(int(42));
34689a1d03eSRichard v.push_back(int{42});
34789a1d03eSRichard v.push_back(42.0);
34889a1d03eSRichard int z;
34989a1d03eSRichard v.push_back(z);
35089a1d03eSRichard }
35189a1d03eSRichard
35289a1d03eSRichard struct Something {
SomethingSomething35389a1d03eSRichard Something(int a, int b = 41) {}
SomethingSomething35489a1d03eSRichard Something() {}
35589a1d03eSRichard void push_back(Something);
getIntSomething35689a1d03eSRichard int getInt() { return 42; }
35789a1d03eSRichard };
35889a1d03eSRichard
35989a1d03eSRichard struct Convertable {
operator SomethingConvertable36089a1d03eSRichard operator Something() { return Something{}; }
36189a1d03eSRichard };
36289a1d03eSRichard
36389a1d03eSRichard struct Zoz {
ZozZoz36489a1d03eSRichard Zoz(Something, int = 42) {}
36589a1d03eSRichard };
36689a1d03eSRichard
getZoz(Something s)36789a1d03eSRichard Zoz getZoz(Something s) { return Zoz(s); }
36889a1d03eSRichard
test_Something()36989a1d03eSRichard void test_Something() {
37089a1d03eSRichard std::vector<Something> v;
37189a1d03eSRichard
37289a1d03eSRichard v.push_back(Something(1, 2));
37389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back instead of push_back [modernize-use-emplace]
37489a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, 2);
37589a1d03eSRichard
37689a1d03eSRichard v.push_back(Something{1, 2});
37789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
37889a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, 2);
37989a1d03eSRichard
38089a1d03eSRichard v.push_back(Something());
38189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
38289a1d03eSRichard // CHECK-FIXES: v.emplace_back();
38389a1d03eSRichard
38489a1d03eSRichard v.push_back(Something{});
38589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
38689a1d03eSRichard // CHECK-FIXES: v.emplace_back();
38789a1d03eSRichard
38889a1d03eSRichard Something Different;
38989a1d03eSRichard v.push_back(Something(Different.getInt(), 42));
39089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
39189a1d03eSRichard // CHECK-FIXES: v.emplace_back(Different.getInt(), 42);
39289a1d03eSRichard
39389a1d03eSRichard v.push_back(Different.getInt());
39489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
39589a1d03eSRichard // CHECK-FIXES: v.emplace_back(Different.getInt());
39689a1d03eSRichard
39789a1d03eSRichard v.push_back(42);
39889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
39989a1d03eSRichard // CHECK-FIXES: v.emplace_back(42);
40089a1d03eSRichard
40189a1d03eSRichard Something temporary(42, 42);
40289a1d03eSRichard temporary.push_back(temporary);
40389a1d03eSRichard v.push_back(temporary);
40489a1d03eSRichard
40589a1d03eSRichard v.push_back(Convertable());
40689a1d03eSRichard v.push_back(Convertable{});
40789a1d03eSRichard Convertable s;
40889a1d03eSRichard v.push_back(s);
40989a1d03eSRichard }
41089a1d03eSRichard
41189a1d03eSRichard template <typename ElemType>
dependOnElem()41289a1d03eSRichard void dependOnElem() {
41389a1d03eSRichard std::vector<ElemType> v;
41489a1d03eSRichard v.push_back(ElemType(42));
41589a1d03eSRichard }
41689a1d03eSRichard
41789a1d03eSRichard template <typename ContainerType>
dependOnContainer()41889a1d03eSRichard void dependOnContainer() {
41989a1d03eSRichard ContainerType v;
42089a1d03eSRichard v.push_back(Something(42));
42189a1d03eSRichard }
42289a1d03eSRichard
callDependent()42389a1d03eSRichard void callDependent() {
42489a1d03eSRichard dependOnElem<Something>();
42589a1d03eSRichard dependOnContainer<std::vector<Something>>();
42689a1d03eSRichard }
42789a1d03eSRichard
test2()42889a1d03eSRichard void test2() {
42989a1d03eSRichard std::vector<Zoz> v;
43089a1d03eSRichard v.push_back(Zoz(Something(21, 37)));
43189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
43289a1d03eSRichard // CHECK-FIXES: v.emplace_back(Something(21, 37));
43389a1d03eSRichard
43489a1d03eSRichard v.push_back(Zoz(Something(21, 37), 42));
43589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
43689a1d03eSRichard // CHECK-FIXES: v.emplace_back(Something(21, 37), 42);
43789a1d03eSRichard
43889a1d03eSRichard v.push_back(getZoz(Something(1, 2)));
43989a1d03eSRichard }
44089a1d03eSRichard
44189a1d03eSRichard struct GetPair {
44289a1d03eSRichard std::pair<int, long> getPair();
44389a1d03eSRichard };
testPair()44489a1d03eSRichard void testPair() {
44589a1d03eSRichard std::vector<std::pair<int, int>> v;
44689a1d03eSRichard v.push_back(std::pair<int, int>(1, 2));
44789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
44889a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, 2);
44989a1d03eSRichard
45089a1d03eSRichard GetPair g;
45189a1d03eSRichard v.push_back(g.getPair());
45289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
45389a1d03eSRichard // CHECK-FIXES: v.emplace_back(g.getPair());
45489a1d03eSRichard
45589a1d03eSRichard std::vector<std::pair<Something, Zoz>> v2;
45689a1d03eSRichard v2.push_back(std::pair<Something, Zoz>(Something(42, 42), Zoz(Something(21, 37))));
45789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
45889a1d03eSRichard // CHECK-FIXES: v2.emplace_back(Something(42, 42), Zoz(Something(21, 37)));
45989a1d03eSRichard }
46089a1d03eSRichard
testTuple()46189a1d03eSRichard void testTuple() {
46289a1d03eSRichard std::vector<std::tuple<bool, char, int>> v;
46389a1d03eSRichard v.push_back(std::tuple<bool, char, int>(false, 'x', 1));
46489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
46589a1d03eSRichard // CHECK-FIXES: v.emplace_back(false, 'x', 1);
46689a1d03eSRichard
46789a1d03eSRichard v.push_back(std::tuple<bool, char, int>{false, 'y', 2});
46889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
46989a1d03eSRichard // CHECK-FIXES: v.emplace_back(false, 'y', 2);
47089a1d03eSRichard
47189a1d03eSRichard v.push_back({true, 'z', 3});
47289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
47389a1d03eSRichard // CHECK-FIXES: v.emplace_back(true, 'z', 3);
47489a1d03eSRichard
47589a1d03eSRichard std::vector<std::tuple<int, bool>> x;
47689a1d03eSRichard x.push_back(std::make_pair(1, false));
47789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
47889a1d03eSRichard // CHECK-FIXES: x.emplace_back(1, false);
47989a1d03eSRichard
48089a1d03eSRichard x.push_back(std::make_pair(2LL, 1));
48189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
48289a1d03eSRichard // CHECK-FIXES: x.emplace_back(2LL, 1);
48389a1d03eSRichard }
48489a1d03eSRichard
48589a1d03eSRichard struct Base {
48689a1d03eSRichard Base(int, int *, int = 42);
48789a1d03eSRichard };
48889a1d03eSRichard
48989a1d03eSRichard struct Derived : Base {
DerivedDerived49089a1d03eSRichard Derived(int *, Something) : Base(42, nullptr) {}
49189a1d03eSRichard };
49289a1d03eSRichard
testDerived()49389a1d03eSRichard void testDerived() {
49489a1d03eSRichard std::vector<Base> v;
49589a1d03eSRichard v.push_back(Derived(nullptr, Something{}));
49689a1d03eSRichard }
49789a1d03eSRichard
testNewExpr()49889a1d03eSRichard void testNewExpr() {
49989a1d03eSRichard std::vector<Derived> v;
50089a1d03eSRichard v.push_back(Derived(new int, Something{}));
50189a1d03eSRichard }
50289a1d03eSRichard
testSpaces()50389a1d03eSRichard void testSpaces() {
50489a1d03eSRichard std::vector<Something> v;
50589a1d03eSRichard
50689a1d03eSRichard // clang-format off
50789a1d03eSRichard
50889a1d03eSRichard v.push_back(Something(1, //arg1
50989a1d03eSRichard 2 // arg2
51089a1d03eSRichard ) // Something
51189a1d03eSRichard );
51289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-4]]:5: warning: use emplace_back
51389a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, //arg1
51489a1d03eSRichard // CHECK-FIXES: 2 // arg2
51589a1d03eSRichard // CHECK-FIXES: // Something
51689a1d03eSRichard // CHECK-FIXES: );
51789a1d03eSRichard
51889a1d03eSRichard v.push_back( Something (1, 2) );
51989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
52089a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, 2 );
52189a1d03eSRichard
52289a1d03eSRichard v.push_back( Something {1, 2} );
52389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
52489a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, 2 );
52589a1d03eSRichard
52689a1d03eSRichard v.push_back( Something {} );
52789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
52889a1d03eSRichard // CHECK-FIXES: v.emplace_back( );
52989a1d03eSRichard
53089a1d03eSRichard v.push_back(
53189a1d03eSRichard Something(1, 2) );
53289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use emplace_back
53389a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, 2 );
53489a1d03eSRichard
53589a1d03eSRichard std::vector<Base> v2;
53689a1d03eSRichard v2.push_back(
53789a1d03eSRichard Base(42, nullptr));
53889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:6: warning: use emplace_back
53989a1d03eSRichard // CHECK-FIXES: v2.emplace_back(42, nullptr);
54089a1d03eSRichard
54189a1d03eSRichard // clang-format on
54289a1d03eSRichard }
54389a1d03eSRichard
testPointers()54489a1d03eSRichard void testPointers() {
54589a1d03eSRichard std::vector<int *> v;
54689a1d03eSRichard v.push_back(new int(5));
54789a1d03eSRichard
54889a1d03eSRichard std::vector<std::unique_ptr<int>> v2;
54989a1d03eSRichard v2.push_back(std::unique_ptr<int>(new int(42)));
55089a1d03eSRichard // This call can't be replaced with emplace_back.
55189a1d03eSRichard // If emplacement will fail (not enough memory to add to vector)
55289a1d03eSRichard // we will have leak of int because unique_ptr won't be constructed
55389a1d03eSRichard // (and destructed) as in push_back case.
55489a1d03eSRichard
55589a1d03eSRichard auto *ptr = new int;
55689a1d03eSRichard v2.push_back(std::unique_ptr<int>(ptr));
55789a1d03eSRichard // Same here
55889a1d03eSRichard }
55989a1d03eSRichard
testMakePair()56089a1d03eSRichard void testMakePair() {
56189a1d03eSRichard std::vector<std::pair<int, int>> v;
56289a1d03eSRichard v.push_back(std::make_pair(1, 2));
56389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
56489a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, 2);
56589a1d03eSRichard
56689a1d03eSRichard v.push_back(std::make_pair(42LL, 13));
56789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
56889a1d03eSRichard // CHECK-FIXES: v.emplace_back(42LL, 13);
56989a1d03eSRichard
57089a1d03eSRichard v.push_back(std::make_pair<char, char>(0, 3));
57189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
57289a1d03eSRichard // CHECK-FIXES: v.emplace_back(std::make_pair<char, char>(0, 3));
57389a1d03eSRichard //
57489a1d03eSRichard // Even though the call above could be turned into v.emplace_back(0, 3),
57589a1d03eSRichard // we don't eliminate the make_pair call here, because of the explicit
57689a1d03eSRichard // template parameters provided. make_pair's arguments can be convertible
57789a1d03eSRichard // to its explicitly provided template parameter, but not to the pair's
57889a1d03eSRichard // element type. The examples below illustrate the problem.
57989a1d03eSRichard struct D {
58089a1d03eSRichard D(...) {}
58189a1d03eSRichard operator char() const { return 0; }
58289a1d03eSRichard };
58389a1d03eSRichard v.push_back(std::make_pair<D, int>(Something(), 2));
58489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
58589a1d03eSRichard // CHECK-FIXES: v.emplace_back(std::make_pair<D, int>(Something(), 2));
58689a1d03eSRichard
58789a1d03eSRichard struct X {
58889a1d03eSRichard X(std::pair<int, int>) {}
58989a1d03eSRichard };
59089a1d03eSRichard std::vector<X> x;
59189a1d03eSRichard x.push_back(std::make_pair(1, 2));
59289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
59389a1d03eSRichard // CHECK-FIXES: x.emplace_back(std::make_pair(1, 2));
59489a1d03eSRichard // make_pair cannot be removed here, as X is not constructible with two ints.
59589a1d03eSRichard
59689a1d03eSRichard struct Y {
59789a1d03eSRichard Y(std::pair<int, int> &&) {}
59889a1d03eSRichard };
59989a1d03eSRichard std::vector<Y> y;
60089a1d03eSRichard y.push_back(std::make_pair(2, 3));
60189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
60289a1d03eSRichard // CHECK-FIXES: y.emplace_back(std::make_pair(2, 3));
60389a1d03eSRichard // make_pair cannot be removed here, as Y is not constructible with two ints.
60489a1d03eSRichard }
60589a1d03eSRichard
testMakeTuple()60689a1d03eSRichard void testMakeTuple() {
60789a1d03eSRichard std::vector<std::tuple<int, bool, char>> v;
60889a1d03eSRichard v.push_back(std::make_tuple(1, true, 'v'));
60989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
61089a1d03eSRichard // CHECK-FIXES: v.emplace_back(1, true, 'v');
61189a1d03eSRichard
61289a1d03eSRichard v.push_back(std::make_tuple(2ULL, 1, 0));
61389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
61489a1d03eSRichard // CHECK-FIXES: v.emplace_back(2ULL, 1, 0);
61589a1d03eSRichard
61689a1d03eSRichard v.push_back(std::make_tuple<long long, int, int>(3LL, 1, 0));
61789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
61889a1d03eSRichard // CHECK-FIXES: v.emplace_back(std::make_tuple<long long, int, int>(3LL, 1, 0));
61989a1d03eSRichard // make_tuple is not removed when there are explicit template
62089a1d03eSRichard // arguments provided.
62189a1d03eSRichard }
62289a1d03eSRichard
62389a1d03eSRichard namespace test {
62489a1d03eSRichard template <typename T>
62589a1d03eSRichard struct Single {
62689a1d03eSRichard Single() = default;
62789a1d03eSRichard Single(const Single &) = default;
62889a1d03eSRichard Single(Single &&) = default;
62989a1d03eSRichard
Singletest::Single63089a1d03eSRichard Single(const T &) {}
Singletest::Single63189a1d03eSRichard Single(T &&) {}
63289a1d03eSRichard
63389a1d03eSRichard template <typename U>
Singletest::Single63489a1d03eSRichard Single(const Single<U> &) {}
63589a1d03eSRichard template <typename U>
Singletest::Single63689a1d03eSRichard Single(Single<U> &&) {}
63789a1d03eSRichard
63889a1d03eSRichard template <typename U>
Singletest::Single63989a1d03eSRichard Single(const std::tuple<U> &) {}
64089a1d03eSRichard template <typename U>
Singletest::Single64189a1d03eSRichard Single(std::tuple<U> &&) {}
64289a1d03eSRichard };
64389a1d03eSRichard
64489a1d03eSRichard template <typename T>
MakeSingle(T &&)64589a1d03eSRichard Single<typename std::remove_reference<T>::type> MakeSingle(T &&) {
64689a1d03eSRichard return {};
64789a1d03eSRichard }
64889a1d03eSRichard } // namespace test
64989a1d03eSRichard
testOtherTuples()65089a1d03eSRichard void testOtherTuples() {
65189a1d03eSRichard std::vector<test::Single<int>> v;
65289a1d03eSRichard v.push_back(test::Single<int>(1));
65389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
65489a1d03eSRichard // CHECK-FIXES: v.emplace_back(1);
65589a1d03eSRichard
65689a1d03eSRichard v.push_back({2});
65789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
65889a1d03eSRichard // CHECK-FIXES: v.emplace_back(2);
65989a1d03eSRichard
66089a1d03eSRichard v.push_back(test::MakeSingle(3));
66189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
66289a1d03eSRichard // CHECK-FIXES: v.emplace_back(3);
66389a1d03eSRichard
66489a1d03eSRichard v.push_back(test::MakeSingle<long long>(4));
66589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
66689a1d03eSRichard // CHECK-FIXES: v.emplace_back(test::MakeSingle<long long>(4));
66789a1d03eSRichard // We don't remove make functions with explicit template parameters.
66889a1d03eSRichard
66989a1d03eSRichard v.push_back(test::MakeSingle(5LL));
67089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
67189a1d03eSRichard // CHECK-FIXES: v.emplace_back(5LL);
67289a1d03eSRichard
67389a1d03eSRichard v.push_back(std::make_tuple(6));
67489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
67589a1d03eSRichard // CHECK-FIXES: v.emplace_back(6);
67689a1d03eSRichard
67789a1d03eSRichard v.push_back(std::make_tuple(7LL));
67889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
67989a1d03eSRichard // CHECK-FIXES: v.emplace_back(7LL);
68089a1d03eSRichard }
68189a1d03eSRichard
testOtherContainers()68289a1d03eSRichard void testOtherContainers() {
68389a1d03eSRichard std::list<Something> l;
68489a1d03eSRichard l.push_back(Something(42, 41));
68589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
68689a1d03eSRichard // CHECK-FIXES: l.emplace_back(42, 41);
68789a1d03eSRichard
688b8655f7fSJoey Watts l.push_front(Something(42, 41));
689b8655f7fSJoey Watts // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_front
690b8655f7fSJoey Watts // CHECK-FIXES: l.emplace_front(42, 41);
691b8655f7fSJoey Watts
69289a1d03eSRichard std::deque<Something> d;
69389a1d03eSRichard d.push_back(Something(42));
69489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
69589a1d03eSRichard // CHECK-FIXES: d.emplace_back(42);
69689a1d03eSRichard
697b8655f7fSJoey Watts d.push_front(Something(42));
698b8655f7fSJoey Watts // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_front
699b8655f7fSJoey Watts // CHECK-FIXES: d.emplace_front(42);
700b8655f7fSJoey Watts
70189a1d03eSRichard llvm::LikeASmallVector<Something> ls;
70289a1d03eSRichard ls.push_back(Something(42));
70389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
70489a1d03eSRichard // CHECK-FIXES: ls.emplace_back(42);
705b8655f7fSJoey Watts
706b8655f7fSJoey Watts std::stack<Something> s;
707b8655f7fSJoey Watts s.push(Something(42, 41));
708b8655f7fSJoey Watts // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace
709b8655f7fSJoey Watts // CHECK-FIXES: s.emplace(42, 41);
710b8655f7fSJoey Watts
711b8655f7fSJoey Watts std::queue<Something> q;
712b8655f7fSJoey Watts q.push(Something(42, 41));
713b8655f7fSJoey Watts // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace
714b8655f7fSJoey Watts // CHECK-FIXES: q.emplace(42, 41);
715b8655f7fSJoey Watts
716b8655f7fSJoey Watts std::priority_queue<Something> pq;
717b8655f7fSJoey Watts pq.push(Something(42, 41));
718b8655f7fSJoey Watts // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace
719b8655f7fSJoey Watts // CHECK-FIXES: pq.emplace(42, 41);
720b8655f7fSJoey Watts
721b8655f7fSJoey Watts std::forward_list<Something> fl;
722b8655f7fSJoey Watts fl.push_front(Something(42, 41));
723b8655f7fSJoey Watts // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_front
724b8655f7fSJoey Watts // CHECK-FIXES: fl.emplace_front(42, 41);
72589a1d03eSRichard }
72689a1d03eSRichard
72789a1d03eSRichard class IntWrapper {
72889a1d03eSRichard public:
IntWrapper(int x)72989a1d03eSRichard IntWrapper(int x) : value(x) {}
operator +(const IntWrapper other) const73089a1d03eSRichard IntWrapper operator+(const IntWrapper other) const {
73189a1d03eSRichard return IntWrapper(value + other.value);
73289a1d03eSRichard }
73389a1d03eSRichard
73489a1d03eSRichard private:
73589a1d03eSRichard int value;
73689a1d03eSRichard };
73789a1d03eSRichard
testMultipleOpsInPushBack()73889a1d03eSRichard void testMultipleOpsInPushBack() {
73989a1d03eSRichard std::vector<IntWrapper> v;
74089a1d03eSRichard v.push_back(IntWrapper(42) + IntWrapper(27));
74189a1d03eSRichard }
74289a1d03eSRichard
74389a1d03eSRichard // Macro tests.
74489a1d03eSRichard #define PUSH_BACK_WHOLE(c, x) c.push_back(x)
74589a1d03eSRichard #define PUSH_BACK_NAME push_back
74689a1d03eSRichard #define PUSH_BACK_ARG(x) (x)
74789a1d03eSRichard #define SOME_OBJ Something(10)
74889a1d03eSRichard #define MILLION 3
74989a1d03eSRichard #define SOME_WEIRD_PUSH(v) v.push_back(Something(
75089a1d03eSRichard #define OPEN (
75189a1d03eSRichard #define CLOSE )
macroTest()75289a1d03eSRichard void macroTest() {
75389a1d03eSRichard std::vector<Something> v;
75489a1d03eSRichard Something s;
75589a1d03eSRichard
75689a1d03eSRichard PUSH_BACK_WHOLE(v, Something(5, 6));
75789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use emplace_back
75889a1d03eSRichard
75989a1d03eSRichard v.PUSH_BACK_NAME(Something(5));
76089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
76189a1d03eSRichard
76289a1d03eSRichard v.push_back PUSH_BACK_ARG(Something(5, 6));
76389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
76489a1d03eSRichard
76589a1d03eSRichard v.push_back(SOME_OBJ);
76689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
76789a1d03eSRichard
76889a1d03eSRichard v.push_back(Something(MILLION));
76989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
77089a1d03eSRichard // CHECK-FIXES: v.emplace_back(MILLION);
77189a1d03eSRichard
77289a1d03eSRichard // clang-format off
77389a1d03eSRichard v.push_back( Something OPEN 3 CLOSE );
77489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
77589a1d03eSRichard // clang-format on
77689a1d03eSRichard PUSH_BACK_WHOLE(s, Something(1));
77789a1d03eSRichard }
77889a1d03eSRichard
77989a1d03eSRichard struct A {
78089a1d03eSRichard int value1, value2;
78189a1d03eSRichard };
78289a1d03eSRichard
78389a1d03eSRichard struct B {
BB78489a1d03eSRichard B(A) {}
78589a1d03eSRichard };
78689a1d03eSRichard
78789a1d03eSRichard struct C {
78889a1d03eSRichard int value1, value2, value3;
78989a1d03eSRichard };
79089a1d03eSRichard
testAggregation()79189a1d03eSRichard void testAggregation() {
79289a1d03eSRichard // This should not be noticed or fixed; after the correction, the code won't
79389a1d03eSRichard // compile.
79489a1d03eSRichard
79589a1d03eSRichard std::vector<A> v;
79689a1d03eSRichard v.push_back(A({1, 2}));
79789a1d03eSRichard
79889a1d03eSRichard std::vector<B> vb;
79989a1d03eSRichard vb.push_back(B({10, 42}));
80089a1d03eSRichard }
80189a1d03eSRichard
80289a1d03eSRichard struct Bitfield {
80389a1d03eSRichard unsigned bitfield : 1;
80489a1d03eSRichard unsigned notBitfield;
80589a1d03eSRichard };
80689a1d03eSRichard
testBitfields()80789a1d03eSRichard void testBitfields() {
80889a1d03eSRichard std::vector<Something> v;
80989a1d03eSRichard Bitfield b;
81089a1d03eSRichard v.push_back(Something(42, b.bitfield));
81189a1d03eSRichard v.push_back(Something(b.bitfield));
81289a1d03eSRichard
81389a1d03eSRichard v.push_back(Something(42, b.notBitfield));
81489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
81589a1d03eSRichard // CHECK-FIXES: v.emplace_back(42, b.notBitfield);
81689a1d03eSRichard int var;
81789a1d03eSRichard v.push_back(Something(42, var));
81889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
81989a1d03eSRichard // CHECK-FIXES: v.emplace_back(42, var);
82089a1d03eSRichard }
82189a1d03eSRichard
82289a1d03eSRichard class PrivateCtor {
82389a1d03eSRichard PrivateCtor(int z);
82489a1d03eSRichard
82589a1d03eSRichard public:
doStuff()82689a1d03eSRichard void doStuff() {
82789a1d03eSRichard std::vector<PrivateCtor> v;
82889a1d03eSRichard // This should not change it because emplace back doesn't have permission.
82989a1d03eSRichard // Check currently doesn't support friend declarations because pretty much
83089a1d03eSRichard // nobody would want to be friend with std::vector :(.
83189a1d03eSRichard v.push_back(PrivateCtor(42));
83289a1d03eSRichard }
83389a1d03eSRichard };
83489a1d03eSRichard
83589a1d03eSRichard struct WithDtor {
WithDtorWithDtor83689a1d03eSRichard WithDtor(int) {}
83789a1d03eSRichard ~WithDtor();
83889a1d03eSRichard };
83989a1d03eSRichard
testWithDtor()84089a1d03eSRichard void testWithDtor() {
84189a1d03eSRichard std::vector<WithDtor> v;
84289a1d03eSRichard
84389a1d03eSRichard v.push_back(WithDtor(42));
84489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
84589a1d03eSRichard // CHECK-FIXES: v.emplace_back(42);
84689a1d03eSRichard }
84789a1d03eSRichard
testInitializerList()84889a1d03eSRichard void testInitializerList() {
84989a1d03eSRichard std::vector<std::vector<int>> v;
85089a1d03eSRichard v.push_back(std::vector<int>({1}));
85189a1d03eSRichard // Test against the bug reported in PR32896.
85289a1d03eSRichard
85389a1d03eSRichard v.push_back({{2}});
85489a1d03eSRichard
85589a1d03eSRichard using PairIntVector = std::pair<int, std::vector<int>>;
85689a1d03eSRichard std::vector<PairIntVector> x;
85789a1d03eSRichard x.push_back(PairIntVector(3, {4}));
85889a1d03eSRichard x.push_back({5, {6}});
85989a1d03eSRichard }
86089a1d03eSRichard
86189a1d03eSRichard class Foo {
86289a1d03eSRichard public:
Foo()86389a1d03eSRichard Foo(){};
Foo(int)86489a1d03eSRichard Foo(int){};
Foo(int,int)86589a1d03eSRichard Foo(int, int){};
Foo(std::pair<int,int>)86689a1d03eSRichard Foo(std::pair<int, int>){};
86789a1d03eSRichard
86889a1d03eSRichard protected:
Foo(char *)86989a1d03eSRichard Foo(char *) : Foo(){};
87089a1d03eSRichard };
87189a1d03eSRichard
testSomeEmplaceCases()87289a1d03eSRichard void testSomeEmplaceCases() {
87389a1d03eSRichard std::vector<std::pair<char *, char *>> v1;
87489a1d03eSRichard std::vector<Foo> v2;
87589a1d03eSRichard std::unordered_map<int, char *> m1;
87689a1d03eSRichard
87789a1d03eSRichard v1.emplace_back(std::make_pair("foo", "bar"));
87889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
87989a1d03eSRichard // CHECK-FIXES: v1.emplace_back("foo", "bar");
88089a1d03eSRichard
88189a1d03eSRichard char *foo = "bar";
88289a1d03eSRichard v1.emplace_back(std::make_pair(foo, "bar"));
88389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
88489a1d03eSRichard // CHECK-FIXES: v1.emplace_back(foo, "bar");
88589a1d03eSRichard
88689a1d03eSRichard v1.emplace(v1.begin(), std::make_pair("foo", "bar"));
88789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: unnecessary temporary object created while calling emplace
88889a1d03eSRichard // CHECK-FIXES: v1.emplace(v1.begin(), "foo", "bar");
88989a1d03eSRichard
89089a1d03eSRichard v2.emplace_back(Foo());
89189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
89289a1d03eSRichard // CHECK-FIXES: v2.emplace_back();
89389a1d03eSRichard
89489a1d03eSRichard v2.emplace_back(Foo(13));
89589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
89689a1d03eSRichard // CHECK-FIXES: v2.emplace_back(13);
89789a1d03eSRichard
89889a1d03eSRichard v2.emplace_back(Foo{13});
89989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
90089a1d03eSRichard // CHECK-FIXES: v2.emplace_back(13);
90189a1d03eSRichard
90289a1d03eSRichard int a = 31;
90389a1d03eSRichard v2.emplace_back(Foo(13, a));
90489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
90589a1d03eSRichard // CHECK-FIXES: v2.emplace_back(13, a);
90689a1d03eSRichard
90789a1d03eSRichard v2.emplace_back(std::make_pair(3, 3));
90889a1d03eSRichard
90989a1d03eSRichard m1.emplace(std::make_pair(13, "foo"));
91089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: unnecessary temporary object created while calling emplace
91189a1d03eSRichard // CHECK-FIXES: m1.emplace(13, "foo");
91289a1d03eSRichard
91389a1d03eSRichard std::vector<std::pair<int, int>> v3;
91489a1d03eSRichard v3.emplace_back(std::pair<int, int>(13, 71));
91589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
91689a1d03eSRichard v3.emplace_back(std::make_pair(13, 71));
91789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
91889a1d03eSRichard
91989a1d03eSRichard std::vector<std::tuple<int, int, int>> v4;
92089a1d03eSRichard v4.emplace_back(std::tuple<int, int, int>(13, 31, 71));
92189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
92289a1d03eSRichard v4.emplace_back(std::make_tuple(13, 31, 71));
92389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
92489a1d03eSRichard
92589a1d03eSRichard std::vector<test::Single<int>> v5;
92689a1d03eSRichard v5.emplace_back(test::Single<int>(13));
92789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
92889a1d03eSRichard v5.emplace_back(test::MakeSingle(13));
92989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
93089a1d03eSRichard }
93189a1d03eSRichard
testAllSTLEmplacyFunctions()93289a1d03eSRichard void testAllSTLEmplacyFunctions() {
93389a1d03eSRichard std::vector<Foo> vector;
93489a1d03eSRichard std::deque<Foo> deque;
93589a1d03eSRichard std::forward_list<Foo> forward_list;
93689a1d03eSRichard std::list<Foo> list;
93789a1d03eSRichard std::set<Foo> set;
93889a1d03eSRichard std::map<int, Foo> map;
93989a1d03eSRichard std::multiset<Foo> multiset;
94089a1d03eSRichard std::multimap<int, Foo> multimap;
94189a1d03eSRichard std::unordered_set<Foo> unordered_set;
94289a1d03eSRichard std::unordered_map<int, Foo> unordered_map;
94389a1d03eSRichard std::unordered_multiset<Foo> unordered_multiset;
94489a1d03eSRichard std::unordered_multimap<int, Foo> unordered_multimap;
94589a1d03eSRichard std::stack<Foo> stack;
94689a1d03eSRichard std::queue<Foo> queue;
94789a1d03eSRichard std::priority_queue<Foo> priority_queue;
94889a1d03eSRichard
94989a1d03eSRichard vector.emplace_back(Foo(13));
95089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: unnecessary temporary object created while calling emplace_back
95189a1d03eSRichard // CHECK-FIXES: vector.emplace_back(13);
95289a1d03eSRichard
95389a1d03eSRichard vector.emplace(vector.begin(), Foo(13));
95489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: unnecessary temporary object created while calling emplace
95589a1d03eSRichard // CHECK-FIXES: vector.emplace(vector.begin(), 13);
95689a1d03eSRichard
95789a1d03eSRichard deque.emplace(deque.begin(), Foo(13));
95889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: unnecessary temporary object created while calling emplace
95989a1d03eSRichard // CHECK-FIXES: deque.emplace(deque.begin(), 13);
96089a1d03eSRichard
96189a1d03eSRichard deque.emplace_front(Foo(13));
96289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: unnecessary temporary object created while calling emplace_front
96389a1d03eSRichard // CHECK-FIXES: deque.emplace_front(13);
96489a1d03eSRichard
96589a1d03eSRichard deque.emplace_back(Foo(13));
96689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: unnecessary temporary object created while calling emplace_back
96789a1d03eSRichard // CHECK-FIXES: deque.emplace_back(13);
96889a1d03eSRichard
96989a1d03eSRichard forward_list.emplace_after(forward_list.begin(), Foo(13));
97089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:52: warning: unnecessary temporary object created while calling emplace_after
97189a1d03eSRichard // CHECK-FIXES: forward_list.emplace_after(forward_list.begin(), 13);
97289a1d03eSRichard
97389a1d03eSRichard forward_list.emplace_front(Foo(13));
97489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: unnecessary temporary object created while calling emplace_front
97589a1d03eSRichard // CHECK-FIXES: forward_list.emplace_front(13);
97689a1d03eSRichard
97789a1d03eSRichard list.emplace(list.begin(), Foo(13));
97889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: unnecessary temporary object created while calling emplace
97989a1d03eSRichard // CHECK-FIXES: list.emplace(list.begin(), 13);
98089a1d03eSRichard
98189a1d03eSRichard list.emplace_back(Foo(13));
98289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: unnecessary temporary object created while calling emplace_back
98389a1d03eSRichard // CHECK-FIXES: list.emplace_back(13);
98489a1d03eSRichard
98589a1d03eSRichard list.emplace_front(Foo(13));
98689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: unnecessary temporary object created while calling emplace_front
98789a1d03eSRichard // CHECK-FIXES: list.emplace_front(13);
98889a1d03eSRichard
98989a1d03eSRichard set.emplace(Foo(13));
99089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: unnecessary temporary object created while calling emplace
99189a1d03eSRichard // CHECK-FIXES: set.emplace(13);
99289a1d03eSRichard
99389a1d03eSRichard set.emplace_hint(set.begin(), Foo(13));
99489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: unnecessary temporary object created while calling emplace_hint
99589a1d03eSRichard // CHECK-FIXES: set.emplace_hint(set.begin(), 13);
99689a1d03eSRichard
99789a1d03eSRichard map.emplace(std::make_pair(13, Foo(13)));
99889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: unnecessary temporary object created while calling emplace
99989a1d03eSRichard // CHECK-FIXES: map.emplace(13, Foo(13));
100089a1d03eSRichard
100189a1d03eSRichard map.emplace_hint(map.begin(), std::make_pair(13, Foo(13)));
100289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: unnecessary temporary object created while calling emplace_hint
100389a1d03eSRichard // CHECK-FIXES: map.emplace_hint(map.begin(), 13, Foo(13));
100489a1d03eSRichard
100589a1d03eSRichard multiset.emplace(Foo(13));
100689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: unnecessary temporary object created while calling emplace
100789a1d03eSRichard // CHECK-FIXES: multiset.emplace(13);
100889a1d03eSRichard
100989a1d03eSRichard multiset.emplace_hint(multiset.begin(), Foo(13));
101089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: unnecessary temporary object created while calling emplace_hint
101189a1d03eSRichard // CHECK-FIXES: multiset.emplace_hint(multiset.begin(), 13);
101289a1d03eSRichard
101389a1d03eSRichard multimap.emplace(std::make_pair(13, Foo(13)));
101489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: unnecessary temporary object created while calling emplace
101589a1d03eSRichard // CHECK-FIXES: multimap.emplace(13, Foo(13));
101689a1d03eSRichard
101789a1d03eSRichard multimap.emplace_hint(multimap.begin(), std::make_pair(13, Foo(13)));
101889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: unnecessary temporary object created while calling emplace_hint
101989a1d03eSRichard // CHECK-FIXES: multimap.emplace_hint(multimap.begin(), 13, Foo(13));
102089a1d03eSRichard
102189a1d03eSRichard unordered_set.emplace(Foo(13));
102289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: unnecessary temporary object created while calling emplace
102389a1d03eSRichard // CHECK-FIXES: unordered_set.emplace(13);
102489a1d03eSRichard
102589a1d03eSRichard unordered_set.emplace_hint(unordered_set.begin(), Foo(13));
102689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:53: warning: unnecessary temporary object created while calling emplace_hint
102789a1d03eSRichard // CHECK-FIXES: unordered_set.emplace_hint(unordered_set.begin(), 13);
102889a1d03eSRichard
102989a1d03eSRichard unordered_map.emplace(std::make_pair(13, Foo(13)));
103089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: unnecessary temporary object created while calling emplace
103189a1d03eSRichard // CHECK-FIXES: unordered_map.emplace(13, Foo(13));
103289a1d03eSRichard
103389a1d03eSRichard unordered_map.emplace_hint(unordered_map.begin(), std::make_pair(13, Foo(13)));
103489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:53: warning: unnecessary temporary object created while calling emplace_hint
103589a1d03eSRichard // CHECK-FIXES: unordered_map.emplace_hint(unordered_map.begin(), 13, Foo(13));
103689a1d03eSRichard
103789a1d03eSRichard unordered_multiset.emplace(Foo(13));
103889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: unnecessary temporary object created while calling emplace
103989a1d03eSRichard // CHECK-FIXES: unordered_multiset.emplace(13);
104089a1d03eSRichard unordered_multiset.emplace_hint(unordered_multiset.begin(), Foo(13));
104189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:63: warning: unnecessary temporary object created while calling emplace_hint
104289a1d03eSRichard // CHECK-FIXES: unordered_multiset.emplace_hint(unordered_multiset.begin(), 13);
104389a1d03eSRichard
104489a1d03eSRichard unordered_multimap.emplace(std::make_pair(13, Foo(13)));
104589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: unnecessary temporary object created while calling emplace
104689a1d03eSRichard // CHECK-FIXES: unordered_multimap.emplace(13, Foo(13));
104789a1d03eSRichard unordered_multimap.emplace_hint(unordered_multimap.begin(), std::make_pair(13, Foo(13)));
104889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:63: warning: unnecessary temporary object created while calling emplace_hint
104989a1d03eSRichard // CHECK-FIXES: unordered_multimap.emplace_hint(unordered_multimap.begin(), 13, Foo(13));
105089a1d03eSRichard
105189a1d03eSRichard stack.emplace(Foo(13));
105289a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: unnecessary temporary object created while calling emplace
105389a1d03eSRichard // CHECK-FIXES: stack.emplace(13);
105489a1d03eSRichard
105589a1d03eSRichard queue.emplace(Foo(13));
105689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: unnecessary temporary object created while calling emplace
105789a1d03eSRichard // CHECK-FIXES: queue.emplace(13);
105889a1d03eSRichard
105989a1d03eSRichard priority_queue.emplace(Foo(13));
106089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: unnecessary temporary object created while calling emplace
106189a1d03eSRichard // CHECK-FIXES: priority_queue.emplace(13);
106289a1d03eSRichard }
106389a1d03eSRichard
test_AliasEmplacyFunctions()1064495d984eScorona10 void test_AliasEmplacyFunctions() {
1065495d984eScorona10 typedef std::list<Foo> L;
1066495d984eScorona10 using DQ = std::deque<Foo>;
1067495d984eScorona10 L l;
1068495d984eScorona10 l.emplace_back(Foo(3));
1069495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: unnecessary temporary object created while calling emplace_back
1070495d984eScorona10 // CHECK-FIXES: l.emplace_back(3);
1071495d984eScorona10
1072495d984eScorona10 DQ dq;
1073495d984eScorona10 dq.emplace_back(Foo(3));
1074495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
1075495d984eScorona10 // CHECK-FIXES: dq.emplace_back(3);
1076495d984eScorona10
1077495d984eScorona10 typedef std::stack<Foo> STACK;
1078495d984eScorona10 using PQ = std::priority_queue<Foo>;
1079495d984eScorona10 STACK stack;
1080495d984eScorona10 stack.emplace(Foo(3));
1081495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: unnecessary temporary object created while calling emplace
1082495d984eScorona10 // CHECK-FIXES: stack.emplace(3);
1083495d984eScorona10
1084495d984eScorona10 PQ pq;
1085495d984eScorona10 pq.emplace(Foo(3));
1086495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: unnecessary temporary object created while calling emplace
1087495d984eScorona10 // CHECK-FIXES: pq.emplace(3);
1088495d984eScorona10
1089495d984eScorona10 typedef std::forward_list<Foo> FL;
1090495d984eScorona10 using DQ2 = std::deque<Foo>;
1091495d984eScorona10 FL fl;
1092495d984eScorona10 fl.emplace_front(Foo(3));
1093495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: unnecessary temporary object created while calling emplace_front
1094495d984eScorona10 // CHECK-FIXES: fl.emplace_front(3);
1095495d984eScorona10
1096495d984eScorona10 DQ2 dq2;
1097495d984eScorona10 dq2.emplace_front(Foo(3));
1098495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: unnecessary temporary object created while calling emplace_front
1099495d984eScorona10 // CHECK-FIXES: dq2.emplace_front(3);
1100495d984eScorona10 }
1101495d984eScorona10
test_Alias()1102495d984eScorona10 void test_Alias() {
1103495d984eScorona10 typedef std::list<Foo> L;
1104495d984eScorona10 using DQ = std::deque<Foo>;
1105495d984eScorona10 L l;
1106495d984eScorona10 l.push_back(Foo(3));
1107495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back instead of push_back [modernize-use-emplace]
1108495d984eScorona10 // CHECK-FIXES: l.emplace_back(3);
1109495d984eScorona10
1110495d984eScorona10 DQ dq;
1111495d984eScorona10 dq.push_back(Foo(3));
1112495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back instead of push_back [modernize-use-emplace]
1113495d984eScorona10 // CHECK-FIXES: dq.emplace_back(3);
1114495d984eScorona10
1115495d984eScorona10 typedef std::stack<Foo> STACK;
1116495d984eScorona10 using PQ = std::priority_queue<Foo>;
1117495d984eScorona10 STACK stack;
1118495d984eScorona10 stack.push(Foo(3));
1119495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use emplace instead of push [modernize-use-emplace]
1120495d984eScorona10 // CHECK-FIXES: stack.emplace(3);
1121495d984eScorona10
1122495d984eScorona10 PQ pq;
1123495d984eScorona10 pq.push(Foo(3));
1124495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace instead of push [modernize-use-emplace]
1125495d984eScorona10 // CHECK-FIXES: pq.emplace(3);
1126495d984eScorona10
1127495d984eScorona10 typedef std::forward_list<Foo> FL;
1128495d984eScorona10 using DQ2 = std::deque<Foo>;
1129495d984eScorona10 FL fl;
1130495d984eScorona10 fl.push_front(Foo(3));
1131495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_front instead of push_front [modernize-use-emplace]
1132495d984eScorona10 // CHECK-FIXES: fl.emplace_front(3);
1133495d984eScorona10
1134495d984eScorona10 DQ2 dq2;
1135495d984eScorona10 dq2.push_front(Foo(3));
1136495d984eScorona10 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_front instead of push_front [modernize-use-emplace]
1137495d984eScorona10 // CHECK-FIXES: dq2.emplace_front(3);
1138495d984eScorona10 }
1139495d984eScorona10
114089a1d03eSRichard struct Bar {
114189a1d03eSRichard public:
BarBar114289a1d03eSRichard Bar(){};
testWithPrivateAndProtectedCtorBar114389a1d03eSRichard void testWithPrivateAndProtectedCtor() {
114489a1d03eSRichard std::vector<Bar> vec;
114589a1d03eSRichard
114689a1d03eSRichard vec.emplace_back(Bar(13));
114789a1d03eSRichard vec.emplace_back(Bar(13, 13));
114889a1d03eSRichard }
114989a1d03eSRichard
115089a1d03eSRichard protected:
BarBar115189a1d03eSRichard Bar(int){};
115289a1d03eSRichard
115389a1d03eSRichard private:
BarBar115489a1d03eSRichard Bar(int, int){};
115589a1d03eSRichard };
115689a1d03eSRichard
testPossibleFalsePositives()115789a1d03eSRichard void testPossibleFalsePositives() {
115889a1d03eSRichard struct Y {
115989a1d03eSRichard Y(std::pair<int, int> &&) {}
116089a1d03eSRichard };
116189a1d03eSRichard std::vector<Y> y;
116289a1d03eSRichard y.emplace_back(std::make_pair(2, 3));
116389a1d03eSRichard
116489a1d03eSRichard std::vector<std::pair<int, int>> v;
116589a1d03eSRichard v.emplace_back(std::make_pair<char, char>(0, 3));
116689a1d03eSRichard
116789a1d03eSRichard struct D {
116889a1d03eSRichard D(...) {}
116989a1d03eSRichard operator char() const { return 0; }
117089a1d03eSRichard };
117189a1d03eSRichard v.emplace_back(std::make_pair<D, int>(Something(), 2));
117289a1d03eSRichard }
11737db780d5SBigPeet
11747db780d5SBigPeet struct InnerType {
11757db780d5SBigPeet InnerType();
11767db780d5SBigPeet InnerType(char const*);
11777db780d5SBigPeet };
11787db780d5SBigPeet
11797db780d5SBigPeet struct NonTrivialNoCtor {
11807db780d5SBigPeet InnerType it;
11817db780d5SBigPeet };
11827db780d5SBigPeet
11837db780d5SBigPeet struct NonTrivialWithVector {
11847db780d5SBigPeet std::vector<int> it;
11857db780d5SBigPeet };
11867db780d5SBigPeet
118703ef1032SChris Cotter struct NonTrivialWithIntAndVector {
118803ef1032SChris Cotter int x;
118903ef1032SChris Cotter std::vector<int> it;
119003ef1032SChris Cotter };
119103ef1032SChris Cotter
11927db780d5SBigPeet struct NonTrivialWithCtor {
11937db780d5SBigPeet NonTrivialWithCtor();
11947db780d5SBigPeet NonTrivialWithCtor(std::vector<int> const&);
11957db780d5SBigPeet };
11967db780d5SBigPeet
testBracedInitTemporaries()11977db780d5SBigPeet void testBracedInitTemporaries() {
11987db780d5SBigPeet std::vector<NonTrivialNoCtor> v1;
11997db780d5SBigPeet
12007db780d5SBigPeet v1.push_back(NonTrivialNoCtor());
12017db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12027db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12037db780d5SBigPeet v1.push_back(NonTrivialNoCtor{});
12047db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12057db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12067db780d5SBigPeet v1.push_back({});
12077db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12087db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12097db780d5SBigPeet v1.push_back(NonTrivialNoCtor{InnerType{}});
12107db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12117db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12127db780d5SBigPeet v1.push_back({InnerType{}});
12137db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12147db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12157db780d5SBigPeet v1.push_back(NonTrivialNoCtor{InnerType()});
12167db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12177db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12187db780d5SBigPeet v1.push_back({InnerType()});
12197db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12207db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12217db780d5SBigPeet v1.push_back({{}});
12227db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12237db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12247db780d5SBigPeet
12257db780d5SBigPeet v1.emplace_back(NonTrivialNoCtor());
12267db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
12277db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12287db780d5SBigPeet v1.emplace_back(NonTrivialNoCtor{});
12297db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
12307db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12317db780d5SBigPeet v1.emplace_back(NonTrivialNoCtor{InnerType{}});
12327db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
12337db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12347db780d5SBigPeet v1.emplace_back(NonTrivialNoCtor{{}});
12357db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
12367db780d5SBigPeet // CHECK-FIXES: v1.emplace_back();
12377db780d5SBigPeet
12387db780d5SBigPeet // These should not be noticed or fixed; after the correction, the code won't
12397db780d5SBigPeet // compile.
12407db780d5SBigPeet v1.push_back(NonTrivialNoCtor{""});
12417db780d5SBigPeet v1.push_back({""});
12427db780d5SBigPeet v1.push_back(NonTrivialNoCtor{InnerType{""}});
12437db780d5SBigPeet v1.push_back({InnerType{""}});
12447db780d5SBigPeet v1.emplace_back(NonTrivialNoCtor{""});
12457db780d5SBigPeet
12467db780d5SBigPeet std::vector<NonTrivialWithVector> v2;
12477db780d5SBigPeet
12487db780d5SBigPeet v2.push_back(NonTrivialWithVector());
12497db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12507db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12517db780d5SBigPeet v2.push_back(NonTrivialWithVector{});
12527db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12537db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12547db780d5SBigPeet v2.push_back({});
12557db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12567db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12577db780d5SBigPeet v2.push_back(NonTrivialWithVector{std::vector<int>{}});
12587db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12597db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12607db780d5SBigPeet v2.push_back({std::vector<int>{}});
12617db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12627db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12637db780d5SBigPeet v2.push_back(NonTrivialWithVector{std::vector<int>()});
12647db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12657db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12667db780d5SBigPeet v2.push_back({std::vector<int>()});
12677db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12687db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12697db780d5SBigPeet v2.push_back({{}});
12707db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12717db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12727db780d5SBigPeet
12737db780d5SBigPeet v2.emplace_back(NonTrivialWithVector());
12747db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
12757db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12767db780d5SBigPeet v2.emplace_back(NonTrivialWithVector{});
12777db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
12787db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12797db780d5SBigPeet v2.emplace_back(NonTrivialWithVector{std::vector<int>{}});
12807db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
12817db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12827db780d5SBigPeet v2.emplace_back(NonTrivialWithVector{{}});
12837db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
12847db780d5SBigPeet // CHECK-FIXES: v2.emplace_back();
12857db780d5SBigPeet
12867db780d5SBigPeet
12877db780d5SBigPeet // These should not be noticed or fixed; after the correction, the code won't
12887db780d5SBigPeet // compile.
12897db780d5SBigPeet v2.push_back(NonTrivialWithVector{{0}});
12907db780d5SBigPeet v2.push_back({{0}});
12917db780d5SBigPeet v2.push_back(NonTrivialWithVector{std::vector<int>{0}});
12927db780d5SBigPeet v2.push_back({std::vector<int>{0}});
12937db780d5SBigPeet v2.emplace_back(NonTrivialWithVector{std::vector<int>{0}});
12947db780d5SBigPeet
12957db780d5SBigPeet std::vector<NonTrivialWithCtor> v3;
12967db780d5SBigPeet
12977db780d5SBigPeet v3.push_back(NonTrivialWithCtor());
12987db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
12997db780d5SBigPeet // CHECK-FIXES: v3.emplace_back();
13007db780d5SBigPeet v3.push_back(NonTrivialWithCtor{});
13017db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
13027db780d5SBigPeet // CHECK-FIXES: v3.emplace_back();
13037db780d5SBigPeet v3.push_back({});
13047db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
13057db780d5SBigPeet // CHECK-FIXES: v3.emplace_back();
13067db780d5SBigPeet v3.push_back(NonTrivialWithCtor{std::vector<int>()});
13077db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
13087db780d5SBigPeet // CHECK-FIXES: v3.emplace_back(std::vector<int>());
13097db780d5SBigPeet v3.push_back(NonTrivialWithCtor{std::vector<int>{0}});
13107db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
13117db780d5SBigPeet // CHECK-FIXES: v3.emplace_back(std::vector<int>{0});
13127db780d5SBigPeet v3.push_back(NonTrivialWithCtor{std::vector<int>{}});
13137db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
13147db780d5SBigPeet // CHECK-FIXES: v3.emplace_back(std::vector<int>{});
13157db780d5SBigPeet v3.push_back({std::vector<int>{0}});
13167db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
13177db780d5SBigPeet // CHECK-FIXES: v3.emplace_back(std::vector<int>{0});
13187db780d5SBigPeet v3.push_back({std::vector<int>{}});
13197db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use emplace_back
13207db780d5SBigPeet // CHECK-FIXES: v3.emplace_back(std::vector<int>{});
13217db780d5SBigPeet
13227db780d5SBigPeet v3.emplace_back(NonTrivialWithCtor());
13237db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
13247db780d5SBigPeet // CHECK-FIXES: v3.emplace_back();
13257db780d5SBigPeet v3.emplace_back(NonTrivialWithCtor{});
13267db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
13277db780d5SBigPeet // CHECK-FIXES: v3.emplace_back();
13287db780d5SBigPeet v3.emplace_back(NonTrivialWithCtor{std::vector<int>{}});
13297db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
13307db780d5SBigPeet // CHECK-FIXES: v3.emplace_back(std::vector<int>{});
13317db780d5SBigPeet v3.emplace_back(NonTrivialWithCtor{std::vector<int>{0}});
13327db780d5SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: unnecessary temporary object created while calling emplace_back
13337db780d5SBigPeet // CHECK-FIXES: v3.emplace_back(std::vector<int>{0});
13347db780d5SBigPeet
13357db780d5SBigPeet // These should not be noticed or fixed; after the correction, the code won't
13367db780d5SBigPeet // compile.
13377db780d5SBigPeet v3.push_back(NonTrivialWithCtor{{0}});
13387db780d5SBigPeet v3.push_back(NonTrivialWithCtor{{}});
13397db780d5SBigPeet v3.push_back({{0}});
13407db780d5SBigPeet v3.push_back({{}});
134103ef1032SChris Cotter
134203ef1032SChris Cotter std::vector<NonTrivialWithIntAndVector> v4;
134303ef1032SChris Cotter
134403ef1032SChris Cotter // These should not be noticed or fixed; after the correction, the code won't
134503ef1032SChris Cotter // compile.
134603ef1032SChris Cotter v4.push_back(NonTrivialWithIntAndVector{1, {}});
134703ef1032SChris Cotter v4.push_back(NonTrivialWithIntAndVector{});
134803ef1032SChris Cotter v4.push_back({});
13497db780d5SBigPeet }
1350a543d840SBigPeet
testWithPointerTypes()1351a543d840SBigPeet void testWithPointerTypes() {
1352a543d840SBigPeet std::list<Something> l;
1353a543d840SBigPeet std::list<Something>* lp = &l;
1354a543d840SBigPeet std::stack<Something> s;
1355a543d840SBigPeet std::stack<Something>* sp;
1356a543d840SBigPeet
1357a543d840SBigPeet lp->push_back(Something(1, 2));
1358a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_back instead of push_back [modernize-use-emplace]
1359a543d840SBigPeet // CHECK-FIXES: lp->emplace_back(1, 2);
1360a543d840SBigPeet lp->push_front(Something(1, 2));
1361a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_front instead of push_front [modernize-use-emplace]
1362a543d840SBigPeet // CHECK-FIXES: lp->emplace_front(1, 2);
1363a543d840SBigPeet sp->push(Something(1, 2));
1364a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace instead of push [modernize-use-emplace]
1365a543d840SBigPeet // CHECK-FIXES: sp->emplace(1, 2);
1366a543d840SBigPeet
1367a543d840SBigPeet lp->push_back(Something{1, 2});
1368a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_back instead of push_back [modernize-use-emplace]
1369a543d840SBigPeet // CHECK-FIXES: lp->emplace_back(1, 2);
1370a543d840SBigPeet lp->push_front(Something{1, 2});
1371a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_front instead of push_front [modernize-use-emplace]
1372a543d840SBigPeet // CHECK-FIXES: lp->emplace_front(1, 2);
1373a543d840SBigPeet sp->push(Something{1, 2});
1374a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace instead of push [modernize-use-emplace]
1375a543d840SBigPeet // CHECK-FIXES: sp->emplace(1, 2);
1376a543d840SBigPeet
1377a543d840SBigPeet lp->push_back(Something());
1378a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_back instead of push_back [modernize-use-emplace]
1379a543d840SBigPeet // CHECK-FIXES: lp->emplace_back();
1380a543d840SBigPeet lp->push_front(Something());
1381a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_front instead of push_front [modernize-use-emplace]
1382a543d840SBigPeet // CHECK-FIXES: lp->emplace_front();
1383a543d840SBigPeet sp->push(Something());
1384a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace instead of push [modernize-use-emplace]
1385a543d840SBigPeet // CHECK-FIXES: sp->emplace();
1386a543d840SBigPeet
1387a543d840SBigPeet lp->push_back(Something{});
1388a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_back instead of push_back [modernize-use-emplace]
1389a543d840SBigPeet // CHECK-FIXES: lp->emplace_back();
1390a543d840SBigPeet lp->push_front(Something{});
1391a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace_front instead of push_front [modernize-use-emplace]
1392a543d840SBigPeet // CHECK-FIXES: lp->emplace_front();
1393a543d840SBigPeet sp->push(Something{});
1394a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use emplace instead of push [modernize-use-emplace]
1395a543d840SBigPeet // CHECK-FIXES: sp->emplace();
1396a543d840SBigPeet
1397a543d840SBigPeet lp->emplace_back(Something(1, 2));
1398a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: unnecessary temporary object created while calling emplace_back
1399a543d840SBigPeet // CHECK-FIXES: lp->emplace_back(1, 2);
1400a543d840SBigPeet lp->emplace_front(Something(1, 2));
1401a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: unnecessary temporary object created while calling emplace_front
1402a543d840SBigPeet // CHECK-FIXES: lp->emplace_front(1, 2);
1403a543d840SBigPeet sp->emplace(Something(1, 2));
1404a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: unnecessary temporary object created while calling emplace
1405a543d840SBigPeet // CHECK-FIXES: sp->emplace(1, 2);
1406a543d840SBigPeet
1407a543d840SBigPeet lp->emplace_back(Something{1, 2});
1408a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: unnecessary temporary object created while calling emplace_back
1409a543d840SBigPeet // CHECK-FIXES: lp->emplace_back(1, 2);
1410a543d840SBigPeet lp->emplace_front(Something{1, 2});
1411a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: unnecessary temporary object created while calling emplace_front
1412a543d840SBigPeet // CHECK-FIXES: lp->emplace_front(1, 2);
1413a543d840SBigPeet sp->emplace(Something{1, 2});
1414a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: unnecessary temporary object created while calling emplace
1415a543d840SBigPeet // CHECK-FIXES: sp->emplace(1, 2);
1416a543d840SBigPeet
1417a543d840SBigPeet lp->emplace_back(Something());
1418a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: unnecessary temporary object created while calling emplace_back
1419a543d840SBigPeet // CHECK-FIXES: lp->emplace_back();
1420a543d840SBigPeet lp->emplace_front(Something());
1421a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: unnecessary temporary object created while calling emplace_front
1422a543d840SBigPeet // CHECK-FIXES: lp->emplace_front();
1423a543d840SBigPeet sp->emplace(Something());
1424a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: unnecessary temporary object created while calling emplace
1425a543d840SBigPeet // CHECK-FIXES: sp->emplace();
1426a543d840SBigPeet
1427a543d840SBigPeet lp->emplace_back(Something{});
1428a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: unnecessary temporary object created while calling emplace_back
1429a543d840SBigPeet // CHECK-FIXES: lp->emplace_back();
1430a543d840SBigPeet lp->emplace_front(Something{});
1431a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: unnecessary temporary object created while calling emplace_front
1432a543d840SBigPeet // CHECK-FIXES: lp->emplace_front();
1433a543d840SBigPeet sp->emplace(Something{});
1434a543d840SBigPeet // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: unnecessary temporary object created while calling emplace
1435a543d840SBigPeet // CHECK-FIXES: sp->emplace();
1436a543d840SBigPeet }
1437