Commits

Chris Lattner committed f154cb19617
implement full support for partial liveness tracking of class elements in class initializers, allowing partially initialized and conditionally uninitialized elements at failure points. For example, we compile (with optimizations enabled to clean up the branching) this code: class SomeClass {} class RootClassWithNontrivialStoredProperties { let x, y: SomeClass init?(failAfterPartialInitialization: ()) { x = SomeClass() return nil } } into: sil @... bb0(%0 : $RootClassWithNontrivialStoredProperties): %1 = alloc_ref $SomeClass // users: %3, %4 %2 = ref_element_addr %0 : $RootClassWithNontrivialStoredProperties, #RootClassWithNontrivialStoredProperties.x // user: %3 store %1 to %2 : $*SomeClass // id: %3 strong_release %1 : $SomeClass // id: %4 dealloc_ref %0 : $RootClassWithNontrivialStoredProperties // id: %5 %6 = enum $Optional<RootClassWithNontrivialStoredProperties>, #Optional.None!enumelt // user: %7 return %6 : $Optional<RootClassWithNontrivialStoredProperties> // id: %7 } where the elements of the class are all individually tracked and destroyed if necessary before the class is dealloc'd. Swift SVN r21621