Skip to content

[wasm2c] MSVC miscompiles for certain fp constants #2388

Open
@InflexCZE

Description

@InflexCZE

Given WASM

0000024: 44                                        ; f64.const
0000025: 0000 0000 0000 e0c1                       ; f64 literal

(module
  (func (export "addTwo") (result f64)
    f64.const -0x1p+31
  )
)

and wasm2c conversion output

//wasm2c test.wasm
f64 w2c__addTwo_0(w2c_* instance) {
  FUNC_PROLOGUE;
  f64 var_d0;
  var_d0 = -2147483648;
  FUNC_EPILOGUE;
  return var_d0;
}

there is slight discrepancy in output of different compilers.
Clang & GCC correctly output -2147483648.000000
MSVC throws warning (error with /sdl) and outputs 2147483648.000000 (notice absence of negative mark)
https://godbolt.org/z/MrjMzdeKE
image

While the conversion output is likely correct according to C spec (at least Clang and GCC are not screaming with -Wall), it's very inconvenient for Windows users to do these fixups manually.

Proposal is to use alternative notation

  var_d0 = -2147483648.0; //Notice additional decimal

which makes all tested compilers happy and correct.
https://godbolt.org/z/5sE4adbYd
image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions