[Migrated] Panicking in a #[track_caller] function fails to compile
Đang mở
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Rust
- Star
- 3.4k
- Fork
- 126
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
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)]
| ^
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện ví dụ trong gpu/src/lib.rs và so sánh các chẩn đoán được phát ra liên quan đến #[track_caller], core::fmt::mod.rs và core::panic.rs. Truy vết lỗi từ điểm vào fragment spirv qua quá trình biên dịch; hoàn tất khi ví dụ biên dịch thành công mà không có các lỗi con trỏ hàm và ép kiểu con trỏ đã được báo cáo.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- rust
- Lĩnh vực
- compilers
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 42/100