xref: /llvm-project/clang/test/CodeGenCXX/function-template-specialization.cpp (revision 9963adeaefaf0dca48b8c207a3ed7098528f338c)
1c9bd88e6SHans Wennborg // RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple %s -o - | FileCheck %s
2*9963adeaSDavid Majnemer 
3*9963adeaSDavid Majnemer // CHECK-DAG: _ZZN7PR219047GetDataIiEERKibE1i = internal global i32 4
4*9963adeaSDavid Majnemer // CHECK-DAG: _ZZN7PR219047GetDataIiEERKibE1i_0 = internal global i32 2
5*9963adeaSDavid Majnemer 
68f5d4423SDouglas Gregor template<typename T, typename U>
78f5d4423SDouglas Gregor T* next(T* ptr, const U& diff);
88f5d4423SDouglas Gregor 
98f5d4423SDouglas Gregor template<typename T, typename U>
next(T * ptr,const U & diff)108f5d4423SDouglas Gregor T* next(T* ptr, const U& diff) {
118f5d4423SDouglas Gregor   return ptr + diff;
128f5d4423SDouglas Gregor }
138f5d4423SDouglas Gregor 
test(int * iptr,float * fptr,int diff)148f5d4423SDouglas Gregor void test(int *iptr, float *fptr, int diff) {
15a2fb9bcdSAnders Carlsson   // CHECK: _Z4nextIiiEPT_S1_RKT0_
168f5d4423SDouglas Gregor   iptr = next(iptr, diff);
17df644fb7SAnders Carlsson 
18a2fb9bcdSAnders Carlsson   // CHECK: _Z4nextIfiEPT_S1_RKT0_
198f5d4423SDouglas Gregor   fptr = next(fptr, diff);
208f5d4423SDouglas Gregor }
218f5d4423SDouglas Gregor 
228f5d4423SDouglas Gregor template<typename T, typename U>
238f5d4423SDouglas Gregor T* next(T* ptr, const U& diff);
248f5d4423SDouglas Gregor 
test2(int * iptr,double * dptr,int diff)258f5d4423SDouglas Gregor void test2(int *iptr, double *dptr, int diff) {
268f5d4423SDouglas Gregor   iptr = next(iptr, diff);
27a2fb9bcdSAnders Carlsson 
28a2fb9bcdSAnders Carlsson   // CHECK: _Z4nextIdiEPT_S1_RKT0_
298f5d4423SDouglas Gregor   dptr = next(dptr, diff);
308f5d4423SDouglas Gregor }
31*9963adeaSDavid Majnemer 
32*9963adeaSDavid Majnemer namespace PR21904 {
33*9963adeaSDavid Majnemer template <typename>
34*9963adeaSDavid Majnemer const int &GetData(bool);
35*9963adeaSDavid Majnemer 
36*9963adeaSDavid Majnemer template <>
GetData(bool b)37*9963adeaSDavid Majnemer const int &GetData<int>(bool b) {
38*9963adeaSDavid Majnemer   static int i = 4;
39*9963adeaSDavid Majnemer   if (b) {
40*9963adeaSDavid Majnemer     static int i = 2;
41*9963adeaSDavid Majnemer     return i;
42*9963adeaSDavid Majnemer   }
43*9963adeaSDavid Majnemer   return i;
44*9963adeaSDavid Majnemer }
45*9963adeaSDavid Majnemer }
46