summaryrefslogtreecommitdiff
path: root/src/passes/Unsubtyping.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/Unsubtyping.cpp')
-rw-r--r--src/passes/Unsubtyping.cpp38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/passes/Unsubtyping.cpp b/src/passes/Unsubtyping.cpp
index ccad4ed3d..8d76f348a 100644
--- a/src/passes/Unsubtyping.cpp
+++ b/src/passes/Unsubtyping.cpp
@@ -264,21 +264,31 @@ struct Unsubtyping
if (super.isBasic()) {
continue;
}
- if (type.isStruct()) {
- const auto& fields = type.getStruct().fields;
- const auto& superFields = super.getStruct().fields;
- for (size_t i = 0, size = superFields.size(); i < size; ++i) {
- noteSubtype(fields[i].type, superFields[i].type);
+ switch (type.getKind()) {
+ case HeapTypeKind::Func: {
+ auto sig = type.getSignature();
+ auto superSig = super.getSignature();
+ noteSubtype(superSig.params, sig.params);
+ noteSubtype(sig.results, superSig.results);
+ break;
}
- } else if (type.isArray()) {
- auto elem = type.getArray().element;
- noteSubtype(elem.type, super.getArray().element.type);
- } else {
- assert(type.isSignature());
- auto sig = type.getSignature();
- auto superSig = super.getSignature();
- noteSubtype(superSig.params, sig.params);
- noteSubtype(sig.results, superSig.results);
+ case HeapTypeKind::Struct: {
+ const auto& fields = type.getStruct().fields;
+ const auto& superFields = super.getStruct().fields;
+ for (size_t i = 0, size = superFields.size(); i < size; ++i) {
+ noteSubtype(fields[i].type, superFields[i].type);
+ }
+ break;
+ }
+ case HeapTypeKind::Array: {
+ auto elem = type.getArray().element;
+ noteSubtype(elem.type, super.getArray().element.type);
+ break;
+ }
+ case HeapTypeKind::Cont:
+ WASM_UNREACHABLE("TODO: cont");
+ case HeapTypeKind::Basic:
+ WASM_UNREACHABLE("unexpected kind");
}
}