Viewing file: range-for4.C (1.98 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// Test for range-based for loop with templates
// { dg-do run { target c++11 } }
/* Preliminary declarations */ namespace pre { struct iterator { int x; iterator (int v) :x(v) {} iterator &operator ++() { ++x; return *this; } int operator *() { return x; } bool operator != (const iterator &o) { return x != o.x; } };
struct container { int min, max; container(int a, int b) :min(a), max(b) {} };
iterator begin(const container &c) { return iterator(c.min); }
iterator end(const container &c) { return iterator(c.max); }
} //namespace pre
using pre::container; extern "C" void abort(void);
container run_me_just_once() { static bool run = false; if (run) abort(); run = true; return container(1,2); }
/* Template with dependent expression. */ template<typename T> int test1(const T &r) { int t = 0; for (int i : r) t += i; return t; }
/* Template with non-dependent expression and dependent declaration. */ template<typename T> int test2(const container &r) { int t = 0; for (T i : r) t += i; return t; }
/* Template with non-dependent expression (array) and dependent declaration. */ template<typename T> int test2(const int (&r)[4]) { int t = 0; for (T i : r) t += i; return t; }
/* Template with non-dependent expression and auto declaration. */ template<typename T> int test3(const container &r) { int t = 0; for (auto i : r) t += i; return t; }
/* Template with non-dependent expression (array) and auto declaration. */ template<typename T> int test3(const int (&r)[4]) { int t = 0; for (auto i : r) t += i; return t; }
int main () { container c(1,5); int a[4] = {5,6,7,8};
for (auto x : run_me_just_once()) ;
if (test1 (c) != 10) abort(); if (test1 (a) != 26) abort();
if (test2<int> (c) != 10) abort(); if (test2<int> (a) != 26) abort();
if (test3<int> (c) != 10) abort(); if (test3<int> (a) != 26) abort(); return 0; }
|