I've tried to compile this crate https://github.com/yoanlcq/vek as part of running code coverage and with RUSTFLAGS="-C link-dead-code" and --features platform_intrinsics it fails to build. But without -C link-dead-code it builds and runs fine which is what I'd expect with the flag present.
Sample error (they're all the same error just different bits of code:
error[E0511]: invalid monomorphization of `simd_reduce_any` intrinsic: unsupported simd_reduce_any from `vec::repr_simd::extent2::Extent2<bool>` with element `bool` to `bool`
--> src/vec.rs:1346:43
|
1346 | simd_llvm => unsafe { simd_llvm::simd_reduce_any(self) },
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
3195 | / vec_impl_all_vecs!{
3196 | | simd
3197 | | #[repr(simd)]
3198 | | }
| |_____- in this macro invocation
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 14 previous errors
(Not sure if I-monomorphization is correct, remove it if it's not.)
Any progress on this error ? There are many projects which are having problems, as they use vek in one of their dependencies
Since this crate cannot be built with --features platform_intrinsics on stable:
Compiling approx v0.3.2
error[E0658]: platform intrinsics are experimental and possibly buggy
--> src/simd_llvm.rs:13:8
|
13 | extern "platform-intrinsic" {
| ^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information
warning: unused import: `crate::simd_llvm`
--> src/vec.rs:21:5
|
21 | use crate::simd_llvm;
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
error: aborting due to previous error; 1 warning emitted
For more information about this error, try `rustc --explain E0658`.
@rustbot modify labels: requires-nightly
@xd009642 do you know if this used to work on an old version of rust? Or has it always been an issue?
MCVE: https://rust.godbolt.org/z/ax56Mj
// compile-flags: --crate-type=rlib -C link-dead-code
#![feature(platform_intrinsics)]
#![feature(repr_simd)]
extern "platform-intrinsic" {
pub fn simd_reduce_all<T>(x: T) -> bool;
}
#[repr(simd)]
// #[repr(C)]
pub struct Vec3<T> {
pub x: T,
pub y: T,
pub z: T,
}
impl Vec3<bool> {
#[inline]
pub fn reduce_and(self) -> bool {
unsafe { simd_reduce_all(self) }
}
}
I used the MCVE and checked it with those toolchains on linux. And all show exact the same error.
(long version is always: nightly-20xx-yy-zz-x86_64-unknown-linux-gnu)
so i would guess that this code has never worked
@jyn514 I've no idea when it started, it's not my code I just write a tool that adds the linker flag :sweat_smile:
I believe the code should never be compiled. Because if you manually replace Vec3<bool> with a struct
of 3 members of type bool, repr(simd) will error.
https://rust.godbolt.org/z/KG5fKT
#![feature(repr_simd)]
#[repr(simd)]
pub struct Vec3 { // error[E0077]: SIMD vector element type should be machine type
pub x: bool,
pub y: bool,
pub z: bool,
}
In short, an useful error message is lost, instead a less useful error message replaces it.
Assigning P-medium as discussed as part of the Prioritization Working Group procedure and removing I-prioritize.
Most helpful comment
I believe the code should never be compiled. Because if you manually replace
Vec3<bool>with a structof 3 members of type bool,
repr(simd)will error.https://rust.godbolt.org/z/KG5fKT
In short, an useful error message is lost, instead a less useful error message replaces it.