diff options
| author | Matthew Kelly <matthew.kelly2@gmail.com> | 2022-08-19 06:27:31 -0400 |
|---|---|---|
| committer | Matthew Kelly <matthew.kelly2@gmail.com> | 2022-08-19 06:46:37 -0400 |
| commit | fa91980d2d686d3f426a2cae1d0e8fd6825d2d94 (patch) | |
| tree | 721f3338bfe28410f3378bfc56f5a6f41b838913 /compiler/rustc_error_codes | |
| parent | 6c943bad02626dddc5e5135b23c77429b6e4a063 (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_error_codes/src/error_codes/E0311.md | 49 |
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() + } +} +``` |
