1 // Test for errors in range-based for loops
2 // with member begin/end
3 
4 // { dg-do compile { target c++11 } }
5 
6 struct container1
7 {
8     int *begin();
9     //no end
10 };
11 
12 struct container2
13 {
14     int *end();
15     //no begin
16 };
17 
18 struct container3
19 {
20 private:
21     int *begin(); // { dg-message "private" }
22     int *end(); // { dg-message "private" }
23 };
24 
25 struct container4
26 {
27     int *begin;
28     int *end;
29 };
30 
31 struct container5
32 {
33     typedef int *begin;
34     typedef int *end;
35 };
36 
37 struct callable
38 {
39     int *operator()();
40 };
41 
42 struct container6
43 {
44     callable begin;
45     callable end;
46 };
47 
48 struct container7
49 {
50     static callable begin;
51     static callable end;
52 };
53 
54 struct container8
55 {
56     static int *begin();
57     int *end();
58 };
59 
60 struct private_callable
61 {
62 private:
63     int *operator()(); // { dg-message "private" }
64 };
65 
66 struct container9
67 {
68     private_callable begin;
69     private_callable end;
70 };
71 
72 struct container10
73 {
74     typedef int *(*function)();
75 
76     function begin;
77     static function end;
78 };
79 
80 namespace N
81 {
begin(T & t)82 template<typename T> int *begin(T &t)
83 {
84     return 0;
85 }
end(T & t)86 template<typename T> int *end(T &t)
87 {
88     return 0;
89 }
90 struct container11
91 {
92     int *begin();
93     //no end
94 };
95 
96 struct container12
97 {
98     int *end();
99     //no begin
100 };
101 
102 struct container13
103 {
104 };
105 }
106 
test1()107 void test1()
108 {
109   for (int x : container1()); // { dg-error "'begin' was not declared|'end' was not declared" }
110   for (int x : container2()); // { dg-error "'begin' was not declared|'end' was not declared" }
111   for (int x : container3()); // { dg-error "within this context" }
112   for (int x : container4()); // { dg-error "cannot be used as a function" }
113   for (int x : container5()); // { dg-error "invalid use of" }
114   for (int x : container6());
115   for (int x : container7());
116   for (int x : container8());
117   for (int x : container9()); // { dg-error "within this context" }
118   for (int x : container10());
119   for (int x : N::container11());
120   for (int x : N::container12());
121   for (int x : N::container13());
122 }
123