diff options
Diffstat (limited to 'lib/Sema/SemaObjCProperty.cpp')
| -rw-r--r-- | lib/Sema/SemaObjCProperty.cpp | 29 | 
1 files changed, 21 insertions, 8 deletions
| diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index 41ed6c630cb2f..f815068fac2da 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/lib/Sema/SemaObjCProperty.cpp @@ -44,9 +44,6 @@ Sema::DeclPtrTy Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,      Diag(AtLoc, diag::error_reference_property);      return DeclPtrTy();    } -  // Validate the attributes on the @property. -  CheckObjCPropertyAttributes(T, AtLoc, Attributes); -    // Proceed with constructing the ObjCPropertDecls.    ObjCContainerDecl *ClassDecl =      cast<ObjCContainerDecl>(ClassCategory.getAs<Decl>()); @@ -60,10 +57,13 @@ Sema::DeclPtrTy Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,                                              isOverridingProperty, T,                                              MethodImplKind); -  return DeclPtrTy::make(CreatePropertyDecl(S, ClassDecl, AtLoc, FD, +  DeclPtrTy Res =  DeclPtrTy::make(CreatePropertyDecl(S, ClassDecl, AtLoc, FD,                                              GetterSel, SetterSel,                                              isAssign, isReadWrite,                                              Attributes, T, MethodImplKind)); +  // Validate the attributes on the @property. +  CheckObjCPropertyAttributes(Res, AtLoc, Attributes); +  return Res;  }  Sema::DeclPtrTy @@ -93,6 +93,11 @@ Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl,    ObjCPropertyDecl *PDecl =      ObjCPropertyDecl::Create(Context, DC, FD.D.getIdentifierLoc(),                               PropertyId, AtLoc, T); +  if (Attributes & ObjCDeclSpec::DQ_PR_readonly) +    PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly); +  if (Attributes & ObjCDeclSpec::DQ_PR_readwrite) +    PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readwrite); +    DC->addDecl(PDecl);    // We need to look in the @interface to see if the @property was @@ -378,7 +383,9 @@ Sema::DeclPtrTy Sema::ActOnPropertyImplDecl(SourceLocation AtLoc,      if (PropType != IvarType) {        if (CheckAssignmentConstraints(PropType, IvarType) != Compatible) {          Diag(PropertyLoc, diag::error_property_ivar_type) -        << property->getDeclName() << Ivar->getDeclName(); +          << property->getDeclName() << PropType +          << Ivar->getDeclName() << IvarType; +        Diag(Ivar->getLocation(), diag::note_ivar_decl);          // Note! I deliberately want it to fall thru so, we have a          // a property implementation and to avoid future warnings.        } @@ -391,7 +398,9 @@ Sema::DeclPtrTy Sema::ActOnPropertyImplDecl(SourceLocation AtLoc,        if (lhsType != rhsType &&            lhsType->isArithmeticType()) {          Diag(PropertyLoc, diag::error_property_ivar_type) -        << property->getDeclName() << Ivar->getDeclName(); +          << property->getDeclName() << PropType +          << Ivar->getDeclName() << IvarType; +        Diag(Ivar->getLocation(), diag::note_ivar_decl);          // Fall thru - see previous comment        }        // __weak is explicit. So it works on Canonical type. @@ -973,10 +982,13 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,      AddInstanceMethodToGlobalPool(SetterMethod);  } -void Sema::CheckObjCPropertyAttributes(QualType PropertyTy, +void Sema::CheckObjCPropertyAttributes(DeclPtrTy PropertyPtrTy,                                         SourceLocation Loc,                                         unsigned &Attributes) {    // FIXME: Improve the reported location. +  Decl *PDecl = PropertyPtrTy.getAs<Decl>(); +  ObjCPropertyDecl *PropertyDecl = dyn_cast_or_null<ObjCPropertyDecl>(PDecl); +  QualType PropertyTy = PropertyDecl->getType();     // readonly and readwrite/assign/retain/copy conflict.    if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && @@ -1001,7 +1013,8 @@ void Sema::CheckObjCPropertyAttributes(QualType PropertyTy,    if ((Attributes & (ObjCDeclSpec::DQ_PR_copy | ObjCDeclSpec::DQ_PR_retain)) &&        !PropertyTy->isObjCObjectPointerType() &&        !PropertyTy->isBlockPointerType() && -      !Context.isObjCNSObjectType(PropertyTy)) { +      !Context.isObjCNSObjectType(PropertyTy) && +      !PropertyDecl->getAttr<ObjCNSObjectAttr>()) {      Diag(Loc, diag::err_objc_property_requires_object)        << (Attributes & ObjCDeclSpec::DQ_PR_copy ? "copy" : "retain");      Attributes &= ~(ObjCDeclSpec::DQ_PR_copy | ObjCDeclSpec::DQ_PR_retain); | 
