Skip to content

Fix free lifetime vars in HashMap's iterators #17517

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

Merged
merged 1 commit into from
Sep 27, 2014

Conversation

pczarn
Copy link
Contributor

@pczarn pczarn commented Sep 24, 2014

Fixes #17500

@rust-highfive
Copy link
Contributor

warning Warning warning

  • These commits modify unsafe code. Please review it carefully!

iter: self.raw_buckets(),
table: self,
unsafe {
let iter = mem::transmute(self.raw_buckets());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This just drops the marker, I guess?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we end up moving to randomized layout for all structure not marked #[repr(C)], this may cause this transmute to go awry. Could this take a similar strategy as vectors and transmute to a 'static lifetime?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The type checker requires 'static bounds on parameters otherwise, just like in Vec.

688:27 error: the parameter type `K` may not live long enough; consider adding an explicit lifetime bound `K:'static`...
688:27 note: ...so that the reference type `&collections::hashmap::table::RawTable<K,V>` does not outlive the data it points at

Edit: will do.

@Gankra
Copy link
Contributor

Gankra commented Sep 24, 2014

I think it might also be appropriate to include a compile-fail for the original error case:

fn main() {
    let mut my_stuff = std::collections::HashMap::new();
    my_stuff.insert(0i, 42i);

    let (_, thing) = my_stuff.iter().next().unwrap();

    my_stuff.clear(); // Error: cannot borrow while `thing` still exists

    println!("{}", *thing);
}

Edit: presumably you confirmed this doesn't work anymore?

@pczarn
Copy link
Contributor Author

pczarn commented Sep 24, 2014

Done. Added that test case which is a little different. Other collections don't elide lifetimes in fn iter, is there a reason not to do this?

@Gankra
Copy link
Contributor

Gankra commented Sep 24, 2014

At least for anything I've touched, I wasn't aware that you could elide lifetimes in types. I'm guessing most everywhere else is legacy.

@aturon
Copy link
Member

aturon commented Sep 24, 2014

cc @nikomatsakis

@nikomatsakis
Copy link
Contributor

On Wed, Sep 24, 2014 at 12:17:25PM -0700, Aaron Turon wrote:

cc @nikomatsakis

This just emphasizes I need to rebase my branch implementing variance
and making this sort of bivariance illegal.

@bors bors closed this Sep 27, 2014
@bors bors merged commit 0a10b9d into rust-lang:master Sep 27, 2014
lnicola pushed a commit to lnicola/rust that referenced this pull request Jul 28, 2024
feat: go-to-def and find-references on control-flow keywords

fix rust-lang#17517.

This PR implements **go-to-definition** and **find-references** functionalities for control flow keywords, which is similar to the behaviors in the `highlight-related` module. Besides, this PR also fixes some incorrect behaviors in `highlight-related`.

## Changes

1. **Support for go-to-definition on control flow keywords**:
   This PR introduces functionality allowing users to navigate on the definition of control flow keywords (`return`, `break`, `continue`).
   Commit: 2a3244ee147f898dd828c06352645ae1713c260f..7391e7a608634709db002a4cb09229de4d12c056.

2. **Bug fixes and refactoring in highlight-related**:
   - **Handling return/break/continue within try_blocks**:
     This PR adjusted the behavior of these keywords when they occur within `try_blocks`. When encounter these keywords, the program should exit the outer function or loop which containing the `try_blocks`, rather than the `try_blocks` itself; while the `?` will cause the program to exit `try_blocks`.
     Commit: 59d697e807f0197f59814b37dca1563959da4aa1.
   - **Support highlighting keywords in macro expansion for highlight-related**:
     Commit: 88df24f01727c23a667a763ee3ee0cec22d5ad52.
   - Detailed description for the bug fixes
     + The previous implementation of `preorder_expr` incorrectly treated `try_blocks` as new contexts, thereby r-a will not continue to traverse inner `return` and `break/continue` statements. To resolve this, a new function `preorder_expr_with_ctx_checker` has been added, allowing users to specify which expressions to skip.
       * For example, when searching for the `?` in the context, r-a should skip `try_blocks` where the `?` insides just works for `try_blocks`. But when search for the `return` keyword, r-a should collect both the `return` keywords inside and outside the `try_blocks`
     + Thus, this PR added `WalkExpandedExprCtx` (builder pattern). It offers the following improvements: customizable context skipping, maintenance of loop depth (for `break`/`continue`), and handling macro expansion during traversal.

3. **Support for find-references on control flow keywords**:
   This PR enables users to find all references to control flow keywords.
   Commit: 9202a33f81218fb9c2edb5d42e6b4de85b0323a8.
RalfJung pushed a commit to RalfJung/rust that referenced this pull request Aug 1, 2024
feat: go-to-def and find-references on control-flow keywords

fix rust-lang#17517.

This PR implements **go-to-definition** and **find-references** functionalities for control flow keywords, which is similar to the behaviors in the `highlight-related` module. Besides, this PR also fixes some incorrect behaviors in `highlight-related`.

## Changes

1. **Support for go-to-definition on control flow keywords**:
   This PR introduces functionality allowing users to navigate on the definition of control flow keywords (`return`, `break`, `continue`).
   Commit: 2a3244ee147f898dd828c06352645ae1713c260f..7391e7a608634709db002a4cb09229de4d12c056.

2. **Bug fixes and refactoring in highlight-related**:
   - **Handling return/break/continue within try_blocks**:
     This PR adjusted the behavior of these keywords when they occur within `try_blocks`. When encounter these keywords, the program should exit the outer function or loop which containing the `try_blocks`, rather than the `try_blocks` itself; while the `?` will cause the program to exit `try_blocks`.
     Commit: 59d697e807f0197f59814b37dca1563959da4aa1.
   - **Support highlighting keywords in macro expansion for highlight-related**:
     Commit: 88df24f01727c23a667a763ee3ee0cec22d5ad52.
   - Detailed description for the bug fixes
     + The previous implementation of `preorder_expr` incorrectly treated `try_blocks` as new contexts, thereby r-a will not continue to traverse inner `return` and `break/continue` statements. To resolve this, a new function `preorder_expr_with_ctx_checker` has been added, allowing users to specify which expressions to skip.
       * For example, when searching for the `?` in the context, r-a should skip `try_blocks` where the `?` insides just works for `try_blocks`. But when search for the `return` keyword, r-a should collect both the `return` keywords inside and outside the `try_blocks`
     + Thus, this PR added `WalkExpandedExprCtx` (builder pattern). It offers the following improvements: customizable context skipping, maintenance of loop depth (for `break`/`continue`), and handling macro expansion during traversal.

3. **Support for find-references on control flow keywords**:
   This PR enables users to find all references to control flow keywords.
   Commit: 9202a33f81218fb9c2edb5d42e6b4de85b0323a8.
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.

Possible to mutably borrow elements inside a Vec inside a HashMap multiple times
7 participants