Created
July 20, 2016 00:09
-
-
Save rozbb/8ebb2ce012dd201ad734d3190cfdcd67 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ cat -n associated-types-project-from-hrtb-in-fn-body.rs | |
1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT | |
2 // file at the top-level directory of this distribution and at | |
3 // http://rust-lang.org/COPYRIGHT. | |
4 // | |
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 // option. This file may not be copied, modified, or distributed | |
9 // except according to those terms. | |
10 | |
11 // Check projection of an associated type out of a higher-ranked | |
12 // trait-bound in the context of a function body. | |
13 | |
14 pub trait Foo<T> { | |
15 type A; | |
16 | |
17 fn get(&self, t: T) -> Self::A; | |
18 } | |
19 | |
20 fn foo<'a, I : for<'x> Foo<&'x isize>>( | |
21 x: <I as Foo<&'a isize>>::A) | |
22 { | |
23 let y: I::A = x; | |
24 } | |
25 | |
26 fn bar<'a, 'b, I : for<'x> Foo<&'x isize>>( | |
27 x: <I as Foo<&'a isize>>::A, | |
28 y: <I as Foo<&'b isize>>::A, | |
29 cond: bool) | |
30 { | |
31 // x and y here have two distinct lifetimes: | |
32 let z: I::A = if cond { x } else { y }; | |
33 //~^ ERROR cannot infer | |
34 } | |
35 | |
36 pub fn main() {} | |
######## Expected error message ######## | |
$ rustc associated-types-project-from-hrtb-in-fn-body.rs | |
associated-types-project-from-hrtb-in-fn-body.rs:32:12: 32:16 error: cannot infer an appropriate lifetime for lifetime parameter 'x in trait containing associated type `A` due to conflicting requirements [E0495] | |
associated-types-project-from-hrtb-in-fn-body.rs:32 let z: I::A = if cond { x } else { y }; | |
^~~~ | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 help: consider using an explicit lifetime parameter as shown: fn bar<'a, | |
I: for<'x>Foo<&'x isize>>(x: <I as Foo<&'a isize>>::A, | |
y: <I as Foo<&'b isize>>::A, cond: bool) | |
associated-types-project-from-hrtb-in-fn-body.rs:26 fn bar<'a, 'b, I : for<'x> Foo<&'x isize>>( | |
^ | |
error: aborting due to previous error | |
######## What I got instead ######## | |
$ ./rustc associated-types-project-from-hrtb-in-fn-body.rs | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 error: mismatched types [E0308] | |
associated-types-project-from-hrtb-in-fn-body.rs:26 fn bar<'a, 'b, I : for<'x> Foo<&'x isize>>( | |
^ | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 help: run `rustc --explain E0308` to see a detailed explanation | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 note: expected type `std::marker::Sized` | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 note: found type `std::marker::Sized` | |
associated-types-project-from-hrtb-in-fn-body.rs:30:1: 34:2 note: the lifetime 'a as defined on the block at 30:0... | |
associated-types-project-from-hrtb-in-fn-body.rs:30 { | |
^ | |
associated-types-project-from-hrtb-in-fn-body.rs:30:1: 34:2 note: ...does not necessarily outlive the lifetime 'b as defined on the block at 30:0 | |
associated-types-project-from-hrtb-in-fn-body.rs:30 { | |
^ | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 error: mismatched types [E0308] | |
associated-types-project-from-hrtb-in-fn-body.rs:26 fn bar<'a, 'b, I : for<'x> Foo<&'x isize>>( | |
^ | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 help: run `rustc --explain E0308` to see a detailed explanation | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 note: expected type `std::marker::Sized` | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 note: found type `std::marker::Sized` | |
associated-types-project-from-hrtb-in-fn-body.rs:30:1: 34:2 note: the lifetime 'b as defined on the block at 30:0... | |
associated-types-project-from-hrtb-in-fn-body.rs:30 { | |
^ | |
associated-types-project-from-hrtb-in-fn-body.rs:30:1: 34:2 note: ...does not necessarily outlive the lifetime 'a as defined on the block at 30:0 | |
associated-types-project-from-hrtb-in-fn-body.rs:30 { | |
^ | |
associated-types-project-from-hrtb-in-fn-body.rs:26:1: 34:2 help: consider using an explicit lifetime parameter as shown: fn bar<'a, | |
I: for<'x>Foo<&'x isize>>(x: <I as Foo<&'a isize>>::A, | |
y: <I as Foo<&'b isize>>::A, cond: bool) | |
associated-types-project-from-hrtb-in-fn-body.rs:26 fn bar<'a, 'b, I : for<'x> Foo<&'x isize>>( | |
^ | |
error: aborting due to 2 previous errors |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment