1 // RUN: %check_clang_tidy %s llvm-prefer-register-over-unsigned %t
2
3 namespace llvm {
4 class Register {
5 public:
6 operator unsigned();
7
8 unsigned Reg;
9 };
10
11 // This class shouldn't trigger it despite the similarity.
12 class RegisterLike {
13 public:
14 operator unsigned();
15
16 unsigned Reg;
17 };
18 } // end namespace llvm
19
20 llvm::Register getReg();
21 llvm::RegisterLike getRegLike();
22
apply_1()23 void apply_1() {
24 unsigned Reg1 = getReg();
25 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'Reg1' declared as 'unsigned int'; use 'llvm::Register' instead [llvm-prefer-register-over-unsigned]
26 // CHECK-FIXES: apply_1()
27 // CHECK-FIXES-NEXT: llvm::Register Reg1 = getReg();
28 }
29
apply_2()30 void apply_2() {
31 using namespace llvm;
32 unsigned Reg2 = getReg();
33 // FIXME: Function-scoped UsingDirectiveDecl's don't appear to be in the
34 // DeclContext for the function so we can't elide the llvm:: in this
35 // case. Fortunately, it doesn't actually occur in the LLVM code base.
36 // CHECK-MESSAGES: :[[@LINE-4]]:12: warning: variable 'Reg2' declared as 'unsigned int'; use 'llvm::Register' instead [llvm-prefer-register-over-unsigned]
37 // CHECK-FIXES: apply_2()
38 // CHECK-FIXES-NEXT: using namespace llvm;
39 // CHECK-FIXES-NEXT: llvm::Register Reg2 = getReg();
40 }
41
42 namespace llvm {
apply_3()43 void apply_3() {
44 unsigned Reg3 = getReg();
45 // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: variable 'Reg3' declared as 'unsigned int'; use 'Register' instead [llvm-prefer-register-over-unsigned]
46 // CHECK-FIXES: apply_3()
47 // CHECK-FIXES-NEXT: Register Reg3 = getReg();
48 }
49 } // end namespace llvm
50
done_1()51 void done_1() {
52 llvm::Register Reg1 = getReg();
53 // CHECK-FIXES: done_1()
54 // CHECK-FIXES-NEXT: llvm::Register Reg1 = getReg();
55 }
56
done_2()57 void done_2() {
58 using namespace llvm;
59 Register Reg2 = getReg();
60 // CHECK-FIXES: done_2()
61 // CHECK-FIXES-NEXT: using namespace llvm;
62 // CHECK-FIXES-NEXT: Register Reg2 = getReg();
63 }
64
65 namespace llvm {
done_3()66 void done_3() {
67 Register Reg3 = getReg();
68 // CHECK-FIXES: done_3()
69 // CHECK-FIXES-NEXT: Register Reg3 = getReg();
70 }
71 } // end namespace llvm
72
do_nothing_1()73 void do_nothing_1() {
74 unsigned Reg1 = getRegLike();
75 // CHECK-FIXES: do_nothing_1()
76 // CHECK-FIXES-NEXT: unsigned Reg1 = getRegLike();
77 }
78
do_nothing_2()79 void do_nothing_2() {
80 using namespace llvm;
81 unsigned Reg2 = getRegLike();
82 // CHECK-FIXES: do_nothing_2()
83 // CHECK-FIXES-NEXT: using namespace llvm;
84 // CHECK-FIXES-NEXT: unsigned Reg2 = getRegLike();
85 }
86
87 namespace llvm {
do_nothing_3()88 void do_nothing_3() {
89 unsigned Reg3 = getRegLike();
90 // CHECK-FIXES: do_nothing_3()
91 // CHECK-FIXES-NEXT: unsigned Reg3 = getRegLike();
92 }
93 } // end namespace llvm
94
95 void fn1(llvm::Register R);
do_nothing_4()96 void do_nothing_4() {
97 fn1(getReg());
98 // CHECK-FIXES: do_nothing_4()
99 // CHECK-FIXES-NEXT: fn1(getReg());
100 }
101
102 void fn2(unsigned R);
do_nothing_5()103 void do_nothing_5() {
104 fn2(getReg());
105 // CHECK-FIXES: do_nothing_5()
106 // CHECK-FIXES-NEXT: fn2(getReg());
107 }
108
do_nothing_6()109 void do_nothing_6() {
110 using namespace llvm;
111 Register Reg6{getReg()};
112 // CHECK-FIXES: do_nothing_6()
113 // CHECK-FIXES-NEXT: using namespace llvm;
114 // CHECK-FIXES-NEXT: Register Reg6{getReg()};
115 }
116
do_nothing_7()117 void do_nothing_7() {
118 using namespace llvm;
119 Register Reg7;
120 Reg7.Reg = getReg();
121 // CHECK-FIXES: do_nothing_7()
122 // CHECK-FIXES-NEXT: using namespace llvm;
123 // CHECK-FIXES-NEXT: Register Reg7;
124 // CHECK-FIXES-NEXT: Reg7.Reg = getReg();
125 }
126
do_nothing_8()127 void do_nothing_8() {
128 using namespace llvm;
129 RegisterLike Reg8{getReg()};
130 // CHECK-FIXES: do_nothing_8()
131 // CHECK-FIXES-NEXT: using namespace llvm;
132 // CHECK-FIXES-NEXT: RegisterLike Reg8{getReg()};
133 }
134
do_nothing_9()135 void do_nothing_9() {
136 using namespace llvm;
137 RegisterLike Reg9;
138 Reg9.Reg = getReg();
139 // CHECK-FIXES: do_nothing_9()
140 // CHECK-FIXES-NEXT: using namespace llvm;
141 // CHECK-FIXES-NEXT: RegisterLike Reg9;
142 // CHECK-FIXES-NEXT: Reg9.Reg = getReg();
143 }
144