fix: Alloc new errorcode E0803 for E0495
Signed-off-by: xizheyin <xizheyin@smail.nju.edu.cn>
This commit is contained in:
parent
d88ffcdb8b
commit
d22554a996
11 changed files with 65 additions and 18 deletions
46
compiler/rustc_error_codes/src/error_codes/E0803.md
Normal file
46
compiler/rustc_error_codes/src/error_codes/E0803.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
A trait implementation returns a reference without an
|
||||
explicit lifetime linking it to `self`.
|
||||
It commonly arises in generic trait implementations
|
||||
requiring explicit lifetime bounds.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0803
|
||||
trait DataAccess<T> {
|
||||
fn get_ref(&self) -> T;
|
||||
}
|
||||
|
||||
struct Container<'a> {
|
||||
value: &'a f64,
|
||||
}
|
||||
|
||||
// Attempting to implement reference return
|
||||
impl<'a> DataAccess<&f64> for Container<'a> {
|
||||
fn get_ref(&self) -> &f64 { // Error: Lifetime mismatch
|
||||
self.value
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The trait method returns &f64 requiring an independent lifetime
|
||||
The struct Container<'a> carries lifetime parameter 'a
|
||||
The compiler cannot verify if the returned reference satisfies 'a constraints
|
||||
Solution
|
||||
Explicitly bind lifetimes to clarify constraints:
|
||||
```
|
||||
// Modified trait with explicit lifetime binding
|
||||
trait DataAccess<'a, T> {
|
||||
fn get_ref(&'a self) -> T;
|
||||
}
|
||||
|
||||
struct Container<'a> {
|
||||
value: &'a f64,
|
||||
}
|
||||
|
||||
// Correct implementation (bound lifetimes)
|
||||
impl<'a> DataAccess<'a, &'a f64> for Container<'a> {
|
||||
fn get_ref(&'a self) -> &'a f64 {
|
||||
self.value
|
||||
}
|
||||
}
|
||||
```
|
|
@ -546,6 +546,7 @@ E0799: 0799,
|
|||
E0800: 0800,
|
||||
E0801: 0801,
|
||||
E0802: 0802,
|
||||
E0803: 0803,
|
||||
);
|
||||
)
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ use std::iter;
|
|||
|
||||
use rustc_data_structures::fx::FxIndexSet;
|
||||
use rustc_errors::{
|
||||
Applicability, Diag, E0309, E0310, E0311, E0495, Subdiagnostic, struct_span_code_err,
|
||||
Applicability, Diag, E0309, E0310, E0311, E0803, Subdiagnostic, struct_span_code_err,
|
||||
};
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
|
@ -1032,7 +1032,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
struct_span_code_err!(
|
||||
self.dcx(),
|
||||
var_origin.span(),
|
||||
E0495,
|
||||
E0803,
|
||||
"cannot infer an appropriate lifetime{} due to conflicting requirements",
|
||||
var_description
|
||||
)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter 's in generic type due to conflicting requirements
|
||||
error[E0803]: cannot infer an appropriate lifetime for lifetime parameter 's in generic type due to conflicting requirements
|
||||
--> $DIR/impl-implied-bounds-compatibility-unnormalized.rs:11:5
|
||||
|
|
||||
LL | fn get<'s>(s: &'s str, _: <&'static &'s () as Project>::Ty) -> &'static str {
|
||||
|
@ -25,4 +25,4 @@ LL | fn get<'s>(s: &'s str, _: <&'static &'s () as Project>::Ty) -> &'static
|
|||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0803`.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
error[E0803]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
--> $DIR/issue-20831-debruijn.rs:28:33
|
||||
|
|
||||
LL | fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) {
|
||||
|
@ -48,4 +48,4 @@ LL | fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher
|
|||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0803`.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'d` due to conflicting requirements
|
||||
error[E0803]: cannot infer an appropriate lifetime for lifetime parameter `'d` due to conflicting requirements
|
||||
--> $DIR/normalization-bounds-error.rs:12:31
|
||||
|
|
||||
LL | fn visit_seq<'d, 'a: 'd>() -> <&'a () as Visitor<'d>>::Value {}
|
||||
|
@ -36,4 +36,4 @@ LL | fn visit_seq<'d, 'a: 'd>() -> <&'a () as Visitor<'d>>::Value {}
|
|||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0803`.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
error[E0803]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
--> $DIR/regions-normalize-in-where-clause-list.rs:24:4
|
||||
|
|
||||
LL | fn bar<'a, 'b>()
|
||||
|
@ -24,4 +24,4 @@ LL | fn bar<'a, 'b>()
|
|||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0803`.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter '_ in generic type due to conflicting requirements
|
||||
error[E0803]: cannot infer an appropriate lifetime for lifetime parameter '_ in generic type due to conflicting requirements
|
||||
--> $DIR/resolve-re-error-ice.rs:12:5
|
||||
|
|
||||
LL | fn key_set(&self) -> Subject<'a, Keys<K, V>, (), R> {
|
||||
|
@ -34,4 +34,4 @@ LL | struct Subject<'a, T, V, R>(PhantomData<(&'a T, V, R)>);
|
|||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0803`.
|
||||
|
|
|
@ -11,7 +11,7 @@ LL | impl<'a, A: Clone> Arbitrary for ::std::borrow::Cow<'a, A> {}
|
|||
| ^^
|
||||
= note: but lifetime parameter must outlive the static lifetime
|
||||
|
||||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
error[E0803]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
--> $DIR/static-lifetime.rs:3:34
|
||||
|
|
||||
LL | impl<'a, A: Clone> Arbitrary for ::std::borrow::Cow<'a, A> {}
|
||||
|
@ -38,5 +38,5 @@ LL | impl<'a, A: Clone> Arbitrary for ::std::borrow::Cow<'a, A> {}
|
|||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0478, E0495.
|
||||
Some errors have detailed explanations: E0478, E0803.
|
||||
For more information about an error, try `rustc --explain E0478`.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements
|
||||
error[E0803]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements
|
||||
--> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:28
|
||||
|
|
||||
LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
||||
|
@ -24,4 +24,4 @@ LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
|||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
For more information about this error, try `rustc --explain E0803`.
|
||||
|
|
|
@ -15,7 +15,7 @@ note: but lifetime parameter must outlive the lifetime `'b` as defined here
|
|||
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||
| ^^
|
||||
|
||||
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||
error[E0803]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||
--> $DIR/closure_wf_outlives.rs:34:9
|
||||
|
|
||||
LL | || {}
|
||||
|
@ -63,5 +63,5 @@ LL | type Opaque<T: 'static> = impl Sized;
|
|||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0310, E0478, E0495.
|
||||
Some errors have detailed explanations: E0310, E0478, E0803.
|
||||
For more information about an error, try `rustc --explain E0310`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue