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")
 	}