From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52961) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmiUC-0007Ok-Rs for qemu-devel@nongnu.org; Wed, 21 Sep 2016 10:26:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bmiU7-0006Ib-Qn for qemu-devel@nongnu.org; Wed, 21 Sep 2016 10:26:56 -0400 Received: from mail-by2nam03on0095.outbound.protection.outlook.com ([104.47.42.95]:35840 helo=NAM03-BY2-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmiU7-0006IF-9O for qemu-devel@nongnu.org; Wed, 21 Sep 2016 10:26:51 -0400 From: Felipe Franciosi Date: Wed, 21 Sep 2016 14:26:48 +0000 Message-ID: <7500849B-8BCC-4743-92A6-5DBD4D8575E8@nutanix.com> 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> In-Reply-To: Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-ID: <977F0DD7FC6B574599A2CAA3281AD55C@namprd02.prod.outlook.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 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: Eric Blake Cc: Markus Armbruster , "Daniel P. Berrange" , Pavel Dovgalyuk , qemu-devel , Pavel Dovgalyuk > On 21 Sep 2016, at 14:55, Eric Blake wrote: >=20 > On 09/21/2016 07:31 AM, Markus Armbruster wrote: >>>=20 >>> 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 >>>=20 >>>=20 >>> /* 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 <=3D __GNUC_MINOR__) >>> # define ignore_value(x) \ >>> (__extension__ ({ __typeof__ (x) __x =3D (x); (void) __x; })) >>> #else >>> # define ignore_value(x) ((void) (x)) >>> #endif >>=20 >> 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? >=20 > 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. >=20 > 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 w= e 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 Bra= dy */ # define ignore_value(x) \ (__extension__ ({ __typeof__ (x) __x =3D (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. Thanks, Felipe >=20 > --=20 > Eric Blake eblake redhat com +1-919-301-3266 > Libvirt virtualization library http://libvirt.org >=20