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,
|
E0800: 0800,
|
||||||
E0801: 0801,
|
E0801: 0801,
|
||||||
E0802: 0802,
|
E0802: 0802,
|
||||||
|
E0803: 0803,
|
||||||
);
|
);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ use std::iter;
|
||||||
|
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_errors::{
|
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::DefKind;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
|
@ -1032,7 +1032,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||||
struct_span_code_err!(
|
struct_span_code_err!(
|
||||||
self.dcx(),
|
self.dcx(),
|
||||||
var_origin.span(),
|
var_origin.span(),
|
||||||
E0495,
|
E0803,
|
||||||
"cannot infer an appropriate lifetime{} due to conflicting requirements",
|
"cannot infer an appropriate lifetime{} due to conflicting requirements",
|
||||||
var_description
|
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
|
--> $DIR/impl-implied-bounds-compatibility-unnormalized.rs:11:5
|
||||||
|
|
|
|
||||||
LL | fn get<'s>(s: &'s str, _: <&'static &'s () as Project>::Ty) -> &'static str {
|
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
|
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
|
--> $DIR/issue-20831-debruijn.rs:28:33
|
||||||
|
|
|
|
||||||
LL | fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) {
|
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
|
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
|
--> $DIR/normalization-bounds-error.rs:12:31
|
||||||
|
|
|
|
||||||
LL | fn visit_seq<'d, 'a: 'd>() -> <&'a () as Visitor<'d>>::Value {}
|
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
|
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
|
--> $DIR/regions-normalize-in-where-clause-list.rs:24:4
|
||||||
|
|
|
|
||||||
LL | fn bar<'a, 'b>()
|
LL | fn bar<'a, 'b>()
|
||||||
|
@ -24,4 +24,4 @@ LL | fn bar<'a, 'b>()
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
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
|
--> $DIR/resolve-re-error-ice.rs:12:5
|
||||||
|
|
|
|
||||||
LL | fn key_set(&self) -> Subject<'a, Keys<K, V>, (), R> {
|
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
|
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
|
= 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
|
--> $DIR/static-lifetime.rs:3:34
|
||||||
|
|
|
|
||||||
LL | impl<'a, A: Clone> Arbitrary for ::std::borrow::Cow<'a, A> {}
|
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
|
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`.
|
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
|
--> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:28
|
||||||
|
|
|
|
||||||
LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
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
|
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;
|
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
|
--> $DIR/closure_wf_outlives.rs:34:9
|
||||||
|
|
|
|
||||||
LL | || {}
|
LL | || {}
|
||||||
|
@ -63,5 +63,5 @@ LL | type Opaque<T: 'static> = impl Sized;
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
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`.
|
For more information about an error, try `rustc --explain E0310`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue