Skip to content

Commit

Permalink
(bufix) debug_printf macros don't escape '{' and '}' correctly. (#167)
Browse files Browse the repository at this point in the history
* Fixes a bug with the `debug_printf` and `debug_printfln` macros not escaping '{' and '}' correctly.

The `debug_printf` and `debug_printfln` passes its format string to the `asm!` macro, which uses `{` and `}` to separate its arguments. Passing `{` and `}` to `asm!` directly is incorrect, and leads to compilation issues:
```
error: invalid asm template string: expected `'}'`, found `'"'`
     --> examples/shaders/sky-shader/src/lib.rs:13016:2
      |
13015 | unsafe{debug_printf!("Variant3{")};
      |        -------------------------- in this macro invocation
13016 |         unsafe{debug_printf!("fld0:")};
      | ----^ expected `'}'` in asm template string
      | |
      | because of this opening brace
      |
      = note: if you intended to print `{`, you can escape it using `{{`
      = note: this error originates in the macro `debug_printf` (in Nightly builds, run with -Z macro-backtrace for more info)
``` 

This commit escapes those characters using `{{` and `}}`, which removes this issue and produces correct behaviour.

* Fix formatting

---------

Co-authored-by: FractalFir <[email protected]>
  • Loading branch information
LegNeato and FractalFir authored Dec 2, 2024
1 parent d3f9af7 commit 1932353
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions crates/spirv-std/macros/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,10 @@ fn debug_printf_inner(input: DebugPrintfInput) -> TokenStream {
.into_iter()
.collect::<proc_macro2::TokenStream>();
let op_loads = op_loads.into_iter().collect::<proc_macro2::TokenStream>();
// Escapes the '{' and '}' characters in the format string.
// Since the `asm!` macro expects '{' '}' to surround its arguments, we have to use '{{' and '}}' instead.
// The `asm!` macro will then later turn them back into '{' and '}'.
let format_string = format_string.replace('{', "{{").replace('}', "}}");

let op_string = format!("%string = OpString {format_string:?}");

Expand Down

0 comments on commit 1932353

Please sign in to comment.