]> granicus.if.org Git - clang/commitdiff
Preserve qualifiers.
authorMike Stump <mrs@apple.com>
Sat, 25 Jul 2009 23:24:03 +0000 (23:24 +0000)
committerMike Stump <mrs@apple.com>
Sat, 25 Jul 2009 23:24:03 +0000 (23:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77097 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp

index 27c8a81975cfd776dd2ff9246bd0583a2390a14d..ff9b7215bcb3c4f69840ace43109bcceff417c75 100644 (file)
@@ -1042,15 +1042,21 @@ QualType ASTContext::getObjCGCQualType(QualType T,
 }
 
 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 @@ QualType ASTContext::getBaseElementType(QualType QT) {
     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 @@ QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs) {
     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;