diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs
index 775ebb48402aa..36ce117fa2bbf 100644
--- a/compiler/rustc_metadata/src/rmeta/decoder.rs
+++ b/compiler/rustc_metadata/src/rmeta/decoder.rs
@@ -774,17 +774,8 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
 
     fn opt_item_ident(self, item_index: DefIndex, sess: &Session) -> Option<Ident> {
         let name = self.opt_item_name(item_index)?;
-        let span = match self.root.tables.def_ident_span.get(self, item_index) {
-            Some(lazy_span) => lazy_span.decode((self, sess)),
-            None => {
-                // FIXME: this weird case of a name with no span is specific to `extern crate`
-                // items, which are supposed to be treated like `use` items and only be encoded
-                // to metadata as `Export`s, return `None` because that's what all the callers
-                // expect in this case.
-                assert_eq!(self.def_kind(item_index), DefKind::ExternCrate);
-                return None;
-            }
-        };
+        let span =
+            self.root.tables.def_ident_span.get(self, item_index).unwrap().decode((self, sess));
         Some(Ident::new(name, span))
     }
 
diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs
index 1425c5467af87..d4b55eb0a13ee 100644
--- a/compiler/rustc_metadata/src/rmeta/encoder.rs
+++ b/compiler/rustc_metadata/src/rmeta/encoder.rs
@@ -31,7 +31,7 @@ use rustc_serialize::{opaque, Encodable, Encoder};
 use rustc_session::config::CrateType;
 use rustc_session::cstore::{ForeignModule, LinkagePreference, NativeLib};
 use rustc_span::hygiene::{ExpnIndex, HygieneEncodeContext, MacroKind};
-use rustc_span::symbol::{sym, Ident, Symbol};
+use rustc_span::symbol::{sym, Symbol};
 use rustc_span::{
     self, DebuggerVisualizerFile, ExternalSource, FileName, SourceFile, Span, SyntaxContext,
 };
@@ -1011,6 +1011,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
             record!(self.tables.def_span[def_id] <- tcx.def_span(def_id));
             self.encode_attrs(local_id);
             record!(self.tables.expn_that_defined[def_id] <- self.tcx.expn_that_defined(def_id));
+            if let Some(ident_span) = tcx.def_ident_span(def_id) {
+                record!(self.tables.def_ident_span[def_id] <- ident_span);
+            }
             if def_kind.has_codegen_attrs() {
                 record!(self.tables.codegen_fn_attrs[def_id] <- self.tcx.codegen_fn_attrs(def_id));
             }
@@ -1075,7 +1078,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
             assert!(f.did.is_local());
             f.did.index
         }));
-        self.encode_ident_span(def_id, variant.ident(tcx));
         self.encode_item_type(def_id);
         if variant.ctor_kind == CtorKind::Fn {
             // FIXME(eddyb) encode signature only in `encode_enum_variant_ctor`.
@@ -1167,7 +1169,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
         debug!("EncodeContext::encode_field({:?})", def_id);
 
         record!(self.tables.kind[def_id] <- EntryKind::Field);
-        self.encode_ident_span(def_id, field.ident(self.tcx));
         self.encode_item_type(def_id);
     }
 
@@ -1246,7 +1247,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
                 record!(self.tables.kind[def_id] <- EntryKind::AssocType(container));
             }
         }
-        self.encode_ident_span(def_id, ast_item.ident);
         match trait_item.kind {
             ty::AssocKind::Const | ty::AssocKind::Fn => {
                 self.encode_item_type(def_id);
@@ -1310,7 +1310,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
                 record!(self.tables.kind[def_id] <- EntryKind::AssocType(container));
             }
         }
-        self.encode_ident_span(def_id, impl_item.ident(self.tcx));
         self.encode_item_type(def_id);
         if let Some(trait_item_def_id) = impl_item.trait_item_def_id {
             self.tables.trait_item_def_id.set(def_id.index, trait_item_def_id.into());
@@ -1412,8 +1411,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
 
         debug!("EncodeContext::encode_info_for_item({:?})", def_id);
 
-        self.encode_ident_span(def_id, item.ident);
-
         let entry_kind = match item.kind {
             hir::ItemKind::Static(..) => EntryKind::Static,
             hir::ItemKind::Const(_, body_id) => {
@@ -1959,7 +1956,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
                 record!(self.tables.kind[def_id] <- EntryKind::ForeignType);
             }
         }
-        self.encode_ident_span(def_id, nitem.ident);
         self.encode_item_type(def_id);
         if let hir::ForeignItemKind::Fn(..) = nitem.kind {
             record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id));
