• Robert Griesemer's avatar
    spec: specify variable initialization order explicitly · 259f0ffa
    Robert Griesemer authored
    The existing spec rules on package initialization were
    contradictory: They specified that 1) dependent variables
    are initialized in dependency order, and 2) independent
    variables are initialized in declaration order. This 2nd
    rule cannot be satisfied in general. For instance, for
    
    var (
            c = b + 2
            a = 0
            b = 1
    )
    
    because of its dependency on b, c must be initialized after b,
    leading to the partial order b, c. Because a is independent of
    b but is declared before b, we end up with the order: a, b, c.
    But a is also independent of c and is declared after c, so the
    order b, c, a should also be valid in contradiction to a, b, c.
    
    The new rules are given in form of an algorithm which outlines
    initialization order explicitly.
    
    gccgo and go/types already follow these rules.
    
    Fixes #8485.
    
    LGTM=iant, r, rsc
    R=r, rsc, iant, ken, gordon.klaus, adonovan
    CC=golang-codereviews
    https://golang.org/cl/142880043
    259f0ffa
go_spec.html 187 KB