Index: src/CodeGen/CodeGenerator.cpp
===================================================================
--- src/CodeGen/CodeGenerator.cpp	(revision 314c9d8852a35c6736a8f3ae5920e3ca35122ba7)
+++ src/CodeGen/CodeGenerator.cpp	(revision 55c97e469aefbe22d3510d734bda7a1d4796d089)
@@ -167,5 +167,4 @@
 	ast::Pass<CodeGenerator> subCG( acc, subOptions );
 	// Add the forall clause.
-	// TODO: These probably should be removed by now and the assert used.
 	if ( !decl->type_params.empty() ) {
 		assertf( !options.genC, "FunctionDecl forall should not reach code generation." );
@@ -174,4 +173,7 @@
 		acc << ")" << std::endl;
 	}
+	// The forall clause should be printed early as part of the preamble.
+	output << acc.str();
+	acc.str("");
 
 	acc << mangleName( decl );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 314c9d8852a35c6736a8f3ae5920e3ca35122ba7)
+++ src/Parser/parser.yy	(revision 55c97e469aefbe22d3510d734bda7a1d4796d089)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Mar 16 18:19:23 2024
-// Update Count     : 6617
+// Last Modified On : Tue Apr 23 15:39:29 2024
+// Update Count     : 6620
 //
 
@@ -493,5 +493,5 @@
 %type<decl> exception_declaration
 
-%type<decl> field_declaration_list_opt field_declaration field_declaring_list_opt field_declarator field_abstract_list_opt field_abstract
+%type<decl> field_declaration_list_opt field_declaration field_declaring_list_opt field_declaring_list field_declarator field_abstract_list_opt field_abstract
 %type<expr> field field_name_list field_name fraction_constants_opt
 
@@ -2682,6 +2682,10 @@
 	// empty
 		{ $$ = nullptr; }
-	| field_declarator
-	| field_declaring_list_opt ',' attribute_list_opt field_declarator
+	| field_declaring_list
+	;
+
+field_declaring_list:
+	field_declarator
+	| field_declaring_list ',' attribute_list_opt field_declarator
 		{ $$ = $1->set_last( $4->addQualifiers( $3 ) ); }
 	;
Index: tools/test_time.py
===================================================================
--- tools/test_time.py	(revision 55c97e469aefbe22d3510d734bda7a1d4796d089)
+++ tools/test_time.py	(revision 55c97e469aefbe22d3510d734bda7a1d4796d089)
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+"""Inspect test results for timing information.
+
+Run on a file that contains results from tests/test.py to see results.
+"""
+
+
+import argparse
+from datetime import timedelta
+import re
+import statistics
+
+
+def parse_args(args=None):
+    parser = argparse.ArgumentParser(
+        description='Summarize performance results from a test run.')
+    parser.add_argument('result_file', type=argparse.FileType('r'))
+    return parser.parse_args(args)
+
+
+def str_to_time(time_str):
+    match = re.search('([0-9]+):([0-9]+)[.]([0-9]+)', time_str)
+    if not match:
+        raise Exception('Badly formatted')
+    minutes, seconds, milli = (int(x) for x in match.groups())
+    return timedelta(minutes=minutes, seconds=seconds, milliseconds=milli)
+
+
+def line_to_entry(line):
+    match = re.search('([^\t ]+) +PASSED +C( n/a|.*) - R( n/a|.*)', line)
+    if not match:
+        return None
+    test_id, compile_str, run_str = match.groups()
+    compile_time = None if ' n/a' == compile_str else str_to_time(compile_str)
+    run_time = None if ' n/a' == run_str else str_to_time(run_str)
+    return test_id, compile_time, run_time
+
+
+def iter_file_entries(open_file):
+    with open_file as file:
+        for line in file.readlines():
+            entry = line_to_entry(line)
+            if entry is not None:
+                yield entry
+
+
+def entry_to_compile_seconds(entry):
+    _id, compile_time, _run_time = entry
+    return compile_time.total_seconds()
+
+
+if '__main__' == __name__:
+    args = parse_args()
+    mean = statistics.geometric_mean(
+        map(entry_to_compile_seconds, iter_file_entries(args.result_file)))
+    print('Source File:', args.result_file.name)
+    print('Geometric Mean:', mean)
