Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 8.1k
[PFA 2/n] Support PFA functionality#20848
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Uh oh!
There was an error while loading. Please reload this page.
This file was deleted.
Uh oh!
There was an error while loading. Please reload this page.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| --TEST-- | ||
| PFA of assert() behaves like a dynamic call to assert() | ||
| --FILE-- | ||
| <?php | ||
| try { | ||
| echo "# Static call:\n"; | ||
| assert(false); | ||
| } catch (Error $e) { | ||
| echo $e::class, ": ", $e->getMessage(), "\n"; | ||
| } | ||
| try { | ||
| echo "# Dynamic call:\n"; | ||
| (function ($f) { $f(false); })('assert'); | ||
| } catch (Error $e) { | ||
| echo $e::class, ": ", $e->getMessage() ?: '(no message)', "\n"; | ||
| } | ||
| try { | ||
| echo "# PFA call:\n"; | ||
| $f = assert(?); | ||
| $f(false); | ||
| } catch (Error $e) { | ||
| echo $e::class, ": ", $e->getMessage() ?: '(no message)', "\n"; | ||
| } | ||
| try { | ||
| echo "# Upper-case assert():\n"; | ||
| $f = ASSERT(?); | ||
| $f(false); | ||
| } catch (Error $e) { | ||
| echo $e::class, ": ", $e->getMessage() ?: '(no message)', "\n"; | ||
| } | ||
| ?> | ||
| --EXPECT-- | ||
| # Static call: | ||
| AssertionError: assert(false) | ||
| # Dynamic call: | ||
| AssertionError: (no message) | ||
| # PFA call: | ||
| AssertionError: (no message) | ||
| # Upper-case assert(): | ||
| AssertionError: (no message) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,88 @@ | ||
| --TEST-- | ||
| PFA inherits NoDiscard and SensitiveParameter attributes | ||
| --FILE-- | ||
| <?php | ||
| #[Attribute] | ||
| class Test {} | ||
| #[NoDiscard] #[Test] | ||
| function f($a, #[SensitiveParameter] $b, #[Test] ...$c) { | ||
| } | ||
| function dump_attributes($function) { | ||
| $r = new ReflectionFunction($function); | ||
| var_dump($r->getAttributes()); | ||
| foreach ($r->getParameters() as $i => $p) { | ||
| echo "Parameter $i:\n"; | ||
| var_dump($p->getAttributes()); | ||
| } | ||
| } | ||
| echo "# Orig attributes:\n"; | ||
| dump_attributes('f'); | ||
| $f = f(1, ?, ?, ...); | ||
| echo "# PFA attributes:\n"; | ||
| dump_attributes($f); | ||
| ?> | ||
| --EXPECTF-- | ||
| # Orig attributes: | ||
| array(2) { | ||
| [0]=> | ||
| object(ReflectionAttribute)#%d (1) { | ||
| ["name"]=> | ||
| string(9) "NoDiscard" | ||
| } | ||
| [1]=> | ||
| object(ReflectionAttribute)#%d (1) { | ||
| ["name"]=> | ||
| string(4) "Test" | ||
| } | ||
| } | ||
| Parameter 0: | ||
| array(0) { | ||
| } | ||
| Parameter 1: | ||
| array(1) { | ||
| [0]=> | ||
| object(ReflectionAttribute)#%d (1) { | ||
| ["name"]=> | ||
| string(18) "SensitiveParameter" | ||
| } | ||
| } | ||
| Parameter 2: | ||
| array(1) { | ||
| [0]=> | ||
| object(ReflectionAttribute)#%d (1) { | ||
| ["name"]=> | ||
| string(4) "Test" | ||
| } | ||
| } | ||
| # PFA attributes: | ||
| array(1) { | ||
| [0]=> | ||
| object(ReflectionAttribute)#%d (1) { | ||
| ["name"]=> | ||
| string(9) "NoDiscard" | ||
| } | ||
| } | ||
| Parameter 0: | ||
| array(1) { | ||
| [0]=> | ||
| object(ReflectionAttribute)#%d (1) { | ||
| ["name"]=> | ||
| string(18) "SensitiveParameter" | ||
| } | ||
| } | ||
| Parameter 1: | ||
| array(0) { | ||
| } | ||
| Parameter 2: | ||
| array(0) { | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| --TEST-- | ||
| PFA preserves #[SensitiveParameter] | ||
| --FILE-- | ||
| <?php | ||
| function f($a, #[SensitiveParameter] $b, $c, #[SensitiveParameter] ...$d) { | ||
| throw new Exception(); | ||
| } | ||
| $f = f(1, ?, ?, ?, ...)('normal param', 3, 'reified variadic', 'variadic'); | ||
| ?> | ||
| --EXPECTF-- | ||
| Fatal error: Uncaught Exception in %s:%d | ||
| Stack trace: | ||
| #0 %s(%d): f(1, Object(SensitiveParameterValue), 3, Object(SensitiveParameterValue), Object(SensitiveParameterValue)) | ||
| #1 %s(%d): {closure:pfa:%s:7}(Object(SensitiveParameterValue), 3, Object(SensitiveParameterValue), Object(SensitiveParameterValue)) | ||
| #2 {main} | ||
| thrown in %s on line %d |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| --TEST-- | ||
| PFA preserves #[NoDiscard] | ||
| --FILE-- | ||
| <?php | ||
| #[NoDiscard] function f($a) { | ||
| } | ||
| $f = f(?); | ||
| $f(1); | ||
| (void) $f(1); | ||
| ?> | ||
| --EXPECTF-- | ||
| Warning: The return value of function {closure:%s}() should either be used or intentionally ignored by casting it as (void) in %s on line 7 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| --TEST-- | ||
| clone() can be partially applied | ||
| --FILE-- | ||
| <?php | ||
| class C { | ||
| public function __construct( | ||
| public mixed $a, | ||
| public mixed $b, | ||
| ) { } | ||
| } | ||
| $clone = clone(?); | ||
| var_dump($clone(new C(1, 2))); | ||
| $clone = clone(...); | ||
| var_dump($clone(new C(3, 4))); | ||
| $clone = clone(new C(5, 6), ?); | ||
| var_dump($clone(['a' => 7])); | ||
| $clone = clone(?, ['a' => 8]); | ||
| var_dump($clone(new C(9, 10))); | ||
| ?> | ||
| --EXPECTF-- | ||
| object(C)#%d (2) { | ||
| ["a"]=> | ||
| int(1) | ||
| ["b"]=> | ||
| int(2) | ||
| } | ||
| object(C)#%d (2) { | ||
| ["a"]=> | ||
| int(3) | ||
| ["b"]=> | ||
| int(4) | ||
| } | ||
| object(C)#%d (2) { | ||
| ["a"]=> | ||
| int(7) | ||
| ["b"]=> | ||
| int(6) | ||
| } | ||
| object(C)#%d (2) { | ||
| ["a"]=> | ||
| int(8) | ||
| ["b"]=> | ||
| int(10) | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --TEST-- | ||
| PFA compile errors: multiple variadic placeholders | ||
| --FILE-- | ||
| <?php | ||
| foo(..., ...); | ||
| ?> | ||
| --EXPECTF-- | ||
| Fatal error: Variadic placeholder may only appear once in %s on line %d |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --TEST-- | ||
| PFA compile errors: variadic placeholder must be last | ||
| --FILE-- | ||
| <?php | ||
| foo(..., ?); | ||
| ?> | ||
| --EXPECTF-- | ||
| Fatal error: Variadic placeholder must be last in %s on line %d |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --TEST-- | ||
| PFA compile errors: placeholders can not appear after named args | ||
| --FILE-- | ||
| <?php | ||
| foo(n: 5, ?); | ||
| ?> | ||
| --EXPECTF-- | ||
| Fatal error: Cannot use positional argument after named argument in %s on line %d |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --TEST-- | ||
| PFA compile errors: variadic placeholder must be last, including after named args | ||
| --FILE-- | ||
| <?php | ||
| foo(..., n: 5); | ||
| ?> | ||
| --EXPECTF-- | ||
| Fatal error: Variadic placeholder must be last in %s on line %d |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --TEST-- | ||
| PFA compile errors: variadic placeholder must be last, including after positional args | ||
| --FILE-- | ||
| <?php | ||
| foo(..., $a); | ||
| ?> | ||
| --EXPECTF-- | ||
| Fatal error: Variadic placeholder must be last in %s on line %d |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --TEST-- | ||
| PFA compile errors: can not use unpacking in PFA, including with variadic placeholders | ||
| --FILE-- | ||
| <?php | ||
| foo(...["foo" => "bar"], ...); | ||
| ?> | ||
| --EXPECTF-- | ||
| Fatal error: Cannot combine partial application and unpacking in %s on line %d |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.