diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-05-08 19:36:34 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-05-08 19:36:34 +0000 |
commit | b2ab73d93cf5f73e5e49496c36e7bc58622c7f01 (patch) | |
tree | b64b7916f98818a974063a5ce7d01f56b0106657 /clang/lib/Sema/SemaExpr.cpp | |
parent | 6e9959e327b3dffc670192de076e64c1927c83d3 (diff) | |
download | bcm5719-llvm-b2ab73d93cf5f73e5e49496c36e7bc58622c7f01.tar.gz bcm5719-llvm-b2ab73d93cf5f73e5e49496c36e7bc58622c7f01.zip |
More type checking for properties, accessors and
use of dot-syntax expression. This is to match gcc's.
llvm-svn: 71243
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 79c471a2d48..f698620543f 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2096,8 +2096,21 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, // Check whether we can reference this property. if (DiagnoseUseOfDecl(PD, MemberLoc)) return ExprError(); - - return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(), + 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(); + } + } + + return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy, MemberLoc, BaseExpr)); } |