Commits

Doug Gregor committed 905078a278d
Open method references via the interface type rather than the polymorphic type. Once we've opened method references via the interface type, we then fold all levels of generic argument specialization into the DeclRefExpr, rather than using SpecializeExpr. For reference, the call to x.f in this example: struct X<T> { func f<U>(u : U) { } } func honk(x: X<Int>) { x.f("hello") } goes from this double-specialized AST: (specialize_expr implicit type='(u: String) -> ()' (with U = String) (dot_syntax_call_expr type='<U> (u: U) -> ()' (specialize_expr implicit type='(@inout X<Int>) -> <U> (u: U) -> ()' (with T = Int) (declref_expr type='<T> @inout X<T> -> <U> (u: U) -> ()' decl=t.X.f@t.swift:2:8 specialized=no)) to the cleaner, SpecalizeExpr-free: (dot_syntax_call_expr type='(u: String) -> ()' (declref_expr type='(@inout X<Int>) -> (u: String) -> ()' decl=t.X.f@t.swift:2:8 [with T=Int, U=String] specialized=no) which handles substitutions at both levels together. The minor SILGen tweak Note that there are numerous other places where we are still generated SpecializeExprs. Swift SVN r9614