Skip to content

Commit a92724b

Browse files
committed
AST: Fix computeSelfParam() to respect __consuming on class methods
Fixes <rdar://problem/58887618>.
1 parent de9ffcb commit a92724b

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

lib/AST/ASTContext.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2431,7 +2431,8 @@ AnyFunctionType::Param swift::computeSelfParam(AbstractFunctionDecl *AFD,
24312431
if (isInitializingCtor) {
24322432
// initializing constructors of value types always have an implicitly
24332433
// inout self.
2434-
selfAccess = SelfAccessKind::Mutating;
2434+
if (!containerTy->hasReferenceSemantics())
2435+
selfAccess = SelfAccessKind::Mutating;
24352436
} else {
24362437
// allocating constructors have metatype 'self'.
24372438
isStatic = true;
@@ -2459,10 +2460,6 @@ AnyFunctionType::Param swift::computeSelfParam(AbstractFunctionDecl *AFD,
24592460
if (isStatic)
24602461
return AnyFunctionType::Param(MetatypeType::get(selfTy, Ctx));
24612462

2462-
// Reference types have 'self' of type T.
2463-
if (containerTy->hasReferenceSemantics())
2464-
return AnyFunctionType::Param(selfTy);
2465-
24662463
auto flags = ParameterTypeFlags();
24672464
switch (selfAccess) {
24682465
case SelfAccessKind::Consuming:
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: %target-swift-emit-silgen %s | %FileCheck %s
2+
3+
class ConsumingClass {
4+
__consuming func consumingMethod() {}
5+
}
6+
7+
// CHECK-LABEL: sil hidden [ossa] @$s21value_ownership_class14ConsumingClassC15consumingMethodyyF : $@convention(method) (@owned ConsumingClass) -> () {

test/decl/protocol/protocols.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ struct DoesNotConform : Up {
101101

102102
// Circular protocols
103103

104-
protocol CircleMiddle : CircleStart { func circle_middle() } // expected-error 3 {{protocol 'CircleMiddle' refines itself}}
105-
protocol CircleStart : CircleEnd { func circle_start() }
106-
// expected-note@-1 3 {{protocol 'CircleStart' declared here}}
104+
protocol CircleMiddle : CircleStart { func circle_middle() } // expected-error 2 {{protocol 'CircleMiddle' refines itself}}
105+
// expected-note@-1 {{protocol 'CircleMiddle' declared here}}
106+
protocol CircleStart : CircleEnd { func circle_start() } // expected-error {{protocol 'CircleStart' refines itself}}
107+
// expected-note@-1 2 {{protocol 'CircleStart' declared here}}
107108
protocol CircleEnd : CircleMiddle { func circle_end()} // expected-note 3 {{protocol 'CircleEnd' declared here}}
108109

109110
protocol CircleEntry : CircleTrivial { }

0 commit comments

Comments
 (0)