1 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
2 | |
3 | static_assert(__has_builtin(__type_pack_element), ""); |
4 | |
5 | using SizeT = decltype(sizeof(int)); |
6 | |
7 | template <SizeT i, typename ...T> |
8 | using TypePackElement = __type_pack_element<i, T...>; |
9 | |
10 | template <int i> |
11 | struct X; |
12 | |
13 | static_assert(__is_same(TypePackElement<0, X<0>>, X<0>), ""); |
14 | |
15 | static_assert(__is_same(TypePackElement<0, X<0>, X<1>>, X<0>), ""); |
16 | static_assert(__is_same(TypePackElement<1, X<0>, X<1>>, X<1>), ""); |
17 | |
18 | static_assert(__is_same(TypePackElement<0, X<0>, X<1>, X<2>>, X<0>), ""); |
19 | static_assert(__is_same(TypePackElement<1, X<0>, X<1>, X<2>>, X<1>), ""); |
20 | static_assert(__is_same(TypePackElement<2, X<0>, X<1>, X<2>>, X<2>), ""); |
21 | |
22 | static_assert(__is_same(TypePackElement<0, X<0>, X<1>, X<2>, X<3>>, X<0>), ""); |
23 | static_assert(__is_same(TypePackElement<1, X<0>, X<1>, X<2>, X<3>>, X<1>), ""); |
24 | static_assert(__is_same(TypePackElement<2, X<0>, X<1>, X<2>, X<3>>, X<2>), ""); |
25 | static_assert(__is_same(TypePackElement<3, X<0>, X<1>, X<2>, X<3>>, X<3>), ""); |
26 | |
27 | static_assert(__is_same(TypePackElement<0, X<0>, X<1>, X<2>, X<3>, X<4>>, X<0>), ""); |
28 | static_assert(__is_same(TypePackElement<1, X<0>, X<1>, X<2>, X<3>, X<4>>, X<1>), ""); |
29 | static_assert(__is_same(TypePackElement<2, X<0>, X<1>, X<2>, X<3>, X<4>>, X<2>), ""); |
30 | static_assert(__is_same(TypePackElement<3, X<0>, X<1>, X<2>, X<3>, X<4>>, X<3>), ""); |
31 | static_assert(__is_same(TypePackElement<4, X<0>, X<1>, X<2>, X<3>, X<4>>, X<4>), ""); |
32 | |
33 | static_assert(__is_same(TypePackElement<0, X<0>, X<1>, X<2>, X<3>, X<4>, X<5>>, X<0>), ""); |
34 | static_assert(__is_same(TypePackElement<1, X<0>, X<1>, X<2>, X<3>, X<4>, X<5>>, X<1>), ""); |
35 | static_assert(__is_same(TypePackElement<2, X<0>, X<1>, X<2>, X<3>, X<4>, X<5>>, X<2>), ""); |
36 | static_assert(__is_same(TypePackElement<3, X<0>, X<1>, X<2>, X<3>, X<4>, X<5>>, X<3>), ""); |
37 | static_assert(__is_same(TypePackElement<4, X<0>, X<1>, X<2>, X<3>, X<4>, X<5>>, X<4>), ""); |
38 | static_assert(__is_same(TypePackElement<5, X<0>, X<1>, X<2>, X<3>, X<4>, X<5>>, X<5>), ""); |
39 | |
40 | // Test __type_pack_element with more than 2 top-level template arguments. |
41 | static_assert(__is_same(__type_pack_element<5, X<0>, X<1>, X<2>, X<3>, X<4>, X<5>>, X<5>), ""); |
42 | |
43 | template <SizeT Index, typename ...T> |
44 | using ErrorTypePackElement1 = __type_pack_element<Index, T...>; // expected-error{{may not be accessed at an out of bounds index}} |
45 | using illformed1 = ErrorTypePackElement1<3, X<0>, X<1>>; // expected-note{{in instantiation}} |
46 | |