@@ -6375,6 +6375,18 @@ static void zend_compile_switch(zend_ast *ast) /* {{{ */
6375
6375
}
6376
6376
/* }}} */
6377
6377
6378
+ static bool do_match_conditions_contain_default (zend_ast_list * conditions )
6379
+ {
6380
+ for (uint32_t i = 0 ; i < conditions -> children ; ++ i ) {
6381
+ // Default as an expression is still allowed, so we don't need to recurse sub-lists.
6382
+ if (conditions -> child [i ]-> kind == ZEND_AST_DEFAULT ) {
6383
+ return true;
6384
+ }
6385
+ }
6386
+
6387
+ return false;
6388
+ }
6389
+
6378
6390
static uint32_t count_match_conds (zend_ast_list * arms )
6379
6391
{
6380
6392
uint32_t num_conds = 0 ;
@@ -6383,7 +6395,7 @@ static uint32_t count_match_conds(zend_ast_list *arms)
6383
6395
zend_ast * arm_ast = arms -> child [i ];
6384
6396
zend_ast_list * conds = zend_ast_get_list (arm_ast -> child [0 ]);
6385
6397
6386
- if (conds -> child [ 0 ] -> kind == ZEND_AST_DEFAULT ) {
6398
+ if (do_match_conditions_contain_default ( conds ) ) {
6387
6399
continue ;
6388
6400
}
6389
6401
@@ -6398,7 +6410,7 @@ static bool can_match_use_jumptable(zend_ast_list *arms) {
6398
6410
zend_ast * arm_ast = arms -> child [i ];
6399
6411
zend_ast_list * conds = zend_ast_get_list (arm_ast -> child [0 ]);
6400
6412
6401
- if (conds -> child [ 0 ] -> kind == ZEND_AST_DEFAULT ) {
6413
+ if (do_match_conditions_contain_default ( conds ) ) {
6402
6414
/* Skip default arm */
6403
6415
continue ;
6404
6416
}
@@ -6445,7 +6457,7 @@ static void zend_compile_match(znode *result, zend_ast *ast)
6445
6457
zend_ast * arm_ast = arms -> child [i ];
6446
6458
zend_ast_list * conds = zend_ast_get_list (arm_ast -> child [0 ]);
6447
6459
6448
- if (conds -> child [ 0 ] -> kind == ZEND_AST_DEFAULT ) {
6460
+ if (do_match_conditions_contain_default ( conds ) ) {
6449
6461
if (has_default_arm ) {
6450
6462
CG (zend_lineno ) = arm_ast -> lineno ;
6451
6463
zend_error_noreturn (E_COMPILE_ERROR ,
@@ -6478,7 +6490,7 @@ static void zend_compile_match(znode *result, zend_ast *ast)
6478
6490
for (uint32_t j = 0 ; j < conds -> children ; j ++ ) {
6479
6491
zend_ast * cond_ast = conds -> child [j ];
6480
6492
6481
- if (conds -> child [ 0 ] -> kind == ZEND_AST_DEFAULT ) {
6493
+ if (do_match_conditions_contain_default ( conds ) ) {
6482
6494
break ;
6483
6495
}
6484
6496
@@ -6535,7 +6547,7 @@ static void zend_compile_match(znode *result, zend_ast *ast)
6535
6547
zend_ast * body_ast = arm_ast -> child [1 ];
6536
6548
zend_ast_list * conds = zend_ast_get_list (arm_ast -> child [0 ]);
6537
6549
6538
- if (conds -> child [ 0 ] -> kind != ZEND_AST_DEFAULT ) {
6550
+ if (! do_match_conditions_contain_default ( conds ) ) {
6539
6551
for (uint32_t j = 0 ; j < conds -> children ; j ++ ) {
6540
6552
zend_ast * cond_ast = conds -> child [j ];
6541
6553
0 commit comments