Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 997185e1a79d8e46351af7db167616c955086e6e)
+++ src/Parser/lex.ll	(revision 2ed94a98ea730a0f11bd4cf49b9352557ebf6cd8)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Thu Oct 13 20:46:04 2022
- * Update Count     : 764
+ * Last Modified On : Mon Jan 30 19:03:34 2023
+ * Update Count     : 767
  */
 
@@ -340,4 +340,5 @@
 vtable			{ KEYWORD_RETURN(VTABLE); }				// CFA
 waitfor			{ KEYWORD_RETURN(WAITFOR); }			// CFA
+waituntil		{ KEYWORD_RETURN(WAITUNTIL); }			// CFA
 when			{ KEYWORD_RETURN(WHEN); }				// CFA
 while			{ KEYWORD_RETURN(WHILE); }
@@ -502,5 +503,5 @@
 	SemanticErrorThrow = true;
 	cerr << (yyfilename ? yyfilename : "*unknown file*") << ':' << yylineno << ':' << column - yyleng + 1
-		 << ": " << ErrorHelpers::error_str() << errmsg << " at token \"" << (yytext[0] == '\0' ? "EOF" : yytext) << '"' << endl;
+		 << ": " << ErrorHelpers::error_str() << errmsg << " before token \"" << (yytext[0] == '\0' ? "EOF" : yytext) << '"' << endl;
 }
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 997185e1a79d8e46351af7db167616c955086e6e)
+++ src/Parser/parser.yy	(revision 2ed94a98ea730a0f11bd4cf49b9352557ebf6cd8)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Nov 21 22:34:30 2022
-// Update Count     : 5848
+// Last Modified On : Thu Feb  2 21:36:16 2023
+// Update Count     : 5865
 //
 
@@ -331,5 +331,5 @@
 %token ATTRIBUTE EXTENSION								// GCC
 %token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
-%token CHOOSE FALLTHRU FALLTHROUGH WITH WHEN WAITFOR	// CFA
+%token CHOOSE FALLTHRU FALLTHROUGH WITH WHEN WAITFOR WAITUNTIL // CFA
 %token DISABLE ENABLE TRY THROW THROWRESUME AT			// CFA
 %token ASM												// C99, extension ISO/IEC 9899:1999 Section J.5.10(1)
@@ -1645,7 +1645,7 @@
 exception_statement:
 	TRY compound_statement handler_clause 					%prec THEN
-		{ $$ = new StatementNode( build_try( $2, $3, 0 ) ); }
+		{ $$ = new StatementNode( build_try( $2, $3, nullptr ) ); }
 	| TRY compound_statement finally_clause
-		{ $$ = new StatementNode( build_try( $2, 0, $3 ) ); }
+		{ $$ = new StatementNode( build_try( $2, nullptr, $3 ) ); }
 	| TRY compound_statement handler_clause finally_clause
 		{ $$ = new StatementNode( build_try( $2, $3, $4 ) ); }
@@ -1699,5 +1699,5 @@
 asm_statement:
 	ASM asm_volatile_opt '(' string_literal ')' ';'
-		{ $$ = new StatementNode( build_asm( $2, $4, 0 ) ); }
+		{ $$ = new StatementNode( build_asm( $2, $4, nullptr ) ); }
 	| ASM asm_volatile_opt '(' string_literal ':' asm_operands_opt ')' ';' // remaining GCC
 		{ $$ = new StatementNode( build_asm( $2, $4, $6 ) ); }
@@ -1707,5 +1707,5 @@
 		{ $$ = new StatementNode( build_asm( $2, $4, $6, $8, $10 ) ); }
 	| ASM asm_volatile_opt GOTO '(' string_literal ':' ':' asm_operands_opt ':' asm_clobbers_list_opt ':' label_list ')' ';'
-		{ $$ = new StatementNode( build_asm( $2, $5, 0, $8, $10, $12 ) ); }
+		{ $$ = new StatementNode( build_asm( $2, $5, nullptr, $8, $10, $12 ) ); }
 	;
 
@@ -1880,15 +1880,15 @@
 //	'[' ']' identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' // S/R conflict
 //		{
-//			$$ = DeclarationNode::newFunction( $3, DeclarationNode::newTuple( 0 ), $6, 0, true );
+//			$$ = DeclarationNode::newFunction( $3, DeclarationNode::newTuple( 0 ), $6, nullptr, true );
 //		}
 //	'[' ']' identifier '(' push cfa_parameter_ellipsis_list_opt pop ')'
 //		{
 //			typedefTable.setNextIdentifier( *$5 );
