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()29void 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()38void excludedViewTypeInNamespace() { 39 ExpensiveToCopy E; 40 ns::ViewType<ExpensiveToCopy> V(E); 41 const auto O = V.view(); 42 O.constMethod(); 43 } 44 excludedViewTypeAliased()45void 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()56void excludedConstIncorrectType() { 57 ConstInCorrectType C; 58 const auto E = C.secretlyMutates(); 59 E.constMethod(); 60 } 61