]> git.lizzy.rs Git - rust.git/blobdiff - compiler/rustc_resolve/src/late/diagnostics.rs
Use the same message as type & const generics.
[rust.git] / compiler / rustc_resolve / src / late / diagnostics.rs
index b77bcaad3542e189493ce8b9dac69908fc12f1f5..9213652e35f8e0e98a38f38773cebe5cf4e3dffe 100644 (file)
@@ -2037,84 +2037,31 @@ pub(crate) fn maybe_emit_forbidden_non_static_lifetime_error(
     }
 }
 
-#[derive(Copy, Clone, PartialEq)]
-enum ShadowKind {
-    Label,
-    Lifetime,
-}
-#[derive(Copy, Clone)]
-pub struct Original {
-    kind: ShadowKind,
-    span: Span,
-    param: bool,
-}
-#[derive(Copy, Clone)]
-pub struct Shadower {
-    kind: ShadowKind,
-    span: Span,
-}
-
-pub fn original_label(span: Span) -> Original {
-    Original { kind: ShadowKind::Label, span, param: false }
-}
-pub fn shadower_label(span: Span) -> Shadower {
-    Shadower { kind: ShadowKind::Label, span }
-}
-pub fn original_lifetime(span: Span) -> Original {
-    Original { kind: ShadowKind::Lifetime, span, param: false }
-}
-pub fn original_lifetime_param(span: Span) -> Original {
-    Original { kind: ShadowKind::Lifetime, span, param: true }
-}
-pub fn shadower_lifetime(span: Span) -> Shadower {
-    Shadower { kind: ShadowKind::Lifetime, span }
-}
-
-impl ShadowKind {
-    fn desc(&self) -> &'static str {
-        match *self {
-            ShadowKind::Label => "label",
-            ShadowKind::Lifetime => "lifetime",
-        }
-    }
+/// Report lifetime/lifetime shadowing as an error.
+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();
 }
 
-pub fn signal_shadowing_problem(sess: &Session, name: Symbol, orig: Original, shadower: Shadower) {
-    let mut err = if let (ShadowKind::Lifetime, ShadowKind::Lifetime) = (orig.kind, shadower.kind) {
-        // lifetime/lifetime shadowing is an error
-        if orig.param {
-            struct_span_err!(
-                sess,
-                shadower.span,
-                E0263,
-                "lifetime name `{}` declared twice in the same scope",
-                name,
-            )
-        } else {
-            struct_span_err!(
-                sess,
-                shadower.span,
-                E0496,
-                "lifetime name `{}` shadows a lifetime name that is already in scope",
-                name,
-            )
-        }
-        .forget_guarantee()
-    } else {
-        // shadowing involving a label is only a warning, due to issues with
-        // labels and lifetimes not being macro-hygienic.
-        sess.struct_span_warn(
-            shadower.span,
-            &format!(
-                "{} name `{}` shadows a {} name that is already in scope",
-                shadower.kind.desc(),
-                name,
-                orig.kind.desc()
-            ),
-        )
-    };
-    err.span_label(orig.span, "first declared here");
-    err.span_label(shadower.span, format!("{} `{}` already in scope", orig.kind.desc(), name));
+/// Shadowing involving a label is only a warning for historical reasons.
+//FIXME: make this a proper lint.
+pub fn signal_label_shadowing(sess: &Session, orig: Span, shadower: Ident) {
+    let name = shadower.name;
+    let shadower = shadower.span;
+    let mut err = sess.struct_span_warn(
+        shadower,
+        &format!("label name `{}` shadows a label name that is already in scope", name),
+    );
+    err.span_label(orig, "first declared here");
+    err.span_label(shadower, format!("label `{}` already in scope", name));
     err.emit();
 }