title: va_arg returning the wrong argument
body: <p>With the following code va_arg is returning garbage for the second and third pass through vProcessType.</p>
  
  <pre><code>// va_list_test.cpp : Defines the entry point for the console application.
  //
  
  #include "stdafx.h"
  #include &lt;tchar.h&gt;
  #include &lt;cstdarg&gt;
  #include &lt;windows.h&gt;
  
  void processList(LPTSTR str, ...);
  void vProcessList(LPTSTR str, va_list args);
  void vProcessType(va_list args, int type);
  
  int _tmain(int argc, _TCHAR* argv[])
  {
      LPTSTR a = TEXT("foobar");
      int b = 1234;
      LPTSTR c = TEXT("hello world");
      processList(TEXT("foobar"), a, b, c);
      return 0;
  }
  
  void processList(LPTSTR str, ...)
  {
      va_list args;
      va_start(args, str);
      vProcessList(str, args);
      va_end(args);
  }
  void vProcessList(LPTSTR str, va_list args)
  {
      vProcessType(args, 1);
      vProcessType(args, 2);
      vProcessType(args, 1);
  }
  
  void vProcessType(va_list args, int type)
  {
      switch(type)
      {
      case 1:
          {
              LPTSTR str = va_arg(args, LPTSTR);
              printf("%s", str);
          }
          break;
      case 2:
          {
              int num = va_arg(args, int);
              printf("%d", num);
          }
          break;
      default:
          break;
      }
  }
  </code></pre>
  
  <p>Is passing a va_list thing not allowed in this way?  The first call to va_arg inside vProcessType returns the expected string.  The second and third time through this function it returns a pointer to the start of the first string, instead of the values expected.</p>
  
  <p>If I hoist the va_arg call to vProcessList, everything seems to work fine.  It only seems when I pass a va_list through a function that I'm getting this behaviour.</p>