Can't get address of member-function

Hi there,

first of all, I know the following should not be done usually, but I'm working
with C++ on a bare-metal project and it seems not to be forbidden by
the standard.

I need to get the address of a non-static member function and assign
it to an integer variable.

class MyClass
{
public:
    MyClass()
    {
        //someAddress = (uint32_t)&run; // This works OK with static
member function
        someAddress = (uint32_t)reinterpret_cast<void (*)()>(&MyClass::run);
    }

private:

    //static void run()
    void run()
    {
      ;
    }

public:
    uint32_t someAddress;
};

This code compiles with a warning with GCC, but I get the following
error with clang 3.2

address_of_member_function.cpp:10:33: error: reinterpret_cast from
'void (MyClass::*)()' to 'void (*)()' is not allowed
        someAddress = (uint32_t)reinterpret_cast<void (*)()>(&MyClass::run);

Is this a bug in clang or am I missing something?

Regards,
Salvatore

I've sent this to cfe-users but perhaps it was better to send
it here.

S.

Member function pointers are two pointers wide on Itanium. They look like this:
struct {
union {
void *NonVirtualFunctionPointer;
ptrdiff_t VTableIndex;
};
ptrdiff_t ThisAdjustment;
};

It’s not surprising the reinterpret_cast fails. It seems gcc will try to give you the function pointer part, and hope that you ultimately apply it to an object that doesn’t require an adjustment.

Member function pointers are two pointers wide on Itanium. They look like
this:
struct {
  union {
    void *NonVirtualFunctionPointer;
    ptrdiff_t VTableIndex;
  };
  ptrdiff_t ThisAdjustment;
};

It's not surprising the reinterpret_cast fails. It seems gcc will try to
give you the function pointer part, and hope that you ultimately apply it to
an object that doesn't require an adjustment.

Under the assumption that I know what I am doing with that pointer, that is
no virtual members and no multiple inheritance, would it be wrong to have
clang return the NonVirtualFunctionPointer like GCC, along with a warning
at most?

S.

Member function pointers are two pointers wide on Itanium. They look like
this:
struct {
union {
void *NonVirtualFunctionPointer;
ptrdiff_t VTableIndex;
};
ptrdiff_t ThisAdjustment;
};

It’s not surprising the reinterpret_cast fails. It seems gcc will try to
give you the function pointer part, and hope that you ultimately apply it to
an object that doesn’t require an adjustment.

Under the assumption that I know what I am doing with that pointer, that is
no virtual members and no multiple inheritance, would it be wrong to have
clang return the NonVirtualFunctionPointer like GCC, along with a warning
at most?

It would be a language extension, so you would need to justify the cost of including it in Clang. I believe the GCC extension you want is the one documented here:

http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Bound-member-functions.html#Bound-member-functions