[cfe-dev] Fwd: Can't get address of member-function

salvatore benedetto salvatore.benedetto at gmail.com
Sun May 19 13:21:30 PDT 2013


On Sun, May 19, 2013 at 2:12 PM, Reid Kleckner <rnk at google.com> wrote:
> 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.

> On Sun, May 19, 2013 at 5:31 AM, salvatore benedetto
> <salvatore.benedetto at gmail.com> wrote:
>>
>> I've sent this to cfe-users but perhaps it was better to send
>> it here.
>>
>> S.
>>
>>
>> ---------- Forwarded message ----------
>> From: salvatore benedetto <salvatore.benedetto at gmail.com>
>> Date: Sun, May 19, 2013 at 10:57 AM
>> Subject: Can't get address of member-function
>> To: cfe-users at cs.uiuc.edu
>>
>>
>> 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
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>



More information about the cfe-dev mailing list