Canonicalize function parameters

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77676 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp
index 5714c68..791c439 100644
--- a/lib/AST/StmtProfile.cpp
+++ b/lib/AST/StmtProfile.cpp
@@ -602,6 +602,8 @@
 }
 
 void StmtProfiler::VisitDecl(Decl *D) {
+  ID.AddInteger(D? D->getKind() : 0);
+  
   if (Canonical && D) {
     if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
       ID.AddInteger(NTTP->getDepth());
@@ -610,6 +612,16 @@
       return;
     }
     
+    if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
+      // The Itanium C++ ABI uses the type of a parameter when mangling
+      // expressions that involve function parameters, so we will use the
+      // parameter's type for establishing function parameter identity. That
+      // way, our definition of "equivalent" (per C++ [temp.over.link]) 
+      // matches the definition of "equivalent" used for name mangling.
+      VisitType(Parm->getType());
+      return;
+    }
+    
     // FIXME: Template template parameters?
     
     if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {