1*89a1d03eSRichard // RUN: %check_clang_tidy -std=c++20 %s modernize-loop-convert %t -- -- -I %S/Inputs/loop-convert 2*89a1d03eSRichard 3*89a1d03eSRichard namespace std { 4*89a1d03eSRichard struct strong_ordering { 5*89a1d03eSRichard int n; operator intstd::strong_ordering6*89a1d03eSRichard constexpr operator int() const { return n; } 7*89a1d03eSRichard static const strong_ordering equal, greater, less; 8*89a1d03eSRichard }; 9*89a1d03eSRichard constexpr strong_ordering strong_ordering::equal = {0}; 10*89a1d03eSRichard constexpr strong_ordering strong_ordering::greater = {1}; 11*89a1d03eSRichard constexpr strong_ordering strong_ordering::less = {-1}; 12*89a1d03eSRichard } // namespace std 13*89a1d03eSRichard 14*89a1d03eSRichard struct HasSpaceshipMem { 15*89a1d03eSRichard typedef int value_type; 16*89a1d03eSRichard 17*89a1d03eSRichard struct iterator { 18*89a1d03eSRichard value_type &operator*(); 19*89a1d03eSRichard const value_type &operator*() const; 20*89a1d03eSRichard iterator &operator++(); 21*89a1d03eSRichard void insert(value_type); 22*89a1d03eSRichard value_type X; 23*89a1d03eSRichard constexpr auto operator<=>(const HasSpaceshipMem::iterator &) const = default; 24*89a1d03eSRichard }; 25*89a1d03eSRichard 26*89a1d03eSRichard iterator begin(); 27*89a1d03eSRichard iterator end(); 28*89a1d03eSRichard }; 29*89a1d03eSRichard 30*89a1d03eSRichard struct OpEqOnly { 31*89a1d03eSRichard typedef int value_type; 32*89a1d03eSRichard struct iterator { 33*89a1d03eSRichard value_type &operator*(); 34*89a1d03eSRichard const value_type &operator*() const; 35*89a1d03eSRichard iterator &operator++(); 36*89a1d03eSRichard bool operator==(const iterator &other) const; 37*89a1d03eSRichard void insert(value_type); 38*89a1d03eSRichard value_type X; 39*89a1d03eSRichard }; 40*89a1d03eSRichard iterator begin(); 41*89a1d03eSRichard iterator end(); 42*89a1d03eSRichard }; 43*89a1d03eSRichard rewritten()44*89a1d03eSRichardvoid rewritten() { 45*89a1d03eSRichard OpEqOnly Oeo; 46*89a1d03eSRichard for (OpEqOnly::iterator It = Oeo.begin(), E = Oeo.end(); It != E; ++It) { 47*89a1d03eSRichard (void)*It; 48*89a1d03eSRichard } 49*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead 50*89a1d03eSRichard // CHECK-FIXES: for (int & It : Oeo) 51*89a1d03eSRichard // CHECK-FIXES-NEXT: (void)It; 52*89a1d03eSRichard 53*89a1d03eSRichard HasSpaceshipMem Hsm; 54*89a1d03eSRichard for (HasSpaceshipMem::iterator It = Hsm.begin(), E = Hsm.end(); It != E; ++It) { 55*89a1d03eSRichard (void)*It; 56*89a1d03eSRichard } 57*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead 58*89a1d03eSRichard // CHECK-FIXES: for (int & It : Hsm) 59*89a1d03eSRichard // CHECK-FIXES-NEXT: (void)It; 60*89a1d03eSRichard } 61