50 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s2// expected-no-diagnostics3 4namespace ParameterPacksWithFunctions {5 template<typename ...> struct count;6 7 template<typename Head, typename ...Tail>8 struct count<Head, Tail...> {9 static const unsigned value = 1 + count<Tail...>::value;10 };11 12 template<>13 struct count<> {14 static const unsigned value = 0;15 };16 17 template<unsigned> struct unsigned_c { };18 19 template<typename ... Types>20 unsigned_c<count<Types...>::value> f();21 22 void test_f() {23 unsigned_c<0> uc0a = f(); // okay, deduced to an empty pack24 unsigned_c<0> uc0b = f<>();25 unsigned_c<1> uc1 = f<int>();26 unsigned_c<2> uc2 = f<float, double>();27 }28}29 30namespace rdar12176336 {31 typedef void (*vararg_func)(...);32 33 struct method {34 vararg_func implementation;35 36 method(vararg_func implementation) : implementation(implementation) {}37 38 template<typename TReturnType, typename... TArguments, typename TFunctionType = TReturnType (*)(TArguments...)>39 auto getImplementation() const -> TFunctionType40 {41 return reinterpret_cast<TFunctionType>(implementation);42 }43 };44 45 void f() {46 method m(nullptr);47 auto imp = m.getImplementation<int, int, int>();48 }49}50