diff --git a/src/parser/parse-5-defs.cpp b/src/parser/parse-5-defs.cpp index 31048176c42..0502c53ad20 100644 --- a/src/parser/parse-5-defs.cpp +++ b/src/parser/parse-5-defs.cpp @@ -16,6 +16,8 @@ #include "wat-parser-internal.h" +#include "ir/type-updating.h" + namespace wasm::WATParser { Result<> parseDefinitions( @@ -63,6 +65,7 @@ Result<> parseDefinitions( if (auto* err = end.getErr()) { return ctx.in.err(decls.funcDefs[i].pos, err->msg); } + TypeUpdating::handleNonDefaultableLocals(f, decls.wasm); } } diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 585a1c98f2a..cd83ea72289 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -2302,7 +2302,7 @@ Result<> IRBuilder::makeBrOn(Index label, case BrOnCast: case BrOnCastDescEq: if (out->isNullable()) { - resultType = Type(in->getHeapType(), NonNullable); + resultType = in->with(NonNullable); } else { resultType = *in; } diff --git a/test/lit/basic/br-on-cast-extra-values.wast b/test/lit/basic/br-on-cast-extra-values.wast new file mode 100644 index 00000000000..bed03346ca7 --- /dev/null +++ b/test/lit/basic/br-on-cast-extra-values.wast @@ -0,0 +1,17 @@ +;; RUN: wasm-opt %s -all -S -o %t +;; RUN: wasm-opt %s -all --roundtrip -S -o %t.roundtrip + +(module + (type $s (struct)) + (func (param $s (ref $s)) (result (ref $s) (ref $s)) + local.get $s + local.get $s + br_on_cast 0 (ref $s) (ref $s) + ) + (func (param $s (ref (exact $s))) + (result (ref (exact $s)) (ref null (exact $s))) + local.get $s + local.get $s + br_on_cast 0 (ref (exact $s)) (ref null (exact $s)) + ) +)