Index: src/Parser/parser.cc
===================================================================
--- src/Parser/parser.cc	(revision 7756647eaf7d18e5f8c8c4841b9279a5f4e4f8dc)
+++ src/Parser/parser.cc	(revision f0121d7b1fdcae6c3362d9920d387c2a83a180d7)
@@ -1023,9 +1023,9 @@
 static const yytype_uint16 yyrline[] =
 {
-       0,   302,   302,   306,   313,   314,   315,   319,   320,   321,
-     325,   326,   330,   331,   335,   336,   340,   344,   345,   356,
-     358,   360,   362,   367,   368,   374,   378,   380,   382,   384,
-     386,   388,   390,   392,   394,   403,   404,   410,   411,   415,
-     416,   420,   424,   426,   428,   430,   435,   436,   440,   443,
+       0,   301,   301,   305,   312,   313,   314,   318,   319,   320,
+     324,   325,   329,   330,   334,   335,   339,   343,   344,   355,
+     357,   359,   361,   366,   367,   373,   377,   379,   381,   383,
+     385,   387,   389,   391,   393,   402,   403,   409,   410,   414,
+     415,   419,   422,   424,   426,   428,   433,   435,   440,   443,
      445,   447,   452,   465,   467,   469,   471,   473,   475,   477,
      479,   481,   483,   485,   492,   493,   499,   500,   501,   502,
@@ -4977,5 +4977,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 302 "parser.yy"
+#line 301 "parser.yy"
     { typedefTable.enterScope(); }
     break;
@@ -4984,5 +4984,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 306 "parser.yy"
+#line 305 "parser.yy"
     { typedefTable.leaveScope(); }
     break;
@@ -4991,19 +4991,19 @@
 
 /* Line 1806 of yacc.c  */
+#line 312 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); }
+    break;
+
+  case 5:
+
+/* Line 1806 of yacc.c  */
 #line 313 "parser.yy"
-    { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); }
-    break;
-
-  case 5:
+    { (yyval.en) = new ExpressionNode( build_constantFloat( *(yyvsp[(1) - (1)].tok) ) ); }
+    break;
+
+  case 6:
 
 /* Line 1806 of yacc.c  */
 #line 314 "parser.yy"
-    { (yyval.en) = new ExpressionNode( build_constantFloat( *(yyvsp[(1) - (1)].tok) ) ); }
-    break;
-
-  case 6:
-
-/* Line 1806 of yacc.c  */
-#line 315 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_constantChar( *(yyvsp[(1) - (1)].tok) ) ); }
     break;
@@ -5012,5 +5012,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 340 "parser.yy"
+#line 339 "parser.yy"
     { (yyval.constant) = build_constantStr( *(yyvsp[(1) - (1)].str) ); }
     break;
@@ -5019,5 +5019,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 344 "parser.yy"
+#line 343 "parser.yy"
     { (yyval.str) = (yyvsp[(1) - (1)].tok); }
     break;
@@ -5026,5 +5026,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 346 "parser.yy"
+#line 345 "parser.yy"
     {
 			appendStr( (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].tok) );						// append 2nd juxtaposed string to 1st
@@ -5037,5 +5037,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 357 "parser.yy"
+#line 356 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); }
     break;
@@ -5044,5 +5044,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 359 "parser.yy"
+#line 358 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); }
     break;
@@ -5051,5 +5051,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 361 "parser.yy"
+#line 360 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (3)].en); }
     break;
@@ -5058,5 +5058,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 363 "parser.yy"
+#line 362 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_valexpr( (yyvsp[(2) - (3)].sn) ) ); }
     break;
@@ -5065,5 +5065,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 373 "parser.yy"
+#line 372 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Index, (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ) ); }
     break;
@@ -5072,5 +5072,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 375 "parser.yy"
+#line 374 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_func( (yyvsp[(1) - (4)].en), (yyvsp[(3) - (4)].en) ) ); }
     break;
@@ -5079,5 +5079,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 379 "parser.yy"
+#line 378 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); }
     break;
@@ -5086,5 +5086,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 381 "parser.yy"
+#line 380 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }
     break;
@@ -5093,5 +5093,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 383 "parser.yy"
+#line 382 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_constantInteger( *(yyvsp[(3) - (3)].tok) ) ) ); }
     break;
@@ -5100,5 +5100,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 385 "parser.yy"
+#line 384 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); }
     break;
@@ -5107,5 +5107,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 387 "parser.yy"
+#line 386 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }
     break;
