summaryrefslogtreecommitdiff
path: root/src/codegen/mod.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-05-05 13:21:22 -0500
committerGitHub <noreply@github.com>2017-05-05 13:21:22 -0500
commit3eb8f70ca06a053230bd881a255b4e27a1f61ded (patch)
treee4671ea3d83838c5b2593503db802626734173dc /src/codegen/mod.rs
parent66b9c3d8698aef0a32147eeabb99264a9b52d171 (diff)
parentc7792974792cbc700821ab1ebdba9fa20d97f5e1 (diff)
Auto merge of #689 - fitzgen:Kowasaki-master, r=fitzgen
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 Rebased + squashed version of #635; cc @Kowasaki To resolve the conflicts and rebase and squash, I did essentially these commands: ``` $ git fetch servo $ git checkout -b Kowasaki-master servo/master $ git merge --squash --edit Kowasaki/master $ cargo test $ cd tests/expectations $ cargo test $ cd - $ git commit --author="Kowasaki" $ git push fitzgen Kowasaki-master ``` Hopefully that is useful for you in the future :) Thanks for fixing this issue!
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);
}
}