Correctly determine if the @property has been previously declared. If

a property has the same name as the ivar it wraps then the old logic
wouldn't find the previous property declaration.

llvm-svn: 98559
This commit is contained in:
Ted Kremenek 2010-03-15 18:47:25 +00:00
parent 49ee281213
commit 679708ee34
2 changed files with 25 additions and 7 deletions

View File

@ -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

View File

@ -0,0 +1,8 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
@interface Foo {
id x;
}
@property (nonatomic, retain) id x;
@property (nonatomic, retain) id x; // expected-error{{property has a previous declaration}}
@end