diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 24 | 
1 files changed, 17 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 02bfbe7e395..76590629057 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -66,6 +66,18 @@ Sema::DeclPtrTy Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,                                              Attributes, T, MethodImplKind));  } +static ObjCPropertyDecl *findPropertyDecl(DeclContext *DC, +                                          IdentifierInfo *propertyID) { + +  DeclContext::lookup_iterator I, E; +  llvm::tie(I, E) = DC->lookup(propertyID); +  for ( ; I != E; ++I) +    if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(*I)) +        return PD; + +  return 0; +} +  Sema::DeclPtrTy  Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl,                                       SourceLocation AtLoc, FieldDeclarator &FD, @@ -79,12 +91,11 @@ Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl,    // Diagnose if this property is already in continuation class.    DeclContext *DC = cast<DeclContext>(CDecl); -    IdentifierInfo *PropertyId = FD.D.getIdentifier(); -  DeclContext::lookup_result Found = DC->lookup(PropertyId); -  if (Found.first != Found.second && isa<ObjCPropertyDecl>(*Found.first)) { + +  if (ObjCPropertyDecl *prevDecl = findPropertyDecl(DC, PropertyId)) {      Diag(AtLoc, diag::err_duplicate_property); -    Diag((*Found.first)->getLocation(), diag::note_property_declare); +    Diag(prevDecl->getLocation(), diag::note_property_declare);      return DeclPtrTy();    } @@ -220,10 +231,9 @@ ObjCPropertyDecl *Sema::CreatePropertyDecl(Scope *S,                                                       FD.D.getIdentifierLoc(),                                                       PropertyId, AtLoc, T); -  DeclContext::lookup_result Found = DC->lookup(PropertyId); -  if (Found.first != Found.second && isa<ObjCPropertyDecl>(*Found.first)) { +  if (ObjCPropertyDecl *prevDecl = findPropertyDecl(DC, PropertyId)) {      Diag(PDecl->getLocation(), diag::err_duplicate_property); -    Diag((*Found.first)->getLocation(), diag::note_property_declare); +    Diag(prevDecl->getLocation(), diag::note_property_declare);      PDecl->setInvalidDecl();    }    else  | 

