about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-12-07 03:04:51 +0000
committerEsteban Küber <esteban@kuber.com.ar>2024-12-09 21:58:07 +0000
commitfa331f4d0d2d7657c76972574868c5c00afae459 (patch)
treea8847aa02bdaa9ef3dd7ed54a6e60227a4cec9e2
parent0757641f4d89418091a6381a4ad6426769ee0fa8 (diff)
downloadrust-fa331f4d0d2d7657c76972574868c5c00afae459.tar.gz
rust-fa331f4d0d2d7657c76972574868c5c00afae459.zip
Support x-crate default fields
-rw-r--r--compiler/rustc_metadata/src/rmeta/decoder.rs6
-rw-r--r--compiler/rustc_metadata/src/rmeta/encoder.rs7
-rw-r--r--compiler/rustc_metadata/src/rmeta/mod.rs1
-rw-r--r--tests/ui/structs/auxiliary/struct_field_default.rs5
-rw-r--r--tests/ui/structs/default-field-values-support.rs6
5 files changed, 24 insertions, 1 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs
index 4a4930fff9d..b9586338655 100644
--- a/compiler/rustc_metadata/src/rmeta/decoder.rs
+++ b/compiler/rustc_metadata/src/rmeta/decoder.rs
@@ -1104,7 +1104,7 @@ impl<'a> CrateMetadataRef<'a> {
                         name: self.item_name(did.index),
                         vis: self.get_visibility(did.index),
                         safety: self.get_safety(did.index),
-                        value: None,
+                        value: self.get_default_field(did.index),
                     })
                     .collect(),
                 adt_kind,
@@ -1170,6 +1170,10 @@ impl<'a> CrateMetadataRef<'a> {
         self.root.tables.safety.get(self, id).unwrap_or_else(|| self.missing("safety", id))
     }
 
+    fn get_default_field(self, id: DefIndex) -> Option<DefId> {
+        self.root.tables.default_fields.get(self, id).map(|d| d.decode(self))
+    }
+
     fn get_trait_item_def_id(self, id: DefIndex) -> Option<DefId> {
         self.root.tables.trait_item_def_id.get(self, id).map(|d| d.decode_from_cdata(self))
     }
diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs
index d4ea1276d00..5c80d24f502 100644
--- a/compiler/rustc_metadata/src/rmeta/encoder.rs
+++ b/compiler/rustc_metadata/src/rmeta/encoder.rs
@@ -1401,6 +1401,13 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
                 continue;
             }
 
+            if def_kind == DefKind::Field
+                && let hir::Node::Field(field) = tcx.hir_node_by_def_id(local_id)
+                && let Some(anon) = field.default
+            {
+                record!(self.tables.default_fields[def_id] <- anon.def_id.to_def_id());
+            }
+
             if should_encode_span(def_kind) {
                 let def_span = tcx.def_span(local_id);
                 record!(self.tables.def_span[def_id] <- def_span);
diff --git a/compiler/rustc_metadata/src/rmeta/mod.rs b/compiler/rustc_metadata/src/rmeta/mod.rs
index a5e21ab51fd..4961464833a 100644
--- a/compiler/rustc_metadata/src/rmeta/mod.rs
+++ b/compiler/rustc_metadata/src/rmeta/mod.rs
@@ -450,6 +450,7 @@ define_tables! {
     trait_def: Table<DefIndex, LazyValue<ty::TraitDef>>,
     trait_item_def_id: Table<DefIndex, RawDefId>,
     expn_that_defined: Table<DefIndex, LazyValue<ExpnId>>,
+    default_fields: Table<DefIndex, LazyValue<DefId>>,
     params_in_repr: Table<DefIndex, LazyValue<BitSet<u32>>>,
     repr_options: Table<DefIndex, LazyValue<ReprOptions>>,
     // `def_keys` and `def_path_hashes` represent a lazy version of a
diff --git a/tests/ui/structs/auxiliary/struct_field_default.rs b/tests/ui/structs/auxiliary/struct_field_default.rs
new file mode 100644
index 00000000000..b315df5dba2
--- /dev/null
+++ b/tests/ui/structs/auxiliary/struct_field_default.rs
@@ -0,0 +1,5 @@
+#![feature(default_field_values)]
+
+pub struct A {
+    pub a: isize = 42,
+}
diff --git a/tests/ui/structs/default-field-values-support.rs b/tests/ui/structs/default-field-values-support.rs
index bdf21e1272d..da0379af94b 100644
--- a/tests/ui/structs/default-field-values-support.rs
+++ b/tests/ui/structs/default-field-values-support.rs
@@ -1,7 +1,10 @@
 //@ run-pass
+//@ aux-build:struct_field_default.rs
 #![feature(default_field_values, generic_const_exprs)]
 #![allow(unused_variables, dead_code, incomplete_features)]
 
+extern crate struct_field_default as xc;
+
 pub struct S;
 
 #[derive(Default)]
@@ -65,4 +68,7 @@ fn main () {
     let x = Qux::<i32, 4> { .. };
     assert!(matches!(Qux::<i32, 4> { bar: S, baz: 42, bat: 2, baq: 2, bay: 4, .. }, x));
     assert!(x.bak.is_empty());
+
+    let x = xc::A { .. };
+    assert!(matches!(xc::A { a: 42 }, x));
 }