summaryrefslogtreecommitdiff
path: root/src/ir/analysis/derive_default.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir/analysis/derive_default.rs')
-rw-r--r--src/ir/analysis/derive_default.rs167
1 files changed, 99 insertions, 68 deletions
diff --git a/src/ir/analysis/derive_default.rs b/src/ir/analysis/derive_default.rs
index dd837f8c..74e05cd6 100644
--- a/src/ir/analysis/derive_default.rs
+++ b/src/ir/analysis/derive_default.rs
@@ -1,19 +1,19 @@
//! Determining which types for which we can emit `#[derive(Default)]`.
-use super::{ConstrainResult, MonotoneFramework, HasVtable};
-use std::collections::HashSet;
-use std::collections::HashMap;
+use super::{ConstrainResult, HasVtable, MonotoneFramework};
+use ir::comp::CompKind;
+use ir::comp::Field;
+use ir::comp::FieldMethods;
use ir::context::{BindgenContext, ItemId};
+use ir::derive::CanTriviallyDeriveDefault;
use ir::item::IsOpaque;
+use ir::item::ItemSet;
use ir::traversal::EdgeKind;
+use ir::traversal::Trace;
use ir::ty::RUST_DERIVE_IN_ARRAY_LIMIT;
use ir::ty::TypeKind;
-use ir::comp::Field;
-use ir::comp::FieldMethods;
-use ir::derive::CanTriviallyDeriveDefault;
-use ir::comp::CompKind;
-use ir::traversal::Trace;
-use ir::item::ItemSet;
+use std::collections::HashMap;
+use std::collections::HashSet;
/// An analysis that finds for each IR item whether default cannot be derived.
///
@@ -31,7 +31,8 @@ use ir::item::ItemSet;
/// or field cannot be derived default.
#[derive(Debug, Clone)]
pub struct CannotDeriveDefault<'ctx, 'gen>
- where 'gen: 'ctx
+where
+ 'gen: 'ctx,
{
ctx: &'ctx BindgenContext<'gen>,
@@ -97,18 +98,15 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
let mut dependencies = HashMap::new();
let cannot_derive_default = HashSet::new();
- let whitelisted_items: HashSet<_> = ctx.whitelisted_items()
- .iter()
- .cloned()
- .collect();
+ let whitelisted_items: HashSet<_> =
+ ctx.whitelisted_items().iter().cloned().collect();
- let whitelisted_and_blacklisted_items: ItemSet = whitelisted_items.iter()
+ let whitelisted_and_blacklisted_items: ItemSet = whitelisted_items
+ .iter()
.cloned()
.flat_map(|i| {
let mut reachable = vec![i];
- i.trace(ctx, &mut |s, _| {
- reachable.push(s);
- }, &());
+ i.trace(ctx, &mut |s, _| { reachable.push(s); }, &());
reachable
})
.collect();
@@ -119,14 +117,20 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
{
// We reverse our natural IR graph edges to find dependencies
// between nodes.
- item.trace(ctx, &mut |sub_item: ItemId, edge_kind| {
- if ctx.whitelisted_items().contains(&sub_item) &&
- Self::consider_edge(edge_kind) {
- dependencies.entry(sub_item)
+ item.trace(
+ ctx,
+ &mut |sub_item: ItemId, edge_kind| {
+ if ctx.whitelisted_items().contains(&sub_item) &&
+ Self::consider_edge(edge_kind)
+ {
+ dependencies
+ .entry(sub_item)
.or_insert(vec![])
.push(item);
}
- }, &());
+ },
+ &(),
+ );
}
}
@@ -171,7 +175,10 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
};
}
- if ty.layout(self.ctx).map_or(false, |l| l.align > RUST_DERIVE_IN_ARRAY_LIMIT) {
+ if ty.layout(self.ctx).map_or(false, |l| {
+ l.align > RUST_DERIVE_IN_ARRAY_LIMIT
+ })
+ {
// We have to be conservative: the struct *could* have enough
// padding that we emit an array that is longer than
// `RUST_DERIVE_IN_ARRAY_LIMIT`. If we moved padding calculations
@@ -192,7 +199,7 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
}
TypeKind::Void |
- TypeKind::Named |
+ TypeKind::TypeParam |
TypeKind::Reference(..) |
TypeKind::NullPtr |
TypeKind::Pointer(..) |
@@ -207,8 +214,10 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
TypeKind::Array(t, len) => {
if self.cannot_derive_default.contains(&t) {
- trace!(" arrays of T for which we cannot derive Default \
- also cannot derive Default");
+ trace!(
+ " arrays of T for which we cannot derive Default \
+ also cannot derive Default"
+ );
return self.insert(id);
}
@@ -225,12 +234,16 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
TypeKind::TemplateAlias(t, _) |
TypeKind::Alias(t) => {
if self.cannot_derive_default.contains(&t) {
- trace!(" aliases and type refs to T which cannot derive \
- Default also cannot derive Default");
+ trace!(
+ " aliases and type refs to T which cannot derive \
+ Default also cannot derive Default"
+ );
self.insert(id)
} else {
- trace!(" aliases and type refs to T which can derive \
- Default can also derive Default");
+ trace!(
+ " aliases and type refs to T which can derive \
+ Default can also derive Default"
+ );
ConstrainResult::Same
}
}
@@ -247,9 +260,10 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
return self.insert(id);
}
- if ty.layout(self.ctx)
- .map_or(true,
- |l| l.opaque().can_trivially_derive_default()) {
+ if ty.layout(self.ctx).map_or(true, |l| {
+ l.opaque().can_trivially_derive_default()
+ })
+ {
trace!(" union layout can trivially derive Default");
return ConstrainResult::Same;
} else {
@@ -263,35 +277,40 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
return self.insert(id);
}
- let bases_cannot_derive = info.base_members()
- .iter()
- .any(|base| !self.ctx.whitelisted_items().contains(&base.ty) ||
- self.cannot_derive_default.contains(&base.ty));
+ let bases_cannot_derive =
+ info.base_members().iter().any(|base| {
+ !self.ctx.whitelisted_items().contains(&base.ty) ||
+ self.cannot_derive_default.contains(&base.ty)
+ });
if bases_cannot_derive {
- trace!(" base members cannot derive Default, so we can't \
- either");
+ trace!(
+ " base members cannot derive Default, so we can't \
+ either"
+ );
return self.insert(id);
}
- let fields_cannot_derive = info.fields()
- .iter()
- .any(|f| {
- match *f {
- Field::DataMember(ref data) => {
- !self.ctx.whitelisted_items().contains(&data.ty()) ||
- self.cannot_derive_default.contains(&data.ty())
- }
- Field::Bitfields(ref bfu) => {
- bfu.bitfields()
- .iter().any(|b| {
- !self.ctx.whitelisted_items().contains(&b.ty()) ||
- self.cannot_derive_default.contains(&b.ty())
- })
- }
+ let fields_cannot_derive =
+ info.fields().iter().any(|f| match *f {
+ Field::DataMember(ref data) => {
+ !self.ctx.whitelisted_items().contains(
+ &data.ty(),
+ ) ||
+ self.cannot_derive_default.contains(&data.ty())
+ }
+ Field::Bitfields(ref bfu) => {
+ bfu.bitfields().iter().any(|b| {
+ !self.ctx.whitelisted_items().contains(
+ &b.ty(),
+ ) ||
+ self.cannot_derive_default.contains(&b.ty())
+ })
}
});
if fields_cannot_derive {
- trace!(" fields cannot derive Default, so we can't either");
+ trace!(
+ " fields cannot derive Default, so we can't either"
+ );
return self.insert(id);
}
@@ -300,13 +319,19 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
}
TypeKind::TemplateInstantiation(ref template) => {
- if self.ctx.whitelisted_items().contains(&template.template_definition()) {
- let args_cannot_derive = template.template_arguments()
- .iter()
- .any(|arg| self.cannot_derive_default.contains(&arg));
+ if self.ctx.whitelisted_items().contains(
+ &template.template_definition(),
+ )
+ {
+ let args_cannot_derive =
+ template.template_arguments().iter().any(|arg| {
+ self.cannot_derive_default.contains(&arg)
+ });
if args_cannot_derive {
- trace!(" template args cannot derive Default, so \
- insantiation can't either");
+ trace!(
+ " template args cannot derive Default, so \
+ insantiation can't either"
+ );
return self.insert(id);
}
@@ -314,18 +339,23 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
!template.template_definition().is_opaque(self.ctx, &()),
"The early ty.is_opaque check should have handled this case"
);
- let def_cannot_derive = self.cannot_derive_default
- .contains(&template.template_definition());
+ let def_cannot_derive =
+ self.cannot_derive_default.contains(&template
+ .template_definition());
if def_cannot_derive {
- trace!(" template definition cannot derive Default, so \
- insantiation can't either");
+ trace!(
+ " template definition cannot derive Default, so \
+ insantiation can't either"
+ );
return self.insert(id);
}
trace!(" template instantiation can derive Default");
ConstrainResult::Same
} else {
- trace!(" blacklisted template instantiation cannot derive default");
+ trace!(
+ " blacklisted template instantiation cannot derive default"
+ );
return self.insert(id);
}
}
@@ -345,7 +375,8 @@ impl<'ctx, 'gen> MonotoneFramework for CannotDeriveDefault<'ctx, 'gen> {
}
fn each_depending_on<F>(&self, id: ItemId, mut f: F)
- where F: FnMut(ItemId),
+ where
+ F: FnMut(ItemId),
{
if let Some(edges) = self.dependencies.get(&id) {
for item in edges {