Description
Description
Ref vimeo/psalm#9350
Enabling JIT on an ARM64 machine with opcache.jit=1205
triggers an impossible assertion (count($result_type_parts) === $combinations
where $result_type_parts
is an array with 1 element and $combinations
is 1).
Using opcache.jit=1254
fixes the issue.
Running var_dump($result_type_parts, $combinations);
before the assertion also fixes the issue.
To reproduce, enable opcache, enable assertions, create an empty composer project, install vimeo/psalm:5.7.1 and scan the following file (vendor/bin/psalm --no-cache a.php
):
<?php
$v = __DIR__ . '';
Expected result: No AssertionError, like when running on x86_64
Actual result:
[daniil@pi4 t]$ vendor/bin/psalm --no-cache a.php
Warning: "findUnusedCode" will be defaulted to "true" in Psalm 6. You should explicitly enable or disable this setting.
Warning: "findUnusedCode" will be defaulted to "true" in Psalm 6. You should explicitly enable or disable this setting.
Target PHP version: 8.2 (inferred from current PHP version).
Scanning files...
Analyzing files...
Uncaught AssertionError: assert(count($result_type_parts) === $combinations) in /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php:181
Stack trace:
#0 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php(181): assert()
#1 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(138): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\ConcatAnalyzer::analyze()
#2 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(265): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#3 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#4 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php(242): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#5 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(536): Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer::analyze()
#6 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(178): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyzeAssignment()
#7 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#8 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(560): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#9 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(195): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#10 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(179): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#11 /home/daniil/repos/psalm/src/Psalm/Internal/Codebase/Analyzer.php(1581): Psalm\Internal\Analyzer\FileAnalyzer->analyze()
#12 /home/daniil/repos/psalm/src/Psalm/Internal/Codebase/Analyzer.php(522): Psalm\Internal\Codebase\Analyzer->analysisWorker()
#13 /home/daniil/repos/psalm/src/Psalm/Internal/Codebase/Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis()
#14 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(1183): Psalm\Internal\Codebase\Analyzer->analyzeFiles()
#15 /home/daniil/repos/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->checkPaths()
#16 /home/daniil/repos/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run()
#17 {main}
(Psalm dev-master@589fee7b224f4ccb7c878aa3781c38c3a7dbea0a crashed due to an uncaught Throwable)
Note that psalm will always overwrite the opcache.jit
config value to 1205
, to modify it edit vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php:97
PHP Version
PHP 8.2.2
Operating System
Manjaro arm64