cue/parser: allow ... anywhere in struct

This fixes a current deviation from the spec.

Change-Id: I1c070cf969c5023573a7f5778665beb42c21c4cb
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/7221
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/parser/parser.go b/cue/parser/parser.go
index 2e24158..92143f1 100644
--- a/cue/parser/parser.go
+++ b/cue/parser/parser.go
@@ -709,12 +709,19 @@
 	p.openList()
 	defer p.closeList()
 
-	for p.tok != token.RBRACE && p.tok != token.ELLIPSIS && p.tok != token.EOF {
+	for p.tok != token.RBRACE && p.tok != token.EOF {
 		switch p.tok {
 		case token.ATTRIBUTE:
 			list = append(list, p.parseAttribute())
 			p.consumeDeclComma()
 
+		case token.ELLIPSIS:
+			c := p.openComments()
+			ellipsis := &ast.Ellipsis{Ellipsis: p.pos}
+			p.next()
+			c.closeNode(p, ellipsis)
+			list = append(list, ellipsis)
+
 		default:
 			list = append(list, p.parseField())
 		}
@@ -732,13 +739,6 @@
 		}
 	}
 
-	if p.tok == token.ELLIPSIS {
-		c := p.openComments()
-		ellipsis := &ast.Ellipsis{Ellipsis: p.pos}
-		p.next()
-		c.closeNode(p, ellipsis)
-		list = append(list, ellipsis)
-	}
 	return
 }
 
diff --git a/cue/parser/parser_test.go b/cue/parser/parser_test.go
index 6ec737d..15b1646 100644
--- a/cue/parser/parser_test.go
+++ b/cue/parser/parser_test.go
@@ -118,22 +118,27 @@
 		`{V1, V2}`,
 	}, {
 		"expression embedding",
-		`Def :: {
+		`#Def: {
 			a.b.c
 			a > b < c
 			-1<2
 
 			foo: 2
 		}`,
-		`Def :: {a.b.c, a>b<c, -1<2, foo: 2}`,
+		`#Def: {a.b.c, a>b<c, -1<2, foo: 2}`,
 	}, {
 		"ellipsis in structs",
-		`Def :: {
+		`#Def: {
 			b: "2"
 			...
 		}
+
+		#Def2: {
+			...
+			b: "2"
+		}
 		`,
-		`Def :: {b: "2", ...}`,
+		`#Def: {b: "2", ...}, #Def2: {..., b: "2"}`,
 	}, {
 		"emitted referencing non-emitted",
 		`a: 1