diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-05-14 23:52:54 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-05-14 23:52:54 +0000 |
commit | 0c20bddc417134f88c3cf52de6bdca7276bef10b (patch) | |
tree | f51b268754b730b3fdf7e473eca61500b6551fc7 /clang/lib | |
parent | 0555e5fbcedd2fada5c709996b9a1bda3f0895f7 (diff) | |
download | bcm5719-llvm-0c20bddc417134f88c3cf52de6bdca7276bef10b.tar.gz bcm5719-llvm-0c20bddc417134f88c3cf52de6bdca7276bef10b.zip |
Don't warn if result/argument type of an implemented
method is a qualified id which conforms to the matching type
of its method declaration.
llvm-svn: 71817
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/Sema.h | 1 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 7 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 9 |
3 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 43d3816275f..87c01075a8e 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -1082,6 +1082,7 @@ public: bool &IncompleteImpl); void WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethod, ObjCMethodDecl *IntfMethod); + bool QualifiedIdConformsQualifiedId(QualType LHS, QualType RHS); NamespaceDecl *GetStdNamespace(); diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index d854f0b50c6..3c209440b0c 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -775,7 +775,9 @@ void Sema::WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method, void Sema::WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethodDecl, ObjCMethodDecl *IntfMethodDecl) { if (!Context.typesAreCompatible(IntfMethodDecl->getResultType(), - ImpMethodDecl->getResultType())) { + ImpMethodDecl->getResultType()) && + !QualifiedIdConformsQualifiedId(IntfMethodDecl->getResultType(), + ImpMethodDecl->getResultType())) { Diag(ImpMethodDecl->getLocation(), diag::warn_conflicting_ret_types) << ImpMethodDecl->getDeclName() << IntfMethodDecl->getResultType() << ImpMethodDecl->getResultType(); @@ -785,7 +787,8 @@ void Sema::WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethodDecl, for (ObjCMethodDecl::param_iterator IM = ImpMethodDecl->param_begin(), IF = IntfMethodDecl->param_begin(), EM = ImpMethodDecl->param_end(); IM != EM; ++IM, ++IF) { - if (Context.typesAreCompatible((*IF)->getType(), (*IM)->getType())) + if (Context.typesAreCompatible((*IF)->getType(), (*IM)->getType()) || + QualifiedIdConformsQualifiedId((*IF)->getType(), (*IM)->getType())) continue; Diag((*IM)->getLocation(), diag::warn_conflicting_param_types) diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 0073fd9f28f..f8475a67279 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -697,6 +697,15 @@ static bool ClassImplementsProtocol(ObjCProtocolDecl *lProto, return false; } +/// QualifiedIdConformsQualifiedId - compare id<p,...> with id<p1,...> +/// return true if lhs's protocols conform to rhs's protocol; false +/// otherwise. +bool Sema::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) { + if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType()) + return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false); + return false; +} + /// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an /// ObjCQualifiedIDType. /// FIXME: Move to ASTContext::typesAreCompatible() and friends. |