diff options
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp | 59 | ||||
| -rw-r--r-- | clang/test/SemaCXX/for-range-dereference.cpp | 6 |
2 files changed, 60 insertions, 5 deletions
diff --git a/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp b/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp index 473c8b62bad..f42fc9b6e5a 100644 --- a/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp +++ b/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp @@ -150,9 +150,9 @@ void g() { struct NoEnd { null_t begin(); }; - for (auto u : NoBegin()) { // expected-error {{range type 'NoBegin' has 'end' member but no 'begin' member}} + for (auto u : NoBegin()) { // expected-error {{no viable 'begin' function available}} } - for (auto u : NoEnd()) { // expected-error {{range type 'NoEnd' has 'begin' member but no 'end' member}} + for (auto u : NoEnd()) { // expected-error {{no viable 'end' function available}} } struct NoIncr { @@ -271,3 +271,58 @@ namespace rdar13712739 { template void foo(const int&); // expected-note{{in instantiation of function template specialization}} } + +namespace p0962r1 { + namespace NA { + struct A { + void begin(); + }; + int *begin(A); + int *end(A); + } + + namespace NB { + struct B { + void end(); + }; + int *begin(B); + int *end(B); + } + + namespace NC { + struct C { + void begin(); + }; + int *begin(C); + } + + namespace ND { + struct D { + void end(); + }; + int *end(D); + } + + namespace NE { + struct E { + void begin(); // expected-note {{member is not a candidate because range type 'p0962r1::NE::E' has no 'end' member}} + }; + int *end(E); + } + + namespace NF { + struct F { + void end(); // expected-note {{member is not a candidate because range type 'p0962r1::NF::F' has no 'begin' member}} + }; + int *begin(F); + } + + void use(NA::A a, NB::B b, NC::C c, ND::D d, NE::E e, NF::F f) { + for (auto x : a) {} + for (auto x : b) {} + for (auto x : c) {} // expected-error {{no viable 'end' function}} + for (auto x : d) {} // expected-error {{no viable 'begin' function}} + for (auto x : e) {} // expected-error {{no viable 'begin' function}} + for (auto x : f) {} // expected-error {{no viable 'end' function}} + } +} diff --git a/clang/test/SemaCXX/for-range-dereference.cpp b/clang/test/SemaCXX/for-range-dereference.cpp index 7377199024e..de4958c31bc 100644 --- a/clang/test/SemaCXX/for-range-dereference.cpp +++ b/clang/test/SemaCXX/for-range-dereference.cpp @@ -17,7 +17,7 @@ struct DeletedEnd : public T { struct DeletedADLBegin { }; int* begin(DeletedADLBegin) = delete; //expected-note {{candidate function has been explicitly deleted}} \ - expected-note 5 {{candidate function not viable: no known conversion}} + expected-note 6 {{candidate function not viable: no known conversion}} struct PrivateEnd { Data *begin(); @@ -27,7 +27,7 @@ struct PrivateEnd { }; struct ADLNoEnd { }; -Data * begin(ADLNoEnd); // expected-note 6 {{candidate function not viable: no known conversion}} +Data * begin(ADLNoEnd); // expected-note 7 {{candidate function not viable: no known conversion}} struct OverloadedStar { T operator*(); @@ -45,7 +45,7 @@ void f() { for (auto i : parr) { }// expected-error{{invalid range expression of type 'int (*)[10]'; did you mean to dereference it with '*'?}} NoBegin NB; - for (auto i : NB) { }// expected-error{{range type 'NoBegin' has 'end' member but no 'begin' member}} + for (auto i : NB) { }// expected-error{{invalid range expression of type 'NoBegin'; no viable 'begin' function available}} NoBegin *pNB; for (auto i : pNB) { }// expected-error{{invalid range expression of type 'NoBegin *'; no viable 'begin' function available}} NoBegin **ppNB; |

