cue: fix builtin type signature

Change-Id: Ifcc3ef67028eec33e3fdfab3b482770e6357f53b
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2953
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/builtin.go b/cue/builtin.go
index 58d0bcf..54367ba 100644
--- a/cue/builtin.go
+++ b/cue/builtin.go
@@ -359,7 +359,10 @@
 }
 
 func (c *callCtxt) errf(src source, underlying error, format string, args ...interface{}) {
-	a := make([]interface{}, 0, 1+len(args))
+	a := make([]interface{}, 0, 2+len(args))
+	if err, ok := underlying.(*valueError); ok {
+		a = append(a, err.err)
+	}
 	a = append(a, format)
 	a = append(a, args...)
 	err := c.ctx.mkErr(src, a...)
diff --git a/cue/builtin_test.go b/cue/builtin_test.go
index a9c467f..5c03f11 100644
--- a/cue/builtin_test.go
+++ b/cue/builtin_test.go
@@ -78,6 +78,9 @@
 		test("encoding/hex", `hex.Decode("foo")`),
 		`_|_(error in call to encoding/hex.Decode: encoding/hex: invalid byte: U+006F 'o')`,
 	}, {
+		test("encoding/hex", `hex.Dump('foo')`),
+		`"00000000  66 6f 6f                                          |foo|\n"`,
+	}, {
 		test("encoding/json", `json.Validate("{\"a\":10}", {b:string})`),
 		`true`,
 	}, {
diff --git a/cue/builtins.go b/cue/builtins.go
index 1fc722d..e312947 100644
--- a/cue/builtins.go
+++ b/cue/builtins.go
@@ -142,7 +142,7 @@
 			Const: "64",
 		}, {
 			Name:   "Sum",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -161,7 +161,7 @@
 			Const: "64",
 		}, {
 			Name:   "Sum",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -183,7 +183,7 @@
 			Const: "64",
 		}, {
 			Name:   "Sum256",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -193,7 +193,7 @@
 			},
 		}, {
 			Name:   "Sum224",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -221,7 +221,7 @@
 			Const: "128",
 		}, {
 			Name:   "Sum512",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -231,7 +231,7 @@
 			},
 		}, {
 			Name:   "Sum384",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -241,7 +241,7 @@
 			},
 		}, {
 			Name:   "Sum512_224",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -251,7 +251,7 @@
 			},
 		}, {
 			Name:   "Sum512_256",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -290,7 +290,7 @@
 			},
 		}, {
 			Name:   "Encode",
-			Params: []kind{topKind, stringKind},
+			Params: []kind{topKind, bytesKind | stringKind},
 			Result: stringKind,
 			Func: func(c *callCtxt) {
 				encoding, src := c.value(0), c.bytes(1)
@@ -304,7 +304,7 @@
 		}, {
 			Name:   "Decode",
 			Params: []kind{topKind, stringKind},
-			Result: stringKind,
+			Result: bytesKind | stringKind,
 			Func: func(c *callCtxt) {
 				encoding, s := c.value(0), c.string(1)
 				c.ret, c.err = func() (interface{}, error) {
@@ -356,7 +356,7 @@
 			},
 		}, {
 			Name:   "Decode",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: listKind,
 			Func: func(c *callCtxt) {
 				r := c.reader(0)
@@ -390,7 +390,7 @@
 		}, {
 			Name:   "Decode",
 			Params: []kind{stringKind},
-			Result: stringKind,
+			Result: bytesKind | stringKind,
 			Func: func(c *callCtxt) {
 				s := c.string(0)
 				c.ret, c.err = func() (interface{}, error) {
@@ -399,7 +399,7 @@
 			},
 		}, {
 			Name:   "Dump",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: stringKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -409,7 +409,7 @@
 			},
 		}, {
 			Name:   "Encode",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: stringKind,
 			Func: func(c *callCtxt) {
 				src := c.bytes(0)
@@ -422,7 +422,7 @@
 	"encoding/json": &builtinPkg{
 		native: []*builtin{{
 			Name:   "Valid",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: boolKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -432,7 +432,7 @@
 			},
 		}, {
 			Name:   "Compact",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: stringKind,
 			Func: func(c *callCtxt) {
 				src := c.bytes(0)
@@ -446,7 +446,7 @@
 			},
 		}, {
 			Name:   "Indent",
-			Params: []kind{stringKind, stringKind, stringKind},
+			Params: []kind{bytesKind | stringKind, stringKind, stringKind},
 			Result: stringKind,
 			Func: func(c *callCtxt) {
 				src, prefix, indent := c.bytes(0), c.string(1), c.string(2)
@@ -460,7 +460,7 @@
 			},
 		}, {
 			Name:   "HTMLEscape",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: stringKind,
 			Func: func(c *callCtxt) {
 				src := c.bytes(0)
@@ -507,7 +507,7 @@
 			},
 		}, {
 			Name:   "Unmarshal",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				b := c.bytes(0)
@@ -525,7 +525,7 @@
 			},
 		}, {
 			Name:   "Validate",
-			Params: []kind{stringKind, topKind},
+			Params: []kind{bytesKind | stringKind, topKind},
 			Result: boolKind,
 			Func: func(c *callCtxt) {
 				b, v := c.bytes(0), c.value(1)
@@ -588,7 +588,7 @@
 			},
 		}, {
 			Name:   "Unmarshal",
-			Params: []kind{stringKind},
+			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
 			Func: func(c *callCtxt) {
 				data := c.bytes(0)
@@ -598,7 +598,7 @@
 			},
 		}, {
 			Name:   "Validate",
-			Params: []kind{stringKind, topKind},
+			Params: []kind{bytesKind | stringKind, topKind},
 			Result: boolKind,
 			Func: func(c *callCtxt) {
 				b, v := c.bytes(0), c.value(1)
@@ -1978,7 +1978,7 @@
 	"strings": &builtinPkg{
 		native: []*builtin{{
 			Name:   "ByteAt",
-			Params: []kind{stringKind, intKind},
+			Params: []kind{bytesKind | stringKind, intKind},
 			Result: intKind,
 			Func: func(c *callCtxt) {
 				b, i := c.bytes(0), c.int(1)
@@ -1991,8 +1991,8 @@
 			},
 		}, {
 			Name:   "ByteSlice",
-			Params: []kind{stringKind, intKind, intKind},
-			Result: stringKind,
+			Params: []kind{bytesKind | stringKind, intKind, intKind},
+			Result: bytesKind | stringKind,
 			Func: func(c *callCtxt) {
 				b, start, end := c.bytes(0), c.int(1), c.int(2)
 				c.ret, c.err = func() (interface{}, error) {
diff --git a/cue/gen.go b/cue/gen.go
index 9d22f41..cd30512 100644
--- a/cue/gen.go
+++ b/cue/gen.go
@@ -428,7 +428,9 @@
 		cueKind += "bottomKind"
 	case "bool":
 		cueKind += "boolKind"
-	case "string", "bytes", "reader":
+	case "bytes", "reader":
+		cueKind += "bytesKind|stringKind"
+	case "string":
 		cueKind += "stringKind"
 	case "int", "int8", "int16", "int32", "rune", "int64",
 		"uint", "byte", "uint8", "uint16", "uint32", "uint64",