diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/codegen/mod.rs | 2 | ||||
-rw-r--r-- | src/ir/item.rs | 27 |
2 files changed, 28 insertions, 1 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index c5c8ebee..0076f1df 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -772,7 +772,7 @@ impl CodeGenerator for TemplateInstantiation { let size = layout.size; let align = layout.align; - let name = item.canonical_name(ctx); + let name = item.full_disambiguated_name(ctx); let mut fn_name = format!("__bindgen_test_layout_{}_instantiation", name); let times_seen = result.overload_number(&fn_name); if times_seen > 0 { diff --git a/src/ir/item.rs b/src/ir/item.rs index 2754c838..7f3afefb 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -661,6 +661,33 @@ impl Item { } } + /// Create a fully disambiguated name for an item, including template + /// parameters if it is a type + pub fn full_disambiguated_name(&self, ctx: &BindgenContext) -> String { + let mut s = String::new(); + let level = 0; + self.push_disambiguated_name(ctx, &mut s, level); + s + } + + /// Helper function for full_disambiguated_name + fn push_disambiguated_name(&self, ctx: &BindgenContext, to: &mut String, level: u8) { + to.push_str(&self.canonical_name(ctx)); + if let ItemKind::Type(ref ty) = *self.kind() { + if let TypeKind::TemplateInstantiation(ref inst) = *ty.kind() { + to.push_str(&format!("_open{}_", level)); + for arg in inst.template_arguments() { + arg.into_resolver() + .through_type_refs() + .resolve(ctx) + .push_disambiguated_name(ctx, to, level + 1); + to.push_str("_"); + } + to.push_str(&format!("close{}", level)); + } + } + } + /// Get this function item's name, or `None` if this item is not a function. fn func_name(&self) -> Option<&str> { match *self.kind() { |