On 03/21/2018 09:08 AM, Marc-André Lureau wrote:
Hi
On Wed, Mar 21, 2018 at 3:01 PM, Paolo Bonzini <pbonz...@redhat.com> 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