1 | // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 |
2 | // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++98 -Wno-c++11-extensions |
3 | |
4 | struct S { |
5 | int *begin(); |
6 | int *end(); |
7 | }; |
8 | |
9 | struct T { |
10 | }; |
11 | |
12 | struct Range {}; |
13 | int begin(Range); // expected-note {{not viable}} |
14 | int end(Range); |
15 | |
16 | namespace NS { |
17 | struct ADL {}; |
18 | struct iter { |
19 | int operator*(); |
20 | bool operator!=(iter); |
21 | void operator++(); |
22 | }; |
23 | iter begin(ADL); // expected-note {{not viable}} |
24 | iter end(ADL); |
25 | |
26 | struct NoADL {}; |
27 | } |
28 | NS::iter begin(NS::NoADL); // expected-note {{not viable}} |
29 | NS::iter end(NS::NoADL); |
30 | |
31 | void f() { |
32 | int a[] = {1, 2, 3}; |
33 | for (auto b : S()) {} // ok |
34 | for (auto b : T()) {} // expected-error {{invalid range expression of type 'T'}} |
35 | for (auto b : a) {} // ok |
36 | for (int b : NS::ADL()) {} // ok |
37 | for (int b : NS::NoADL()) {} // expected-error {{invalid range expression of type 'NS::NoADL'}} |
38 | } |
39 | |
40 | void PR11601() { |
41 | void (*vv[])() = {PR11601, PR11601, PR11601}; |
42 | for (void (*i)() : vv) i(); |
43 | } |
44 | |