diff options
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/wasm-type.cpp | 12 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 8 |
2 files changed, 16 insertions, 4 deletions
diff --git a/src/wasm/wasm-type.cpp b/src/wasm/wasm-type.cpp index ea4e43efe..ce823aae0 100644 --- a/src/wasm/wasm-type.cpp +++ b/src/wasm/wasm-type.cpp @@ -1021,6 +1021,18 @@ bool Type::isDefaultable() const { return isConcrete() && !isNonNullable() && !isRtt(); } +bool Type::isDefaultableOrNonNullable() const { + if (isTuple()) { + for (auto t : *this) { + if (!t.isDefaultableOrNonNullable()) { + return false; + } + } + return true; + } + return isConcrete() && !isRtt(); +} + Nullability Type::getNullability() const { return isNullable() ? Nullable : NonNullable; } diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 86fc4811b..8d35543fc 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -2728,11 +2728,11 @@ void FunctionValidator::visitFunction(Function* curr) { shouldBeTrue(result.isConcrete(), curr, "results must be concretely typed"); } for (const auto& var : curr->vars) { - if (var.isRef() && getModule()->features.hasGCNNLocals()) { - continue; - } features |= var.getFeatures(); - shouldBeTrue(var.isDefaultable(), var, "vars must be defaultable"); + bool valid = getModule()->features.hasGCNNLocals() + ? var.isDefaultableOrNonNullable() + : var.isDefaultable(); + shouldBeTrue(valid, var, "vars must be defaultable"); } shouldBeTrue(features <= getModule()->features, curr->name, |