1 // Test for range-based for loop with templates 2 // and begin/end as member (non-)virtual functions 3 4 // { dg-do run } 5 // { dg-options "-std=c++0x" } 6 7 unsigned int g; 8 9 struct A 10 { beginA11 virtual int *begin() 12 { 13 g |= 1; 14 return 0; 15 } endA16 int *end() 17 { 18 g |= 2; 19 return 0; 20 } 21 }; 22 23 struct B : A 24 { beginB25 virtual int *begin() 26 { 27 g |= 4; 28 return 0; 29 } endB30 int *end() 31 { 32 g |= 8; 33 return 0; 34 } 35 }; 36 37 extern "C" void abort(void); 38 main()39int main () 40 { 41 A a; 42 B b; 43 A &aa = b; 44 45 g = 0; 46 for (int x : a); 47 if (g != (1 | 2)) 48 abort(); 49 50 g = 0; 51 for (int x : b); 52 if (g != (4 | 8)) 53 abort(); 54 55 g = 0; 56 for (int x : aa); 57 if (g != (4 | 2)) 58 abort(); 59 } 60