[Bug c/78868] New: When one variadic function calls another one, the parameters are reversed, if va_arg is used directly in function call.

2016-12-19 Thread vlad at cloudflare dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78868

Bug ID: 78868
   Summary: When one variadic function calls another one, the
parameters are reversed, if va_arg is used directly in
function call.
   Product: gcc
   Version: 4.9.2
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c
  Assignee: unassigned at gcc dot gnu.org
  Reporter: vlad at cloudflare dot com
  Target Milestone: ---

Created attachment 40374
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=40374&action=edit
Preprocessed source file

On Debian 8, when using gcc 4.9.2, when one variadic function calls another
one, the parameters are reversed, if va_arg is used directly in function call.
When va_arg is evaluated before the call into a temporary location, the order
is correct.

Also replicated in gcc 5.3.1.

Clang shows the expected behavior.

#include 

int printf( const char* format, ... );

void vararg1(int n, ...) {
  va_list args;
  va_start(args, n);
  printf("%d, %d\n", va_arg(args, int), va_arg(args, int));
  va_end(args);
}

void vararg2(int n, ...) {
  va_list args;
  va_start(args, n);
  int a = va_arg(args, int);
  int b = va_arg(args, int);
  printf("%d, %d\n", a, b);
  va_end(args);
}

int main() {
  vararg1(2, 12, 13);
  vararg2(2, 12, 13);
  return 0;
}

Gcc output:
13, 12
12, 13

Clang output:
12, 13
12, 13

[Bug c/78868] When one variadic function calls another one, the parameters are reversed, if va_arg is used directly in function call.

2016-12-19 Thread vlad at cloudflare dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78868

--- Comment #3 from Vlad Krasnov  ---
I though that since va_arg is defined as a macro, it should be evaluated in
order.