Skip to content

Commit 8660c09

Browse files
committed
TemplateParameters.used_template_params doesn't return Option
1 parent e28cb8a commit 8660c09

File tree

3 files changed

+54
-73
lines changed

3 files changed

+54
-73
lines changed

src/codegen/mod.rs

+42-57
Original file line numberDiff line numberDiff line change
@@ -299,16 +299,11 @@ impl AppendImplicitTemplateParams for quote::Tokens {
299299
_ => {},
300300
}
301301

302-
if let Some(params) = item.used_template_params(ctx) {
303-
if params.is_empty() {
304-
return;
305-
}
306-
307-
let params = params.into_iter().map(|p| {
308-
p.try_to_rust_ty(ctx, &())
309-
.expect("template params cannot fail to be a rust type")
310-
});
311-
302+
let params: Vec<_> = item.used_template_params(ctx).iter().map(|p| {
303+
p.try_to_rust_ty(ctx, &())
304+
.expect("template params cannot fail to be a rust type")
305+
}).collect();
306+
if !params.is_empty() {
312307
self.append_all(quote! {
313308
< #( #params ),* >
314309
});
@@ -633,15 +628,10 @@ impl CodeGenerator for Type {
633628
return;
634629
}
635630

636-
let mut outer_params = item.used_template_params(ctx)
637-
.and_then(|ps| if ps.is_empty() {
638-
None
639-
} else {
640-
Some(ps)
641-
});
631+
let mut outer_params = item.used_template_params(ctx);
642632

643633
let inner_rust_type = if item.is_opaque(ctx, &()) {
644-
outer_params = None;
634+
outer_params = vec![];
645635
self.to_opaque(ctx, item)
646636
} else {
647637
// Its possible that we have better layout information than
@@ -696,7 +686,7 @@ impl CodeGenerator for Type {
696686
'A'...'Z' | 'a'...'z' | '0'...'9' | ':' | '_' | ' ' => true,
697687
_ => false,
698688
}) &&
699-
outer_params.is_none() &&
689+
outer_params.is_empty() &&
700690
inner_item.expect_type().canonical_type(ctx).is_enum()
701691
{
702692
tokens.append_all(quote! {
@@ -715,25 +705,23 @@ impl CodeGenerator for Type {
715705
pub type #rust_name
716706
});
717707

718-
if let Some(params) = outer_params {
719-
let params: Vec<_> = params.into_iter()
720-
.filter_map(|p| p.as_template_param(ctx, &()))
721-
.collect();
722-
if params.iter().any(|p| ctx.resolve_type(*p).is_invalid_type_param()) {
723-
warn!(
724-
"Item contained invalid template \
725-
parameter: {:?}",
726-
item
727-
);
728-
return;
729-
}
730-
731-
let params = params.iter()
732-
.map(|p| {
733-
p.try_to_rust_ty(ctx, &())
734-
.expect("type parameters can always convert to rust ty OK")
735-
});
708+
let params: Vec<_> = outer_params.into_iter()
709+
.filter_map(|p| p.as_template_param(ctx, &()))
710+
.collect();
711+
if params.iter().any(|p| ctx.resolve_type(*p).is_invalid_type_param()) {
712+
warn!(
713+
"Item contained invalid template \
714+
parameter: {:?}",
715+
item
716+
);
717+
return;
718+
}
719+
let params: Vec<_> = params.iter().map(|p| {
720+
p.try_to_rust_ty(ctx, &())
721+
.expect("type parameters can always convert to rust ty OK")
722+
}).collect();
736723

724+
if !params.is_empty() {
737725
tokens.append_all(quote! {
738726
< #( #params ),* >
739727
});
@@ -1415,8 +1403,6 @@ impl CodeGenerator for CompInfo {
14151403
return;
14161404
}
14171405

1418-
let used_template_params = item.used_template_params(ctx);
1419-
14201406
let ty = item.expect_type();
14211407
let layout = ty.layout(ctx);
14221408
let mut packed = self.is_packed(ctx, &layout);
@@ -1598,21 +1584,19 @@ impl CodeGenerator for CompInfo {
15981584

15991585
let mut generic_param_names = vec![];
16001586

1601-
if let Some(ref params) = used_template_params {
1602-
for (idx, ty) in params.iter().enumerate() {
1603-
let param = ctx.resolve_type(*ty);
1604-
let name = param.name().unwrap();
1605-
let ident = ctx.rust_ident(name);
1606-
generic_param_names.push(ident.clone());
1587+
for (idx, ty) in item.used_template_params(ctx).iter().enumerate() {
1588+
let param = ctx.resolve_type(*ty);
1589+
let name = param.name().unwrap();
1590+
let ident = ctx.rust_ident(name);
1591+
generic_param_names.push(ident.clone());
16071592

1608-
let prefix = ctx.trait_prefix();
1609-
let field_name = ctx.rust_ident(format!("_phantom_{}", idx));
1610-
fields.push(quote! {
1611-
pub #field_name : ::#prefix::marker::PhantomData<
1612-
::#prefix::cell::UnsafeCell<#ident>
1613-
> ,
1614-
});
1615-
}
1593+
let prefix = ctx.trait_prefix();
1594+
let field_name = ctx.rust_ident(format!("_phantom_{}", idx));
1595+
fields.push(quote! {
1596+
pub #field_name : ::#prefix::marker::PhantomData<
1597+
::#prefix::cell::UnsafeCell<#ident>
1598+
> ,
1599+
});
16161600
}
16171601

16181602
let generics = if !generic_param_names.is_empty() {
@@ -1665,11 +1649,13 @@ impl CodeGenerator for CompInfo {
16651649
ctx.options().derive_default && !self.is_forward_declaration();
16661650
}
16671651

1652+
let all_template_params = item.all_template_params(ctx);
1653+
16681654
if item.can_derive_copy(ctx) && !item.annotations().disallow_copy() {
16691655
derives.push("Copy");
16701656

16711657
if ctx.options().rust_features().builtin_clone_impls ||
1672-
used_template_params.is_some()
1658+
!all_template_params.is_empty()
16731659
{
16741660
// FIXME: This requires extra logic if you have a big array in a
16751661
// templated struct. The reason for this is that the magic:
@@ -1751,7 +1737,7 @@ impl CodeGenerator for CompInfo {
17511737
);
17521738
}
17531739

1754-
if used_template_params.is_none() {
1740+
if all_template_params.is_empty() {
17551741
if !is_opaque {
17561742
for var in self.inner_vars() {
17571743
ctx.resolve_item(*var).codegen(ctx, result, &());
@@ -3020,7 +3006,6 @@ impl TryToRustTy for Type {
30203006
TypeKind::TemplateAlias(..) |
30213007
TypeKind::Alias(..) => {
30223008
let template_params = item.used_template_params(ctx)
3023-
.unwrap_or(vec![])
30243009
.into_iter()
30253010
.filter(|param| param.is_template_param(ctx, &()))
30263011
.collect::<Vec<_>>();
@@ -3039,9 +3024,9 @@ impl TryToRustTy for Type {
30393024
}
30403025
}
30413026
TypeKind::Comp(ref info) => {
3042-
let template_params = item.used_template_params(ctx);
3027+
let template_params = item.all_template_params(ctx);
30433028
if info.has_non_type_template_params() ||
3044-
(item.is_opaque(ctx, &()) && template_params.is_some())
3029+
(item.is_opaque(ctx, &()) && !template_params.is_empty())
30453030
{
30463031
return self.try_to_opaque(ctx, item);
30473032
}

src/ir/analysis/derive_copy.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ impl<'ctx> MonotoneFramework for CannotDeriveCopy<'ctx> {
247247

248248
// https://github.com/rust-lang/rust/issues/36640
249249
if !info.self_template_params(self.ctx).is_empty() ||
250-
item.used_template_params(self.ctx).is_some()
250+
!item.all_template_params(self.ctx).is_empty()
251251
{
252252
trace!(
253253
" comp cannot derive copy because issue 36640"

src/ir/template.rs

+11-15
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,12 @@ use parse::ClangItemParser;
9292
/// ----+------+-----+----------------------+
9393
/// ... |Decl. | ... | used_template_params |
9494
/// ----+------+-----+----------------------+
95-
/// ... |Foo | ... | Some([T, U]) |
96-
/// ... |Bar | ... | Some([V]) |
97-
/// ... |Inner | ... | None |
98-
/// ... |Lol | ... | Some([T]) |
99-
/// ... |Wtf | ... | Some([T]) |
100-
/// ... |Qux | ... | None |
95+
/// ... |Foo | ... | [T, U] |
96+
/// ... |Bar | ... | [V] |
97+
/// ... |Inner | ... | [] |
98+
/// ... |Lol | ... | [T] |
99+
/// ... |Wtf | ... | [T] |
100+
/// ... |Qux | ... | [] |
101101
/// ----+------+-----+----------------------+
102102
pub trait TemplateParameters {
103103
/// Get the set of `ItemId`s that make up this template declaration's free
@@ -144,7 +144,7 @@ pub trait TemplateParameters {
144144
/// Get only the set of template parameters that this item uses. This is a
145145
/// subset of `all_template_params` and does not necessarily contain any of
146146
/// `self_template_params`.
147-
fn used_template_params(&self, ctx: &BindgenContext) -> Option<Vec<TypeId>>
147+
fn used_template_params(&self, ctx: &BindgenContext) -> Vec<TypeId>
148148
where
149149
Self: AsRef<ItemId>,
150150
{
@@ -154,14 +154,10 @@ pub trait TemplateParameters {
154154
);
155155

156156
let id = *self.as_ref();
157-
let all_template_params: Vec<_> = ctx.resolve_item(id).all_template_params(ctx);
158-
if all_template_params.len() > 0 {
159-
Some(all_template_params.into_iter()
160-
.filter(|p| ctx.uses_template_parameter(id, *p))
161-
.collect())
162-
} else {
163-
None
164-
}
157+
ctx.resolve_item(id).all_template_params(ctx)
158+
.into_iter()
159+
.filter(|p| ctx.uses_template_parameter(id, *p))
160+
.collect()
165161
}
166162
}
167163

0 commit comments

Comments
 (0)