Fix <rdar://problem/6253149> property declaration doesn't declare getter and setter.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56785 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Steve Naroff 2008-09-29 14:20:56 +00:00
Родитель 48002c8957
Коммит 5e0a74fbf4
2 изменённых файлов: 29 добавлений и 0 удалений

Просмотреть файл

@ -874,6 +874,9 @@ void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl,
}
}
}
// Save the size so we can detect if we've added any property methods.
unsigned int insMethodsSizePriorToPropAdds = insMethods.size();
unsigned int clsMethodsSizePriorToPropAdds = clsMethods.size();
if (ObjCInterfaceDecl *I = dyn_cast<ObjCInterfaceDecl>(ClassDecl)) {
// Compares properties declared in this class to those of its
@ -925,6 +928,24 @@ void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl,
}
}
}
// Add any synthesized methods to the global pool. This allows us to
// handle the following, which is supported by GCC (and part of the design).
//
// @interface Foo
// @property double bar;
// @end
//
// void thisIsUnfortunate() {
// id foo;
// double bar = [foo bar];
// }
//
if (insMethodsSizePriorToPropAdds < insMethods.size())
for (unsigned i = insMethodsSizePriorToPropAdds; i < insMethods.size(); i++)
AddInstanceMethodToGlobalPool(insMethods[i]);
if (clsMethodsSizePriorToPropAdds < clsMethods.size())
for (unsigned i = clsMethodsSizePriorToPropAdds; i < clsMethods.size(); i++)
AddFactoryMethodToGlobalPool(clsMethods[i]);
}

Просмотреть файл

@ -35,5 +35,13 @@
@dynamic d; // expected-error {{property implementation in a category with no category declaration}}
@end
@interface Foo
@property double bar;
@end
int main() {
id foo;
double bar = [foo bar];
return 0;
}