From: Mike Stump Date: Sat, 25 Jul 2009 23:24:03 +0000 (+0000) Subject: Preserve qualifiers. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6dcbc294f9b2c45680dd3227e885712c2814ec0e;p=clang 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 27c8a81975..ff9b7215bc 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -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;