-//			$$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, 0, true );
+//			$$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, nullptr, true );
 //		}
 //	| '[' ']' TYPEDEFname '(' push cfa_parameter_ellipsis_list_opt pop ')'
 //		{
 //			typedefTable.setNextIdentifier( *$5 );
-//			$$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, 0, true );
+//			$$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, nullptr, true );
 //		}
 //	| '[' ']' typegen_name
@@ -1902,7 +1902,7 @@
 	cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' attribute_list_opt
 		// To obtain LR(1 ), this rule must be factored out from function return type (see cfa_abstract_declarator).
-		{ $$ = DeclarationNode::newFunction( $2, $1, $5, 0 )->addQualifiers( $8 ); }
+		{ $$ = DeclarationNode::newFunction( $2, $1, $5, nullptr )->addQualifiers( $8 ); }
 	| cfa_function_return identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' attribute_list_opt
-		{ $$ = DeclarationNode::newFunction( $2, $1, $5, 0 )->addQualifiers( $8 ); }
+		{ $$ = DeclarationNode::newFunction( $2, $1, $5, nullptr )->addQualifiers( $8 ); }
 	;
 
@@ -1939,4 +1939,5 @@
 	TYPEDEF type_specifier declarator
 		{
+			// if type_specifier is an anon aggregate => name 
 			typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "4" );
 			$$ = $3->addType( $2 )->addTypedef();
@@ -1995,6 +1996,20 @@
 declaration_specifier:									// type specifier + storage class
 	basic_declaration_specifier
+	| type_declaration_specifier
 	| sue_declaration_specifier
-	| type_declaration_specifier
+	| sue_declaration_specifier invalid_types
+		{
+			SemanticError( yylloc,
+						  ::toString( "Missing ';' after end of ",
+									  $1->type->enumeration.name ? "enum" : AggregateDecl::aggrString( $1->type->aggregate.kind ),
+									  " declaration" ) );
+			$$ = nullptr;
+		}
+	;
+
+invalid_types:
+	aggregate_key
+	| basic_type_name
+	| indirect_type
 	;
 
@@ -2065,9 +2080,10 @@
 		{ $$ = DeclarationNode::newTypeQualifier( Type::Atomic ); }
 	| forall
+		{ $$ = DeclarationNode::newForall( $1 ); }
 	;
 
 forall:
 	FORALL '(' type_parameter_list ')'					// CFA
-		{ $$ = DeclarationNode::newForall( $3 ); }
+		{ $$ = $3; }
 	;
 
@@ -2473,4 +2489,6 @@
 	| EXTENSION type_specifier field_declaring_list_opt ';'	// GCC
 		{ $$ = fieldDecl( $2, $3 ); distExt( $$ ); }
+	| STATIC type_specifier field_declaring_list_opt ';' // CFA
+	   	{ SemanticError( yylloc, "STATIC aggregate field qualifier currently unimplemented." ); $$ = nullptr; }
 	| INLINE type_specifier field_abstract_list_opt ';'	// CFA
 		{
@@ -2595,7 +2613,7 @@
 enum_type_nobody:										// enum - {...}
 	ENUM attribute_list_opt identifier
-		{ typedefTable.makeTypedef( *$3 ); $$ = DeclarationNode::newEnum( $3, 0, false, false )->addQualifiers( $2 ); }
+		{ typedefTable.makeTypedef( *$3 ); $$ = DeclarationNode::newEnum( $3, nullptr, false, false )->addQualifiers( $2 ); }
 	| ENUM attribute_list_opt type_name
-		{ typedefTable.makeTypedef( *$3->type->symbolic.name );	$$ = DeclarationNode::newEnum( $3->type->symbolic.name, 0, false, false )->addQualifiers( $2 ); }
+		{ typedefTable.makeTypedef( *$3->type->symbolic.name );	$$ = DeclarationNode::newEnum( $3->type->symbolic.name, nullptr, false, false )->addQualifiers( $2 ); }
 	;
 
@@ -2938,5 +2956,5 @@
 		{
 			typedefTable.addToEnclosingScope( *$1, TYPEDEFname, "10" );
-			$$ = DeclarationNode::newTypeDecl( $1, 0 );
+			$$ = DeclarationNode::newTypeDecl( $1, nullptr );
 		}
 	| identifier_or_type_name '(' type_parameter_list ')'
@@ -2949,7 +2967,17 @@
 trait_specifier:										// CFA
 	TRAIT identifier_or_type_name '(' type_parameter_list ')' '{' '}'
-		{ $$ = DeclarationNode::newTrait( $2, $4, 0 ); }
+		{
+			SemanticWarning( yylloc, Warning::DeprecTraitSyntax, "" );
+			$$ = DeclarationNode::newTrait( $2, $4, nullptr );
+		}
+	| forall TRAIT identifier_or_type_name '{' '}'		// alternate
+		{ $$ = DeclarationNode::newTrait( $3, $1, nullptr ); }
 	| TRAIT identifier_or_type_name '(' type_parameter_list ')' '{' push trait_declaration_list pop '}'
-		{ $$ = DeclarationNode::newTrait( $2, $4, $8 ); }
+		{
+			SemanticWarning( yylloc, Warning::DeprecTraitSyntax, "" );
+			$$ = DeclarationNode::newTrait( $2, $4, $8 );
+		}
+	| forall TRAIT identifier_or_type_name '{' push trait_declaration_list pop '}' // alternate
+		{ $$ = DeclarationNode::newTrait( $3, $1, $6 ); }
 	;
 
@@ -3031,5 +3059,5 @@
 		}
 	| ASM '(' string_literal ')' ';'					// GCC, global assembler statement
