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