Rust-GPU / Rust-GPU/rust-gpu

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

Abierto
#86 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Rust
Estrellas
3.4k
Forks
126
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Issue automatically imported from old repo: https://github.com/EmbarkStudios/rust-gpu/issues/1058
Old labels: t: bug
Originally creatd by beepster4096 on 2023-05-03T02:22:13Z


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

  • Rust: 1.69.0-nightly (44cfafe2f 2023-03-03)
  • OS: Windows 11 10.0.22621
  • GPU: NVIDIA GeForce RTX 3070 Laptop

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 `<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: 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<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)+))
   |                                      ^
   |
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)]
   | ^

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza reproduciendo el ejemplo en gpu/src/lib.rs y compara los diagnósticos emitidos relacionados con #[track_caller], core::fmt::mod.rs y core::panic.rs. Sigue el fallo desde el punto de entrada del fragmento spirv a través de la compilación; se considera terminado cuando el ejemplo compila correctamente sin los errores de puntero a función y conversión de punteros indicados.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
rust
Área
compilers
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
42/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.