// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. /* * variadic.c * testObjects * * Created by Blaine Garst on 2/17/09. * */ // PURPOSE Test that variadic arguments compile and work for Blocks // CONFIG #include #include int main(int argc, char *argv[]) { long (^addthem)(const char *, ...) = ^long (const char *format, ...){ va_list argp; const char *p; int i; char c; double d; long result = 0; va_start(argp, format); //printf("starting...\n"); for (p = format; *p; p++) switch (*p) { case 'i': i = va_arg(argp, int); //printf("i: %d\n", i); result += i; break; case 'd': d = va_arg(argp, double); //printf("d: %g\n", d); result += (int)d; break; case 'c': c = va_arg(argp, int); //printf("c: '%c'\n", c); result += c; break; } //printf("...done\n\n"); return result; }; long testresult = addthem("ii", 10, 20); if (testresult != 30) { printf("got wrong result: %ld\n", testresult); return 1; } testresult = addthem("idc", 30, 40.0, 'a'); if (testresult != (70+'a')) { printf("got different wrong result: %ld\n", testresult); return 1; } printf("%s: Success\n", argv[0]); return 0; }