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

Reid Kleckner rnk at google.com
Sun May 19 05:12:01 PDT 2013


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.


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130519/616f81ff/attachment.html>


More information about the cfe-dev mailing list