Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions compiler/rustc_hir_typeck/src/inline_asm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
16 changes: 16 additions & 0 deletions tests/ui/asm/invalid-repr-simd-on-enum-148634.rs
Original file line number Diff line number Diff line change
@@ -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
}
}
30 changes: 30 additions & 0 deletions tests/ui/asm/invalid-repr-simd-on-enum-148634.stderr
Original file line number Diff line number Diff line change
@@ -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`.
Loading