Skip to content

Commit f808882

Browse files
committed
[embedded] Fix IR verification crash when using arrays of zero-sized structs
1 parent e01f234 commit f808882

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

lib/IRGen/GenBuiltin.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,10 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11151115
SILType elemTy = valueTy.first;
11161116
const TypeInfo &elemTI = valueTy.second;
11171117

1118+
if (elemTI.isTriviallyDestroyable(ResilienceExpansion::Maximal) ==
1119+
IsTriviallyDestroyable)
1120+
return;
1121+
11181122
llvm::Value *firstElem = IGF.Builder.CreateBitCast(
11191123
ptr, elemTI.getStorageType()->getPointerTo());
11201124

@@ -1175,6 +1179,15 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11751179
SILType elemTy = tyPair.first;
11761180
const TypeInfo &elemTI = tyPair.second;
11771181

1182+
// Do nothing for zero-sized POD array elements.
1183+
if (llvm::Constant *SizeConst = elemTI.getStaticSize(IGF.IGM)) {
1184+
auto *SizeInt = cast<llvm::ConstantInt>(SizeConst);
1185+
if (SizeInt->getSExtValue() == 0 &&
1186+
elemTI.isTriviallyDestroyable(ResilienceExpansion::Maximal) ==
1187+
IsTriviallyDestroyable)
1188+
return;
1189+
}
1190+
11781191
llvm::Value *firstSrcElem = IGF.Builder.CreateBitCast(
11791192
src, elemTI.getStorageType()->getPointerTo());
11801193
llvm::Value *firstDestElem = IGF.Builder.CreateBitCast(
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %target-swift-frontend -emit-ir %s -enable-experimental-feature Embedded | %FileCheck %s
2+
3+
// REQUIRES: VENDOR=apple
4+
// REQUIRES: OS=macosx
5+
6+
public struct MyStruct {
7+
}
8+
9+
public func main() {
10+
var arr: [MyStruct] = []
11+
var arr2: [MyStruct] = [.init()]
12+
var arr3 = arr2
13+
arr3.append(MyStruct())
14+
}
15+
16+
public func copy(_ a: inout [MyStruct]) {
17+
var a = a
18+
}
19+
20+
// CHECK: define {{.*}}@"$s4mainAAyyF"
21+
// CHECK: define {{.*}}@"$s4main4copyyySayAA8MyStructVGzF"

0 commit comments

Comments
 (0)