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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions