Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pyre doesn't understand for-else statement #791

Open
WangGithubUser opened this issue Sep 15, 2023 · 2 comments
Open

Pyre doesn't understand for-else statement #791

WangGithubUser opened this issue Sep 15, 2023 · 2 comments

Comments

@WangGithubUser
Copy link
Contributor

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

@connernilsen
Copy link
Contributor

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.

@ebrahimsofi123
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants