-Add support for cv-qualifiers after function declarators.
-Add withConst/withVolatile/withRestrict methods to QualType class, that return the QualType plus the respective qualifier.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58120 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 75c5888..f812996 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -884,11 +884,13 @@
 /// getFunctionType - Return a normal function type with a typed argument
 /// list.  isVariadic indicates whether the argument list includes '...'.
 QualType ASTContext::getFunctionType(QualType ResultTy,const QualType *ArgArray,
-                                     unsigned NumArgs, bool isVariadic) {
+                                     unsigned NumArgs, bool isVariadic,
+                                     unsigned TypeQuals) {
   // Unique functions, to guarantee there is only one function of a particular
   // structure.
   llvm::FoldingSetNodeID ID;
-  FunctionTypeProto::Profile(ID, ResultTy, ArgArray, NumArgs, isVariadic);
+  FunctionTypeProto::Profile(ID, ResultTy, ArgArray, NumArgs, isVariadic,
+                             TypeQuals);
 
   void *InsertPos = 0;
   if (FunctionTypeProto *FTP = 
@@ -925,7 +927,7 @@
     (FunctionTypeProto*)malloc(sizeof(FunctionTypeProto) + 
                                NumArgs*sizeof(QualType));
   new (FTP) FunctionTypeProto(ResultTy, ArgArray, NumArgs, isVariadic,
-                              Canonical);
+                              TypeQuals, Canonical);
   Types.push_back(FTP);
   FunctionTypeProtos.InsertNode(FTP, InsertPos);
   return QualType(FTP, 0);
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp
index 8baf419..a62ebad 100644
--- a/lib/AST/DeclCXX.cpp
+++ b/lib/AST/DeclCXX.cpp
@@ -64,9 +64,8 @@
   assert(isInstance() && "No 'this' for static methods!");
   QualType ClassTy = C.getTagDeclType(const_cast<CXXRecordDecl*>(
                                             cast<CXXRecordDecl>(getParent())));
-  QualType ThisTy = C.getPointerType(ClassTy);
-  ThisTy.addConst();
-  return ThisTy;
+  ClassTy = ClassTy.getWithAdditionalQualifiers(getTypeQualifiers());
+  return C.getPointerType(ClassTy).withConst();
 }
 
 CXXClassVarDecl *CXXClassVarDecl::Create(ASTContext &C, CXXRecordDecl *RD,
diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp
index 5de4476..87b91ae 100644
--- a/lib/AST/Type.cpp
+++ b/lib/AST/Type.cpp
@@ -705,15 +705,18 @@
 
 void FunctionTypeProto::Profile(llvm::FoldingSetNodeID &ID, QualType Result,
                                 arg_type_iterator ArgTys,
-                                unsigned NumArgs, bool isVariadic) {
+                                unsigned NumArgs, bool isVariadic,
+                                unsigned TypeQuals) {
   ID.AddPointer(Result.getAsOpaquePtr());
   for (unsigned i = 0; i != NumArgs; ++i)
     ID.AddPointer(ArgTys[i].getAsOpaquePtr());
   ID.AddInteger(isVariadic);
+  ID.AddInteger(TypeQuals);
 }
 
 void FunctionTypeProto::Profile(llvm::FoldingSetNodeID &ID) {
-  Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic());
+  Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic(),
+          getTypeQuals());
 }
 
 void ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID,