Commits

Doug Gregor committed 474016398ff
Model references to DynamicSelf methods on existentials by opening the existential. Introduce a new expression kind, OpenExistentialExpr, that "opens" up an existential value into a value of a fresh archetype type that represents the dynamic type of the existential. That value can be referenced (via an OpaqueValueExpr) within the within the subexpression of OpenExistentialExpr. For example, a call to a DynamicSelf method on an existential looks something like this: (open_existential_expr implicit type='P' (opaque_value_expr implicit type='opened P' @ 0x7fd95207c290 unique) (load_expr implicit type='P' (declref_expr type='@lvalue P' decl=t.(file).func decl.p@t.swift:5:37 specialized=no)) (erasure_expr implicit type='P' (call_expr type='opened P' (archetype_member_ref_expr type='() -> opened P' decl=t.(file).P.f@t.swift:2:8 [with Self=opened P] (opaque_value_expr implicit type='opened P' @ 0x7fd95207c290 unique)) (tuple_expr type='()'))))) Note that we're using archetype_member_ref_expr rather than existential_member_ref_expr, because the call is operating on the opaque_value_expr of archetype type. The outer erasure turns the archetype value back into an existential value. The SILGen side of this is somewhat incomplete; we're using project_existential[_ref] to open the existential, which is almost correct: it gives us access to the value as an archetype, but IRGen doesn't know to treat the archetype type as a fresh archetype whose conformances come from the existential. Additionally, the output of the opened type is not properly parsable. I'll fix this in follow-on commits. Finally, the type checker very narrowly introduces support for OpenExistentialExpr as it pertains to DynamicSelf. However, this can generalize to support all accesses into existentials, eliminating the need for ExistentialMemberRef and ExistentialSubscript in the AST and protocol_method in SIL, as well as enabling more advanced existential features should we want them later. Swift SVN r13740