// RUN: %clang_cc1 -std=c++11 -emit-llvm -triple=x86_64-apple-darwin9 -o - %s | FileCheck %s template struct X { }; template struct identity { }; template struct add_reference; template struct tuple { }; template struct int_tuple { }; template class ...Templates> struct template_tuple { }; // CHECK: define weak_odr void @_Z2f0IJEEv1XIXsZT_EJDpRT_EE template void f0(X) { } template void f0(X<0>); // CHECK: define weak_odr void @_Z2f0IJifdEEv1XIXsZT_EJDpRT_EE template void f0(X<3, int&, float&, double&>); // Mangling for template argument packs template void f1() {} // CHECK: define weak_odr void @_Z2f1IJEEvv template void f1<>(); // CHECK: define weak_odr void @_Z2f1IJiEEvv template void f1(); // CHECK: define weak_odr void @_Z2f1IJifEEvv template void f1(); // Mangling function parameter packs template void f2(Types...) {} // CHECK: define weak_odr void @_Z2f2IJEEvDpT_ template void f2<>(); // CHECK: define weak_odr void @_Z2f2IJiEEvDpT_ template void f2(int); // CHECK: define weak_odr void @_Z2f2IJifEEvDpT_ template void f2(int, float); // Mangling non-trivial function parameter packs template void f3(const Types *...) {} // CHECK: define weak_odr void @_Z2f3IJEEvDpPKT_ template void f3<>(); // CHECK: define weak_odr void @_Z2f3IJiEEvDpPKT_ template void f3(const int*); // CHECK: define weak_odr void @_Z2f3IJifEEvDpPKT_ template void f3(const int*, const float*); // Mangling of type pack expansions in a template argument template tuple f4() {} // CHECK: define weak_odr void @_Z2f4IJifdEE5tupleIJDpT_EEv template tuple f4(); // Mangling of type pack expansions in a function type template identity f5() {} // CHECK: define weak_odr void @_Z2f5IiJifdEE8identityIFT_DpT0_EEv template identity f5(); // Mangling of non-type template argument expansions template int_tuple f6() {} // CHECK: define weak_odr void @_Z2f6IJLi1ELi2ELi3EEE9int_tupleIJXspT_EEEv template int_tuple<1, 2, 3> f6(); // Mangling of template template argument expansions template class ...Templates> template_tuple f7() {} // CHECK: define weak_odr void @_Z2f7IJ8identity13add_referenceEE14template_tupleIJDpT_EEv template template_tuple f7();