1e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerstruct Data { }; 3e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerstruct T { 4e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer Data *begin(); 5e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer Data *end(); 6e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer}; 7e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 8e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerstruct NoBegin { 9e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer Data *end(); 10e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer}; 11e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 12e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerstruct DeletedEnd : public T { 13e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer Data *begin(); 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Data *end() = delete; //expected-note {{'end' has been explicitly marked deleted here}} 15e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer}; 16e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 17e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerstruct DeletedADLBegin { }; 18e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 19e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerint* begin(DeletedADLBegin) = delete; //expected-note {{candidate function has been explicitly deleted}} \ 208b533d97e0683a0c87096b95927a2e9ce02243d4Richard Smith expected-note 5 {{candidate function not viable: no known conversion}} 21e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 22e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerstruct PrivateEnd { 23e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer Data *begin(); 24e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 25e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer private: 268b533d97e0683a0c87096b95927a2e9ce02243d4Richard Smith Data *end(); // expected-note 2 {{declared private here}} 27e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer}; 28e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 29e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerstruct ADLNoEnd { }; 308b533d97e0683a0c87096b95927a2e9ce02243d4Richard SmithData * begin(ADLNoEnd); // expected-note 6 {{candidate function not viable: no known conversion}} 31e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 32e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerstruct OverloadedStar { 33e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer T operator*(); 34e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer}; 35e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 36e1715b66a878bcab315513351e5df68bfc010d2eSam Panzervoid f() { 37e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer T t; 38e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : t) { } 39e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer T *pt; 40e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : pt) { } // expected-error{{invalid range expression of type 'T *'; did you mean to dereference it with '*'?}} 41e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 42e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer int arr[10]; 43e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : arr) { } 44e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer int (*parr)[10]; 45e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : parr) { }// expected-error{{invalid range expression of type 'int (*)[10]'; did you mean to dereference it with '*'?}} 46e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 47e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer NoBegin NB; 48e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : NB) { }// expected-error{{range type 'NoBegin' has 'end' member but no 'begin' member}} 49e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer NoBegin *pNB; 50e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : pNB) { }// expected-error{{invalid range expression of type 'NoBegin *'; no viable 'begin' function available}} 51e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer NoBegin **ppNB; 52e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : ppNB) { }// expected-error{{invalid range expression of type 'NoBegin **'; no viable 'begin' function available}} 53e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer NoBegin *****pppppNB; 54e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : pppppNB) { }// expected-error{{invalid range expression of type 'NoBegin *****'; no viable 'begin' function available}} 55e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 56e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer ADLNoEnd ANE; 57e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : ANE) { } // expected-error{{invalid range expression of type 'ADLNoEnd'; no viable 'end' function available}} 58e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer ADLNoEnd *pANE; 59e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : pANE) { } // expected-error{{invalid range expression of type 'ADLNoEnd *'; no viable 'begin' function available}} 60e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 61e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer DeletedEnd DE; 62e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : DE) { } // expected-error{{attempt to use a deleted function}} \ 63e1715b66a878bcab315513351e5df68bfc010d2eSam Panzerexpected-note {{when looking up 'end' function for range expression of type 'DeletedEnd'}} 64e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer DeletedEnd *pDE; 65e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 66e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : pDE) { } // expected-error {{invalid range expression of type 'DeletedEnd *'; no viable 'begin' function available}} 67e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 68e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer PrivateEnd PE; 69e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer // FIXME: This diagnostic should be improved, as it does not specify that 70e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer // the range is invalid. 71e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : PE) { } // expected-error{{'end' is a private member of 'PrivateEnd'}} 72e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 73e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer PrivateEnd *pPE; 74e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : pPE) { }// expected-error {{invalid range expression of type 'PrivateEnd *'}} 758b533d97e0683a0c87096b95927a2e9ce02243d4Richard Smith // expected-error@-1 {{'end' is a private member of 'PrivateEnd'}} 76e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 77e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer DeletedADLBegin DAB; 78e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : DAB) { } // expected-error {{call to deleted function 'begin'}}\ 79e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer expected-note {{when looking up 'begin' function for range expression of type 'DeletedADLBegin'}} 80e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 81e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer OverloadedStar OS; 82e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : *OS) { } 83e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer 84e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer for (auto i : OS) { } // expected-error {{invalid range expression of type 'OverloadedStar'; did you mean to dereference it with '*'?}} 858b533d97e0683a0c87096b95927a2e9ce02243d4Richard Smith 868b533d97e0683a0c87096b95927a2e9ce02243d4Richard Smith for (Data *p : pt) { } // expected-error {{invalid range expression of type 'T *'; did you mean to dereference it with '*'?}} 878b533d97e0683a0c87096b95927a2e9ce02243d4Richard Smith // expected-error@-1 {{no viable conversion from 'Data' to 'Data *'}} 888b533d97e0683a0c87096b95927a2e9ce02243d4Richard Smith // expected-note@4 {{selected 'begin' function with iterator type 'Data *'}} 89e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer} 90