1// RUN: %clang_cc1 -fsyntax-only -verify %s
2struct T {
3  void f();
4};
5
6struct A {
7  T* operator->(); // expected-note{{candidate function}}
8};
9
10struct B {
11  T* operator->(); // expected-note{{candidate function}}
12};
13
14struct C : A, B {
15};
16
17struct D : A { };
18
19struct E; // expected-note {{forward declaration of 'E'}}
20
21void f(C &c, D& d, E& e) {
22  c->f(); // expected-error{{use of overloaded operator '->' is ambiguous}}
23  d->f();
24  e->f(); // expected-error{{incomplete definition of type}}
25}
26
27// rdar://8875304
28namespace rdar8875304 {
29class Point {};
30class Line_Segment{ public: Line_Segment(const Point&){} };
31class Node { public: Point Location(){ Point p; return p; } };
32
33void f()
34{
35   Node** node1;
36   Line_Segment(node1->Location()); // expected-error {{not a structure or union}}
37}
38}
39
40
41namespace arrow_suggest {
42
43template <typename T>
44class wrapped_ptr {
45 public:
46  wrapped_ptr(T* ptr) : ptr_(ptr) {}
47  T* operator->() { return ptr_; }
48  void Check(); // expected-note {{'Check' declared here}}
49 private:
50  T *ptr_;
51};
52
53class Worker {
54 public:
55  void DoSomething();
56  void Chuck();
57};
58
59void test() {
60  wrapped_ptr<Worker> worker(new Worker);
61  worker.DoSomething(); // expected-error {{no member named 'DoSomething' in 'arrow_suggest::wrapped_ptr<arrow_suggest::Worker>'; did you mean to use '->' instead of '.'?}}
62  worker.DoSamething(); // expected-error {{no member named 'DoSamething' in 'arrow_suggest::wrapped_ptr<arrow_suggest::Worker>'}}
63  worker.Chuck(); // expected-error {{no member named 'Chuck' in 'arrow_suggest::wrapped_ptr<arrow_suggest::Worker>'; did you mean 'Check'?}}
64}
65
66} // namespace arrow_suggest
67