diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-05-05 13:21:22 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-05 13:21:22 -0500 |
commit | 3eb8f70ca06a053230bd881a255b4e27a1f61ded (patch) | |
tree | e4671ea3d83838c5b2593503db802626734173dc /src/codegen/mod.rs | |
parent | 66b9c3d8698aef0a32147eeabb99264a9b52d171 (diff) | |
parent | c7792974792cbc700821ab1ebdba9fa20d97f5e1 (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.rs | 11 |
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); } } |