Closed myitcv closed 3 years ago
cue version
$ cue version cue version +7c5d28e6 linux/amd64
Yes
# Diff ! exec diff -wu main1.cue main2.cue # Succeeds exec cue eval main1.cue cmp stdout stdout.golden # Fails exec cue eval main2.cue cmp stdout stdout.golden -- main1.cue -- package main #d1: { as: [...string] #c: [ #f1 & { "as": ["go", for _, x in as {x}] }, ] } #d2: { p: *"." | string #c: [ #f2 & { from: #d1 & { as: [p] } }, ] } #c1: { #c: [...#o] _ ... } #o: #f1 | #f2 #f1: { do: "f1" as: [...string] } #f2: { do: "f2" from: #c1 } -- main2.cue -- package main #d1: { as: [...string] #c: [ #f1 & { "as": ["go"] + as }, ] } #d2: { p: *"." | string #c: [ #f2 & { from: #d1 & { as: [p] } }, ] } #c1: { #c: [...#o] _ ... } #o: #f1 | #f2 #f1: { do: "f1" as: [...string] } #f2: { do: "f2" from: #c1 } -- stdout.golden -- #d1: { as: [] #c: [{ do: "f1" as: ["go"] }] } #d2: { p: "." #c: [{ do: "f2" from: { as: ["."] #c: [{ do: "f1" as: ["go", "."] }] } }] } #c1: { _ #c: [] } #o: { do: "f1" as: [] } | { do: "f2" from: { _ #c: [] } } #f1: { do: "f1" as: [] } #f2: { do: "f2" from: { _ #c: [] } }
As you can see, there is a minimal diff between main1.cue and main2.cue:
main1.cue
main2.cue
--- main1.cue 2021-03-18 09:56:41.592765969 +0000 +++ main2.cue 2021-03-18 09:56:41.592765969 +0000 @@ -5,7 +5,7 @@ #c: [ #f1 & { - "as": ["go", for _, x in as {x}] + "as": ["go"] + as }, ] }
But semantically both are identical.
However, whilst cue eval main1.cue succeeds, cue eval main2.cue does not:
cue eval main1.cue
cue eval main2.cue
panic: runtime error: invalid memory address or nil pointer dereference panic: freeNode: nodeContext out of sync panic: freeNode: nodeContext out of sync [recovered] panic: freeNode: nodeContext out of sync [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x648fa5] goroutine 1 [running]: cuelang.org/go/cmd/cue/cmd.recoverError(0xc000573ec0) /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:221 +0x9c panic(0xb8d140, 0xd6aa40) /home/myitcv/gos/src/runtime/panic.go:972 +0x1d4 cuelang.org/go/internal/core/adt.(*Vertex).freeNode(0xc000562510, 0xc000561180) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:918 +0x132 panic(0xb8d140, 0xd6aa40) /home/myitcv/gos/src/runtime/panic.go:980 +0x4d7 cuelang.org/go/internal/core/adt.(*Vertex).freeNode(0xc000563320, 0xc000574380) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:918 +0x132 panic(0xbbf7a0, 0x117e7b0) /home/myitcv/gos/src/runtime/panic.go:980 +0x4d7 cuelang.org/go/cue/ast.(*ForClause).Pos(0x0, 0xc00058e5c0, 0x0) /home/myitcv/dev/cuelang/cue/cue/ast/ast.go:789 +0x5 cuelang.org/go/internal/core/adt.(*OpContext).pos(...) /home/myitcv/dev/cuelang/cue/internal/core/adt/context.go:233 cuelang.org/go/internal/core/adt.(*OpContext).Newf(0xc0004f7110, 0xca4754, 0x29, 0xc0004320c0, 0x2, 0x2, 0x0) /home/myitcv/dev/cuelang/cue/internal/core/adt/errors.go:260 +0xab cuelang.org/go/internal/core/adt.BinOp(0xc0004f7110, 0x9, 0xd8e578, 0xc000438ab0, 0xd8e1b8, 0xc00058e5c0, 0xc00056a7b8, 0xc0004f7110) /home/myitcv/dev/cuelang/cue/internal/core/adt/binop.go:40 +0x3f9 cuelang.org/go/internal/core/adt.equalTerminal(0xc0004f7110, 0xd8e578, 0xc000438ab0, 0xd8e1b8, 0xc00058e5c0, 0xc000200003, 0xc00005e800) /home/myitcv/dev/cuelang/cue/internal/core/adt/equality.go:143 +0x273 cuelang.org/go/internal/core/adt.equalVertex(0xc0004f7110, 0xc0005747e0, 0xd8e618, 0xc000438ab0, 0x3, 0xc000204498) /home/myitcv/dev/cuelang/cue/internal/core/adt/equality.go:99 +0x231 cuelang.org/go/internal/core/adt.Equal(0xc0004f7110, 0xd8e618, 0xc0005747e0, 0xd8e618, 0xc000574b60, 0x3, 0x0) /home/myitcv/dev/cuelang/cue/internal/core/adt/equality.go:32 +0x68 cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000574a80, 0xc00032db05, 0xc000574380, 0x2, 0xc000430101) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:376 +0x1052 cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000574380, 0xc0004f7105, 0xc000574380, 0x0, 0x100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:232 +0x4a6 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000563320, 0xc0004ea202) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*ForClause).yield(0xc0004ea270, 0xc0004f7110, 0xc0004ea390) /home/myitcv/dev/cuelang/cue/internal/core/adt/expr.go:1588 +0xd7 cuelang.org/go/internal/core/adt.(*OpContext).Yield(0xc0004f7110, 0xc00032d4f0, 0xd84c28, 0xc0004ea270, 0xc0004ea390, 0x0) /home/myitcv/dev/cuelang/cue/internal/core/adt/context.go:446 +0xea cuelang.org/go/internal/core/adt.(*nodeContext).addLists(0xc000574000, 0x0, 0x2, 0x0, 0x0) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:2028 +0x18b3 cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000574000, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:457 +0xf6 cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000574000, 0xc0004f7105, 0xc000574000, 0x0, 0x100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000563560, 0xc000563505) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*Vertex).Finalize(0xc000563560, 0xc0004f7110) /home/myitcv/dev/cuelang/cue/internal/core/adt/composite.go:441 +0x3a cuelang.org/go/internal/core/adt.BinOp(0xc0004f7110, 0x12, 0xd8e618, 0xc000563200, 0xd8e618, 0xc000562480, 0x0, 0xc000562480) /home/myitcv/dev/cuelang/cue/internal/core/adt/binop.go:204 +0xae5 cuelang.org/go/internal/core/adt.(*BinaryExpr).evaluate(0xc000438750, 0xc0004f7110, 0xc000438750, 0x7f968c452bc0) /home/myitcv/dev/cuelang/cue/internal/core/adt/expr.go:1150 +0x3dc cuelang.org/go/internal/core/adt.(*OpContext).evalState(0xc0004f7110, 0xd89938, 0xc000438750, 0x40c802, 0x0, 0x0) /home/myitcv/dev/cuelang/cue/internal/core/adt/context.go:619 +0x3a2 cuelang.org/go/internal/core/adt.(*OpContext).evaluateRec(0xc0004f7110, 0xc00032d4f0, 0xd89938, 0xc000438750, 0xc000411202, 0x0, 0x0) /home/myitcv/dev/cuelang/cue/internal/core/adt/context.go:547 +0x11a cuelang.org/go/internal/core/adt.(*nodeContext).evalExpr(0xc000561c00, 0xc00032d4f0, 0xd7ec30, 0xc0004112a0, 0xc000411d60, 0x0) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:1231 +0x246 cuelang.org/go/internal/core/adt.(*nodeContext).addExprConjunct(0xc000561c00, 0xc00032d4f0, 0xd7ec30, 0xc0004112a0, 0xc000411d60, 0x0) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:1172 +0x49d cuelang.org/go/internal/core/adt.(*nodeContext).insertConjuncts(0xc000561c00) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:391 +0xfb cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000563050, 0xc00056d805) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:255 +0x27f cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc000561500, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000561500, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000561500, 0xc00032d805, 0xc000561180, 0x0, 0xc000410101) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8 cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000561180, 0xc0004f7105, 0xc000561180, 0x0, 0xc0003b0100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:232 +0x4a6 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000562510, 0xc0003b6d05) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc000560e00, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000560e00, 0xc000560705) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000560e00, 0xc000000205, 0xc000560e00, 0x0, 0xd80100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc0005623f0, 0xc0003b7a05) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc000560700, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000560700, 0xc00032d205) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000560700, 0xc000000205, 0xc000560700, 0x0, 0xc000430100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc0005622d0, 0xc0003b8705) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc000560380, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000560380, 0xc000439605) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000560380, 0xc0004f7105, 0xc000560380, 0x0, 0xc0003b0100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000562090, 0xc0003b9305) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc0004f4700, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc0004f4700, 0xc0004f4705) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc0004f4700, 0xc000000205, 0xc0004f4700, 0x0, 0x100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000559e60, 0xc0003ba005) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc0004f4380, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc0004f4380, 0xc0004f4305) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc0004f4380, 0xc000000205, 0xc0004f4380, 0x0, 0xd80100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000558f30, 0xc0003bad05) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc0004f4000, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc0004f4000, 0x203005) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc0004f4000, 0xc0004f7105, 0xc0004f4000, 0x0, 0x100) /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8 cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000558870, 0x5) /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479 cuelang.org/go/internal/core/adt.(*Vertex).Finalize(...) /home/myitcv/dev/cuelang/cue/internal/core/adt/composite.go:441 cuelang.org/go/cue.(*Instance).Value(0xc000352690, 0x6, 0xc00038a140) /home/myitcv/dev/cuelang/cue/cue/instance.go:266 +0x65 cuelang.org/go/cmd/cue/cmd.buildInstances(0xc00038a140, 0xc000431e28, 0x1, 0x1, 0xc00028bcc0, 0xc00028bcb0, 0xd79a80) /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/common.go:553 +0x131 cuelang.org/go/cmd/cue/cmd.(*buildPlan).instances(0xc000310180, 0x0, 0x0) /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/common.go:155 +0x58 cuelang.org/go/cmd/cue/cmd.runEval(0xc00038a140, 0xc0003375a0, 0x1, 0x1, 0x0, 0x0) /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/eval.go:113 +0x399 cuelang.org/go/cmd/cue/cmd.mkRunE.func1(0xc0000c9b80, 0xc0003375a0, 0x1, 0x1, 0x0, 0x0) /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:46 +0x6c github.com/spf13/cobra.(*Command).execute(0xc0000c9b80, 0xc000337570, 0x1, 0x1, 0xc0000c9b80, 0xc000337570) /home/myitcv/gostuff/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:842 +0x472 github.com/spf13/cobra.(*Command).ExecuteC(0xc0000c9340, 0x0, 0x0, 0x0) /home/myitcv/gostuff/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:950 +0x37e github.com/spf13/cobra.(*Command).Execute(...) /home/myitcv/gostuff/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:887 cuelang.org/go/cmd/cue/cmd.(*Command).Run(0xc00038a140, 0xd87a50, 0xc000124030, 0x0, 0x0) /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:206 +0x67 cuelang.org/go/cmd/cue/cmd.mainErr(0xd87a50, 0xc000124030, 0xc00011c070, 0x2, 0x2, 0xc00005a740, 0x469cc5) /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:145 +0x8d cuelang.org/go/cmd/cue/cmd.Main(0xc00010e058) /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:127 +0x9b main.main() /home/myitcv/dev/cuelang/cue/cmd/cue/main.go:24 +0x25
No panic and the test to pass.
The panic above.
cc @verdverm
This issue has been migrated to https://github.com/cue-lang/cue/issues/843.
For more details about CUE's migration to a new home, please see https://github.com/cue-lang/cue/issues/1078.
What version of CUE are you using (
cue version
)?Does this issue reproduce with the latest release?
Yes
What did you do?
As you can see, there is a minimal diff between
main1.cue
andmain2.cue
:But semantically both are identical.
However, whilst
cue eval main1.cue
succeeds,cue eval main2.cue
does not:What did you expect to see?
No panic and the test to pass.
What did you see instead?
The panic above.
cc @verdverm