summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/builtins-va_arg.cpp
diff options
context:
space:
mode:
authorLogan Chien <tzuhsiang.chien@gmail.com>2012-10-20 06:11:33 +0000
committerLogan Chien <tzuhsiang.chien@gmail.com>2012-10-20 06:11:33 +0000
commit2957489b3d120fd6fa8c7938a0217a7f8828849a (patch)
tree78a962aa82595e2680ab43992132d18a14ecff83 /clang/test/SemaCXX/builtins-va_arg.cpp
parenta2cd62a1e73c38477df852c86ffd59d4e0a2c848 (diff)
downloadbcm5719-llvm-2957489b3d120fd6fa8c7938a0217a7f8828849a.tar.gz
bcm5719-llvm-2957489b3d120fd6fa8c7938a0217a7f8828849a.zip
Fix __builtin_va_arg assertion failure in ARM AAPCS.
llvm-svn: 166369
Diffstat (limited to 'clang/test/SemaCXX/builtins-va_arg.cpp')
-rw-r--r--clang/test/SemaCXX/builtins-va_arg.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/builtins-va_arg.cpp b/clang/test/SemaCXX/builtins-va_arg.cpp
new file mode 100644
index 00000000000..4f549c8db6f
--- /dev/null
+++ b/clang/test/SemaCXX/builtins-va_arg.cpp
@@ -0,0 +1,52 @@
+// RUN: %clang_cc1 %s -ffreestanding
+// RUN: %clang_cc1 %s -ffreestanding -triple i686-unknown-linux
+// RUN: %clang_cc1 %s -ffreestanding -triple x86_64-unknown-linux
+// RUN: %clang_cc1 %s -ffreestanding -triple mips-unknown-linux
+// RUN: %clang_cc1 %s -ffreestanding -triple mipsel-unknown-linux
+// RUN: %clang_cc1 %s -ffreestanding -triple armv7-unknown-linux-gnueabi
+// RUN: %clang_cc1 %s -ffreestanding -triple thumbv7-unknown-linux-gnueabi
+
+#include "stdarg.h"
+
+int int_accumulator = 0;
+double double_accumulator = 0;
+
+int test_vprintf(const char *fmt, va_list ap) {
+ char ch;
+ int result = 0;
+ while (*fmt != '\0') {
+ ch = *fmt++;
+ if (ch != '%') {
+ continue;
+ }
+
+ ch = *fmt++;
+ switch (ch) {
+ case 'd':
+ int_accumulator += va_arg(ap, int);
+ result++;
+ break;
+
+ case 'f':
+ double_accumulator += va_arg(ap, double);
+ result++;
+ break;
+
+ default:
+ break;
+ }
+
+ if (ch == '0') {
+ break;
+ }
+ }
+ return result;
+}
+
+int test_printf(const char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ int result = test_vprintf(fmt, ap);
+ va_end(ap);
+ return result;
+}
OpenPOWER on IntegriCloud