summaryrefslogtreecommitdiff
path: root/src/codegen/mod.rs
diff options
context:
space:
mode:
authorKowasaki <weiyinko@gmail.com>2017-05-05 11:14:15 -0700
committerNick Fitzgerald <fitzgen@gmail.com>2017-05-05 11:14:15 -0700
commitc7792974792cbc700821ab1ebdba9fa20d97f5e1 (patch)
treee4671ea3d83838c5b2593503db802626734173dc /src/codegen/mod.rs
parent66b9c3d8698aef0a32147eeabb99264a9b52d171 (diff)
Emit `PhantomData<UnsafeCell<T>>` members for all generic parameters
This makes generated generic structs lifetime invariant, since we cannot know the C++ type's true variance. Fixes #506
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r--src/codegen/mod.rs11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index 697c140f..7f0a822a 100644
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -1465,11 +1465,20 @@ impl CodeGenerator for CompInfo {
let mut generics = aster::AstBuilder::new().generics();
if let Some(ref params) = used_template_params {
- for ty in params.iter() {
+ for (idx, ty) in params.iter().enumerate() {
let param = ctx.resolve_type(*ty);
let name = param.name().unwrap();
let ident = ctx.rust_ident(name);
+
generics = generics.ty_param_id(ident);
+
+ let prefix = ctx.trait_prefix();
+ let phantom_ty = quote_ty!(
+ ctx.ext_cx(),
+ ::$prefix::marker::PhantomData<::$prefix::cell::UnsafeCell<$ident>>);
+ let phantom_field = StructFieldBuilder::named(format!("_phantom_{}", idx))
+ .build_ty(phantom_ty);
+ fields.push(phantom_field);
}
}