diff --git a/compiler/rustc_hir_typeck/src/inline_asm.rs b/compiler/rustc_hir_typeck/src/inline_asm.rs index c0cd23be6909d..d3dc27114dc4f 100644 --- a/compiler/rustc_hir_typeck/src/inline_asm.rs +++ b/compiler/rustc_hir_typeck/src/inline_asm.rs @@ -93,6 +93,14 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> { } } ty::Adt(adt, args) if adt.repr().simd() => { + if !adt.is_struct() { + self.fcx.dcx().span_delayed_bug( + span, + format!("repr(simd) should only be used on structs, got {}", adt.descr()), + ); + return Err(NonAsmTypeReason::Invalid(ty)); + } + let fields = &adt.non_enum_variant().fields; if fields.is_empty() { return Err(NonAsmTypeReason::EmptySIMDArray(ty)); diff --git a/tests/ui/asm/invalid-repr-simd-on-enum-148634.rs b/tests/ui/asm/invalid-repr-simd-on-enum-148634.rs new file mode 100644 index 0000000000000..2764a87da5904 --- /dev/null +++ b/tests/ui/asm/invalid-repr-simd-on-enum-148634.rs @@ -0,0 +1,16 @@ +#![feature(repr_simd)] + +use std::arch::asm; + +#[repr(simd)] +//~^ ERROR attribute should be applied to a struct +//~| ERROR unsupported representation for zero-variant enum +enum Es {} + +fn main() { + unsafe { + let mut x: Es; + asm!("{}", out(reg) x); + //~^ ERROR cannot use value of type `Es` for inline assembly + } +} diff --git a/tests/ui/asm/invalid-repr-simd-on-enum-148634.stderr b/tests/ui/asm/invalid-repr-simd-on-enum-148634.stderr new file mode 100644 index 0000000000000..2ddc472de00d5 --- /dev/null +++ b/tests/ui/asm/invalid-repr-simd-on-enum-148634.stderr @@ -0,0 +1,30 @@ +error[E0517]: attribute should be applied to a struct + --> $DIR/invalid-repr-simd-on-enum-148634.rs:5:8 + | +LL | #[repr(simd)] + | ^^^^ +... +LL | enum Es {} + | ---------- not a struct + +error[E0084]: unsupported representation for zero-variant enum + --> $DIR/invalid-repr-simd-on-enum-148634.rs:5:8 + | +LL | #[repr(simd)] + | ^^^^ +... +LL | enum Es {} + | ------- zero-variant enum + +error: cannot use value of type `Es` for inline assembly + --> $DIR/invalid-repr-simd-on-enum-148634.rs:13:29 + | +LL | asm!("{}", out(reg) x); + | ^ + | + = note: only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0084, E0517. +For more information about an error, try `rustc --explain E0084`.