Allow generic repr(simd) types.

Absolute correctness is checked at monomorphisation time.
This commit is contained in:
Huon Wilson 2015-08-12 15:37:21 -07:00
parent 1f5739fb3c
commit 8b68f58fef
2 changed files with 22 additions and 10 deletions

View file

@ -224,7 +224,13 @@ pub fn sizing_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> Typ
ty::TyStruct(..) => {
if t.is_simd() {
let llet = type_of(cx, t.simd_type(cx.tcx()));
let e = t.simd_type(cx.tcx());
if !e.is_machine() {
cx.sess().fatal(&format!("monomorphising SIMD type `{}` with \
a non-machine element type `{}`",
t, e))
}
let llet = type_of(cx, e);
let n = t.simd_size(cx.tcx()) as u64;
ensure_array_fits_in_address_space(cx, llet, n, t);
Type::vector(&llet, n)
@ -410,7 +416,13 @@ pub fn in_memory_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) ->
}
ty::TyStruct(def, ref substs) => {
if t.is_simd() {
let llet = in_memory_type_of(cx, t.simd_type(cx.tcx()));
let e = t.simd_type(cx.tcx());
if !e.is_machine() {
cx.sess().fatal(&format!("monomorphising SIMD type `{}` with \
a non-machine element type `{}`",
t, e))
}
let llet = in_memory_type_of(cx, e);
let n = t.simd_size(cx.tcx()) as u64;
ensure_array_fits_in_address_space(cx, llet, n, t);
Type::vector(&llet, n)

View file

@ -4321,10 +4321,6 @@ pub fn check_instantiable(tcx: &ty::ctxt,
pub fn check_simd(tcx: &ty::ctxt, sp: Span, id: ast::NodeId) {
let t = tcx.node_id_to_type(id);
if t.needs_subst() {
span_err!(tcx.sess, sp, E0074, "SIMD vector cannot be generic");
return;
}
match t.sty {
ty::TyStruct(def, substs) => {
let fields = &def.struct_variant().fields;
@ -4337,10 +4333,14 @@ pub fn check_simd(tcx: &ty::ctxt, sp: Span, id: ast::NodeId) {
span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous");
return;
}
if !e.is_machine() {
span_err!(tcx.sess, sp, E0077,
"SIMD vector element type should be machine type");
return;
match e.sty {
ty::TyParam(_) => { /* struct<T>(T, T, T, T) is ok */ }
_ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ }
_ => {
span_err!(tcx.sess, sp, E0077,
"SIMD vector element type should be machine type");
return;
}
}
}
_ => ()