forked from OSchip/llvm-project
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:
parent
27540f8d8c
commit
7457aaf8c9
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue