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)