[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: proposed patch: verify: new macro verify_expr; verify_true deprecate
From: |
Eric Blake |
Subject: |
Re: proposed patch: verify: new macro verify_expr; verify_true deprecated |
Date: |
Mon, 13 Jun 2011 20:30:00 -0600 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110428 Fedora/3.1.10-1.fc14 Lightning/1.0b3pre Mnenhy/0.8.3 Thunderbird/3.1.10 |
On 06/13/2011 08:10 PM, Paul Eggert wrote:
> It's relatively common to want to verify a property at compile-time
> inside an expression, when using a macro. For example, in Emacs,
> I might want to do something like this:
>
> #define ENCODE_CHAR(charset, c) \
> (verify_true (sizeof (c) <= sizeof (int)), \
> [some expression that assumes sizeof (c) <= sizeof (int)])
>
> Unfortunately this elicits the following diagnostic with GCC 4.6.0:
>
> charset.c:1767:14: error: left-hand operand of comma expression has no
> effect [-Werror=unused-value]
And I agree that adding a cast to void to silence that gcc warning is
undesirable.
>
> So I am thinking of a new macro verify_expr (R, E), which verifies R
> at compile-time and then yields the value of E. Then the Emacs macro
> can be written this way:
>
> #define ENCODE_CHAR(charset, c) \
> verify_expr (sizeof (c) <= sizeof (int), \
> [some expression that assumes sizeof (c) <= sizeof (int)])
Looks good to me.
> +++ b/tests/test-verify.c
> @@ -39,7 +39,7 @@ verify (1 == 1); verify (1 == 1); /* should be ok */
>
> enum
> {
> - item = verify_true (1 == 1) * 0 + 17 /* should be ok */
> + item = verify_expr (1 == 1, 1) * 0 + 17 /* should be ok */
> };
>
> static int
> @@ -55,9 +55,9 @@ function (int n)
> verify (1 == 1); verify (1 == 1); /* should be ok */
>
> if (n)
> - return ((void) verify_true (1 == 1), verify_true (1 == 1) + 7); /*
> should be ok */
> + return ((void) verify_expr (1 == 1, 1), verify_expr (1 == 1, 8)); /*
> should be ok */
Even though verify_true is deprecated by your patch, should we still be
testing that it compiles? Particularly since in your patch, you did not
#define verify_true in terms of verify_expr, but instead defined both in
terms of _GL_VERIFY_EXPR.
--
Eric Blake address@hidden +1-801-349-2682
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature