Members with initial values get their initialization synthesized into the body of the type's initializer. I think we do this during SILGen, i.e. when we go to emit a SIL body for the ConstructorDecl AST node.
(We use the term "initial value" for "the thing on the right side of the equal sign for a variable or constant" and "default value" for "the thing on the right side of the equal side for a parameter".) Jordan > On Dec 11, 2015, at 16:28 , Matthew Johnson <matt...@anandabits.com> wrote: > > Thanks Doug, that makes sense. I was wondering if Joe's answer might have > been referring to arguments with defaults. > > What are you doing for members with default values specific (and therefore > not initialized by code in an initializer)? Do you plan changes to this as > well? > > Matthew > > > > Sent from my iPad > >> On Dec 11, 2015, at 5:11 PM, Douglas Gregor <dgre...@apple.com> wrote: >> >> >>> On Dec 10, 2015, at 10:13 AM, Matthew Johnson <matt...@anandabits.com> >>> wrote: >>> >>> Thanks Joe. It sounds like in both current state and future state the >>> compiler synthesizes additional arguments to the initializers for the type. >>> Is that correct? >>> >>> Doug and Jordan, if you’re able to offer any additional insights that would >>> be much appreciated as well. I want to make sure my proposal aligns well >>> with how you’re handling this. >>> >>> This is some code showing my understand of how you describe current and >>> future state. Can you confirm if this is correct? >>> >>> struct S { >>> let d: Double >>> let s: String = "default" >>> >>> // actual compiler generated signature is init(d: Double, s: String) >>> init(d: Double) { >>> // compiler generated initialization of s >>> // self.s = s >>> self.d = d >>> } >>> // current state compiler generated default value function >>> static func sDefault() -> String { return "default" } >>> } >>> >>> // current state: actual compiler generated call is S(d: 1, s: S.sDefault()) >>> // future state: actual compiler generated call is S(d: 1, s: "default") >>> let s = S(d: 1) >> >> >> Right now, we’re doing what Joe describes for default arguments of >> parameters only. So if you had written: >> >> struct S { >> let d: Double >> let s: String >> >> init(d: Double, s: String = “default”) { … } >> } >> >> let s = S(d: 1) >> >> the compiler would generate >> >>> // current state compiler generated default value function >>> static func sDefault() -> String { return "default" } >> >> and call >> >> S(d: 1, s: sDefault()) >> >> The future state isn’t actually settled. We’re not thrilled with the idea of >> having to serialize expressions into Swift modules, which is what we would >> need to do to have the compiler turn the caller into >> >> S(d: 1, s: “default”) >> >> The alternative that (IIRC) we’re currently favoring is to mark the SIL >> functions created as the default argument generators as “transparent”, so >> the SIL itself gets serialized into the Swift module and inlined into the >> call site (always). This is actually a smaller change to achieve the same >> effect, and avoids a lot of otherwise-unnecessary work to define the >> serialization of statements and expressions into Swift modules. >> >> - Doug >> _______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev