All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@gmail.com>
Cc: "László Érsek" <lersek@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 04/14] qlit: remove compound literals
Date: Thu, 31 Aug 2017 15:50:12 +0200	[thread overview]
Message-ID: <871snrkfsb.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <CAJ+F1CJ5b3izZgZxD4RXyq00yxi3xN+WADu-MeuyPb-3yLxiVw@mail.gmail.com> ("Marc-André Lureau"'s message of "Thu, 31 Aug 2017 09:14:36 +0000")

Marc-André Lureau <marcandre.lureau@gmail.com> writes:

> Hi
>
> On Thu, Aug 31, 2017 at 10:43 AM Markus Armbruster <armbru@redhat.com>
> wrote:
>
>> Marc-André Lureau <marcandre.lureau@redhat.com> writes:
>>
>> > Hi
>> >
>> > ----- Original Message -----
>> >> Marc-André Lureau <marcandre.lureau@redhat.com> writes:
>> >>
>> >> > Hi
>> >> >
>> >> > ----- Original Message -----
>> >> >> Marc-André Lureau <marcandre.lureau@redhat.com> writes:
>> >> >>
>> >> >> > They are not considered constant expressions in C, producing an
>> error
>> >> >> > when compiling a const QLit.
>> >> >>
>> >> >> A const QLit?  Do you mean a non-const one?
>> >> >
>> >> > Really a const QLitObject:
>> >> >
>> >> >
>> >> > const QLitObject qmp_schema_qlit = QLIT_QLIST(((QLitObject[]) {
>> >> >              QLIT_QNULL,
>> >> >              {}
>> >> >          }));
>> >> >
>> >> > qmp-introspect.c:17:63: error: initializer element is not constant
>> >> >   const QLitObject qmp_schema_qlit = QLIT_QLIST(((QLitObject[]) {
>> >> >                                                                 ^
>> >> > Removing the "compound literals" fixes this error.
>> >>
>> >> Does QLIT_QLIST(((const QLitObject[]) { ... } work?
>> >
>> > No. Even if I put "const" all over the place (in member, in compound
>> type etc).
>> >
>> > Give it a try, see if you can make it const, I am out of luck.
>>
>> The commit message's explanation is wrong.  This isn't about const at
>> all, it's about "constant expressions", which are something else
>> entirely.
>>
>
> The point was that declaring a non const QLit with those "compound
> literals" worked vs with const.

The keyword const is a red herring here, and that's precisely what's
wrong with the commit message.  The minimized test case demonstrates the
problem without const.

>> For what it's worth, clang is cool with the compound literals.  On
>> Fedora 26 with a minimized test case (appended):
>>
>>     $ clang -c -g -O -Wall compound-lit.c
>>     $ gcc -c -g -O -Wall compound-lit.c
>>     compound-lit.c:30:37: error: initializer element is not constant
>>          .value.qdict = (QLitDictEntry[]){
>>                                          ^
>>     compound-lit.c:30:37: note: (near initialization for
>> ‘(anonymous).value’)
>>
>> GCC bug or not?  A search of the GCC Bugzilla finds
>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71713
>>
>> Copying a few notorious language lawyers^W^W^Wtrusted advisers.
>>
>> Even if this turns out to be a gcc bug, we'll have to work around it.
>> But the work-around needs a comment then.
>>
>> In any case, the commit message needs fixing.
>>
>
> What about adapting the bug comment:
>
> qlit: remove compound literals
>
> A compound literal (i.e., "(struct Str1){1}"), is not a constant
> expression, and so it cannot be used to initialize an object with static
> storage duration.

That's better.

It's weird that a compound literal isn't a constant expression, but
arguing about it here won't make gcc treat it as one.

> $ gcc -c -g -O -Wall compound-lit.c
>     compound-lit.c:30:37: error: initializer element is not constant
>          .value.qdict = (QLitDictEntry[]){
>                                          ^
>     compound-lit.c:30:37: note: (near initialization for
> ‘(anonymous).value’)
>
> clang accepts it. In some cases, gcc accepts compound literals as
> initializer, but not in this nested case. There is a gcc bug about it:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71713.
>
> Feel free to adapt on commit

Using this:

    qlit: Change compound literals to initializers

    The QLIT_QFOO() macros expand into compound literals.  Sadly, gcc
    doesn't recognizes these as constant expressions (clang does), which
    makes the macros useless for initializing objects with static storage
    duration.

    There is a gcc bug about it:
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71713

    Change the macros to expand into initializers.

Avoids passing judgement on "bug or no bug", and avoids referring to the
compount-lit.c example without actually including it.

I might still add a comment.

  reply	other threads:[~2017-08-31 13:50 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-25 10:58 [Qemu-devel] [PATCH v2 00/14] Generate a literal qobject for introspection Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 01/14] qdict: add qdict_put_null() helper Marc-André Lureau
2017-08-25 12:58   ` Eduardo Habkost
2017-08-25 15:31   ` Eric Blake
2017-08-30 12:01     ` Markus Armbruster
2017-08-30 13:54       ` Eric Blake
2017-08-31 13:58       ` Markus Armbruster
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 02/14] qlit: move qlit from check-qjson to qobject/ Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 03/14] qlit: use QLit prefix consistently Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 04/14] qlit: remove compound literals Marc-André Lureau
2017-08-30 12:00   ` Markus Armbruster
2017-08-30 12:11     ` Marc-André Lureau
2017-08-30 13:02       ` Markus Armbruster
2017-08-30 13:19         ` Marc-André Lureau
2017-08-31  8:42           ` Markus Armbruster
2017-08-31  9:14             ` Marc-André Lureau
2017-08-31 13:50               ` Markus Armbruster [this message]
2017-08-31 15:28             ` Laszlo Ersek
2017-09-01  9:51               ` Markus Armbruster
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 05/14] qlit: rename compare_litqobj_to_qobj() to qlit_equal_qobject() Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 06/14] qlit: make qlit_equal_qobject return a bool Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 07/14] qlit: make qlit_equal_qobject() take const arguments Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 08/14] qlit: add QLIT_QNULL and QLIT_BOOL Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 09/14] qlit: Replace open-coded qnum_get_int() by call Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 10/14] tests: add qlit tests Marc-André Lureau
2017-08-30 12:15   ` Markus Armbruster
2017-08-30 12:23     ` Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 11/14] qlit: improve QLit dict vs qdict comparison Marc-André Lureau
2017-08-30 12:35   ` Markus Armbruster
2017-08-30 13:05     ` Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 12/14] qlit: improve QLit list vs qlist comparison Marc-André Lureau
2017-08-30 12:36   ` Markus Armbruster
2017-08-31 14:20     ` Markus Armbruster
2017-08-31 14:37       ` Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 13/14] qlit: add qobject_form_qlit() Marc-André Lureau
2017-08-25 15:35   ` Eric Blake
2017-08-30 12:53   ` Markus Armbruster
2017-08-30 13:00     ` Marc-André Lureau
2017-08-25 10:59 ` [Qemu-devel] [PATCH v2 14/14] qapi: generate a literal qobject for introspection Marc-André Lureau
2017-09-01 12:06 ` [Qemu-devel] [PATCH v2 00/14] Generate " Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=871snrkfsb.fsf@dusky.pond.sub.org \
    --to=armbru@redhat.com \
    --cc=lersek@redhat.com \
    --cc=marcandre.lureau@gmail.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.