1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor
586f194083504938df72135b5b66bf0c5cafd9498Douglas Gregorclass X{
686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregorpublic:
7b0fd483ad64865cc0233981cfddc36a7c9795e5eDouglas Gregor  enum E {Enumerator}; // expected-note 2{{declared here}}
886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  int f();
986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  static int mem;
1086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  static float g();
1186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor};
1286f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor
1386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregorvoid test(X* xp, X x) {
1486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  int i1 = x.f();
1586f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  int i2 = xp->f();
16b0fd483ad64865cc0233981cfddc36a7c9795e5eDouglas Gregor  x.E; // expected-error{{cannot refer to type member 'E' in 'X' with '.'}}
17b0fd483ad64865cc0233981cfddc36a7c9795e5eDouglas Gregor  xp->E; // expected-error{{cannot refer to type member 'E' in 'X' with '->'}}
1876f7d287020a0b4996d6e9d3968d5bd9a39f7d84Douglas Gregor  int i3 = x.Enumerator;
1976f7d287020a0b4996d6e9d3968d5bd9a39f7d84Douglas Gregor  int i4 = xp->Enumerator;
2086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  x.mem = 1;
2186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  xp->mem = 2;
2286f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  float f1 = x.g();
2386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  float f2 = xp->g();
2486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor}
25214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregor
26214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregorstruct A {
27214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregor int f0;
28214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregor};
29214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregorstruct B {
30214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregor A *f0();
31214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregor};
32214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregorint f0(B *b) {
336dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  return b->f0->f0; // expected-error{{did you mean to call it with no arguments}}
34214f31a347d7824eb92e6a3f5dce4d4047fd5ae0Douglas Gregor}
358d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregor
368d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregorint i;
378d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregor
388d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregornamespace C {
398d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregor  int i;
408d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregor}
418d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregor
428d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregorvoid test2(X *xp) {
438d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregor  xp->::i = 7; // expected-error{{qualified member access refers to a member in the global namespace}}
448d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregor  xp->C::i = 7; // expected-error{{qualified member access refers to a member in namespace 'C'}}
458d1c9ae5d27c5190a7793f7ac1224a70cd3df33fDouglas Gregor}
46b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall
47b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall
48b1b425648c4968824a3ef706b8c0ca35e88e8846John McCallnamespace test3 {
49b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall  struct NamespaceDecl;
50b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall
51b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall  struct NamedDecl {
52b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall    void *getIdentifier() const;
53b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall  };
54b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall
55b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall  struct NamespaceDecl : NamedDecl {
56b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall    bool isAnonymousNamespace() const {
57b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall      return !getIdentifier();
58b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall    }
59b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall  };
60b1b425648c4968824a3ef706b8c0ca35e88e8846John McCall}
612b147f072b118607aafafd2f05843243abfe4488Douglas Gregor
622b147f072b118607aafafd2f05843243abfe4488Douglas Gregornamespace test4 {
632b147f072b118607aafafd2f05843243abfe4488Douglas Gregor  class X {
642b147f072b118607aafafd2f05843243abfe4488Douglas Gregor  protected:
652b147f072b118607aafafd2f05843243abfe4488Douglas Gregor    template<typename T> void f(T);
662b147f072b118607aafafd2f05843243abfe4488Douglas Gregor  };
672b147f072b118607aafafd2f05843243abfe4488Douglas Gregor
682b147f072b118607aafafd2f05843243abfe4488Douglas Gregor  class Y : public X {
692b147f072b118607aafafd2f05843243abfe4488Douglas Gregor  public:
702b147f072b118607aafafd2f05843243abfe4488Douglas Gregor    using X::f;
712b147f072b118607aafafd2f05843243abfe4488Douglas Gregor  };
722b147f072b118607aafafd2f05843243abfe4488Douglas Gregor
732b147f072b118607aafafd2f05843243abfe4488Douglas Gregor  void test_f(Y y) {
742b147f072b118607aafafd2f05843243abfe4488Douglas Gregor    y.f(17);
752b147f072b118607aafafd2f05843243abfe4488Douglas Gregor  }
762b147f072b118607aafafd2f05843243abfe4488Douglas Gregor}
77ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall
78ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCallnamespace test5 {
79ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall  struct A {
80ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall    template <class T> void foo();
81ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall  };
82ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall
83ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall  void test0(int x) {
84c14e6dda1e1287d3e0aeaa0e8f7bb2c9126f312cKaelyn Uhrain    x.A::foo<int>(); // expected-error {{'int' is not a structure or union}}
85ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall  }
86ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall
87ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall  void test1(A *x) {
88c14e6dda1e1287d3e0aeaa0e8f7bb2c9126f312cKaelyn Uhrain    x.A::foo<int>(); // expected-error {{'test5::A *' is a pointer}}
89ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall  }
90ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall
91ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall  void test2(A &x) {
9258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    x->A::foo<int>(); // expected-error {{'test5::A' is not a pointer; did you mean to use '.'?}}
93ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall  }
94ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall}
9512eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregor
9612eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregornamespace PR7508 {
9712eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregor  struct A {
9812eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregor    struct CleanupScope {};
99e4c7f90da208ed2caeab784b32f416a50eed8da3Kaelyn Uhrain    void PopCleanupBlock(); // expected-note{{'PopCleanupBlock' declared here}}
10012eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregor  };
10112eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregor
10212eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregor  void foo(A &a) {
103e4c7f90da208ed2caeab784b32f416a50eed8da3Kaelyn Uhrain    a.PopCleanupScope(); // expected-error{{no member named 'PopCleanupScope' in 'PR7508::A'; did you mean 'PopCleanupBlock'?}}
10412eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregor  }
10512eb5d6aa882eb247a6c22225b625eee04217105Douglas Gregor}
1069d4bb946269303996edadffce642301bee87a62fDouglas Gregor
1079d4bb946269303996edadffce642301bee87a62fDouglas Gregornamespace rdar8231724 {
1089d4bb946269303996edadffce642301bee87a62fDouglas Gregor  namespace N {
1099d4bb946269303996edadffce642301bee87a62fDouglas Gregor    template<typename T> struct X1;
1109d4bb946269303996edadffce642301bee87a62fDouglas Gregor    int i;
1119d4bb946269303996edadffce642301bee87a62fDouglas Gregor  }
1129d4bb946269303996edadffce642301bee87a62fDouglas Gregor
1139d4bb946269303996edadffce642301bee87a62fDouglas Gregor  struct X { };
1149d4bb946269303996edadffce642301bee87a62fDouglas Gregor  struct Y : X { };
1159d4bb946269303996edadffce642301bee87a62fDouglas Gregor
116d6537015745128064dc12fcc06af65372dfd5da9Richard Smith  template<typename T> struct Z { int n; };
117d6537015745128064dc12fcc06af65372dfd5da9Richard Smith
1189d4bb946269303996edadffce642301bee87a62fDouglas Gregor  void f(Y *y) {
1199d4bb946269303996edadffce642301bee87a62fDouglas Gregor    y->N::X1<int>; // expected-error{{'rdar8231724::N::X1' is not a member of class 'rdar8231724::Y'}}
120d6537015745128064dc12fcc06af65372dfd5da9Richard Smith    y->Z<int>::n; // expected-error{{'rdar8231724::Z<int>::n' is not a member of class 'rdar8231724::Y'}}
121a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    y->template Z<int>::n; // expected-error{{'rdar8231724::Z<int>::n' is not a member of class 'rdar8231724::Y'}}
122a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#if __cplusplus <= 199711L // C++03 or earlier modes
123a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    // expected-warning@-2{{'template' keyword outside of a template}}
124a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#endif
1259d4bb946269303996edadffce642301bee87a62fDouglas Gregor  }
1269d4bb946269303996edadffce642301bee87a62fDouglas Gregor}
12726ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gay
12826ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gaynamespace PR9025 {
12926ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gay  struct S { int x; };
1306dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  S fun(); // expected-note{{possible target for call}}
1316dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  int fun(int i); // expected-note{{possible target for call}}
13226ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gay  int g() {
1336dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    return fun.x; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}}
13426ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gay  }
13526ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gay
1366dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  S fun2(); // expected-note{{possible target for call}}
1376dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  S fun2(int i); // expected-note{{possible target for call}}
13826ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gay  int g2() {
1396dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    return fun2.x; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}}
14026ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gay  }
14165b34d7bc314c7d4b448164e1a889311bd30b375Matt Beaumont-Gay
1426dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  S fun3(int i=0); // expected-note{{possible target for call}}
1436dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  int fun3(int i, int j); // expected-note{{possible target for call}}
14465b34d7bc314c7d4b448164e1a889311bd30b375Matt Beaumont-Gay  int g3() {
1456dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    return fun3.x; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}}
14665b34d7bc314c7d4b448164e1a889311bd30b375Matt Beaumont-Gay  }
147fbe599465021a37b2275af93466064ba08c06a68Matt Beaumont-Gay
1486dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  template <typename T> S fun4(); // expected-note{{possible target for call}}
149fbe599465021a37b2275af93466064ba08c06a68Matt Beaumont-Gay  int g4() {
1506dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    return fun4.x; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it?}}
151fbe599465021a37b2275af93466064ba08c06a68Matt Beaumont-Gay  }
152c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
1536dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  S fun5(int i); // expected-note{{possible target for call}}
1546dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  S fun5(float f); // expected-note{{possible target for call}}
155c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  int g5() {
1566dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    return fun5.x; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it?}}
157c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
15826ae5dd9cfc561527eca418571323d90589a4b92Matt Beaumont-Gay}
159059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman
160059d578c7d45f687a81bcc97ab80404256a5287fEli Friedmannamespace FuncInMemberExpr {
161059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman  struct Vec { int size(); };
162059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman  Vec fun1();
163059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman  int test1() { return fun1.size(); } // expected-error {{base of member reference is a function; perhaps you meant to call it with no arguments}}
164059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman  Vec *fun2();
165059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman  int test2() { return fun2->size(); } // expected-error {{base of member reference is a function; perhaps you meant to call it with no arguments}}
166059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman  Vec fun3(int x = 0);
167059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman  int test3() { return fun3.size(); } // expected-error {{base of member reference is a function; perhaps you meant to call it with no arguments}}
168059d578c7d45f687a81bcc97ab80404256a5287fEli Friedman}
1697d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gay
1707d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gaynamespace DotForSemiTypo {
1717d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gayvoid f(int i) {
1727d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gay  // If the programmer typo'd '.' for ';', make sure we point at the '.' rather
1737d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gay  // than the "field name" (whatever the first token on the next line happens to
1747d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gay  // be).
1757d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gay  int j = i. // expected-error {{member reference base type 'int' is not a structure or union}}
1767d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gay  j = 0;
1777d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gay}
1787d90fe5a941efc106237d23badec816ed65e267fMatt Beaumont-Gay}
179d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain
180d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrainnamespace PR15045 {
181d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain  class Cl0 {
182d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain  public:
183d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain    int a;
184d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain  };
185d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain
186d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain  int f() {
187d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain    Cl0 c;
18858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return c->a;  // expected-error {{member reference type 'PR15045::Cl0' is not a pointer; did you mean to use '.'?}}
189baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain  }
190baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain
191baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain  struct bar {
192baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    void func();  // expected-note {{'func' declared here}}
193baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain  };
194baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain
195baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain  struct foo {
196baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    bar operator->();  // expected-note 2 {{'->' applied to return value of the operator->() declared here}}
197baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain  };
198baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain
199baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain  template <class T> void call_func(T t) {
200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    t->func();  // expected-error-re 2 {{member reference type 'PR15045::bar' is not a pointer{{$}}}} \
201baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain                // expected-note {{did you mean to use '.' instead?}}
202baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain  }
203baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain
204baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain  void test_arrow_on_non_pointer_records() {
205baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    bar e;
206baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    foo f;
207baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain
208baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    // Show that recovery has happened by also triggering typo correction
20958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    e->Func();  // expected-error {{member reference type 'PR15045::bar' is not a pointer; did you mean to use '.'?}} \
210baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain                // expected-error {{no member named 'Func' in 'PR15045::bar'; did you mean 'func'?}}
211baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain
212baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    // Make sure a fixit isn't given in the case that the '->' isn't actually
213baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    // the problem (the problem is with the return value of an operator->).
214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    f->func();  // expected-error-re {{member reference type 'PR15045::bar' is not a pointer{{$}}}}
215baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain
216baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    call_func(e);  // expected-note {{in instantiation of function template specialization 'PR15045::call_func<PR15045::bar>' requested here}}
217baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain
218baaeb85f07640794f6a4fabb871e33deeab07df2Kaelyn Uhrain    call_func(f);  // expected-note {{in instantiation of function template specialization 'PR15045::call_func<PR15045::foo>' requested here}}
219d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain  }
220d4224347be04594788fc0f26dff7d2c2cc90851eKaelyn Uhrain}
221f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewycky
222f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewyckynamespace pr16676 {
223f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewycky  struct S { int i; };
224f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewycky  struct T { S* get_s(); };
225f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewycky  int f(S* s) {
226f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewycky    T t;
227f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewycky    return t.get_s  // expected-error {{reference to non-static member function must be called; did you mean to call it with no arguments?}}
22858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar        .i;  // expected-error {{member reference type 'pr16676::S *' is a pointer; did you mean to use '->'}}
229f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewycky  }
230f96df620402f41ce9f1a97c0d286c2b42637d5b9Nick Lewycky}
231