Skip to content

Commit 5f558fd

Browse files
authored
Merge pull request #79331 from Azoy/fix-fa-tc
[SIL] Check if our original type is opaque before getting getting FixedArray element type
2 parents d07e852 + a34fb38 commit 5f558fd

File tree

2 files changed

+61
-6
lines changed

2 files changed

+61
-6
lines changed

lib/SIL/IR/TypeLowering.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3075,12 +3075,8 @@ bool TypeConverter::visitAggregateLeaves(
30753075
origTy.getPackExpansionPatternType(),
30763076
field, index);
30773077
} else if (auto array = dyn_cast<BuiltinFixedArrayType>(ty)) {
3078-
auto origBFA = origTy.getAs<BuiltinFixedArrayType>();
3079-
insertIntoWorklist(
3080-
array->getElementType(),
3081-
AbstractionPattern(origTy.getGenericSignatureOrNull(),
3082-
origBFA->getElementType()),
3083-
field, index);
3078+
insertIntoWorklist(array->getElementType(),
3079+
AbstractionPattern::getOpaque(), field, index);
30843080
} else if (auto *decl = ty.getStructOrBoundGenericStruct()) {
30853081
for (auto *structField : decl->getStoredProperties()) {
30863082
auto subMap = ty->getContextSubstitutionMap();

test/SIL/bitwise_copyable.swift

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// RUN: %target-swift-frontend \
2+
// RUN: %s \
3+
// RUN: -emit-sil \
4+
// RUN: -enable-experimental-feature ValueGenerics \
5+
// RUN: -enable-builtin-module \
6+
// RUN: -disable-availability-checking \
7+
// RUN: -O
8+
9+
// REQUIRES: swift_feature_ValueGenerics
10+
11+
// Force verification of TypeLowering's isTrivial.
12+
13+
import Builtin
14+
15+
@frozen
16+
public struct Vector<let Count: Int, Element: ~Copyable>: ~Copyable {
17+
private var storage: Builtin.FixedArray<Count, Element>
18+
19+
public init(_ valueForIndex: (Int) -> Element) {
20+
storage = Builtin.emplace { rawPointer in
21+
let base = UnsafeMutablePointer<Element>(rawPointer)
22+
for i in 0..<Count {
23+
(base + i).initialize(to: valueForIndex(i))
24+
}
25+
}
26+
}
27+
28+
public subscript(i: Int) -> Element {
29+
_read {
30+
assert(i >= 0 && i < Count)
31+
let rawPointer = Builtin.addressOfBorrow(self)
32+
let base = UnsafePointer<Element>(rawPointer)
33+
yield ((base + i).pointee)
34+
}
35+
36+
_modify {
37+
assert(i >= 0 && i < Count)
38+
let rawPointer = Builtin.addressof(&self)
39+
let base = UnsafeMutablePointer<Element>(rawPointer)
40+
yield (&(base + i).pointee)
41+
}
42+
}
43+
}
44+
extension Vector: Copyable where Element: Copyable {
45+
public init(repeating value: Element) {
46+
self.init { _ in value }
47+
}
48+
}
49+
extension Vector: BitwiseCopyable where Element: BitwiseCopyable {}
50+
51+
func main() {
52+
var v = Vector<4, String>(repeating: "x") // OK
53+
//v[0] = 1
54+
//v[1] = 2
55+
//v[2] = 3
56+
//v[3] = 4
57+
print("break here")
58+
}
59+
main()

0 commit comments

Comments
 (0)