1 // RUN: %libomp-cxx20-compile-and-run | FileCheck %s --match-full-lines
14 Reporter(const char *name
) : name(name
) { print("ctor"); }
16 Reporter() : name("<anon>") { print("ctor"); }
18 Reporter(const Reporter
&that
) : name(that
.name
) { print("copy ctor"); }
20 Reporter(Reporter
&&that
) : name(that
.name
) { print("move ctor"); }
22 ~Reporter() { print("dtor"); }
24 const Reporter
&operator=(const Reporter
&that
) {
26 this->name
= that
.name
;
30 const Reporter
&operator=(Reporter
&&that
) {
32 this->name
= that
.name
;
37 const Reporter
*owner
;
40 Iterator(const Reporter
*owner
, int pos
) : owner(owner
), pos(pos
) {}
42 Iterator(const Iterator
&that
) : owner(that
.owner
), pos(that
.pos
) {
43 owner
->print("iterator copy ctor");
46 Iterator(Iterator
&&that
) : owner(that
.owner
), pos(that
.pos
) {
47 owner
->print("iterator move ctor");
50 ~Iterator() { owner
->print("iterator dtor"); }
52 const Iterator
&operator=(const Iterator
&that
) {
53 owner
->print("iterator copy assign");
54 this->owner
= that
.owner
;
59 const Iterator
&operator=(Iterator
&&that
) {
60 owner
->print("iterator move assign");
61 this->owner
= that
.owner
;
66 bool operator==(const Iterator
&that
) const {
67 owner
->print("iterator %d == %d", 2 - this->pos
, 2 - that
.pos
);
68 return this->pos
== that
.pos
;
71 bool operator!=(const Iterator
&that
) const {
72 owner
->print("iterator %d != %d", 2 - this->pos
, 2 - that
.pos
);
73 return this->pos
!= that
.pos
;
76 Iterator
&operator++() {
77 owner
->print("iterator prefix ++");
82 Iterator
operator++(int) {
83 owner
->print("iterator postfix ++");
89 int operator*() const {
91 owner
->print("iterator deref: %i", result
);
95 size_t operator-(const Iterator
&that
) const {
96 int result
= (2 - this->pos
) - (2 - that
.pos
);
97 owner
->print("iterator distance: %d", result
);
101 Iterator
operator+(int steps
) const {
102 owner
->print("iterator advance: %i += %i", 2 - this->pos
, steps
);
103 return Iterator(owner
, pos
- steps
);
107 Iterator
begin() const {
109 return Iterator(this, 2);
112 Iterator
end() const {
114 return Iterator(this, -1);
117 void print(const char *msg
, ...) const {
120 printf("[%s] ", name
);
129 Reporter
range("range");
131 for (auto it
= range
.begin(); it
!= range
.end(); ++it
)
132 printf("v=%d\n", *it
);
140 // CHECK-NEXT: [range] ctor
141 // CHECK-NEXT: [range] begin()
142 // CHECK-NEXT: [range] begin()
143 // CHECK-NEXT: [range] end()
144 // CHECK-NEXT: [range] iterator distance: 3
145 // CHECK-NEXT: [range] iterator advance: 0 += 2
146 // CHECK-NEXT: [range] iterator move assign
147 // CHECK-NEXT: [range] iterator deref: 2
149 // CHECK-NEXT: [range] iterator dtor
150 // CHECK-NEXT: [range] iterator advance: 0 += 1
151 // CHECK-NEXT: [range] iterator move assign
152 // CHECK-NEXT: [range] iterator deref: 1
154 // CHECK-NEXT: [range] iterator dtor
155 // CHECK-NEXT: [range] iterator advance: 0 += 0
156 // CHECK-NEXT: [range] iterator move assign
157 // CHECK-NEXT: [range] iterator deref: 0
159 // CHECK-NEXT: [range] iterator dtor
160 // CHECK-NEXT: [range] iterator dtor
161 // CHECK-NEXT: [range] iterator dtor
163 // CHECK-NEXT: [range] iterator dtor
164 // CHECK-NEXT: [range] dtor