varargs.c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // RUN: %clang_cc1 -fsyntax-only -verify %s
  2. // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-apple-darwin9
  3. void f1(int a)
  4. {
  5. __builtin_va_list ap;
  6. __builtin_va_start(ap, a, a); // expected-error {{too many arguments to function}}
  7. __builtin_va_start(ap, a); // expected-error {{'va_start' used in function with fixed args}}
  8. }
  9. void f2(int a, int b, ...)
  10. {
  11. __builtin_va_list ap;
  12. __builtin_va_start(ap, 10); // expected-warning {{second parameter of 'va_start' not last named argument}}
  13. __builtin_va_start(ap, a); // expected-warning {{second parameter of 'va_start' not last named argument}}
  14. __builtin_va_start(ap, b);
  15. }
  16. void f3(float a, ...)
  17. {
  18. __builtin_va_list ap;
  19. __builtin_va_start(ap, a);
  20. __builtin_va_start(ap, (a));
  21. }
  22. // stdarg: PR3075
  23. void f4(const char *msg, ...) {
  24. __builtin_va_list ap;
  25. __builtin_stdarg_start((ap), (msg));
  26. __builtin_va_end (ap);
  27. }
  28. void f5() {
  29. __builtin_va_list ap;
  30. __builtin_va_start(ap,ap); // expected-error {{'va_start' used in function with fixed args}}
  31. }
  32. void f6(int a, ...) {
  33. __builtin_va_list ap;
  34. __builtin_va_start(ap); // expected-error {{too few arguments to function}}
  35. }
  36. // PR3350
  37. void
  38. foo(__builtin_va_list authors, ...) {
  39. __builtin_va_start (authors, authors);
  40. (void)__builtin_va_arg(authors, int);
  41. __builtin_va_end (authors);
  42. }
  43. void f7(int a, ...) {
  44. __builtin_va_list ap;
  45. __builtin_va_start(ap, a);
  46. // FIXME: This error message is sub-par.
  47. __builtin_va_arg(ap, int) = 1; // expected-error {{expression is not assignable}}
  48. int *x = &__builtin_va_arg(ap, int); // expected-error {{cannot take the address of an rvalue}}
  49. __builtin_va_end(ap);
  50. }
  51. void f8(int a, ...) {
  52. __builtin_va_list ap;
  53. __builtin_va_start(ap, a);
  54. (void)__builtin_va_arg(ap, void); // expected-error {{second argument to 'va_arg' is of incomplete type 'void'}}
  55. __builtin_va_end(ap);
  56. }
  57. enum E { x = -1, y = 2, z = 10000 };
  58. void f9(__builtin_va_list args)
  59. {
  60. (void)__builtin_va_arg(args, float); // expected-warning {{second argument to 'va_arg' is of promotable type 'float'}}
  61. (void)__builtin_va_arg(args, enum E); // Don't warn here in C
  62. (void)__builtin_va_arg(args, short); // expected-warning {{second argument to 'va_arg' is of promotable type 'short'}}
  63. (void)__builtin_va_arg(args, char); // expected-warning {{second argument to 'va_arg' is of promotable type 'char'}}
  64. }
  65. void f10(int a, ...) {
  66. int i;
  67. __builtin_va_list ap;
  68. i = __builtin_va_start(ap, a); // expected-error {{assigning to 'int' from incompatible type 'void'}}
  69. __builtin_va_end(ap);
  70. }