diff options
author | Robert Griesemer <gri@golang.org> | 2021-04-07 18:27:08 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2021-04-10 19:02:06 +0000 |
commit | a6d95b4508cb65070fd8471ae8018b897da7fc83 (patch) | |
tree | 02c9e3b75cd44a13ad85e2b5e78efba3f0dbce01 /src/cmd/compile/internal/types2/check.go | |
parent | 36c5f902f9049b82da50ac66049371830e6de031 (diff) | |
download | go-a6d95b4508cb65070fd8471ae8018b897da7fc83.tar.gz go-a6d95b4508cb65070fd8471ae8018b897da7fc83.zip |
cmd/compile/internal/types2: split out function instantiation from index expr
Also, factor out recording of type/value information after
evaluating an expression into an operand, so that we can
use it when handling instantiation expressions manually.
Change-Id: I6776e6cc243558079d6a203f2fe0a6ae0ecc33de
Reviewed-on: https://go-review.googlesource.com/c/go/+/308371
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src/cmd/compile/internal/types2/check.go')
-rw-r--r-- | src/cmd/compile/internal/types2/check.go | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/types2/check.go b/src/cmd/compile/internal/types2/check.go index 2edcefd4c8..7703d98fa6 100644 --- a/src/cmd/compile/internal/types2/check.go +++ b/src/cmd/compile/internal/types2/check.go @@ -307,6 +307,33 @@ func (check *Checker) processDelayed(top int) { check.delayed = check.delayed[:top] } +func (check *Checker) record(x *operand) { + // convert x into a user-friendly set of values + // TODO(gri) this code can be simplified + var typ Type + var val constant.Value + switch x.mode { + case invalid: + typ = Typ[Invalid] + case novalue: + typ = (*Tuple)(nil) + case constant_: + typ = x.typ + val = x.val + default: + typ = x.typ + } + assert(x.expr != nil && typ != nil) + + if isUntyped(typ) { + // delay type and value recording until we know the type + // or until the end of type checking + check.rememberUntyped(x.expr, false, x.mode, typ.(*Basic), val) + } else { + check.recordTypeAndValue(x.expr, x.mode, typ, val) + } +} + func (check *Checker) recordUntyped() { if !debug && check.Types == nil { return // nothing to do |