// RUN: %check_clang_tidy %s performance-unnecessary-copy-initialization %t -- -config="{CheckOptions: {performance-unnecessary-copy-initialization.ExcludedContainerTypes: 'ns::ViewType$;::ConstInCorrectType$'}}" --
namespace ns {
template <typename T>
struct ViewType {
ViewType(const T &);
const T &view() const;
};
} // namespace ns
template <typename T>
struct ViewType {
ViewType(const T &);
const T &view() const;
};
struct ExpensiveToCopy {
~ExpensiveToCopy();
void constMethod() const;
};
struct ConstInCorrectType {
const ExpensiveToCopy &secretlyMutates() const;
const ExpensiveToCopy &operator[](int) const;
};
using NSVTE = ns::ViewType<ExpensiveToCopy>;
typedef ns::ViewType<ExpensiveToCopy> FewType;
void positiveViewType() {
ExpensiveToCopy E;
ViewType<ExpensiveToCopy> V(E);
const auto O = V.view();
// CHECK-MESSAGES: [[@LINE-1]]:14: warning: the const qualified variable 'O' is copy-constructed
// CHECK-FIXES: const auto& O = V.view();
O.constMethod();
}
void excludedViewTypeInNamespace() {
ExpensiveToCopy E;
ns::ViewType<ExpensiveToCopy> V(E);
const auto O = V.view();
O.constMethod();
}
void excludedViewTypeAliased() {
ExpensiveToCopy E;
NSVTE V(E);
const auto O = V.view();
O.constMethod();
FewType F(E);
const auto P = F.view();
P.constMethod();
}
void excludedConstIncorrectType() {
ConstInCorrectType C;
const auto E = C.secretlyMutates();
E.constMethod();
}
void excludedConstIncorrectTypeOperator() {
ConstInCorrectType C;
const auto E = C[42];
E.constMethod();
}
void excludedConstIncorrectTypeAsPointer(ConstInCorrectType *C) {
const auto E = C->secretlyMutates();
E.constMethod();
}
void excludedConstIncorrectTypeAsPointerOperator(ConstInCorrectType *C) {
const auto E = (*C)[42];
E.constMethod();
}
void excludedConstIncorrectTypeAsReference(const ConstInCorrectType &C) {
const auto E = C.secretlyMutates();
E.constMethod();
}
void excludedConstIncorrectTypeAsReferenceOperator(const ConstInCorrectType &C) {
const auto E = C[42];
E.constMethod();
}