File tree Expand file tree Collapse file tree 3 files changed +30
-1
lines changed
Expand file tree Collapse file tree 3 files changed +30
-1
lines changed Original file line number Diff line number Diff line change 22
33namespace PHPStan \Type \Accessory ;
44
5+ use Closure ;
56use PHPStan \PhpDocParser \Ast \Type \IdentifierTypeNode ;
67use PHPStan \PhpDocParser \Ast \Type \TypeNode ;
78use PHPStan \Reflection \ClassMemberAccessAnswerer ;
@@ -83,7 +84,11 @@ public function isSubTypeOf(Type $otherType): IsSuperTypeOfResult
8384 return $ otherType ->isSuperTypeOf ($ this );
8485 }
8586
86- if ($ this ->isCallable ()->yes () && $ otherType ->isCallable ()->yes ()) {
87+ if (
88+ $ this ->isCallable ()->yes ()
89+ && $ otherType ->isCallable ()->yes ()
90+ && !($ otherType ->isObject ()->yes () && $ otherType ->isInstanceOf (Closure::class)->yes ())
91+ ) {
8792 return IsSuperTypeOfResult::createYes ();
8893 }
8994
Original file line number Diff line number Diff line change @@ -1619,6 +1619,12 @@ public function testBug13980(): void
16191619 $ this ->assertNoErrors ($ errors );
16201620 }
16211621
1622+ public function testBug13975 (): void
1623+ {
1624+ $ errors = $ this ->runAnalyse (__DIR__ . '/data/bug-13975.php ' );
1625+ $ this ->assertNoErrors ($ errors );
1626+ }
1627+
16221628 /**
16231629 * @param string[]|null $allAnalysedFiles
16241630 * @return list<Error>
Original file line number Diff line number Diff line change 1+ <?php declare (strict_types=1 );
2+
3+ namespace Bug13975 ;
4+
5+ function foo (): callable
6+ {
7+ return new class () {
8+ public function __invoke (): void
9+ {
10+ }
11+ };
12+ }
13+
14+ $ foo = foo ();
15+
16+ if (\is_object ($ foo ) && method_exists ($ foo , '__invoke ' ) && !$ foo instanceof \Closure) {
17+ echo 'true ' ;
18+ }
You can’t perform that action at this time.
0 commit comments