Skip to content

Commit 8d4cbe4

Browse files
committed
feat(zend): resolve type-param vs type-name collisions via shadowing, error only at runtime use
Signed-off-by: azjezz <azjezz@protonmail.com>
1 parent 987a7eb commit 8d4cbe4

15 files changed

Lines changed: 161 additions & 51 deletions
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Errors: type parameter cannot be used at runtime in `catch`
3+
--FILE--
4+
<?php
5+
function f<T>(): void {
6+
try { /* ... */ } catch (T $e) {}
7+
}
8+
?>
9+
--EXPECTF--
10+
Fatal error: Cannot use generic type parameter T as a class reference at runtime; bound-erased generic types have no runtime representation in %s on line %d
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Errors: type parameter cannot be used at runtime in `T::class`
3+
--FILE--
4+
<?php
5+
function f<T>(): string {
6+
return T::class;
7+
}
8+
?>
9+
--EXPECTF--
10+
Fatal error: Cannot use generic type parameter T as a class reference at runtime; bound-erased generic types have no runtime representation in %s on line %d
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Errors: type parameter cannot be used at runtime in `instanceof`
3+
--FILE--
4+
<?php
5+
function f<T>($x): bool {
6+
return $x instanceof T;
7+
}
8+
?>
9+
--EXPECTF--
10+
Fatal error: Cannot use generic type parameter T as a class reference at runtime; bound-erased generic types have no runtime representation in %s on line %d
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Errors: type parameter cannot be used at runtime as a class in `new T()`
3+
--FILE--
4+
<?php
5+
function f<T>(): void {
6+
$x = new T();
7+
}
8+
?>
9+
--EXPECTF--
10+
Fatal error: Cannot use generic type parameter T as a class reference at runtime; bound-erased generic types have no runtime representation in %s on line %d
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Errors: type parameter cannot be used at runtime as a static-call target
3+
--FILE--
4+
<?php
5+
function f<T>(): void {
6+
T::foo();
7+
}
8+
?>
9+
--EXPECTF--
10+
Fatal error: Cannot use generic type parameter T as a class reference at runtime; bound-erased generic types have no runtime representation in %s on line %d

Zend/tests/generics/scoping/expression_position_class.phpt

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
--TEST--
2+
Scoping: a file-scope class does NOT shadow a generic type parameter
3+
--FILE--
4+
<?php
5+
class T {}
6+
function f<T>(): void {
7+
new T();
8+
}
9+
?>
10+
--EXPECTF--
11+
Fatal error: Cannot use generic type parameter T as a class reference at runtime; bound-erased generic types have no runtime representation in %s on line %d
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
Scoping: a fully qualified name `\T` bypasses the type-parameter rule
3+
--FILE--
4+
<?php
5+
class T {
6+
public int $v = 5;
7+
}
8+
function f<T>(): int {
9+
$x = new \T();
10+
return $x->v;
11+
}
12+
echo f(), "\n";
13+
?>
14+
--EXPECT--
15+
5

Zend/tests/generics/scoping/inner_class_does_not_capture_param.phpt

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
Scoping: inner-class shadowing of a type parameter is case-insensitive
3+
--FILE--
4+
<?php
5+
function f<T>(): void {
6+
class t {
7+
public int $v = 9;
8+
}
9+
$x = new T();
10+
echo $x->v, "\n";
11+
}
12+
f();
13+
?>
14+
--EXPECT--
15+
9

0 commit comments

Comments
 (0)