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