Skip to content

iterator_to_array with non-scalar argument resolves to various return types #173

Description

@markkimsal

PHPantom version

phpantom_lsp 0.8.0-62-g05b3ab9a

Installation method

Built from source

Operating system

Linux x86_64

Editor

VS Code

Bug description

iterator_to_array() sometimes returns an Iterator instance and sometimes an array.

iterator_to_array() should return an array for both types:

  • Iterator<string> -> array<string>
  • Iterator<Foo> -> array<Foo>

Steps to reproduce

examples/iterator-to-array-foo.php

<?php

$g = new \Generator();
$q = make_array($g);
$q = make_array_scalar($g);

function take_array(array $array): void { }

/** @param \Iterator<Foo> $iterator */
function make_array(\Iterator $iterator): array {
    return take_array(iterator_to_array($iterator));
}


/** @param \Iterator<string> $iterator */
function make_array_scalar(\Iterator $iterator): array {
    return take_array(iterator_to_array($iterator));
}

class Foo {}

./target/debug/phpantom_lsp analyze examples/iterator-to-array-foo.php

Error output or panic trace

------ ------------------------------------------------------
  Line   examples/iterator-to-array-foo.php
 ------ ------------------------------------------------------
    14   Argument 1 ($array) expects array, got Iterator<Foo>
         🪪  type_mismatch_argument
 ------ ------------------------------------------------------

.phpantom.toml

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions