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) {