forked from OSchip/llvm-project
124 lines
2.8 KiB
C++
124 lines
2.8 KiB
C++
|
// RUN: %check_clang_tidy %s modernize-use-emplace %t -- \
|
||
|
// RUN: -config="{CheckOptions: \
|
||
|
// RUN: [{key: modernize-use-emplace.IgnoreImplicitConstructors, \
|
||
|
// RUN: value: 1}] \
|
||
|
// RUN: }" -- -std=c++11
|
||
|
|
||
|
namespace std {
|
||
|
template <typename>
|
||
|
class initializer_list
|
||
|
{
|
||
|
public:
|
||
|
initializer_list() noexcept {}
|
||
|
};
|
||
|
|
||
|
template <typename T>
|
||
|
class vector {
|
||
|
public:
|
||
|
vector() = default;
|
||
|
vector(initializer_list<T>) {}
|
||
|
|
||
|
void push_back(const T &) {}
|
||
|
void push_back(T &&) {}
|
||
|
|
||
|
template <typename... Args>
|
||
|
void emplace_back(Args &&... args){};
|
||
|
~vector();
|
||
|
};
|
||
|
|
||
|
} // namespace std
|
||
|
|
||
|
void testInts() {
|
||
|
std::vector<int> v;
|
||
|
v.push_back(42);
|
||
|
v.push_back(int(42));
|
||
|
v.push_back(int{42});
|
||
|
v.push_back(42.0);
|
||
|
int z;
|
||
|
v.push_back(z);
|
||
|
}
|
||
|
|
||
|
struct Something {
|
||
|
Something(int a, int b = 41) {}
|
||
|
Something() {}
|
||
|
void push_back(Something);
|
||
|
int getInt() { return 42; }
|
||
|
};
|
||
|
|
||
|
struct Convertable {
|
||
|
operator Something() { return Something{}; }
|
||
|
};
|
||
|
|
||
|
struct Zoz {
|
||
|
Zoz(Something, int = 42) {}
|
||
|
};
|
||
|
|
||
|
Zoz getZoz(Something s) { return Zoz(s); }
|
||
|
|
||
|
void test_Something() {
|
||
|
std::vector<Something> v;
|
||
|
|
||
|
v.push_back(Something(1, 2));
|
||
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back instead of push_back [modernize-use-emplace]
|
||
|
// CHECK-FIXES: v.emplace_back(1, 2);
|
||
|
|
||
|
v.push_back(Something{1, 2});
|
||
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
|
||
|
// CHECK-FIXES: v.emplace_back(1, 2);
|
||
|
|
||
|
v.push_back(Something());
|
||
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
|
||
|
// CHECK-FIXES: v.emplace_back();
|
||
|
|
||
|
v.push_back(Something{});
|
||
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
|
||
|
// CHECK-FIXES: v.emplace_back();
|
||
|
|
||
|
Something Different;
|
||
|
v.push_back(Something(Different.getInt(), 42));
|
||
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
|
||
|
// CHECK-FIXES: v.emplace_back(Different.getInt(), 42);
|
||
|
|
||
|
v.push_back(Different.getInt());
|
||
|
v.push_back(42);
|
||
|
|
||
|
Something temporary(42, 42);
|
||
|
temporary.push_back(temporary);
|
||
|
v.push_back(temporary);
|
||
|
|
||
|
v.push_back(Convertable());
|
||
|
v.push_back(Convertable{});
|
||
|
Convertable s;
|
||
|
v.push_back(s);
|
||
|
}
|
||
|
|
||
|
template <typename ElemType>
|
||
|
void dependOnElem() {
|
||
|
std::vector<ElemType> v;
|
||
|
v.push_back(ElemType(42));
|
||
|
}
|
||
|
|
||
|
template <typename ContainerType>
|
||
|
void dependOnContainer() {
|
||
|
ContainerType v;
|
||
|
v.push_back(Something(42));
|
||
|
}
|
||
|
|
||
|
void callDependent() {
|
||
|
dependOnElem<Something>();
|
||
|
dependOnContainer<std::vector<Something>>();
|
||
|
}
|
||
|
|
||
|
void test2() {
|
||
|
std::vector<Zoz> v;
|
||
|
v.push_back(Zoz(Something(21, 37)));
|
||
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
|
||
|
// CHECK-FIXES: v.emplace_back(Something(21, 37));
|
||
|
|
||
|
v.push_back(Zoz(Something(21, 37), 42));
|
||
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
|
||
|
// CHECK-FIXES: v.emplace_back(Something(21, 37), 42);
|
||
|
|
||
|
v.push_back(getZoz(Something(1, 2)));
|
||
|
}
|