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