// 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 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 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 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 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 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 (c) != 10) abort(); if (test2 (a) != 26) abort(); if (test3 (c) != 10) abort(); if (test3 (a) != 26) abort(); return 0; }