-		{ $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) ); }
+		{ $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, nullptr ) ) ); }
 	| EXTERN STRINGliteral
 		{
@@ -3275,5 +3303,5 @@
 variable_ptr:
 	ptrref_operator variable_declarator
-		{ $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| ptrref_operator type_qualifier_list variable_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
@@ -3339,5 +3367,5 @@
 function_ptr:
 	ptrref_operator function_declarator
-		{ $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| ptrref_operator type_qualifier_list function_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
@@ -3391,5 +3419,5 @@
 KR_function_ptr:
 	ptrref_operator KR_function_declarator
-		{ $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| ptrref_operator type_qualifier_list KR_function_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
@@ -3447,5 +3475,5 @@
 type_ptr:
 	ptrref_operator variable_type_redeclarator
-		{ $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| ptrref_operator type_qualifier_list variable_type_redeclarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
@@ -3505,5 +3533,5 @@
 identifier_parameter_ptr:
 	ptrref_operator identifier_parameter_declarator
-		{ $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| ptrref_operator type_qualifier_list identifier_parameter_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
@@ -3562,5 +3590,5 @@
 type_parameter_ptr:
 	ptrref_operator type_parameter_redeclarator
-		{ $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| ptrref_operator type_qualifier_list type_parameter_redeclarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
@@ -3605,9 +3633,9 @@
 abstract_ptr:
 	ptrref_operator
-		{ $$ = DeclarationNode::newPointer( 0, $1 ); }
+		{ $$ = DeclarationNode::newPointer( nullptr, $1 ); }
 	| ptrref_operator type_qualifier_list
 		{ $$ = DeclarationNode::newPointer( $2, $1 ); }
 	| ptrref_operator abstract_declarator
-		{ $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| ptrref_operator type_qualifier_list abstract_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
@@ -3638,10 +3666,10 @@
 		// Only the first dimension can be empty.
 	'[' ']'
-		{ $$ = DeclarationNode::newArray( 0, 0, false ); }
+		{ $$ = DeclarationNode::newArray( nullptr, nullptr, false ); }
 	| '[' ']' multi_array_dimension
-		{ $$ = DeclarationNode::newArray( 0, 0, false )->addArray( $3 ); }
+		{ $$ = DeclarationNode::newArray( nullptr, nullptr, false )->addArray( $3 ); }
 		// Cannot use constant_expression because of tuples => semantic check
 	| '[' push assignment_expression pop ',' comma_expression ']' // CFA
-		{ $$ = DeclarationNode::newArray( $3, 0, false )->addArray( DeclarationNode::newArray( $6, 0, false ) ); }
+		{ $$ = DeclarationNode::newArray( $3, nullptr, false )->addArray( DeclarationNode::newArray( $6, nullptr, false ) ); }
 		// { SemanticError( yylloc, "New array dimension is currently unimplemented." ); $$ = nullptr; }
 	| '[' push array_type_list pop ']'					// CFA
@@ -3672,9 +3700,9 @@
 multi_array_dimension:
 	'[' push assignment_expression pop ']'
-		{ $$ = DeclarationNode::newArray( $3, 0, false ); }
+		{ $$ = DeclarationNode::newArray( $3, nullptr, false ); }
 	| '[' push '*' pop ']'								// C99
 		{ $$ = DeclarationNode::newVarArray( 0 ); }
 	| multi_array_dimension '[' push assignment_expression pop ']'
-		{ $$ = $1->addArray( DeclarationNode::newArray( $4, 0, false ) ); }
+		{ $$ = $1->addArray( DeclarationNode::newArray( $4, nullptr, false ) ); }
 	| multi_array_dimension '[' push '*' pop ']'		// C99
 		{ $$ = $1->addArray( DeclarationNode::newVarArray( 0 ) ); }
@@ -3773,10 +3801,10 @@
 array_parameter_1st_dimension:
 	'[' ']'
-		{ $$ = DeclarationNode::newArray( 0, 0, false ); }
+		{ $$ = DeclarationNode::newArray( nullptr, nullptr, false ); }
 		// multi_array_dimension handles the '[' '*' ']' case
 	| '[' push type_qualifier_list '*' pop ']'			// remaining C99
 		{ $$ = DeclarationNode::newVarArray( $3 ); }
 	| '[' push type_qualifier_list pop ']'
-		{ $$ = DeclarationNode::newArray( 0, $3, false ); }
+		{ $$ = DeclarationNode::newArray( nullptr, $3, false ); }
 		// multi_array_dimension handles the '[' assignment_expression ']' case
 	| '[' push type_qualifier_list assignment_expression pop ']'
@@ -3807,9 +3835,9 @@
 variable_abstract_ptr:
 	ptrref_operator
-		{ $$ = DeclarationNode::newPointer( 0, $1 ); }
+		{ $$ = DeclarationNode::newPointer( nullptr, $1 ); }
 	| ptrref_operator type_qualifier_list
 		{ $$ = DeclarationNode::newPointer( $2, $1 ); }
 	| ptrref_operator variable_abstract_declarator
-		{ $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| ptrref_operator type_qualifier_list variable_abstract_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
@@ -3853,13 +3881,13 @@
 		// No SUE declaration in parameter list.
 	ptrref_operator type_specifier_nobody
-		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| type_qualifier_list ptrref_operator type_specifier_nobody
 		{ $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
 	| ptrref_operator cfa_abstract_function
-		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| type_qualifier_list ptrref_operator cfa_abstract_function
 		{ $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
 	| ptrref_operator cfa_identifier_parameter_declarator_tuple
-		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple
 		{ $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
@@ -3870,9 +3898,9 @@
 		// shift/reduce conflict with new-style empty (void) function return type.
 	'[' ']' type_specifier_nobody
-		{ $$ = $3->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+		{ $$ = $3->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); }
 	| cfa_array_parameter_1st_dimension type_specifier_nobody
 		{ $$ = $2->addNewArray( $1 ); }
 	| '[' ']' multi_array_dimension type_specifier_nobody
-		{ $$ = $4->addNewArray( $3 )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+		{ $$ = $4->addNewArray( $3 )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); }
 	| cfa_array_parameter_1st_dimension multi_array_dimension type_specifier_nobody
 		{ $$ = $3->addNewArray( $2 )->addNewArray( $1 ); }
@@ -3881,9 +3909,9 @@
 
 	| '[' ']' cfa_identifier_parameter_ptr
-		{ $$ = $3->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+		{ $$ = $3->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); }
 	| cfa_array_parameter_1st_dimension cfa_identifier_parameter_ptr
 		{ $$ = $2->addNewArray( $1 ); }
 	| '[' ']' multi_array_dimension cfa_identifier_parameter_ptr
-		{ $$ = $4->addNewArray( $3 )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+		{ $$ = $4->addNewArray( $3 )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); }
 	| cfa_array_parameter_1st_dimension multi_array_dimension cfa_identifier_parameter_ptr
 		{ $$ = $3->addNewArray( $2 )->addNewArray( $1 ); }
@@ -3941,13 +3969,13 @@
 cfa_abstract_ptr:										// CFA
 	ptrref_operator type_specifier
-		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| type_qualifier_list ptrref_operator type_specifier
 		{ $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
 	| ptrref_operator cfa_abstract_function
-		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| type_qualifier_list ptrref_operator cfa_abstract_function
 		{ $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
 	| ptrref_operator cfa_abstract_declarator_tuple
-		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
+		{ $$ = $2->addNewPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
 	| type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple
 		{ $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
