| 1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
| 2 | |
| 3 | // rdar://problem/8347416 |
| 4 | namespace test0 { |
| 5 | struct A { |
| 6 | void foo(void (A::*)(int)); // expected-note {{passing argument to parameter here}} |
| 7 | template<typename T> void g(T); |
| 8 | |
| 9 | void test() { |
| 10 | foo(&g<int>); // expected-error-re {{cannot form member pointer of type 'void (test0::A::*)(int){{( __attribute__\(\(thiscall\)\))?}}' without '&' and class name}} |
| 11 | } |
| 12 | }; |
| 13 | } |
| 14 | |
| 15 | // This should succeed. |
| 16 | namespace test1 { |
| 17 | struct A { |
| 18 | static void f(void (A::*)()); |
| 19 | static void f(void (*)(int)); |
| 20 | void g(); |
| 21 | static void g(int); |
| 22 | |
| 23 | void test() { |
| 24 | f(&g); |
| 25 | } |
| 26 | }; |
| 27 | } |
| 28 | |
| 29 | // Also rdar://problem/8347416 |
| 30 | namespace test2 { |
| 31 | struct A { |
| 32 | static int foo(short); |
| 33 | static int foo(float); |
| 34 | int foo(int); |
| 35 | int foo(double); |
| 36 | |
| 37 | void test(); |
| 38 | }; |
| 39 | |
| 40 | void A::test() { |
| 41 | // FIXME: The error message in this case is less than clear, we can do |
| 42 | // better. |
| 43 | int (A::*ptr)(int) = &(A::foo); // expected-error {{cannot create a non-constant pointer to member function}} |
| 44 | } |
| 45 | } |
| 46 | |