Use an ASTRecordLayout to compute the sizeof an interface, not
addRecordToClass.
 - Among other things, this fixes a crash when applying sizeof to an
   interface with synthesized ivars, although things still aren't
   "correct" here.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69675 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index 8fd75f1..b588eab 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -1079,18 +1079,18 @@
   if (!SrcTy->isConstantSizeType())
     return false;
 
+  unsigned BitWidth = 0;
   if (SrcTy->isObjCInterfaceType()) {
     // Slightly unusual case: the size of an ObjC interface type is the
-    // size of the class.  This code intentionally falls through to the normal
-    // case.
+    // size of the class.
     ObjCInterfaceDecl *OI = SrcTy->getAsObjCInterfaceType()->getDecl();
-    RecordDecl *RD = const_cast<RecordDecl*>(Info.Ctx.addRecordToClass(OI));
-    SrcTy = Info.Ctx.getTagDeclType(static_cast<TagDecl*>(RD));
-  }
+    const ASTRecordLayout &Layout = Info.Ctx.getASTObjCInterfaceLayout(OI);
+    BitWidth = Layout.getSize();
+  } else
+    BitWidth = Info.Ctx.getTypeSize(SrcTy);
 
   // Get information about the size.
-  unsigned CharSize = Info.Ctx.Target.getCharWidth();
-  return Success(Info.Ctx.getTypeSize(SrcTy) / CharSize, E);
+  return Success(BitWidth / Info.Ctx.Target.getCharWidth(), E);
 }
 
 bool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {