diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-09-23 21:41:42 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-09-23 21:41:42 +0000 |
commit | d784e6893cfbdd24b4f701e486adbab9906d4b27 (patch) | |
tree | cb6c302cc41d7d560f657e3ec93c7b0b75a4cb1d /clang/test/CodeGenCXX/mangle-variadic-templates.cpp | |
parent | ed9b8f0a373b01e93b139f33a85465d79b7154df (diff) | |
download | bcm5719-llvm-d784e6893cfbdd24b4f701e486adbab9906d4b27.tar.gz bcm5719-llvm-d784e6893cfbdd24b4f701e486adbab9906d4b27.zip |
PR14858: Initial support for proper sizeof... handling within alias templates.
This doesn't quite get alias template equivalence right yet, but handles the
egregious cases where we would silently give the wrong answers.
llvm-svn: 248431
Diffstat (limited to 'clang/test/CodeGenCXX/mangle-variadic-templates.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/mangle-variadic-templates.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/clang/test/CodeGenCXX/mangle-variadic-templates.cpp b/clang/test/CodeGenCXX/mangle-variadic-templates.cpp index 264cc113cd5..d2c1b772659 100644 --- a/clang/test/CodeGenCXX/mangle-variadic-templates.cpp +++ b/clang/test/CodeGenCXX/mangle-variadic-templates.cpp @@ -3,11 +3,12 @@ template<unsigned I, typename ...Types> struct X { }; -template<typename T> struct identity { }; +template<typename T> struct identity { using type = T; }; template<typename T> struct add_reference; template<typename ...Types> struct tuple { }; template<int ...Values> struct int_tuple { }; template<template<typename> class ...Templates> struct template_tuple { }; +template<typename ...T> using ArrayOfN = int[sizeof...(T)]; // CHECK-LABEL: define weak_odr void @_Z2f0IJEEv1XIXsZT_EJDpRT_EE template<typename ...Types> @@ -65,3 +66,12 @@ template<template<typename> class ...Templates> template_tuple<Templates...> f7() {} // CHECK-LABEL: define weak_odr void @_Z2f7IJ8identity13add_referenceEE14template_tupleIJDpT_EEv template template_tuple<identity, add_reference> f7(); + +template<typename T, typename ...U> void f8(ArrayOfN<int, U..., T, typename U::type...>&) {} +// CHECK-LABEL: define weak_odr void @_Z2f8IiJ8identityIiES0_IfEEEvRAsPiDpT0_T_DpNS3_4typeEE_i +template void f8<int, identity<int>, identity<float>>(int (&)[6]); + +template<typename ...T> void f10(ArrayOfN<T...> &) {} +// FIXME: This is wrong; should be @_Z3f10IJifEEvRAsZT__i +// CHECK-LABEL: define weak_odr void @_Z3f10IJifEEvRAsPDpT_E_i +template void f10<int, float>(int (&)[2]); |