[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