Skip to content

Commit 7cabef8

Browse files
authored
Merge pull request #29579 from slavapestov/no-ethical-consumption-of-class-methods
AST: Fix computeSelfParam() to respect __consuming on class methods
2 parents 95e98d9 + 62ca2aa commit 7cabef8

File tree

4 files changed

+15
-12
lines changed

4 files changed

+15
-12
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:

lib/SIL/SILFunctionType.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -983,10 +983,8 @@ class DestructureInputs {
983983
for (auto i : indices(substTupleTy.getElementTypes())) {
984984
auto &elt = substTupleTy->getElement(i);
985985
auto ownership = elt.getParameterFlags().getValueOwnership();
986-
// FIXME(swift3): Once the entire parameter list is no longer a
987-
// target for substitution, re-enable this.
988-
// assert(ownership == ValueOwnership::Default);
989-
// assert(!elt.isVararg());
986+
assert(ownership == ValueOwnership::Default);
987+
assert(!elt.isVararg());
990988
visit(ownership, forSelf,
991989
origType.getTupleElementType(i),
992990
CanType(elt.getRawType()), rep);
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)