| // { dg-do assemble } |
| // { dg-options "" } |
| |
| // GROUPS passed operators |
| // Check that the & operator, when applied to a global function |
| // or member function returns a proper value as long as the context |
| // in which the result of & is used requires a pointer to a specific |
| // unambigous (function-pointer) type. |
| // |
| // This test fails (in test5()) when compiled with g++ 1.34.1. |
| |
| extern "C" int printf (const char *, ...); |
| |
| int function (char c); |
| int function (float f); |
| |
| class base { |
| int filler; |
| public: |
| int method (char); |
| int method (float); |
| }; |
| |
| void* vp; |
| |
| typedef int (*ptr_to_func_of_char)(char); |
| typedef int (*ptr_to_func_of_float)(float); |
| typedef int (base::*ptr_to_method_of_char)(char); |
| typedef int (base::*ptr_to_method_of_float)(float); |
| |
| int test2 (void*); |
| int test3 (void*); |
| int test4 (void*); |
| int test5 (void*); |
| |
| base* base_ptr; |
| |
| int fail () |
| { |
| printf ("FAIL\n"); |
| return 1; |
| } |
| |
| int main () |
| { |
| base_ptr = new base; |
| |
| ptr_to_func_of_char p0 = &function; |
| vp = (void*) p0; |
| if (test2 (vp)) |
| return fail (); |
| ptr_to_func_of_float p1 = &function; |
| vp = (void*) p1; |
| if (test3 (vp)) |
| return fail (); |
| ptr_to_method_of_char p2 = &base::method; |
| vp = (void*) p2; // { dg-warning "converting" } |
| if (test4 (vp)) |
| return fail (); |
| ptr_to_method_of_float p3 = &base::method; |
| vp = (void*) p3; // { dg-warning "converting" } |
| if (test5 (vp)) |
| return fail (); |
| |
| printf ("PASS\n"); |
| return 0; |
| } |
| |
| int test2 (void* vp) |
| { |
| char ch = 'x'; |
| |
| return (((ptr_to_func_of_char)vp)(ch) != 9901); |
| } |
| |
| int test3 (void* vp) |
| { |
| float flt = 9.9; |
| |
| return (((ptr_to_func_of_float)vp)(flt) != 9902); |
| } |
| |
| int test4 (void* vp) |
| { |
| char ch = 'x'; |
| ptr_to_method_of_char p = (ptr_to_method_of_char) vp; // { dg-error "invalid cast" } bad type conversion |
| |
| return ((base_ptr->*p)(ch) != 9904); |
| } |
| |
| int test5 (void* vp) |
| { |
| float flt = 9.9; |
| ptr_to_method_of_float p = (ptr_to_method_of_float) vp; // { dg-error "invalid cast" } bad type conversion |
| |
| if ((base_ptr->*p)(flt) != 9905) { |
| return 1; |
| } else |
| return 0; |
| } |
| |
| int function (char c) |
| { |
| c = c; |
| return 9901; |
| } |
| |
| int function (float f) |
| { |
| f = f; |
| return 9902; |
| } |
| |
| int base::method (char c) |
| { |
| c = c; |
| return 9904; |
| } |
| |
| int base::method (float f) |
| { |
| f = f; |
| return 9905; |
| } |