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