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