variadic-block.c revision 8e8fb3be5bd78f0564444eca02b404566a5f3b5d
1// RUN: %clang_cc1 %s -verify -fsyntax-only -fblocks
2// expected-no-diagnostics
3
4#include <stdarg.h>
5
6int main(int argc, char *argv[]) {
7
8    long (^addthem)(const char *, ...) = ^long (const char *format, ...){
9        va_list argp;
10        const char *p;
11        int i;
12        char c;
13        double d;
14        long result = 0;
15        va_start(argp, format);
16        for (p = format; *p; p++) switch (*p) {
17            case 'i':
18                i = va_arg(argp, int);
19                result += i;
20                break;
21            case 'd':
22                d = va_arg(argp, double);
23                result += (int)d;
24                break;
25            case 'c':
26                c = va_arg(argp, int);
27                result += c;
28                break;
29        }
30        return result;
31    };
32    long testresult = addthem("ii", 10, 20);
33    if (testresult != 30) {
34        return 1;
35    }
36    testresult = addthem("idc", 30, 40.0, 'a');
37    if (testresult != (70+'a')) {
38        return 1;
39    }
40    return 0;
41}
42
43