Add basic substitution to the C++ mangler. It currently only looks at types.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82102 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/function-template-specialization.cpp b/test/CodeGenCXX/function-template-specialization.cpp
index 1d3c5f6..1efb857 100644
--- a/test/CodeGenCXX/function-template-specialization.cpp
+++ b/test/CodeGenCXX/function-template-specialization.cpp
@@ -9,10 +9,10 @@
 
 void test(int *iptr, float *fptr, int diff) {
   // FIXME: should be "_Z4nextIiiEPT_S1_RKT0_"
-  // RUN: grep "_Z4nextIiiEPiPiRKi" %t &&
+  // RUN: grep "_Z4nextIiiEPiS_RKi" %t &&
   iptr = next(iptr, diff);
   // FIXME: should be "_Z4nextIfiEPT_S1_RKT0_"
-  // RUN: grep "_Z4nextIfiEPfPfRKi" %t &&
+  // RUN: grep "_Z4nextIfiEPfS_RKi" %t &&
   fptr = next(fptr, diff);
 }
 
@@ -22,6 +22,6 @@
 void test2(int *iptr, double *dptr, int diff) {
   iptr = next(iptr, diff);
   // FIXME: should be "_Z4nextIdiEPT_S1_RKT0_"
-  // RUN: grep "_Z4nextIdiEPdPdRKi" %t
+  // RUN: grep "_Z4nextIdiEPdS_RKi" %t
   dptr = next(dptr, diff);
 }
diff --git a/test/CodeGenCXX/mangle-extreme.cpp b/test/CodeGenCXX/mangle-extreme.cpp
new file mode 100644
index 0000000..eb4be7a
--- /dev/null
+++ b/test/CodeGenCXX/mangle-extreme.cpp
@@ -0,0 +1,49 @@
+// RUN: clang-cc -emit-llvm %s -o %t -triple=x86_64-apple-darwin10 && 
+
+struct X { };
+
+// RUN: grep "define void @_Z1fPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP1XS13_S12_S11_S10_SZ_SY_SX_SW_SV_SU_ST_SS_SR_SQ_SP_SO_SN_SM_SL_SK_SJ_SI_SH_SG_SF_SE_SD_SC_SB_SA_S9_S8_S7_S6_S5_S4_S3_S2_S1_S0_S_(" %t &&
+void f(X****************************************,
+       X****************************************,
+       X***************************************,
+       X**************************************,
+       X*************************************,
+       X************************************,
+       X***********************************,
+       X**********************************,
+       X*********************************,
+       X********************************,
+       X*******************************,
+       X******************************,
+       X*****************************,
+       X****************************,
+       X***************************,
+       X**************************,
+       X*************************,
+       X************************,
+       X***********************,
+       X**********************,
+       X*********************,
+       X********************,
+       X*******************,
+       X******************,
+       X*****************,
+       X****************,
+       X***************,
+       X**************,
+       X*************,
+       X************,
+       X***********,
+       X**********,
+       X*********,
+       X********,
+       X*******,
+       X******,
+       X*****,
+       X****,
+       X***,
+       X**,
+       X*,
+       X) { }
+       
+// RUN: true
diff --git a/test/CodeGenCXX/mangle-subst.cpp b/test/CodeGenCXX/mangle-subst.cpp
new file mode 100644
index 0000000..fc73048
--- /dev/null
+++ b/test/CodeGenCXX/mangle-subst.cpp
@@ -0,0 +1,20 @@
+// RUN: clang-cc -emit-llvm %s -o %t -triple=x86_64-apple-darwin9 && 
+
+struct X {};
+
+// RUN: grep "define void @_Z1f1XS_" %t | count 1 &&
+void f(X, X) { }
+
+// RUN: grep "define void @_Z1fR1XS0_" %t | count 1 &&
+void f(X&, X&) { }
+
+// RUN: grep "define void @_Z1fRK1XS1_" %t | count 1 &&
+void f(const X&, const X&) { }
+
+typedef void T();
+struct S {};
+
+// RUN: grep "define void @_Z1fPFvvEM1SFvvE" %t | count 1 &&
+void f(T*, T (S::*)) {}
+
+// RUN: true