// Test for range-based for loop with templates // and begin/end as member (non-)virtual functions // { dg-do run { target c++11 } } unsigned int g; struct A { virtual int *begin() { g |= 1; return 0; } int *end() { g |= 2; return 0; } }; struct B : A { virtual int *begin() { g |= 4; return 0; } int *end() { g |= 8; return 0; } }; extern "C" void abort(void); int main () { A a; B b; A &aa = b; g = 0; for (int x : a); if (g != (1 | 2)) abort(); g = 0; for (int x : b); if (g != (4 | 8)) abort(); g = 0; for (int x : aa); if (g != (4 | 2)) abort(); }