Allow generic repr(simd) types.
Absolute correctness is checked at monomorphisation time.
This commit is contained in:
parent
1f5739fb3c
commit
8b68f58fef
2 changed files with 22 additions and 10 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => ()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue