forked from OSchip/llvm-project
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:
parent
49ee281213
commit
679708ee34
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue