diff options
author | Steve Naroff <snaroff@apple.com> | 2008-12-10 17:49:55 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2008-12-10 17:49:55 +0000 |
commit | 68e167df8e7ace73965fe501605a0d5196b51ce0 (patch) | |
tree | 59ed45f8e9454639e82ba3ff2c855b055bae972c /clang/lib/AST | |
parent | 9499385621196a20a22d9be1b3fb2343a42f25cd (diff) | |
download | bcm5719-llvm-68e167df8e7ace73965fe501605a0d5196b51ce0.tar.gz bcm5719-llvm-68e167df8e7ace73965fe501605a0d5196b51ce0.zip |
Fix <rdar://problem/6418623> Bogus block type compatibility warning.
llvm-svn: 60842
Diffstat (limited to 'clang/lib/AST')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 35647cf02aa..ba61332a44f 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1920,7 +1920,13 @@ bool ASTContext::isObjCObjectPointerType(QualType Ty) const { /// FIXME: When the dust settles on this integration, fold this into mergeTypes. /// bool ASTContext::typesAreBlockCompatible(QualType lhs, QualType rhs) { - return getCanonicalType(lhs) == getCanonicalType(rhs); + const FunctionType *lbase = lhs->getAsFunctionType(); + const FunctionType *rbase = rhs->getAsFunctionType(); + const FunctionTypeProto *lproto = dyn_cast<FunctionTypeProto>(lbase); + const FunctionTypeProto *rproto = dyn_cast<FunctionTypeProto>(rbase); + if (lproto && rproto) + return !mergeTypes(lhs, rhs).isNull(); + return false; } /// areCompatVectorTypes - Return true if the two specified vector types are @@ -2179,6 +2185,19 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) { return RHS; return getPointerType(ResultType); } + case Type::BlockPointer: + { + // Merge two block pointer types, while trying to preserve typedef info + QualType LHSPointee = LHS->getAsBlockPointerType()->getPointeeType(); + QualType RHSPointee = RHS->getAsBlockPointerType()->getPointeeType(); + QualType ResultType = mergeTypes(LHSPointee, RHSPointee); + if (ResultType.isNull()) return QualType(); + if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) + return LHS; + if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) + return RHS; + return getBlockPointerType(ResultType); + } case Type::ConstantArray: { const ConstantArrayType* LCAT = getAsConstantArrayType(LHS); |