@@ -2041,10 +2037,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
         }
     }
 
-    fn encode_ident_span(&mut self, def_id: DefId, ident: Ident) {
-        record!(self.tables.def_ident_span[def_id] <- ident.span);
-    }
-
     /// In some cases, along with the item itself, we also
     /// encode some sub-items. Usually we want some info from the item
     /// so it's easier to do that here then to wait until we would encounter
diff --git a/compiler/rustc_middle/src/hir/map/mod.rs b/compiler/rustc_middle/src/hir/map/mod.rs
index 779af7a382765..f3cb9a16df5cf 100644
--- a/compiler/rustc_middle/src/hir/map/mod.rs
+++ b/compiler/rustc_middle/src/hir/map/mod.rs
@@ -910,27 +910,33 @@ impl<'hir> Map<'hir> {
         }
     }
 
+    #[inline]
+    fn opt_ident(self, id: HirId) -> Option<Ident> {
+        match self.get(id) {
+            Node::Binding(&Pat { kind: PatKind::Binding(_, _, ident, _), .. }) => Some(ident),
+            // A `Ctor` doesn't have an identifier itself, but its parent
+            // struct/variant does. Compare with `hir::Map::opt_span`.
+            Node::Ctor(..) => match self.find(self.get_parent_node(id))? {
+                Node::Item(item) => Some(item.ident),
+                Node::Variant(variant) => Some(variant.ident),
+                _ => unreachable!(),
+            },
+            node => node.ident(),
+        }
+    }
+
+    #[inline]
+    pub(super) fn opt_ident_span(self, id: HirId) -> Option<Span> {
+        self.opt_ident(id).map(|ident| ident.span)
+    }
+
+    #[inline]
     pub fn opt_name(self, id: HirId) -> Option<Symbol> {
-        Some(match self.get(id) {
-            Node::Item(i) => i.ident.name,
-            Node::ForeignItem(fi) => fi.ident.name,
-            Node::ImplItem(ii) => ii.ident.name,
-            Node::TraitItem(ti) => ti.ident.name,
-            Node::Variant(v) => v.ident.name,
-            Node::Field(f) => f.ident.name,
-            Node::Lifetime(lt) => lt.name.ident().name,
-            Node::GenericParam(param) => param.name.ident().name,
-            Node::Binding(&Pat { kind: PatKind::Binding(_, _, l, _), .. }) => l.name,
-            Node::Ctor(..) => self.name(HirId::make_owner(self.get_parent_item(id))),
-            _ => return None,
-        })
+        self.opt_ident(id).map(|ident| ident.name)
     }
 
     pub fn name(self, id: HirId) -> Symbol {
-        match self.opt_name(id) {
-            Some(name) => name,
-            None => bug!("no name for {}", self.node_to_string(id)),
-        }
+        self.opt_name(id).unwrap_or_else(|| bug!("no name for {}", self.node_to_string(id)))
     }
 
     /// Given a node ID, gets a list of attributes associated with the AST
