about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2019-09-12 14:32:50 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2019-10-07 17:12:54 +0200
commit28b0e1db5047bd9fe6bcae1caa5eaffe721b2b48 (patch)
treed4cf89c5fbcf28ea6f3066ab7dc6922fec54cf2b /src
parente3cb9ea15a2082f39d4d4f10a22e779701dd0d64 (diff)
downloadrust-28b0e1db5047bd9fe6bcae1caa5eaffe721b2b48.tar.gz
rust-28b0e1db5047bd9fe6bcae1caa5eaffe721b2b48.zip
Add long error explanation for E0495
Diffstat (limited to 'src')
-rw-r--r--src/librustc/error_codes.rs43
1 files changed, 41 insertions, 2 deletions
diff --git a/src/librustc/error_codes.rs b/src/librustc/error_codes.rs
index 502172db91c..4cee132ecae 100644
--- a/src/librustc/error_codes.rs
+++ b/src/librustc/error_codes.rs
@@ -1520,6 +1520,47 @@ where
 ```
 "##,
 
+E0495: r##"
+A lifetime cannot be determined in the given situation.
+
+Erroneous code example:
+
+```compile_fail,E0495
+fn transmute_lifetime<'a, 'b, T>(t: &'a (T,)) -> &'b T {
+    match (&t,) { // error!
+        ((u,),) => u,
+    }
+}
+
+let y = Box::new((42,));
+let x = transmute_lifetime(&y);
+```
+
+In this code, you have two ways to solve this issue:
+ 1. Enforce that `'a` lives at least as long as `'b`.
+ 2. Use the same lifetime requirement for both input and output values.
+
+So for the first solution, you can do it by replacing `'a` with `'a: 'b`:
+
+```
+fn transmute_lifetime<'a: 'b, 'b, T>(t: &'a (T,)) -> &'b T {
+    match (&t,) { // ok!
+        ((u,),) => u,
+    }
+}
+```
+
+In the second you can do it by simply removing `'b` so they both use `'a`:
+
+```
+fn transmute_lifetime<'a, T>(t: &'a (T,)) -> &'a T {
+    match (&t,) { // ok!
+        ((u,),) => u,
+    }
+}
+```
+"##,
+
 E0496: r##"
 A lifetime name is shadowing another lifetime name. Erroneous code example:
 
@@ -2116,8 +2157,6 @@ rejected in your own crates.
     E0488, // lifetime of variable does not enclose its declaration
     E0489, // type/lifetime parameter not in scope here
     E0490, // a value of type `..` is borrowed for too long
-    E0495, // cannot infer an appropriate lifetime due to conflicting
-           // requirements
     E0623, // lifetime mismatch where both parameters are anonymous regions
     E0628, // generators cannot have explicit parameters
     E0631, // type mismatch in closure arguments