llvm/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-vararg-ms.cpp

// Purpose:
// Ensure that the 'cppcoreguidelines-pro-type-vararg' check works with the
// built-in va_list on Windows systems.

// RUN: %check_clang_tidy %s cppcoreguidelines-pro-type-vararg %t -- --extra-arg=--target=x86_64-windows

void test_ms_va_list(int a, ...) {
  __builtin_ms_va_list ap;
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare variables of type va_list; use variadic templates instead
  __builtin_ms_va_start(ap, a);
  int b = __builtin_va_arg(ap, int);
  // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not use va_arg to define c-style vararg functions; use variadic templates instead
  __builtin_ms_va_end(ap);
}

void test_typedefs(int a, ...) {
  typedef __builtin_ms_va_list my_va_list1;
  my_va_list1 ap1;
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare variables of type va_list; use variadic templates instead

  using my_va_list2 = __builtin_ms_va_list;
  my_va_list2 ap2;
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare variables of type va_list; use variadic templates instead
}