1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
22988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor// PR clang/3175
32988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor
42988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregorvoid bar(int*);
52988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor
62988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregorclass c {
72988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor  int var;
82988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor  static int svar;
92988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor  void foo() {
102988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor    bar(&var);
112988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor    bar(&svar);
122988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor  }
132988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor
142988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor  static void wibble() {
152988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor    bar(&var); // expected-error{{invalid use of member 'var' in static member function}}
162988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor    bar(&svar);
172988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor  }
182988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor};
192988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor
202988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregorenum E {
212988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor  Enumerator
222988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor};
232988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor
242988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregorvoid test() {
253fa3feab35096b608f1d79bb541798b37a55e7b9Richard Smith  (void)&Enumerator; // expected-error{{cannot take the address of an rvalue of type 'E'}}
262988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor}
272988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor
282988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregortemplate<int N>
292988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregorvoid test2() {
303fa3feab35096b608f1d79bb541798b37a55e7b9Richard Smith  (void)&N; // expected-error{{cannot take the address of an rvalue of type 'int'}}
312988205cb3d00286fa3f32ae242f6738da9060d1Douglas Gregor}
326fea8d2e42a53a1c03e2e1ced68dda8a36e09153Nuno Lopes
336fea8d2e42a53a1c03e2e1ced68dda8a36e09153Nuno Lopes// PR clang/3222
346fea8d2e42a53a1c03e2e1ced68dda8a36e09153Nuno Lopesvoid xpto();
356fea8d2e42a53a1c03e2e1ced68dda8a36e09153Nuno Lopesvoid (*xyz)(void) = &xpto;
3644efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregor
3744efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregorstruct PR11066 {
3844efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregor  static int foo(short);
3944efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregor  static int foo(float);
4044efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregor  void test();
4144efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregor};
4244efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregor
4344efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregorvoid PR11066::test() {
443fa3feab35096b608f1d79bb541798b37a55e7b9Richard Smith  int (PR11066::*ptr)(int) = & &PR11066::foo; // expected-error{{extra '&' taking address of overloaded function}}
4544efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregor}
4644efed03b3ec16148722dfe57e0787a5b5c59741Douglas Gregor
47b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewyckynamespace test3 {
48b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewycky  // emit no error
49b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewycky  template<typename T> struct S {
50b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewycky    virtual void f() = 0;
51b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewycky  };
52b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewycky  template<typename T> void S<T>::f() { T::error; }
53b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewycky  void (S<int>::*p)() = &S<int>::f;
54b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewycky}
55