xref: /aosp_15_r20/external/clang/test/SemaCXX/builtins-va_arg.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -ffreestanding
2*67e74705SXin Li // RUN: %clang_cc1 %s -ffreestanding -triple i686-unknown-linux
3*67e74705SXin Li // RUN: %clang_cc1 %s -ffreestanding -triple x86_64-unknown-linux
4*67e74705SXin Li // RUN: %clang_cc1 %s -ffreestanding -triple mips-unknown-linux
5*67e74705SXin Li // RUN: %clang_cc1 %s -ffreestanding -triple mipsel-unknown-linux
6*67e74705SXin Li // RUN: %clang_cc1 %s -ffreestanding -triple armv7-unknown-linux-gnueabi
7*67e74705SXin Li // RUN: %clang_cc1 %s -ffreestanding -triple thumbv7-unknown-linux-gnueabi
8*67e74705SXin Li 
9*67e74705SXin Li #include "stdarg.h"
10*67e74705SXin Li 
11*67e74705SXin Li int int_accumulator = 0;
12*67e74705SXin Li double double_accumulator = 0;
13*67e74705SXin Li 
test_vprintf(const char * fmt,va_list ap)14*67e74705SXin Li int test_vprintf(const char *fmt, va_list ap) {
15*67e74705SXin Li   char ch;
16*67e74705SXin Li   int result = 0;
17*67e74705SXin Li   while (*fmt != '\0') {
18*67e74705SXin Li     ch = *fmt++;
19*67e74705SXin Li     if (ch != '%') {
20*67e74705SXin Li       continue;
21*67e74705SXin Li     }
22*67e74705SXin Li 
23*67e74705SXin Li     ch = *fmt++;
24*67e74705SXin Li     switch (ch) {
25*67e74705SXin Li     case 'd':
26*67e74705SXin Li       int_accumulator += va_arg(ap, int);
27*67e74705SXin Li       result++;
28*67e74705SXin Li       break;
29*67e74705SXin Li 
30*67e74705SXin Li     case 'f':
31*67e74705SXin Li       double_accumulator += va_arg(ap, double);
32*67e74705SXin Li       result++;
33*67e74705SXin Li       break;
34*67e74705SXin Li 
35*67e74705SXin Li     default:
36*67e74705SXin Li       break;
37*67e74705SXin Li     }
38*67e74705SXin Li 
39*67e74705SXin Li     if (ch == '0') {
40*67e74705SXin Li       break;
41*67e74705SXin Li     }
42*67e74705SXin Li   }
43*67e74705SXin Li   return result;
44*67e74705SXin Li }
45*67e74705SXin Li 
test_printf(const char * fmt,...)46*67e74705SXin Li int test_printf(const char *fmt, ...) {
47*67e74705SXin Li   va_list ap;
48*67e74705SXin Li   va_start(ap, fmt);
49*67e74705SXin Li   int result = test_vprintf(fmt, ap);
50*67e74705SXin Li   va_end(ap);
51*67e74705SXin Li   return result;
52*67e74705SXin Li }
53