|
From: | Eric Blake |
Subject: | Re: [Qemu-devel] [PATCH 2/3] qobject: assume base of a qobject is at offset 0 |
Date: | Wed, 21 Mar 2018 09:19:18 -0500 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 |
On 03/21/2018 09:08 AM, Marc-André Lureau wrote:
Hi On Wed, Mar 21, 2018 at 3:01 PM, Paolo Bonzini <address@hidden> 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?
-- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
[Prev in Thread] | Current Thread | [Next in Thread] |