@@ -5114,5 +5114,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 389 "parser.yy"
+#line 388 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, (yyvsp[(1) - (2)].en) ) ); }
     break;
@@ -5121,5 +5121,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 391 "parser.yy"
+#line 390 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); }
     break;
@@ -5128,5 +5128,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 393 "parser.yy"
+#line 392 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); }
     break;
@@ -5135,5 +5135,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 395 "parser.yy"
+#line 394 "parser.yy"
     {
 			Token fn;
@@ -5146,5 +5146,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 405 "parser.yy"
+#line 404 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); }
     break;
@@ -5153,5 +5153,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 410 "parser.yy"
+#line 409 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -5160,41 +5160,48 @@
 
 /* Line 1806 of yacc.c  */
-#line 416 "parser.yy"
+#line 415 "parser.yy"
     { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); }
     break;
 
-  case 41:
+  case 42:
 
 /* Line 1806 of yacc.c  */
 #line 423 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), maybeMoveBuild<Expression>( (yyvsp[(3) - (3)].en) ) ) ); }
+    break;
+
+  case 43:
+
+/* Line 1806 of yacc.c  */
+#line 425 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }
+    break;
+
+  case 44:
+
+/* Line 1806 of yacc.c  */
+#line 427 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), maybeMoveBuild<Expression>( (yyvsp[(3) - (3)].en) ) ) ); }
+    break;
+
+  case 45:
+
+/* Line 1806 of yacc.c  */
+#line 429 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }
+    break;
+
+  case 46:
+
+/* Line 1806 of yacc.c  */
+#line 434 "parser.yy"
     { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); }
     break;
 
-  case 42:
-
-/* Line 1806 of yacc.c  */
-#line 425 "parser.yy"
-    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); }
-    break;
-
-  case 43:
-
-/* Line 1806 of yacc.c  */
-#line 427 "parser.yy"
-    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); }
-    break;
-
-  case 44:
-
-/* Line 1806 of yacc.c  */
-#line 429 "parser.yy"
-    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); }
-    break;
-
-  case 45:
-
-/* Line 1806 of yacc.c  */
-#line 431 "parser.yy"
-    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); }
+  case 47:
+
+/* Line 1806 of yacc.c  */
+#line 436 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); }
     break;
 
@@ -9208,5 +9215,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 9211 "Parser/parser.cc"
+#line 9218 "Parser/parser.cc"
       default: break;
     }
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 7756647eaf7d18e5f8c8c4841b9279a5f4e4f8dc)
+++ src/Parser/parser.yy	(revision f0121d7b1fdcae6c3362d9920d387c2a83a180d7)
@@ -195,6 +195,5 @@
 
 %type<decl> field_declaration field_declaration_list field_declarator field_declaring_list
-%type<en> field field_list
-%type<tok> field_name
+%type<en> field field_list field_name
 
 %type<decl> external_function_definition function_definition function_array function_declarator function_no_ptr function_ptr
@@ -421,18 +420,19 @@
 		// ambiguity with .0 so space required after field-selection, e.g.
 		//   struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1;
-		{ $$ = new ExpressionNode( build_varref( $1 ) ); }
 	| field_name '.' field
-		{ $$ = new ExpressionNode( build_fieldSel( $3, build_varref( $1 ) ) ); }
+		{ $$ = new ExpressionNode( build_fieldSel( $1, maybeMoveBuild<Expression>( $3 ) ) ); }
 	| field_name '.' '[' push field_list pop ']'
-		{ $$ = new ExpressionNode( build_fieldSel( $5, build_varref( $1 ) ) ); }
+		{ $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $5 ) ) ); }
 	| field_name ARROW field
-		{ $$ = new ExpressionNode( build_pfieldSel( $3, build_varref( $1 ) ) ); }
+		{ $$ = new ExpressionNode( build_pfieldSel( $1, maybeMoveBuild<Expression>( $3 ) ) ); }
 	| field_name ARROW '[' push field_list pop ']'
-		{ $$ = new ExpressionNode( build_pfieldSel( $5, build_varref( $1 ) ) ); }
+		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $5 ) ) ); }
 	;
 
 field_name:
 	no_attr_identifier
+		{ $$ = new ExpressionNode( build_varref( $1 ) ); }
 	| INTEGERconstant
+		{ $$ = new ExpressionNode( build_constantInteger( *$1 ) ); }
 	;
 
