1--TEST--
2The SensitiveParameterValue replacement value correctly captures the original value.
3--FILE--
4<?php
5
6function test(
7    $foo,
8    #[SensitiveParameter] $bar,
9    $baz
10) {
11    throw new Exception('Error');
12}
13
14try {
15    test('foo', 'bar', 'baz');
16    echo 'Not reached';
17} catch (Exception $e) {
18    echo $e->getMessage(), PHP_EOL;
19    $testFrame = $e->getTrace()[0];
20    var_dump($testFrame['function']);
21    var_dump(count($testFrame['args']));
22    var_dump($testFrame['args'][0]);
23    assert($testFrame['args'][1] instanceof SensitiveParameterValue);
24    var_dump($testFrame['args'][1]->getValue());
25    var_dump($testFrame['args'][2]);
26    echo "Success", PHP_EOL;
27}
28
29function test2(
30    $foo,
31    #[SensitiveParameter] ...$variadic,
32) {
33    throw new Exception('Error 2');
34}
35
36try {
37    test2('foo', 'variadic1', 'variadic2', 'variadic3');
38    echo 'Not reached';
39} catch (Exception $e) {
40    echo $e->getMessage(), PHP_EOL;
41    $testFrame = $e->getTrace()[0];
42    var_dump($testFrame['function']);
43    var_dump(count($testFrame['args']));
44    var_dump($testFrame['args'][0]);
45    assert($testFrame['args'][1] instanceof SensitiveParameterValue);
46    var_dump($testFrame['args'][1]->getValue());
47    assert($testFrame['args'][2] instanceof SensitiveParameterValue);
48    var_dump($testFrame['args'][2]->getValue());
49    assert($testFrame['args'][3] instanceof SensitiveParameterValue);
50    var_dump($testFrame['args'][3]->getValue());
51    echo "Success", PHP_EOL;
52}
53
54?>
55--EXPECTF--
56Error
57string(4) "test"
58int(3)
59string(3) "foo"
60string(3) "bar"
61string(3) "baz"
62Success
63Error 2
64string(5) "test2"
65int(4)
66string(3) "foo"
67string(9) "variadic1"
68string(9) "variadic2"
69string(9) "variadic3"
70Success
71