internal/core/compile: fix let resolution bug
Fixes #767
Change-Id: Idf04a9af01552f2cdd709a5f17eda67eb310efa2
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/8708
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/testdata/compile/let.txtar b/cue/testdata/compile/let.txtar
index 06fc8cf..1c008d3 100644
--- a/cue/testdata/compile/let.txtar
+++ b/cue/testdata/compile/let.txtar
@@ -14,6 +14,48 @@
b: X
c: 5
}
+
+fieldOffset: {
+ a: {
+ p1: {
+ let X = { value: Y }
+ let Y = 2
+ x: X
+ }
+ p2: {
+ x: X
+ let Y = 2
+ let X = { value: Y }
+ }
+ }
+ b: {
+ p1: {
+ let X = { x: y: Y }
+ let Y = 2
+ x: X
+ }
+ p2: {
+ x: X
+ let Y = 2
+ let X = { x: y: Y }
+ }
+ }
+}
+
+issue767: {
+ #Foo: {
+ let _#bar = {
+ value: ""
+ }
+ let _#volmnts = {
+ x: _#baz.value
+ }
+ let _#baz = {
+ _#bar
+ }
+ out: _#volmnts
+ }
+}
-- out/compile --
--- in.cue
{
@@ -25,6 +67,29 @@
b: 〈0;let X〉
c: 5
}
+ fieldOffset: {
+ a: {
+ p1: {
+ x: 〈0;let X〉
+ }
+ p2: {
+ x: 〈0;let X〉
+ }
+ }
+ b: {
+ p1: {
+ x: 〈0;let X〉
+ }
+ p2: {
+ x: 〈0;let X〉
+ }
+ }
+ }
+ issue767: {
+ #Foo: {
+ out: 〈0;let _#volmnts〉
+ }
+ }
}
-- out/eval --
Errors:
@@ -46,4 +111,41 @@
}
c: (int){ 5 }
}
+ fieldOffset: (struct){
+ a: (struct){
+ p1: (struct){
+ x: (struct){
+ value: (int){ 2 }
+ }
+ }
+ p2: (struct){
+ x: (struct){
+ value: (int){ 2 }
+ }
+ }
+ }
+ b: (struct){
+ p1: (struct){
+ x: (struct){
+ x: (struct){
+ y: (int){ 2 }
+ }
+ }
+ }
+ p2: (struct){
+ x: (struct){
+ x: (struct){
+ y: (int){ 2 }
+ }
+ }
+ }
+ }
+ }
+ issue767: (struct){
+ #Foo: (#struct){
+ out: (#struct){
+ x: (string){ "" }
+ }
+ }
+ }
}
diff --git a/internal/core/compile/compile.go b/internal/core/compile/compile.go
index 37769b3..f94b18f 100644
--- a/internal/core/compile/compile.go
+++ b/internal/core/compile/compile.go
@@ -205,7 +205,7 @@
entry.srcExpr = nil // mark to allow detecting cycles
m[name] = entry
- entry.expr = c.labeledExpr(nil, entry.label, src)
+ entry.expr = c.labeledExprAt(k, nil, entry.label, src)
entry.label = nil
}
@@ -753,6 +753,10 @@
func (c *compiler) labeledExpr(f *ast.Field, lab labeler, expr ast.Expr) adt.Expr {
k := len(c.stack) - 1
+ return c.labeledExprAt(k, f, lab, expr)
+}
+
+func (c *compiler) labeledExprAt(k int, f *ast.Field, lab labeler, expr ast.Expr) adt.Expr {
if c.stack[k].field != nil {
panic("expected nil field")
}