1 // RUN: %check_clang_tidy %s performance-unnecessary-copy-initialization %t -- -config="{CheckOptions: [{key: performance-unnecessary-copy-initialization.ExcludedContainerTypes, value: 'ns::ViewType$;::ConstInCorrectType$'}]}" --
2 
3 namespace ns {
4 template <typename T>
5 struct ViewType {
6   ViewType(const T &);
7   const T &view() const;
8 };
9 } // namespace ns
10 
11 template <typename T>
12 struct ViewType {
13   ViewType(const T &);
14   const T &view() const;
15 };
16 
17 struct ExpensiveToCopy {
18   ~ExpensiveToCopy();
19   void constMethod() const;
20 };
21 
22 struct ConstInCorrectType {
23   const ExpensiveToCopy &secretlyMutates() const;
24 };
25 
26 using NSVTE = ns::ViewType<ExpensiveToCopy>;
27 typedef ns::ViewType<ExpensiveToCopy> FewType;
28 
positiveViewType()29 void positiveViewType() {
30   ExpensiveToCopy E;
31   ViewType<ExpensiveToCopy> V(E);
32   const auto O = V.view();
33   // CHECK-MESSAGES: [[@LINE-1]]:14: warning: the const qualified variable 'O' is copy-constructed
34   // CHECK-FIXES: const auto& O = V.view();
35   O.constMethod();
36 }
37 
excludedViewTypeInNamespace()38 void excludedViewTypeInNamespace() {
39   ExpensiveToCopy E;
40   ns::ViewType<ExpensiveToCopy> V(E);
41   const auto O = V.view();
42   O.constMethod();
43 }
44 
excludedViewTypeAliased()45 void excludedViewTypeAliased() {
46   ExpensiveToCopy E;
47   NSVTE V(E);
48   const auto O = V.view();
49   O.constMethod();
50 
51   FewType F(E);
52   const auto P = F.view();
53   P.constMethod();
54 }
55 
excludedConstIncorrectType()56 void excludedConstIncorrectType() {
57   ConstInCorrectType C;
58   const auto E = C.secretlyMutates();
59   E.constMethod();
60 }
61