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

Add an unreachable!() macro. #8992

Closed

Conversation

chris-morgan
Copy link
Member

Rationale: having a function which fails means that the location of
failure which is output is that of the unreachable() function, rather
than the caller.

This is part of #8991 but is not all of it; current usage of
std::util::unreachable() must remain so for the moment, until a new
snapshot is made; then I will remove that function entirely in favour of
using this macro.

Rationale: having a function which fails means that the location of
failure which is output is that of the unreachable() function, rather
than the caller.

This is part of rust-lang#8991 but is not all of it; current usage of
``std::util::unreachable()`` must remain so for the moment, until a new
snapshot is made; then I will remove that function entirely in favour of
using this macro.
@alexcrichton
Copy link
Member

I'm mostly in favor of this, one mild thing I'm worried about is code bloat. The codegen for a function call is pretty small, but the codegen for the fail! macro could be a lot larger (especially if we're allocating strings).

I think that this will be mostly fixed with format!, but I still need to fully implement those portions.

@brendanzab
Copy link
Member

Nice! I am very much in favor. Codegen is something that can be optimised later.

@huonw
Copy link
Member

huonw commented Sep 5, 2013

In this case it expands to:

::std::sys::FailWithCause::fail_with("internal error: entered unreachable code",
                                     /* file */ "foo.rs", /* line */ 10)

so there's unlikely to be much codegen concern here.

@alexcrichton
Copy link
Member

oh that's perfect. I'm in favor but I'd want another vote or two to r+ it b/c it's a nontrivial change.

@brson
Copy link
Contributor

brson commented Sep 5, 2013

lgtm

bors added a commit that referenced this pull request Sep 5, 2013
Rationale: having a function which fails means that the location of
failure which is output is that of the unreachable() function, rather
than the caller.

This is part of #8991 but is not all of it; current usage of
``std::util::unreachable()`` must remain so for the moment, until a new
snapshot is made; then I will remove that function entirely in favour of
using this macro.
@bors bors closed this Sep 5, 2013
chris-morgan added a commit to chris-morgan/rust that referenced this pull request Sep 19, 2013
This is the second of two parts of rust-lang#8991, now possible as a new snapshot
has been made. (The first part implemented the unreachable!() macro; it
was rust-lang#8992, 6b7b8f2.)

``std::util::unreachable()`` is removed summarily; any code which used
it should now use the ``unreachable!()`` macro.

Closes rust-lang#9312.

Closes rust-lang#8991.
bors added a commit that referenced this pull request Sep 20, 2013
…-two-containing-the-destruction-of-the-unreachable-function, r=alexcrichton

This is the second of two parts of #8991, now possible as a new snapshot
has been made. (The first part implemented the unreachable!() macro; it
was #8992, 6b7b8f2.)

``std::util::unreachable()`` is removed summarily; any code which used
it should now use the ``unreachable!()`` macro.

Closes #9312.

Closes #8991.
Jarcho pushed a commit to Jarcho/rust that referenced this pull request Aug 29, 2022
feat(fix): Do not lint if the target code is inside a loop

close rust-lang#8753

we consider the following code.

```rust
fn main() {
    let vec = vec![1];
    let w: Vec<usize> = vec.iter().map(|i| i * i).collect();  // <- once.

    for i in 0..2 {
        let _ = w.contains(&i);
    }
}
```

and the clippy will issue the following warning.

```rust
warning: avoid using `collect()` when not needed
 --> src/main.rs:3:51
  |
3 |     let w: Vec<usize> = vec.iter().map(|i| i * i).collect();
  |                                                   ^^^^^^^
...
6 |         let _ = w.contains(&i);
  |                 -------------- the iterator could be used here instead
  |
  = note: `#[warn(clippy::needless_collect)]` on by default
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_collect
help: check if the original Iterator contains an element instead of collecting then checking
  |
3 ~
4 |
5 |     for i in 0..2 {
6 ~         let _ = vec.iter().map(|i| i * i).any(|x| x == i);
```

Rewrite the code as indicated.

```rust
fn main() {
    let vec = vec![1];

    for i in 0..2 {
        let _ = vec.iter().map(|i| i * i).any(|x| x == i);  // <- execute `map` every loop.
    }
}
```

this code is valid in the compiler, but, it is different from the code before the rewrite.
So, we should not lint, If `collect` is outside of a loop.

Thank you in advance.

---

changelog: Do not lint if the target code is inside a loop in `needless_collect`
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.

6 participants