Skip to content

Commit ae2c9cd

Browse files
committed
Reset seen symbols when ending namespace (GH-15244)
Previously, seen symbols were never cleaned during the compilation of a single file. This makes it impossible to use a class or function from a different namespace if such a symbol is also declared within the same file. This is inconsistent with how it would work when split into different files.
1 parent 5622def commit ae2c9cd

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
--TEST--
2+
Namespace end resets seen function symbols
3+
--FILE--
4+
<?php
5+
6+
namespace {
7+
function f() {
8+
echo __FUNCTION__, "\n";
9+
}
10+
f();
11+
}
12+
13+
namespace Ns {
14+
function f() {
15+
echo __FUNCTION__, "\n";
16+
}
17+
f();
18+
}
19+
20+
namespace {
21+
use function Ns\f;
22+
f();
23+
}
24+
25+
namespace Ns {
26+
use function f;
27+
f();
28+
}
29+
30+
namespace {
31+
f();
32+
}
33+
34+
namespace Ns {
35+
f();
36+
}
37+
38+
namespace {
39+
use function f;
40+
f();
41+
}
42+
43+
namespace Ns {
44+
use function Ns\f;
45+
f();
46+
}
47+
48+
?>
49+
--EXPECTF--
50+
Warning: The use statement with non-compound name 'f' has no effect in %s on line 36
51+
f
52+
Ns\f
53+
Ns\f
54+
f
55+
f
56+
Ns\f
57+
f
58+
Ns\f
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
--TEST--
2+
Namespace end resets seen class symbols
3+
--FILE--
4+
<?php
5+
6+
namespace {
7+
class C {}
8+
var_dump(new C);
9+
}
10+
11+
namespace Ns {
12+
class C {}
13+
var_dump(new C);
14+
}
15+
16+
namespace {
17+
use Ns\C;
18+
var_dump(new C);
19+
}
20+
21+
namespace Ns {
22+
use C;
23+
var_dump(new C);
24+
}
25+
26+
namespace {
27+
var_dump(new C);
28+
}
29+
30+
namespace Ns {
31+
var_dump(new C);
32+
}
33+
34+
namespace {
35+
use C;
36+
var_dump(new C);
37+
}
38+
39+
namespace Ns {
40+
use Ns\C;
41+
var_dump(new C);
42+
}
43+
44+
?>
45+
--EXPECTF--
46+
Warning: The use statement with non-compound name 'C' has no effect in %s on line 32
47+
object(C)#%d (0) {
48+
}
49+
object(Ns\C)#1 (0) {
50+
}
51+
object(Ns\C)#1 (0) {
52+
}
53+
object(C)#%d (0) {
54+
}
55+
object(C)#%d (0) {
56+
}
57+
object(Ns\C)#1 (0) {
58+
}
59+
object(C)#%d (0) {
60+
}
61+
object(Ns\C)#1 (0) {
62+
}

Zend/zend_compile.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ static void zend_reset_import_tables(void) /* {{{ */
377377
efree(FC(imports_const));
378378
FC(imports_const) = NULL;
379379
}
380+
381+
zend_hash_clean(&FC(seen_symbols));
380382
}
381383
/* }}} */
382384

0 commit comments

Comments
 (0)