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

[WIP] Fix bug with exception variable reuse in deferred node. #2290

Merged
merged 5 commits into from
Oct 25, 2016

Conversation

gvanrossum
Copy link
Member

@gvanrossum
Copy link
Member Author

@JukkaL Can you think of a way to make the test fail if somehow the function no longer makes it into the deferred_nodes queue? If not I think this fine to merge.

@JukkaL
Copy link
Collaborator

JukkaL commented Oct 20, 2016

What about having a test option to print out the names of deferred functions at the end of a test case? Deferred type checking has some pretty tricky potential failure modes so good tests are important. Otherwise, some of our tests that are supposedly testing deferred nodes might actually only require a single pass.

@gvanrossum gvanrossum changed the title Fix bug with exception variable reuse in deferred node. [WIP] Fix bug with exception variable reuse in deferred node. Oct 20, 2016
@gvanrossum
Copy link
Member Author

Continued discussion in #1748 indicates this fix is wrong!

@JukkaL
Copy link
Collaborator

JukkaL commented Oct 25, 2016

This looks reasonable to me. It's probably not the cleanest fix for this issue but we can live with it. Add a TODO comment about a potentially cleaner approach and this is ready to merge. (Also discussed this offline.)

@gvanrossum gvanrossum merged commit 91faa26 into master Oct 25, 2016
@gvanrossum
Copy link
Member Author

OK, with @JukkaL's approval, merged @ecprice's solution. It works!

@gvanrossum gvanrossum deleted the deferred-exc branch October 25, 2016 15:54
Michael0x2a added a commit to Michael0x2a/mypy that referenced this pull request Sep 1, 2022
This diff:

- Fixes python#8129
- Fixes python#13043
- Fixes python#13167

For more concise repros of these various issues, see the modified
test files. But in short, there were two broad categories of errors:

1.  Within the deferred pass, we tend to infer 'Any' for the types of
    different variables instead of the actual type. This interacts
    badly with our unreachable and disallow-any checks and causes
    spurious errors.

    Arguably, the better way of handling this error is to only collect
    errors during the final pass. I briefly experimented with this
    approach, but was unable to find a clean, efficient, and
    non-disruptive way of implementing this. So, I settled for
    sprinkling in a few more `not self.current_node_deferred` checks.

2.  The 'self.msg.disallowed_any_type(...)` call is normally guarded
    behind a `not self.chk.current_node_deferred` check. However, we
    were bypassing this check for `except` block assignments because
    we were deliberately setting that flag to False to work around some
    bug. For more context, see python#2290.

    It appears we no longer need this patch anymore. I'm not entirely
    sure why, but I'm guessing we tightened and fixed the underlying
    problem with deferred passes some time during the past half-decade.
Michael0x2a added a commit to Michael0x2a/mypy that referenced this pull request Sep 2, 2022
This diff:

- Fixes python#8129
- Fixes python#13043
- Fixes python#13167

For more concise repros of these various issues, see the modified
test files. But in short, there were two broad categories of errors:

1.  Within the deferred pass, we tend to infer 'Any' for the types of
    different variables instead of the actual type. This interacts
    badly with our unreachable and disallow-any checks and causes
    spurious errors.

    Arguably, the better way of handling this error is to only collect
    errors during the final pass. I briefly experimented with this
    approach, but was unable to find a clean, efficient, and
    non-disruptive way of implementing this. So, I settled for
    sprinkling in a few more `not self.current_node_deferred` checks.

2.  The 'self.msg.disallowed_any_type(...)` call is normally guarded
    behind a `not self.chk.current_node_deferred` check. However, we
    were bypassing this check for `except` block assignments because
    we were deliberately setting that flag to False to work around some
    bug. For more context, see python#2290.

    It appears we no longer need this patch anymore. I'm not entirely
    sure why, but I'm guessing we tightened and fixed the underlying
    problem with deferred passes some time during the past half-decade.
hauntsaninja pushed a commit that referenced this pull request Sep 2, 2022
…#13575)

This diff:

- Fixes #8129
- Fixes #13043
- Fixes #13167

For more concise repros of these various issues, see the modified test files. But in short, there were two broad categories of errors:

1.  Within the deferred pass, we tend to infer 'Any' for the types of different variables instead of the actual type. This interacts badly with our unreachable and disallow-any checks and causes spurious errors.

    Arguably, the better way of handling this error is to only collect errors during the final pass. I briefly experimented with this
    approach, but was unable to find a clean, efficient, and non-disruptive way of implementing this. So, I settled for sprinkling in a few more `not self.current_node_deferred` checks.

2.  The `self.msg.disallowed_any_type(...)` call is normally guarded behind a `not self.chk.current_node_deferred` check. However, we were bypassing this check for `except` block assignments because we were deliberately setting that flag to False to work around some bug. For more context, see #2290.

    It appears we no longer need this patch anymore. I'm not entirely sure why, but I'm guessing we tightened and fixed the underlying problem with deferred passes some time during the past half-decade.
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

Successfully merging this pull request may close these issues.

2 participants