1dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov// expected-no-diagnostics
3dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
4dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr12262 {
5dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
6dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, typename... Ts>
7dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid abc1(int (*xxx)[sizeof ... (Ts) + 1]);
8dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
9dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid qq1 () {
10dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  abc1<int>(0);
11dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  abc1<int,double>(0);
12dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
13dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
14dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
15dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate <unsigned N> class array {};
16dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
17dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
18dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, typename... Types>
19dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovarray<sizeof...(Types)> make_array1(Types&&... args);
20dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
21dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid qq2 () {
22dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  array<1> arr = make_array1<int>(1);
23dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  array<3> arr2 = make_array1<int>(1,array<5>(),0.1);
24dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
25dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
26dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
27dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, typename... Types>
28dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovint make_array(array<sizeof...(Types)>&, Types... args);
29dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
30dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid qq3 () {
31dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  array<1> a1;
32dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  int aa1 = make_array<int>(a1,1);
33dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  array<2> a2;
34dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  int aa2 = make_array<int>(a2, 0L, "abc");
35dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
36dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
37dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
38dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename ... Ts>
39dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct AAA {
40dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template<typename T, typename... Types>
41dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  static array<sizeof...(Types)> make_array(Types ... args);
42dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov};
43dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
44dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid qq4 () {
45dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  array<2> arr2 = AAA<int, int>::make_array<int>(1,2);
46dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
47dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
48dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
49dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
50dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
51dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr12439 {
52dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
53dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<class... Members>
54dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct X {
55dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template<int Idx>
56dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  using get_t = decltype(sizeof...(Members));
57dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
58dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template<int i>
59dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  get_t<i> get();
60dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov};
61dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
62dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<class... Members>
63dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<int i>
64dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge PavlovX<Members...>::get_t<i> X<Members...>::get()
65dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{
66dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  return 0;
67dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
68dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
69dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
70dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
71dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
72dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr13272 {
73dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
74dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<bool B, class T = void>
75dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct enable_if { };
76dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
77dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<class T> struct enable_if<true, T> {
78dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  typedef T type;
79dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov};
80dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
81dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovclass Exception {};
82dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
83dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<class Ex, typename... Args>
84dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid cxx_throw(typename enable_if<(sizeof...(Args) > 0), const char *>::type fmt, Args&&... args) {
85dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  return;
86dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
87dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
88dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid test() {
89dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  cxx_throw<Exception>("Youpi",1);
90dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
91dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
92dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
93dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
94dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
95dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr13817 {
96dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
97dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate <unsigned>
98dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct zod;
99dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
100dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate <>
101dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct zod<1> {};
102dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
103dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate <typename T, typename ... Ts>
104dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovzod<sizeof...(Ts)> make_zod(Ts ...) {
105dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  return zod<sizeof...(Ts)>();
106dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
107dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
108dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovint main(int argc, char *argv[])
109dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{
110dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  make_zod<int>(1);
111dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  return 0;
112dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
113dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
114dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
115dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
116dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
117dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr14273 {
118dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
119dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, int i>
120dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct myType
121dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{ };
122dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
123dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T, typename... Args>
124dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct Counter
125dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{
126dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  static const int count = 1 + Counter<Args...>::count;
127dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov};
128dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
129dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename T>
130dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovstruct Counter<T>
131dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{
132dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  static const int count = 1;
133dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov};
134dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
135dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovtemplate<typename Arg, typename... Args>
136dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge PavlovmyType<Arg, sizeof...(Args)>* make_array_with_type(const Args&... args)
137dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{
138dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  return 0;
139dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
140dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
141dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovvoid func(void)
142dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{
143dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  make_array_with_type<char>(1,2,3);
144dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
145dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
146dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
147dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
148dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
149dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlovnamespace pr15112
150dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov{
151dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template<bool, typename _Tp = void>
152dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov    struct enable_if
153dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov    { };
154dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template<typename _Tp>
155dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov    struct enable_if<true,_Tp>
156dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov    { typedef _Tp type; };
157dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
158dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  typedef __typeof__(sizeof(int)) size_t;
159dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
160dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template <size_t n, typename T, typename... Args>
161dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  struct is_array_of { static const bool value = true; };
162dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
163dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  struct cpu { using value_type = void; };
164dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
165dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template <size_t Order, typename T>
166dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  struct coords_alias { typedef T type; };
167dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
168dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template <size_t Order, typename MemoryTag>
169dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  using coords = typename coords_alias<Order, MemoryTag>::type;
170dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
171dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  template <typename MemTag, typename... Args>
172dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  typename enable_if<is_array_of<sizeof...(Args), size_t, Args...>::value,
173dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov                     coords<sizeof...(Args), MemTag>>::type
174dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov    mkcoords(Args... args);
175dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov
176dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov  auto c1 = mkcoords<cpu>(0ul, 0ul, 0ul);
177dc49d523db70a1c9005b7c09de80b22ccb1ed6a4Serge Pavlov}
1783cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov
1793cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov
1803cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovnamespace pr12699 {
1813cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov
1823cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovtemplate<bool B>
1833cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovstruct bool_constant
1843cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov{
1853cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov  static const bool value = B;
1863cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov};
1873cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov
1883cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovtemplate<typename... A>
1893cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovstruct F
1903cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov{
1913cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov  template<typename... B>
1923cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov    using SameSize = bool_constant<sizeof...(A) == sizeof...(B)>;
1933cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov
1943cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov  template<typename... B, typename = SameSize<B...>>
1953cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov  F(B...) { }
1963cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov};
1973cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov
1983cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlovvoid func()
1993cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov{
2003cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov  F<int> f1(3);
2013cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov}
2023cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov
2033cb443636fb3ca457994d91527a22c5b159e5169Serge Pavlov}
204