brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.6 KiB · 536592c Raw
404 lines · cpp
1// RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s2// RUN: %clang_cc1 -std=c++20 %s -triple x86_64-windows -emit-llvm -o - | FileCheck %s --check-prefix=MSABI3 4#define fold(x) (__builtin_constant_p(x) ? (x) : (x))5 6struct A { int a; const int b; };7template<A> void f() {}8 9// CHECK: define weak_odr void @_Z1fIXtl1ALi1ELi2EEEEvv(10// MSABI: define {{.*}} @"??$f@$2UA@@H00$$CBH01@@@YAXXZ"11template void f<A{1, 2}>();12 13struct B { const int *p; int k; };14template<B> void f() {}15 16int n = 0;17// CHECK: define weak_odr void @_Z1fIXtl1BadL_Z1nEEEEvv(18// MSABI: define {{.*}} @"??$f@$2UB@@PEBHE?n@@3HAH0A@@@@YAXXZ"19template void f<B{&n}>();20// CHECK: define weak_odr void @_Z1fIXtl1BLPKi0ELi1EEEEvv(21// MSABI: define {{.*}} @"??$f@$2UB@@PEBH0A@H00@@@YAXXZ"22template void f<B{nullptr, 1}>();23// CHECK: define weak_odr void @_Z1fIXtl1BEEEvv(24// MSABI: define {{.*}} @"??$f@$2UB@@PEBH0A@H0A@@@@YAXXZ"25template void f<B{nullptr}>();26// These are extensions, but they seem like the obvious manglings.27// CHECK: define weak_odr void @_Z1fIXtl1BLPKi32EEEEvv(28// MSABI: define {{.*}} @"??$f@$2UB@@PEBH0CA@H0A@@@@YAXXZ"29template void f<B{fold((int*)32)}>();30 31// CHECK: define weak_odr void @_Z1fIXtl1BLPKi0ELi2EEEEvv(32// MSABI: define {{.*}} @"??$f@$2UB@@PEBH0A@H01@@@YAXXZ"(33template void f<B{fold(reinterpret_cast<int*>(0)), 2}>();34 35// CHECK: define weak_odr void @_Z1fIXtl1BLPKi12EEEEvv(36// MSABI: define {{.*}} @"??$f@$2UB@@PEBH0M@H0A@@@@YAXXZ"(37template void f<B{fold(reinterpret_cast<int*>(12))}>();38 39// Pointers to subobjects.40struct Nested { union { int k; int arr[2]; }; } nested[2];41struct Derived : A, Nested { int z; A a_field; } extern derived;42// CHECK: define weak_odr void @_Z1fIXtl1BadsoKiL_Z7derivedE16EEEEvv43// MSABI: define {{.*}} void @"??$f@$2UB@@PEBH56E?derived@@3UDerived@@Az@@@H0A@@@@YAXXZ"44template void f<B{&derived.z}>();45// CHECK: define weak_odr void @_Z1fIXtl1BadsoKiL_Z7derivedE20EEEEvv46// MSABI: define {{.*}} void @"??$f@$2UB@@PEBH566E?derived@@3UDerived@@Aa_field@@a@@@H0A@@@@YAXXZ"47template void f<B{&derived.a_field.a}>();48// CHECK: define weak_odr void @_Z1fIXtl1BadsoKiL_Z6nestedE_EEEEvv49// MSABI: define {{.*}} void @"??$f@$2UB@@PEBH56CE?nested@@3PAUNested@@A0A@@k@@@H0A@@@@YAXXZ"50template void f<B{&nested[0].k}>();51// Mangling of pointers to nested array elements and past-the-end pointers52// is still incorrect in MSVC.53#ifndef _WIN3254// CHECK: define weak_odr void @_Z1fIXtl1BadsoKiL_Z6nestedE16_0pEEEEvv55template void f<B{&nested[1].arr[2]}>();56// CHECK: define weak_odr void @_Z1fIXtl1BadsoKiL_Z7derivedE8pEEEEvv57template void f<B{&derived.b + 1}>();58// CHECK: define weak_odr void @_Z1fIXtl1BcvPKiplcvPcadL_Z7derivedELl16EEEEvv59template void f<B{fold(&derived.b + 3)}>();60#endif61 62// References to subobjects.63struct BR { const int &r; };64template<BR> void f() {}65// CHECK: define weak_odr void @_Z1fIXtl2BRsoKiL_Z7derivedE16EEEEvv66// MSABI: define {{.*}} void @"??$f@$2UBR@@AEBH6E?derived@@3UDerived@@Az@@@@@YAXXZ"67template void f<BR{derived.z}>();68// CHECK: define weak_odr void @_Z1fIXtl2BRsoKiL_Z6nestedE_EEEEvv69// MSABI: define {{.*}} void @"??$f@$2UBR@@AEBH6CE?nested@@3PAUNested@@A0A@@k@@@@@YAXXZ"70template void f<BR{nested[0].k}>();71// CHECK: define weak_odr void @_Z1fIXtl2BRsoKiL_Z6nestedE12_0EEEEvv72// MSABI: define {{.*}} void @"??$f@$2UBR@@AEBHC6CE?nested@@3PAUNested@@A00@arr@@00@@@@YAXXZ"73template void f<BR{nested[1].arr[1]}>();74// CHECK: define weak_odr void @_Z1fIXtl2BRsoKiL_Z7derivedE4EEEEvv75// MSABI: define {{.*}} void @"??$f@$2UBR@@AEBH66E?derived@@3UDerived@@AA@@b@@@@@YAXXZ"76template void f<BR{derived.b}>();77#ifndef _WIN3278// CHECK: define weak_odr void @_Z1fIXtl2BRdecvPKiplcvPcadL_Z7derivedELl16EEEEvv79template void f<BR{fold(*(&derived.b + 3))}>();80#endif81 82// Qualification conversions.83struct C { const int *p; };84template<C> void f() {}85// CHECK: define weak_odr void @_Z1fIXtl1CadsoKiL_Z7derivedE16EEEEvv86// MSABI: define {{.*}} void @"??$f@$2UC@@PEBH56E?derived@@3UDerived@@Az@@@@@@YAXXZ"87template void f<C{&derived.z}>();88// CHECK: define weak_odr void @_Z1fIXtl1CadsoKiL_Z7derivedE4EEEEvv89// MSABI: define {{.*}} void @"??$f@$2UC@@PEBH566E?derived@@3UDerived@@AA@@b@@@@@@YAXXZ"90template void f<C{&derived.b}>();91 92// Pointers to members.93struct D { const int Derived::*p; int k; };94template<D> void f() {}95// CHECK: define weak_odr void @_Z1fIXtl1DLM7DerivedKi0ELi1EEEEvv96// MSABI: define {{.*}} @"??$f@$2UD@@PERDerived@@HNH00@@@YAXXZ"97template void f<D{nullptr, 1}>();98// CHECK: define weak_odr void @_Z1fIXtl1DEEEvv99// MSABI: define {{.*}} @"??$f@$2UD@@PERDerived@@HNH0A@@@@YAXXZ"100template void f<D{nullptr}>();101// CHECK: define weak_odr void @_Z1fIXtl1DadL_ZN7Derived1zEEEEEvv102// MSABI: define {{.*}} @"??$f@$2UD@@PERDerived@@H82@z@@H0A@@@@YAXXZ"103template void f<D{&Derived::z}>();104// CHECK: define weak_odr void @_Z1fIXtl1DmcM7DerivedKiadL_ZN1A1aEEEEEEvv105// MSABI: define {{.*}} @"??$f@$2UD@@PERDerived@@H8A@@a@@H0A@@@@YAXXZ"106template void f<D{&A::a}>();107// CHECK: define weak_odr void @_Z1fIXtl1DmcM7DerivedKiadL_ZN1A1bEEEEEEvv108// MSABI: define {{.*}} @"??$f@$2UD@@PERDerived@@H8A@@b@@H0A@@@@YAXXZ"109template void f<D{&A::b}>();110// FIXME: Is the Ut_1 mangling here correct?111// CHECK: define weak_odr void @_Z1fIXtl1DmcM7DerivedKiadL_ZN6NestedUt_1kEE8ELi2EEEEvv112// MSABI: define {{.*}} @"??$f@$2UD@@PERDerived@@H8<unnamed-tag>@Nested@@k@@H01@@@YAXXZ"113template void f<D{&Nested::k, 2}>();114struct MoreDerived : A, Derived { int z; };115// CHECK: define weak_odr void @_Z1fIXtl1DmcM7DerivedKiadL_ZN11MoreDerived1zEEn8EEEEvv116// MSABI: define {{.*}} @"??$f@$2UD@@PERDerived@@H8MoreDerived@@z@@H0A@@@@YAXXZ"117template void f<D{(int Derived::*)&MoreDerived::z}>();118 119struct DerivedVirtually : virtual A, Nested { int z; };120struct D2 { const int DerivedVirtually::*p; int k; };121template<D2> void f() {}122// CHECK: define weak_odr void @_Z1fIXtl2D2LM16DerivedVirtuallyKi0ELi1EEEEvv123// MSABI: define {{.*}} @"??$f@$2UD2@@PERDerivedVirtually@@HFA@?0H00@@@YAXXZ"124template void f<D2{nullptr, 1}>();125// CHECK: define weak_odr void @_Z1fIXtl2D2EEEvv126// MSABI: define {{.*}} @"??$f@$2UD2@@PERDerivedVirtually@@HFA@?0H0A@@@@YAXXZ"127template void f<D2{nullptr}>();128// CHECK: define weak_odr void @_Z1fIXtl2D2adL_ZN16DerivedVirtually1zEEEEEvv129// MSABI: define {{.*}} @"??$f@$2UD2@@PERDerivedVirtually@@HFBA@A@H0A@@@@YAXXZ"130template void f<D2{&DerivedVirtually::z}>();131 132// Forward-decl without MS inheritance keyword means unspecified inheritance133// which is different from e. g. single inheritance.134struct UnspecInherStruct;135struct D3 { const int UnspecInherStruct::*p; };136template<D3> void f() {}137struct UnspecInherStruct { int i; };138// CHECK: define weak_odr void @_Z1fIXtl2D3adL_ZN17UnspecInherStruct1iEEEEEvv139// MSABI: define {{.*}} @"??$f@$2UD3@@PERUnspecInherStruct@@HGA@A@A@@@@YAXXZ"140template void f<D3{&UnspecInherStruct::i}>();141 142// Pointers to member functions.143// Test struct templates instead of function templates so as to cover144// the separate code which handles nullptr in their pointer-to-member arguments.145struct Derived2 : A, Nested { void f(); virtual void g(); };146struct D4 { void (Derived2::*p)(); };147template <D4> struct S1 { static void fn() {} };148// CHECK: define weak_odr void @_ZN2S1IXtl2D4adL_ZN8Derived21fEvEEEE2fnEv149// MSABI: define {{.*}} @"?fn@?$S1@$2UD4@@P8Derived2@@EAAXXZE?f@2@QEAAXXZ@@@SAXXZ"150template void S1<D4{&Derived2::f}>::fn();151// CHECK: define weak_odr void @_ZN2S1IXtl2D4adL_ZN8Derived21gEvEEEE2fnEv152// MSABI: define {{.*}} @"?fn@?$S1@$2UD4@@P8Derived2@@EAAXXZE??_92@$BA@AA@@@SAXXZ"153template void S1<D4{&Derived2::g}>::fn();154// CHECK: define weak_odr void @_ZN2S1IXtl2D4EEE2fnEv155// MSABI: define {{.*}} @"?fn@?$S1@$2UD4@@P8Derived2@@EAAXXZHA@@@@SAXXZ"156template void S1<D4{nullptr}>::fn();157 158struct NoInheritance { void f(); };159struct D5 { void (NoInheritance::*p)(); };160template <D5> struct S2 { static void fn() {} };161// CHECK: define weak_odr void @_ZN2S2IXtl2D5adL_ZN13NoInheritance1fEvEEEE2fnEv162// MSABI: define {{.*}} @"?fn@?$S2@$2UD5@@P8NoInheritance@@EAAXXZE?f@2@QEAAXXZ@@@SAXXZ"163template void S2<D5{&NoInheritance::f}>::fn();164// CHECK: define weak_odr void @_ZN2S2IXtl2D5EEE2fnEv165// MSABI: define {{.*}} @"?fn@?$S2@$2UD5@@P8NoInheritance@@EAAXXZN@@@SAXXZ"166template void S2<D5{nullptr}>::fn();167 168struct NoInheritanceButUnspecified;169struct D6 { void (NoInheritanceButUnspecified::*p)(); };170template <D6> struct S3 { static void fn() {} };171// CHECK: define weak_odr void @_ZN2S3IXtl2D6EEE2fnEv172// MSABI: define {{.*}} @"?fn@?$S3@$2UD6@@P8NoInheritanceButUnspecified@@EAAXXZJA@A@?0@@@SAXXZ"173template void S3<D6{nullptr}>::fn();174 175 176union E {177  int n;178  float f;179  constexpr E() {}180  constexpr E(int n) : n(n) {}181  constexpr E(float f) : f(f) {}182};183template<E> void f() {}184 185// Union members.186// CHECK: define weak_odr void @_Z1fIL1EEEvv(187// MSABI: define {{.*}} @"??$f@$7TE@@@@@YAXXZ"188template void f<E{}>();189// CHECK: define weak_odr void @_Z1fIXtl1EEEEvv(190// MSABI: define {{.*}} @"??$f@$7TE@@n@0A@@@@YAXXZ"191template void f<E(0)>();192// CHECK: define weak_odr void @_Z1fIXtl1Edi1nLi42EEEEvv(193// MSABI: define {{.*}} @"??$f@$7TE@@n@0CK@@@@YAXXZ"194template void f<E(42)>();195// CHECK: define weak_odr void @_Z1fIXtl1Edi1fLf00000000EEEEvv(196// MSABI: define {{.*}} @"??$f@$7TE@@0AA@@@@YAXXZ"197template void f<E(0.f)>();198 199// immintrin.h vector types.200typedef float __m128 __attribute__((__vector_size__(16)));201typedef double __m128d __attribute__((__vector_size__(16)));202typedef long long __m128i __attribute__((__vector_size__(16)));203struct M128 { __m128 a; };204struct M128D { __m128d b; };205struct M128I { __m128i c; };206template<M128> void f() {}207template<M128D> void f() {}208template<M128I> void f() {}209// MSABI: define {{.*}} @"??$f@$2UM128@@2T__m128@@3MADPIAAAAA@@AEAAAAAAA@@AEAEAAAAA@@AEAIAAAAA@@@@@@@YAXXZ"210template void f<M128{1, 2, 3, 4}>();211// MSABI: define {{.*}} @"??$f@$2UM128D@@2U__m128d@@3NBDPPAAAAAAAAAAAAA@@BEAAAAAAAAAAAAAAA@@@@@@@YAXXZ"212template void f<M128D{1, 2}>();213// FIXME: We define __m128i as a vector of long long, whereas MSVC appears to214// mangle it as if it were a vector of char.215// MSABI-FIXME: define {{.*}} @"??$f@$2UM128I@@2T__m128i@@3D00@01@0A@@0A@@0A@@0A@@0A@@0A@@0A@@0A@@0A@@0A@@0A@@0A@@0A@@0A@@@@@@@YAXXZ"216// MSABI: define {{.*}} @"??$f@$2UM128I@@2T__m128i@@3_J00@01@@@@@@YAXXZ"217template void f<M128I{1, 2}>();218 219// Extensions, and dropping trailing zero-initialized elements of 'tl'220// manglings.221typedef int __attribute__((ext_vector_type(3))) VI3;222struct F { VI3 v; _Complex int ci; _Complex float cf; };223template<F> void f() {}224// CHECK: define weak_odr void @_Z1fIXtl1FtlDv3_iLi1ELi2ELi3EEtlCiLi4ELi5EEtlCfLf40c00000ELf40e00000EEEEEvv225// MSABI: define {{.*}} @"??$f@$2UF@@2T?$__vector@H$02@__clang@@3H00@01@02@@@2U?$_Complex@H@3@0304@2U?$_Complex@M@3@AEAMAAAAA@AEAOAAAAA@@@@@YAXXZ"226template void f<F{{1, 2, 3}, {4, 5}, {6, 7}}>();227// CHECK: define weak_odr void @_Z1fIXtl1FtlDv3_iLi1ELi2ELi3EEtlCiLi4ELi5EEtlCfLf40c00000EEEEEvv228template void f<F{{1, 2, 3}, {4, 5}, {6, 0}}>();229// CHECK: define weak_odr void @_Z1fIXtl1FtlDv3_iLi1ELi2ELi3EEtlCiLi4ELi5EEEEEvv230template void f<F{{1, 2, 3}, {4, 5}, {0, 0}}>();231// CHECK: define weak_odr void @_Z1fIXtl1FtlDv3_iLi1ELi2ELi3EEtlCiLi4EEEEEvv232template void f<F{{1, 2, 3}, {4, 0}, {0, 0}}>();233// CHECK: define weak_odr void @_Z1fIXtl1FtlDv3_iLi1ELi2ELi3EEEEEvv234template void f<F{{1, 2, 3}, {0, 0}, {0, 0}}>();235// CHECK: define weak_odr void @_Z1fIXtl1FtlDv3_iLi1ELi2EEEEEvv236template void f<F{{1, 2, 0}, {0, 0}, {0, 0}}>();237// CHECK: define weak_odr void @_Z1fIXtl1FtlDv3_iLi1EEEEEvv238template void f<F{{1, 0, 0}, {0, 0}, {0, 0}}>();239// CHECK: define weak_odr void @_Z1fIXtl1FEEEvv240// MSABI: define {{.*}} @"??$f@$2UF@@2T?$__vector@H$02@__clang@@3H0A@@0A@@0A@@@@2U?$_Complex@H@3@0A@0A@@2U?$_Complex@M@3@AA@AA@@@@@YAXXZ"241template void f<F{{0, 0, 0}, {0, 0}, {0, 0}}>();242 243// Unnamed bit-fields.244struct G {245  int : 3;246  int a : 4;247  int : 5;248  int b : 6;249  int : 7;250};251template<G> void f() {}252// CHECK: define weak_odr void @_Z1fIXtl1GEEEvv253// MSABI: define {{.*}} @"??$f@$2UG@@H0A@H0A@@@@YAXXZ"254template void f<(G())>();255// CHECK: define weak_odr void @_Z1fIXtl1GLi1EEEEvv256// MSABI: define {{.*}} @"??$f@$2UG@@H00H0A@@@@YAXXZ"257template void f<G{1}>();258// CHECK: define weak_odr void @_Z1fIXtl1GLi1ELi2EEEEvv259// MSABI: define {{.*}} @"??$f@$2UG@@H00H01@@@YAXXZ"260template void f<G{1, 2}>();261// CHECK: define weak_odr void @_Z1fIXtl1GLin8ELin32EEEEvv262// MSABI: define {{.*}} @"??$f@$2UG@@H0?7H0?CA@@@@YAXXZ"263template void f<G{-8, -32}>();264 265// Empty and nearly-empty unions.266union H1 {};267union H2 { int : 1, : 2, : 3; };268union H3 { int : 1, a, : 2, b, : 3; };269struct H4 { H2 h2; };270template<H1> void f() {}271template<H2> void f() {}272template<H3> void f() {}273template<H4> void f() {}274// CHECK: define weak_odr void @_Z1fIL2H1EEvv275// MSABI: define {{.*}} @"??$f@$7TH1@@@@@YAXXZ"276template void f<H1{}>();277// CHECK: define weak_odr void @_Z1fIL2H2EEvv278// MSABI: define {{.*}} @"??$f@$7TH2@@@@@YAXXZ"279template void f<H2{}>();280// CHECK: define weak_odr void @_Z1fIXtl2H3EEEvv281// MSABI: define {{.*}} @"??$f@$7TH3@@a@0A@@@@YAXXZ"282template void f<H3{.a = 0}>();283// CHECK: define weak_odr void @_Z1fIXtl2H3di1aLi1EEEEvv284// MSABI: define {{.*}} @"??$f@$7TH3@@a@00@@@YAXXZ"285template void f<H3{.a = 1}>();286// CHECK: define weak_odr void @_Z1fIXtl2H3di1bLi0EEEEvv287// MSABI: define {{.*}} @"??$f@$7TH3@@b@0A@@@@YAXXZ"288template void f<H3{.b = 0}>();289// CHECK: define weak_odr void @_Z1fIXtl2H4EEEvv290// MSABI: define {{.*}} @"??$f@$2UH4@@7TH2@@@@@@YAXXZ"291template void f<H4{}>();292 293// Floating-point.294struct I {295  float f;296  double d;297  long double ld;298};299template<I> void f() {}300// CHECK: define weak_odr void @_Z1fIXtl1IEEEvv301// MSABI: define {{.*}} @"??$f@$2UI@@MAA@NBA@OBA@@@@YAXXZ"302template void f<I{0.0, 0.0, 0.0}>();303// CHECK: define weak_odr void @_Z1fIXtl1ILf80000000ELd8000000000000000ELe80000000000000000000EEEEvv304// MSABI: define {{.*}} @"??$f@$2UI@@MAIAAAAAAA@NBIAAAAAAAAAAAAAAA@OBIAAAAAAAAAAAAAAA@@@@YAXXZ"305template void f<I{-0.0, -0.0, -0.0}>();306// CHECK: define weak_odr void @_Z1fIXtl1ILf3f800000ELd4000000000000000ELec000c000000000000000EEEEvv307// MSABI: define {{.*}} @"??$f@$2UI@@MADPIAAAAA@NBEAAAAAAAAAAAAAAA@OBMAAIAAAAAAAAAAAA@@@@YAXXZ"308template void f<I{1.0, 2.0, -3.0}>();309// CHECK: define {{.*}} @_Z1fIXtl1ILf00000000ELd0000000000000000ELe3bcd8000000000000000EEEEvv310// Note that "small integer" special-case manglings 'A@', '0', '1', ... are311// used here and represent tiny denormal values!312// MSABI: define {{.*}} @"??$f@$2UI@@MAA@NBA@OB0@@@YAXXZ"313template void f<I{0.0, 0.2e-323, 0.5e-323}>();314// CHECK: define {{.*}} @_Z1fIXtl1ILf00000000ELd0000000000000002ELebbce8000000000000000EEEEvv315// ... but the special-case '?' mangling for bit 63 being set is not used.316// MSABI: define {{.*}} @"??$f@$2UI@@MAA@NB1OBIAAAAAAAAAAAAAAC@@@@YAXXZ"317template void f<I{0.0, 1.0e-323, -1.0e-323}>();318 319// Base classes and members of class type.320struct J1 { int a, b; };321struct JEmpty {};322struct J2 { int c, d; };323struct J : J1, JEmpty, J2 { int e; };324template<J> void f() {}325// CHECK: define weak_odr void @_Z1fIXtl1JEEEvv326// MSABI: define {{.*}} @"??$f@$2UJ@@2UJ1@@H0A@H0A@@2UJEmpty@@@2UJ2@@H0A@H0A@@H0A@@@@YAXXZ"327template void f<J{}>();328// CHECK: define weak_odr void @_Z1fIXtl1Jtl2J1Li1ELi2EEtl6JEmptyEtl2J2Li3ELi4EELi5EEEEvv329// MSABI: define {{.*}} @"??$f@$2UJ@@2UJ1@@H00H01@2UJEmpty@@@2UJ2@@H02H03@H04@@@YAXXZ"330template void f<J{{1, 2}, {}, {3, 4}, 5}>();331 332struct J3 { J1 j1; };333template<J3> void f() {}334// CHECK: define {{.*}} @_Z1fIXtl2J3tl2J1Li1ELi2EEEEEvv335// MSABI: define {{.*}} @"??$f@$2UJ3@@2UJ1@@H00H01@@@@YAXXZ"336template void f<J3{1, 2}>();337 338// Arrays.339struct K { int n[2][3]; };340template<K> void f() {}341// CHECK: define {{.*}} @_Z1fIXtl1KtlA2_A3_itlS1_Li1ELi2EEEEEEvv342// MSABI: define {{.*}} @"??$f@$2UK@@3$$BY02H3H00@01@0A@@@@3H0A@@0A@@0A@@@@@@@@YAXXZ"343template void f<K{1, 2}>();344// CHECK: define {{.*}} @_Z1fIXtl1KtlA2_A3_itlS1_Li1ELi2ELi3EEtlS1_Li4ELi5ELi6EEEEEEvv345// MSABI: define {{.*}} @"??$f@$2UK@@3$$BY02H3H00@01@02@@@3H03@04@05@@@@@@@YAXXZ"346template void f<K{1, 2, 3, 4, 5, 6}>();347 348struct K1 { int a, b; };349struct K2 : K1 { int c; };350struct K3 { K2 k2[2]; };351template<K3> void f() {}352// CHECK: define {{.*}} @_Z1fIXtl2K3tlA2_2K2tlS1_tl2K1Li1EEEEEEEvv353// MSABI: define {{.*}} @"??$f@$2UK3@@3UK2@@2U2@2UK1@@H00H0A@@H0A@@@2U2@2U3@H0A@H0A@@H0A@@@@@@@YAXXZ"354template void f<K3{1}>();355template void f<K3{1, 2, 3, 4, 5, 6}>();356 357namespace CvQualifiers {358  struct A { const int a; int *const b; int c; };359  template<A> void f() {}360  // CHECK: define {{.*}} @_ZN12CvQualifiers1fIXtlNS_1AELi0ELPi0ELi1EEEEEvv361  // MSABI: define {{.*}} @"??$f@$2UA@CvQualifiers@@$$CBH0A@QEAH0A@H00@@CvQualifiers@@YAXXZ"362  template void f<A{.c = 1}>();363 364  using T1 = const int;365  using T2 = T1[5];366  using T3 = const T2;367  struct B { T3 arr; };368  template<B> void f() {}369  // CHECK: define {{.*}} @_ZN12CvQualifiers1fIXtlNS_1BEtlA5_iLi1ELi2ELi3ELi4ELi5EEEEEEvv370  // MSABI: define {{.*}} @"??$f@$2UB@CvQualifiers@@3$$CBH00@01@02@03@04@@@@CvQualifiers@@YAXXZ"371  template void f<B{1, 2, 3, 4, 5}>();372}373 374struct L {375  signed char a = -1;376  unsigned char b = -1;377  short c = -1;378  unsigned short d = -1;379  int e = -1;380  unsigned int f = -1;381  long g = -1;382  unsigned long h = -1;383  long long i = -1;384  unsigned long long j = -1;385};386template<L> void f() {}387// CHECK: define {{.*}} @_Z1fIXtl1LLan1ELh255ELsn1ELt65535ELin1ELj4294967295ELln1ELm18446744073709551615ELxn1ELy18446744073709551615EEEEvv388// MSABI: define {{.*}} @"??$f@$2UL@@C0?0E0PP@F0?0G0PPPP@H0?0I0PPPPPPPP@J0?0K0PPPPPPPP@_J0?0_K0?0@@@YAXXZ"389template void f<L{}>();390 391// Template parameter objects.392struct M { int n; };393template<M a> constexpr const M &f() { return a; }394// CHECK: define {{.*}} @_Z1fIXtl1MLi42EEEERKS0_v395// CHECK: ret {{.*}} @_ZTAXtl1MLi42EEE396// MSABI: define {{.*}} @"??$f@$2UM@@H0CK@@@@YAAEBUM@@XZ"397// MSABI: ret {{.*}} @"??__N2UM@@H0CK@@@"398template const M &f<M{42}>();399 400template<const M *p> void g() {}401// CHECK: define {{.*}} @_Z1gIXadL_ZTAXtl1MLi10EEEEEEvv402// MSABI: define {{.*}} @"??$g@$1??__N2UM@@H09@@@@YAXXZ"403template void g<&f<M{10}>()>();404