Skip to content

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

Closed

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.

Activity

  1. belkadan commented on May 20, 2019

    @belkadan
    Contributor
  2. slavapestov commented on May 20, 2019

    @slavapestov
    Contributor

    Ouch!

  3. slavapestov commented on May 20, 2019

    @slavapestov
    Contributor

    I think the only safe thing to do here is to not allow a class to conform to P at all.

  4. belkadan commented on May 20, 2019

    @belkadan
    Contributor

    Or only final classes, or something.

  5. slavapestov commented on Feb 25, 2022

    @slavapestov
    Contributor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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