Skip to content

Commit 444b59c

Browse files
author
Joe Shajrawi
committed
Further enum support under opaque value mode: Builtins and address only types. Including opaque tuples as a return value. Adds library / stdlib unit tests.
1 parent 067c867 commit 444b59c

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

include/swift/SIL/TypeLowering.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,9 @@ class TypeConverter {
603603

604604
SILType getLoweredLoadableType(Type t) {
605605
const TypeLowering &ti = getTypeLowering(t);
606-
assert(ti.isLoadable() && "unexpected address-only type");
606+
assert(
607+
(ti.isLoadable() || !SILModuleConventions(M).useLoweredAddresses()) &&
608+
"unexpected address-only type");
607609
return ti.getLoweredType();
608610
}
609611

lib/SILGen/RValue.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,8 @@ static SILValue implodeTupleValues(ArrayRef<ManagedValue> values,
257257

258258
// To implode an address-only tuple, we need to create a buffer to hold the
259259
// result tuple.
260-
if (loweredType.isAddressOnly(SGF.F.getModule())) {
260+
if (loweredType.isAddressOnly(SGF.F.getModule()) &&
261+
SGF.silConv.useLoweredAddresses()) {
261262
assert(KIND != ImplodeKind::Unmanaged &&
262263
"address-only values are always managed!");
263264
SILValue buffer = SGF.emitTemporaryAllocation(l, loweredType);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// RUN: %target-swift-frontend -enable-sil-opaque-values -emit-sorted-sil -Xllvm -new-mangling-for-tests -Xllvm -sil-full-demangle -parse-stdlib -parse-as-library -emit-silgen -module-name Swift %s | %FileCheck %s
2+
// UNSUPPORTED: resilient_stdlib
3+
4+
precedencegroup AssignmentPrecedence { assignment: true }
5+
6+
enum Optional<Wrapped> {
7+
case none
8+
case some(Wrapped)
9+
}
10+
11+
protocol EmptyP {}
12+
13+
struct String { var ptr: Builtin.NativeObject }
14+
15+
// Init of Empty protocol + Builtin.NativeObject enum (including opaque tuples as a return value)
16+
// ---
17+
// CHECK-LABEL: sil shared [transparent] [thunk] @_TFOs9PAndSEnum1AFMS_FTPs6EmptyP_SS_S_ : $@convention(thin) (@thin PAndSEnum.Type) -> @owned @callee_owned (@in EmptyP, @owned String) -> @out PAndSEnum {
18+
// CHECK: bb0([[ARG:%.*]] : $@thin PAndSEnum.Type):
19+
// CHECK: [[RETVAL:%.*]] = partial_apply {{.*}}([[ARG]]) : $@convention(method) (@in EmptyP, @owned String, @thin PAndSEnum.Type) -> @out PAndSEnum
20+
// CHECK: return [[RETVAL]] : $@callee_owned (@in EmptyP, @owned String) -> @out PAndSEnum
21+
// CHECK-LABEL: } // end sil function '_TFOs9PAndSEnum1AFMS_FTPs6EmptyP_SS_S_'
22+
// CHECK-LABEL: sil shared [transparent] @_TFOs9PAndSEnum1AfMS_FTPs6EmptyP_SS_S_ : $@convention(method) (@in EmptyP, @owned String, @thin PAndSEnum.Type) -> @out PAndSEnum {
23+
// CHECK: bb0([[ARG0:%.*]] : $EmptyP, [[ARG1:%.*]] : $String, [[ARG2:%.*]] : $@thin PAndSEnum.Type):
24+
// CHECK: [[RTUPLE:%.*]] = tuple ([[ARG0]] : $EmptyP, [[ARG1]] : $String)
25+
// CHECK: [[RETVAL:%.*]] = enum $PAndSEnum, #PAndSEnum.A!enumelt.1, [[RTUPLE]] : $(EmptyP, String)
26+
// CHECK: return [[RETVAL]] : $PAndSEnum
27+
// CHECK-LABEL: } // end sil function '_TFOs9PAndSEnum1AfMS_FTPs6EmptyP_SS_S_'
28+
enum PAndSEnum { case A(EmptyP, String) }
29+
30+
// Tests Empty protocol + Builtin.NativeObject enum (including opaque tuples as a return value)
31+
// ---
32+
// CHECK-LABEL: sil hidden @_TFs21s010______PAndS_casesFT_T_ : $@convention(thin) () -> () {
33+
// CHECK: bb0:
34+
// CHECK: [[MTYPE:%.*]] = metatype $@thin PAndSEnum.Type
35+
// CHECK: [[EAPPLY:%.*]] = apply {{.*}}([[MTYPE]]) : $@convention(thin) (@thin PAndSEnum.Type) -> @owned @callee_owned (@in EmptyP, @owned String) -> @out PAndSEnum
36+
// CHECK: destroy_value [[EAPPLY]]
37+
// CHECK: return %{{.*}} : $()
38+
// CHECK-LABEL: } // end sil function '_TFs21s010______PAndS_casesFT_T_'
39+
func s010______PAndS_cases() {
40+
_ = PAndSEnum.A
41+
}

0 commit comments

Comments
 (0)