@@ -6600,13 +6600,24 @@ static void zend_compile_and_pattern(zend_ast **ast_ptr)
6600
6600
verify_parenthesized_compound_pattern (ast_ptr , ZEND_AST_OR_PATTERN );
6601
6601
}
6602
6602
6603
+ struct zend_compile_pattern_context {
6604
+ bool inside_or_pattern ;
6605
+ };
6606
+
6603
6607
static void zend_compile_pattern (zend_ast * * ast_ptr , void * context )
6604
6608
{
6605
6609
zend_ast * ast = * ast_ptr ;
6606
6610
if (ast == NULL || ast -> kind == ZEND_AST_ZVAL ) {
6607
6611
return ;
6608
6612
}
6609
6613
6614
+ struct zend_compile_pattern_context * pattern_context = context ;
6615
+ struct zend_compile_pattern_context tmp_context = {0 };
6616
+ if (!pattern_context ) {
6617
+ pattern_context = & tmp_context ;
6618
+ }
6619
+ bool prev_inside_or_pattern = pattern_context -> inside_or_pattern ;
6620
+
6610
6621
switch (ast -> kind ) {
6611
6622
case ZEND_AST_OBJECT_PATTERN :
6612
6623
zend_compile_object_pattern (ast_ptr );
@@ -6615,6 +6626,9 @@ static void zend_compile_pattern(zend_ast **ast_ptr, void *context)
6615
6626
zend_compile_type_pattern (ast_ptr );
6616
6627
break ;
6617
6628
case ZEND_AST_BINDING_PATTERN :
6629
+ if (pattern_context -> inside_or_pattern ) {
6630
+ zend_throw_exception (zend_ce_compile_error , "Must not bind to variables inside | pattern" , 0 );
6631
+ }
6618
6632
zend_compile_binding_pattern (ast_ptr );
6619
6633
break ;
6620
6634
case ZEND_AST_ARRAY_PATTERN :
@@ -6624,14 +6638,16 @@ static void zend_compile_pattern(zend_ast **ast_ptr, void *context)
6624
6638
zend_compile_class_const_pattern (ast_ptr );
6625
6639
break ;
6626
6640
case ZEND_AST_OR_PATTERN :
6641
+ pattern_context -> inside_or_pattern = true;
6627
6642
zend_compile_or_pattern (ast_ptr );
6628
6643
break ;
6629
6644
case ZEND_AST_AND_PATTERN :
6630
6645
zend_compile_and_pattern (ast_ptr );
6631
6646
break ;
6632
6647
}
6633
6648
6634
- zend_ast_apply (ast , zend_compile_pattern , context );
6649
+ zend_ast_apply (ast , zend_compile_pattern , pattern_context );
6650
+ pattern_context -> inside_or_pattern = prev_inside_or_pattern ;
6635
6651
}
6636
6652
6637
6653
static void zend_compile_is (znode * result , zend_ast * ast )
0 commit comments