Skip to content

[SR-10713] The dynamic nature of a protocol's Self type isn't checked when equated with another associated type  #53110

@hamishknight

Description

@hamishknight
Previous ID SR-10713
Radar None
Original Reporter @hamishknight
Type Bug
Status Closed
Resolution Done
Environment

Swift version 5.1-dev (LLVM 082dec2e22, Swift 397965d3fc)
Target: x86_64-apple-darwin18.5.0

Additional Detail from JIRA
Votes 0
Component/s Compiler
Labels Bug, AcceptsInvalid, TypeChecker
Assignee @slavapestov
Priority Medium

md5: 68e52fe5d63fd695a13a186f306cb4bc

Issue Description:

The following unsound code is allowed to compile, which lets us turn a subclass instance into a superclass instance:

protocol P {
  associatedtype X where X == Self
  func foo() -> X
}

class C : P {
  typealias X = C
  func foo() -> X {
    return C()
  }
}
class D : C {}

func foo<T : P>(_ x: inout T) {
  x = x.foo()
}

var d = D()
foo(&d)
print(type(of: d)) // C

When checking the constraint X == Self, we should treat Self as being the dynamic self and therefore reject the conformance.

Metadata

Metadata

Assignees

Labels

accepts invalidBug: Accepts invalidbugA deviation from expected or documented behavior. Also: expected but undesirable behavior.compilerThe Swift compiler itselftype checkerArea → compiler: Semantic analysis

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions