Added ObjCAtDefsFieldDecl to represent FieldDecls created by @defs.
This fixes an ownership issue where FieldDecls could be owned both by an ObjCInterfaceDecl and a RecordDecl.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55037 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 5a1ad50..b3e278c 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -1794,11 +1794,21 @@
/// Collect the instance variables declared in an Objective-C object. Used in
/// the creation of structures from objects using the @defs directive.
-static void CollectIvars(ObjCInterfaceDecl *Class,
+static void CollectIvars(ObjCInterfaceDecl *Class, ASTContext& Ctx,
llvm::SmallVectorImpl<Sema::DeclTy*> &ivars) {
if (Class->getSuperClass())
- CollectIvars(Class->getSuperClass(), ivars);
- ivars.append(Class->ivar_begin(), Class->ivar_end());
+ CollectIvars(Class->getSuperClass(), Ctx, ivars);
+
+ // For each ivar, create a fresh ObjCAtDefsFieldDecl.
+ for (ObjCInterfaceDecl::ivar_iterator I=Class->ivar_begin(), E=Class->ivar_end();
+ I!=E; ++I) {
+
+ ObjCIvarDecl* ID = *I;
+ ivars.push_back(ObjCAtDefsFieldDecl::Create(Ctx, ID->getLocation(),
+ ID->getIdentifier(),
+ ID->getType(),
+ ID->getBitWidth()));
+ }
}
/// Called whenever @defs(ClassName) is encountered in the source. Inserts the
@@ -1813,7 +1823,7 @@
return;
}
// Collect the instance variables
- CollectIvars(Class, Decls);
+ CollectIvars(Class, Context, Decls);
}
QualType Sema::TryFixInvalidVariablyModifiedType(QualType T) {