diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2011-10-15 17:36:49 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-10-15 17:36:49 +0000 |
| commit | 7c386f838aa63349cbea031a69ba528e265c1cc9 (patch) | |
| tree | b345fbdd1b3a0ee0def12a5ea72ca206035032cf /clang/lib/Sema | |
| parent | a8e267b3980a5499dffc0eb6d3309c17564decff (diff) | |
| download | bcm5719-llvm-7c386f838aa63349cbea031a69ba528e265c1cc9.tar.gz bcm5719-llvm-7c386f838aa63349cbea031a69ba528e265c1cc9.zip | |
obj-c++: allow the getter/setter to return/take parameters
by reference. // rdar://10188258
llvm-svn: 142075
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 6 |
2 files changed, 8 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 170097cc59a..60f84183fae 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -7264,13 +7264,14 @@ void Sema::ConvertPropertyForLValue(ExprResult &LHS, ExprResult &RHS, return; } } - } else if (getLangOptions().ObjCAutoRefCount) { + } else { const ObjCMethodDecl *setter = PropRef->getExplicitProperty()->getSetterMethodDecl(); if (setter) { ObjCMethodDecl::param_const_iterator P = setter->param_begin(); LHSTy = (*P)->getType(); - Consumed = (*P)->hasAttr<NSConsumedAttr>(); + if (getLangOptions().ObjCAutoRefCount) + Consumed = (*P)->hasAttr<NSConsumedAttr>(); } } @@ -7285,6 +7286,7 @@ void Sema::ConvertPropertyForLValue(ExprResult &LHS, ExprResult &RHS, checkRetainCycles(const_cast<Expr*>(PropRef->getBase()), RHS.get()); } } + LHSTy = LHSTy.getNonReferenceType(); } diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 751f553945c..d35c01039c1 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -948,7 +948,8 @@ bool Sema::DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *property, ObjCMethodDecl *GetterMethod, SourceLocation Loc) { if (GetterMethod && - GetterMethod->getResultType() != property->getType()) { + GetterMethod->getResultType().getNonReferenceType() + != property->getType().getNonReferenceType()) { AssignConvertType result = Incompatible; if (property->getType()->isObjCObjectPointerType()) result = CheckAssignmentConstraints(Loc, GetterMethod->getResultType(), @@ -1510,7 +1511,8 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property, Diag(SetterMethod->getLocation(), diag::err_setter_type_void); if (SetterMethod->param_size() != 1 || !Context.hasSameUnqualifiedType( - (*SetterMethod->param_begin())->getType(), property->getType())) { + (*SetterMethod->param_begin())->getType().getNonReferenceType(), + property->getType().getNonReferenceType())) { Diag(property->getLocation(), diag::warn_accessor_property_type_mismatch) << property->getDeclName() |

