pkg/list: pick default before flattening
If a default isn't choses, it is not clear what to flatten
and the result will be unexpected when a default
is chosen later.
In general arguments to builtins should be treated
as manifested.
Fixes #268
Change-Id: I3f7b917b97689d0b0911d569c666ff00383cb46e
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/4822
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/builtin_test.go b/cue/builtin_test.go
index 9e427e4..ba92d99 100644
--- a/cue/builtin_test.go
+++ b/cue/builtin_test.go
@@ -180,6 +180,9 @@
test("list", `list.FlattenN([1, [[2, 3], []], [4]], 2)`),
`[1,2,3,4]`,
}, {
+ test("list", `list.FlattenN([[1, 2] | *[]], -1)`),
+ `[]`,
+ }, {
test("list", `list.FlattenN("foo", 1)`),
`_|_(error in call to list.FlattenN: cannot use value "foo" (type string) as list)`,
}, {
diff --git a/cue/builtins.go b/cue/builtins.go
index d94d39f..72cdecb 100644
--- a/cue/builtins.go
+++ b/cue/builtins.go
@@ -831,7 +831,7 @@
return nil, err
}
for iter.Next() {
- val := iter.Value()
+ val, _ := iter.Value().Default()
if val.Kind() == ListKind && depth != 0 {
d := depth - 1
values, err := flattenN(val, d)
diff --git a/pkg/list/list.go b/pkg/list/list.go
index a069942..be8493b 100644
--- a/pkg/list/list.go
+++ b/pkg/list/list.go
@@ -106,7 +106,7 @@
return nil, err
}
for iter.Next() {
- val := iter.Value()
+ val, _ := iter.Value().Default()
if val.Kind() == cue.ListKind && depth != 0 {
d := depth - 1
values, err := flattenN(val, d)