1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
32e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor
42e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor// Note: Template argument deduction involving parameter packs
52e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor// (14.5.3) can deduce zero or more arguments for each parameter pack.
62e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor
72e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregortemplate<class> struct X {
82e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor  static const unsigned value = 0;
92e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor};
102e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor
112e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregortemplate<class R, class ... ArgTypes> struct X<R(int, ArgTypes ...)> {
122e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor  static const unsigned value = 1;
132e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor};
142e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor
152e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregortemplate<class ... Types> struct Y {
162e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor  static const unsigned value = 0;
172e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor};
182e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor
192e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregortemplate<class T, class ... Types> struct Y<T, Types& ...> {
202e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor  static const unsigned value = 1;
212e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor};
222e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor
232e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregortemplate<class ... Types> int f(void (*)(Types ...));
242e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregorvoid g(int, float);
252e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregor
262e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregorint check0[X<int>::value == 0? 1 : -1]; // uses primary template
272e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregorint check1[X<int(int, float, double)>::value == 1? 1 : -1]; // uses partial specialization
282e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregorint check2[X<int(float, int)>::value == 0? 1 : -1]; // uses primary template
292e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregorint check3[Y<>::value == 0? 1 : -1]; // uses primary template
302e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregorint check4[Y<int&, float&, double&>::value == 1? 1 : -1]; // uses partial specialization
312e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregorint check5[Y<int, float, double>::value == 0? 1 : -1]; // uses primary template
322e996d929d2593e5131640e774d04fe433ba5f89Douglas Gregorint fv = f(g); // okay
33