// RUN: %target-swift-frontend -emit-sil -verify %s // // Make sure neither rdar://problem/37031037 (default arguments on protocol extension methods // depend on Self and normally get evaluated before an existential self value // gets opened) nor rdar://problem/39524104 (if you open the existential self // earlier in an attempt to fix this, then you get undesirable exclusivity // conflicts on constructs like `existential.x = existential.y`) regress. // protocol MethodWithDefaultArgGenerator { var a: Int { get set } var b: Int { get nonmutating set } mutating func mutate(_ x: inout Int) } protocol P { static var value: Self { get } } extension Int: P { static var value: Int { return 0 } } extension MethodWithDefaultArgGenerator { mutating func foo(_ x: Int = 0) {} mutating func reabstracted(_ x: T.Type = T.self) -> T { fatalError() } mutating func indirected(_ x: T = T.value) -> T { fatalError() } mutating func exploded(x y: (Int, String) = (0, "foo")) {} } func invokeMethodsWithDefaultArgs(x: inout MethodWithDefaultArgGenerator) { x.foo() _ = x.reabstracted() as Int _ = x.indirected() as Int x.exploded() } func checkAgainstExclusivityViolations(x: inout MethodWithDefaultArgGenerator) { x.a = x.a x.mutate(&x.b) }