aboutsummaryrefslogtreecommitdiff
path: root/final/ABI-Testsuite/test/mangling/template_parameter_substitution.xpp
diff options
context:
space:
mode:
Diffstat (limited to 'final/ABI-Testsuite/test/mangling/template_parameter_substitution.xpp')
-rwxr-xr-xfinal/ABI-Testsuite/test/mangling/template_parameter_substitution.xpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/final/ABI-Testsuite/test/mangling/template_parameter_substitution.xpp b/final/ABI-Testsuite/test/mangling/template_parameter_substitution.xpp
new file mode 100755
index 00000000..69c84abf
--- /dev/null
+++ b/final/ABI-Testsuite/test/mangling/template_parameter_substitution.xpp
@@ -0,0 +1,94 @@
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+// RUN: cxx_compiler -c %s -o %t.o
+// RUN: bindump %t.o | FileCheck prefixes %s
+
+// template_parameter_substitution
+
+struct bar {};
+
+// CHECK-DAG: _Z3fooI3barEvT_
+template <typename T> void foo(T);
+template <> void foo<bar>(bar) {}
+
+// CHECK-DAG: _Z3fooI3barET_S1_
+template <typename T> T foo(T);
+template <> bar foo<bar>(bar) { bar b; return b; }
+
+// CHECK-DAG: _Z3fooIh3barET_T0_
+template <typename T, typename U> T foo(U);
+template <> unsigned char foo<unsigned char, bar>(bar) { return 0; }
+
+// CHECK-DAG: _ZN4testIcE3bazIiEEcT_
+template <typename T> struct test {
+ template <typename U> T baz(U);
+};
+template <> template <> char test<char>::baz<int>(int) { return 0; }
+
+// CHECK-DAG: _Z3fooI3basIiEjEvT_T0_
+template <typename T> struct bas {};
+template <class C, typename U> void foo(C, U);
+template <> void foo<bas<int>, unsigned int>(bas<int>, unsigned int) {}
+
+// CHECK-DAG: _Z4foo1I3barEPvv
+template <typename T> void * foo1();
+template <> void* foo1<bar>() { return 0; }
+
+// CHECK-DAG: _Z4foo2I3barEKcv
+template <typename T> char const foo2();
+template <> char const foo2<bar>() { return 0; }
+
+// CHECK-DAG: _Z4foo3ILi2EEv3batIXT_EE
+template <int I> struct bat {};
+template <int I> void foo3(bat<I>);
+template <> void foo3<2>(bat<2>) {}
+
+// CHECK-DAG: _Z4foo4Ih1SEPT_RT0_PKcS6_
+struct S {};
+template <typename T, class C> T* foo4(C&, char const*, char const*);
+template <> unsigned char* foo4<unsigned char, S>(S&, char const*, char const*) { return 0; }
+
+// CHECK-DAG: _Z4foo5IfcEvT_PFiT0_E
+template <typename T, typename U> void foo5(T, int (*)(U));
+template <> void foo5<float, char>(float, int (*)(char)) {}
+
+// CHECK-DAG: _Z3fudIcLi1EEvT_PAT0__PFiS0_E
+template <typename T, int I> void fud(T, int (* (*) [I])(T));
+template <> void fud<char, 1>(char, int (* (*) [1])(char)) {}
+
+// CHECK-DAG: _Z5OuterI5InnerIfEEiT_
+template <typename T> struct Inner {};
+template <typename U> int Outer(U);
+template <> int Outer<Inner<float> >(Inner<float>) { return 0; }
+
+// parameter packs
+// CHECK-DAG: _Z4foo6IJEEvi
+template<class... Types> void foo6(int);
+template <> void foo6<>(int) {}
+
+// CHECK-DAG: _Z4foo7IiJEEvf
+template<typename, class... Types> void foo7(float);
+template <> void foo7<int>(float) {}
+
+// CHECK-DAG: _Z4foo8IJjlEEvi
+template<class... Types> void foo8(int);
+template <> void foo8<unsigned int, long>(int) {}
+
+// CHECK-DAG: _Z4foo9IfJjlEEvi
+template<typename, class... Types> void foo9(int);
+template <> void foo9<float, unsigned int, long>(int) {}
+
+// CHECK-DAG: _Z5foo10IjJlEERT_PS0_
+template <typename T, class... Types> T& foo10(T*);
+template <> unsigned int& foo10<unsigned int, long>(unsigned int* a) { return (unsigned int&)a; }
+
+// CHECK-DAG: _Z5foo11IJifPcEEvDpT_
+template <typename... Types> void foo11(Types...);
+template <> void foo11<int, float, char*>(int, float, char*) {}
+
+// CHECK-DAG: _Z5foo12IiJf3bauIcJlEEEEvRT_
+template <typename T, typename ...Types> struct bau {};
+template <typename T, typename ...Types> void foo12(T&);
+template <> void foo12<int, float, bau<char, long> >(int&) {}
+