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