Fix thinning pointers to extern types in miri

This commit is contained in:
Oliver Schneider 2018-05-07 15:53:44 +02:00
parent 9b97705f9e
commit 5258871825
No known key found for this signature in database
GPG Key ID: 1D5CB4FC597C3004
3 changed files with 28 additions and 2 deletions

View File

@ -654,6 +654,9 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
if self.type_is_fat_ptr(src.ty) {
match (src.value, self.type_is_fat_ptr(dest_ty)) {
(Value::ByRef { .. }, _) |
// pointers to extern types
(Value::ByVal(_),_) |
// slices and trait objects to other slices/trait objects
(Value::ByValPair(..), true) => {
let valty = ValTy {
value: src.value,
@ -661,6 +664,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
};
self.write_value(valty, dest)?;
}
// slices and trait objects to thin pointers (dropping the metadata)
(Value::ByValPair(data, _), false) => {
let valty = ValTy {
value: Value::ByVal(data),
@ -668,7 +672,6 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
};
self.write_value(valty, dest)?;
}
(Value::ByVal(_), _) => bug!("expected fat ptr"),
}
} else {
let src_layout = self.layout_of(src.ty)?;

View File

@ -0,0 +1,23 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// compile-pass
#![feature(extern_types)]
extern {
type Opaque;
}
const FOO: *const u8 = &42 as *const _ as *const Opaque as *const u8;
fn main() {
let _foo = FOO;
}

@ -1 +1 @@
Subproject commit f48fed70d4447445b586a35c4ae88683542ffc72
Subproject commit e0e1bd7ff778e5913b566c9e03224faecc0eb486