fix(compiler): preserve PHP switch comparison semantics (#89)
parent
5488805baf
commit
6aae5f76d2
4 changed files with 134 additions and 9 deletions
@ -0,0 +1,40 @@ |
||||
--TEST-- |
||||
Boolean switch subjects use PHP loose comparison for numeric cases |
||||
--FILE-- |
||||
<?php |
||||
function select_bool(bool $value): string |
||||
{ |
||||
switch ($value) { |
||||
case 2: |
||||
return 'nonzero'; |
||||
case 0: |
||||
return 'zero'; |
||||
default: |
||||
return 'default'; |
||||
} |
||||
} |
||||
|
||||
function select_binary_bool(bool $value): string |
||||
{ |
||||
switch ($value) { |
||||
case 0: |
||||
return 'false'; |
||||
case 1: |
||||
return 'true'; |
||||
} |
||||
return 'default'; |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
echo select_bool(true), "\n"; |
||||
echo select_bool(false), "\n"; |
||||
echo select_binary_bool(true), "\n"; |
||||
echo select_binary_bool(false), "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
nonzero |
||||
zero |
||||
true |
||||
false |
||||
@ -0,0 +1,41 @@ |
||||
--TEST-- |
||||
Duplicate integer switch cases retain PHP first-match semantics |
||||
--FILE-- |
||||
<?php |
||||
function select_duplicate_int(int $value): string |
||||
{ |
||||
switch ($value) { |
||||
case 1: |
||||
return 'first-int'; |
||||
case 1: |
||||
return 'second-int'; |
||||
default: |
||||
return 'default-int'; |
||||
} |
||||
} |
||||
|
||||
function select_duplicate_bool(bool $value): string |
||||
{ |
||||
switch ($value) { |
||||
case 1: |
||||
return 'first-bool'; |
||||
case 1: |
||||
return 'second-bool'; |
||||
default: |
||||
return 'default-bool'; |
||||
} |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
echo select_duplicate_int(1), "\n"; |
||||
echo select_duplicate_int(2), "\n"; |
||||
echo select_duplicate_bool(true), "\n"; |
||||
echo select_duplicate_bool(false), "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
first-int |
||||
default-int |
||||
first-bool |
||||
default-bool |
||||
@ -0,0 +1,29 @@ |
||||
--TEST-- |
||||
Integer switch subjects accept floating-point case labels |
||||
--FILE-- |
||||
<?php |
||||
function select_number(int $value): string |
||||
{ |
||||
switch ($value) { |
||||
case 0: |
||||
return 'zero'; |
||||
case 1.5: |
||||
return 'fraction'; |
||||
case 2.0: |
||||
return 'two'; |
||||
default: |
||||
return 'default'; |
||||
} |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
echo select_number(0), "\n"; |
||||
echo select_number(1), "\n"; |
||||
echo select_number(2), "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
zero |
||||
default |
||||
two |
||||
Loading…
Reference in new issue