187ca6386SNathan James // RUN: %check_clang_tidy -std=c++20 %s modernize-use-ranges %t -- -- -I %S/Inputs/use-ranges/ 287ca6386SNathan James // RUN: %check_clang_tidy -std=c++23 %s modernize-use-ranges %t -check-suffixes=,CPP23 -- -I %S/Inputs/use-ranges/ 31038db6fSNathan James 41038db6fSNathan James // CHECK-FIXES: #include <algorithm> 51038db6fSNathan James // CHECK-FIXES-CPP23: #include <numeric> 61038db6fSNathan James // CHECK-FIXES: #include <ranges> 71038db6fSNathan James 887ca6386SNathan James #include "fake_std.h" 91038db6fSNathan James 101038db6fSNathan James void Positives() { 111038db6fSNathan James std::vector<int> I, J; 121038db6fSNathan James std::find(I.begin(), I.end(), 0); 131038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 141038db6fSNathan James // CHECK-FIXES: std::ranges::find(I, 0); 151038db6fSNathan James 161038db6fSNathan James std::find(I.cbegin(), I.cend(), 1); 171038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 181038db6fSNathan James // CHECK-FIXES: std::ranges::find(I, 1); 191038db6fSNathan James 201038db6fSNathan James std::find(std::begin(I), std::end(I), 2); 211038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 221038db6fSNathan James // CHECK-FIXES: std::ranges::find(I, 2); 231038db6fSNathan James 241038db6fSNathan James std::find(std::cbegin(I), std::cend(I), 3); 251038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 261038db6fSNathan James // CHECK-FIXES: std::ranges::find(I, 3); 271038db6fSNathan James 281038db6fSNathan James std::find(std::cbegin(I), I.cend(), 4); 291038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 301038db6fSNathan James // CHECK-FIXES: std::ranges::find(I, 4); 311038db6fSNathan James 321038db6fSNathan James std::reverse(I.begin(), I.end()); 331038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 341038db6fSNathan James // CHECK-FIXES: std::ranges::reverse(I); 351038db6fSNathan James 361038db6fSNathan James std::includes(I.begin(), I.end(), I.begin(), I.end()); 371038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 381038db6fSNathan James // CHECK-FIXES: std::ranges::includes(I, I); 391038db6fSNathan James 401038db6fSNathan James std::includes(I.begin(), I.end(), J.begin(), J.end()); 411038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 421038db6fSNathan James // CHECK-FIXES: std::ranges::includes(I, J); 431038db6fSNathan James 441038db6fSNathan James std::is_permutation(I.begin(), I.end(), J.begin(), J.end()); 451038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 461038db6fSNathan James // CHECK-FIXES: std::ranges::is_permutation(I, J); 471038db6fSNathan James 481038db6fSNathan James std::equal(I.begin(), I.end(), J.begin(), J.end()); 491038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 501038db6fSNathan James // CHECK-FIXES: std::ranges::equal(I, J); 511038db6fSNathan James 521038db6fSNathan James std::equal(I.begin(), I.end(), J.begin(), J.end(), [](int a, int b){ return a == b; }); 531038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 541038db6fSNathan James // CHECK-FIXES: std::ranges::equal(I, J, [](int a, int b){ return a == b; }); 551038db6fSNathan James 561038db6fSNathan James std::iota(I.begin(), I.end(), 0); 571038db6fSNathan James // CHECK-MESSAGES-CPP23: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 581038db6fSNathan James // CHECK-FIXES-CPP23: std::ranges::iota(I, 0); 591038db6fSNathan James 60*77b2c681SNathan James std::rotate(I.begin(), I.begin() + 2, I.end()); 61*77b2c681SNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 62*77b2c681SNathan James // CHECK-FIXES: std::ranges::rotate(I, I.begin() + 2); 63*77b2c681SNathan James 641038db6fSNathan James using std::find; 651038db6fSNathan James namespace my_std = std; 661038db6fSNathan James 671038db6fSNathan James // Potentially these could be updated to better qualify the replaced function name 681038db6fSNathan James find(I.begin(), I.end(), 5); 691038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 701038db6fSNathan James // CHECK-FIXES: std::ranges::find(I, 5); 711038db6fSNathan James 721038db6fSNathan James my_std::find(I.begin(), I.end(), 6); 731038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 741038db6fSNathan James // CHECK-FIXES: std::ranges::find(I, 6); 751038db6fSNathan James } 761038db6fSNathan James 771038db6fSNathan James void Reverse(){ 781038db6fSNathan James std::vector<int> I, J; 791038db6fSNathan James std::find(I.rbegin(), I.rend(), 0); 801038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 8187ca6386SNathan James // CHECK-FIXES: std::ranges::find(std::ranges::reverse_view(I), 0); 821038db6fSNathan James 831038db6fSNathan James std::equal(std::rbegin(I), std::rend(I), J.begin(), J.end()); 841038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 8587ca6386SNathan James // CHECK-FIXES: std::ranges::equal(std::ranges::reverse_view(I), J); 861038db6fSNathan James 871038db6fSNathan James std::equal(I.begin(), I.end(), std::crbegin(J), std::crend(J)); 881038db6fSNathan James // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use a ranges version of this algorithm 8987ca6386SNathan James // CHECK-FIXES: std::ranges::equal(I, std::ranges::reverse_view(J)); 901038db6fSNathan James } 911038db6fSNathan James 921038db6fSNathan James void Negatives() { 931038db6fSNathan James std::vector<int> I, J; 941038db6fSNathan James std::find(I.begin(), J.end(), 0); 951038db6fSNathan James std::find(I.begin(), I.begin(), 0); 961038db6fSNathan James std::find(I.end(), I.begin(), 0); 971038db6fSNathan James 981038db6fSNathan James 991038db6fSNathan James // Need both ranges for this one 1001038db6fSNathan James std::is_permutation(I.begin(), I.end(), J.begin()); 1011038db6fSNathan James 1021038db6fSNathan James // We only have one valid match here and the ranges::equal function needs 2 complete ranges 1031038db6fSNathan James std::equal(I.begin(), I.end(), J.begin()); 1041038db6fSNathan James std::equal(I.begin(), I.end(), J.end(), J.end()); 1051038db6fSNathan James std::equal(std::rbegin(I), std::rend(I), std::rend(J), std::rbegin(J)); 1061038db6fSNathan James std::equal(I.begin(), J.end(), I.begin(), I.end()); 107*77b2c681SNathan James 108*77b2c681SNathan James // std::rotate expects the full range in the 1st and 3rd argument. 109*77b2c681SNathan James // Anyone writing this code has probably written a bug, but this isn't the 110*77b2c681SNathan James // purpose of this check. 111*77b2c681SNathan James std::rotate(I.begin(), I.end(), I.begin() + 2); 112*77b2c681SNathan James // Pathological, but probably shouldn't diagnose this 113*77b2c681SNathan James std::rotate(I.begin(), I.end(), I.end() + 0); 1141038db6fSNathan James } 115