Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision be8bd880ca4d469ed4e8157a072e60913e31ae6c)
+++ src/Parser/parser.yy	(revision c857ad307ff7de3ac8913f49a5c55b604f4a9d72)
@@ -410,7 +410,11 @@
 		{ $$ = new ExpressionNode( build_fieldSel( $1, build_field_name_REALFRACTIONconstant( *$2 ) ) ); }
 	| postfix_expression ARROW no_attr_identifier
-		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); }
+		{
+			$$ = new ExpressionNode( build_pfieldSel( $1, *$3 == "0" || *$3 == "1" ? build_constantInteger( *$3 ) : build_varref( $3 ) ) );
+		}
 	| postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector
 			{ $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $5 ) ) ); }
+	| postfix_expression ARROW INTEGERconstant			// CFA, tuple index
+		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_constantInteger( *$3 ) ) ); }
 	| postfix_expression ICR
 	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); }
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision be8bd880ca4d469ed4e8157a072e60913e31ae6c)
+++ src/SymTab/Autogen.cc	(revision c857ad307ff7de3ac8913f49a5c55b604f4a9d72)
@@ -151,5 +151,5 @@
 	bool hasDynamicLayout( AggrDecl * aggregateDecl ) {
 		for ( TypeDecl * param : aggregateDecl->get_parameters() ) {
-			if ( param->get_kind() == TypeDecl::Any ) return true;
+			if ( param->isComplete() ) return true;
 		}
 		return false;
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision be8bd880ca4d469ed4e8157a072e60913e31ae6c)
+++ src/SymTab/Validate.cc	(revision c857ad307ff7de3ac8913f49a5c55b604f4a9d72)
@@ -224,7 +224,7 @@
 		HoistStruct::hoistStruct( translationUnit );
 		ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
+		acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
 		autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecayPass
 		acceptAll( translationUnit, epc );
-		acceptAll( translationUnit, lrt );
 		ReturnChecker::checkFunctionReturns( translationUnit );
 		compoundliteral.mutateDeclarationList( translationUnit );
@@ -838,6 +838,6 @@
 		assertf( retVals.size() == 0 || retVals.size() == 1, "Function %s has too many return values: %d", functionDecl->get_name().c_str(), retVals.size() );
 		if ( retVals.size() == 1 ) {
-			// ensure all function return values have a name - use the name of the function to disambiguate (this also provides a nice bit of help for debugging)
-			// ensure other return values have a name
+			// ensure all function return values have a name - use the name of the function to disambiguate (this also provides a nice bit of help for debugging).
+			// ensure other return values have a name.
 			DeclarationWithType * ret = retVals.front();
 			if ( ret->get_name() == "" ) {
Index: src/SynTree/TypeDecl.cc
===================================================================
--- src/SynTree/TypeDecl.cc	(revision be8bd880ca4d469ed4e8157a072e60913e31ae6c)
+++ src/SynTree/TypeDecl.cc	(revision c857ad307ff7de3ac8913f49a5c55b604f4a9d72)
@@ -25,6 +25,6 @@
 
 std::string TypeDecl::typeString() const {
-	static const char *kindNames[] = { "type", "incomplete type", "function type", "tuple type" };
-	return kindNames[ kind ];
+	static const std::string kindNames[] = { "type", "incomplete type", "function type", "tuple type" };
+	return (kind != Any && isComplete() ? "sized " : "") + kindNames[ kind ];
 }
 
