diff options
| author | Eduard Burtescu <edy.burt@gmail.com> | 2016-04-19 15:57:34 +0300 |
|---|---|---|
| committer | Eduard Burtescu <edy.burt@gmail.com> | 2016-04-19 16:08:45 +0300 |
| commit | 24ca1ec07da202f77ed70f96ec6bfb138eaf29be (patch) | |
| tree | 7bf34e27e86cb66f851ec80cbe6258199be94ec8 /src | |
| parent | fe48a4af8403289ebc811884964fc4ef91f6bc09 (diff) | |
| download | rust-24ca1ec07da202f77ed70f96ec6bfb138eaf29be.tar.gz rust-24ca1ec07da202f77ed70f96ec6bfb138eaf29be.zip | |
Guard against rustc::layout diverging from rustc_trans.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_trans/type_of.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/librustc_trans/type_of.rs b/src/librustc_trans/type_of.rs index 1f0a18ad4fa..863ae3f942e 100644 --- a/src/librustc_trans/type_of.rs +++ b/src/librustc_trans/type_of.rs @@ -17,6 +17,7 @@ use abi::FnType; use adt; use common::*; use machine; +use rustc::traits::ProjectionMode; use rustc::ty::{self, Ty, TypeFoldable}; use type_::Type; @@ -121,6 +122,37 @@ pub fn sizing_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> Typ debug!("--> mapped t={:?} to llsizingty={:?}", t, llsizingty); cx.llsizingtypes().borrow_mut().insert(t, llsizingty); + + // FIXME(eddyb) Temporary sanity check for ty::layout. + let infcx = infer::normalizing_infer_ctxt(cx.tcx(), &cx.tcx().tables, ProjectionMode::Any); + match t.layout(&infcx) { + Ok(layout) => { + if !type_is_sized(cx.tcx(), t) { + if !layout.is_unsized() { + bug!("layout should be unsized for type `{}` / {:#?}", + t, layout); + } + + // Unsized types get turned into a fat pointer for LLVM. + return llsizingty; + } + let r = layout.size(&cx.tcx().data_layout).bytes(); + let l = machine::llsize_of_alloc(cx, llsizingty); + if r != l { + bug!("size differs (rustc: {}, llvm: {}) for type `{}` / {:#?}", + r, l, t, layout); + } + let r = layout.align(&cx.tcx().data_layout).abi(); + let l = machine::llalign_of_min(cx, llsizingty) as u64; + if r != l { + bug!("align differs (rustc: {}, llvm: {}) for type `{}` / {:#?}", + r, l, t, layout); + } + } + Err(e) => { + bug!("failed to get layout for `{}`: {}", t, e); + } + } llsizingty } |
