diff --git a/lib/CurlyBraceOffsetRejector.php b/lib/CurlyBraceOffsetRejector.php index e56b14658a8..5b8f1e77b96 100644 --- a/lib/CurlyBraceOffsetRejector.php +++ b/lib/CurlyBraceOffsetRejector.php @@ -149,12 +149,18 @@ private static function closingParenOpensControlBlock(array $tokens, int $closeP return true; } - // `new class(...)` anonymous class ctor args — `{` opens class body, not offset access (#6881). + // `new class(...)` / `new readonly class(...)` anonymous class ctor args — `{` opens class body (#6881, #17467). if (T_CLASS === $beforeOpen[0]) { $beforeClass = self::previousSignificantToken($tokens, $openParenIndex - 2); if (\is_array($beforeClass) && T_NEW === $beforeClass[0]) { return true; } + if (\is_array($beforeClass) && \defined('T_READONLY') && T_READONLY === $beforeClass[0]) { + $beforeReadonly = self::previousSignificantToken($tokens, $openParenIndex - 4); + if (\is_array($beforeReadonly) && T_NEW === $beforeReadonly[0]) { + return true; + } + } } if (T_STRING === $beforeOpen[0]) { diff --git a/test/compliance/cases/language/readonly_anonymous_ctor_args.phpt b/test/compliance/cases/language/readonly_anonymous_ctor_args.phpt new file mode 100644 index 00000000000..1e3deefc991 --- /dev/null +++ b/test/compliance/cases/language/readonly_anonymous_ctor_args.phpt @@ -0,0 +1,21 @@ +--TEST-- +Language: new readonly class(...) constructor args (issue #17467, Zend/zend_compile.c) +--SKIPIF-- + +--FILE-- +x, "\n"; +--EXPECT-- +5 diff --git a/test/repro/maintainer_gap_readonly_anonymous_ctor_args.php b/test/repro/maintainer_gap_readonly_anonymous_ctor_args.php new file mode 100644 index 00000000000..6860fe84198 --- /dev/null +++ b/test/repro/maintainer_gap_readonly_anonymous_ctor_args.php @@ -0,0 +1,9 @@ +x, "\n"; diff --git a/test/unit/CurlyBraceOffsetRejectorTest.php b/test/unit/CurlyBraceOffsetRejectorTest.php index 5c25d040a8d..dfd7d950b88 100644 --- a/test/unit/CurlyBraceOffsetRejectorTest.php +++ b/test/unit/CurlyBraceOffsetRejectorTest.php @@ -57,4 +57,10 @@ public function testAnonymousClassCtorArgsBraceIsAllowed(): void $code = '