xref: /llvm-project/clang/test/SemaCXX/for-range-no-std.cpp (revision 0f38443616f503f6c1f86e4f3ec9255a91058306)
19ca5c425SRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
2cc5f8f0dSDavid Blaikie // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++98 -Wno-c++11-extensions
302e85f3bSRichard Smith 
402e85f3bSRichard Smith struct S {
502e85f3bSRichard Smith   int *begin();
602e85f3bSRichard Smith   int *end();
702e85f3bSRichard Smith };
802e85f3bSRichard Smith 
902e85f3bSRichard Smith struct T {
1002e85f3bSRichard Smith };
1102e85f3bSRichard Smith 
1202e85f3bSRichard Smith struct Range {};
1302e85f3bSRichard Smith int begin(Range); // expected-note {{not viable}}
1402e85f3bSRichard Smith int end(Range);
1502e85f3bSRichard Smith 
1602e85f3bSRichard Smith namespace NS {
1702e85f3bSRichard Smith   struct ADL {};
1802e85f3bSRichard Smith   struct iter {
1902e85f3bSRichard Smith     int operator*();
2002e85f3bSRichard Smith     bool operator!=(iter);
2102e85f3bSRichard Smith     void operator++();
2202e85f3bSRichard Smith   };
2302e85f3bSRichard Smith   iter begin(ADL); // expected-note {{not viable}}
2402e85f3bSRichard Smith   iter end(ADL);
2502e85f3bSRichard Smith 
2602e85f3bSRichard Smith   struct NoADL {};
2702e85f3bSRichard Smith }
2802e85f3bSRichard Smith NS::iter begin(NS::NoADL); // expected-note {{not viable}}
2902e85f3bSRichard Smith NS::iter end(NS::NoADL);
3002e85f3bSRichard Smith 
f()3102e85f3bSRichard Smith void f() {
3202e85f3bSRichard Smith   int a[] = {1, 2, 3};
3302e85f3bSRichard Smith   for (auto b : S()) {} // ok
34*0f384436SSam Panzer   for (auto b : T()) {} // expected-error {{invalid range expression of type 'T'}}
3502e85f3bSRichard Smith   for (auto b : a) {} // ok
3602e85f3bSRichard Smith   for (int b : NS::ADL()) {} // ok
37*0f384436SSam Panzer   for (int b : NS::NoADL()) {} // expected-error {{invalid range expression of type 'NS::NoADL'}}
3802e85f3bSRichard Smith }
390ffc31c5SEli Friedman 
PR11601()400ffc31c5SEli Friedman void PR11601() {
410ffc31c5SEli Friedman   void (*vv[])() = {PR11601, PR11601, PR11601};
420ffc31c5SEli Friedman   for (void (*i)() : vv) i();
430ffc31c5SEli Friedman }
44