r281405 - [CodeGen] Fix an assert in EmitNullConstant.
Akira Hatanaka via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 13 15:13:02 PDT 2016
Author: ahatanak
Date: Tue Sep 13 17:13:02 2016
New Revision: 281405
URL: http://llvm.org/viewvc/llvm-project?rev=281405&view=rev
Log:
[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
Modified:
cfe/trunk/lib/CodeGen/CGExprConstant.cpp
cfe/trunk/test/CodeGenCXX/empty-classes.cpp
Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=281405&r1=281404&r2=281405&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Tue Sep 13 17:13:02 2016
@@ -1532,7 +1532,8 @@ static llvm::Constant *EmitNullConstant(
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
// Ignore empty bases.
- if (base->isEmpty())
+ if (base->isEmpty() ||
+ CGM.getContext().getASTRecordLayout(base).getNonVirtualSize().isZero())
continue;
unsigned fieldIndex = layout.getNonVirtualBaseLLVMFieldNo(base);
Modified: cfe/trunk/test/CodeGenCXX/empty-classes.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/empty-classes.cpp?rev=281405&r1=281404&r2=281405&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/empty-classes.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/empty-classes.cpp Tue Sep 13 17:13:02 2016
@@ -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<typename>
+struct X2 : X0 {
+};
+
+template<typename>
+struct X3 : X2<int> {
+ X3() : X2<int>() {}
+};
+
+
+void test0() {
+ X3<int>();
+}
+}
More information about the cfe-commits
mailing list