Skip to content

Commit f59e32b

Browse files
committed
Check if our original type is opaque before getting getting FixedArray element type
1 parent eb7706d commit f59e32b

File tree

2 files changed

+67
-6
lines changed

2 files changed

+67
-6
lines changed

lib/SIL/IR/TypeLowering.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3067,12 +3067,14 @@ bool TypeConverter::visitAggregateLeaves(
30673067
origTy.getPackExpansionPatternType(),
30683068
field, index);
30693069
} else if (auto array = dyn_cast<BuiltinFixedArrayType>(ty)) {
3070-
auto origBFA = origTy.getAs<BuiltinFixedArrayType>();
3071-
insertIntoWorklist(
3072-
array->getElementType(),
3073-
AbstractionPattern(origTy.getGenericSignatureOrNull(),
3074-
origBFA->getElementType()),
3075-
field, index);
3070+
auto origEltTy = AbstractionPattern::getOpaque();
3071+
3072+
if (auto origBFA = origTy.getAs<BuiltinFixedArrayType>()) {
3073+
origEltTy = AbstractionPattern(origTy.getGenericSignatureOrNull(),
3074+
origBFA->getElementType());
3075+
}
3076+
3077+
insertIntoWorklist(array->getElementType(), origEltTy, field, index);
30763078
} else if (auto *decl = ty.getStructOrBoundGenericStruct()) {
30773079
for (auto *structField : decl->getStoredProperties()) {
30783080
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)