cue/parser: disallow declarations with __foo identifiers as per spec

Change-Id: Ia30f408ea21e07d81e3182fe2a7d9a48b3c65729
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/3788
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/parser/parser.go b/cue/parser/parser.go
index 0b1e895..bc8ecce 100644
--- a/cue/parser/parser.go
+++ b/cue/parser/parser.go
@@ -969,6 +969,12 @@
 				label, ok = x, true
 			}
 
+		case *ast.Ident:
+			label, ok = x, true
+			if strings.HasPrefix(x.Name, "__") {
+				p.errf(x.NamePos, "identifiers starting with '__' are reserved")
+			}
+
 		case ast.Label:
 			label, ok = x, true
 		}
diff --git a/cue/parser/parser_test.go b/cue/parser/parser_test.go
index d892cc9..b1cbc42 100644
--- a/cue/parser/parser_test.go
+++ b/cue/parser/parser_test.go
@@ -439,6 +439,8 @@
 			`a: 1 /* a */`},
 		{"space separator",
 			`a b c: 2`},
+		{"reserved identifiers",
+			`__foo: 3`},
 	}
 	for _, tc := range testCases {
 		t.Run(tc.desc, func(t *testing.T) {