// { dg-do assemble  }
// GROUPS passed casts
class VObject;

typedef int boolean;

typedef boolean (VObject::*method)();
typedef boolean (VObject::*method0)();
typedef boolean (VObject::*method1)(long);

#define methodOf(o,m)  (method)(&o::m)


class VObject {
    public:
    boolean perform(method );
    boolean perform(method , long);
    void    affectMethod(method );
    void    dummy(){}
};


boolean VObject::perform(method m)
{
        method0 q = (method0)m;
        return(this->*q)();
}


boolean VObject::perform(method m, long param)
{
        method1 q = (method1)m;
        return(this->*q)(param);
 }

void VObject::affectMethod(method m)
{
        m =   methodOf(VObject, dummy);
}
