EmbarkStudios / rust-gpu

🐉 Making Rust a first-class language and ecosystem for GPU shaders 🚧
https://shader.rs
Apache License 2.0
7.35k stars 245 forks source link

Panicking in a #[track_caller] function fails to compile #1058

Open beepster4096 opened 1 year ago

beepster4096 commented 1 year ago

Expected Behaviour

Successful compilation

Example & Steps To Reproduce

#![no_std]

#[track_caller]
fn panic() {
    panic!("owo")
}

#[spirv_std::spirv(fragment)]
pub fn main() {
    panic();
}

produces

error: function pointer types are not allowed
   --> 
C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\fmt\mod.rs:401:5
    |
401 |     pub const fn new_v1(pieces: &'a [&'static str], args: &'a [ArgumentV1<'a>]) -> Arguments<'a> {
    |     ^
    |

error: cannot cast between pointer types
       from `*struct core::option::Option<&[core::fmt::rt::v1::Argument]> { *[struct core::fmt::rt::v1::Argument { position: u32, 
format: struct core::fmt::rt::v1::FormatSpec { precision: struct core::fmt::rt::v1::Count { u32, u32 }, width: struct 
core::fmt::rt::v1::Count { u32, u32 }, flags: u32, fill: u32, align: u8 } }], u32 }`
         to `**struct fn(&[&'static str], &[core::fmt::ArgumentV1<'_>]) -> core::fmt::Arguments<'_> 
{core::fmt::Arguments::<'_>::new_v1} {  }`
   --> 
C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\fmt\mod.rs:405:34
    |
405 |         Arguments { pieces, fmt: None, args }
    |                                  ^
    |

error: cannot cast between pointer types
       from `*[struct &str { *[u8], u32 }; 1]`
         to `*[struct &str { *[u8], u32 }]`
  --> 
C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panic.rs:57:38
   |
57 |         $crate::panicking::panic_fmt($crate::const_format_args!($($t)+))
   |                                      ^
   |

error: cannot cast between pointer types
       from `*struct ! {  }`
         to `*[struct core::fmt::ArgumentV1<'_> { value: *struct core::fmt::Opaque {  }, formatter: *fn(*struct core::fmt::Opaque {  }, 
*struct core::fmt::Formatter<'_> { buf: struct &mut dyn core::fmt::Write { *struct dyn core::fmt::Write {  }, *[u32; 3] }, width: 
struct core::option::Option<usize> { u32, u32 }, precision: struct core::option::Option<usize> { u32, u32 }, flags: u32, fill: u32, 
align: u8 }) -> bool }]`
  --> 
C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panic.rs:57:38
   |
57 |         $crate::panicking::panic_fmt($crate::const_format_args!($($t)+))
   |                                      ^
   |

System Info

Backtrace

Backtrace

``` error: function pointer types are not allowed --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\fmt\mod.rs:401:5 | 401 | pub const fn new_v1(pieces: &'a [&'static str], args: &'a [ArgumentV1<'a>]) -> Arguments<'a> { | ^ | = note: used by `core::fmt::ArgumentV1<'_>` = note: used by unnamed global (%31) = note: used by unnamed global (%32) = note: used by `&[core::fmt::ArgumentV1<'_>]` = note: used by `core::fmt::Arguments<'_>` note: used from within `gpu::panic` --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panic.rs:57:38 | 57 | $crate::panicking::panic_fmt($crate::const_format_args!($($t)+)) | ^ note: called by `gpu::main` --> gpu\src\lib.rs:10:5 | 10 | panic(); | ^ note: called by `main` --> gpu\src\lib.rs:8:1 | 8 | #[spirv_std::spirv(fragment)] | ^ error: cannot cast between pointer types from `*struct core::option::Option<&[core::fmt::rt::v1::Argument]> { *[struct core::fmt::rt::v1::Argument { position: u32, format: struct core::fmt::rt::v1::FormatSpec { precision: struct core::fmt::rt::v1::Count { u32, u32 }, width: struct core::fmt::rt::v1::Count { u32, u32 }, flags: u32, fill: u32, align: u8 } }], u32 }` to `**struct fn(&[&'static str], &[core::fmt::ArgumentV1<'_>]) -> core::fmt::Arguments<'_> {core::fmt::Arguments::<'_>::new_v1} { }` --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\fmt\mod.rs:405:34 | 405 | Arguments { pieces, fmt: None, args } | ^ | note: used from within `::new_v1` --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\fmt\mod.rs:405:34 | 405 | Arguments { pieces, fmt: None, args } | ^ note: called by `gpu::panic` --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panic.rs:57:38 | 57 | $crate::panicking::panic_fmt($crate::const_format_args!($($t)+)) | ^ note: called by `gpu::main` --> gpu\src\lib.rs:10:5 | 10 | panic(); | ^ note: called by `main` --> gpu\src\lib.rs:8:1 | 8 | #[spirv_std::spirv(fragment)] | ^ error: cannot cast between pointer types from `*[struct &str { *[u8], u32 }; 1]` to `*[struct &str { *[u8], u32 }]` --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panic.rs:57:38 | 57 | $crate::panicking::panic_fmt($crate::const_format_args!($($t)+)) | ^ | note: used from within `gpu::panic` --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panic.rs:57:38 | 57 | $crate::panicking::panic_fmt($crate::const_format_args!($($t)+)) | ^ note: called by `gpu::main` --> gpu\src\lib.rs:10:5 | 10 | panic(); | ^ note: called by `main` --> gpu\src\lib.rs:8:1 | 8 | #[spirv_std::spirv(fragment)] | ^ error: cannot cast between pointer types from `*struct ! { }` to `*[struct core::fmt::ArgumentV1<'_> { value: *struct core::fmt::Opaque { }, formatter: *fn(*struct core::fmt::Opaque { }, *struct core::fmt::Formatter<'_> { buf: struct &mut dyn core::fmt::Write { *struct dyn core::fmt::Write { }, *[u32; 3] }, width: struct core::option::Option { u32, u32 }, precision: struct core::option::Option { u32, u32 }, flags: u32, fill: u32, align: u8 }) -> bool }]` --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panic.rs:57:38 | 57 | $crate::panicking::panic_fmt($crate::const_format_args!($($t)+)) | ^ | note: used from within `gpu::panic` --> C:\Users\DrMeepster\.rustup\toolchains\nightly-2023-03-04-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panic.rs:57:38 | 57 | $crate::panicking::panic_fmt($crate::const_format_args!($($t)+)) | ^ note: called by `gpu::main` --> gpu\src\lib.rs:10:5 | 10 | panic(); | ^ note: called by `main` --> gpu\src\lib.rs:8:1 | 8 | #[spirv_std::spirv(fragment)] | ^ ```

eddyb commented 1 year ago

I had to change some of the panic detection in the most recent rustup PR (due to changes upstream):

You may want to retest after that lands, in case it fixes this issue (but if so, don't close it, as we'd still want to add a test in that case).

beepster4096 commented 1 year ago

It looks like this is fixed in 0.8