diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2013-09-18 01:59:16 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2013-09-18 01:59:16 +0000 |
commit | 1d24af872df47c0baad9cc291a05575c2e4947d5 (patch) | |
tree | 3bca36492f9ede6adcf46e2cbeddb580187a57ea /clang | |
parent | d25789a671c3169412a48c0bacf0ec0c150d5190 (diff) | |
download | bcm5719-llvm-1d24af872df47c0baad9cc291a05575c2e4947d5.tar.gz bcm5719-llvm-1d24af872df47c0baad9cc291a05575c2e4947d5.zip |
Fix ObjC @encode for C++ classes w/virtual bases.
PR17142.
llvm-svn: 190912
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 3 | ||||
-rw-r--r-- | clang/test/CodeGenObjCXX/encode.mm | 10 |
2 files changed, 12 insertions, 1 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index ee71116c58a..fd9c7cf1132 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/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/clang/test/CodeGenObjCXX/encode.mm b/clang/test/CodeGenObjCXX/encode.mm index 589db6c0e04..075d7909d59 100644 --- a/clang/test/CodeGenObjCXX/encode.mm +++ b/clang/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); +} |