Reset the layout of an ObjC class if we see an ivar in a category

or implementation since we've now got a different layout.

Fixes rdar://11842763

llvm-svn: 160526
This commit is contained in:
Eric Christopher 2012-07-19 22:22:51 +00:00
parent 27540f8d8c
commit 7457aaf8c9
2 changed files with 52 additions and 0 deletions

View File

@ -9802,6 +9802,23 @@ void Sema::ActOnFields(Scope* S,
if (EnclosingDecl->isInvalidDecl())
return;
// If this is an Objective-C @implementation or category and we have
// new fields here we should reset the layout of the interface since
// it will now change.
if (!Fields.empty() && isa<ObjCContainerDecl>(EnclosingDecl)) {
ObjCContainerDecl *DC = cast<ObjCContainerDecl>(EnclosingDecl);
switch (DC->getKind()) {
default: break;
case Decl::ObjCCategory:
Context.ResetObjCLayout(cast<ObjCCategoryDecl>(DC)->getClassInterface());
break;
case Decl::ObjCImplementation:
Context.
ResetObjCLayout(cast<ObjCImplementationDecl>(DC)->getClassInterface());
break;
}
}
RecordDecl *Record = dyn_cast<RecordDecl>(EnclosingDecl);
// Start counting up the number of named members; make sure to include

View File

@ -0,0 +1,35 @@
// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime=macosx-10.7 -fobjc-gc -emit-llvm -g -o - %s
// Check that this doesn't crash when compiled with debugging on.
@class Foo;
typedef struct Bar *BarRef;
@interface Baz
@end
@interface Foo
- (void) setFlag;
@end
@implementation Baz
- (void) a:(BarRef)b
{
Foo* view = (Foo*)self;
[view setFlag];
}
@end
@implementation Foo
{
int flag : 1;
}
- (void) setFlag
{
if (!flag)
flag = 1;
}
@end