summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2021-07-28 12:00:11 -0700
committerGitHub <noreply@github.com>2021-07-28 19:00:11 +0000
commit8670f15676b3c6406d6e82327a7258c7c4d08b43 (patch)
tree59338a9debe510a297b90dd7d51eedf209010f02 /src
parentbe580c66645cdea13c8e8b3b77f12ef3a52e5f2e (diff)
downloadbinaryen-8670f15676b3c6406d6e82327a7258c7c4d08b43.tar.gz
binaryen-8670f15676b3c6406d6e82327a7258c7c4d08b43.tar.bz2
binaryen-8670f15676b3c6406d6e82327a7258c7c4d08b43.zip
Support subtyping in tail calls (#4032)
The tail call spec does not include subtyping because it is based on the upstream spec, which does not contain subtyping. However, there is no reason that subtyping shouldn't apply to tail calls like it does for any other call or return. Update the validator to allow subtyping and avoid a related null pointer dereference while we're at it. Do not run the test in with --nominal because it is buggy in that mode.
Diffstat (limited to 'src')
-rw-r--r--src/wasm/wasm-validator.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index f492c7110..450a7b956 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -460,9 +460,9 @@ private:
Type(Type::unreachable),
curr,
"return_call* should have unreachable type");
- shouldBeEqual(
- getFunction()->getResults(),
+ shouldBeSubType(
sig.results,
+ getFunction()->getResults(),
curr,
"return_call* callee return type must match caller return type");
} else {
@@ -798,9 +798,11 @@ void FunctionValidator::visitCallIndirect(CallIndirect* curr) {
if (curr->target->type != Type::unreachable) {
auto* table = getModule()->getTableOrNull(curr->table);
shouldBeTrue(!!table, curr, "call-indirect table must exist");
- shouldBeTrue(table->type.isFunction(),
- curr,
- "call-indirect table must be of function type.");
+ if (table) {
+ shouldBeTrue(table->type.isFunction(),
+ curr,
+ "call-indirect table must be of function type.");
+ }
}
validateCallParamsAndResult(curr, curr->sig);