diff options
| author | Reid Kleckner <reid@kleckner.net> | 2014-03-26 15:38:33 +0000 |
|---|---|---|
| committer | Reid Kleckner <reid@kleckner.net> | 2014-03-26 15:38:33 +0000 |
| commit | 597e81dea1059c8a075f29f5fcadcb1ae58e42e3 (patch) | |
| tree | 8f062e22ab2752e2074986c5e059dc808c26763d /clang/test/Sema/MicrosoftExtensions.c | |
| parent | c491a8d4577052bc6b3b4c72a7db6a7cfcbc2ed0 (diff) | |
| download | bcm5719-llvm-597e81dea1059c8a075f29f5fcadcb1ae58e42e3.tar.gz bcm5719-llvm-597e81dea1059c8a075f29f5fcadcb1ae58e42e3.zip | |
-fms-extensions: Add __va_start builtin, which is used for x64
The main difference between __va_start and __builtin_va_start is that
the address of the va_list has already been taken, and the va_list is
always a char*.
__va_end and __va_arg are not needed.
llvm-svn: 204821
Diffstat (limited to 'clang/test/Sema/MicrosoftExtensions.c')
| -rw-r--r-- | clang/test/Sema/MicrosoftExtensions.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/test/Sema/MicrosoftExtensions.c b/clang/test/Sema/MicrosoftExtensions.c index 4441f179736..a4afcb1e640 100644 --- a/clang/test/Sema/MicrosoftExtensions.c +++ b/clang/test/Sema/MicrosoftExtensions.c @@ -131,3 +131,17 @@ int *(__ptr32 __sptr wrong9); // expected-error {{'__sptr' attribute only applie typedef int *T; T __ptr32 wrong10; // expected-error {{'__ptr32' attribute only applies to pointer arguments}} + +typedef char *my_va_list; +void __cdecl __va_start(my_va_list *ap, ...); // expected-note {{passing argument to parameter 'ap' here}} +void vmyprintf(const char *f, my_va_list ap); +void myprintf(const char *f, ...) { + my_va_list ap; + if (1) { + __va_start(&ap, f); + vmyprintf(f, ap); + ap = 0; + } else { + __va_start(ap, f); // expected-warning {{incompatible pointer types passing 'my_va_list'}} + } +} |

