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)...

Reply via email to