diff --git a/Zend/tests/switch-strict.phpt b/Zend/tests/switch-strict.phpt new file mode 100644 index 0000000000000..739e8fe68343f --- /dev/null +++ b/Zend/tests/switch-strict.phpt @@ -0,0 +1,41 @@ +--TEST-- +Strict switch cases +--FILE-- +attr + && expr_node.op_type == IS_CONST && Z_TYPE(expr_node.u.constant) == IS_FALSE) { jmpnz_opnums[i] = zend_emit_cond_jump(ZEND_JMPZ, &cond_node, 0); - } else if (expr_node.op_type == IS_CONST + } else if (!case_ast->attr + && expr_node.op_type == IS_CONST && Z_TYPE(expr_node.u.constant) == IS_TRUE) { jmpnz_opnums[i] = zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, 0); } else { - opline = zend_emit_op(NULL, - (expr_node.op_type & (IS_VAR|IS_TMP_VAR)) ? ZEND_CASE : ZEND_IS_EQUAL, - &expr_node, &cond_node); + zend_uchar equality_op = case_ast->attr; + if (!equality_op) { + equality_op = (expr_node.op_type & (IS_VAR|IS_TMP_VAR)) ? ZEND_CASE : ZEND_IS_EQUAL; + } + opline = zend_emit_op(NULL, equality_op, &expr_node, &cond_node); SET_NODE(opline->result, &case_node); if (opline->op1_type == IS_CONST) { Z_TRY_ADDREF_P(CT_CONSTANT(opline->op1)); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 2776426feb104..4652b7a8ab04a 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -579,6 +579,14 @@ case_list: /* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_SWITCH_LIST); } | case_list T_CASE expr case_separator inner_statement_list { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, $3, $5)); } + | case_list T_CASE T_IS_EQUAL expr case_separator inner_statement_list + { zend_ast *case_ast = zend_ast_create(ZEND_AST_SWITCH_CASE, $4, $6); + case_ast->attr = ZEND_IS_EQUAL; + $$ = zend_ast_list_add($1, case_ast); } + | case_list T_CASE T_IS_IDENTICAL expr case_separator inner_statement_list + { zend_ast *case_ast = zend_ast_create(ZEND_AST_SWITCH_CASE, $4, $6); + case_ast->attr = ZEND_IS_IDENTICAL; + $$ = zend_ast_list_add($1, case_ast); } | case_list T_DEFAULT case_separator inner_statement_list { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, NULL, $4)); } ;