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

            Bug ID: 108560
           Summary: builtin_va_arg_pack_len is documented to return
                    size_t, but actually returns int
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jens.seifert at de dot ibm.com
  Target Milestone: ---

#include <stdio.h>

bool test(const char *fmt, size_t numTokens, ...)
{
    return __builtin_va_arg_pack_len() != numTokens;
}

Compiled with -Wsign-compare results in:
<source>: In function 'bool test(const char*, size_t, ...)':
<source>:5:40: warning: comparison of integer expressions of different
signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
    5 |     return __builtin_va_arg_pack_len() != numTokens;
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
<source>:5:37: error: invalid use of '__builtin_va_arg_pack_len ()'
    5 |     return __builtin_va_arg_pack_len() != numTokens;
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~^~
Compiler returned: 1

Documentation:
https://gcc.gnu.org/onlinedocs/gcc/Constructing-Calls.html
indicates a size_t return type
Built-in Function: size_t __builtin_va_arg_pack_len ()

Reply via email to