This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] assert: Suppress pedantic warning caused by statement expression [BZ# 21242]
- From: Florian Weimer <fweimer at redhat dot com>
- To: GNU C Library <libc-alpha at sourceware dot org>
- Date: Tue, 4 Jul 2017 16:10:33 +0200
- Subject: Re: [PATCH] assert: Suppress pedantic warning caused by statement expression [BZ# 21242]
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=fweimer at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 8147A4E4D3
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 8147A4E4D3
- References: <6619e7e2-248e-08bc-6dc5-7b4d11bea3df@auburn.edu> <925e8a81-86f9-78a6-1578-660c04e39e3c@redhat.com> <alpine.DEB.2.20.1703211617300.8480@digraph.polyomino.org.uk> <b3e54310-9e08-c0fb-b0ee-b2a07711ef9a@redhat.com> <alpine.DEB.2.20.1706261055440.21187@digraph.polyomino.org.uk> <b50d764b-0616-855d-8359-a34d1210acfd@redhat.com>
On 07/04/2017 04:00 PM, Florian Weimer wrote:
> On 06/26/2017 12:56 PM, Joseph Myers wrote:
>> On Sun, 25 Jun 2017, Florian Weimer wrote:
>>
>>> I think we can use __extension__ if we also expand the expression
>>> without __extension__ in an unevaluated context. The tricky part is to
>>> find one that is independent of GNU extensions.
>>> Perhaps this would work?
>>>
>>> # define assert(expr) \
>>> ((void) sizeof ((expr) == 0), __extension__ ({ \
>>> if (expr) \
>>> ; /* empty */ \
>>> else \
>>> __assert_fail (#expr, __FILE__, __LINE__, __FUNCTION__); \
>>> }))
>>>
>>> sizeof suppresses the evaluation of the first occurrence of expr. The
>>> comparison is needed because sizeof cannot be applied to function
>>> pointers and bitfields. C11 says that expr is compared to zero, so the
>>> (expr) == 0 expression is well-formed.
>>>
>>> What do you think? Should we make this change?
>>
>> I think that's reasonable (appropriately commented to explain why it's
>> done that way).
>
> This is what I came up with as a patch.
>
> I would consider this still appropriate during the freeze. It's
> something we'd backport to glibc 2.25, too.
Hopefully now with attachment.
Florian
assert: Suppress pedantic warning caused by statement expression
2017-07-04 Florian Weimer <fweimer@redhat.com>
[BZ #21242]
* assert/assert.h [__GNUC__ && !__STRICT_ANSI__] (assert):
Suppress pedantic warning resulting from statement expression.
(__ASSERT_FUNCTION): Add missing __extendsion__.
diff --git a/assert/assert.h b/assert/assert.h
index 22f0195..0ded8c7 100644
--- a/assert/assert.h
+++ b/assert/assert.h
@@ -91,13 +91,18 @@ __END_DECLS
? __ASSERT_VOID_CAST (0) \
: __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
# else
+/* The first occurrence of EXPR is not evaluated due to the sizeof,
+ but will trigger any pedantic warnings masked by the __extension__
+ for the second occurrence. The explicit comparison against zero is
+ required to support function pointers and bit fields in this
+ context. */
# define assert(expr) \
- ({ \
+ ((void) sizeof ((expr) == 0), __extension__ ({ \
if (expr) \
; /* empty */ \
else \
__assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION); \
- })
+ }))
# endif
# ifdef __USE_GNU
@@ -113,7 +118,7 @@ __END_DECLS
C9x has a similar variable called __func__, but prefer the GCC one since
it demangles C++ function names. */
# if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)
-# define __ASSERT_FUNCTION __PRETTY_FUNCTION__
+# define __ASSERT_FUNCTION __extension__ __PRETTY_FUNCTION__
# else
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
# define __ASSERT_FUNCTION __func__