Rust-GPU / Rust-GPU/rust-gpu

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

Offen
#86 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Rust
Sterne
3.4k
Forks
125
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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)]
   | ^

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das Beispiel in gpu/src/lib.rs zu reproduzieren, und vergleiche die ausgegebenen Diagnosen im Zusammenhang mit #[track_caller], core::fmt::mod.rs und core::panic.rs. Verfolge den Fehler vom spirv-Fragment-Einstiegspunkt durch die Kompilierung zurück; abgeschlossen ist dies, wenn das Beispiel ohne die gemeldeten Funktionszeiger- und Pointer-Cast-Fehler erfolgreich kompiliert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
rust
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.