From 1e9879991b8e7f6f841c2c152cac7b04d291b4c8 Mon Sep 17 00:00:00 2001 From: John McCall Date: Wed, 10 Apr 2019 18:07:18 +0000 Subject: [PATCH] Fix an off-by-one mistake in IRGen's copy-construction special cases in the presence of zero-length arrays. Patch by Joran Bigalet! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@358115 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGClass.cpp | 2 +- test/CodeGenCXX/pod-member-memcpys.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/CodeGen/CGClass.cpp b/lib/CodeGen/CGClass.cpp index d16cae676d..9e1312b786 100644 --- a/lib/CodeGen/CGClass.cpp +++ b/lib/CodeGen/CGClass.cpp @@ -1008,7 +1008,7 @@ namespace { if (FOffset < FirstFieldOffset) { FirstField = F; FirstFieldOffset = FOffset; - } else if (FOffset > LastFieldOffset) { + } else if (FOffset >= LastFieldOffset) { LastField = F; LastFieldOffset = FOffset; } diff --git a/test/CodeGenCXX/pod-member-memcpys.cpp b/test/CodeGenCXX/pod-member-memcpys.cpp index 9facb8ad50..a43706cb37 100644 --- a/test/CodeGenCXX/pod-member-memcpys.cpp +++ b/test/CodeGenCXX/pod-member-memcpys.cpp @@ -45,6 +45,13 @@ struct ArrayMember { int w, x, y, z; }; +struct ZeroLengthArrayMember { + NonPOD np; + int a; + int b[0]; + int c; +}; + struct VolatileMember { int a, b, c, d; volatile int v; @@ -109,6 +116,7 @@ CALL_AO(Basic) CALL_AO(PODMember) CALL_AO(PODLikeMember) CALL_AO(ArrayMember) +CALL_AO(ZeroLengthArrayMember) CALL_AO(VolatileMember) CALL_AO(BitfieldMember) CALL_AO(InnerClassMember) @@ -142,6 +150,12 @@ CALL_AO(PackedMembers) // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 64, i1 {{.*}}) // CHECK: ret %struct.ArrayMember* +// ZeroLengthArrayMember copy-assignment: +// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.ZeroLengthArrayMember* @_ZN21ZeroLengthArrayMemberaSERKS_(%struct.ZeroLengthArrayMember* %this, %struct.ZeroLengthArrayMember* dereferenceable({{[0-9]+}})) +// CHECK: call dereferenceable({{[0-9]+}}) %struct.NonPOD* @_ZN6NonPODaSERKS_ +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 8, i1 {{.*}}) +// CHECK: ret %struct.ZeroLengthArrayMember* + // VolatileMember copy-assignment: // CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.VolatileMember* @_ZN14VolatileMemberaSERKS_(%struct.VolatileMember* %this, %struct.VolatileMember* dereferenceable({{[0-9]+}})) // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}}) -- 2.50.1