variadic-block.c 1022 B

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