pyre-check icon indicating copy to clipboard operation
pyre-check copied to clipboard

Pyre doesn't understand for-else statement

Open WangGithubUser opened this issue 1 year ago • 2 comments

Pyre Bug

Bug description Pyre doesn't understand meaning of for-else.

Reproduction steps Run pyre-check with following script:

from random import randint
def foo() -> None:
    for i in range(randint(1, 10)):
        if i % 5 == 0:
            my_none: None = None
            break
    else:
        return None
    return my_none

Expected behavior This should pass but not give a false positive: test.py:9:11 Uninitialized local [61]: Local variable `my_none` is undefined, or not always defined.

Logs

$ pyre check
ƛ Found 1 type error!
test.py:9:11 Uninitialized local [61]: Local variable `my_none` is undefined, or not always defined.

pyre_rage.log

WangGithubUser avatar Sep 15 '23 10:09 WangGithubUser

Hey @WangGithubUser, thanks for reporting this! I didn't know that for-else loops were a thing until now, it's a cool feature of the language!

As a quick debugging check, I tried doing a similar setup with an if statement, and it looks like the issue doesn't appear there. My guess is that we have an issue with our control flow graph around for-else statements. I'll add this task to our backlog and we'll take a look.

connernilsen avatar Sep 15 '23 19:09 connernilsen

The error you're seeing is because Pyre isn't sure if the variable my_none is always set before it's used. To fix this error i would suggest you to initialize my_none before the loop:

from random import randint

def foo() -> None: my_none = None # Initialize it here for i in range(randint(1, 10)): if i % 5 == 0: my_none = None break else: return None return my_none

I believe that this should resolve the issue

ebrahimsofi123 avatar Apr 15 '24 09:04 ebrahimsofi123

duplicate of #192

yangdanny97 avatar Jul 25 '24 04:07 yangdanny97