1// RUN: %check_clang_tidy %s performance-for-range-copy %t -- \
2// RUN: -config="{CheckOptions: {performance-for-range-copy.WarnOnAllAutoCopies: true}}"
3
4template <typename T>
5struct Iterator {
6 void operator++() {}
7 const T& operator*() {
8 static T* TT = new T();
9 return *TT;
10 }
11 bool operator!=(const Iterator &) { return false; }
12};
13template <typename T>
14struct View {
15 T begin() { return T(); }
16 T begin() const { return T(); }
17 T end() { return T(); }
18 T end() const { return T(); }
19};
20
21struct S {
22 S();
23 S(const S &);
24 ~S();
25 S &operator=(const S &);
26};
27
28void NegativeLoopVariableNotAuto() {
29 for (S S1 : View<Iterator<S>>()) {
30 S* S2 = &S1;
31 }
32}
33
34void PositiveTriggeredForAutoLoopVariable() {
35 for (auto S1 : View<Iterator<S>>()) {
36 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: the loop variable's type is not a reference type; this creates a copy in each iteration; consider making this a reference [performance-for-range-copy]
37 // CHECK-FIXES: for (const auto& S1 : View<Iterator<S>>()) {
38 S* S2 = &S1;
39 }
40}
41

source code of clang-tools-extra/test/clang-tidy/checkers/performance/for-range-copy-warn-on-all-auto-copies.cpp