1 //===-- Unittests for ArgList ---------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "src/__support/arg_list.h"
10 
11 #include "utils/UnitTest/Test.h"
12 
get_nth_int(int n,...)13 int get_nth_int(int n, ...) {
14   va_list vlist;
15   va_start(vlist, n);
16   __llvm_libc::internal::ArgList v(vlist);
17   va_end(vlist);
18 
19   for (int i = 0; i < n; ++i) {
20     v.next_var<int>();
21   }
22   return v.next_var<int>();
23 }
24 
TEST(LlvmLibcArgListTest,BasicUsage)25 TEST(LlvmLibcArgListTest, BasicUsage) {
26   ASSERT_EQ(get_nth_int(5, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90), 50);
27 }
28 
sum_two_nums(int first,int second,...)29 int sum_two_nums(int first, int second, ...) {
30   va_list vlist;
31   va_start(vlist, second);
32   __llvm_libc::internal::ArgList v1(vlist);
33   va_end(vlist);
34 
35   __llvm_libc::internal::ArgList v2 = v1;
36 
37   int first_val;
38   for (int i = 0; i < first; ++i) {
39     v1.next_var<int>();
40   }
41   first_val = v1.next_var<int>();
42 
43   int second_val;
44   for (int i = 0; i < second; ++i) {
45     v2.next_var<int>();
46   }
47   second_val = v2.next_var<int>();
48 
49   return first_val + second_val;
50 }
51 
TEST(LlvmLibcArgListTest,CopyConstructor)52 TEST(LlvmLibcArgListTest, CopyConstructor) {
53   ASSERT_EQ(sum_two_nums(3, 1, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024),
54             10);
55 
56   ASSERT_EQ(sum_two_nums(3, 5, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024),
57             40);
58 }
59