aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/types2/check.go
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2021-04-07 18:27:08 -0700
committerRobert Griesemer <gri@golang.org>2021-04-10 19:02:06 +0000
commita6d95b4508cb65070fd8471ae8018b897da7fc83 (patch)
tree02c9e3b75cd44a13ad85e2b5e78efba3f0dbce01 /src/cmd/compile/internal/types2/check.go
parent36c5f902f9049b82da50ac66049371830e6de031 (diff)
downloadgo-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.go27
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