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 Smithvoid 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 Friedmanvoid PR11601() { 410ffc31c5SEli Friedman void (*vv[])() = {PR11601, PR11601, PR11601}; 420ffc31c5SEli Friedman for (void (*i)() : vv) i(); 430ffc31c5SEli Friedman } 44