diff --git a/libc/test/src/__support/arg_list_test.cpp b/libc/test/src/__support/arg_list_test.cpp --- a/libc/test/src/__support/arg_list_test.cpp +++ b/libc/test/src/__support/arg_list_test.cpp @@ -56,3 +56,98 @@ ASSERT_EQ(sum_two_nums(3, 5, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024), 40); } + +long int check_primitives(int first, ...) { + va_list vlist; + va_start(vlist, first); + __llvm_libc::internal::ArgList args(vlist); + va_end(vlist); + + long int count = 0; + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += args.next_var(); + count += *args.next_var(); + return count; +} + +TEST(LlvmLibcArgListTest, TestPrimitiveTypes) { + char c = 1; + short s = 1; + int i = 1; + long l = 1; + long long ll = 1; + intmax_t m = 1; + size_t st = 1; + ptrdiff_t pt = 1; + float f = 1.0; + double d = 1.0; + long double ld = 1.0; + void *p = &i; + ASSERT_EQ(check_primitives(0, c, s, i, l, ll, m, st, pt, f, d, ld, p), 12l); +} + +struct S { + char c; + short s; + int i; + long l; + float f; + double d; +}; + +long int check_struct_type(int first, ...) { + va_list vlist; + va_start(vlist, first); + __llvm_libc::internal::ArgList args(vlist); + va_end(vlist); + + S s = args.next_var(); + int last = args.next_var(); + return s.c + s.s + s.i + s.l + s.f + s.d + last; +} + +TEST(LlvmLibcArgListTest, TestStructTypes) { + S s{'\x1', 1, 1, 1l, 1.0f, 1.0}; + ASSERT_EQ(check_struct_type(0, s, 1), 7l); +} + +// Test vector extensions from clang. +#ifdef __clang__ + +using int1 = int __attribute__((ext_vector_type(1))); +using int2 = int __attribute__((ext_vector_type(2))); +using int3 = int __attribute__((ext_vector_type(3))); +using int4 = int __attribute__((ext_vector_type(4))); + +int check_vector_type(int first, ...) { + va_list vlist; + va_start(vlist, first); + __llvm_libc::internal::ArgList args(vlist); + va_end(vlist); + + int1 v1 = args.next_var(); + int2 v2 = args.next_var(); + int3 v3 = args.next_var(); + int4 v4 = args.next_var(); + + return v1.x + v2.x + v2.y + v3.x + v3.y + v3.z + v4.x + v4.y + v4.z + v4.w; +} + +TEST(LlvmLibcArgListTest, TestVectorTypes) { + int1 v1 = {1}; + int2 v2 = {1, 2}; + int3 v3 = {1, 2, 3}; + int4 v4 = {1, 2, 3, 4}; + ASSERT_EQ(check_vector_type(0, v1, v2, v3, v4), 20); +} + +#endif