summaryrefslogtreecommitdiffstats
path: root/clang/test/Sema/variadic-block.c
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2009-04-15 19:33:47 +0000
committerSteve Naroff <snaroff@apple.com>2009-04-15 19:33:47 +0000
commit439a3e4106af56e2d0d7902d1fe8715dd30e2428 (patch)
tree4299b2c7de70ddb9a97358a4d1581ee384ce57e2 /clang/test/Sema/variadic-block.c
parent47b21081cbb31df8f1fb1fa9a9efc29f0d14ab01 (diff)
downloadbcm5719-llvm-439a3e4106af56e2d0d7902d1fe8715dd30e2428.tar.gz
bcm5719-llvm-439a3e4106af56e2d0d7902d1fe8715dd30e2428.zip
Fix <rdar://problem/6786597> varargs not supported for Blocks under clang.
Teach Sema::SemaBuiltinVAStart() about blocks. llvm-svn: 69201
Diffstat (limited to 'clang/test/Sema/variadic-block.c')
-rw-r--r--clang/test/Sema/variadic-block.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/clang/test/Sema/variadic-block.c b/clang/test/Sema/variadic-block.c
new file mode 100644
index 00000000000..29f597b0067
--- /dev/null
+++ b/clang/test/Sema/variadic-block.c
@@ -0,0 +1,41 @@
+// RUN: clang-cc %s -verify -fsyntax-only -fblocks
+
+#include <stdarg.h>
+
+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);
+ for (p = format; *p; p++) switch (*p) {
+ case 'i':
+ i = va_arg(argp, int);
+ result += i;
+ break;
+ case 'd':
+ d = va_arg(argp, double);
+ result += (int)d;
+ break;
+ case 'c':
+ c = va_arg(argp, int);
+ result += c;
+ break;
+ }
+ return result;
+ };
+ long testresult = addthem("ii", 10, 20);
+ if (testresult != 30) {
+ return 1;
+ }
+ testresult = addthem("idc", 30, 40.0, 'a');
+ if (testresult != (70+'a')) {
+ return 1;
+ }
+ return 0;
+}
+
OpenPOWER on IntegriCloud