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