Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision ef05cf0302e9d1379cbd37d9453c404cb7a437b8)
+++ src/Parser/parser.yy	(revision 99fc978cd06e20f96f5203f5c8ff82d67bbcb037)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Apr 18 15:23:42 2025
-// Update Count     : 7283
+// Last Modified On : Wed May 21 11:25:13 2025
+// Update Count     : 7295
 //
 
@@ -777,15 +777,9 @@
 postfix_expression:
 	primary_expression
-	| postfix_expression '[' assignment_expression ',' tuple_expression_list ']'
+	| postfix_expression '[' tuple_expression_list ']' // CFA
 		// Historic, transitional: Disallow commas in subscripts.
 		// Switching to this behaviour may help check if a C compatibilty case uses comma-exprs in subscripts.
 		// Current: Commas in subscripts make tuples.
-		{ $$ = new ExpressionNode( build_binary_val( yylloc, OperKinds::Index, $1, new ExpressionNode( build_tuple( yylloc, $3->set_last( $5 ) ) ) ) ); }
-	| postfix_expression '[' assignment_expression ']'
-		// CFA, comma_expression disallowed in this context because it results in a common user error: subscripting a
-		// matrix with x[i,j] instead of x[i][j]. While this change is not backwards compatible, there seems to be
-		// little advantage to this feature and many disadvantages. It is possible to write x[(i,j)] in CFA, which is
-		// equivalent to the old x[i,j].
-		{ $$ = new ExpressionNode( build_binary_val( yylloc, OperKinds::Index, $1, $3 ) ); }
+		{ $$ = new ExpressionNode( build_binary_val( yylloc, OperKinds::Index, $1, new ExpressionNode( build_tuple( yylloc, $3 ) ) ) ); }
 	| constant '[' assignment_expression ']'			// 3[a], 'a'[a], 3.5[a]
 		{ $$ = new ExpressionNode( build_binary_val( yylloc, OperKinds::Index, $1, $3 ) ); }
@@ -3132,8 +3126,8 @@
 	  type_initializer_opt assertion_list_opt
 		{ $$ = DeclarationNode::newTypeParam( $2, $1 )->addTypeInitializer( $4 )->addAssertions( $5 ); }
-	| '[' identifier_or_type_name ']'
+	| '[' identifier_or_type_name ']' assertion_list_opt
 		{
 			typedefTable.addToScope( *$2, TYPEDIMname, "type_parameter 3" );
-			$$ = DeclarationNode::newTypeParam( ast::TypeDecl::Dimension, $2 );
+			$$ = DeclarationNode::newTypeParam( ast::TypeDecl::Dimension, $2 )->addAssertions( $4 );
 		}
 	// | type_specifier identifier_parameter_declarator
@@ -4035,7 +4029,10 @@
 		{ $$ = DeclarationNode::newArray( nullptr, nullptr, false )->addArray( $3 ); }
 		// Cannot use constant_expression because of tuples => semantic check
+	| '[' assignment_expression ',' ']'					// CFA
+		{ SemanticError( yylloc, "New array dimension is currently unimplemented." ); $$ = nullptr; }
+		// { $$ = DeclarationNode::newArray( $2, nullptr, false ); }
 	| '[' assignment_expression ',' comma_expression ']' // CFA
-		{ $$ = DeclarationNode::newArray( $2, nullptr, false )->addArray( DeclarationNode::newArray( $4, nullptr, false ) ); }
-		// { SemanticError( yylloc, "New array dimension is currently unimplemented." ); $$ = nullptr; }
+		{ SemanticError( yylloc, "New array dimension is currently unimplemented." ); $$ = nullptr; }
+		// { $$ = DeclarationNode::newArray( $2, nullptr, false )->addArray( DeclarationNode::newArray( $4, nullptr, false ) ); }
 
 		// If needed, the following parses and does not use comma_expression, so the array structure can be built.
