about summary refs log tree commit diff
path: root/compiler/rustc_error_codes
diff options
context:
space:
mode:
authorMatthew Kelly <matthew.kelly2@gmail.com>2022-08-19 06:27:31 -0400
committerMatthew Kelly <matthew.kelly2@gmail.com>2022-08-19 06:46:37 -0400
commitfa91980d2d686d3f426a2cae1d0e8fd6825d2d94 (patch)
tree721f3338bfe28410f3378bfc56f5a6f41b838913 /compiler/rustc_error_codes
parent6c943bad02626dddc5e5135b23c77429b6e4a063 (diff)
downloadrust-fa91980d2d686d3f426a2cae1d0e8fd6825d2d94.tar.gz
rust-fa91980d2d686d3f426a2cae1d0e8fd6825d2d94.zip
Add long description and test for E0311
Adds a long description and unit test for the E0311 compiler error.
Diffstat (limited to 'compiler/rustc_error_codes')
-rw-r--r--compiler/rustc_error_codes/src/error_codes.rs2
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0311.md49
2 files changed, 50 insertions, 1 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes.rs b/compiler/rustc_error_codes/src/error_codes.rs
index 854625579ee..1e86d159668 100644
--- a/compiler/rustc_error_codes/src/error_codes.rs
+++ b/compiler/rustc_error_codes/src/error_codes.rs
@@ -159,6 +159,7 @@ E0307: include_str!("./error_codes/E0307.md"),
 E0308: include_str!("./error_codes/E0308.md"),
 E0309: include_str!("./error_codes/E0309.md"),
 E0310: include_str!("./error_codes/E0310.md"),
+E0311: include_str!("./error_codes/E0311.md"),
 E0312: include_str!("./error_codes/E0312.md"),
 E0316: include_str!("./error_codes/E0316.md"),
 E0317: include_str!("./error_codes/E0317.md"),
@@ -568,7 +569,6 @@ E0790: include_str!("./error_codes/E0790.md"),
 //  E0300, // unexpanded macro
 //  E0304, // expected signed integer constant
 //  E0305, // expected constant
-    E0311, // thing may not live long enough
     E0313, // lifetime of borrowed pointer outlives lifetime of captured
            // variable
 //  E0314, // closure outlives stack frame
diff --git a/compiler/rustc_error_codes/src/error_codes/E0311.md b/compiler/rustc_error_codes/src/error_codes/E0311.md
new file mode 100644
index 00000000000..8b5daaaa178
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0311.md
@@ -0,0 +1,49 @@
+E0311 occurs when there is insufficient information for the rust compiler to
+prove that some time has a long enough lifetime.
+
+Erroneous code example:
+
+```compile_fail, E0311
+use std::borrow::BorrowMut;
+
+trait NestedBorrowMut<U, V> {
+    fn nested_borrow_mut(&mut self) -> &mut V;
+}
+
+impl<T, U, V> NestedBorrowMut<U, V> for T
+where
+    T: BorrowMut<U>,
+    U: BorrowMut<V>,  // missing lifetime specifier here --> compile fail
+{
+    fn nested_borrow_mut(&mut self) -> &mut V {
+        self.borrow_mut().borrow_mut()
+    }
+}
+```
+
+In this example we have a trait that borrows some inner data element of type V
+from an outer type T, through an intermediate type U. The compiler is unable to
+prove that the livetime of U is long enough to support the reference, so it
+throws E0311. To fix the issue we can explicitly add lifetime specifiers to the
+trait, which link the lifetimes of the various data types and allow the code
+to compile.
+
+Working implementation of the `NestedBorrowMut` trait:
+
+```
+use std::borrow::BorrowMut;
+
+trait NestedBorrowMut<'a, U, V> {
+    fn nested_borrow_mut(& 'a mut self) -> &'a mut V;
+}
+
+impl<'a, T, U, V> NestedBorrowMut<'a, U, V> for T
+where
+    T: BorrowMut<U>,
+    U: BorrowMut<V> + 'a,
+{
+    fn nested_borrow_mut(&'a mut self) -> &'a mut V {
+        self.borrow_mut().borrow_mut()
+    }
+}
+```