From: Eli Friedman Date: Wed, 18 Sep 2013 01:59:16 +0000 (+0000) Subject: Fix ObjC @encode for C++ classes w/virtual bases. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1a973447d0524b6dbb67605c33481687b24cd862;p=clang Fix ObjC @encode for C++ classes w/virtual bases. PR17142. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190912 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index ee71116c58..fd9c7cf113 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -5552,7 +5552,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl, if (base->isEmpty()) continue; uint64_t offs = toBits(layout.getVBaseClassOffset(base)); - if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end()) + if (offs >= uint64_t(toBits(layout.getNonVirtualSize())) && + FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end()) FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(), std::make_pair(offs, base)); } diff --git a/test/CodeGenObjCXX/encode.mm b/test/CodeGenObjCXX/encode.mm index 589db6c0e0..075d7909d5 100644 --- a/test/CodeGenObjCXX/encode.mm +++ b/test/CodeGenObjCXX/encode.mm @@ -214,3 +214,13 @@ public: } @end // CHECK: internal global [41 x i8] c"{dynamic_class=\22_vptr$dynamic_class\22^^?}\00" + +namespace PR17142 { + struct A { virtual ~A(); }; + struct B : virtual A { int y; }; + struct C { virtual ~C(); int z; }; + struct D : C, B { int a; }; + struct E : D {}; + // CHECK: @_ZN7PR171421xE = constant [14 x i8] c"{E=^^?i^^?ii}\00" + extern const char x[] = @encode(E); +}