@@ -1005,7 +1011,7 @@ impl<'hir> Map<'hir> {
     }
 
     pub fn span_if_local(self, id: DefId) -> Option<Span> {
-        id.as_local().and_then(|id| self.opt_span(self.local_def_id_to_hir_id(id)))
+        if id.is_local() { Some(self.tcx.def_span(id)) } else { None }
     }
 
     pub fn res_span(self, res: Res) -> Option<Span> {
diff --git a/compiler/rustc_middle/src/hir/mod.rs b/compiler/rustc_middle/src/hir/mod.rs
index b50f121eff24f..34ed5788c54c0 100644
--- a/compiler/rustc_middle/src/hir/mod.rs
+++ b/compiler/rustc_middle/src/hir/mod.rs
@@ -121,7 +121,16 @@ pub fn provide(providers: &mut Providers) {
     providers.hir_attrs =
         |tcx, id| tcx.hir_crate(()).owners[id].as_owner().map_or(AttributeMap::EMPTY, |o| &o.attrs);
     providers.source_span = |tcx, def_id| tcx.resolutions(()).definitions.def_span(def_id);
-    providers.def_span = |tcx, def_id| tcx.hir().span_if_local(def_id).unwrap_or(DUMMY_SP);
+    providers.def_span = |tcx, def_id| {
+        let def_id = def_id.expect_local();
+        let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
+        tcx.hir().opt_span(hir_id).unwrap_or(DUMMY_SP)
+    };
+    providers.def_ident_span = |tcx, def_id| {
+        let def_id = def_id.expect_local();
+        let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
+        tcx.hir().opt_ident_span(hir_id)
+    };
     providers.fn_arg_names = |tcx, id| {
         let hir = tcx.hir();
         let hir_id = hir.local_def_id_to_hir_id(id.expect_local());
diff --git a/compiler/rustc_ty_utils/src/ty.rs b/compiler/rustc_ty_utils/src/ty.rs
index 8056198b20c21..38ae6a25b1806 100644
--- a/compiler/rustc_ty_utils/src/ty.rs
+++ b/compiler/rustc_ty_utils/src/ty.rs
@@ -5,7 +5,6 @@ use rustc_middle::ty::subst::Subst;
 use rustc_middle::ty::{
     self, Binder, EarlyBinder, Predicate, PredicateKind, ToPredicate, Ty, TyCtxt,
 };
-use rustc_span::Span;
 use rustc_trait_selection::traits;
 
 fn sized_constraint_for_ty<'tcx>(
@@ -103,21 +102,6 @@ fn adt_sized_constraint(tcx: TyCtxt<'_>, def_id: DefId) -> ty::AdtSizedConstrain
     ty::AdtSizedConstraint(result)
 }
 
-fn def_ident_span(tcx: TyCtxt<'_>, def_id: DefId) -> Option<Span> {
-    tcx.hir()
-        .get_if_local(def_id)
-        .and_then(|node| match node {
-            // A `Ctor` doesn't have an identifier itself, but its parent
-            // struct/variant does. Compare with `hir::Map::opt_span`.
-            hir::Node::Ctor(ctor) => ctor
-                .ctor_hir_id()
-                .and_then(|ctor_id| tcx.hir().find(tcx.hir().get_parent_node(ctor_id)))
-                .and_then(|parent| parent.ident()),
-            _ => node.ident(),
-        })
-        .map(|ident| ident.span)
-}
-
 /// See `ParamEnv` struct definition for details.
 #[instrument(level = "debug", skip(tcx))]
 fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamEnv<'_> {
@@ -480,7 +464,6 @@ pub fn provide(providers: &mut ty::query::Providers) {
     *providers = ty::query::Providers {
         asyncness,
         adt_sized_constraint,
-        def_ident_span,
         param_env,
         param_env_reveal_all_normalized,
         instance_def_size_estimate,
diff --git a/src/test/ui/closures/issue-87461.stderr b/src/test/ui/closures/issue-87461.stderr
index b35fa2b8c9aba..0e788a16eb041 100644
--- a/src/test/ui/closures/issue-87461.stderr
+++ b/src/test/ui/closures/issue-87461.stderr
@@ -5,6 +5,12 @@ LL |     Ok(())
    |     -- ^^ expected `u16`, found `()`
    |     |
    |     arguments to this enum variant are incorrect
+   |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/result.rs:LL:COL
+   |
+LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^
 
 error[E0308]: mismatched types
   --> $DIR/issue-87461.rs:17:8
@@ -13,6 +19,12 @@ LL |     Ok(())
    |     -- ^^ expected `u16`, found `()`
    |     |
    |     arguments to this enum variant are incorrect
+   |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/result.rs:LL:COL
+   |
+LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^
 
 error[E0308]: mismatched types
   --> $DIR/issue-87461.rs:26:12
@@ -21,6 +33,12 @@ LL |         Ok(())
    |         -- ^^ expected `u16`, found `()`
    |         |
    |         arguments to this enum variant are incorrect
+   |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/result.rs:LL:COL
+   |
+LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/const-generics/const-argument-cross-crate-mismatch.stderr b/src/test/ui/const-generics/const-argument-cross-crate-mismatch.stderr
index 42f469d981781..d5eefd3575365 100644
--- a/src/test/ui/const-generics/const-argument-cross-crate-mismatch.stderr
+++ b/src/test/ui/const-generics/const-argument-cross-crate-mismatch.stderr
@@ -5,6 +5,12 @@ LL |     let _ = const_generic_lib::function(const_generic_lib::Struct([0u8, 1u8
    |                                         ------------------------- ^^^^^^^^^^ expected an array with a fixed size of 3 elements, found one with 2 elements
    |                                         |
    |                                         arguments to this struct are incorrect
+   |
+note: tuple struct defined here
+  --> $DIR/auxiliary/const_generic_lib.rs:1:12
+   |
+LL | pub struct Struct<const N: usize>(pub [u8; N]);
+   |            ^^^^^^
 
 error[E0308]: mismatched types
   --> $DIR/const-argument-cross-crate-mismatch.rs:8:65
@@ -13,6 +19,12 @@ LL |     let _: const_generic_lib::Alias = const_generic_lib::Struct([0u8, 1u8,
    |                                       ------------------------- ^^^^^^^^^^^^^^^ expected an array with a fixed size of 2 elements, found one with 3 elements
    |                                       |
    |                                       arguments to this struct are incorrect
+   |
+note: tuple struct defined here
+  --> $DIR/auxiliary/const_generic_lib.rs:1:12
+   |
+LL | pub struct Struct<const N: usize>(pub [u8; N]);
+   |            ^^^^^^
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/mismatched_types/issue-35030.stderr b/src/test/ui/mismatched_types/issue-35030.stderr
index f0dea75001c2c..5ea9bcfc122cb 100644
--- a/src/test/ui/mismatched_types/issue-35030.stderr
+++ b/src/test/ui/mismatched_types/issue-35030.stderr
@@ -11,6 +11,11 @@ LL |         Some(true)
    |
    = note: expected type parameter `bool` (type parameter `bool`)
                         found type `bool` (`bool`)
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/pattern/pat-tuple-field-count-cross.stderr b/src/test/ui/pattern/pat-tuple-field-count-cross.stderr
index cab8d4759df64..07b678bc8731a 100644
--- a/src/test/ui/pattern/pat-tuple-field-count-cross.stderr
+++ b/src/test/ui/pattern/pat-tuple-field-count-cross.stderr
@@ -198,20 +198,19 @@ LL | pub struct S(pub u8, pub u8, pub u8);
 error[E0023]: this pattern has 0 fields, but the corresponding tuple struct has 3 fields
   --> $DIR/pat-tuple-field-count-cross.rs:24:9
    |
-LL |           M() => {}
-   |           ^^^ expected 3 fields, found 0
+LL |         M() => {}
+   |         ^^^ expected 3 fields, found 0
    |
-  ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:5:1
+  ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:5:12
    |
-LL | / pub struct M(
-LL | |     pub u8,
-   | |     ------
-LL | |     pub u8,
-   | |     ------
-LL | |     pub u8,
-   | |     ------ tuple struct has 3 fields
-LL | | );
-   | |__- tuple struct defined here
+LL | pub struct M(
+   |            - tuple struct defined here
+LL |     pub u8,
+   |     ------
+LL |     pub u8,
+   |     ------
+LL |     pub u8,
+   |     ------ tuple struct has 3 fields
    |
 help: use `_` to explicitly ignore each field
    |
@@ -225,20 +224,19 @@ LL |         M(..) => {}
 error[E0023]: this pattern has 1 field, but the corresponding tuple struct has 3 fields
   --> $DIR/pat-tuple-field-count-cross.rs:25:11
    |
-LL |           M(1) => {}
-   |             ^ expected 3 fields, found 1
+LL |         M(1) => {}
+   |           ^ expected 3 fields, found 1
    |
-  ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:5:1
+  ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:5:12
    |
-LL | / pub struct M(
-LL | |     pub u8,
-   | |     ------
-LL | |     pub u8,
-   | |     ------
-LL | |     pub u8,
-   | |     ------ tuple struct has 3 fields
-LL | | );
-   | |__- tuple struct defined here
+LL | pub struct M(
+   |            - tuple struct defined here
+LL |     pub u8,
+   |     ------
+LL |     pub u8,
+   |     ------
+LL |     pub u8,
+   |     ------ tuple struct has 3 fields
    |
 help: use `_` to explicitly ignore each field
    |
@@ -252,20 +250,19 @@ LL |         M(1, ..) => {}
 error[E0023]: this pattern has 2 fields, but the corresponding tuple struct has 3 fields
   --> $DIR/pat-tuple-field-count-cross.rs:26:11
    |
-LL |           M(xyz, abc) => {}
-   |             ^^^  ^^^ expected 3 fields, found 2
+LL |         M(xyz, abc) => {}
+   |           ^^^  ^^^ expected 3 fields, found 2
    |
-  ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:5:1
+  ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:5:12
    |
-LL | / pub struct M(
-LL | |     pub u8,
-   | |     ------
-LL | |     pub u8,
-   | |     ------
-LL | |     pub u8,
-   | |     ------ tuple struct has 3 fields
-LL | | );
-   | |__- tuple struct defined here
+LL | pub struct M(
+   |            - tuple struct defined here
+LL |     pub u8,
+   |     ------
+LL |     pub u8,
+   |     ------
+LL |     pub u8,
+   |     ------ tuple struct has 3 fields
    |
 help: use `_` to explicitly ignore each field
    |
@@ -275,20 +272,19 @@ LL |         M(xyz, abc, _) => {}
 error[E0023]: this pattern has 4 fields, but the corresponding tuple struct has 3 fields
   --> $DIR/pat-tuple-field-count-cross.rs:27:11
    |
-LL |           M(1, 2, 3, 4) => {}
-   |             ^  ^  ^  ^ expected 3 fields, found 4
+LL |         M(1, 2, 3, 4) => {}
+   |           ^  ^  ^  ^ expected 3 fields, found 4
    |
-  ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:5:1
+  ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:5:12
    |
-LL | / pub struct M(
-LL | |     pub u8,
-   | |     ------
-LL | |     pub u8,
-   | |     ------
-LL | |     pub u8,
-   | |     ------ tuple struct has 3 fields
-LL | | );
-   | |__- tuple struct defined here
+LL | pub struct M(
+   |            - tuple struct defined here
+LL |     pub u8,
+   |     ------
+LL |     pub u8,
+   |     ------
+LL |     pub u8,
+   |     ------ tuple struct has 3 fields
 
 error[E0023]: this pattern has 1 field, but the corresponding tuple variant has 0 fields
   --> $DIR/pat-tuple-field-count-cross.rs:36:16
@@ -438,20 +434,19 @@ LL |     S(u8, u8, u8),
 error[E0023]: this pattern has 0 fields, but the corresponding tuple variant has 3 fields
   --> $DIR/pat-tuple-field-count-cross.rs:52:9
    |
-LL |           E2::M() => {}
-   |           ^^^^^^^ expected 3 fields, found 0
+LL |         E2::M() => {}
+   |         ^^^^^^^ expected 3 fields, found 0
    |
   ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:15:5
    |
-LL | /     M(
-LL | |         u8,
-   | |         --
-LL | |         u8,
-   | |         --
-LL | |         u8,
-   | |         -- tuple variant has 3 fields
-LL | |     ),
-   | |_____- tuple variant defined here
+LL |     M(
+   |     - tuple variant defined here
+LL |         u8,
+   |         --
+LL |         u8,
+   |         --
+LL |         u8,
+   |         -- tuple variant has 3 fields
    |
 help: use `_` to explicitly ignore each field
    |
@@ -465,20 +460,19 @@ LL |         E2::M(..) => {}
 error[E0023]: this pattern has 1 field, but the corresponding tuple variant has 3 fields
   --> $DIR/pat-tuple-field-count-cross.rs:53:15
    |
-LL |           E2::M(1) => {}
-   |                 ^ expected 3 fields, found 1
+LL |         E2::M(1) => {}
+   |               ^ expected 3 fields, found 1
    |
   ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:15:5
    |
-LL | /     M(
-LL | |         u8,
-   | |         --
-LL | |         u8,
-   | |         --
-LL | |         u8,
-   | |         -- tuple variant has 3 fields
-LL | |     ),
-   | |_____- tuple variant defined here
+LL |     M(
+   |     - tuple variant defined here
+LL |         u8,
+   |         --
+LL |         u8,
+   |         --
+LL |         u8,
+   |         -- tuple variant has 3 fields
    |
 help: use `_` to explicitly ignore each field
    |
@@ -492,20 +486,19 @@ LL |         E2::M(1, ..) => {}
 error[E0023]: this pattern has 2 fields, but the corresponding tuple variant has 3 fields
   --> $DIR/pat-tuple-field-count-cross.rs:54:15
    |
-LL |           E2::M(xyz, abc) => {}
-   |                 ^^^  ^^^ expected 3 fields, found 2
+LL |         E2::M(xyz, abc) => {}
+   |               ^^^  ^^^ expected 3 fields, found 2
    |
   ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:15:5
    |
-LL | /     M(
-LL | |         u8,
-   | |         --
-LL | |         u8,
-   | |         --
-LL | |         u8,
-   | |         -- tuple variant has 3 fields
-LL | |     ),
-   | |_____- tuple variant defined here
+LL |     M(
+   |     - tuple variant defined here
+LL |         u8,
+   |         --
+LL |         u8,
+   |         --
+LL |         u8,
+   |         -- tuple variant has 3 fields
    |
 help: use `_` to explicitly ignore each field
    |
@@ -515,20 +508,19 @@ LL |         E2::M(xyz, abc, _) => {}
 error[E0023]: this pattern has 4 fields, but the corresponding tuple variant has 3 fields
   --> $DIR/pat-tuple-field-count-cross.rs:55:15
    |
-LL |           E2::M(1, 2, 3, 4) => {}
-   |                 ^  ^  ^  ^ expected 3 fields, found 4
+LL |         E2::M(1, 2, 3, 4) => {}
+   |               ^  ^  ^  ^ expected 3 fields, found 4
    |
   ::: $DIR/auxiliary/declarations-for-tuple-field-count-errors.rs:15:5
    |
-LL | /     M(
-LL | |         u8,
-   | |         --
-LL | |         u8,
-   | |         --
-LL | |         u8,
-   | |         -- tuple variant has 3 fields
-LL | |     ),
-   | |_____- tuple variant defined here
+LL |     M(
+   |     - tuple variant defined here
+LL |         u8,
+   |         --
+LL |         u8,
+   |         --
+LL |         u8,
+   |         -- tuple variant has 3 fields
 
 error: aborting due to 28 previous errors
 
diff --git a/src/test/ui/span/missing-unit-argument.stderr b/src/test/ui/span/missing-unit-argument.stderr
index c8e1a23288751..e68260e4a0940 100644
--- a/src/test/ui/span/missing-unit-argument.stderr
+++ b/src/test/ui/span/missing-unit-argument.stderr
@@ -4,6 +4,11 @@ error[E0061]: this enum variant takes 1 argument but 0 arguments were supplied
 LL |     let _: Result<(), String> = Ok();
    |                                 ^^-- an argument of type `()` is missing
    |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/result.rs:LL:COL
+   |
+LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^
 help: provide the argument
    |
 LL |     let _: Result<(), String> = Ok(());
diff --git a/src/test/ui/suggestions/args-instead-of-tuple-errors.stderr b/src/test/ui/suggestions/args-instead-of-tuple-errors.stderr
index 991dde30629e9..aacbe1d9efb1f 100644
--- a/src/test/ui/suggestions/args-instead-of-tuple-errors.stderr
+++ b/src/test/ui/suggestions/args-instead-of-tuple-errors.stderr
@@ -8,6 +8,11 @@ LL |     let _: Option<(i32, bool)> = Some(1, 2);
    |
    = note: expected tuple `(i32, bool)`
                found type `{integer}`
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 help: remove the extra argument
    |
 LL |     let _: Option<(i32, bool)> = Some({(i32, bool)});
@@ -39,6 +44,11 @@ error[E0061]: this enum variant takes 1 argument but 0 arguments were supplied
 LL |     let _: Option<(i8,)> = Some();
    |                            ^^^^-- an argument of type `(i8,)` is missing
    |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 help: provide the argument
    |
 LL |     let _: Option<(i8,)> = Some({(i8,)});
@@ -54,6 +64,11 @@ LL |     let _: Option<(i32,)> = Some(5_usize);
    |
    = note: expected tuple `(i32,)`
                found type `usize`
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 
 error[E0308]: mismatched types
   --> $DIR/args-instead-of-tuple-errors.rs:17:34
@@ -65,6 +80,11 @@ LL |     let _: Option<(i32,)> = Some((5_usize));
    |
    = note: expected tuple `(i32,)`
                found type `usize`
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 
 error: aborting due to 5 previous errors
 
diff --git a/src/test/ui/suggestions/args-instead-of-tuple.stderr b/src/test/ui/suggestions/args-instead-of-tuple.stderr
index 7ec10e88142c1..f6d158782dad2 100644
--- a/src/test/ui/suggestions/args-instead-of-tuple.stderr
+++ b/src/test/ui/suggestions/args-instead-of-tuple.stderr
@@ -4,6 +4,11 @@ error[E0061]: this enum variant takes 1 argument but 2 arguments were supplied
 LL |     let _: Result<(i32, i8), ()> = Ok(1, 2);
    |                                    ^^
    |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/result.rs:LL:COL
+   |
+LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^
 help: use parentheses to construct a tuple
    |
 LL |     let _: Result<(i32, i8), ()> = Ok((1, 2));
@@ -15,6 +20,11 @@ error[E0061]: this enum variant takes 1 argument but 3 arguments were supplied
 LL |     let _: Option<(i32, i8, &'static str)> = Some(1, 2, "hi");
    |                                              ^^^^
    |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 help: use parentheses to construct a tuple
    |
 LL |     let _: Option<(i32, i8, &'static str)> = Some((1, 2, "hi"));
@@ -26,6 +36,11 @@ error[E0061]: this enum variant takes 1 argument but 0 arguments were supplied
 LL |     let _: Option<()> = Some();
    |                         ^^^^-- an argument of type `()` is missing
    |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 help: provide the argument
    |
 LL |     let _: Option<()> = Some(());
@@ -41,6 +56,11 @@ LL |     let _: Option<(i32,)> = Some(3);
    |
    = note: expected tuple `(i32,)`
                found type `{integer}`
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 help: use a trailing comma to create a tuple with one element
    |
 LL |     let _: Option<(i32,)> = Some((3,));
@@ -56,6 +76,11 @@ LL |     let _: Option<(i32,)> = Some((3));
    |
    = note: expected tuple `(i32,)`
                found type `{integer}`
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 help: use a trailing comma to create a tuple with one element
    |
 LL |     let _: Option<(i32,)> = Some((3,));
diff --git a/src/test/ui/typeck/issue-46112.stderr b/src/test/ui/typeck/issue-46112.stderr
index 9346150750128..91381e8ef4acf 100644
--- a/src/test/ui/typeck/issue-46112.stderr
+++ b/src/test/ui/typeck/issue-46112.stderr
@@ -8,6 +8,11 @@ LL | fn main() { test(Ok(())); }
    |
    = note:   expected enum `Option<()>`
            found unit type `()`
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/result.rs:LL:COL
+   |
+LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^
 help: try wrapping the expression in `Some`
    |
 LL | fn main() { test(Ok(Some(()))); }
diff --git a/src/test/ui/typeck/struct-enum-wrong-args.stderr b/src/test/ui/typeck/struct-enum-wrong-args.stderr
index 721b2c821efec..aafb29f25d0bd 100644
--- a/src/test/ui/typeck/struct-enum-wrong-args.stderr
+++ b/src/test/ui/typeck/struct-enum-wrong-args.stderr
@@ -4,6 +4,11 @@ error[E0061]: this enum variant takes 1 argument but 2 arguments were supplied
 LL |     let _ = Some(3, 2);
    |             ^^^^    - argument unexpected
    |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/option.rs:LL:COL
+   |
+LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^^^
 help: remove the extra argument
    |
 LL |     let _ = Some(3);
@@ -17,6 +22,11 @@ LL |     let _ = Ok(3, 6, 2);
    |                   |
    |                   argument unexpected
    |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/result.rs:LL:COL
+   |
+LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^
 help: remove the extra arguments
    |
 LL |     let _ = Ok(3);
@@ -28,6 +38,11 @@ error[E0061]: this enum variant takes 1 argument but 0 arguments were supplied
 LL |     let _ = Ok();
    |             ^^-- an argument is missing
    |
+note: tuple variant defined here
+  --> $SRC_DIR/core/src/result.rs:LL:COL
+   |
+LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
+   |     ^^
 help: provide the argument
    |
 LL |     let _ = Ok({_});