From: Akira Hatanaka Date: Tue, 13 Sep 2016 22:13:02 +0000 (+0000) Subject: [CodeGen] Fix an assert in EmitNullConstant. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7d009710999be64cdb3527c92ec8ab74c4d98c6a;p=clang [CodeGen] Fix an assert in EmitNullConstant. r235815 changed CGRecordLowering::accumulateBases to ignore non-virtual bases of size 0, which prevented adding those non-virtual bases to CGRecordLayout's NonVirtualBases. This caused clang to assert when CGRecordLayout::getNonVirtualBaseLLVMFieldNo was called in EmitNullConstant. This commit fixes the bug by ignoring zero-sized non-virtual bases in EmitNullConstant. rdar://problem/28100139 Differential Revision: https://reviews.llvm.org/D24312 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@281405 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 0e818e99ee..c268c03792 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -1532,7 +1532,8 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM, cast(I.getType()->castAs()->getDecl()); // Ignore empty bases. - if (base->isEmpty()) + if (base->isEmpty() || + CGM.getContext().getASTRecordLayout(base).getNonVirtualSize().isZero()) continue; unsigned fieldIndex = layout.getNonVirtualBaseLLVMFieldNo(base); diff --git a/test/CodeGenCXX/empty-classes.cpp b/test/CodeGenCXX/empty-classes.cpp index e27a961e12..5727d59182 100644 --- a/test/CodeGenCXX/empty-classes.cpp +++ b/test/CodeGenCXX/empty-classes.cpp @@ -96,3 +96,24 @@ namespace rdar20621065 { // Type checked at the top of the file. B b; }; + +// This test used to crash when CGRecordLayout::getNonVirtualBaseLLVMFieldNo was called. +namespace record_layout { +struct X0 { + int x[0]; +}; + +template +struct X2 : X0 { +}; + +template +struct X3 : X2 { + X3() : X2() {} +}; + + +void test0() { + X3(); +} +}