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*89a1d03eSRichard void 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