1 // RUN: %check_clang_tidy %s zircon-temporary-objects %t -- \
2 // RUN:   -config="{CheckOptions: [{key: zircon-temporary-objects.Names, value: 'Foo;NS::Bar'}]}" \
3 // RUN:   -header-filter=.*
4 
5 // Should flag instances of Foo, NS::Bar.
6 
7 class Foo {
8 public:
9   Foo() = default;
Foo(int Val)10   Foo(int Val) : Val(Val){};
11 
12 private:
13   int Val;
14 };
15 
16 namespace NS {
17 
18 class Bar {
19 public:
20   Bar() = default;
Bar(int Val)21   Bar(int Val) : Val(Val){};
22 
23 private:
24   int Val;
25 };
26 
27 } // namespace NS
28 
29 class Bar {
30 public:
31   Bar() = default;
Bar(int Val)32   Bar(int Val) : Val(Val){};
33 
34 private:
35   int Val;
36 };
37 
func(Foo F)38 int func(Foo F) { return 1; };
39 
main()40 int main() {
41   Foo F;
42   Foo *F2 = new Foo();
43   new Foo();
44   Foo();
45   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: creating a temporary object of type 'Foo' is prohibited
46   Foo F3 = Foo();
47   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: creating a temporary object of type 'Foo' is prohibited
48 
49   Bar();
50   NS::Bar();
51 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: creating a temporary object of type 'NS::Bar' is prohibited
52 
53   int A = func(Foo());
54   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: creating a temporary object of type 'Foo' is prohibited
55 
56   Foo F4(0);
57   Foo *F5 = new Foo(0);
58   new Foo(0);
59   Foo(0);
60   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: creating a temporary object of type 'Foo' is prohibited
61   Foo F6 = Foo(0);
62   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: creating a temporary object of type 'Foo' is prohibited
63 
64   Bar(0);
65   NS::Bar(0);
66 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: creating a temporary object of type 'NS::Bar' is prohibited
67 
68   int B = func(Foo(0));
69   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: creating a temporary object of type 'Foo' is prohibited
70 }
71 
72 namespace NS {
73 
f()74 void f() {
75   Bar();
76 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: creating a temporary object of type 'NS::Bar' is prohibited
77   Bar(0);
78 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: creating a temporary object of type 'NS::Bar' is prohibited
79 }
80 
81 } // namespace NS
82 
83 template <typename Ty>
make_ty()84 Ty make_ty() { return Ty(); }
85 // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: creating a temporary object of type 'Foo' is prohibited
86 // CHECK-MESSAGES: :[[@LINE-2]]:23: warning: creating a temporary object of type 'NS::Bar' is prohibited
87 
ty_func()88 void ty_func() {
89   make_ty<Bar>();
90   make_ty<NS::Bar>();
91   make_ty<Foo>();
92 }
93 
94 // Inheriting the disallowed class does not trigger the check.
95 
96 class Bingo : NS::Bar {}; // Not explicitly disallowed
97 
f2()98 void f2() {
99   Bingo();
100 }
101 
102 template <typename Ty>
103 class Quux : Ty {};
104 
f3()105 void f3() {
106   Quux<NS::Bar>();
107   Quux<Bar>();
108 }
109