Finish up saving original parameter type and
using it in ObjC's method parameter encoding.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61293 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index d4cef9b..7759bac 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -1236,21 +1236,31 @@
   
   for (unsigned i = 0; i < Sel.getNumArgs(); i++) {
     // FIXME: arg->AttrList must be stored too!
-    QualType argType;
+    QualType argType, originalArgType;
     
     if (ArgTypes[i]) {
       argType = QualType::getFromOpaquePtr(ArgTypes[i]);
       // Perform the default array/function conversions (C99 6.7.5.3p[7,8]).
-      if (argType->isArrayType()) // (char *[]) -> (char **)
+      if (argType->isArrayType())  { // (char *[]) -> (char **)
+        originalArgType = argType;
         argType = Context.getArrayDecayedType(argType);
+      }
       else if (argType->isFunctionType())
         argType = Context.getPointerType(argType);
     } else
       argType = Context.getObjCIdType();
-    ParmVarDecl* Param = ParmVarDecl::Create(Context, ObjCMethod,
-                                             SourceLocation(/*FIXME*/),
-                                             ArgNames[i], argType,
-                                             VarDecl::None, 0, 0);
+    ParmVarDecl* Param;
+    if (originalArgType.isNull())
+      Param = ParmVarDecl::Create(Context, ObjCMethod,
+                                  SourceLocation(/*FIXME*/),
+                                  ArgNames[i], argType,
+                                  VarDecl::None, 0, 0);
+    else
+      Param = ParmVarWithOriginalTypeDecl::Create(Context, ObjCMethod,
+                                  SourceLocation(/*FIXME*/),
+                                  ArgNames[i], argType, originalArgType,
+                                  VarDecl::None, 0, 0);
+    
     Param->setObjCDeclQualifier(
       CvtQTToAstBitMask(ArgQT[i].getObjCDeclQualifier()));
     Params.push_back(Param);