Hi On Wed, Mar 21, 2018 at 3:19 PM, Eric Blake <[email protected]> wrote: > On 03/21/2018 09:08 AM, Marc-André Lureau wrote: >> >> Hi >> >> On Wed, Mar 21, 2018 at 3:01 PM, Paolo Bonzini <[email protected]> >> wrote: >>> >>> On 21/03/2018 14:40, Marc-André Lureau wrote: >>>> >>>> +/* A typecast, checking for the type of arguments */ >>>> +/* QObject is at offset 0, for all QObject-derived types */ >>>> +#define QOBJECT(x) QEMU_GENERIC(x, \ >>>> + (QNull *, (QObject *) x), \ >>>> + (const QNull *, (const QObject *) x), \ >>>> + (QNum *, (QObject *) x), \ >>>> + (const QNum *, (const QObject *) x), \ >>>> + (QString *, (QObject *) x), \ >>>> + (const QString *, (const QObject *) x), \ >>>> + (QDict *, (QObject *) x), \ >>>> + (const QDict *, (const QObject *) x), \ >>>> + (QList *, (QObject *) x), \ >>>> + (const QList *, (const QObject *) x), \ >>>> + (QBool *, (QObject *) x), \ >>>> + (const QBool *, (const QObject *) x), \ >>>> + (QObject *, x), \ >>>> + (const QObject *, x), \ >>>> + qobject_unknown_type(x)) >>> >>> >>> Why not just >>> >>> QEMU_GENERIC(x, >>> (QObject *, x), >>> (const QObject *, x), >>> ({ \ >>> QEMU_BUILD_BUG_ON(offsetof(typeof(*x), base)); >>> &(x)->base; >>> })) >>> >>> That is just an extension of what was being done before, and it is >>> resilient against people putting a random "QObject base" in the middle >>> of a struct. >>> >> >> Yeah, I tried a few of those approaches. Here the problem is that >> QObject doesn't have base field. So you get a compile time error with >> a QObject * as argument. > > > So the compiler requires &(x)->base to resolve even when it is not on the > branch that gets selected? >
Unfortunately, yes, all branches must compile apparently (I know)...
