https://gcc.gnu.org/bugzilla/show_bug.cgi?id=33877

--- Comment #11 from Alejandro Colomar <foss+...@alejandro-colomar.es> ---
Moreover, __VA_OPT__ is not even self-consistent.

alx@debian:~/tmp$ cat vo.c | nl -ba
     1  #define foo(...)     __LINE__: foo: __VA_OPT__(nonzero args:
__VA_ARGS__)
     2  #define bar(a, ...)  __LINE__: bar: __VA_OPT__(nonzero args:
__VA_ARGS__)
     3  
     4  foo()
     5  foo(x)
     6  foo(,)
     7  
     8  bar(a)
     9  bar(a,)
    10  bar(a,b)
    11  bar(a,b,)
    12  
    13  #define f(...)     __LINE__: f:, ## __VA_ARGS__
    14  #define b(a, ...)  __LINE__: b:, ## __VA_ARGS__
    15  
    16  f()
    17  f(x)
    18  f(,)
    19  
    20  b(a)
    21  b(a,)
    22  b(a,b)
    23  b(a,b,)
alx@debian:~/tmp$ gcc -E vo.c | grep -v ^# | uniq

4: foo:
5: foo: nonzero args: x
6: foo: nonzero args: ,

8: bar:
9: bar:
10: bar: nonzero args: b
11: bar: nonzero args: b,

16: f:
17: f:,x
18: f:,,

20: b:
21: b:,
22: b:,b
23: b:,b,


Compare lines 9 and 11.  It respects the trailing empty argument if there's at
least two variadic arguments, but if there's only one variadic argument and
it's empty, it's somehow a second-class empty argument, and it's ignored. 
That's totally bogus.  __VA_ARGC__ should be modeled after GNU C's ##
__VA_ARGS__, and not the standard.

Reply via email to