Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 7a29392fc396810355d175074dc01b0ac892be94)
+++ src/Parser/parser.yy	(revision 7e13b11d45b7d7c4335e8c883c9737a3ef39079d)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar  4 08:44:25 2024
-// Update Count     : 6562
+// Last Modified On : Wed Mar  6 10:51:55 2024
+// Update Count     : 6588
 //
 
@@ -938,7 +938,15 @@
 	| ALIGNOF '(' type_no_function ')'					// GCC, type alignment
 		{ $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
+
+		// Cannot use rule "type", which includes cfa_abstract_function, for sizeof/alignof, because of S/R problems on
+		// look ahead, so the cfa_abstract_function is factored out.
+	| SIZEOF '(' cfa_abstract_function ')'
+		{ $$ = new ExpressionNode( new ast::SizeofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
+	| ALIGNOF '(' cfa_abstract_function ')'				// GCC, type alignment
+		{ $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
+
 	| OFFSETOF '(' type_no_function ',' identifier ')'
 		{ $$ = new ExpressionNode( build_offsetOf( yylloc, $3, build_varref( yylloc, $5 ) ) ); }
-	| TYPEID '(' type_no_function ')'
+	| TYPEID '(' type ')'
 		{
 			SemanticError( yylloc, "typeid name is currently unimplemented." ); $$ = nullptr;
@@ -1238,5 +1246,6 @@
 		{ assert( $1 ); $1->set_last( $2 ); $$ = $1; }
 	| statement_list_nodecl error						// invalid syntax rule
-		{ SemanticError( yylloc, "syntax error, declarations only allowed at the start of the switch body, i.e., after the '{'." ); $$ = nullptr; }
+		{ SemanticError( yylloc, "syntax error, declarations only allowed at the start of the switch body,"
+						 " i.e., after the '{'." ); $$ = nullptr; }
 	;
 
@@ -1246,9 +1255,27 @@
 	;
 
-// if, switch, and choose require parenthesis around the conditional because it can be followed by a statement.
-// For example, without parenthesis:
-//
-//    if x + y + z; => "if ( x + y ) + z" or "if ( x ) + y + z"
-//    switch ( S ) { ... } => switch ( S ) { compound literal... } ... or 
+// "if", "switch", and "choose" require parenthesis around the conditional. See the following ambiguities without
+// parenthesis:
+//
+//   if x + y + z; => "if ( x + y ) + z" or "if ( x ) + y + z"
+//
+//   switch O { }
+// 
+//     O{} => object-constructor for conditional, switch body ???
+//     O{} => O for conditional followed by switch body
+// 
+//     C++ has this problem, as it has the same constructor syntax.
+// 
+//   switch sizeof ( T ) { }
+// 
+//     sizeof ( T ) => sizeof of T for conditional followed by switch body
+//     sizeof ( T ) => sizeof of compound literal (T){ }, closing parenthesis ???
+// 
+//     Note the two grammar rules for sizeof (alignof)
+// 
+//       | SIZEOF unary_expression
+//       | SIZEOF '(' type_no_function ')'
+// 
+//     where the first DOES NOT require parenthesis! And C++ inherits this problem from C.
 
 selection_statement:
@@ -2200,4 +2227,9 @@
 	| ATOMIC
 		{ $$ = DeclarationNode::newTypeQualifier( ast::CV::Atomic ); }
+
+		// forall must be a CV qualifier because it can appear in places where SC qualifiers are disallowed.
+		//
+		//   void foo( forall( T ) T (*)( T ) ); // forward declaration
+		//   void bar( static int ); // static disallowed (gcc/CFA)
 	| forall
 		{ $$ = DeclarationNode::newForall( $1 ); }
@@ -2464,4 +2496,6 @@
 	;
 
+// ************************** AGGREGATE *******************************
+
 aggregate_type:											// struct, union
 	aggregate_key attribute_list_opt
@@ -2544,5 +2578,4 @@
 	| EXCEPTION											// CFA
 		{ $$ = ast::AggregateDecl::Exception; }
-	  //		{ SemanticError( yylloc, "exception aggregate is currently unimplemented." ); $$ = ast::AggregateDecl::NoAggregate; }
 	;
 
@@ -2683,7 +2716,5 @@
 	;
 
-// ***********
-// Enumeration
-// ***********
+// ************************** ENUMERATION *******************************
 
 enum_type:
@@ -2785,7 +2816,5 @@
 	;
 
-// *******************
-// Function parameters
-// *******************
+// ************************** FUNCTION PARAMETERS *******************************
 
 parameter_list_ellipsis_opt:
@@ -2868,5 +2897,5 @@
 	| type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initializer_opt
 		{ $$ = $2->addName( $3 )->addQualifiers( $1 ); }
-	| cfa_function_specifier
+	| cfa_function_specifier							// int f( "int fp()" );
 	;
 
@@ -2878,5 +2907,5 @@
 	| type_qualifier_list cfa_abstract_tuple
 		{ $$ = $2->addQualifiers( $1 ); }
-	| cfa_abstract_function
+	| cfa_abstract_function								// int f( "int ()" );
 	;
 
@@ -3036,7 +3065,7 @@
 		{ $$ = ast::TypeDecl::Dtype; }
 	| '*'
-		{ $$ = ast::TypeDecl::DStype; }						// dtype + sized
-	// | '(' '*' ')'
-	// 	{ $$ = ast::TypeDecl::Ftype; }
+		{ $$ = ast::TypeDecl::DStype; }					// Dtype + sized
+	// | '(' '*' ')'									// Gregor made me do it
+	//  	{ $$ = ast::TypeDecl::Ftype; }
 	| ELLIPSIS
 		{ $$ = ast::TypeDecl::Ttype; }
@@ -3244,5 +3273,5 @@
 			$$ = $6;
 		}
-	// global distribution
+		// global distribution
 	| type_qualifier_list
 		{
@@ -3369,4 +3398,6 @@
 	;
 
+// **************************** ASM *****************************
+
 asm_name_opt:											// GCC
 	// empty
@@ -3379,4 +3410,6 @@
 		}
 	;
+
+// **************************** ATTRIBUTE *****************************
 
 attribute_list_opt:										// GCC
@@ -3826,5 +3859,5 @@
 
 type_parameter_function:
-	typedef_name '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	typedef_name '(' parameter_list_ellipsis_opt ')'	// empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $1->addParamList( $3 ); }
 	| '(' type_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
@@ -3876,5 +3909,5 @@
 
 abstract_function:
-	'(' parameter_list_ellipsis_opt ')'			// empty parameter list OBSOLESCENT (see 3)
+	'(' parameter_list_ellipsis_opt ')'					// empty parameter list OBSOLESCENT (see 3)
 		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
 	| '(' abstract_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
@@ -4008,5 +4041,5 @@
 
 abstract_parameter_function:
-	'(' parameter_list_ellipsis_opt ')'			// empty parameter list OBSOLESCENT (see 3)
+	'(' parameter_list_ellipsis_opt ')'					// empty parameter list OBSOLESCENT (see 3)
 		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
 	| '(' abstract_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
@@ -4280,4 +4313,4 @@
 // mode: c++ //
 // tab-width: 4 //
-// compile-command: "make install" //
+// compile-command: "bison -Wcounterexamples parser.yy" //
 // End: //
Index: tests/.expect/functions.x64.txt
===================================================================
--- tests/.expect/functions.x64.txt	(revision 7a29392fc396810355d175074dc01b0ac892be94)
+++ tests/.expect/functions.x64.txt	(revision 7e13b11d45b7d7c4335e8c883c9737a3ef39079d)
@@ -94,13 +94,31 @@
     __attribute__ ((unused)) const signed int _X11_retval_fO5Ki_1;
 }
+void _X1fFv___1(void);
+void _X1fFv___1(void);
 signed int _X1fFi___1(void);
-signed int _X1fFi_i__1(signed int __anonymous_object4);
+void _X1fFv_i__1(signed int __anonymous_object4);
+void _X1fFv_i__1(signed int __anonymous_object5);
+signed int _X1fFi_i__1(signed int __anonymous_object6);
+void _X1fFv___1(void){
+}
+void _X2fvFv___1(void){
+}
 signed int _X1fFi___1(void){
     __attribute__ ((unused)) signed int _X9_retval_fi_1;
 }
-signed int _X1fFi_i__1(__attribute__ ((unused)) signed int __anonymous_object5){
+void _X1fFv_i__1(__attribute__ ((unused)) signed int __anonymous_object7){
+}
+void _X2fvFv_i__1(__attribute__ ((unused)) signed int __anonymous_object8){
+}
+signed int _X1fFi_i__1(__attribute__ ((unused)) signed int __anonymous_object9){
     __attribute__ ((unused)) signed int _X9_retval_fi_1;
 }
 signed int _X1fFi___1(void);
+void _X1fFv_i__1(signed int _X1xi_1);
+void _X2fvFv_i__1(signed int _X1xi_1);
+void _X2f2Fv_i__1(signed int _X1xi_1){
+}
+void _X3fv1Fv_i__1(signed int _X1xi_1){
+}
 struct _tuple2_ {
 };
@@ -127,9 +145,15 @@
 };
 struct _conc__tuple2_0 _X1fFT2ii___1(void);
-struct _conc__tuple2_0 _X1fFT2ii_ii__1(signed int __anonymous_object6, signed int _X1xi_1);
+void _X1fFv_ii__1(signed int __anonymous_object10, signed int _X1xi_1);
+void _X2fvFv_ii__1(signed int __anonymous_object11, signed int _X1xi_1);
+struct _conc__tuple2_0 _X1fFT2ii_ii__1(signed int __anonymous_object12, signed int _X1xi_1);
 struct _conc__tuple2_0 _X1fFT2ii___1(void){
     __attribute__ ((unused)) struct _conc__tuple2_0 _X9_retval_fT2ii_1 = {  };
 }
-struct _conc__tuple2_0 _X1fFT2ii_ii__1(__attribute__ ((unused)) signed int __anonymous_object7, signed int _X1xi_1){
+void _X1fFv_ii__1(__attribute__ ((unused)) signed int __anonymous_object13, signed int _X1xi_1){
+}
+void _X2fvFv_ii__1(__attribute__ ((unused)) signed int __anonymous_object14, signed int _X1xi_1){
+}
+struct _conc__tuple2_0 _X1fFT2ii_ii__1(__attribute__ ((unused)) signed int __anonymous_object15, signed int _X1xi_1){
     __attribute__ ((unused)) struct _conc__tuple2_0 _X9_retval_fT2ii_1 = {  };
 }
@@ -165,9 +189,15 @@
 };
 struct _conc__tuple3_1 _X1fFT3iii___1(void);
-struct _conc__tuple3_1 _X1fFT3iii_iii__1(signed int __anonymous_object8, signed int _X1xi_1, signed int __anonymous_object9);
+void _X1fFv_iii__1(signed int __anonymous_object16, signed int _X1xi_1, signed int __anonymous_object17);
+void _X2fvFv_iii__1(signed int __anonymous_object18, signed int _X1xi_1, signed int __anonymous_object19);
+struct _conc__tuple3_1 _X1fFT3iii_iii__1(signed int __anonymous_object20, signed int _X1xi_1, signed int __anonymous_object21);
 struct _conc__tuple3_1 _X1fFT3iii___1(void){
     __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
 }
-struct _conc__tuple3_1 _X1fFT3iii_iii__1(__attribute__ ((unused)) signed int __anonymous_object10, signed int _X1xi_1, __attribute__ ((unused)) signed int __anonymous_object11){
+void _X1fFv_iii__1(__attribute__ ((unused)) signed int __anonymous_object22, signed int _X1xi_1, __attribute__ ((unused)) signed int __anonymous_object23){
+}
+void _X2fvFv_iii__1(__attribute__ ((unused)) signed int __anonymous_object24, signed int _X1xi_1, __attribute__ ((unused)) signed int __anonymous_object25){
+}
+struct _conc__tuple3_1 _X1fFT3iii_iii__1(__attribute__ ((unused)) signed int __anonymous_object26, signed int _X1xi_1, __attribute__ ((unused)) signed int __anonymous_object27){
     __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
 }
@@ -179,19 +209,25 @@
 };
 struct _conc__tuple3_2 _X1fFT3iiPi___1(void);
-struct _conc__tuple3_2 _X1fFT3iiPi_iiPi__1(signed int __anonymous_object12, signed int _X1xi_1, signed int *_X1yPi_1);
+void _X1fFv_iiPi__1(signed int __anonymous_object28, signed int _X1xi_1, signed int *_X1yPi_1);
+void _X2fvFv_iiPi__1(signed int __anonymous_object29, signed int _X1xi_1, signed int *_X1yPi_1);
+struct _conc__tuple3_2 _X1fFT3iiPi_iiPi__1(signed int __anonymous_object30, signed int _X1xi_1, signed int *_X1yPi_1);
 struct _conc__tuple3_2 _X1fFT3iiPi___1(void){
     __attribute__ ((unused)) struct _conc__tuple3_2 _X9_retval_fT3iiPi_1 = {  };
 }
-struct _conc__tuple3_2 _X1fFT3iiPi_iiPi__1(__attribute__ ((unused)) signed int __anonymous_object13, signed int _X1xi_1, signed int *_X1yPi_1){
+void _X1fFv_iiPi__1(__attribute__ ((unused)) signed int __anonymous_object31, signed int _X1xi_1, signed int *_X1yPi_1){
+}
+void _X2fvFv_iiPi__1(__attribute__ ((unused)) signed int __anonymous_object32, signed int _X1xi_1, signed int *_X1yPi_1){
+}
+struct _conc__tuple3_2 _X1fFT3iiPi_iiPi__1(__attribute__ ((unused)) signed int __anonymous_object33, signed int _X1xi_1, signed int *_X1yPi_1){
     __attribute__ ((unused)) struct _conc__tuple3_2 _X9_retval_fT3iiPi_1 = {  };
 }
-signed int _X3f11Fi_i__1(signed int __anonymous_object14);
+signed int _X3f11Fi_i__1(signed int __anonymous_object34);
 signed int _X3f12Fi___1(void);
 const double _X4bar1Fd___1();
-const double _X4bar2Fd_i__1(signed int __anonymous_object15);
-const double _X4bar3Fd_d__1(double __anonymous_object16);
+const double _X4bar2Fd_i__1(signed int __anonymous_object35);
+const double _X4bar3Fd_d__1(double __anonymous_object36);
 const double _X3fooFd___1(void);
-const double _X3fooFd_i__1(signed int __anonymous_object17);
-const double _X3fooFd_d__1(__attribute__ ((unused)) double __anonymous_object18){
+const double _X3fooFd_i__1(signed int __anonymous_object37);
+const double _X3fooFd_d__1(__attribute__ ((unused)) double __anonymous_object38){
     __attribute__ ((unused)) const double _X11_retval_fooKd_1;
     {
@@ -245,8 +281,8 @@
 
 }
-struct S _X3rtnFS1S_i__1(__attribute__ ((unused)) signed int __anonymous_object19){
+struct S _X3rtnFS1S_i__1(__attribute__ ((unused)) signed int __anonymous_object39){
     __attribute__ ((unused)) struct S _X11_retval_rtnS1S_1;
 }
-signed int _X1fFi_Fi_ii_Fi_i___1(__attribute__ ((unused)) signed int (*__anonymous_object20)(signed int __param_0, signed int __param_1), __attribute__ ((unused)) signed int (*__anonymous_object21)(signed int __param_0)){
+signed int _X1fFi_Fi_ii_Fi_i___1(__attribute__ ((unused)) signed int (*__anonymous_object40)(signed int __param_0, signed int __param_1), __attribute__ ((unused)) signed int (*__anonymous_object41)(signed int __param_0)){
     __attribute__ ((unused)) signed int _X9_retval_fi_1;
     signed int (*(*_X2pcPA0A0PA0A0i_2)[][((unsigned long int )10)])[][((unsigned long int )3)];
@@ -274,6 +310,6 @@
     __attribute__ ((unused)) const struct _conc__tuple2_3 _X10_retval_f5KT2PiKi_1;
 }
-signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object22)(), signed int *(*__anonymous_object23)(), signed int **(*__anonymous_object24)(), signed int *const *(*__anonymous_object25)(), signed int *const *const (*__anonymous_object26)(), signed int *__anonymous_object27, signed int __anonymous_object28[10], signed int **__anonymous_object29, signed int *__anonymous_object30[10], signed int ***__anonymous_object31, signed int **__anonymous_object32[10], signed int *const **__anonymous_object33, signed int *const *__anonymous_object34[10], signed int *const *const *__anonymous_object35, signed int *const *const __anonymous_object36[10]);
-signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object37)(), __attribute__ ((unused)) signed int *(*__anonymous_object38)(), __attribute__ ((unused)) signed int **(*__anonymous_object39)(), __attribute__ ((unused)) signed int *const *(*__anonymous_object40)(), __attribute__ ((unused)) signed int *const *const (*__anonymous_object41)(), __attribute__ ((unused)) signed int *__anonymous_object42, __attribute__ ((unused)) signed int __anonymous_object43[10], __attribute__ ((unused)) signed int **__anonymous_object44, __attribute__ ((unused)) signed int *__anonymous_object45[10], __attribute__ ((unused)) signed int ***__anonymous_object46, __attribute__ ((unused)) signed int **__anonymous_object47[10], __attribute__ ((unused)) signed int *const **__anonymous_object48, __attribute__ ((unused)) signed int *const *__anonymous_object49[10], __attribute__ ((unused)) signed int *const *const *__anonymous_object50, __attribute__ ((unused)) signed int *const *const __anonymous_object51[10]){
+signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(), signed int *(*__anonymous_object43)(), signed int **(*__anonymous_object44)(), signed int *const *(*__anonymous_object45)(), signed int *const *const (*__anonymous_object46)(), signed int *__anonymous_object47, signed int __anonymous_object48[10], signed int **__anonymous_object49, signed int *__anonymous_object50[10], signed int ***__anonymous_object51, signed int **__anonymous_object52[10], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[10], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[10]);
+signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(), __attribute__ ((unused)) signed int *(*__anonymous_object58)(), __attribute__ ((unused)) signed int **(*__anonymous_object59)(), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[10], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[10], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[10], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[10], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[10]){
     __attribute__ ((unused)) signed int _X9_retval_fi_1;
 }
