1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-apple-darwin9
36eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson
46eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlssonvoid f1(int a)
56eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson{
66eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson    __builtin_va_list ap;
76eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson
86eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson    __builtin_va_start(ap, a, a); // expected-error {{too many arguments to function}}
96eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson    __builtin_va_start(ap, a); // expected-error {{'va_start' used in function with fixed args}}
106eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson}
116eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson
126eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlssonvoid f2(int a, int b, ...)
136eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson{
146eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson    __builtin_va_list ap;
156eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson
166eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson    __builtin_va_start(ap, 10); // expected-warning {{second parameter of 'va_start' not last named argument}}
176eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson    __builtin_va_start(ap, a); // expected-warning {{second parameter of 'va_start' not last named argument}}
186eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson    __builtin_va_start(ap, b);
196eda8c9cefb498ac8403bc65854e6ce411a07855Anders Carlsson}
2088cf226caee50956ef47edd4d44cf7b80703a26cAnders Carlsson
2188cf226caee50956ef47edd4d44cf7b80703a26cAnders Carlssonvoid f3(float a, ...)
2288cf226caee50956ef47edd4d44cf7b80703a26cAnders Carlsson{
2388cf226caee50956ef47edd4d44cf7b80703a26cAnders Carlsson    __builtin_va_list ap;
2488cf226caee50956ef47edd4d44cf7b80703a26cAnders Carlsson
2588cf226caee50956ef47edd4d44cf7b80703a26cAnders Carlsson    __builtin_va_start(ap, a);
2688cf226caee50956ef47edd4d44cf7b80703a26cAnders Carlsson    __builtin_va_start(ap, (a));
2788cf226caee50956ef47edd4d44cf7b80703a26cAnders Carlsson}
2858ace88985b920971b052de8a9a7b89de0654dc0Chris Lattner
2958ace88985b920971b052de8a9a7b89de0654dc0Chris Lattner
3058ace88985b920971b052de8a9a7b89de0654dc0Chris Lattner// stdarg: PR3075
3158ace88985b920971b052de8a9a7b89de0654dc0Chris Lattnervoid f4(const char *msg, ...) {
3258ace88985b920971b052de8a9a7b89de0654dc0Chris Lattner __builtin_va_list ap;
3358ace88985b920971b052de8a9a7b89de0654dc0Chris Lattner __builtin_stdarg_start((ap), (msg));
3458ace88985b920971b052de8a9a7b89de0654dc0Chris Lattner __builtin_va_end (ap);
3558ace88985b920971b052de8a9a7b89de0654dc0Chris Lattner}
3658ace88985b920971b052de8a9a7b89de0654dc0Chris Lattner
3756f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedmanvoid f5() {
3856f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedman  __builtin_va_list ap;
3956f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedman  __builtin_va_start(ap,ap); // expected-error {{'va_start' used in function with fixed args}}
4056f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedman}
4156f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedman
4256f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedmanvoid f6(int a, ...) {
4356f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedman  __builtin_va_list ap;
4456f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedman  __builtin_va_start(ap); // expected-error {{too few arguments to function}}
4556f20ae1010aa71defd7572f660b41288c56cdd1Eli Friedman}
466597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedman
476597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedman// PR3350
486597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedmanvoid
496597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedmanfoo(__builtin_va_list authors, ...) {
506597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedman  __builtin_va_start (authors, authors);
516597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedman  (void)__builtin_va_arg(authors, int);
526597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedman  __builtin_va_end (authors);
536597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedman}
546597f985156b3a24c0a9db1e01eeec85714c4a8dEli Friedman
55adadd8db2aba32f689e7057d8b7ce004be30685bDaniel Dunbarvoid f7(int a, ...) {
56adadd8db2aba32f689e7057d8b7ce004be30685bDaniel Dunbar  __builtin_va_list ap;
57adadd8db2aba32f689e7057d8b7ce004be30685bDaniel Dunbar  __builtin_va_start(ap, a);
58adadd8db2aba32f689e7057d8b7ce004be30685bDaniel Dunbar  // FIXME: This error message is sub-par.
5953202857c60214d80950a975e6e52aebf30bd16aEli Friedman  __builtin_va_arg(ap, int) = 1; // expected-error {{expression is not assignable}}
603fa3feab35096b608f1d79bb541798b37a55e7b9Richard Smith  int *x = &__builtin_va_arg(ap, int); // expected-error {{cannot take the address of an rvalue}}
61adadd8db2aba32f689e7057d8b7ce004be30685bDaniel Dunbar  __builtin_va_end(ap);
62adadd8db2aba32f689e7057d8b7ce004be30685bDaniel Dunbar}
63f502691c86299ed23b7e121e27610ba5bb44a1eeChris Lattner
640adde128d96a73864569516e684faa570e3c0333David Majnemervoid f8(int a, ...) {
650adde128d96a73864569516e684faa570e3c0333David Majnemer  __builtin_va_list ap;
660adde128d96a73864569516e684faa570e3c0333David Majnemer  __builtin_va_start(ap, a);
670adde128d96a73864569516e684faa570e3c0333David Majnemer  (void)__builtin_va_arg(ap, void); // expected-error {{second argument to 'va_arg' is of incomplete type 'void'}}
680adde128d96a73864569516e684faa570e3c0333David Majnemer  __builtin_va_end(ap);
690adde128d96a73864569516e684faa570e3c0333David Majnemer}
7046d37c10404097eed7c173b17e52693edcb66486Eli Friedman
7146d37c10404097eed7c173b17e52693edcb66486Eli Friedmanenum E { x = -1, y = 2, z = 10000 };
7246d37c10404097eed7c173b17e52693edcb66486Eli Friedmanvoid f9(__builtin_va_list args)
7346d37c10404097eed7c173b17e52693edcb66486Eli Friedman{
7446d37c10404097eed7c173b17e52693edcb66486Eli Friedman    (void)__builtin_va_arg(args, float); // expected-warning {{second argument to 'va_arg' is of promotable type 'float'}}
7546d37c10404097eed7c173b17e52693edcb66486Eli Friedman    (void)__builtin_va_arg(args, enum E); // Don't warn here in C
7646d37c10404097eed7c173b17e52693edcb66486Eli Friedman    (void)__builtin_va_arg(args, short); // expected-warning {{second argument to 'va_arg' is of promotable type 'short'}}
7746d37c10404097eed7c173b17e52693edcb66486Eli Friedman    (void)__builtin_va_arg(args, char); // expected-warning {{second argument to 'va_arg' is of promotable type 'char'}}
7846d37c10404097eed7c173b17e52693edcb66486Eli Friedman}
7954de9bb0e67a3c06f6daad27af74e87f84944fa3Enea Zaffanella
8054de9bb0e67a3c06f6daad27af74e87f84944fa3Enea Zaffanellavoid f10(int a, ...) {
8154de9bb0e67a3c06f6daad27af74e87f84944fa3Enea Zaffanella  int i;
8254de9bb0e67a3c06f6daad27af74e87f84944fa3Enea Zaffanella  __builtin_va_list ap;
8354de9bb0e67a3c06f6daad27af74e87f84944fa3Enea Zaffanella  i = __builtin_va_start(ap, a); // expected-error {{assigning to 'int' from incompatible type 'void'}}
8454de9bb0e67a3c06f6daad27af74e87f84944fa3Enea Zaffanella  __builtin_va_end(ap);
8554de9bb0e67a3c06f6daad27af74e87f84944fa3Enea Zaffanella}
86