summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/mangle-variadic-templates.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-09-23 21:41:42 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-09-23 21:41:42 +0000
commitd784e6893cfbdd24b4f701e486adbab9906d4b27 (patch)
treecb6c302cc41d7d560f657e3ec93c7b0b75a4cb1d /clang/test/CodeGenCXX/mangle-variadic-templates.cpp
parented9b8f0a373b01e93b139f33a85465d79b7154df (diff)
downloadbcm5719-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.cpp12
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]);
OpenPOWER on IntegriCloud