%type <node> interfacedcl_list_r interfacedcl
%type <node> structdcl_list_r structdcl
%type <node> fnres Afnres Bfnres fnliteral xfndcl fndcl fnbody
-%type <node> keyexpr_list keyval_list_r keyval
+%type <node> keyexpr_list braced_keyexpr_list keyval_list_r keyval
%type <type> typedclname new_type
%type <type> type Atype Btype
$$ = nod(OCONV, $3, N);
$$->type = oldtype($1);
}
-| convtype '{' keyexpr_list '}'
+| convtype '{' braced_keyexpr_list '}'
{
// composite literal
$$ = rev($3);
{
$$ = rev($1);
}
-| oexpr_list
+| expr_list
+
+/*
+ * have to spell this out using _r lists to avoid yacc conflict
+ */
+braced_keyexpr_list:
+ {
+ $$ = N;
+ }
+| keyval_list_r
+ {
+ $$ = rev($1);
+ }
+| keyval_list_r ','
+ {
+ $$ = rev($1);
+ }
+| expr_list_r
+ {
+ $$ = rev($1);
+ }
+| expr_list_r ','
+ {
+ $$ = rev($1);
+ }
+
/*
* the one compromise of a
--- /dev/null
+// $G $F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+var a = []int { 1, 2, }
+var b = [5]int { }
+var c = []int { 1 }
+
+func main() {
+ if len(a) != 2 { panicln("len a", len(a)) }
+ if len(b) != 5 { panicln("len b", len(b)) }
+ if len(c) != 1 { panicln("len a", len(a)) }
+}