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

            Bug ID: 79364
           Summary: some variadic functions miscompiled (at least for x64
                    targets)
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: xilun0 at gmail dot com
  Target Milestone: ---

Hello,

G++ miscompiles the following program at least for x64, at least from gcc 4.7
to 7.0 20170115
Compiling with or without O2 changes the observed behavior (segfault or
garbage) but the program is miscompiled in both cases.
gcc seems to compile the corresponding C program correctly.

The expected output is: 1 2 3 4 5 6 coucou
The actual "output" is a segfault or some garbage instead of "coucou"

Cheers!



#include <cstdarg>
#include <cstdio>
struct vatag {};
void tst(vatag tag, ...)
{
        int i;
        va_list ap;
        va_start(ap, tag);
#define P_INT i = va_arg(ap, int); printf("%i ", i);
        P_INT P_INT P_INT P_INT P_INT P_INT
        const char* s = va_arg(ap, char*); printf("%s\n", s);
        va_end(ap);
}
int main(void)
{
    tst(vatag{}, 1, 2, 3, 4, 5, 6, "coucou");
}

Reply via email to