Skip to content

Commit e49abf2

Browse files
petrochenkovMark-Simulacrum
authored andcommitted
def_collector: Do not forget to save indices of fields with multiple attributes
1 parent aa8c758 commit e49abf2

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

src/librustc/hir/map/def_collector.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,16 @@ impl<'a> DefCollector<'a> {
7575
}
7676

7777
fn collect_field(&mut self, field: &'a StructField, index: Option<usize>) {
78+
let index = |this: &Self| index.unwrap_or_else(|| {
79+
let node_id = NodeId::placeholder_from_expn_id(this.expansion);
80+
this.definitions.placeholder_field_index(node_id)
81+
});
82+
7883
if field.is_placeholder {
84+
self.definitions.set_placeholder_field_index(field.id, index(self));
7985
self.visit_macro_invoc(field.id);
8086
} else {
81-
let name = field.ident.map(|ident| ident.name)
82-
.or_else(|| index.map(sym::integer))
83-
.unwrap_or_else(|| {
84-
let node_id = NodeId::placeholder_from_expn_id(self.expansion);
85-
sym::integer(self.definitions.placeholder_field_indices[&node_id])
86-
});
87+
let name = field.ident.map_or_else(|| sym::integer(index(self)), |ident| ident.name);
8788
let def = self.create_def(field.id, DefPathData::ValueNs(name), field.span);
8889
self.with_parent(def, |this| visit::walk_struct_field(this, field));
8990
}
@@ -190,9 +191,6 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
190191
// and every such attribute expands into a single field after it's resolved.
191192
for (index, field) in data.fields().iter().enumerate() {
192193
self.collect_field(field, Some(index));
193-
if field.is_placeholder && field.ident.is_none() {
194-
self.definitions.placeholder_field_indices.insert(field.id, index);
195-
}
196194
}
197195
}
198196

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Duplicate non-builtin attributes can be used on unnamed fields.
2+
3+
// check-pass
4+
5+
struct S (
6+
#[rustfmt::skip]
7+
#[rustfmt::skip]
8+
u8
9+
);
10+
11+
fn main() {}

0 commit comments

Comments
 (0)