]> Cypherpunks repositories - gostls13.git/commit
go/types: delay type-checking of function literals
authorRobert Griesemer <gri@golang.org>
Mon, 11 Dec 2017 23:30:39 +0000 (15:30 -0800)
committerRobert Griesemer <gri@golang.org>
Mon, 12 Feb 2018 21:40:02 +0000 (21:40 +0000)
commitff6d7c2b27697e9f2bf35c97c230afbae11f3f9f
tree35a5f15e705a39af31650919226e3e3836047658
parent574fc66b17e25d34d59d69c01978e7cd32cb8f30
go/types: delay type-checking of function literals

R=go1.11

Functions (at the package level) were collected and their bodies
type-checked after all other package-level objects were checked.
But function literals where type-checked right away when they were
encountered so that they could see the correct, partially populated
surrounding scope, and also to mark variables of the surrounding
function as used.

This approach, while simple, breaks down in esoteric cases where
a function literal appears inside the declaration of an object
that its body depends on: If the body is type-checked before the
object is completely set up, the literal may use incomplete data
structures, possibly leading to spurious errors.

This change postpones type-checking of function literals to later;
after the current expression or statement, but before any changes
to the enclosing scope (so that the delayed type-checking sees the
correct scope contents).

The new mechanism is general and now is also used for other
(non-function) delayed checks.

Fixes #22992.

Change-Id: Ic95f709560858b4bdf8c645be70abe4449f6184d
Reviewed-on: https://go-review.googlesource.com/83397
Reviewed-by: Alan Donovan <adonovan@google.com>
src/go/types/check.go
src/go/types/decl.go
src/go/types/expr.go
src/go/types/resolver.go
src/go/types/stmt.go
src/go/types/testdata/constdecl.src
src/go/types/testdata/cycles.src
src/go/types/testdata/cycles5.src
src/go/types/testdata/init0.src
src/go/types/testdata/vardecl.src
src/go/types/typexpr.go