From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55247) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmicv-00058V-AL for qemu-devel@nongnu.org; Wed, 21 Sep 2016 10:36:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bmicp-0000o1-RY for qemu-devel@nongnu.org; Wed, 21 Sep 2016 10:35:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49748) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmicp-0000np-I3 for qemu-devel@nongnu.org; Wed, 21 Sep 2016 10:35:51 -0400 Date: Wed, 21 Sep 2016 15:35:46 +0100 From: "Daniel P. Berrange" Message-ID: <20160921143546.GS15535@redhat.com> Reply-To: "Daniel P. Berrange" References: <1474391326-871-1-git-send-email-felipe@nutanix.com> <000301d213c7$7142f980$53c8ec80$@ru> <87y42l93dr.fsf@dusky.pond.sub.org> <20160921100718.GO15535@redhat.com> <87mvj11ljr.fsf@dusky.pond.sub.org> <7500849B-8BCC-4743-92A6-5DBD4D8575E8@nutanix.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <7500849B-8BCC-4743-92A6-5DBD4D8575E8@nutanix.com> Subject: Re: [Qemu-devel] [PATCH] replay: Fix build with -Werror=unused-result List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Felipe Franciosi Cc: Eric Blake , Markus Armbruster , Pavel Dovgalyuk , qemu-devel , Pavel Dovgalyuk On Wed, Sep 21, 2016 at 02:26:48PM +0000, Felipe Franciosi wrote: > > > On 21 Sep 2016, at 14:55, Eric Blake wrote: > > > > On 09/21/2016 07:31 AM, Markus Armbruster wrote: > >>> > >>> If we want to ignore return value reliably, lets just pull in the > >>> ignore_value macro from gnulib which is known to work across GCC > >>> versions > >>> > >>> > >>> /* Normally casting an expression to void discards its value, but GCC > >>> versions 3.4 and newer have __attribute__ ((__warn_unused_result__)) > >>> which may cause unwanted diagnostics in that case. Use __typeof__ > >>> and __extension__ to work around the problem, if the workaround is > >>> known to be needed. */ > >>> #if 3 < __GNUC__ + (4 <= __GNUC_MINOR__) > >>> # define ignore_value(x) \ > >>> (__extension__ ({ __typeof__ (x) __x = (x); (void) __x; })) > >>> #else > >>> # define ignore_value(x) ((void) (x)) > >>> #endif > >> > >> Casting a value to void is the traditional and obvious way to say "yes, > >> I mean to ignore this value". Now compilers start to reply "no, you > >> don't". We can invent new (and less obvious) ways to say "yes, I do", > >> and compilers can then learn them so they can again reply "no, you > >> don't". Why have compilers started to behave like two-year-olds? > > > > gcc has been doing the "__warn_unused_value__ means cast-to-void is > > insufficient" complaint for years (since at least 2008, per the gnulib > > history). But the gnulib workaround has also been effectively silencing > > it for years (it was actually my work in 2011, commit 939dedd, which > > came up with the form listed above). The other nice thing about > > "ignore_value(wur_function())" is that you are avoiding a cast in your > > local code, and the burden of shutting up the annoying compiler is > > hidden behind a macro that can easily be changed to affect all clients > > of the macro, should gcc regress yet again and we need some other > > formula to shut it up. > > > > And yes, the gnulib mailing list has threads complaining about gcc's > > behavior back when the macro had to be invented, and again when glibc > > added wur markings to functions that can legitimately be ignored > > (fread() is one of them; because there are valid programming paradigms > > where you check ferror() later on rather than having to check every > > intermediate fread(), at the expense of less-specific error messages). > > What's the best way to bring gnulib's ignore-value.h into Qemu? I'd think we could just add to include/qemu/compiler.h something like: > > ----------------------8<---------------------- > #if QEMU_GNUC_PREREQ(3, 4) > /* From gnulib's ignore-value.h by Jim Meyering, Eric Blake and Padraig Brady */ > # define ignore_value(x) \, > (__extension__ ({ __typeof__ (x) __x = (x); (void) __x; })) > #else > # define ignore_value(x) ((void) (x)) > #endif > ----------------------8<---------------------- > > But I'm not sure if that suffices to meet GPL's requirements. The compiler.h file has no license header, just a comment saying "public domain", which is obviously not the case if you add this macro. Given that you'll need to explicitly mention the license terms for ignore_value. eg with a comment line like /* The ignore_value() macro is taken from GNULIB ignore-value.h, * licensed under the terms of the LGPLv2+ */ Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|