1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlssonstruct T {
3e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson  void f();
4e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson};
5e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson
6e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlssonstruct A {
7e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson  T* operator->(); // expected-note{{candidate function}}
8e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson};
9e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson
10e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlssonstruct B {
11e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson  T* operator->(); // expected-note{{candidate function}}
12e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson};
13e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson
14e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlssonstruct C : A, B {
15e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson};
16e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson
17e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlssonstruct D : A { };
18e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson
197c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct E; // expected-note {{forward declaration of 'E'}}
20f43fb722f6bf048d548659ad326cfb1cfc14420bEli Friedman
21f43fb722f6bf048d548659ad326cfb1cfc14420bEli Friedmanvoid f(C &c, D& d, E& e) {
22e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson  c->f(); // expected-error{{use of overloaded operator '->' is ambiguous}}
23e30572ae31b4b1875d7a6d4375b5c6b3a1caf9e3Anders Carlsson  d->f();
24f43fb722f6bf048d548659ad326cfb1cfc14420bEli Friedman  e->f(); // expected-error{{incomplete definition of type}}
254fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar}
26df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidis
27df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidis// rdar://8875304
28df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidisnamespace rdar8875304 {
29df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidisclass Point {};
30df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidisclass Line_Segment{ public: Line_Segment(const Point&){} };
31df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidisclass Node { public: Point Location(){ Point p; return p; } };
32df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidis
33df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidisvoid f()
34df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidis{
35df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidis   Node** node1;
36df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidis   Line_Segment(node1->Location()); // expected-error {{not a structure or union}}
37df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidis}
38df8dc5d772d23bb760aeeda374c39001d12e4497Argyrios Kyrtzidis}
392b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
402b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
412b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrainnamespace arrow_suggest {
422b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
432b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhraintemplate <typename T>
442b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrainclass wrapped_ptr {
452b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain public:
462b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  wrapped_ptr(T* ptr) : ptr_(ptr) {}
472b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  T* operator->() { return ptr_; }
482b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  void Check(); // expected-note {{'Check' declared here}}
492b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain private:
502b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  T *ptr_;
512b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain};
522b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
532b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrainclass Worker {
542b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain public:
552b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  void DoSomething();
562b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  void Chuck();
572b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain};
582b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
592b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrainvoid test() {
602b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  wrapped_ptr<Worker> worker(new Worker);
612b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  worker.DoSomething(); // expected-error {{no member named 'DoSomething' in 'arrow_suggest::wrapped_ptr<arrow_suggest::Worker>'; did you mean to use '->' instead of '.'?}}
622b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  worker.DoSamething(); // expected-error {{no member named 'DoSamething' in 'arrow_suggest::wrapped_ptr<arrow_suggest::Worker>'}}
632b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  worker.Chuck(); // expected-error {{no member named 'Chuck' in 'arrow_suggest::wrapped_ptr<arrow_suggest::Worker>'; did you mean 'Check'?}}
642b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain}
652b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
662b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain} // namespace arrow_suggest
67