+#### Note: this error code is no longer emitted by the compiler.
+
A lifetime was declared more than once in the same scope.
Erroneous code example:
-```compile_fail,E0263
+```compile_fail,E0403
fn foo<'a, 'b, 'a>(x: &'a str, y: &'b str, z: &'a str) { // error!
}
```
let mut function_value_rib = Rib::new(kind);
let mut function_lifetime_rib = LifetimeRib::new(lifetime_kind);
let mut seen_bindings = FxHashMap::default();
- // Store all seen lifetimes names, and whether they were created in the currently processed
- // parameter set.
- let mut seen_lifetimes = FxHashMap::default();
+ // Store all seen lifetimes names from outer scopes.
+ let mut seen_lifetimes = FxHashSet::default();
// We also can't shadow bindings from the parent item
if let AssocItemRibKind = kind {
// Forbid shadowing lifetime bindings
for rib in self.lifetime_ribs.iter().rev() {
- seen_lifetimes.extend(rib.bindings.iter().map(|(ident, _)| (*ident, false)));
+ seen_lifetimes.extend(rib.bindings.iter().map(|(ident, _)| *ident));
if let LifetimeRibKind::Item = rib.kind {
break;
}
let ident = param.ident.normalize_to_macros_2_0();
debug!("with_generic_param_rib: {}", param.id);
- if let GenericParamKind::Lifetime = param.kind {
- match seen_lifetimes.entry(ident) {
- Entry::Occupied(entry) => {
- let original = *entry.key();
- let orig_is_param = *entry.get();
- diagnostics::signal_lifetime_shadowing(
- self.r.session,
- original,
- param.ident,
- orig_is_param,
- );
+ if let GenericParamKind::Lifetime = param.kind
+ && let Some(&original) = seen_lifetimes.get(&ident)
+ {
+ diagnostics::signal_lifetime_shadowing(self.r.session, original, param.ident);
+ // Record lifetime res, so lowering knows there is something fishy.
+ self.record_lifetime_res(param.id, LifetimeRes::Error);
+ continue;
+ }
+
+ match seen_bindings.entry(ident) {
+ Entry::Occupied(entry) => {
+ let span = *entry.get();
+ let err = ResolutionError::NameAlreadyUsedInParameterList(ident.name, span);
+ self.report_error(param.ident.span, err);
+ if let GenericParamKind::Lifetime = param.kind {
// Record lifetime res, so lowering knows there is something fishy.
self.record_lifetime_res(param.id, LifetimeRes::Error);
continue;
}
- Entry::Vacant(entry) => {
- entry.insert(true);
- }
}
- } else {
- match seen_bindings.entry(ident) {
- Entry::Occupied(entry) => {
- let span = *entry.get();
- let err = ResolutionError::NameAlreadyUsedInParameterList(ident.name, span);
- self.report_error(param.ident.span, err);
- }
- Entry::Vacant(entry) => {
- entry.insert(param.ident.span);
- }
+ Entry::Vacant(entry) => {
+ entry.insert(param.ident.span);
}
}
}
/// Report lifetime/lifetime shadowing as an error.
-pub fn signal_lifetime_shadowing(
- sess: &Session,
- orig: Ident,
- shadower: Ident,
- orig_is_param: bool,
-) {
- let mut err = if orig_is_param {
- struct_span_err!(
- sess,
- shadower.span,
- E0263,
- "lifetime name `{}` declared twice in the same scope",
- orig.name,
- )
- } else {
- struct_span_err!(
- sess,
- shadower.span,
- E0496,
- "lifetime name `{}` shadows a lifetime name that is already in scope",
- orig.name,
- )
- };
+pub fn signal_lifetime_shadowing(sess: &Session, orig: Ident, shadower: Ident) {
+ let mut err = struct_span_err!(
+ sess,
+ shadower.span,
+ E0496,
+ "lifetime name `{}` shadows a lifetime name that is already in scope",
+ orig.name,
+ );
err.span_label(orig.span, "first declared here");
err.span_label(shadower.span, format!("lifetime `{}` already in scope", orig.name));
err.emit();
fn foo<'a, 'b, 'a>(x: &'a str, y: &'b str) {
- //~^ ERROR E0263
+ //~^ ERROR E0403
}
fn main() {}
-error[E0263]: lifetime name `'a` declared twice in the same scope
+error[E0403]: the name `'a` is already used for a generic parameter in this item's generic parameters
--> $DIR/E0263.rs:1:16
|
LL | fn foo<'a, 'b, 'a>(x: &'a str, y: &'b str) {
- | -- ^^ lifetime `'a` already in scope
+ | -- ^^ already used
| |
- | first declared here
+ | first use of `'a`
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0263`.
+For more information about this error, try `rustc --explain E0403`.
#[rustc_macro_transparency = "semitransparent"]
macro m($a:lifetime) {
- fn g<$a, 'a>() {} //~ ERROR lifetime name `'a` declared twice
+ fn g<$a, 'a>() {} //~ ERROR the name `'a` is already used for a generic parameter
}
#[rustc_macro_transparency = "transparent"]
macro n($a:lifetime) {
- fn h<$a, 'a>() {} //~ ERROR lifetime name `'a` declared twice
+ fn h<$a, 'a>() {} //~ ERROR the name `'a` is already used for a generic parameter
}
m!('a);
-error[E0263]: lifetime name `'a` declared twice in the same scope
+error[E0403]: the name `'a` is already used for a generic parameter in this item's generic parameters
--> $DIR/duplicate_lifetimes.rs:8:14
|
LL | fn g<$a, 'a>() {}
- | ^^ lifetime `'a` already in scope
+ | ^^ already used
...
LL | m!('a);
| ------
| | |
- | | first declared here
+ | | first use of `'a`
| in this macro invocation
|
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
-error[E0263]: lifetime name `'a` declared twice in the same scope
+error[E0403]: the name `'a` is already used for a generic parameter in this item's generic parameters
--> $DIR/duplicate_lifetimes.rs:13:14
|
LL | fn h<$a, 'a>() {}
- | ^^ lifetime `'a` already in scope
+ | ^^ already used
...
LL | n!('a);
| ------
| | |
- | | first declared here
+ | | first use of `'a`
| in this macro invocation
|
= note: this error originates in the macro `n` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 2 previous errors
-For more information about this error, try `rustc --explain E0263`.
+For more information about this error, try `rustc --explain E0403`.
struct Foo<'a, 'a> {
- //~^ ERROR lifetime name `'a` declared twice
+ //~^ ERROR the name `'a` is already used for a generic parameter
x: &'a isize,
}
-error[E0263]: lifetime name `'a` declared twice in the same scope
+error[E0403]: the name `'a` is already used for a generic parameter in this item's generic parameters
--> $DIR/regions-name-duplicated.rs:1:16
|
LL | struct Foo<'a, 'a> {
- | -- ^^ lifetime `'a` already in scope
+ | -- ^^ already used
| |
- | first declared here
+ | first use of `'a`
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0263`.
+For more information about this error, try `rustc --explain E0403`.