annotate gcc/testsuite/g++.dg/cpp0x/range-for12.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // Test for range-based for loop with templates
kono
parents:
diff changeset
2 // and begin/end as member functions
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 // { dg-do run { target c++11 } }
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 /* Preliminary declarations */
kono
parents:
diff changeset
7 namespace pre
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 struct iterator
kono
parents:
diff changeset
10 {
kono
parents:
diff changeset
11 int x;
kono
parents:
diff changeset
12 explicit iterator (int v) :x(v) {}
kono
parents:
diff changeset
13 iterator &operator ++() { ++x; return *this; }
kono
parents:
diff changeset
14 int operator *() { return x; }
kono
parents:
diff changeset
15 bool operator != (const iterator &o) { return x != o.x; }
kono
parents:
diff changeset
16 };
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 struct container
kono
parents:
diff changeset
19 {
kono
parents:
diff changeset
20 int min, max;
kono
parents:
diff changeset
21 container(int a, int b) :min(a), max(b) {}
kono
parents:
diff changeset
22 iterator begin() const
kono
parents:
diff changeset
23 {
kono
parents:
diff changeset
24 return iterator(min);
kono
parents:
diff changeset
25 }
kono
parents:
diff changeset
26 iterator end() const
kono
parents:
diff changeset
27 {
kono
parents:
diff changeset
28 return iterator(max);
kono
parents:
diff changeset
29 }
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 };
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 } //namespace pre
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 using pre::container;
kono
parents:
diff changeset
36 extern "C" void abort(void);
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 container run_me_just_once()
kono
parents:
diff changeset
39 {
kono
parents:
diff changeset
40 static bool run = false;
kono
parents:
diff changeset
41 if (run)
kono
parents:
diff changeset
42 abort();
kono
parents:
diff changeset
43 run = true;
kono
parents:
diff changeset
44 return container(1,2);
kono
parents:
diff changeset
45 }
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 /* Template with dependent expression. */
kono
parents:
diff changeset
48 template<typename T> int test1(const T &r)
kono
parents:
diff changeset
49 {
kono
parents:
diff changeset
50 int t = 0;
kono
parents:
diff changeset
51 for (int i : r)
kono
parents:
diff changeset
52 t += i;
kono
parents:
diff changeset
53 return t;
kono
parents:
diff changeset
54 }
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 /* Template with non-dependent expression and dependent declaration. */
kono
parents:
diff changeset
57 template<typename T> int test2(const container &r)
kono
parents:
diff changeset
58 {
kono
parents:
diff changeset
59 int t = 0;
kono
parents:
diff changeset
60 for (T i : r)
kono
parents:
diff changeset
61 t += i;
kono
parents:
diff changeset
62 return t;
kono
parents:
diff changeset
63 }
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 /* Template with non-dependent expression (array) and dependent declaration. */
kono
parents:
diff changeset
66 template<typename T> int test2(const int (&r)[4])
kono
parents:
diff changeset
67 {
kono
parents:
diff changeset
68 int t = 0;
kono
parents:
diff changeset
69 for (T i : r)
kono
parents:
diff changeset
70 t += i;
kono
parents:
diff changeset
71 return t;
kono
parents:
diff changeset
72 }
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 /* Template with non-dependent expression and auto declaration. */
kono
parents:
diff changeset
75 template<typename T> int test3(const container &r)
kono
parents:
diff changeset
76 {
kono
parents:
diff changeset
77 int t = 0;
kono
parents:
diff changeset
78 for (auto i : r)
kono
parents:
diff changeset
79 t += i;
kono
parents:
diff changeset
80 return t;
kono
parents:
diff changeset
81 }
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 /* Template with non-dependent expression (array) and auto declaration. */
kono
parents:
diff changeset
84 template<typename T> int test3(const int (&r)[4])
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 int t = 0;
kono
parents:
diff changeset
87 for (auto i : r)
kono
parents:
diff changeset
88 t += i;
kono
parents:
diff changeset
89 return t;
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 int main ()
kono
parents:
diff changeset
93 {
kono
parents:
diff changeset
94 container c(1,5);
kono
parents:
diff changeset
95 int a[4] = {5,6,7,8};
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 for (auto x : run_me_just_once())
kono
parents:
diff changeset
98 ;
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 if (test1 (c) != 10)
kono
parents:
diff changeset
101 abort();
kono
parents:
diff changeset
102 if (test1 (a) != 26)
kono
parents:
diff changeset
103 abort();
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 if (test2<int> (c) != 10)
kono
parents:
diff changeset
106 abort();
kono
parents:
diff changeset
107 if (test2<int> (a) != 26)
kono
parents:
diff changeset
108 abort();
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 if (test3<int> (c) != 10)
kono
parents:
diff changeset
111 abort();
kono
parents:
diff changeset
112 if (test3<int> (a) != 26)
kono
parents:
diff changeset
113 abort();
kono
parents:
diff changeset
114 return 0;
kono
parents:
diff changeset
115 }