cue: fail when converting invalid UTF-8 to a CUE string

To conform to spec.

Change-Id: I6beae1f7440ea56b8cdb7706a437370a92e206ce
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/4484
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/go.go b/cue/go.go
index 468369b..4c9efde 100644
--- a/cue/go.go
+++ b/cue/go.go
@@ -22,6 +22,7 @@
 	"reflect"
 	"sort"
 	"strings"
+	"unicode/utf8"
 
 	"cuelang.org/go/cue/ast"
 	"cuelang.org/go/cue/parser"
@@ -264,6 +265,10 @@
 	case bool:
 		return &boolLit{src.base(), v}
 	case string:
+		if !utf8.ValidString(v) {
+			return ctx.mkErr(src,
+				"cannot convert result to string: invalid UTF-8")
+		}
 		return &stringLit{src.base(), v, nil}
 	case []byte:
 		return &bytesLit{src.base(), v, nil}
@@ -306,7 +311,12 @@
 			return &boolLit{src.base(), value.Bool()}
 
 		case reflect.String:
-			return &stringLit{src.base(), value.String(), nil}
+			str := value.String()
+			if !utf8.ValidString(str) {
+				return ctx.mkErr(src,
+					"cannot convert result to string: invalid UTF-8")
+			}
+			return &stringLit{src.base(), str, nil}
 
 		case reflect.Int, reflect.Int8, reflect.Int16,
 			reflect.Int32, reflect.Int64:
diff --git a/cue/go_test.go b/cue/go_test.go
index 621dfa8..bd2b1f2 100644
--- a/cue/go_test.go
+++ b/cue/go_test.go
@@ -46,6 +46,8 @@
 	}, {
 		"foo", `"foo"`,
 	}, {
+		"\x80", `_|_(cannot convert result to string: invalid UTF-8)`,
+	}, {
 		3, "3",
 	}, {
 		uint(3), "3",