Skip to content

Commit 9955269

Browse files
committed
[skip ci] Get explicit notation working
Have a HT null access somewhere...
1 parent 9d9a6e7 commit 9955269

27 files changed

+672
-25
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
Abstract generic types basic
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(T $param): T;
8+
}
9+
10+
class CS implements I<string> {
11+
public function foo(string $param): string {
12+
return $param . '!';
13+
}
14+
}
15+
16+
class CI implements I<int> {
17+
public function foo(int $param): int {
18+
return $param + 42;
19+
}
20+
}
21+
22+
$cs = new CS();
23+
var_dump($cs->foo("Hello"));
24+
25+
$ci = new CI();
26+
var_dump($ci->foo(5));
27+
28+
?>
29+
--EXPECT--
30+
string(6) "Hello!"
31+
int(47)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
Abstract generic type with a constraint
3+
--FILE--
4+
<?php
5+
6+
interface I<T : int|string> {
7+
public function foo(T $param): T;
8+
}
9+
10+
class CS implements I<string> {
11+
public function foo(string $param): string {
12+
return $param . '!';
13+
}
14+
}
15+
16+
class CI implements I<int> {
17+
public function foo(int $param): int {
18+
return $param + 42;
19+
}
20+
}
21+
22+
$cs = new CS();
23+
var_dump($cs->foo("Hello"));
24+
25+
$ci = new CI();
26+
var_dump($ci->foo(5));
27+
28+
?>
29+
--EXPECT--
30+
string(6) "Hello!"
31+
int(47)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Abstract generic type with a constraint that is not satisfied
3+
--FILE--
4+
<?php
5+
6+
interface I<T : int|string> {
7+
public function foo(T $param): T;
8+
}
9+
10+
class C implements I<float> {
11+
public function foo(float $param): float {}
12+
}
13+
14+
?>
15+
--EXPECTF--
16+
Fatal error: Bound type float is not a subtype of the constraint type string|int of generic type T of interface I in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type cannot be in intersection (simple intersection with class type)
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(T&Traversable $param): T&Traversable;
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Associated type cannot be part of an intersection type in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type cannot be in intersection (DNF type)
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(stdClass|(T&Traversable) $param): stdClass|(T&Traversable);
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Associated type cannot be part of an intersection type in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type cannot be in union (simple union with built-in type)
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(T|int $param): T|int;
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Associated type cannot be part of a union type in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type cannot be in union (simple union with class type)
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(T|stdClass $param): T|stdClass;
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Associated type cannot be part of a union type in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type cannot be in union (DNF type)
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(T|(Traversable&Countable) $param): T|(Traversable&Countable);
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Associated type cannot be part of a union type in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type cannot be in union (nullable type union with ?)
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(?T $param): ?T;
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Associated type cannot be part of a union type in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type cannot be in union (forced allowed null)
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(T $param = null): T;
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Associated type cannot be part of a union type (implicitly nullable due to default null value) in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type in class is invalid
3+
--FILE--
4+
<?php
5+
6+
class C<T> {
7+
public function foo(T $param): T;
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Parse error: syntax error, unexpected token "<", expecting "{" in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type in trait is invalid
3+
--FILE--
4+
<?php
5+
6+
trait C<T> {
7+
public function foo(T $param): T;
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Parse error: syntax error, unexpected token "<", expecting "{" in %s on line %d
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Abstract generic type that is redeclared
3+
--FILE--
4+
<?php
5+
6+
interface I<T, S, T> {
7+
public function foo(T&Traversable $param): T&Traversable;
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Duplicate generic parameter T in %s on line %d
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Implementing class does not bind any abstract generic type
3+
--FILE--
4+
<?php
5+
6+
interface I<T> {
7+
public function foo(T $param): T;
8+
}
9+
10+
class C implements I {
11+
public function foo(float $param): float {}
12+
}
13+
14+
?>
15+
--EXPECTF--
16+
Fatal error: Cannot implement I as it has generic parameters which are not specified in %s on line %d
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Implementing class does not bind any abstract generic type
3+
--FILE--
4+
<?php
5+
6+
interface I<T : int|string> {
7+
public function foo(T $param): T;
8+
}
9+
10+
class C implements I {
11+
public function foo(float $param): float {}
12+
}
13+
14+
?>
15+
--EXPECTF--
16+
Fatal error: Cannot implement I as it has generic parameters which are not specified in %s on line %d
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
Implementing class does not bind any abstract generic type
3+
--FILE--
4+
<?php
5+
6+
interface I1<T> {
7+
public function foo(T $param): T;
8+
}
9+
interface I2<T> {
10+
public function bar(T $param): T;
11+
}
12+
13+
class C implements I1<float>, I2 {
14+
public function foo(float $param): float {}
15+
public function bar(string $param): string {}
16+
}
17+
18+
?>
19+
--EXPECTF--
20+
Fatal error: Cannot implement I2 as it has generic parameters which are not specified in %s on line %d
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Abstract generic type behaviour in extended interface
3+
--FILE--
4+
<?php
5+
6+
interface I<T : int|string|(Traversable&Countable)> {
7+
public function foo(T $param): T;
8+
}
9+
10+
interface I2<T> extends I<T> {
11+
public function bar(int $o, T $param): T;
12+
}
13+
14+
class C implements I2<string> {
15+
public function foo(string $param): string {}
16+
public function bar(int $o, float $param): float {}
17+
}
18+
19+
?>
20+
--EXPECTF--
21+
Fatal error: Constraint type mixed of generic type T of interface I2 is not a subtype of the constraint type (Traversable&Countable)|string|int of generic type T of interface I in %s on line %d
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Abstract generic type behaviour in extended interface
3+
--FILE--
4+
<?php
5+
6+
interface I<T : int|string|(Traversable&Countable)> {
7+
public function foo(T $param): T;
8+
}
9+
10+
interface I2<T : int|string|(Traversable&Countable), T2 : float|bool|stdClass> extends I<T> {
11+
public function bar(T2 $o, T $param): T2;
12+
}
13+
14+
class C implements I2<string, float> {
15+
public function foo(string $param): string {}
16+
public function bar(float $o, string $param): float {}
17+
}
18+
19+
?>
20+
DONE
21+
--EXPECT--
22+
DONE
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Abstract generic type behaviour in extended interface
3+
--FILE--
4+
<?php
5+
6+
interface I<T : int|string|(Traversable&Countable)> {
7+
public function foo(T $param): T;
8+
}
9+
10+
interface I2<T : float|bool|stdClass, T2 : int|string|(Traversable&Countable)> extends I<T2> {
11+
public function bar(T $o, T2 $param): T;
12+
}
13+
14+
class C implements I2<float, string> {
15+
public function foo(string $param): string {}
16+
public function bar(float $o, string $param): float {}
17+
}
18+
19+
?>
20+
DONE
21+
--EXPECT--
22+
DONE

0 commit comments

Comments
 (0)