From 112d833ea5c72f89078069ffc5d10da5b1adf2ca Mon Sep 17 00:00:00 2001 From: yukang Date: Fri, 7 Nov 2025 16:19:30 +0800 Subject: [PATCH 1/2] Fix ICE for repr simd on non struct --- compiler/rustc_hir_typeck/src/inline_asm.rs | 8 +++++ .../asm/invalid-repr-simd-on-enum-148634.rs | 16 ++++++++++ .../invalid-repr-simd-on-enum-148634.stderr | 30 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 tests/ui/asm/invalid-repr-simd-on-enum-148634.rs create mode 100644 tests/ui/asm/invalid-repr-simd-on-enum-148634.stderr 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`. From 1610851356c5c2c5bb63f6c55effaac21968a715 Mon Sep 17 00:00:00 2001 From: yukang Date: Thu, 13 Nov 2025 18:56:32 +0800 Subject: [PATCH 2/2] add Tainted for NonAsmTypeReason --- compiler/rustc_hir_typeck/src/inline_asm.rs | 10 +++++++--- tests/ui/asm/invalid-repr-simd-on-enum-148634.rs | 2 +- .../ui/asm/invalid-repr-simd-on-enum-148634.stderr | 14 +++----------- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/compiler/rustc_hir_typeck/src/inline_asm.rs b/compiler/rustc_hir_typeck/src/inline_asm.rs index d3dc27114dc4f..6460bd72c7973 100644 --- a/compiler/rustc_hir_typeck/src/inline_asm.rs +++ b/compiler/rustc_hir_typeck/src/inline_asm.rs @@ -7,7 +7,7 @@ use rustc_middle::bug; use rustc_middle::ty::{self, Article, FloatTy, IntTy, Ty, TyCtxt, TypeVisitableExt, UintTy}; use rustc_session::lint; use rustc_span::def_id::LocalDefId; -use rustc_span::{Span, Symbol, sym}; +use rustc_span::{ErrorGuaranteed, Span, Symbol, sym}; use rustc_target::asm::{ InlineAsmReg, InlineAsmRegClass, InlineAsmRegOrRegClass, InlineAsmType, ModifierInfo, }; @@ -27,6 +27,7 @@ enum NonAsmTypeReason<'tcx> { InvalidElement(DefId, Ty<'tcx>), NotSizedPtr(Ty<'tcx>), EmptySIMDArray(Ty<'tcx>), + Tainted(ErrorGuaranteed), } impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> { @@ -94,11 +95,11 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> { } ty::Adt(adt, args) if adt.repr().simd() => { if !adt.is_struct() { - self.fcx.dcx().span_delayed_bug( + let guar = self.fcx.dcx().span_delayed_bug( span, format!("repr(simd) should only be used on structs, got {}", adt.descr()), ); - return Err(NonAsmTypeReason::Invalid(ty)); + return Err(NonAsmTypeReason::Tainted(guar)); } let fields = &adt.non_enum_variant().fields; @@ -242,6 +243,9 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> { let msg = format!("use of empty SIMD vector `{ty}`"); self.fcx.dcx().struct_span_err(expr.span, msg).emit(); } + NonAsmTypeReason::Tainted(_error_guard) => { + // An error has already been reported. + } } return None; } diff --git a/tests/ui/asm/invalid-repr-simd-on-enum-148634.rs b/tests/ui/asm/invalid-repr-simd-on-enum-148634.rs index 2764a87da5904..45f1f092e5268 100644 --- a/tests/ui/asm/invalid-repr-simd-on-enum-148634.rs +++ b/tests/ui/asm/invalid-repr-simd-on-enum-148634.rs @@ -1,3 +1,4 @@ +//@ needs-asm-support #![feature(repr_simd)] use std::arch::asm; @@ -11,6 +12,5 @@ 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 index 2ddc472de00d5..6992d03f4fa68 100644 --- a/tests/ui/asm/invalid-repr-simd-on-enum-148634.stderr +++ b/tests/ui/asm/invalid-repr-simd-on-enum-148634.stderr @@ -1,5 +1,5 @@ error[E0517]: attribute should be applied to a struct - --> $DIR/invalid-repr-simd-on-enum-148634.rs:5:8 + --> $DIR/invalid-repr-simd-on-enum-148634.rs:6:8 | LL | #[repr(simd)] | ^^^^ @@ -8,7 +8,7 @@ LL | enum Es {} | ---------- not a struct error[E0084]: unsupported representation for zero-variant enum - --> $DIR/invalid-repr-simd-on-enum-148634.rs:5:8 + --> $DIR/invalid-repr-simd-on-enum-148634.rs:6:8 | LL | #[repr(simd)] | ^^^^ @@ -16,15 +16,7 @@ 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 +error: aborting due to 2 previous errors Some errors have detailed explanations: E0084, E0517. For more information about an error, try `rustc --explain E0084`.