Erroneous structural cycle detection (and stack overflow) for macro
What version of CUE are you using (cue version)?
$ cue version
cue version v0.10.0-rc.1
go version go1.22.5
-buildmode exe
-compiler gc
-trimpath true
CGO_ENABLED 0
GOARCH amd64
GOOS linux
GOAMD64 v1
cue.lang.version v0.10.0
Does this issue reproduce with the latest stable release?
Yes.
What did you do?
I've written the following macro, which iterates through some struct and makes all its terminal values optional (by setting the existing value as a default value):
#makeOptionalFields: {
base: {...}
result: {
// as you walk through the kv pairs of the struct,
for k, v in base {
// if value is itself a struct,
if (v & {...}) != _|_ {
// iterate
"\(k)": (#makeOptionalFields & {
base: v
}).result
}
// otherwise set the value in the new struct to be optional
if (v & {...}) == _|_ {
"\(k)": *v | _
}
}
}
}
overlaid: (#makeOptionalFields & {base: _base}).result
Which I then proceed to test with two different sets of inputs:
_base: {
test: "test"
}
and
_base: {
some: "field"
yet: {
another: "field"
}
}4
What did you expect to see?
On the v2 parser, without specifying an expression, both files unify successfully:
$ cue eval validator-minimal.cue
#makeOptionalFields: {
base: {}
result: {}
}
overlaid: {
test: "test"
}
$ cue eval validator-minimal-nested.cue
#makeOptionalFields: {
base: {}
result: {}
}
overlaid: {
some: "field"
yet: {
another: "field"
}
}
What did you see instead?
For the nested input values, the v3 parser wrongfully detects a structural cycle.
$ cue eval validator-minimal-nested.cue
structural cycle:
./validator-minimal-nested.cue:6:30
For the simple input values, specifying which field you want to include in the output triggers an infinite recursion in both the v2 and v3 parser.
For v2:
$ cue eval validator-minimal.cue -e overlaid
runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0xc047c81058 stack=[0xc047c80000, 0xc067c80000]
fatal error: stack overflow
runtime stack:
runtime.throw({0xdea56e?, 0x0?})
runtime/panic.go:1023 +0x5c fp=0xc00068fe18 sp=0xc00068fde8 pc=0x43d27c
runtime.newstack()
runtime/stack.go:1103 +0x5bd fp=0xc00068ffc8 sp=0xc00068fe18 pc=0x4592bd
runtime.morestack()
runtime/asm_amd64.s:616 +0x7a fp=0xc00068ffd0 sp=0xc00068ffc8 pc=0x471a5a
goroutine 1 gp=0xc0000061c0 m=8 mp=0xc00050e008 [running]:
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc08f5ea008?, 0x2?, 0xc08f5ea008?, 0x0?, 0x0?, 0x1?)
cuelang.org/[email protected]/internal/core/adt/disjunct.go:139 +0x22a9 fp=0xc047c81068 sp=0xc047c81060 pc=0x6dba29
cuelang.org/go/internal/core/adt.(*OpContext).unify(0xc0001fed80, 0xc08f5ddea0, 0x7fff0102)
cuelang.org/[email protected]/internal/core/adt/eval.go:302 +0x5dc fp=0xc047c81338 sp=0xc047c81068 pc=0x6e32dc
cuelang.org/go/internal/core/adt.(*OpContext).relNode(0xc0001fed80, 0x0?)
cuelang.org/[email protected]/internal/core/adt/context.go:335 +0x3f fp=0xc047c81368 sp=0xc047c81338 pc=0x6cbadf
cuelang.org/go/internal/core/adt.(*FieldReference).resolve(0xc000320050, 0xc0001fed80, 0x410303)
cuelang.org/[email protected]/internal/core/adt/expr.go:716 +0x29 fp=0xc047c813a8 sp=0xc047c81368 pc=0x6f4029
cuelang.org/go/internal/core/adt.(*OpContext).unifyNode(0xc0001fed80, {0xf56820, 0xc000320050}, 0x410303)
cuelang.org/[email protected]/internal/core/adt/context.go:838 +0x24c fp=0xc047c81458 sp=0xc047c813a8 pc=0x6cf1cc
cuelang.org/go/internal/core/adt.(*OpContext).forSource(0xc0001fed80, {0xf56820, 0xc000320050})
cuelang.org/[email protected]/internal/core/adt/expr.go:1929 +0x3d fp=0xc047c81510 sp=0xc047c81458 pc=0x6faebd
cuelang.org/go/internal/core/adt.(*ForClause).yield(0xc0004473a0, 0xc08f5d51a0)
cuelang.org/[email protected]/internal/core/adt/expr.go:1989 +0x4b fp=0xc047c81698 sp=0xc047c81510 pc=0x6fb70b
cuelang.org/go/internal/core/adt.(*OpContext).yield(0xc0001fed80, 0xc08f5ee140, 0xc08f5e4e40, 0xc00019e7e0, 0x7fff0102, 0xc08f5c55d0)
cuelang.org/[email protected]/internal/core/adt/comprehension.go:312 +0x2e2 fp=0xc047c817e8 sp=0xc047c81698 pc=0x6c2782
cuelang.org/go/internal/core/adt.(*nodeContext).processComprehensionInner(0xc08f5eac08, 0xc08f58f380, 0x2)
cuelang.org/[email protected]/internal/core/adt/comprehension.go:437 +0xe5 fp=0xc047c81978 sp=0xc047c817e8 pc=0x6c3405
cuelang.org/go/internal/core/adt.(*nodeContext).processComprehension(0xc08f5eac08, 0xc08f58f380, 0x30?)
cuelang.org/[email protected]/internal/core/adt/comprehension.go:407 +0x1d fp=0xc047c819a8 sp=0xc047c81978 pc=0x6c321d
cuelang.org/go/internal/core/adt.(*nodeContext).injectComprehensions(0xc08f5eac08, 0x2)
cuelang.org/[email protected]/internal/core/adt/comprehension.go:352 +0x9a fp=0xc047c81a88 sp=0xc047c819a8 pc=0x6c2eba
cuelang.org/go/internal/core/adt.(*nodeContext).expandOne(0xc08f5eac08, 0x2)
cuelang.org/[email protected]/internal/core/adt/eval.go:2204 +0x90 fp=0xc047c81b48 sp=0xc047c81a88 pc=0x6eedd0
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc08f5eac08, 0x5, 0xc08f5eac08, 0x0, 0x0, 0x1)
cuelang.org/[email protected]/internal/core/adt/disjunct.go:161 +0xe7 fp=0xc047c829f0 sp=0xc047c81b48 pc=0x6d9867
cuelang.org/go/internal/core/adt.(*OpContext).unify(0xc0001fed80, 0xc08f5ee140, 0x5)
cuelang.org/[email protected]/internal/core/adt/eval.go:302 +0x5dc fp=0xc047c82cc0 sp=0xc047c829f0 pc=0x6e32dc
cuelang.org/go/internal/core/adt.(*OpContext).lookup(0xc0001fed80, 0xc08f5ddea0, {0xc00019e690?, 0xf56aa0?}, 0x641, 0x7fff0405)
cuelang.org/[email protected]/internal/core/adt/context.go:946 +0x5c5 fp=0xc047c82e40 sp=0xc047c82cc0 pc=0x6cff85
cuelang.org/go/internal/core/adt.(*SelectorExpr).resolve(0xc0004473e0, 0xc0001fed80, 0x7fff0405)
cuelang.org/[email protected]/internal/core/adt/expr.go:1022 +0x14c fp=0xc047c82e88 sp=0xc047c82e40 pc=0x6f536c
cuelang.org/go/internal/core/adt.(*OpContext).resolveState(0xc0001fed80, {0xc08f5e4dc0, {0xf4f7d8, 0xc0004473e0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...}}, ...)
cuelang.org/[email protected]/internal/core/adt/context.go:488 +0xdd fp=0xc047c82fc8 sp=0xc047c82e88 pc=0x6cc93d
cuelang.org/go/internal/core/adt.(*OpContext).Resolve(0x0?, {0xc08f5e4dc0, {0xf4f7d8, 0xc0004473e0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...}}, ...)
cuelang.org/[email protected]/internal/core/adt/context.go:482 +0x58 fp=0xc047c83038 sp=0xc047c82fc8 pc=0x6cc818
cuelang.org/go/internal/core/dep.(*visitor).markResolver(0xc000436800, 0xc08f5e4dc0, {0xf53a90, 0xc0004473e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:362 +0xfc fp=0xc047c83110 sp=0xc047c83038 pc=0x722dfc
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc08f5e4dc0, {0x7fc0ff6b6a08?, 0xc0004473e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:284 +0x379 fp=0xc047c831b8 sp=0xc047c83110 pc=0x722159
cuelang.org/go/internal/core/dep.(*visitor).markSubExpr(...)
cuelang.org/[email protected]/internal/core/dep/dep.go:572
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc08f5e4dc0, {0xf52950?, 0xc0001aa720})
cuelang.org/[email protected]/internal/core/dep/dep.go:592 +0x31e fp=0xc047c83210 sp=0xc047c831b8 pc=0x72413e
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc08f5e4d80, {0xf54748?, 0xc0000a4a20})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc047c832b8 sp=0xc047c83210 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markComprehension(0xc000436800, 0x0?, 0xc00019e700)
cuelang.org/[email protected]/internal/core/dep/dep.go:631 +0x10e fp=0xc047c83308 sp=0xc047c832b8 pc=0x72450e
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc08f5e4d80, {0xf52980?, 0xc00019e700})
cuelang.org/[email protected]/internal/core/dep/dep.go:595 +0x9d fp=0xc047c83360 sp=0xc047c83308 pc=0x723ebd
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc08f5e4d60, {0xf54748?, 0xc0000a4900})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc047c83408 sp=0xc047c83360 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markComprehension(0xc000436800, 0x0?, 0xc00019e7e0)
cuelang.org/[email protected]/internal/core/dep/dep.go:631 +0x10e fp=0xc047c83458 sp=0xc047c83408 pc=0x72450e
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc08f5e4d20, {0xf52980?, 0xc00019e7e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:595 +0x9d fp=0xc047c834b0 sp=0xc047c83458 pc=0x723ebd
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc08f5e4c20, {0xf54748?, 0xc0000a4870})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc047c83558 sp=0xc047c834b0 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markInternalResolvers.(*visitor).markConjuncts.func2({0xc08f5e4c20, {0xf4f738, 0xc0004474e0}, {0xc08f5e4c00, 0x0, 0x0, 0x0, 0x0, 0x0, {0x0, ...}}})
cuelang.org/[email protected]/internal/core/dep/dep.go:495 +0x3d fp=0xc047c83590 sp=0xc047c83558 pc=0x723a3d
cuelang.org/go/internal/core/adt.visitConjuncts({0xc08f5dfcc0?, 0x0?, 0x0?}, 0xc047c83670)
cuelang.org/[email protected]/internal/core/adt/composite.go:607 +0x102 fp=0xc047c83630 sp=0xc047c83590 pc=0x6bca22
cuelang.org/go/internal/core/adt.(*Vertex).VisitLeafConjuncts(...)
cuelang.org/[email protected]/internal/core/adt/composite.go:596
cuelang.org/go/internal/core/dep.(*visitor).markConjuncts(...)
cuelang.org/[email protected]/internal/core/dep/dep.go:492
cuelang.org/go/internal/core/dep.(*visitor).markInternalResolvers(0xc000436800, 0xc08f5e4be0, {0xf53a90, 0xc0004473e0}, 0x0?)
cuelang.org/[email protected]/internal/core/dep/dep.go:520 +0xa5 fp=0xc047c836a0 sp=0xc047c83630 pc=0x7238a5
cuelang.org/go/internal/core/dep.(*visitor).reportDependency(0xc000436800, 0xf4f7d8?, {0xf53a90?, 0xc0004473e0?}, 0xc08f5ddd60)
cuelang.org/[email protected]/internal/core/dep/dep.go:418 +0x18c fp=0xc047c837b8 sp=0xc047c836a0 pc=0x72328c
cuelang.org/go/internal/core/dep.(*visitor).markResolver(0xc000436800, 0xc08f5e4be0, {0xf53a90, 0xc0004473e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:370 +0x20d fp=0xc047c83890 sp=0xc047c837b8 pc=0x722f0d
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc08f5e4be0, {0x7fc0ff6b6a08?, 0xc0004473e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:284 +0x379 fp=0xc047c83938 sp=0xc047c83890 pc=0x722159
cuelang.org/go/internal/core/dep.(*visitor).markSubExpr(...)
cuelang.org/[email protected]/internal/core/dep/dep.go:572
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc08f5e4be0, {0xf52950?, 0xc0001aa720})
cuelang.org/[email protected]/internal/core/dep/dep.go:592 +0x31e fp=0xc047c83990 sp=0xc047c83938 pc=0x72413e
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc08f5e4ba0, {0xf54748?, 0xc0000a4a20})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc047c83a38 sp=0xc047c83990 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markComprehension(0xc000436800, 0x0?, 0xc00019e700)
cuelang.org/[email protected]/internal/core/dep/dep.go:631 +0x10e fp=0xc047c83a88 sp=0xc047c83a38 pc=0x72450e
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc08f5e4ba0, {0xf52980?, 0xc00019e700})
cuelang.org/[email protected]/internal/core/dep/dep.go:595 +0x9d fp=0xc047c83ae0 sp=0xc047c83a88 pc=0x723ebd
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc08f5e4b80, {0xf54748?, 0xc0000a4900})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc047c83b88 sp=0xc047c83ae0 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markComprehension(0xc000436800, 0x0?, 0xc00019e7e0)
cuelang.org/[email protected]/internal/core/dep/dep.go:631 +0x10e fp=0xc047c83bd8 sp=0xc047c83b88 pc=0x72450e
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc08f5e4b40, {0xf52980?, 0xc00019e7e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:595 +0x9d fp=0xc047c83c30 sp=0xc047c83bd8 pc=0x723ebd
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc08f5e4a40, {0xf54748?, 0xc0000a4870})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc047c83cd8 sp=0xc047c83c30 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markInternalResolvers.(*visitor).markConjuncts.func2({0xc08f5e4a40, {0xf4f738, 0xc0004474e0}, {0xc08f5e4a20, 0x0, 0x0, 0x0, 0x0, 0x0, {0x0, ...}}})
cuelang.org/[email protected]/internal/core/dep/dep.go:495 +0x3d fp=0xc047c83d10 sp=0xc047c83cd8 pc=0x723a3d
cuelang.org/go/internal/core/adt.visitConjuncts({0xc08f5df940?, 0x0?, 0x0?}, 0xc047c83df0)
cuelang.org/[email protected]/internal/core/adt/composite.go:607 +0x102 fp=0xc047c83db0 sp=0xc047c83d10 pc=0x6bca22
cuelang.org/go/internal/core/adt.(*Vertex).VisitLeafConjuncts(...)
cuelang.org/[email protected]/internal/core/adt/composite.go:596
cuelang.org/go/internal/core/dep.(*visitor).markConjuncts(...)
cuelang.org/[email protected]/internal/core/dep/dep.go:492
...4753346 frames elided...
cuelang.org/go/internal/core/dep.(*visitor).markComprehension(0xc000436800, 0x0?, 0xc00019e7e0)
cuelang.org/[email protected]/internal/core/dep/dep.go:631 +0x10e fp=0xc067c7e758 sp=0xc067c7e708 pc=0x72450e
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc000252080, {0xf52980?, 0xc00019e7e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:595 +0x9d fp=0xc067c7e7b0 sp=0xc067c7e758 pc=0x723ebd
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc000479f00, {0xf54748?, 0xc0000a4870})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc067c7e858 sp=0xc067c7e7b0 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markInternalResolvers.(*visitor).markConjuncts.func2({0xc000479f00, {0xf4f738, 0xc0004474e0}, {0xc000479ee0, 0x0, 0x0, 0x0, 0x0, 0x0, {0x0, ...}}})
cuelang.org/[email protected]/internal/core/dep/dep.go:495 +0x3d fp=0xc067c7e890 sp=0xc067c7e858 pc=0x723a3d
cuelang.org/go/internal/core/adt.visitConjuncts({0xc0001e1440?, 0x0?, 0x0?}, 0xc067c7e970)
cuelang.org/[email protected]/internal/core/adt/composite.go:607 +0x102 fp=0xc067c7e930 sp=0xc067c7e890 pc=0x6bca22
cuelang.org/go/internal/core/adt.(*Vertex).VisitLeafConjuncts(...)
cuelang.org/[email protected]/internal/core/adt/composite.go:596
cuelang.org/go/internal/core/dep.(*visitor).markConjuncts(...)
cuelang.org/[email protected]/internal/core/dep/dep.go:492
cuelang.org/go/internal/core/dep.(*visitor).markInternalResolvers(0xc000436800, 0xc000479ec0, {0xf53a90, 0xc0004473e0}, 0x0?)
cuelang.org/[email protected]/internal/core/dep/dep.go:520 +0xa5 fp=0xc067c7e9a0 sp=0xc067c7e930 pc=0x7238a5
cuelang.org/go/internal/core/dep.(*visitor).reportDependency(0xc000436800, 0xf4f7d8?, {0xf53a90?, 0xc0004473e0?}, 0xc0001e6e60)
cuelang.org/[email protected]/internal/core/dep/dep.go:418 +0x18c fp=0xc067c7eab8 sp=0xc067c7e9a0 pc=0x72328c
cuelang.org/go/internal/core/dep.(*visitor).markResolver(0xc000436800, 0xc000479ec0, {0xf53a90, 0xc0004473e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:370 +0x20d fp=0xc067c7eb90 sp=0xc067c7eab8 pc=0x722f0d
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc000479ec0, {0x7fc0ff6b6a08?, 0xc0004473e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:284 +0x379 fp=0xc067c7ec38 sp=0xc067c7eb90 pc=0x722159
cuelang.org/go/internal/core/dep.(*visitor).markSubExpr(...)
cuelang.org/[email protected]/internal/core/dep/dep.go:572
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc000479ec0, {0xf52950?, 0xc0001aa720})
cuelang.org/[email protected]/internal/core/dep/dep.go:592 +0x31e fp=0xc067c7ec90 sp=0xc067c7ec38 pc=0x72413e
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc000479e80, {0xf54748?, 0xc0000a4a20})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc067c7ed38 sp=0xc067c7ec90 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markComprehension(0xc000436800, 0x0?, 0xc00019e700)
cuelang.org/[email protected]/internal/core/dep/dep.go:631 +0x10e fp=0xc067c7ed88 sp=0xc067c7ed38 pc=0x72450e
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc000479e80, {0xf52980?, 0xc00019e700})
cuelang.org/[email protected]/internal/core/dep/dep.go:595 +0x9d fp=0xc067c7ede0 sp=0xc067c7ed88 pc=0x723ebd
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc000479e60, {0xf54748?, 0xc0000a4900})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc067c7ee88 sp=0xc067c7ede0 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markComprehension(0xc000436800, 0x0?, 0xc00019e7e0)
cuelang.org/[email protected]/internal/core/dep/dep.go:631 +0x10e fp=0xc067c7eed8 sp=0xc067c7ee88 pc=0x72450e
cuelang.org/go/internal/core/dep.(*visitor).markDecl(0xc000436800, 0xc000479a40, {0xf52980?, 0xc00019e7e0})
cuelang.org/[email protected]/internal/core/dep/dep.go:595 +0x9d fp=0xc067c7ef30 sp=0xc067c7eed8 pc=0x723ebd
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc000479620, {0xf54748?, 0xc0000a4870})
cuelang.org/[email protected]/internal/core/dep/dep.go:349 +0x70b fp=0xc067c7efd8 sp=0xc067c7ef30 pc=0x7224eb
cuelang.org/go/internal/core/dep.(*visitor).markInternalResolvers.(*visitor).markConjuncts.func2({0xc000479620, {0xf4f738, 0xc0004474e0}, {0xc000479600, 0x0, 0x0, 0x0, 0x0, 0x0, {0x0, ...}}})
cuelang.org/[email protected]/internal/core/dep/dep.go:495 +0x3d fp=0xc067c7f010 sp=0xc067c7efd8 pc=0x723a3d
cuelang.org/go/internal/core/adt.visitConjuncts({0xc0001e0e00?, 0x0?, 0x0?}, 0xc067c7f0f0)
cuelang.org/[email protected]/internal/core/adt/composite.go:607 +0x102 fp=0xc067c7f0b0 sp=0xc067c7f010 pc=0x6bca22
cuelang.org/go/internal/core/adt.(*Vertex).VisitLeafConjuncts(...)
cuelang.org/[email protected]/internal/core/adt/composite.go:596
cuelang.org/go/internal/core/dep.(*visitor).markConjuncts(...)
cuelang.org/[email protected]/internal/core/dep/dep.go:492
cuelang.org/go/internal/core/dep.(*visitor).markInternalResolvers(0xc000436800, 0xc000447600, {0xf53a90, 0xc0004475c0}, 0x0?)
cuelang.org/[email protected]/internal/core/dep/dep.go:520 +0xa5 fp=0xc067c7f120 sp=0xc067c7f0b0 pc=0x7238a5
cuelang.org/go/internal/core/dep.(*visitor).reportDependency(0xc000436800, 0xf4f7d8?, {0xf53a90?, 0xc0004475c0?}, 0xc0001e6500)
cuelang.org/[email protected]/internal/core/dep/dep.go:418 +0x18c fp=0xc067c7f238 sp=0xc067c7f120 pc=0x72328c
cuelang.org/go/internal/core/dep.(*visitor).markResolver(0xc000436800, 0xc000447600, {0xf53a90, 0xc0004475c0})
cuelang.org/[email protected]/internal/core/dep/dep.go:370 +0x20d fp=0xc067c7f310 sp=0xc067c7f238 pc=0x722f0d
cuelang.org/go/internal/core/dep.(*visitor).markExpr(0xc000436800, 0xc000447600, {0x7fc0ff6b6a08?, 0xc0004475c0})
cuelang.org/[email protected]/internal/core/dep/dep.go:284 +0x379 fp=0xc067c7f3b8 sp=0xc067c7f310 pc=0x722159
cuelang.org/go/internal/core/dep.(*visitor).visit.func2({0xc000447600, {0xf4f738, 0xc0004475e0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, {0x0, ...}}})
cuelang.org/[email protected]/internal/core/dep/dep.go:239 +0x3d fp=0xc067c7f3f0 sp=0xc067c7f3b8 pc=0x721cdd
cuelang.org/go/internal/core/adt.visitConjuncts({0xc000496740?, 0x10?, 0xc0005d34d8?}, 0xc067c7f4f0)
cuelang.org/[email protected]/internal/core/adt/composite.go:607 +0x102 fp=0xc067c7f490 sp=0xc067c7f3f0 pc=0x6bca22
cuelang.org/go/internal/core/adt.(*Vertex).VisitLeafConjuncts(...)
cuelang.org/[email protected]/internal/core/adt/composite.go:596
cuelang.org/go/internal/core/dep.(*visitor).visit(0x78?, 0xdb7660?, 0x1?)
cuelang.org/[email protected]/internal/core/dep/dep.go:238 +0xc5 fp=0xc067c7f518 sp=0xc067c7f490 pc=0x721c25
cuelang.org/go/internal/core/dep.(*visitor).visitReusingVisitor(0xc000436800, 0xc0005d3500?, 0x80?)
cuelang.org/[email protected]/internal/core/dep/dep.go:213 +0x94 fp=0xc067c7f540 sp=0xc067c7f518 pc=0x721b14
cuelang.org/go/internal/core/dep.Visit(0x7fc14631d5b8?, 0xc0001fed80, 0xc0001b00a0, 0xc000320cd0)
cuelang.org/[email protected]/internal/core/dep/dep.go:200 +0x145 fp=0xc067c7f5f0 sp=0xc067c7f540 pc=0x721a25
cuelang.org/go/internal/core/export.(*pivotter).markDeps(0xc0000d8780, 0xc0001b00a0, 0x30?)
cuelang.org/[email protected]/internal/core/export/self.go:159 +0x78 fp=0xc067c7f630 sp=0xc067c7f5f0 pc=0x738f78
cuelang.org/go/internal/core/export.(*pivotter).linkDependencies(0xc0000d8780, 0xc0001b00a0)
cuelang.org/[email protected]/internal/core/export/self.go:120 +0x31 fp=0xc067c7f6e0 sp=0xc067c7f630 pc=0x738cd1
cuelang.org/go/internal/core/export.(*exporter).initPivotter(0xc0000c6840, 0xc0001b00a0)
cuelang.org/[email protected]/internal/core/export/self.go:51 +0xcf fp=0xc067c7f708 sp=0xc067c7f6e0 pc=0x738aef
cuelang.org/go/internal/core/export.(*exporter).initPivot(...)
cuelang.org/[email protected]/internal/core/export/export.go:372
cuelang.org/go/internal/core/export.(*Profile).Vertex(0xc00026d3c0?, {0xf5a6f0?, 0xc00026d3c0?}, {0x0?, 0xde4d75?}, 0xc0001b00a0)
cuelang.org/[email protected]/internal/core/export/export.go:239 +0x67 fp=0xc067c7f758 sp=0xc067c7f708 pc=0x72ecc7
cuelang.org/go/cue.Value.Syntax({0xc00026d3c0?, 0xc0001b00a0?, 0x0?}, {0xc0005d3980, 0x5, 0x15503f0?})
cuelang.org/[email protected]/cue/types.go:1010 +0x247 fp=0xc067c7f828 sp=0xc067c7f758 pc=0x913fc7
cuelang.org/go/cmd/cue/cmd.runEval(0xc000278e10, {0xc000279c50, 0x1, 0x3})
cuelang.org/[email protected]/cmd/cue/cmd/eval.go:169 +0x989 fp=0xc067c7fa28 sp=0xc067c7f828 pc=0xc1af69
cuelang.org/go/cmd/cue/cmd.newEvalCmd.mkRunE.func1(0xc0001ac900?, {0xc000279c50, 0x1, 0x3})
cuelang.org/[email protected]/cmd/cue/cmd/root.go:136 +0x2cc fp=0xc067c7fc48 sp=0xc067c7fa28 pc=0xc19fac
github.com/spf13/cobra.(*Command).execute(0xc000274c08, {0xc000279bf0, 0x3, 0x3})
github.com/spf13/[email protected]/command.go:985 +0xaca fp=0xc067c7fdd0 sp=0xc067c7fc48 pc=0x5dc92a
github.com/spf13/cobra.(*Command).ExecuteC(0xc000274308)
github.com/spf13/[email protected]/command.go:1117 +0x3ff fp=0xc067c7fea8 sp=0xc067c7fdd0 pc=0x5dd1ff
github.com/spf13/cobra.(*Command).Execute(...)
github.com/spf13/[email protected]/command.go:1041
cuelang.org/go/cmd/cue/cmd.(*Command).Run(0xc000278e10, {0x154fbc0?, 0xd06180?})
cuelang.org/[email protected]/cmd/cue/cmd/root.go:401 +0x1f fp=0xc067c7fec0 sp=0xc067c7fea8 pc=0xc4279f
cuelang.org/go/cmd/cue/cmd.Main()
cuelang.org/[email protected]/cmd/cue/cmd/root.go:309 +0x95 fp=0xc067c7ff38 sp=0xc067c7fec0 pc=0xc422f5
main.main()
cuelang.org/[email protected]/cmd/cue/main.go:24 +0x13 fp=0xc067c7ff50 sp=0xc067c7ff38 pc=0xc65fd3
runtime.main()
runtime/proc.go:271 +0x29d fp=0xc067c7ffe0 sp=0xc067c7ff50 pc=0x43fd3d
runtime.goexit({})
runtime/asm_amd64.s:1695 +0x1 fp=0xc067c7ffe8 sp=0xc067c7ffe0 pc=0x473781
[...]
(this happens on the v2 parser for the nested example when specifying the output expression as well.)
Some notes from some initial exploration of this:
- pretty sure that v3 is wrong to consider this a permanent structural cycle
- v2
evalandexportshow the same behaviour - the infinite loop behaviour seems to be triggered by the output format in combination with-e. Whenever the output format is cue, and-eis in use, then you get the infinite behaviour. - I think there's a further bug: the
resultstruct should be closed, but it's not - I can unify it with structs that add fields to existing structs and there's no error. It's possible this is already fixed in v3, I just can't tell.
@cuematthew why would you say you're pretty sure this is not a structural cycle? Without cycle detection, it would clearly terminate, but that does not mean it is not a structural cycle. #makeOptionalFields clearly introduces a cyclic conjunct. The comparison to bottom checks an outer value, and thus will not catch a structural cycle. So the only way this should not be a structural cycle is if the cycle is muted by evidence of non-cyclic structure. Since the new structure is in result and since result, in turn is generated by #makeOptionalFields, the very conjunct that introduces the cycle.
In general, CUE is quite strict w.r.t. to this "struct as a function pattern" and V3 is better at enforcing it.
BTW, the CLs I uploaded to gerrit fix the hang for V3.
If this usage pattern is prevalent, which I suspect it is, we should provide some easier transform mechanism.
let T = transform x {
{...} => for k, v in x: {
(k): T(v)
}
_ => *v | _
}
overlaid: T(_base)
In the meantime, you could write something like this:
#makeOptionalFields: {
_in: {...}
for k, v in _in {
(k): {
if (v&{}) != _|_ {
#makeOptionalFields & {_in: v}
}
if (v&{}) == _|_ {
*v | _
}
}
}
}
overlaid: #makeOptionalFields & {_in: _base}
_base: {
some: "field"
yet: {
another: "field"
}
}