1 // RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
4 template <int& D
> class T
{ };
5 // CHECK: void @_ZN5test12f0ENS_1TILZNS_1xEEEE(
10 // CHECK: void @_ZN5test12f0Ef
12 template<void (&)(float)> struct t1
{};
13 // CHECK: void @_ZN5test12f1ENS_2t1ILZNS_2f0EfEEE(
18 // CHECK: void @_ZN5test22f0Ef
20 template<void (*)(float)> struct t1
{};
21 // FIXME: Fails because we don't treat as an expression.
22 // CHECK-FIXME: void @_ZN5test22f1ENS_2t1IXadL_ZNS_2f0EfEEEE(
27 // CHECK: void @test3_f0
28 extern "C" void test3_f0(float) {}
29 template<void (&)(float)> struct t1
{};
30 // FIXME: Fails because we tack on a namespace.
31 // CHECK-FIXME: void @_ZN5test32f1ENS_2t1ILZ8test3_f0EEE(
32 void f1(t1
<test3_f0
> a0
) {}
36 // CHECK: void @test4_f0
37 extern "C" void test4_f0(float) {}
38 template<void (*)(float)> struct t1
{};
39 // FIXME: Fails because we don't treat as an expression.
40 // CHECK-FIXME: void @_ZN5test42f1ENS_2t1IXadL_Z8test4_f0EEEE(
41 void f1(t1
<test4_f0
> a0
) {}
44 // CHECK: void @test5_f0
45 extern "C" void test5_f0(float) {}
49 template<void (&)(float)> struct t1
{};
50 // CHECK: void @_ZN5test52f1ENS_2t1ILZ8test5_f0EEE(
51 void f1(t1
<test5_f0
> a0
) {}
53 template<int (&)(int)> struct t2
{};
54 // CHECK: void @_ZN5test52f2ENS_2t2ILZ4mainEEE
55 void f2(t2
<main
> a0
) {}
60 struct A
{ void im0(float); };
61 // CHECK: void @_ZN5test61A3im0Ef
63 template <void(A::*)(float)> class T
{ };
64 // FIXME: Fails because we don't treat as an expression.
65 // CHECK-FAIL: void @_ZN5test62f0ENS_1TIXadL_ZNS_1A3im0EfEEEE(
66 void f0(T
<&A::im0
> a0
) {}
72 static const unsigned value
= sizeof(T
);
75 template<unsigned> struct int_c
{
82 X(U
*, typename int_c
<(meta
<T
>::value
+ meta
<U
>::value
)>::type
*) { }
85 // CHECK: define weak_odr void @_ZN5test71XIiEC1IdEEPT_PNS_5int_cIXplL_ZNS_4metaIiE5valueEEsrNS6_IS3_EE5valueEE4typeE
86 template X
<int>::X(double*, float*);
93 static const unsigned value
= sizeof(T
);
97 template<unsigned> struct int_c
{
102 void f(int_c
<meta
<T
>::type::value
>) { }
104 // CHECK: define weak_odr void @_ZN5test81fIiEEvNS_5int_cIXsrNS_4metaIT_E4typeE5valueEEE
105 template void f
<int>(int_c
<sizeof(int)>);
119 template<typename T
, typename U
>
120 typename supermeta
<T
>::template apply
<U
>::type
f();
123 // CHECK: @_ZN5test91fIiNS_1XEEENS_9supermetaIT_E5applyIT0_E4typeEv()
124 // Note: GCC incorrectly mangles this as
125 // _ZN5test91fIiNS_1XEEENS_9supermetaIT_E5apply4typeEv, while EDG
139 // CHECK: _ZN6test101fIidEENS_1XIT_E10definitionIT0_EES2_S5_
140 template<typename T
, typename U
>
141 typename X
<T
>::template definition
<U
> f(T
, U
) { }
143 void g(int i
, double d
) {