From: Fariborz Jahanian Date: Fri, 8 May 2009 20:20:55 +0000 (+0000) Subject: Refactoring of my last patch. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c001e89b920504154bd0b1832e6feacd28fbfa58;p=clang Refactoring of my last patch. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71248 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 389d554813..30540287eb 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -1270,6 +1270,9 @@ public: // Expression Parsing Callbacks: SemaExpr.cpp. bool DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc); + bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD, + ObjCMethodDecl *Getter, + SourceLocation Loc); // Primary Expressions. virtual SourceRange getExprRange(ExprTy *E) const; diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 34afdedba7..981d13c15e 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -19,6 +19,26 @@ #include "clang/Parse/DeclSpec.h" using namespace clang; +bool Sema::DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *property, + ObjCMethodDecl *GetterMethod, + SourceLocation Loc) { + if (GetterMethod && + GetterMethod->getResultType() != property->getType()) { + AssignConvertType result = Incompatible; + if (Context.isObjCObjectPointerType(property->getType())) + result = CheckAssignmentConstraints(property->getType(), + GetterMethod->getResultType()); + if (result != Compatible) { + Diag(Loc, diag::warn_accessor_property_type_mismatch) + << property->getDeclName() + << GetterMethod->getSelector(); + Diag(GetterMethod->getLocation(), diag::note_declared_at); + return true; + } + } + return false; +} + /// ActOnStartOfObjCMethodDef - This routine sets up parameters; invisible /// and user declared, in the method definition's AST. void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, DeclPtrTy D) { @@ -1312,22 +1332,9 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property, GetterMethod = CD->getInstanceMethod(Context, property->getGetterName()); SetterMethod = CD->getInstanceMethod(Context, property->getSetterName()); - - if (GetterMethod && - GetterMethod->getResultType() != property->getType()) { - AssignConvertType result = Incompatible; - if (Context.isObjCObjectPointerType(property->getType())) - result = CheckAssignmentConstraints(property->getType(), - GetterMethod->getResultType()); - if (result != Compatible) { - Diag(property->getLocation(), - diag::warn_accessor_property_type_mismatch) - << property->getDeclName() - << GetterMethod->getSelector(); - Diag(GetterMethod->getLocation(), diag::note_declared_at); - } - } - + DiagnosePropertyAccessorMismatch(property, GetterMethod, + property->getLocation()); + if (SetterMethod) { if (Context.getCanonicalType(SetterMethod->getResultType()) != Context.VoidTy) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index f698620543..063e0ec314 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -2099,17 +2099,8 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, QualType ResTy = PD->getType(); Selector Sel = PP.getSelectorTable().getNullarySelector(&Member); ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Context, Sel); - if (Getter) { - AssignConvertType result = - CheckAssignmentConstraints(PD->getType(), Getter->getResultType()); - if (result != Compatible) { - Diag(MemberLoc, diag::warn_accessor_property_type_mismatch) - << PD->getDeclName() << Sel; - Diag(Getter->getLocation(), diag::note_declared_at); - ResTy = Getter->getResultType(); - } - } - + if (DiagnosePropertyAccessorMismatch(PD, Getter, MemberLoc)) + ResTy = Getter->getResultType(); return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy, MemberLoc, BaseExpr)); }