Skip to content

Commit 356bfd5

Browse files
authored
Merge pull request #69010 from kubamracek/embedded-zero-sized-structs
[embedded] Fix IR verification crash when using arrays of zero-sized structs
2 parents 0cf8e4c + f808882 commit 356bfd5

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
@@ -1123,6 +1123,10 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11231123
SILType elemTy = valueTy.first;
11241124
const TypeInfo &elemTI = valueTy.second;
11251125

1126+
if (elemTI.isTriviallyDestroyable(ResilienceExpansion::Maximal) ==
1127+
IsTriviallyDestroyable)
1128+
return;
1129+
11261130
llvm::Value *firstElem = IGF.Builder.CreateBitCast(
11271131
ptr, elemTI.getStorageType()->getPointerTo());
11281132

@@ -1183,6 +1187,15 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11831187
SILType elemTy = tyPair.first;
11841188
const TypeInfo &elemTI = tyPair.second;
11851189

1190+
// Do nothing for zero-sized POD array elements.
1191+
if (llvm::Constant *SizeConst = elemTI.getStaticSize(IGF.IGM)) {
1192+
auto *SizeInt = cast<llvm::ConstantInt>(SizeConst);
1193+
if (SizeInt->getSExtValue() == 0 &&
1194+
elemTI.isTriviallyDestroyable(ResilienceExpansion::Maximal) ==
1195+
IsTriviallyDestroyable)
1196+
return;
1197+
}
1198+
11861199
llvm::Value *firstSrcElem = IGF.Builder.CreateBitCast(
11871200
src, elemTI.getStorageType()->getPointerTo());
11881201
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)