From 58db7a575efc9a2f35266fe240feac3cf317753d Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 27 Apr 2012 22:30:01 +0000 Subject: [PATCH] When @encode'ing a C++ class that has empty base classes, we can end up with gaps when the class inherits from the same empty base class more than once. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155738 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ASTContext.cpp | 7 ++----- test/CodeGenObjCXX/encode.mm | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index cb4d336de1..3ec9ff1e17 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -4787,11 +4787,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl, std::multimap::iterator CurLayObj = FieldOrBaseOffsets.begin(); - if ((CurLayObj != FieldOrBaseOffsets.end() && CurLayObj->first != 0) || - (CurLayObj == FieldOrBaseOffsets.end() && - CXXRec && CXXRec->isDynamicClass())) { - assert(CXXRec && CXXRec->isDynamicClass() && - "Offset 0 was empty but no VTable ?"); + if (CXXRec && CXXRec->isDynamicClass() && + (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) { if (FD) { S += "\"_vptr$"; std::string recname = CXXRec->getNameAsString(); diff --git a/test/CodeGenObjCXX/encode.mm b/test/CodeGenObjCXX/encode.mm index 8391c04b7d..b2a4b8f013 100644 --- a/test/CodeGenObjCXX/encode.mm +++ b/test/CodeGenObjCXX/encode.mm @@ -187,3 +187,17 @@ class CefBrowser2 : public virtual CefBase2 {}; class CefBrowserImpl2 : public CefBrowser2 {}; // CHECK: @_ZL2g7 = internal constant [26 x i8] c"{CefBrowserImpl2=^^?^^?i}\00" const char g7[] = @encode(CefBrowserImpl2); + +// +struct Empty {}; + +struct X : Empty { + int array[10]; +}; + +struct Y : Empty { + X vec; +}; + +// CHECK: @_ZL2g8 = internal constant [14 x i8] c"{Y={X=[10i]}}\00" +const char g8[] = @encode(Y); -- 2.40.0