annotate gcc/testsuite/g++.dg/cpp0x/range-for4.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +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
kono
parents:
diff changeset
3 // { dg-do run { target c++11 } }
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 /* Preliminary declarations */
kono
parents:
diff changeset
6 namespace pre
kono
parents:
diff changeset
7 {
kono
parents:
diff changeset
8 struct iterator
kono
parents:
diff changeset
9 {
kono
parents:
diff changeset
10 int x;
kono
parents:
diff changeset
11 iterator (int v) :x(v) {}
kono
parents:
diff changeset
12 iterator &operator ++() { ++x; return *this; }
kono
parents:
diff changeset
13 int operator *() { return x; }
kono
parents:
diff changeset
14 bool operator != (const iterator &o) { return x != o.x; }
kono
parents:
diff changeset
15 };
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 struct container
kono
parents:
diff changeset
18 {
kono
parents:
diff changeset
19 int min, max;
kono
parents:
diff changeset
20 container(int a, int b) :min(a), max(b) {}
kono
parents:
diff changeset
21 };
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 iterator begin(const container &c)
kono
parents:
diff changeset
24 {
kono
parents:
diff changeset
25 return iterator(c.min);
kono
parents:
diff changeset
26 }
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 iterator end(const container &c)
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 return iterator(c.max);
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 }