Preserve qualifiers.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77097 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 27c8a81..ff9b721 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -1042,15 +1042,21 @@
 }
 
 QualType ASTContext::getNoReturnType(QualType T) {
+  QualifierSet qs;
+  qs.strip(T);
   if (T->isPointerType()) {
     QualType Pointee = T->getAsPointerType()->getPointeeType();
     QualType ResultType = getNoReturnType(Pointee);
-    return getPointerType(ResultType);
+    ResultType = getPointerType(ResultType);
+    ResultType.setCVRQualifiers(T.getCVRQualifiers());
+    return qs.apply(ResultType, *this);
   }
   if (T->isBlockPointerType()) {
     QualType Pointee = T->getAsBlockPointerType()->getPointeeType();
     QualType ResultType = getNoReturnType(Pointee);
-    return getBlockPointerType(ResultType);
+    ResultType = getBlockPointerType(ResultType);
+    ResultType.setCVRQualifiers(T.getCVRQualifiers());
+    return qs.apply(ResultType, *this);
   }    
   if (!T->isFunctionType())
     assert(0 && "can't noreturn qualify non-pointer to function or block type");
@@ -2157,7 +2163,7 @@
     const Type *UT = qualifiers.strip(QT);
     if (const ArrayType *AT = getAsArrayType(QualType(UT,0))) {
       QT = AT->getElementType();
-    }else {
+    } else {
       return qualifiers.apply(QT, *this);
     }
   }
@@ -3369,6 +3375,7 @@
     allLTypes = false;
   if (getCanonicalType(retType) != getCanonicalType(rbase->getResultType()))
     allRTypes = false;
+  // FIXME: double check this
   bool NoReturn = lbase->getNoReturnAttr() || rbase->getNoReturnAttr();
   if (NoReturn != lbase->getNoReturnAttr())
     allLTypes = false;