diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-08 21:09:39 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-08 21:09:39 +0000 |
| commit | 04477f3de91edc2e750b862cac4fa9f383c3be22 (patch) | |
| tree | 31a8e156d41fabf1ced0a24f1d108cd922076efe /clang/lib/AST/ASTContext.cpp | |
| parent | 3aed6cdd5e6111c01599e301051669deaeb1de36 (diff) | |
| download | bcm5719-llvm-04477f3de91edc2e750b862cac4fa9f383c3be22.tar.gz bcm5719-llvm-04477f3de91edc2e750b862cac4fa9f383c3be22.zip | |
Merge block/function pointer types with objc's __weak
attribute properly and avoid bogus warning. This is
an objective-c fix only. objective-c++ follows different code
pass and requires separate fix (which will come at a later time).
Fixes radar 7214820.
llvm-svn: 95571
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 7e03f56f62f..386a5f3c7bd 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -4303,11 +4303,24 @@ QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs) { bool allRTypes = true; // Check return type - QualType retType = mergeTypes(lbase->getResultType(), rbase->getResultType()); + QualType LRES = lbase->getResultType(); + QualType RRES = rbase->getResultType(); + Qualifiers::GC GC_L = LRES.getObjCGCAttr(); + Qualifiers::GC GC_R = RRES.getObjCGCAttr(); + // __weak/__strong attribute on one function/block return type but + // not the other is OK. + if (GC_L != GC_R) { + if (GC_R == Qualifiers::GCNone) + RRES = getObjCGCQualType(RRES, GC_L); + else if (GC_L == Qualifiers::GCNone) + LRES = getObjCGCQualType(LRES, GC_R); + } + + QualType retType = mergeTypes(LRES, RRES); if (retType.isNull()) return QualType(); - if (getCanonicalType(retType) != getCanonicalType(lbase->getResultType())) + if (getCanonicalType(retType) != getCanonicalType(LRES)) allLTypes = false; - if (getCanonicalType(retType) != getCanonicalType(rbase->getResultType())) + if (getCanonicalType(retType) != getCanonicalType(RRES)) allRTypes = false; // FIXME: double check this bool NoReturn = lbase->getNoReturnAttr() || rbase->getNoReturnAttr(); |

