Improve code generation for function template specializations:
  - Track implicit instantiations vs. the not-yet-supported explicit
  specializations
  - Give implicit instantiations of function templates (and member
  functions of class templates) linkonce_odr linkage.
  - Improve name mangling for function template specializations,
  including the template arguments of the instantiation and the return
  type of the function.

Note that our name-mangling is improved, but not correct: we still
don't mangle substitutions, although the manglings we produce can be
demangled.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74466 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/function-template-specialization.cpp b/test/CodeGenCXX/function-template-specialization.cpp
index 685306f..bea3af2 100644
--- a/test/CodeGenCXX/function-template-specialization.cpp
+++ b/test/CodeGenCXX/function-template-specialization.cpp
@@ -1,4 +1,4 @@
-// RUN: clang-cc -emit-llvm %s -o -
+// RUN: clang-cc -emit-llvm %s -o %t &&
 template<typename T, typename U>
 T* next(T* ptr, const U& diff);
 
@@ -8,7 +8,11 @@
 }
 
 void test(int *iptr, float *fptr, int diff) {
+  // FIXME: should be "_Z4nextIiiEPT_S1_RKT0_"
+  // RUN: grep "_Z4nextIiiEPiPiRKi" %t &&
   iptr = next(iptr, diff);
+  // FIXME: should be "_Z4nextIfiEPT_S1_RKT0_"
+  // RUN: grep "_Z4nextIfiEPfPfRKi" %t &&
   fptr = next(fptr, diff);
 }
 
@@ -17,5 +21,7 @@
 
 void test2(int *iptr, double *dptr, int diff) {
   iptr = next(iptr, diff);
+  // FIXME: should be "_Z4nextIdiEPT_S1_RKT0_"
+  // RUN: grep "_Z4nextIdiEPdPdRKi" %t
   dptr = next(dptr, diff);
 }
\ No newline at end of file