Skip to content

[naga wgsl-in] Panic when converting negative f16 to u32 during const evaluation #7420

@jamienicol

Description

@jamienicol

Description
We panic here as f16::to_u32() returns None. f16::to_u32() under the hood calls f16::to_f32() which is infallible, and then calls f32::to_u32() (from num_traits::ToPrimitive) which if I'm following the code correctly is implemented here.

Repro steps

enable f16;
fn test() {
  var a = u32(-1h);
}

Expected vs observed behavior

I would expect this to evaluate to var a = 0u as it does for f32 or AbstractFloat.

Instead we get this panic:

thread 'main' panicked at naga/src/proc/constant_evaluator.rs:1719:60:
called `Option::unwrap()` on a `None` value
stack backtrace:
   0: rust_begin_unwind
             at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/std/src/panicking.rs:692:5
   1: core::panicking::panic_fmt
             at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/panicking.rs:75:14
   2: core::panicking::panic
             at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/panicking.rs:145:5
   3: core::option::unwrap_failed
             at /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/core/src/option.rs:2015:5
   4: core::option::Option<T>::unwrap
             at /home/jamie/.rustup/toolchains/1.85-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs:978:21
   5: naga::proc::constant_evaluator::ConstantEvaluator::cast
             at ./naga/src/proc/constant_evaluator.rs:1719:44
   6: naga::proc::constant_evaluator::ConstantEvaluator::try_eval_and_append_impl
             at ./naga/src/proc/constant_evaluator.rs:942:36
   7: naga::proc::constant_evaluator::ConstantEvaluator::try_eval_and_append
             at ./naga/src/proc/constant_evaluator.rs:802:35
   8: naga::front::wgsl::lower::ExpressionContext::append_expression
             at ./naga/src/front/wgsl/lower/mod.rs:500:9
   9: naga::front::wgsl::lower::construction::<impl naga::front::wgsl::lower::Lowerer>::construct
             at ./naga/src/front/wgsl/lower/construction.rs:561:20
  10: naga::front::wgsl::lower::Lowerer::expression_for_reference
             at ./naga/src/front/wgsl/lower/mod.rs:2068:30
  11: naga::front::wgsl::lower::Lowerer::expression_for_abstract
             at ./naga/src/front/wgsl/lower/mod.rs:2001:20
  12: naga::front::wgsl::lower::Lowerer::type_and_init
             at ./naga/src/front/wgsl/lower/mod.rs:1292:32
  13: naga::front::wgsl::lower::Lowerer::statement
             at ./naga/src/front/wgsl/lower/mod.rs:1542:45
  14: naga::front::wgsl::lower::Lowerer::block
             at ./naga/src/front/wgsl/lower/mod.rs:1470:13
  15: naga::front::wgsl::lower::Lowerer::function
             at ./naga/src/front/wgsl/lower/mod.rs:1377:24
  16: naga::front::wgsl::lower::Lowerer::lower
             at ./naga/src/front/wgsl/lower/mod.rs:1105:40
  17: naga::front::wgsl::Frontend::inner
             at ./naga/src/front/wgsl/mod.rs:50:22
  18: naga::front::wgsl::Frontend::parse
             at ./naga/src/front/wgsl/mod.rs:44:9
  19: naga::front::wgsl::parse_str
             at ./naga/src/front/wgsl/mod.rs:68:5
  20: naga::parse_input
             at ./naga-cli/src/bin/naga.rs:623:26
  21: naga::run
             at ./naga-cli/src/bin/naga.rs:478:9
  22: naga::main
             at ./naga-cli/src/bin/naga.rs:361:21
  23: core::ops::function::FnOnce::call_once
             at /home/jamie/.rustup/toolchains/1.85-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions