Skip to content

C2Rust generates _mm_storeu_si32 calls that fail to compile across Rust toolchains (missing intrinsic or incorrect pointer type) #1650

@rikki322

Description

@rikki322

When transpiling C code that uses the SSE intrinsic _mm_storeu_si32, C2Rust generates Rust code importing and calling _mm_storeu_si32 from core::arch::{x86,x86_64}.
However, the generated code fails to compile across different Rust toolchains:

  1. On older toolchains (e.g., rustc 1.65.0-nightly), the intrinsic _mm_storeu_si32 is not available, causing an unresolved import error (E0432).
  2. On newer toolchains (e.g., rustc 1.92.0-nightly), the intrinsic exists but its Rust signature expects *mut u8, while C2Rust generates a *mut c_void, causing a type mismatch (E0308).
    As a result, the generated Rust code does not compile on either toolchain.

Reproducer

#include <immintrin.h>

int main() {
    int val = 777;
    __m128i simd_vec = _mm_set1_epi32(val);
    __m128i add_vec = _mm_set1_epi32(111);
    __m128i result = _mm_add_epi32(simd_vec, add_vec);

    int simd_result;
    _mm_storeu_si32(&simd_result, result);
}

Run c2rust transpile test.c
C2Rust generated Rust

#![allow(
    dead_code,
    non_camel_case_types,
    non_snake_case,
    non_upper_case_globals,
    unused_assignments,
    unused_mut
)]
#![feature(stdsimd)]
#[cfg(target_arch = "x86")]
pub use ::core::arch::x86::{
    __m128i, _mm_add_epi32, _mm_set_epi32, _mm_set1_epi32, _mm_storeu_si32,
    _mm_setzero_si128,
};
#[cfg(target_arch = "x86_64")]
pub use ::core::arch::x86_64::{
    __m128i, _mm_add_epi32, _mm_set_epi32, _mm_set1_epi32, _mm_storeu_si32,
    _mm_setzero_si128,
};
#[derive(Copy, Clone)]
#[repr(C, packed)]
pub struct __storeu_si32 {
    pub __v: ::core::ffi::c_int,
}
unsafe fn main_0() -> ::core::ffi::c_int {
    let mut val: ::core::ffi::c_int = 777 as ::core::ffi::c_int;
    let mut simd_vec: __m128i = _mm_set1_epi32(val);
    let mut add_vec: __m128i = _mm_set1_epi32(111 as ::core::ffi::c_int);
    let mut result: __m128i = _mm_add_epi32(simd_vec, add_vec);
    let mut simd_result: ::core::ffi::c_int = 0;
    _mm_storeu_si32(
        &mut simd_result as *mut ::core::ffi::c_int as *mut ::core::ffi::c_void,
        result,
    );
    return 0;
}
pub fn main() {
    unsafe { ::std::process::exit(main_0() as i32) }
}

Observed Behavior

  1. Compilation fails with:
error[E0432]: unresolved import `core::arch::x86_64::_mm_storeu_si32`

in nightly-2022-08-08(rustc 1.65.0-nightly (d394408fb 2022-08-07))

  1. Compilation fails with:
error[E0308]: mismatched types
expected *mut u8
found *mut c_void

in nightly-2025-10-02(rustc 1.92.0-nightly (4da69dfff 2025-10-01))
Environment

  • c2rust version: v0.21.0
  • platform:Ubuntu 24.04
  • rustc 1.65.0-nightly (d394408fb 2022-08-07)
  • rustc 1.92.0-nightly (4da69dfff 2025-10-01)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions