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

Lifetime bound error when using the indexing operator with an associated type containing a lifetime #32382

Open
koute opened this Issue Mar 20, 2016 · 11 comments

Comments

Projects
None yet
8 participants
@koute
Copy link
Member

koute commented Mar 20, 2016

Please consider the following code:

use std::marker::PhantomData;
use std::ops::Index;

pub trait Context: Clone {
    type Container: ?Sized;
    fn foobar_1( container: &Self::Container ) -> &str;
    fn foobar_2( container: &Self::Container ) -> &str;
    fn foobar_3( container: &Self::Container ) -> &str;
}

#[derive(Clone)]
struct Foobar<'a> {
    phantom: PhantomData<&'a ()>
}

impl<'a> Context for Foobar<'a> {
    type Container = [&'a str];

    fn foobar_1<'r>( container: &'r [&'a str] ) -> &'r str {
        // This compiles fine.
        container[0]
    }

    fn foobar_2<'r>( container: &'r Self::Container ) -> &'r str {
        // This also compiles fine.
        container.index( 0 )
    }

    fn foobar_3<'r>( container: &'r Self::Container ) -> &'r str {
        // error: `*container[..]` does not live long enough
        container[0]
    }
}

fn main() {}

which fails with the following error:

test.rs:31:9: 31:21 error: `*container[..]` does not live long enough
test.rs:31         container[0]
                   ^~~~~~~~~~~~
test.rs:29:66: 32:6 note: reference must be valid for the lifetime 'r as defined on the block at 29:65...
test.rs:29     fn foobar_3<'r>( container: &'r Self::Container ) -> &'r str {
test.rs:30         // error: `*container[..]` does not live long enough
test.rs:31         container[0]
test.rs:32     }
test.rs:29:66: 32:6 note: ...but borrowed value is only valid for the lifetime 'a as defined on the block at 29:65
test.rs:29     fn foobar_3<'r>( container: &'r Self::Container ) -> &'r str {
test.rs:30         // error: `*container[..]` does not live long enough
test.rs:31         container[0]
test.rs:32     }
error: aborting due to previous error

So if I use .index() and use an associated type it compiles fine. If I use [] and replace the associated type with the underlying type it also compiles fine. Logic would have it that if I use [] and I'll leave the associated type as-is it should also compile fine, but alas, I get an error, which doesn't really make any sense.

Rust version: rustc 1.9.0-nightly (b12b4e4 2016-03-17)

This is a regression; this code used to compile on at least 1.4, 1.5 and 1.6; it broke at 1.7.

@alexcrichton

This comment has been minimized.

Copy link
Member

alexcrichton commented Mar 21, 2016

@alexcrichton

This comment has been minimized.

Copy link
Member

alexcrichton commented Mar 21, 2016

@pnkfelix

This comment has been minimized.

Copy link
Member

pnkfelix commented Jun 23, 2016

I will look at this.

@pnkfelix

This comment has been minimized.

Copy link
Member

pnkfelix commented Jun 23, 2016

marking as P-medium nonetheless, since I am not convinced this needs to high priority...

@nikomatsakis

This comment has been minimized.

Copy link
Contributor

nikomatsakis commented Sep 13, 2016

OK, so, I think this is related to the implied bounds that we compute. We must be somehow failing to add the implied 'a: 'r bound because it is obscured by the Self::Contained (which must not be normalized at the right time or something). I'll have to dig a bit in the code to see why this is the case though.

@nikomatsakis

This comment has been minimized.

Copy link
Contributor

nikomatsakis commented Sep 13, 2016

Well, that doesn't quite explain why the manual call to index works, I guess. Maybe my hypothesis is wrong. I would guess though there's a problem where using the [] operator must be inducing some invariance perhaps?

@Mark-Simulacrum

This comment has been minimized.

Copy link
Member

Mark-Simulacrum commented May 13, 2017

@pnkfelix You are currently assigned to this, are you still investigating?

@eddyb

This comment has been minimized.

Copy link
Member

eddyb commented May 13, 2017

cc @nikomatsakis as well

@JelteF

This comment has been minimized.

Copy link
Contributor

JelteF commented Apr 2, 2018

I'm running into this issue as well when trying to convert get().unwrap() to an index operation on this line:
https://github.com/JelteF/derive_more/blob/2e37e7f8181ba333df9503088222772b77c83d91/src/from.rs#L103

It indeed works fine when manually calling index().

@pnkfelix

This comment has been minimized.

Copy link
Member

pnkfelix commented Oct 4, 2018

I just tried this out with the 2018 edition and it works there. Or on the nightly compiler, one can add #![feature(nll)] to get the fix.

We should add a regression test before closing though.

@pnkfelix pnkfelix added the E-needstest label Oct 4, 2018

pnkfelix added a commit to pnkfelix/rust that referenced this issue Oct 4, 2018

pietroalbini added a commit to pietroalbini/rust that referenced this issue Oct 5, 2018

Rollup merge of rust-lang#54812 - pnkfelix:issue-32382-index-assoc-ty…
…pe-with-lifetime, r=nikomatsakis

Regression test for rust-lang#32382.

bors added a commit that referenced this issue Oct 6, 2018

Auto merge of #54859 - pietroalbini:rollup, r=pietroalbini
Rollup of 11 pull requests

Successful merges:

 - #54078 (Expand the documentation for the `std::sync` module)
 - #54717 (Cleanup rustc/ty part 1)
 - #54781 (Add examples to `TyKind::FnDef` and `TyKind::FnPtr` docs)
 - #54787 (Only warn about unused `mut` in user-written code)
 - #54804 (add suggestion for inverted function parameters)
 - #54812 (Regression test for #32382.)
 - #54833 (make `Parser::parse_foreign_item()` return a foreign item or error)
 - #54834 (rustdoc: overflow:auto doesn't work nicely on small screens)
 - #54838 (Fix typo in src/libsyntax/parse/parser.rs)
 - #54851 (Fix a regression in 1.30 by reverting #53564)
 - #54853 (Remove unneccessary error from test, revealing NLL error.)

Failed merges:

r? @ghost
@pnkfelix

This comment has been minimized.

Copy link
Member

pnkfelix commented Nov 9, 2018

#54812 added the test.

@pnkfelix pnkfelix removed the E-needstest label Nov 9, 2018

@pnkfelix pnkfelix removed their assignment Nov 9, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.