1--TEST--
2Property type hints in PHP 7.4
3--SKIPIF--
4<?php if (PHP_VERSION_ID < 70400) die('skip PHP >= 7.4 only'); ?>
5--FILE--
6<?php
7
8require __DIR__ . '/../util.php';
9
10$code = <<<'PHP'
11<?php
12namespace Foo;
13class test {
14	public int $i = 2, $j;
15	public static ?string $s;
16	private ?iterable $it;
17	protected Row $row;
18	var \stdClass $o;
19	private static $normal = null;
20}
21PHP;
22
23$node = ast\parse_code($code, $version=60);
24echo "The type property should not be set in version 60\n";
25echo ast_dump($node), "\n";
26echo "But the type property should be set in version 70\n";
27$node = ast\parse_code($code, $version=70);
28echo ast_dump($node), "\n";
29?>
30--EXPECTF--
31The type property should not be set in version 60
32AST_STMT_LIST
33    0: AST_NAMESPACE
34        name: "Foo"
35        stmts: null
36    1: AST_CLASS
37        flags: 0
38        name: "test"
39        docComment: null
40        extends: null
41        implements: null
42        stmts: AST_STMT_LIST
43            0: AST_PROP_DECL
44                flags: MODIFIER_PUBLIC (%d)
45                0: AST_PROP_ELEM
46                    name: "i"
47                    default: 2
48                    docComment: null
49                1: AST_PROP_ELEM
50                    name: "j"
51                    default: null
52                    docComment: null
53            1: AST_PROP_DECL
54                flags: MODIFIER_PUBLIC | MODIFIER_STATIC (%d)
55                0: AST_PROP_ELEM
56                    name: "s"
57                    default: null
58                    docComment: null
59            2: AST_PROP_DECL
60                flags: MODIFIER_PRIVATE (%d)
61                0: AST_PROP_ELEM
62                    name: "it"
63                    default: null
64                    docComment: null
65            3: AST_PROP_DECL
66                flags: MODIFIER_PROTECTED (%d)
67                0: AST_PROP_ELEM
68                    name: "row"
69                    default: null
70                    docComment: null
71            4: AST_PROP_DECL
72                flags: MODIFIER_PUBLIC (%d)
73                0: AST_PROP_ELEM
74                    name: "o"
75                    default: null
76                    docComment: null
77            5: AST_PROP_DECL
78                flags: MODIFIER_PRIVATE | MODIFIER_STATIC (%d)
79                0: AST_PROP_ELEM
80                    name: "normal"
81                    default: AST_CONST
82                        name: AST_NAME
83                            flags: NAME_NOT_FQ (1)
84                            name: "null"
85                    docComment: null
86        __declId: 0
87But the type property should be set in version 70
88AST_STMT_LIST
89    0: AST_NAMESPACE
90        name: "Foo"
91        stmts: null
92    1: AST_CLASS
93        flags: 0
94        name: "test"
95        docComment: null
96        extends: null
97        implements: null
98        stmts: AST_STMT_LIST
99            0: AST_PROP_GROUP
100                flags: MODIFIER_PUBLIC (%d)
101                type: AST_TYPE
102                    flags: TYPE_LONG (4)
103                props: AST_PROP_DECL
104                    flags: 0
105                    0: AST_PROP_ELEM
106                        name: "i"
107                        default: 2
108                        docComment: null
109                    1: AST_PROP_ELEM
110                        name: "j"
111                        default: null
112                        docComment: null
113            1: AST_PROP_GROUP
114                flags: MODIFIER_PUBLIC | MODIFIER_STATIC (%d)
115                type: AST_NULLABLE_TYPE
116                    type: AST_TYPE
117                        flags: TYPE_STRING (6)
118                props: AST_PROP_DECL
119                    flags: 0
120                    0: AST_PROP_ELEM
121                        name: "s"
122                        default: null
123                        docComment: null
124            2: AST_PROP_GROUP
125                flags: MODIFIER_PRIVATE (%d)
126                type: AST_NULLABLE_TYPE
127                    type: AST_TYPE
128                        flags: TYPE_ITERABLE (%d)
129                props: AST_PROP_DECL
130                    flags: 0
131                    0: AST_PROP_ELEM
132                        name: "it"
133                        default: null
134                        docComment: null
135            3: AST_PROP_GROUP
136                flags: MODIFIER_PROTECTED (%d)
137                type: AST_NAME
138                    flags: NAME_NOT_FQ (1)
139                    name: "Row"
140                props: AST_PROP_DECL
141                    flags: 0
142                    0: AST_PROP_ELEM
143                        name: "row"
144                        default: null
145                        docComment: null
146            4: AST_PROP_GROUP
147                flags: MODIFIER_PUBLIC (%d)
148                type: AST_NAME
149                    flags: NAME_FQ (0)
150                    name: "stdClass"
151                props: AST_PROP_DECL
152                    flags: 0
153                    0: AST_PROP_ELEM
154                        name: "o"
155                        default: null
156                        docComment: null
157            5: AST_PROP_GROUP
158                flags: MODIFIER_PRIVATE | MODIFIER_STATIC (%d)
159                type: null
160                props: AST_PROP_DECL
161                    flags: 0
162                    0: AST_PROP_ELEM
163                        name: "normal"
164                        default: AST_CONST
165                            name: AST_NAME
166                                flags: NAME_NOT_FQ (1)
167                                name: "null"
168                        docComment: null
169        __declId: 0
170