Skip to content

Commit 8dff5dc

Browse files
committed
Support x-crate default fields
1 parent aec444e commit 8dff5dc

File tree

5 files changed

+24
-1
lines changed

5 files changed

+24
-1
lines changed

compiler/rustc_metadata/src/rmeta/decoder.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1104,7 +1104,7 @@ impl<'a> CrateMetadataRef<'a> {
11041104
name: self.item_name(did.index),
11051105
vis: self.get_visibility(did.index),
11061106
safety: self.get_safety(did.index),
1107-
value: None,
1107+
value: self.get_default_field(did.index),
11081108
})
11091109
.collect(),
11101110
adt_kind,
@@ -1170,6 +1170,10 @@ impl<'a> CrateMetadataRef<'a> {
11701170
self.root.tables.safety.get(self, id).unwrap_or_else(|| self.missing("safety", id))
11711171
}
11721172

1173+
fn get_default_field(self, id: DefIndex) -> Option<DefId> {
1174+
self.root.tables.default_fields.get(self, id).map(|d| d.decode(self))
1175+
}
1176+
11731177
fn get_trait_item_def_id(self, id: DefIndex) -> Option<DefId> {
11741178
self.root.tables.trait_item_def_id.get(self, id).map(|d| d.decode_from_cdata(self))
11751179
}

compiler/rustc_metadata/src/rmeta/encoder.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1401,6 +1401,13 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
14011401
continue;
14021402
}
14031403

1404+
if def_kind == DefKind::Field
1405+
&& let hir::Node::Field(field) = tcx.hir_node_by_def_id(local_id)
1406+
&& let Some(anon) = field.default
1407+
{
1408+
record!(self.tables.default_fields[def_id] <- anon.def_id.to_def_id());
1409+
}
1410+
14041411
if should_encode_span(def_kind) {
14051412
let def_span = tcx.def_span(local_id);
14061413
record!(self.tables.def_span[def_id] <- def_span);

compiler/rustc_metadata/src/rmeta/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ define_tables! {
450450
trait_def: Table<DefIndex, LazyValue<ty::TraitDef>>,
451451
trait_item_def_id: Table<DefIndex, RawDefId>,
452452
expn_that_defined: Table<DefIndex, LazyValue<ExpnId>>,
453+
default_fields: Table<DefIndex, LazyValue<DefId>>,
453454
params_in_repr: Table<DefIndex, LazyValue<BitSet<u32>>>,
454455
repr_options: Table<DefIndex, LazyValue<ReprOptions>>,
455456
// `def_keys` and `def_path_hashes` represent a lazy version of a
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#![feature(default_field_values)]
2+
3+
pub struct A {
4+
pub a: isize = 42,
5+
}

tests/ui/structs/default-field-values-support.rs

+6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
//@ run-pass
2+
//@ aux-build:struct_field_default.rs
23
#![feature(default_field_values, generic_const_exprs)]
34
#![allow(unused_variables, dead_code, incomplete_features)]
45

6+
extern crate struct_field_default as xc;
7+
58
pub struct S;
69

710
#[derive(Default)]
@@ -65,4 +68,7 @@ fn main () {
6568
let x = Qux::<i32, 4> { .. };
6669
assert!(matches!(Qux::<i32, 4> { bar: S, baz: 42, bat: 2, baq: 2, bay: 4, .. }, x));
6770
assert!(x.bak.is_empty());
71+
72+
let x = xc::A { .. };
73+
assert!(matches!(xc::A { a: 42 }, x));
6874
}

0 commit comments

Comments
 (0)