@@ -6616,6 +6616,7 @@ static void zend_compile_switch(zend_ast *ast) /* {{{ */
66166616 jmpnz_opnums = safe_emalloc (sizeof (uint32_t ), cases -> children , 0 );
66176617 for (i = 0 ; i < cases -> children ; ++ i ) {
66186618 zend_ast * case_ast = cases -> child [i ];
6619+ ZEND_ASSERT (case_ast -> kind == ZEND_AST_SWITCH_CASE );
66196620 zend_ast * cond_ast = case_ast -> child [0 ];
66206621 znode cond_node ;
66216622
@@ -6659,8 +6660,9 @@ static void zend_compile_switch(zend_ast *ast) /* {{{ */
66596660
66606661 for (i = 0 ; i < cases -> children ; ++ i ) {
66616662 zend_ast * case_ast = cases -> child [i ];
6663+ ZEND_ASSERT (case_ast -> kind == ZEND_AST_SWITCH_CASE );
66626664 zend_ast * cond_ast = case_ast -> child [0 ];
6663- zend_ast * stmt_ast = case_ast -> child [1 ];
6665+ zend_ast_list * stmt_ast = zend_ast_get_list ( case_ast -> child [1 ]) ;
66646666
66656667 if (cond_ast ) {
66666668 zend_update_jump_target_to_next (jmpnz_opnums [i ]);
@@ -6688,7 +6690,27 @@ static void zend_compile_switch(zend_ast *ast) /* {{{ */
66886690 }
66896691 }
66906692
6691- zend_compile_stmt (stmt_ast );
6693+ if (stmt_ast -> children > 0 && i < (cases -> children - 1 )) {
6694+ zend_ast * last_stmt = stmt_ast -> child [stmt_ast -> children - 1 ];
6695+ while (last_stmt && last_stmt -> kind == ZEND_AST_STMT_LIST ) {
6696+ zend_ast_list * list = zend_ast_get_list (last_stmt );
6697+ last_stmt = list -> child [list -> children - 1 ];
6698+ }
6699+ if (last_stmt == NULL
6700+ || (last_stmt -> kind != ZEND_AST_BREAK
6701+ && last_stmt -> kind != ZEND_AST_CONTINUE
6702+ && last_stmt -> kind != ZEND_AST_RETURN
6703+ && last_stmt -> kind != ZEND_AST_THROW
6704+ && last_stmt -> kind != ZEND_AST_GOTO )) {
6705+ if (!(last_stmt -> kind == ZEND_AST_CONST && zend_string_equals_literal (zend_ast_get_str (last_stmt -> child [0 ]), "fallthrough" ))) {
6706+ CG (zend_lineno ) = case_ast -> lineno ;
6707+ zend_error (E_WARNING ,
6708+ "Non-empty case falls through to the next case, terminate the case with \"fallthrough;\" if this is intentional" );
6709+ }
6710+ }
6711+ }
6712+
6713+ zend_compile_stmt ((zend_ast * )stmt_ast );
66926714 }
66936715
66946716 if (!has_default_case ) {
0 commit comments